DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_PRD_DF_PVT

Source


1 PACKAGE BODY AHL_PRD_DF_PVT AS
2 /* $Header: AHLVPDFB.pls 120.27.12020000.2 2012/12/07 07:48:59 sareepar ship $ */
3   -- Package/App Name
4   G_PKG_NAME         CONSTANT  VARCHAR(30) := 'AHL_PRD_DF_PVT';
5   G_APP_NAME         CONSTANT  VARCHAR2(3) := 'AHL';
6 
7   G_OP_SUBMIT_FOR_APPROVAL BOOLEAN := false;
8   G_MODULE_TYPE VARCHAR2(30) := 'JSP';
9 
10   -- job statuses
11   G_JOB_UNRELEASED      CONSTANT VARCHAR2(30) := '1';
12   G_JOB_RELEASED        CONSTANT VARCHAR2(30) := '3';
13   G_JOB_CLOSED          CONSTANT VARCHAR2(30) := '12';
14   G_JOB_DRAFT           CONSTANT VARCHAR2(30) := '17';
15   G_JOB_PARTS_HOLD      CONSTANT VARCHAR2(30) := '19';
16   G_JOB_COMPLETE        CONSTANT VARCHAR2(30) := '4';
17   G_JOB_COMPLETE_NC     CONSTANT VARCHAR2(30) := '5';
18   G_JOB_ON_HOLD         CONSTANT VARCHAR2(30) := '6';
19   G_JOB_CANCELLED       CONSTANT VARCHAR2(30) := '7';
20   G_JOB_PEND_DFR_APPR   CONSTANT VARCHAR2(30) := '21';
21   G_JOB_PEND_QA_APPR    CONSTANT VARCHAR2(20) := '20';
22   G_JOB_DELETED         CONSTANT VARCHAR2(30) := '22';
23 
24   -- approval actions
25   G_DEFERRAL_INITIATED  CONSTANT VARCHAR2(1) := 'I';
26   G_DEFERRAL_REJECTED   CONSTANT VARCHAR2(1) := 'R';
27   G_DEFERRAL_APPROVED   CONSTANT VARCHAR2(1) := 'A';
28   G_DEFERRAL_ERROR      CONSTANT VARCHAR2(1) := 'E';
29 
30 ------------------------------------------------------------------------------------
31 -- Declare Procedures --
32 ------------------------------------------------------------------------------------
33 -- Internal procedure that this API uses For procedures defined in specs of this API
34 ------------------------------------------------------------------------------------
35 PROCEDURE process_df_header(
36     p_x_df_header_rec       IN OUT NOCOPY  AHL_PRD_DF_PVT.df_header_rec_type);
37 
38 PROCEDURE log_df_header(
39     p_df_header_rec       IN AHL_PRD_DF_PVT.df_header_rec_type);
40 
41 PROCEDURE validate_df_header(
42     p_df_header_rec       IN AHL_PRD_DF_PVT.df_header_rec_type);
43 
44 PROCEDURE validate_reason_codes(
45     p_defer_reason_code       IN VARCHAR2);
46 
47 PROCEDURE default_unchanged_df_header(
48     p_x_df_header_rec       IN OUT NOCOPY  AHL_PRD_DF_PVT.df_header_rec_type);
49 
50 PROCEDURE process_df_schedules(
51     p_df_header_rec       IN             AHL_PRD_DF_PVT.df_header_rec_type,
52     p_x_df_schedules_tbl    IN OUT NOCOPY  AHL_PRD_DF_PVT.df_schedules_tbl_type);
53 
54 PROCEDURE log_df_schedules(
55     p_df_schedules_tbl    IN             AHL_PRD_DF_PVT.df_schedules_tbl_type);
56 
57 PROCEDURE validate_df_schedules(
58     p_df_header_rec       IN             AHL_PRD_DF_PVT.df_header_rec_type,
59     p_df_schedules_tbl    IN             AHL_PRD_DF_PVT.df_schedules_tbl_type);
60 
61 PROCEDURE default_unchanged_df_schedules(
62     p_x_df_schedules_tbl    IN OUT NOCOPY  AHL_PRD_DF_PVT.df_schedules_tbl_type);
63 
64 PROCEDURE validate_deferral_updates(
65     p_df_header_rec       IN             AHL_PRD_DF_PVT.df_header_rec_type,
66     x_warning_msg_data            OUT NOCOPY VARCHAR2);
67 
68 /* R12: moved to spec.
69 PROCEDURE process_approval_initiated (
70     p_unit_deferral_id      IN             NUMBER,
71     p_object_version_number IN             NUMBER,
72     p_new_status            IN             VARCHAR2,
73     x_return_status         OUT NOCOPY     VARCHAR2);
74 */
75 
76 PROCEDURE submit_for_approval(
77     p_df_header_rec       IN             AHL_PRD_DF_PVT.df_header_rec_type);
78 
79 FUNCTION valid_for_submission(
80     p_unit_effectivity_id   IN             NUMBER) RETURN BOOLEAN;
81 
82 FUNCTION get_applicable_ue(p_unit_effectivity_id IN NUMBER)RETURN NUMBER;
83 
84 PROCEDURE process_workorders(
85          p_unit_deferral_id      IN             NUMBER,
86          p_object_version_number IN             NUMBER,
87          p_approval_result_code  IN             VARCHAR2,
88          x_return_status         OUT NOCOPY     VARCHAR2);
89 
90 PROCEDURE process_unit_maint_plan(
91          p_unit_deferral_id      IN             NUMBER,
92          p_object_version_number IN             NUMBER,
93          p_approval_result_code  IN             VARCHAR2,
94          p_new_status            IN             VARCHAR2,
95          x_return_status         OUT NOCOPY     VARCHAR2);
96 
97 PROCEDURE process_prior_ump_deferrals(
98           p_unit_effectivity_id  IN             NUMBER);
99 
100 PROCEDURE calculate_due_date(
101   x_return_status               OUT NOCOPY VARCHAR2,
102   p_csi_item_instance_id 	    IN	NUMBER);
103 
104 
105 FUNCTION getLastStatus(p_workorder_id IN NUMBER) RETURN VARCHAR2;
106 
107 FUNCTION isValidStatusUpdate(
108          operation_code VARCHAR2,
109          status_code    VARCHAR2)RETURN BOOLEAN;
110 
111 -- function to check if source of deferral is UMP or Production.
112 FUNCTION Is_UMP_Deferral(p_unit_deferral_id IN NUMBER) RETURN BOOLEAN;
113 
114 -- function to get Counter/UOM Remain.
115 FUNCTION get_uom_remain(p_unit_effectivity_id IN NUMBER) RETURN VARCHAR2;
116 
117 -- JKJain, NR Analysis and Forecasting
118 FUNCTION get_fleet_from_effectivity(p_unit_effectivity_id IN NUMBER) RETURN NUMBER;
119 
120 -- ------------------------------------------------------------------------------------------------
121 --  Procedure name    : process_deferral
122 --  Type              : private
123 --  Function          :
124 --  Pre-reqs    :
125 --  Parameters  :
126 --
127 --  Standard IN  Parameters :
128 --      p_api_version                   IN      NUMBER       Default  1.0
129 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_TRUE
130 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
131 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
132 --  Standard OUT Parameters :
133 --      x_return_status                 OUT     VARCHAR2               Required
134 --      x_msg_count                     OUT     NUMBER                 Required
135 --      x_msg_data                      OUT     VARCHAR2               Required
136 --
137 --  p_module_type                       IN      VARCHAR2               Required.
138 --
139 --      This parameter indicates the front-end form interface. The default value is 'JSP'. If the value
140 --      is JSP, then this API clears out all id columns and validations are done using the values based
141 --      on which the Id's are populated.
142 --
143 --  process_deferral Parameters:
144 --
145 --
146 --
147 --
148 --  Version :
149 --               Initial Version   1.0
150 --
151 --  End of Comments.
152 
153 PROCEDURE process_deferral(
154     p_api_version           IN             NUMBER    := 1.0,
155     p_init_msg_list         IN             VARCHAR2  := FND_API.G_FALSE,
156     p_commit                IN             VARCHAR2  := FND_API.G_FALSE,
157     p_validation_level      IN             NUMBER    := FND_API.G_VALID_LEVEL_FULL,
158     p_module_type           IN             VARCHAR2  := NULL,
159     p_x_df_header_rec       IN OUT NOCOPY  AHL_PRD_DF_PVT.df_header_rec_type,
160     p_x_df_schedules_tbl    IN OUT NOCOPY  AHL_PRD_DF_PVT.df_schedules_tbl_type,
161     x_return_status         OUT NOCOPY     VARCHAR2,
162     x_msg_count             OUT NOCOPY     NUMBER,
163     x_msg_data              OUT NOCOPY     VARCHAR2) IS
164 
165     l_api_version      CONSTANT NUMBER := 1.0;
166     l_api_name         CONSTANT VARCHAR2(30) := 'process_deferral';
167     l_return_status  VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
168     l_warning_msg_data VARCHAR2(4000);
169 
170 BEGIN
171   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
172 		fnd_log.string
173 		(
174 			fnd_log.level_procedure,
175 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral.begin',
176 			'At the start of PLSQL procedure'
177 		);
178   END IF;
179   -- Standard start of API savepoint
180   SAVEPOINT process_deferral;
181 
182   -- Standard call to check for call compatibility
183   IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version,l_api_name, G_PKG_NAME ) THEN
184     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
185   END IF;
186    -- setting up module type
187    G_MODULE_TYPE := p_module_type;
188     -- Initialize message list if p_init_msg_list is set to TRUE
189   IF FND_API.To_Boolean( p_init_msg_list) THEN
190     FND_MSG_PUB.Initialize;
191   END IF;
192 
193   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
194 		fnd_log.string
195 		(
196 			fnd_log.level_statement,
197 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral',
198 			'p_init_message_list : ' || p_init_msg_list
199 		);
200         fnd_log.string
201 		(
202 			fnd_log.level_statement,
203 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral',
204 			'p_commit : ' || p_commit
205 		);
206         fnd_log.string
207 		(
208 			fnd_log.level_statement,
209 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral',
210 			'p_validation_level : ' || p_validation_level
211 		);
212         fnd_log.string
213 		(
214 			fnd_log.level_statement,
215 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral',
216 			'p_module_type : ' || p_module_type
217 		);
218   END IF;
219   -- Initialize API return status to success
220   x_return_status := FND_API.G_RET_STS_SUCCESS;
221 
222   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
223 	  fnd_log.string
224 	  (
225 			fnd_log.level_statement,
226 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral',
227 			'Logging deferral header record prior to processing'
228 	  );
229       log_df_header(p_df_header_rec  => p_x_df_header_rec);
230   END IF;
231 
232   process_df_header(
233               p_x_df_header_rec  => p_x_df_header_rec
234   );
235 
236   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
237 	  fnd_log.string
238 	  (
239 			fnd_log.level_statement,
240 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral',
241 			'Logging deferral header record after processing'
242 	  );
243       log_df_header(p_df_header_rec  => p_x_df_header_rec);
244   END IF;
245 
246 
247   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
248       fnd_log.string
249 		(
250 			fnd_log.level_statement,
251 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral',
252 			'Number of records in schedules : ' || p_x_df_schedules_tbl.count
253 		);
254       fnd_log.string
255 	  (
256 			fnd_log.level_statement,
257 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral',
258 			'Logging deferral schedule records before processing'
259 	  );
260       IF(p_x_df_schedules_tbl.count > 0)THEN
261         log_df_schedules(p_df_schedules_tbl  => p_x_df_schedules_tbl);
262       END IF;
263   END IF;
264 
265   -- PROCESS deferral schedules
266   IF (p_x_df_schedules_tbl.count > 0 AND
267      (p_x_df_header_rec.skip_mr_flag = G_NO_FLAG AND p_x_df_header_rec.cancel_flag = G_NO_FLAG) AND
268       (p_x_df_header_rec.operation_flag IS NULL OR
269        p_x_df_header_rec.operation_flag IN (G_OP_CREATE,G_OP_UPDATE))) THEN
270     process_df_schedules(
271         p_df_header_rec    => p_x_df_header_rec,
272         p_x_df_schedules_tbl => p_x_df_schedules_tbl
273     );
274     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
275         fnd_log.string
276 	    (
277 			fnd_log.level_statement,
278 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral',
279 			'Logging deferral schedule records after processing'
280 	    );
281         log_df_schedules(p_df_schedules_tbl  => p_x_df_schedules_tbl);
282      END IF;
283   END IF;
284 
285   -- validating the updates as a whole
286   IF((p_x_df_header_rec.skip_mr_flag = G_NO_FLAG AND p_x_df_header_rec.cancel_flag = G_NO_FLAG)
287       AND (p_x_df_header_rec.operation_flag IS NULL OR
288        p_x_df_header_rec.operation_flag IN (G_OP_CREATE,G_OP_UPDATE))) THEN
289      validate_deferral_updates(
290         p_df_header_rec    => p_x_df_header_rec,
291         x_warning_msg_data         => l_warning_msg_data
292      );
293   END IF;
294 
295   IF G_OP_SUBMIT_FOR_APPROVAL THEN
296       IF (fnd_log.level_event >= fnd_log.g_current_runtime_level)THEN
297 	      fnd_log.string
298 		  (
299 			    fnd_log.level_event,
300 			    'ahl.plsql.AHL_PRD_DF_PVT.process_deferral',
301 			    'Submitting for Aprroval Unit Deferral ID : ' || p_x_df_header_rec.unit_deferral_id ||
302                 ' Object Version Number : ' || p_x_df_header_rec.object_version_number
303 		  );
304      END IF;
305      submit_for_approval(
306        p_df_header_rec    => p_x_df_header_rec
307      );
308   END IF;
309 
310   -- Check Error Message stack.
311   x_msg_count := FND_MSG_PUB.count_msg;
312   IF x_msg_count > 0 THEN
313      RAISE  FND_API.G_EXC_ERROR;
314   END IF;
315 
316   -- Standard check of p_commit
317   IF FND_API.TO_BOOLEAN(p_commit) THEN
318       COMMIT WORK;
319   END IF;
320 
321 
322 
323   -- Standard call to get message count and if count is 1, get message info
324   FND_MSG_PUB.Count_And_Get
325     ( p_count => x_msg_count,
326       p_data  => x_msg_data,
327       p_encoded => fnd_api.g_false
328     );
329   IF(x_msg_count = 0 AND l_warning_msg_data IS NOT NULL)THEN
330     x_msg_count := 1;
331     x_msg_data := l_warning_msg_data;
332   END IF;
333 
334   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
335 		fnd_log.string
336 		(
337 			fnd_log.level_procedure,
338 			'ahl.plsql.AHL_PRD_DF_PVT.process_deferral.end',
339 			'At the end of PLSQL procedure'
340 		);
341   END IF;
342 
343  EXCEPTION
344   WHEN FND_API.G_EXC_ERROR THEN
345    Rollback to process_deferral;
346    x_return_status := FND_API.G_RET_STS_ERROR;
347    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
348                               p_data  => x_msg_data,
349                               p_encoded => fnd_api.g_false);
350 
351 
352  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
353    Rollback to process_deferral;
354    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
355    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
356                               p_data  => x_msg_data,
357                               p_encoded => fnd_api.g_false);
358 
359 
360  WHEN OTHERS THEN
361     Rollback to process_deferral;
362     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
363     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
364        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
365                                p_procedure_name => l_api_name,
366                                p_error_text     => SUBSTR(SQLERRM,1,500));
367     END IF;
368     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
369                                p_data  => x_msg_data,
370                                p_encoded => fnd_api.g_false);
371 END process_deferral;
372 
373 -------------------------------------------------------------------------------------
374 -- procedure processes the header information
375 -- handle dml updates to the deferral context information
376 -- Note : Value to id conversion is done only for unit_effectivity_id and unit_deferral_type to fetch
377 --        the unit_deferral_id. Hence no validation level check and no sperate procedure for value
378 --        to id conversion process.
379 -------------------------------------------------------------------------------------
380 PROCEDURE process_df_header(
381     p_x_df_header_rec       IN OUT NOCOPY  AHL_PRD_DF_PVT.df_header_rec_type)
382     IS
383 
384     l_rowid               VARCHAR2(30);
385 
386     CURSOR unit_deferral_id_csr(p_unit_effectivity_id In NUMBER) IS
387     SELECT unit_deferral_id, object_version_number
388     from ahl_unit_deferrals_b
389     WHERE unit_deferral_type = 'DEFERRAL'
390     AND unit_effectivity_id = p_unit_effectivity_id;
391 
392     l_unit_deferral_id NUMBER;
393     l_object_version_number NUMBER;
394     l_input_key_error_flag BOOLEAN := false;
395 
396     /*
397     *  Application usage code AND condition has been added to resolve all application usage code related issues here
398     * in the cursor select of "unit_effectivity_info_csr".
399     * Here onwards in this program we dont have to worry about any app usage code related issues.
400     */
401 
402     CURSOR unit_effectivity_info_csr(p_unit_effectivity_id IN NUMBER) IS
403     SELECT mr_header_id,cs_incident_id,repetitive_mr_flag,orig_deferral_ue_id,ue_status_code,
404            def_status_code,manually_planned_flag
405     FROM ahl_ue_deferral_details_v
406     WHERE unit_effectivity_id = p_unit_effectivity_id
407     AND APPLICATION_USG_CODE = RTRIM(LTRIM(FND_PROFILE.VALUE('AHL_APPLN_USAGE'))) ;
408 
409     l_mr_header_id NUMBER;
410     l_incident_id NUMBER;
411     l_orig_deferral_ue_id NUMBER;
412     l_ue_status_code VARCHAR2(30);
413     l_def_status_code VARCHAR2(30);
414     l_repetitive_mr_flag VARCHAR2(1);
415     l_manually_planned_flag VARCHAR2(1);
416 
417     -- to check whether MR or any of its children has resettable counters
418     CURSOR reset_counter_csr(p_unit_effectivity_id IN NUMBER) IS
419     --SELECT 'x' from csi_cp_counters_v CP, AHL_MR_INTERVALS_V MRI,AHL_MR_EFFECTIVITIES_APP_V  MRE, AHL_UNIT_EFFECTIVITIES_APP_V UE
420     /* In R12, modified to use csi_counters_vl instead of csi_cp_counters_v.
421     SELECT 'x' from csi_cp_counters_v CP, AHL_MR_INTERVALS_V MRI,AHL_MR_EFFECTIVITIES  MRE, AHL_UNIT_EFFECTIVITIES_B UE
422     WHERE CP.customer_product_id = UE.csi_item_instance_id
423     AND CP.counter_name = MRI.counter_name
424     AND MRI.reset_value IS NOT NULL
425     AND MRI.mr_effectivity_id = MRE.mr_effectivity_id
426     AND MRE.mr_header_id = UE.mr_header_id
427     AND UE.unit_effectivity_id = p_unit_effectivity_id
428     UNION
429     --SELECT 'x' from csi_cp_counters_v CP,  AHL_MR_INTERVALS_V MRI,  AHL_MR_EFFECTIVITIES_APP_V MRE, AHL_UNIT_EFFECTIVITIES_APP_V UE
430     SELECT 'x' from csi_cp_counters_v CP, AHL_MR_INTERVALS_V MRI,AHL_MR_EFFECTIVITIES  MRE, AHL_UNIT_EFFECTIVITIES_B UE
431     WHERE CP.customer_product_id = UE.csi_item_instance_id
432     AND CP.counter_name = MRI.counter_name
433     AND MRI.reset_value IS NOT NULL
434     AND MRI.mr_effectivity_id = MRE.mr_effectivity_id
435     AND MRE.mr_header_id = UE.mr_header_id
436     AND UE.unit_effectivity_id IN
437       (
438 
439          SELECT     related_ue_id
440          FROM       AHL_UE_RELATIONSHIPS
441          WHERE      relationship_code = 'PARENT'
442          START WITH ue_id = p_unit_effectivity_id
443          CONNECT BY ue_id = PRIOR related_ue_id
444 
445       );
446     */
447     SELECT 'x'
448     from csi_counter_associations ca, csi_counters_vl CP, AHL_MR_INTERVALS_V MRI,
449          AHL_MR_EFFECTIVITIES  MRE, AHL_UNIT_EFFECTIVITIES_B UE
450     WHERE CA.source_object_id = UE.csi_item_instance_id
451     AND ca.source_object_code = 'CP'
452     AND CP.counter_template_name = MRI.counter_name
453     AND MRI.reset_value IS NOT NULL
454     AND MRI.mr_effectivity_id = MRE.mr_effectivity_id
455     AND MRE.mr_header_id = UE.mr_header_id
456     AND UE.unit_effectivity_id = p_unit_effectivity_id
457     UNION
458     SELECT 'x'
459     from csi_counter_associations ca, csi_counters_vl CP, AHL_MR_INTERVALS_V MRI,
460          AHL_MR_EFFECTIVITIES  MRE, AHL_UNIT_EFFECTIVITIES_B UE
461     WHERE CA.source_object_id = UE.csi_item_instance_id
462     AND ca.source_object_code = 'CP'
463     AND CP.counter_template_name = MRI.counter_name
464     AND MRI.reset_value IS NOT NULL
465     AND MRI.mr_effectivity_id = MRE.mr_effectivity_id
466     AND MRE.mr_header_id = UE.mr_header_id
467     AND UE.unit_effectivity_id IN
468       (
469 
470          SELECT     related_ue_id
471          FROM       AHL_UE_RELATIONSHIPS
472          WHERE      relationship_code = 'PARENT'
473          START WITH ue_id = p_unit_effectivity_id
474          CONNECT BY ue_id = PRIOR related_ue_id
475 
476       );
477 
478     l_exists VARCHAR2(1);
479 
480 
481 BEGIN
482     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
483 		fnd_log.string
484 		(
485 			fnd_log.level_procedure,
486 			'ahl.plsql.AHL_PRD_DF_PVT.process_df_header.begin',
487 			'At the start of PLSQL procedure'
488 		);
489     END IF;
490     -- initializaing submit for approval flag
491     G_OP_SUBMIT_FOR_APPROVAL := false;
492     -- value to id conversion based on unit_effectivity_id
493     IF( p_x_df_header_rec.unit_effectivity_id IS NULL AND
494        (p_x_df_header_rec.unit_deferral_id IS NULL OR p_x_df_header_rec.object_version_number IS NULL))THEN
495         l_input_key_error_flag := true;
496     ELSIF(p_x_df_header_rec.unit_effectivity_id IS NOT NULL)THEN
497         IF(NVL(p_x_df_header_rec.operation_flag,'x') <> G_OP_CREATE)THEN
498            OPEN unit_deferral_id_csr(p_x_df_header_rec.unit_effectivity_id);
499            FETCH unit_deferral_id_csr INTO p_x_df_header_rec.unit_deferral_id,p_x_df_header_rec.object_version_number;
500            IF(unit_deferral_id_csr%NOTFOUND) THEN
501               IF(p_x_df_header_rec.operation_flag = G_OP_SUBMIT)THEN
502                 p_x_df_header_rec.operation_flag := G_OP_CREATE;
503                 G_OP_SUBMIT_FOR_APPROVAL := TRUE;
504               ELSE
505                l_input_key_error_flag := true;
506               END IF;
507            ELSIF(p_x_df_header_rec.operation_flag = G_OP_SUBMIT)THEN
508               p_x_df_header_rec.operation_flag := G_OP_UPDATE;
509               G_OP_SUBMIT_FOR_APPROVAL := TRUE;
510            END IF;
511            CLOSE unit_deferral_id_csr;
512        END IF;
513     END IF;
514     -- raise error if input keys are wrong.
515     IF(l_input_key_error_flag)THEN
516        FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_HREC_KMISS');
517        FND_MSG_PUB.ADD;
518        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
519 		    fnd_log.string
520 		    (
521 			    fnd_log.level_unexpected,
522 			    'ahl.plsql.AHL_PRD_DF_PVT.process_df_header',
523 			    'Input Keys are missing or invalid'
524 		    );
525       END IF;
526       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
527     END IF;
528     -- check whether unit effectivity is valid
529     OPEN unit_effectivity_info_csr(p_x_df_header_rec.unit_effectivity_id);
530     FETCH unit_effectivity_info_csr INTO l_mr_header_id,
531                                          l_incident_id,
532                                          l_repetitive_mr_flag,
533                                          l_orig_deferral_ue_id,
534                                          l_ue_status_code,
535                                          l_def_status_code,
536                                          l_manually_planned_flag;
537     IF(unit_effectivity_info_csr%NOTFOUND) THEN
538        FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_HREC_UE_ID');
539        FND_MSG_PUB.ADD;
540        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
541 		       fnd_log.string
542 		        (
543 			    fnd_log.level_unexpected,
544 			    'ahl.plsql.AHL_PRD_DF_PVT.process_df_header',
545 			    'unit effectivity record not found'
546 		        );
547        END IF;
548        CLOSE unit_effectivity_info_csr;
549        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
550     ELSE
551        IF(l_orig_deferral_ue_id IS NOT NULL) THEN
552           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_HREC_UE_ID');
553           FND_MSG_PUB.ADD;
554           IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
555 		       fnd_log.string
556 		        (
557 			    fnd_log.level_unexpected,
558 			    'ahl.plsql.AHL_PRD_DF_PVT.process_df_header',
559 			    'unit effectivity record not found'
560 		        );
561           END IF;
562           CLOSE unit_effectivity_info_csr;
563           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
564        ELSIF((NVL(l_ue_status_code,'x') IN ('ACCOMPLISHED','DEFERRED','EXCEPTION','TERMINATED','CANCELLED','MR-TERMINATE'))
565              OR (NVL(l_def_status_code,'x')IN ('DEFERRED','DEFERRAL_PENDING','TERMINATED','CANCELLED')))THEN
566          FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_MRSR_STATUS');
567          FND_MSG_PUB.ADD;
568          IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
569 		    fnd_log.string
570 		    (
571 			    fnd_log.level_error,
572 			    'ahl.plsql.AHL_PRD_DF_PVT.process_df_header',
573 			    'Status of MR or SR is not valid for deferral'
574 		    );
575          END IF;
576          CLOSE unit_effectivity_info_csr;
577          RAISE FND_API.G_EXC_ERROR;
578        ELSE
579          -- filling in additional info
580          IF(l_mr_header_id IS NULL)THEN
581             p_x_df_header_rec.deferral_type := G_DEFERRAL_TYPE_SR;
582          ELSE
583             p_x_df_header_rec.deferral_type := G_DEFERRAL_TYPE_MR;
584          END IF;
585          p_x_df_header_rec.mr_repetitive_flag := NVL(l_repetitive_mr_flag,G_NO_FLAG);
586          p_x_df_header_rec.manually_planned_flag := NVL(l_manually_planned_flag,G_NO_FLAG);
587          p_x_df_header_rec.reset_counter_flag := G_YES_FLAG;
588          p_x_df_header_rec.affect_due_calc_flag := NVL(p_x_df_header_rec.affect_due_calc_flag,G_NO_FLAG);
589          p_x_df_header_rec.skip_mr_flag := NVL(p_x_df_header_rec.skip_mr_flag,G_NO_FLAG);
590          p_x_df_header_rec.cancel_flag := NVL(p_x_df_header_rec.cancel_flag,G_NO_FLAG);
591          IF(p_x_df_header_rec.deferral_type = G_DEFERRAL_TYPE_MR)THEN
592            OPEN reset_counter_csr(p_x_df_header_rec.unit_effectivity_id);
593            FETCH reset_counter_csr INTO l_exists;
594            IF(reset_counter_csr%NOTFOUND)THEN
595                p_x_df_header_rec.reset_counter_flag := G_NO_FLAG;
596            END IF;
597            CLOSE reset_counter_csr;
598          /*
599          ELSE
600            p_x_df_header_rec.skip_mr_flag := G_NO_FLAG;
601            p_x_df_header_rec.affect_due_calc_flag := G_YES_FLAG;
602          */
603            IF (p_x_df_header_rec.cancel_flag = G_YES_FLAG) THEN
604              p_x_df_header_rec.skip_mr_flag := G_NO_FLAG;
605            END IF;
606            IF(p_x_df_header_rec.skip_mr_flag = G_YES_FLAG OR p_x_df_header_rec.cancel_flag = G_YES_FLAG) THEN
607               p_x_df_header_rec.set_due_date := NULL;
608               p_x_df_header_rec.affect_due_calc_flag := G_NO_FLAG;
609            END IF;
610          ELSE
611            --Enable SR cancellation for non-serialized items.
612            --p_x_df_header_rec.skip_mr_flag := G_NO_FLAG;
613            IF (p_x_df_header_rec.cancel_flag = G_YES_FLAG) THEN
614              p_x_df_header_rec.skip_mr_flag := G_NO_FLAG;
615              p_x_df_header_rec.set_due_date := NULL;
616              p_x_df_header_rec.affect_due_calc_flag := G_NO_FLAG;
617            END IF;
618            p_x_df_header_rec.affect_due_calc_flag := G_YES_FLAG;
619          END IF;
620        END IF;
621     END IF;
622     -- doing defaulting before validation because of future OA needs
623     default_unchanged_df_header(p_x_df_header_rec => p_x_df_header_rec);
624 
625     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
626 		fnd_log.string
627 		(
628 			fnd_log.level_statement,
629 			'ahl.plsql.AHL_PRD_DF_PVT.process_df_header',
630 			'Dumping deferral header record prior to validating'
631 		);
632         log_df_header(p_df_header_rec  => p_x_df_header_rec);
633      END IF;
634 
635     IF(p_x_df_header_rec.operation_flag IS NOT NULL) THEN
636        validate_df_header(p_df_header_rec => p_x_df_header_rec);
637     END IF;
638 
639     IF(p_x_df_header_rec.operation_flag = G_OP_DELETE) THEN
640         -- delete schedules records
641         DELETE AHL_UNIT_THRESHOLDS WHERE UNIT_DEFERRAL_ID = p_x_df_header_rec.unit_deferral_id;
642         -- delete header records.
643         AHL_UNIT_DEFERRALS_PKG.delete_row(x_unit_deferral_id => p_x_df_header_rec.unit_deferral_id);
644     ELSIF(p_x_df_header_rec.operation_flag = G_OP_CREATE) THEN
645         --setting object version number for create
646         p_x_df_header_rec.object_version_number := 1;
647         --setting up user/create/update information
648         p_x_df_header_rec.created_by := fnd_global.user_id;
649         p_x_df_header_rec.creation_date := SYSDATE;
650         p_x_df_header_rec.last_updated_by := fnd_global.user_id;
651         p_x_df_header_rec.last_update_date := SYSDATE;
652         p_x_df_header_rec.last_update_login := fnd_global.user_id;
653 
654         IF(p_x_df_header_rec.skip_mr_flag = G_YES_FLAG OR p_x_df_header_rec.cancel_flag = G_YES_FLAG)THEN
655            p_x_df_header_rec.set_due_date := null;
656            p_x_df_header_rec.affect_due_calc_flag := G_NO_FLAG;
657         END IF;
658 
659         AHL_UNIT_DEFERRALS_PKG.insert_row(
660         x_rowid => l_rowid,
661         x_unit_deferral_id => p_x_df_header_rec.unit_deferral_id,
662         x_object_version_number => p_x_df_header_rec.object_version_number,
663         x_created_by => p_x_df_header_rec.created_by,
664         x_creation_date => p_x_df_header_rec.creation_date,
665         x_last_updated_by => p_x_df_header_rec.last_updated_by,
666         x_last_update_date => p_x_df_header_rec.last_update_date,
667         x_last_update_login => p_x_df_header_rec.last_update_login,
668         x_unit_effectivity_id => p_x_df_header_rec.unit_effectivity_id,
669         x_unit_deferral_type => p_x_df_header_rec.unit_deferral_type,
670         x_set_due_date => p_x_df_header_rec.set_due_date,
671         x_deferral_effective_on => p_x_df_header_rec.deferral_effective_on,
672         x_approval_status_code => p_x_df_header_rec.approval_status_code,
673         x_defer_reason_code => p_x_df_header_rec.defer_reason_code,
674         x_affect_due_calc_flag => p_x_df_header_rec.affect_due_calc_flag,
675         x_skip_mr_flag => p_x_df_header_rec.skip_mr_flag,
676         x_cancel_flag => p_x_df_header_rec.cancel_flag,
677         x_remarks => p_x_df_header_rec.remarks,
678         x_approver_notes => p_x_df_header_rec.approver_notes,
679         x_ata_sequence_id => NULL,
680         x_user_deferral_type => p_x_df_header_rec.user_deferral_type_code,
681         x_attribute_category => p_x_df_header_rec.attribute_category,
682         x_attribute1 => p_x_df_header_rec.attribute1,
683         x_attribute2 => p_x_df_header_rec.attribute2,
684         x_attribute3 => p_x_df_header_rec.attribute3,
685         x_attribute4 => p_x_df_header_rec.attribute4,
686         x_attribute5 => p_x_df_header_rec.attribute5,
687         x_attribute6 => p_x_df_header_rec.attribute6,
688         x_attribute7 => p_x_df_header_rec.attribute7,
689         x_attribute8 => p_x_df_header_rec.attribute8,
690         x_attribute9 => p_x_df_header_rec.attribute9,
691         x_attribute10 => p_x_df_header_rec.attribute10,
692         x_attribute11 => p_x_df_header_rec.attribute11,
693         x_attribute12 => p_x_df_header_rec.attribute12,
694         x_attribute13 => p_x_df_header_rec.attribute13,
695         x_attribute14 => p_x_df_header_rec.attribute14,
696         x_attribute15 => p_x_df_header_rec.attribute15
697         );
698     ELSIF (p_x_df_header_rec.operation_flag = G_OP_UPDATE) THEN
699 
700         -- setting up object version number
701         p_x_df_header_rec.object_version_number := p_x_df_header_rec.object_version_number + 1;
702         --setting up user/create/update information
703         p_x_df_header_rec.last_updated_by := fnd_global.user_id;
704         p_x_df_header_rec.last_update_date := SYSDATE;
705         p_x_df_header_rec.last_update_login := fnd_global.user_id;
706 
707         IF(p_x_df_header_rec.skip_mr_flag = G_YES_FLAG OR p_x_df_header_rec.cancel_flag = G_YES_FLAG)THEN
708            p_x_df_header_rec.set_due_date := null;
709            p_x_df_header_rec.affect_due_calc_flag := G_NO_FLAG;
710            -- Delete all records in unit thresholds
711            DELETE AHL_UNIT_THRESHOLDS WHERE UNIT_DEFERRAL_ID = p_x_df_header_rec.unit_deferral_id;
712         END IF;
713         p_x_df_header_rec.approval_status_code := 'DRAFT';
714         AHL_UNIT_DEFERRALS_PKG.update_row(
715         x_unit_deferral_id => p_x_df_header_rec.unit_deferral_id,
716         x_object_version_number => p_x_df_header_rec.object_version_number,
717         x_last_updated_by => p_x_df_header_rec.last_updated_by,
718         x_last_update_date => p_x_df_header_rec.last_update_date,
719         x_last_update_login => p_x_df_header_rec.last_update_login,
720         x_unit_effectivity_id => p_x_df_header_rec.unit_effectivity_id,
721         x_unit_deferral_type => p_x_df_header_rec.unit_deferral_type,
722         x_set_due_date => p_x_df_header_rec.set_due_date,
723         x_deferral_effective_on => p_x_df_header_rec.deferral_effective_on,
724         x_approval_status_code => p_x_df_header_rec.approval_status_code,
725         x_defer_reason_code => p_x_df_header_rec.defer_reason_code,
726         x_affect_due_calc_flag => p_x_df_header_rec.affect_due_calc_flag,
727         x_skip_mr_flag => p_x_df_header_rec.skip_mr_flag,
728         x_cancel_flag => p_x_df_header_rec.cancel_flag,
729         x_remarks => p_x_df_header_rec.remarks,
730         x_approver_notes => p_x_df_header_rec.approver_notes,
731         x_ata_sequence_id => null,
732         x_user_deferral_type => p_x_df_header_rec.user_deferral_type_code,
733         x_attribute_category => p_x_df_header_rec.attribute_category,
734         x_attribute1 => p_x_df_header_rec.attribute1,
735         x_attribute2 => p_x_df_header_rec.attribute2,
736         x_attribute3 => p_x_df_header_rec.attribute3,
737         x_attribute4 => p_x_df_header_rec.attribute4,
738         x_attribute5 => p_x_df_header_rec.attribute5,
739         x_attribute6 => p_x_df_header_rec.attribute6,
740         x_attribute7 => p_x_df_header_rec.attribute7,
741         x_attribute8 => p_x_df_header_rec.attribute8,
742         x_attribute9 => p_x_df_header_rec.attribute9,
743         x_attribute10 => p_x_df_header_rec.attribute10,
744         x_attribute11 => p_x_df_header_rec.attribute11,
745         x_attribute12 => p_x_df_header_rec.attribute12,
746         x_attribute13 => p_x_df_header_rec.attribute13,
747         x_attribute14 => p_x_df_header_rec.attribute14,
748         x_attribute15 => p_x_df_header_rec.attribute15
749         );
750     END IF;
751 
752     IF(FND_MSG_PUB.count_msg > 0)THEN
753         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
754     END IF;
755 
756     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
757 		fnd_log.string
758 		(
759 			fnd_log.level_procedure,
760 			'ahl.plsql.AHL_PRD_DF_PVT.process_df_header.end',
761 			'At the end of PLSQL procedure'
762 		);
763     END IF;
764 
765 END process_df_header;
766 --------------------------------------------------------------------------------
767 -- Procedure to dump deferral header record
768 --------------------------------------------------------------------------------
769 PROCEDURE log_df_header(
770     p_df_header_rec       IN AHL_PRD_DF_PVT.df_header_rec_type) IS
771 
772 BEGIN
773      IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
774 	    fnd_log.string
775 		(
776 			    fnd_log.level_statement,
777 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
778 			    'p_x_df_header_rec.operation_flag : ' || p_df_header_rec.operation_flag
779 		);
780         fnd_log.string
781 		(
782 			    fnd_log.level_statement,
783 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
784 			    'p_x_df_header_rec.unit_deferral_id : ' || p_df_header_rec.unit_deferral_id
785 		);
786         fnd_log.string
787 		(
788 			    fnd_log.level_statement,
789 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
790 			    'p_x_df_header_rec.object_version_number : ' || p_df_header_rec.object_version_number
791 		);
792         fnd_log.string
793 		(
794 			    fnd_log.level_statement,
795 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
796 			    'p_x_df_header_rec.unit_effectivity_id : ' || p_df_header_rec.unit_effectivity_id
797 		);
798         fnd_log.string
799 		(
800 			    fnd_log.level_statement,
801 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
802 			    'p_x_df_header_rec.defer_reason_code : ' || p_df_header_rec.defer_reason_code
803 		);
804         fnd_log.string
805 		(
806 			    fnd_log.level_statement,
807 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
808 			    'p_x_df_header_rec.remarks : ' || p_df_header_rec.remarks
809 		);
810         fnd_log.string
811 		(
812 			    fnd_log.level_statement,
813 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
814 			    'p_x_df_header_rec.skip_mr_flag : ' || p_df_header_rec.skip_mr_flag
815 		);
816     fnd_log.string
817 		(
818 			    fnd_log.level_statement,
819 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
820 			    'p_x_df_header_rec.cancel_flag : ' || p_df_header_rec.cancel_flag
821 		);
822         fnd_log.string
823 		(
824 			    fnd_log.level_statement,
825 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
826 			    'p_x_df_header_rec.affect_due_calc_flag : ' || p_df_header_rec.affect_due_calc_flag
827 		);
828         fnd_log.string
829 		(
830 			    fnd_log.level_statement,
831 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
832 			    'p_x_df_header_rec.set_due_date : ' || p_df_header_rec.set_due_date
833 		);
834         fnd_log.string
835 		(
836 			    fnd_log.level_statement,
837 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
838 			    'p_x_df_header_rec.deferral_effective_on : ' || p_df_header_rec.deferral_effective_on
839 		);
840         fnd_log.string
841 		(
842 			    fnd_log.level_statement,
843 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
844 			    'p_x_df_header_rec.deferral_type  : ' || p_df_header_rec.deferral_type
845 		);
846         fnd_log.string
847 		(
848 			    fnd_log.level_statement,
849 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
850 			    'p_x_df_header_rec.mr_repetitive_flag  : ' || p_df_header_rec.mr_repetitive_flag
851 		);
852         fnd_log.string
853 		(
854 			    fnd_log.level_statement,
855 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
856 			    'p_x_df_header_rec.reset_counter_flag  : ' || p_df_header_rec.reset_counter_flag
857 		);
858         fnd_log.string
859 		(
860 			    fnd_log.level_statement,
861 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
862 			    'p_x_df_header_rec.manually_planned_flag  : ' || p_df_header_rec.manually_planned_flag
863 		);
864          fnd_log.string
865 		(
866 			    fnd_log.level_statement,
867 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
868 			    'user id : ' || FND_GLOBAL.USER_ID()
869 		);
870          fnd_log.string
871 		(
872 			    fnd_log.level_statement,
873 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
874 			    'resp id : ' || FND_GLOBAL.RESP_ID()
875 		);
876          fnd_log.string
877 		(
878 			    fnd_log.level_statement,
879 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_header',
880 			    'resp appl id : ' || FND_GLOBAL.resp_appl_id()
881 		);
882     END IF;
883 END log_df_header;
884 
885 PROCEDURE validate_df_header(
886     p_df_header_rec       IN   AHL_PRD_DF_PVT.df_header_rec_type)IS
887 
888     -- check whether any record already exists related to deferral
889     CURSOR deferral_rec_exists_csr(p_unit_effectivity_id IN NUMBER) IS
890     SELECT 'x' from ahl_unit_deferrals_vl
891     WHERE unit_deferral_type = 'DEFERRAL'
892     AND unit_effectivity_id = p_unit_effectivity_id;
893 
894     -- to check whether ue is in production
895     CURSOR valid_deferral_csr(p_unit_effectivity_id IN NUMBER) IS
896     SELECT 'x' from ahl_workorder_tasks_v WO,AHL_UNIT_EFFECTIVITIES_B UE --Undid App usage related BLIND changes
897     WHERE WO.unit_effectivity_id = UE.unit_effectivity_id
898     AND NVL(UE.status_code,'x') NOT IN('ACCOMPLISHED','DEFERRED','EXCEPTION','TERMINATED','CANCELLED','MR-TERMINATE')
899     AND UE.unit_effectivity_id = p_unit_effectivity_id;
900 
901     -- check whether MR is not terminated
902     /*CURSOR valid_mr_csr(p_unit_effectivity_id IN NUMBER) IS
903     select 'x' from AHL_MR_HEADERS_APP_V mr, AHL_MR_HEADERS_APP_V def, ahl_unit_effectivities_b UE
904     where UE.unit_effectivity_id = p_unit_effectivity_id
905     AND def.mr_header_id = UE.mr_header_id
906     and def.title = mr.title
907     and trunc(sysdate) between trunc(mr.effective_from)
908     and trunc(nvl(mr.effective_to, sysdate))
909     and mr.version_number >= def.version_number;*/
910 
911     -- to check whether this deferral record can be updated or deleted
912     CURSOR valid_deferral_up_csr(p_unit_deferral_id IN NUMBER) IS
913     SELECT 'x' from ahl_unit_deferrals_b
914     WHERE approval_status_code IN ('DRAFT','DEFERRAL_REJECTED')
915     AND unit_deferral_type = 'DEFERRAL'
916     AND unit_deferral_id = p_unit_deferral_id;
917 
918 	-- TAMAL -- Begin changes for ER #3356804
919 	-- This cursor specifically checks whether the UE for an SR with MRs is available for deferral processing
920 	-- Contrast this with the earlier cursor valid_deferral_csr, which handles SRs with no MRs and plain MRs
921 	CURSOR valid_sr_deferral_csr (p_ue_id in number)
922 	IS
923 		SELECT 	'x'
924 		FROM 	ahl_workorders WO, ahl_visits_b VS, ahl_visit_tasks_b VST, ahl_unit_effectivities_b UE
925 		WHERE 	WO.master_workorder_flag = 'Y'
926 		/* to filter out draft / deleted WOs */
927 		AND	WO.STATUS_CODE NOT IN ( '17' , '22' )
928 		/* to check whether visit available in client's organization */
929 		AND	WO.visit_id = VS.visit_id
930 		AND	VS.ORGANIZATION_ID IN
931                   (SELECT ORGANIZATION_ID FROM org_organization_definitions
932                    WHERE NVL (operating_unit, mo_global.get_current_org_id())
933                    = mo_global.get_current_org_id())
934 		AND	VST.visit_id = VS.visit_id
935 		/* */
936 		AND	WO.visit_task_id = VST.visit_task_id
937 		AND 	VST.unit_effectivity_id = UE.unit_effectivity_id
938 		AND 	VST.mr_id IS NULL
939 		AND 	NVL(UE.status_code,'x') NOT IN('ACCOMPLISHED','DEFERRED','EXCEPTION','TERMINATED','CANCELLED','MR-TERMINATE')
940 		AND 	UE.cs_incident_id IS NOT NULL
941 		AND 	UE.unit_effectivity_id = p_ue_id;
942 	-- TAMAL -- End changes for ER #3356804
943 
944     -- R12: UMP Deferral
945     CURSOR valid_ue_csr (p_unit_effectivity_id IN NUMBER) IS
946       SELECT 'x'
947       FROM AHL_Unit_Effectivities_B UE
948       WHERE (status_code IS NULL OR status_code = 'INIT-DUE')
949         AND unit_effectivity_id = p_unit_effectivity_id
950         AND NOT EXISTS (SELECT 'x'
951                         FROM ahl_visit_tasks_b vts
952                         WHERE vts.unit_effectivity_id = UE.unit_effectivity_id
953                           AND NVL(vts.status_code,'x') IN ('PLANNING')
954                           AND vts.task_type_code = 'SUMMARY'
955                           AND EXISTS (select 'x'
956                                       from  ahl_visits_b vst, ahl_simulation_plans_b sim
957                                       where vst.simulation_plan_id = sim.simulation_plan_id(+)
958                                         and vst.visit_id = vts.visit_id
959                                         and sim.primary_plan_flag(+) = 'Y')
960                        );
961 
962     -- R12: UMP Deferral.
963     -- Validate user deferral type.
964     CURSOR validate_user_defer_csr(p_user_defer_type IN VARCHAR2) IS
965       SELECT 'x'
966       FROM fnd_lookup_values_vl
967       WHERE lookup_type = 'AHL_PRD_DEFERRAL_TYPE'
968         AND lookup_code = p_user_defer_type
969         AND enabled_flag = 'Y'
970         AND trunc(sysdate) BETWEEN start_date_active AND nvl(end_date_active, sysdate+1);
971 
972     -- SR Cancellation for nonserialized items.
973     CURSOR is_orig_ue_nonserial(p_ue_id in number)
974     IS
975         SELECT cii.serial_number
976         FROM ahl_unit_effectivities_b ue, csi_item_instances cii
977         WHERE unit_effectivity_id in (select originator_ue_id
978                                       from ahl_ue_relationships
979                                       where related_ue_id = p_ue_id)
980           AND ue.csi_item_instance_id = cii.instance_id
981           AND cii.quantity > 0
982           AND ue.object_type = 'SR';
983 
984     -- SR Cancellation for nonserialized items.
985     CURSOR is_sr_ue_nonserial(p_ue_id in number)
986     IS
987         SELECT cii.serial_number
988         FROM ahl_unit_effectivities_b ue, csi_item_instances cii
989         WHERE unit_effectivity_id  = p_ue_id
990           AND ue.csi_item_instance_id = cii.instance_id
991           AND cii.quantity > 0
992           AND ue.object_type = 'SR';
993 
994     l_exists VARCHAR2(1);
995     l_serial_number  csi_item_instances.serial_number%TYPE;
996     l_mr_applicable VARCHAR2(1);
997     l_active_end_date DATE;
998     l_new_mr_header_id NUMBER;
999     l_new_mr_applicable VARCHAR2(1);
1000     l_return_status  VARCHAR2(1);
1001     l_msg_data       VARCHAR2(4000);
1002     l_msg_count      NUMBER;
1003 
1004     -- to detemine whether deferral is done from UMP
1005     CURSOR wo_exists_csr(p_unit_effectivity_id IN NUMBER) IS
1006     SELECT 'x'
1007     FROM   ahl_workorders wo,
1008            ahl_visit_tasks_b vts
1009     WHERE  WO.VISIT_TASK_ID=VTS.VISIT_TASK_ID
1010       AND	wo.STATUS_CODE NOT IN ( '17' , '22' )
1011       AND vts.unit_effectivity_id = p_unit_effectivity_id
1012       AND rownum < 2;
1013 
1014 BEGIN
1015 
1016     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
1017 		fnd_log.string
1018 		(
1019 			fnd_log.level_procedure,
1020 			'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header.begin',
1021 			'At the start of PLSQL procedure'
1022 		);
1023     END IF;
1024 
1025     IF(p_df_header_rec.operation_flag IS NOT NULL AND p_df_header_rec.operation_flag NOT IN(G_OP_CREATE,G_OP_UPDATE,G_OP_DELETE))THEN
1026        FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_HD_OP_FLAG');
1027        FND_MSG_PUB.ADD;
1028        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1029           fnd_log.string ( fnd_log.level_unexpected, 'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1030           'Operation Flag is invalid in the header record' );
1031        END IF;
1032        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1033     ELSE
1034       -- R12: UMP Deferral.
1035       -- First validate UE ID. If UMP Deferral, then UE must not be in a 'planned' status.
1036       OPEN valid_ue_csr(p_df_header_rec.unit_effectivity_id);
1037       FETCH valid_ue_csr INTO l_exists;
1038       IF (valid_ue_csr%FOUND) THEN
1039            -- ump deferral.
1040         CLOSE valid_ue_csr;
1041            -- do not allow cancellation of MR/SR if not already in execution
1042         OPEN wo_exists_csr(p_df_header_rec.unit_effectivity_id);
1043         FETCH wo_exists_csr INTO l_exists;
1044         IF (wo_exists_csr%NOTFOUND and p_df_header_rec.cancel_flag = G_YES_FLAG) THEN
1045            FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_UMP_SR_MR_CAN');
1046            FND_MSG_PUB.ADD;
1047            IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
1048 		        fnd_log.string
1049 		        (
1050 			        fnd_log.level_error,
1051 			        'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1052 			        'This MR/SR can not be cancelled from Unit Maintenance Plan.'
1053 		        );
1054            END IF;
1055         END IF;
1056         CLOSE wo_exists_csr;
1057       ELSE
1058          CLOSE valid_ue_csr;
1059          -- Production Validations.
1060          -- TAMAL -- Begin changes for ER #3356804
1061          -- This splitting of cursors is needed to handle the case of SRs with MRs v/s SRs without MRs
1062          -- First check whether the UE corresponds to a SR with MRs that is available for deferral processing
1063          -- If yes, fine
1064          -- If no, then check whether the UE corresponds to a SR without MRs or plain MRs that is available for deferral processing
1065          -- If yes, fine
1066          -- If no, raise unexpected error
1067          OPEN valid_sr_deferral_csr (p_df_header_rec.unit_effectivity_id);
1068          FETCH valid_sr_deferral_csr INTO l_exists;
1069          IF (valid_sr_deferral_csr%NOTFOUND) THEN
1070             CLOSE valid_sr_deferral_csr;
1071             OPEN valid_deferral_csr(p_df_header_rec.unit_effectivity_id);
1072             FETCH valid_deferral_csr INTO l_exists;
1073             IF(valid_deferral_csr%NOTFOUND) THEN
1074                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_MRSR_STATUS');
1075                FND_MSG_PUB.ADD;
1076                IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level) THEN
1077                   fnd_log.string ( fnd_log.level_unexpected, 'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1078                   'invalid mr or sr status invalid for update or delete 1' );
1079                END IF;
1080                CLOSE valid_deferral_csr;
1081                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1082            ELSE
1083               CLOSE valid_deferral_csr;
1084            END IF; -- valid_deferral_csr
1085         ELSE
1086            CLOSE valid_sr_deferral_csr;
1087         END IF; -- valid_sr_deferral_csr
1088         -- SR Cancellation - child MR cannot be deferred if originator ue is a SR
1089         -- based on non-serialized instance.
1090         IF (p_df_header_rec.cancel_flag = G_NO_FLAG) THEN
1091           OPEN is_orig_ue_nonserial(p_df_header_rec.unit_effectivity_id);
1092           FETCH is_orig_ue_nonserial INTO l_serial_number;
1093           CLOSE is_orig_ue_nonserial;
1094           IF (l_serial_number IS NULL) THEN
1095               FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_NS_DF_INVALID');
1096               FND_MSG_PUB.ADD;
1097               IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1098                     fnd_log.string
1099                     (
1100                             fnd_log.level_unexpected,
1101                             'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1102                             'cannot defer child MR when parent MR is based on non-serial SR'
1103                     );
1104               END IF;
1105               RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1106            END IF;
1107         END IF;
1108       END IF; -- valid_ue_csr
1109    END IF;
1110 
1111 
1112     IF(p_df_header_rec.operation_flag = G_OP_CREATE) THEN
1113        ----------------VALIDATION for DEFERRAL RECORD CREATION----------------
1114        -- check whether any record alreasy exists for the UE, IF yes raise error
1115        OPEN deferral_rec_exists_csr(p_df_header_rec.unit_effectivity_id);
1116        FETCH deferral_rec_exists_csr INTO l_exists;
1117        IF(deferral_rec_exists_csr%FOUND)THEN
1118          FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_HD_OP_REXIST');
1119          FND_MSG_PUB.ADD;
1120          IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1121 		    fnd_log.string
1122 		    (
1123 			    fnd_log.level_unexpected,
1124 			    'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1125 			    'Deferral record exist while operation flag is create'
1126 		    );
1127          END IF;
1128          CLOSE deferral_rec_exists_csr;
1129          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1130        END IF;
1131        CLOSE deferral_rec_exists_csr;
1132 
1133        -- check whether status is nothing but draft while creating record for deferral
1134        IF(p_df_header_rec.approval_status_code <> 'DRAFT')THEN
1135          FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_APPR_STATUS');
1136          FND_MSG_PUB.ADD;
1137          IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1138 		    fnd_log.string
1139 		    (
1140 			    fnd_log.level_unexpected,
1141 			    'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1142 			    'approval status is not DRAFT while creating a deferral record'
1143 		    );
1144          END IF;
1145          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1146        END IF;
1147 
1148    -- update and delete validations
1149    ELSIF (p_df_header_rec.operation_flag IN (G_OP_UPDATE,G_OP_DELETE)) THEN
1150        -- check whether deferral record can be updated or deleted
1151        OPEN valid_deferral_up_csr(p_df_header_rec.unit_deferral_id);
1152        FETCH valid_deferral_up_csr INTO l_exists;
1153        IF(valid_deferral_up_csr%NOTFOUND)THEN
1154 	     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_MRSR_STATUS');
1155          FND_MSG_PUB.ADD;
1156          IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1157 		    fnd_log.string
1158 		    (
1159 			    fnd_log.level_unexpected,
1160 			    'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1161 			    'approval status invalid for update or delete : ue_id : ' || p_df_header_rec.unit_deferral_id
1162 		    );
1163          END IF;
1164          CLOSE valid_deferral_up_csr;
1165          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1166        END IF;
1167        CLOSE valid_deferral_up_csr;
1168    END IF;
1169 
1170    --Data validation for creates and updates.
1171    IF (p_df_header_rec.operation_flag IN (G_OP_CREATE, G_OP_UPDATE)) THEN
1172        -- validate deferral reason codes
1173        IF(p_df_header_rec.defer_reason_code IS NOT NULL)THEN
1174           validate_reason_codes(p_df_header_rec.defer_reason_code);
1175        END IF;
1176        -- general validations for flags
1177        IF(p_df_header_rec.cancel_flag NOT IN(G_YES_FLAG,G_NO_FLAG))THEN
1178           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_CANCEL_FLAG');
1179           FND_MSG_PUB.ADD;
1180           IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1181 		    fnd_log.string
1182 		    (
1183 			    fnd_log.level_unexpected,
1184 			    'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1185 			    'Cancel flag is not Y or N'
1186 		    );
1187          END IF;
1188          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1189        END IF;
1190        IF(p_df_header_rec.skip_mr_flag NOT IN(G_YES_FLAG,G_NO_FLAG))THEN
1191           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_SKIP_FLAG');
1192           FND_MSG_PUB.ADD;
1193           IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1194 		    fnd_log.string
1195 		    (
1196 			    fnd_log.level_unexpected,
1197 			    'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1198 			    'Skip flag is not Y or N'
1199 		    );
1200          END IF;
1201          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1202        END IF;
1203        IF(p_df_header_rec.affect_due_calc_flag NOT IN(G_YES_FLAG,G_NO_FLAG))THEN
1204           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_AFFDUE_FLAG');
1205           FND_MSG_PUB.ADD;
1206           IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1207 		    fnd_log.string
1208 		    (
1209 			    fnd_log.level_unexpected,
1210 			    'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1211 			    'Affect Due Calc Flag is not Y or N'
1212 		    );
1213          END IF;
1214          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1215        END IF;
1216 
1217        -- Check user deferral type.(R12: UMP Deferral)
1218        IF (p_df_header_rec.user_deferral_type_code IS NOT NULL AND
1219            p_df_header_rec.user_deferral_type_code <> FND_API.G_MISS_CHAR) THEN
1220            OPEN validate_user_defer_csr(p_df_header_rec.user_deferral_type_code);
1221            FETCH validate_user_defer_csr INTO l_exists;
1222            IF (validate_user_defer_csr%NOTFOUND) THEN
1223               FND_MESSAGE.Set_Name('AHL','AHL_UMP_INVALID_DEF_TYPE');
1224               FND_MESSAGE.Set_token('CODE', p_df_header_rec.user_deferral_type_code);
1225               FND_MSG_PUB.ADD;
1226            END IF;
1227            CLOSE validate_user_defer_csr;
1228        END IF;
1229 
1230        IF(p_df_header_rec.skip_mr_flag = G_NO_FLAG AND p_df_header_rec.cancel_flag = G_NO_FLAG AND
1231          (p_df_header_rec.set_due_date IS NOT NULL AND
1232             trunc(p_df_header_rec.set_due_date) < trunc(SYSDATE))) THEN
1233           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_SET_DUE_DT');
1234           FND_MESSAGE.Set_Token('SET_DUE_DATE',p_df_header_rec.set_due_date);
1235           FND_MSG_PUB.ADD;
1236           IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
1237 		      fnd_log.string
1238 		      (
1239 			        fnd_log.level_error,
1240 			        'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1241 			        'Set due date cant be null or less than system date '
1242 		      );
1243           END IF;
1244       END IF;
1245 
1246       IF(p_df_header_rec.deferral_effective_on IS NULL OR
1247           p_df_header_rec.deferral_effective_on > SYSDATE) THEN
1248           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_DF_EFF_DT');
1249           FND_MESSAGE.Set_Token('DEFERRAL_EFFECTIVE_ON',p_df_header_rec.deferral_effective_on);
1250           FND_MSG_PUB.ADD;
1251           IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
1252 		      fnd_log.string
1253 		      (
1254 			        fnd_log.level_error,
1255 			        'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1256 			        'Deferral Effective On Date can not be null or greater than system date '
1257 		      );
1258          END IF;
1259        END IF;
1260 
1261        -- MR/SR specific validations
1262        IF(p_df_header_rec.deferral_type = G_DEFERRAL_TYPE_MR) THEN
1263 
1264            AHL_PRD_DF_PVT.get_mr_termination_details(
1265                     p_unit_effectivity_id   => p_df_header_rec.unit_effectivity_id,
1266                     x_mr_applicable         => l_mr_applicable,
1267                     x_active_end_date      => l_active_end_date,
1268                     x_new_mr_header_id     => l_new_mr_header_id,
1269                     x_new_mr_applicable    => l_new_mr_applicable,
1270                     x_return_status        => l_return_status,
1271                     x_msg_count            => l_msg_count,
1272                     x_msg_data             => l_msg_data);
1273           IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) 	THEN
1274 			           RAISE FND_API.G_EXC_ERROR;
1275           END IF;
1276           -- if MR is not applicable anymore, it must be terminated. Whether Planned or unplanned
1277           IF(l_mr_applicable = FND_API.G_FALSE AND l_new_mr_applicable = FND_API.G_FALSE
1278                AND (p_df_header_rec.skip_mr_flag = G_NO_FLAG OR p_df_header_rec.cancel_flag = G_YES_FLAG) )THEN
1279                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_MR_EXPIRED');
1280                FND_MSG_PUB.ADD;
1281                RAISE FND_API.G_EXC_ERROR;
1282           END IF;
1283           IF (p_df_header_rec.manually_planned_flag = G_NO_FLAG)THEN -- MR is planned
1284             IF(p_df_header_rec.cancel_flag = G_NO_FLAG AND p_df_header_rec.affect_due_calc_flag = G_NO_FLAG AND p_df_header_rec.reset_counter_flag = G_YES_FLAG) THEN
1285               FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_AFFDUE_FLAG');
1286               FND_MSG_PUB.ADD;
1287               RAISE FND_API.G_EXC_ERROR;
1288             END IF;
1289             IF(p_df_header_rec.mr_repetitive_flag = G_NO_FLAG AND
1290                p_df_header_rec.skip_mr_flag = G_YES_FLAG AND l_mr_applicable = FND_API.G_TRUE) THEN
1291                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_SKIP_FLAG');
1292                FND_MSG_PUB.ADD;
1293                IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1294 		           fnd_log.string
1295 		           (
1296 			         fnd_log.level_unexpected,
1297 			         'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1298 			         'Skip MR flag is Y while MR is not repetitive'
1299 		           );
1300                END IF;
1301                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1302             END IF;
1303           ELSE -- MR is unplanned
1304             IF(p_df_header_rec.cancel_flag = G_NO_FLAG AND p_df_header_rec.skip_mr_flag = G_NO_FLAG) THEN
1305                IF(p_df_header_rec.affect_due_calc_flag = G_NO_FLAG AND
1306                   p_df_header_rec.reset_counter_flag = G_YES_FLAG) THEN
1307                   FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_AFFDUE_FLAG');
1308                   FND_MSG_PUB.ADD;
1309                   IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1310 		              fnd_log.string
1311 		              (
1312 			            fnd_log.level_unexpected,
1313 			            'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1314 			            'MR has resettable counters so affect due cal flag cant be N '
1315 		              );
1316                   END IF;
1317                   RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1318                END IF;
1319              ELSE -- MR is being terminated or cancelled
1320               IF(p_df_header_rec.affect_due_calc_flag = G_YES_FLAG) THEN
1321                   FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_AFFDUE_FLAG');
1322                   FND_MSG_PUB.ADD;
1323                   IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1324 		              fnd_log.string
1325 		              (
1326 			            fnd_log.level_unexpected,
1327 			            'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1328 			            'MR skip flag is Y so affect due cal flag can not be Y '
1329 		              );
1330                   END IF;
1331                   RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1332                END IF;
1333             END IF;
1334           END IF;
1335        ELSIF(p_df_header_rec.deferral_type = G_DEFERRAL_TYPE_SR)THEN
1336           -- no deferral for SR with non-serialized items
1337           IF (p_df_header_rec.cancel_flag = G_NO_FLAG) THEN
1338             OPEN is_sr_ue_nonserial(p_df_header_rec.unit_effectivity_id);
1339             FETCH is_sr_ue_nonserial INTO l_serial_number;
1340             CLOSE is_sr_ue_nonserial;
1341             IF (l_serial_number IS NULL) THEN
1342               FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_NS_DF_INVALID');
1343               FND_MSG_PUB.ADD;
1344               IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1345                     fnd_log.string
1346                     (
1347                             fnd_log.level_unexpected,
1348                             'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1349                             'cannot defer SR based on non-serial item'
1350                     );
1351               END IF;
1352               RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1353              END IF;
1354           END IF;
1355 
1356           IF(p_df_header_rec.cancel_flag = G_NO_FLAG AND p_df_header_rec.affect_due_calc_flag = G_NO_FLAG)THEN
1357              FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_AFFDUE_FLAG');
1358              FND_MSG_PUB.ADD;
1359              IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1360 		         fnd_log.string
1361 		         (
1362 			         fnd_log.level_unexpected,
1363 			         'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header',
1364 			         'For SR, affect due date flag can not be N '
1365 		         );
1366              END IF;
1367              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1368           END IF;
1369        END IF;
1370    END IF;
1371 
1372 
1373     -- raise expected error
1374     IF(FND_MSG_PUB.count_msg > 0)THEN
1375          RAISE FND_API.G_EXC_ERROR;
1376     END IF;
1377 
1378     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
1379 		fnd_log.string
1380 		(
1381 			fnd_log.level_procedure,
1382 			'ahl.plsql.AHL_PRD_DF_PVT.validate_df_header.end',
1383 			'At the end of PLSQL procedure'
1384 		);
1385     END IF;
1386 
1387 END validate_df_header;
1388 --------------------------------------------------------------------------------------------------------
1389 -- Reason code validation
1390 --------------------------------------------------------------------------------------------------------
1391 
1392 PROCEDURE validate_reason_codes(
1393      p_defer_reason_code       IN VARCHAR2) IS
1394 
1395      l_temp1 NUMBER := 1;
1396      l_temp2 NUMBER;
1397      l_index NUMBER := 1;
1398      exit_flag boolean := false;
1399      l_string VARCHAR2(30);
1400 
1401      CURSOR val_reason_code_csr(p_reason_code IN VARCHAR2) IS
1402      SELECT 'x' FROM fnd_lookup_values_vl fnd
1403      WHERE fnd.lookup_code = p_reason_code
1404      AND fnd.lookup_type = 'AHL_PRD_DF_REASON_TYPES';
1405 
1406      l_exists VARCHAR2(1);
1407 
1408 BEGIN
1409     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
1410 		fnd_log.string
1411 		(
1412 			fnd_log.level_procedure,
1413 			'ahl.plsql.AHL_PRD_DF_PVT.validate_reason_codes.begin',
1414 			'At the start of PLSQL procedure'
1415 		);
1416     END IF;
1417 
1418     LOOP
1419       l_temp2 := instr(p_defer_reason_code,G_REASON_CODE_DELIM,1,l_index);
1420       IF(l_temp2 = 0) THEN
1421         l_string := substr(p_defer_reason_code,l_temp1);
1422         OPEN val_reason_code_csr(l_string);
1423         FETCH val_reason_code_csr INTO l_exists;
1424         IF(val_reason_code_csr%NOTFOUND) THEN
1425            FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_RSN_CODE');
1426            FND_MSG_PUB.ADD;
1427            IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1428 		         fnd_log.string
1429 		         (
1430 			         fnd_log.level_unexpected,
1431 			         'ahl.plsql.AHL_PRD_DF_PVT.validate_reason_codes',
1432 			         'Reason code is not defined in lookups '
1433 		         );
1434            END IF;
1435            CLOSE val_reason_code_csr;
1436            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1437         END IF;
1438         CLOSE val_reason_code_csr;
1439         exit_flag := true;
1440       ELSE
1441         l_string := substr(p_defer_reason_code,l_temp1,l_temp2 - l_temp1);
1442         OPEN val_reason_code_csr(l_string);
1443         FETCH val_reason_code_csr INTO l_exists;
1444         IF(val_reason_code_csr%NOTFOUND) THEN
1445            FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_RSN_CODE');
1446            FND_MSG_PUB.ADD;
1447            IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1448 		         fnd_log.string
1449 		         (
1450 			         fnd_log.level_unexpected,
1451 			         'ahl.plsql.AHL_PRD_DF_PVT.validate_reason_codes',
1452 			         'Reason code is not defined in lookups '
1453 		         );
1454            END IF;
1455            CLOSE val_reason_code_csr;
1456            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1457         END IF;
1458         CLOSE val_reason_code_csr;
1459         l_index := l_index + 1;
1460         l_temp1 := l_temp2 + 1;
1461       END IF;
1462       EXIT WHEN exit_flag;
1463     END LOOP;
1464 
1465     IF(FND_MSG_PUB.count_msg > 0)THEN
1466        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1467     END IF;
1468 
1469     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
1470 		fnd_log.string
1471 		(
1472 			fnd_log.level_procedure,
1473 			'ahl.plsql.AHL_PRD_DF_PVT.validate_reason_codes.end',
1474 			'At the end of PLSQL procedure'
1475 		);
1476     END IF;
1477 
1478 END validate_reason_codes;
1479 
1480 
1481 ---------------------------------------------------------------------------------------------------------
1482 -- defaulting values in case of create and update mode
1483 ---------------------------------------------------------------------------------------------------------
1484 
1485 PROCEDURE default_unchanged_df_header(
1486     p_x_df_header_rec       IN OUT NOCOPY  AHL_PRD_DF_PVT.df_header_rec_type)IS
1487 
1488    CURSOR df_header_csr(p_unit_deferral_id IN NUMBER, p_object_version_number IN NUMBER) IS
1489    SELECT  unit_effectivity_id, unit_deferral_type, approval_status_code, defer_reason_code,skip_mr_flag,cancel_flag,
1490         affect_due_calc_flag, set_due_date, deferral_effective_on,remarks,approver_notes,attribute_category, attribute1,
1491         attribute2, attribute3, attribute4, attribute5, attribute6, attribute7,
1492         attribute8, attribute9, attribute10, attribute11, attribute12,
1493         attribute13, attribute14, attribute15
1494    FROM ahl_unit_deferrals_vl
1495    WHERE object_version_number= p_object_version_number
1496    AND unit_deferral_id = p_unit_deferral_id;
1497 
1498 l_df_header_rec AHL_PRD_DF_PVT.df_header_Rec_type;
1499 
1500 BEGIN
1501     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
1502 		fnd_log.string
1503 		(
1504 			fnd_log.level_procedure,
1505 			'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_header.begin',
1506 			'At the start of PLSQL procedure'
1507 		);
1508     END IF;
1509 
1510     IF(p_x_df_header_rec.operation_flag IS NULL OR p_x_df_header_rec.operation_flag = G_OP_UPDATE) THEN
1511         OPEN df_header_csr(p_x_df_header_rec.unit_deferral_id, p_x_df_header_rec.object_version_number);
1512         FETCH df_header_csr INTO l_df_header_rec.unit_effectivity_id, l_df_header_rec.unit_deferral_type,
1513          l_df_header_rec.approval_status_code,l_df_header_rec.defer_reason_code,
1514          l_df_header_rec.skip_mr_flag,l_df_header_rec.cancel_flag,l_df_header_rec.affect_due_calc_flag,l_df_header_rec.set_due_date,
1515          l_df_header_rec.deferral_effective_on,l_df_header_rec.remarks,l_df_header_rec.approver_notes,
1516          l_df_header_rec.attribute_category,l_df_header_rec.attribute1,l_df_header_rec.attribute2,
1517          l_df_header_rec.attribute3, l_df_header_rec.attribute4, l_df_header_rec.attribute5,
1518          l_df_header_rec.attribute6, l_df_header_rec.attribute7, l_df_header_rec.attribute8,
1519          l_df_header_rec.attribute9, l_df_header_rec.attribute10, l_df_header_rec.attribute11,
1520          l_df_header_rec.attribute12, l_df_header_rec.attribute13, l_df_header_rec.attribute14,
1521          l_df_header_rec.attribute15;
1522         IF (df_header_csr%NOTFOUND) THEN
1523             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INVOP_HREC_MISS');
1524             FND_MSG_PUB.ADD;
1525             IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
1526 		         fnd_log.string
1527 		         (
1528 			         fnd_log.level_error,
1529 			         'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_header',
1530 			         'Missing Deferral Header Record'
1531 		         );
1532             END IF;
1533         ELSE
1534             IF (p_x_df_header_rec.unit_effectivity_id IS NULL) THEN
1535                 p_x_df_header_rec.unit_effectivity_id := l_df_header_rec.unit_effectivity_id;
1536             ELSIF(p_x_df_header_rec.unit_effectivity_id <> l_df_header_rec.unit_effectivity_id ) THEN
1537                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_UE');
1538                 FND_MSG_PUB.ADD;
1539                 IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1540 		           fnd_log.string
1541 		            (
1542 			         fnd_log.level_unexpected,
1543 			         'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_header',
1544 			         'Unit Effectivity ID does not match with deferral header record'
1545 		            );
1546                 END IF;
1547                 CLOSE df_header_csr;
1548                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1549             END IF;
1550 
1551             IF (p_x_df_header_rec.unit_deferral_type IS NULL) THEN
1552                 p_x_df_header_rec.unit_deferral_type := l_df_header_rec.unit_deferral_type;
1553             ELSIF(p_x_df_header_rec.unit_deferral_type <> l_df_header_rec.unit_deferral_type) THEN
1554                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_UDF_TYPE');
1555                 FND_MSG_PUB.ADD;
1556                 IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1557 		           fnd_log.string
1558 		            (
1559 			         fnd_log.level_unexpected,
1560 			         'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_header',
1561 			         'Unit Deferral Type does not match with deferral header record'
1562 		            );
1563                 END IF;
1564                 CLOSE df_header_csr;
1565                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1566             END IF;
1567 
1568             IF (p_x_df_header_rec.approval_status_code IS NULL) THEN
1569                 p_x_df_header_rec.approval_status_code := l_df_header_rec.approval_status_code;
1570             ELSIF(p_x_df_header_rec.approval_status_code <> l_df_header_rec.approval_status_code) THEN
1571                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_APPR_STATUS');
1572                 FND_MSG_PUB.ADD;
1573                 IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1574 		           fnd_log.string
1575 		            (
1576 			         fnd_log.level_unexpected,
1577 			         'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_header',
1578 			         'Approval status code can not be modified'
1579 		            );
1580                 END IF;
1581                 CLOSE df_header_csr;
1582                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1583             END IF;
1584 
1585             IF (p_x_df_header_rec.defer_reason_code IS NULL) THEN
1586                 p_x_df_header_rec.defer_reason_code := l_df_header_rec.defer_reason_code;
1587             ELSIF(p_x_df_header_rec.defer_reason_code = FND_API.G_MISS_CHAR) THEN
1588                 p_x_df_header_rec.defer_reason_code := NULL;
1589             END IF;
1590 
1591             IF (p_x_df_header_rec.skip_mr_flag IS NULL) THEN
1592                 p_x_df_header_rec.skip_mr_flag := l_df_header_rec.skip_mr_flag;
1593             ELSIF(p_x_df_header_rec.skip_mr_flag = FND_API.G_MISS_CHAR) THEN
1594                 p_x_df_header_rec.skip_mr_flag := G_NO_FLAG;
1595             END IF;
1596 
1597             IF (p_x_df_header_rec.cancel_flag IS NULL) THEN
1598                 p_x_df_header_rec.cancel_flag := l_df_header_rec.cancel_flag;
1599             ELSIF(p_x_df_header_rec.cancel_flag = FND_API.G_MISS_CHAR) THEN
1600                 p_x_df_header_rec.cancel_flag := G_NO_FLAG;
1601             END IF;
1602 
1603             IF (p_x_df_header_rec.affect_due_calc_flag IS NULL) THEN
1604                 p_x_df_header_rec.affect_due_calc_flag := l_df_header_rec.affect_due_calc_flag;
1605             ELSIF(p_x_df_header_rec.affect_due_calc_flag = FND_API.G_MISS_CHAR) THEN
1606                 p_x_df_header_rec.affect_due_calc_flag := G_NO_FLAG;
1607             END IF;
1608 
1609             IF (p_x_df_header_rec.set_due_date IS NULL) THEN
1610                 p_x_df_header_rec.set_due_date := l_df_header_rec.set_due_date;
1611             ELSIF(p_x_df_header_rec.set_due_date = FND_API.G_MISS_DATE) THEN
1612                 p_x_df_header_rec.set_due_date := NULL;
1613             END IF;
1614 
1615             IF (p_x_df_header_rec.deferral_effective_on IS NULL) THEN
1616                 p_x_df_header_rec.deferral_effective_on := l_df_header_rec.deferral_effective_on;
1617             ELSIF(p_x_df_header_rec.deferral_effective_on = FND_API.G_MISS_DATE) THEN
1618                 p_x_df_header_rec.deferral_effective_on := NULL;
1619             END IF;
1620 
1621             IF (p_x_df_header_rec.remarks IS NULL) THEN
1622                 p_x_df_header_rec.remarks := l_df_header_rec.remarks;
1623             ELSIF(p_x_df_header_rec.remarks = FND_API.G_MISS_CHAR) THEN
1624                 p_x_df_header_rec.remarks := NULL;
1625             END IF;
1626 
1627             IF (p_x_df_header_rec.approver_notes IS NULL) THEN
1628                 p_x_df_header_rec.approver_notes := l_df_header_rec.approver_notes;
1629             ELSIF(p_x_df_header_rec.approver_notes <> l_df_header_rec.approver_notes) THEN
1630                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_APPR_NOTES');
1631                 FND_MSG_PUB.ADD;
1632                 IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1633 		           fnd_log.string
1634 		           (
1635 			        fnd_log.level_unexpected,
1636 			        'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_header',
1637 			        'approver notes can not be updated by this API'
1638 		           );
1639                 END IF;
1640                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1641             END IF;
1642 
1643             IF (p_x_df_header_rec.attribute_category IS NULL) THEN
1644                 p_x_df_header_rec.attribute_category := l_df_header_rec.attribute_category;
1645             ELSIF(p_x_df_header_rec.attribute_category = FND_API.G_MISS_CHAR) THEN
1646                 p_x_df_header_rec.attribute_category := NULL;
1647             END IF;
1648 
1649             IF (p_x_df_header_rec.attribute1 IS NULL) THEN
1650                 p_x_df_header_rec.attribute1 := l_df_header_rec.attribute1;
1651             ELSIF(p_x_df_header_rec.attribute1 = FND_API.G_MISS_CHAR) THEN
1652                 p_x_df_header_rec.attribute1 := NULL;
1653             END IF;
1654 
1655             IF (p_x_df_header_rec.attribute2 IS NULL) THEN
1656                 p_x_df_header_rec.attribute2 := l_df_header_rec.attribute2;
1657             ELSIF(p_x_df_header_rec.attribute2 = FND_API.G_MISS_CHAR) THEN
1658                 p_x_df_header_rec.attribute2 := NULL;
1659             END IF;
1660 
1661             IF (p_x_df_header_rec.attribute3 IS NULL) THEN
1662                 p_x_df_header_rec.attribute3 := l_df_header_rec.attribute3;
1663             ELSIF(p_x_df_header_rec.attribute3 = FND_API.G_MISS_CHAR) THEN
1664                 p_x_df_header_rec.attribute3 := NULL;
1665             END IF;
1666 
1667             IF (p_x_df_header_rec.attribute4 IS NULL) THEN
1668                 p_x_df_header_rec.attribute4 := l_df_header_rec.attribute4;
1669             ELSIF(p_x_df_header_rec.attribute4 = FND_API.G_MISS_CHAR) THEN
1670                 p_x_df_header_rec.attribute4 := NULL;
1671             END IF;
1672 
1673             IF (p_x_df_header_rec.attribute5 IS NULL) THEN
1674                 p_x_df_header_rec.attribute5 := l_df_header_rec.attribute5;
1675             ELSIF(p_x_df_header_rec.attribute5 = FND_API.G_MISS_CHAR) THEN
1676                 p_x_df_header_rec.attribute5 := NULL;
1677             END IF;
1678 
1679             IF (p_x_df_header_rec.attribute6 IS NULL) THEN
1680                 p_x_df_header_rec.attribute6 := l_df_header_rec.attribute6;
1681             ELSIF(p_x_df_header_rec.attribute6 = FND_API.G_MISS_CHAR) THEN
1682                 p_x_df_header_rec.attribute6 := NULL;
1683             END IF;
1684 
1685             IF (p_x_df_header_rec.attribute7 IS NULL) THEN
1686                 p_x_df_header_rec.attribute7 := l_df_header_rec.attribute7;
1687             ELSIF(p_x_df_header_rec.attribute7 = FND_API.G_MISS_CHAR) THEN
1688                 p_x_df_header_rec.attribute7 := NULL;
1689             END IF;
1690 
1691             IF (p_x_df_header_rec.attribute8 IS NULL) THEN
1692                 p_x_df_header_rec.attribute8 := l_df_header_rec.attribute8;
1693             ELSIF(p_x_df_header_rec.attribute8 = FND_API.G_MISS_CHAR) THEN
1694                 p_x_df_header_rec.attribute8 := NULL;
1695             END IF;
1696 
1697             IF (p_x_df_header_rec.attribute9 IS NULL) THEN
1698                 p_x_df_header_rec.attribute9 := l_df_header_rec.attribute9;
1699             ELSIF(p_x_df_header_rec.attribute9 = FND_API.G_MISS_CHAR) THEN
1700                 p_x_df_header_rec.attribute9 := NULL;
1701             END IF;
1702 
1703             IF (p_x_df_header_rec.attribute10 IS NULL) THEN
1704                 p_x_df_header_rec.attribute10 := l_df_header_rec.attribute10;
1705             ELSIF(p_x_df_header_rec.attribute10 = FND_API.G_MISS_CHAR) THEN
1706                 p_x_df_header_rec.attribute10 := NULL;
1707             END IF;
1708 
1709             IF (p_x_df_header_rec.attribute11 IS NULL) THEN
1710                 p_x_df_header_rec.attribute11 := l_df_header_rec.attribute11;
1711             ELSIF(p_x_df_header_rec.attribute11 = FND_API.G_MISS_CHAR) THEN
1712                 p_x_df_header_rec.attribute11 := NULL;
1713             END IF;
1714 
1715             IF (p_x_df_header_rec.attribute12 IS NULL) THEN
1716                 p_x_df_header_rec.attribute12 := l_df_header_rec.attribute12;
1717             ELSIF(p_x_df_header_rec.attribute12 = FND_API.G_MISS_CHAR) THEN
1718                 p_x_df_header_rec.attribute12 := NULL;
1719             END IF;
1720 
1721             IF (p_x_df_header_rec.attribute13 IS NULL) THEN
1722                 p_x_df_header_rec.attribute13 := l_df_header_rec.attribute13;
1723             ELSIF(p_x_df_header_rec.attribute13 = FND_API.G_MISS_CHAR) THEN
1724                 p_x_df_header_rec.attribute13 := NULL;
1725             END IF;
1726 
1727             IF (p_x_df_header_rec.attribute14 IS NULL) THEN
1728                 p_x_df_header_rec.attribute14 := l_df_header_rec.attribute14;
1729             ELSIF(p_x_df_header_rec.attribute14 = FND_API.G_MISS_CHAR) THEN
1730                 p_x_df_header_rec.attribute14 := NULL;
1731             END IF;
1732 
1733             IF (p_x_df_header_rec.attribute15 IS NULL) THEN
1734                 p_x_df_header_rec.attribute15 := l_df_header_rec.attribute15;
1735             ELSIF(p_x_df_header_rec.attribute15 = FND_API.G_MISS_CHAR) THEN
1736                 p_x_df_header_rec.attribute15 := NULL;
1737             END IF;
1738 
1739         END IF;
1740         CLOSE df_header_csr;
1741     ELSIF (p_x_df_header_rec.operation_flag = G_OP_CREATE) THEN
1742 
1743         IF (p_x_df_header_rec.unit_effectivity_id IS NULL OR
1744             p_x_df_header_rec.unit_effectivity_id = FND_API.G_MISS_NUM) THEN
1745             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_UE');
1746             FND_MSG_PUB.ADD;
1747             IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1748 		        fnd_log.string
1749 		        (
1750 			       fnd_log.level_unexpected,
1751 			       'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_header',
1752 			       'Unit effectivity ID can not be null while creating deferral header record'
1753 		        );
1754            END IF;
1755            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1756         END IF;
1757 
1758         IF (p_x_df_header_rec.unit_deferral_type IS NULL OR
1759             p_x_df_header_rec.unit_deferral_type = FND_API.G_MISS_CHAR) THEN
1760             p_x_df_header_rec.unit_deferral_type := 'DEFERRAL';
1761         END IF;
1762 
1763         IF(p_x_df_header_rec.approval_status_code IS NULL OR
1764            p_x_df_header_rec.approval_status_code = FND_API.G_MISS_CHAR) THEN
1765            p_x_df_header_rec.approval_status_code := 'DRAFT';
1766         END IF;
1767 
1768         IF(p_x_df_header_rec.defer_reason_code = FND_API.G_MISS_CHAR) THEN
1769            p_x_df_header_rec.defer_reason_code := NULL;
1770         END IF;
1771 
1772         IF(p_x_df_header_rec.skip_mr_flag IS NULL OR
1773            p_x_df_header_rec.skip_mr_flag = FND_API.G_MISS_CHAR) THEN
1774            p_x_df_header_rec.skip_mr_flag := G_NO_FLAG;
1775         END IF;
1776 
1777         IF(p_x_df_header_rec.cancel_flag IS NULL OR
1778            p_x_df_header_rec.cancel_flag = FND_API.G_MISS_CHAR) THEN
1779            p_x_df_header_rec.cancel_flag := G_NO_FLAG;
1780         END IF;
1781 
1782         IF(p_x_df_header_rec.affect_due_calc_flag IS NULL OR
1783            p_x_df_header_rec.affect_due_calc_flag = FND_API.G_MISS_CHAR) THEN
1784            p_x_df_header_rec.affect_due_calc_flag := G_YES_FLAG;
1785         END IF;
1786 
1787         IF(p_x_df_header_rec.set_due_date = FND_API.G_MISS_DATE) THEN
1788            p_x_df_header_rec.set_due_date := NULL;
1789         END IF;
1790 
1791         IF(p_x_df_header_rec.deferral_effective_on = FND_API.G_MISS_DATE) THEN
1792            p_x_df_header_rec.deferral_effective_on := NULL;
1793         END IF;
1794 
1795         IF(p_x_df_header_rec.remarks = FND_API.G_MISS_CHAR) THEN
1796            p_x_df_header_rec.remarks := NULL;
1797         END IF;
1798 
1799         IF(p_x_df_header_rec.approver_notes = FND_API.G_MISS_CHAR) THEN
1800            p_x_df_header_rec.approver_notes := NULL;
1801         END IF;
1802 
1803         IF(p_x_df_header_rec.attribute_category = FND_API.G_MISS_CHAR) THEN
1804            p_x_df_header_rec.attribute_category := NULL;
1805         END IF;
1806 
1807         IF(p_x_df_header_rec.attribute1 = FND_API.G_MISS_CHAR) THEN
1808            p_x_df_header_rec.attribute1 := NULL;
1809         END IF;
1810 
1811         IF(p_x_df_header_rec.attribute2 = FND_API.G_MISS_CHAR) THEN
1812            p_x_df_header_rec.attribute2 := NULL;
1813         END IF;
1814 
1815         IF(p_x_df_header_rec.attribute3 = FND_API.G_MISS_CHAR) THEN
1816            p_x_df_header_rec.attribute3 := NULL;
1817         END IF;
1818 
1819         IF(p_x_df_header_rec.attribute4 = FND_API.G_MISS_CHAR) THEN
1820            p_x_df_header_rec.attribute4 := NULL;
1821         END IF;
1822 
1823         IF(p_x_df_header_rec.attribute5 = FND_API.G_MISS_CHAR) THEN
1824            p_x_df_header_rec.attribute5 := NULL;
1825         END IF;
1826 
1827         IF(p_x_df_header_rec.attribute6 = FND_API.G_MISS_CHAR) THEN
1828            p_x_df_header_rec.attribute6 := NULL;
1829         END IF;
1830 
1831         IF(p_x_df_header_rec.attribute7 = FND_API.G_MISS_CHAR) THEN
1832            p_x_df_header_rec.attribute7 := NULL;
1833         END IF;
1834 
1835         IF(p_x_df_header_rec.attribute8 = FND_API.G_MISS_CHAR) THEN
1836            p_x_df_header_rec.attribute8 := NULL;
1837         END IF;
1838 
1839         IF(p_x_df_header_rec.attribute9 = FND_API.G_MISS_CHAR) THEN
1840            p_x_df_header_rec.attribute9 := NULL;
1841         END IF;
1842 
1843         IF(p_x_df_header_rec.attribute10 = FND_API.G_MISS_CHAR) THEN
1844            p_x_df_header_rec.attribute10 := NULL;
1845         END IF;
1846 
1847         IF(p_x_df_header_rec.attribute11 = FND_API.G_MISS_CHAR) THEN
1848            p_x_df_header_rec.attribute11 := NULL;
1849         END IF;
1850 
1851         IF(p_x_df_header_rec.attribute12 = FND_API.G_MISS_CHAR) THEN
1852            p_x_df_header_rec.attribute12 := NULL;
1853         END IF;
1854 
1855         IF(p_x_df_header_rec.attribute13 = FND_API.G_MISS_CHAR) THEN
1856            p_x_df_header_rec.attribute13 := NULL;
1857         END IF;
1858 
1859         IF(p_x_df_header_rec.attribute14 = FND_API.G_MISS_CHAR) THEN
1860            p_x_df_header_rec.attribute14 := NULL;
1861         END IF;
1862 
1863         IF(p_x_df_header_rec.attribute15 = FND_API.G_MISS_CHAR) THEN
1864            p_x_df_header_rec.attribute15 := NULL;
1865         END IF;
1866      END IF;
1867 
1868      -- raise expected error
1869      IF(FND_MSG_PUB.count_msg > 0)THEN
1870          RAISE FND_API.G_EXC_ERROR;
1871      END IF;
1872 
1873      IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
1874 		fnd_log.string
1875 		(
1876 			fnd_log.level_procedure,
1877 			'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_header.end',
1878 			'At the end of PLSQL procedure'
1879 		);
1880     END IF;
1881 
1882 END default_unchanged_df_header;
1883 
1884 PROCEDURE process_df_schedules(
1885     p_df_header_rec       IN             AHL_PRD_DF_PVT.df_header_rec_type,
1886     p_x_df_schedules_tbl    IN OUT NOCOPY  AHL_PRD_DF_PVT.df_schedules_tbl_type)IS
1887 
1888     CURSOR counter_id_csr(p_counter_name IN VARCHAR2,p_unit_effectivity_id IN NUMBER) IS
1889     --SELECT CO.counter_id FROM  CSI_CP_COUNTERS_V CO, AHL_UNIT_EFFECTIVITIES_APP_V UE
1890     SELECT CO.counter_id FROM  CSI_CP_COUNTERS_V CO, AHL_UNIT_EFFECTIVITIES_B UE -- Undid App usage BLIND changes
1891     WHERE UPPER(co.counter_name) like UPPER(p_counter_name)
1892     AND co.customer_product_id = ue.csi_item_instance_id
1893     AND UE.unit_effectivity_id = p_unit_effectivity_id;
1894 
1895     l_counter_id NUMBER;
1896 
1897 BEGIN
1898 
1899     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
1900 		fnd_log.string
1901 		(
1902 			fnd_log.level_procedure,
1903 			'ahl.plsql.AHL_PRD_DF_PVT.process_df_schedules.begin',
1904 			'At the start of PLSQL procedure'
1905 		);
1906     END IF;
1907     -- record dml validations and key requirement validations
1908     FOR i IN p_x_df_schedules_tbl.FIRST..p_x_df_schedules_tbl.LAST  LOOP
1909     -- key requirements
1910     IF(p_x_df_schedules_tbl(i).operation_flag NOT IN (G_OP_CREATE,G_OP_UPDATE,G_OP_DELETE)) THEN
1911        FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_SCH_INV_OP');
1912        FND_MSG_PUB.ADD;
1913        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1914 		fnd_log.string
1915 		(
1916 			fnd_log.level_unexpected,
1917 			'ahl.plsql.AHL_PRD_DF_PVT.process_df_schedules',
1918 			'Operation Flag is invalid in the schedule record : ' || i
1919 		);
1920        END IF;
1921        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1922     ELSIF(p_x_df_schedules_tbl(i).operation_flag IN (G_OP_UPDATE,G_OP_DELETE)) THEN
1923        IF(p_x_df_schedules_tbl(i).unit_threshold_id IS NULL OR
1924           p_x_df_schedules_tbl(i).object_version_number IS NULL) THEN
1925           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_SCH_REC_KEY_MISS');
1926           FND_MSG_PUB.ADD;
1927           IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1928 		      fnd_log.string
1929 		        (
1930 			        fnd_log.level_unexpected,
1931 			        'ahl.plsql.AHL_PRD_DF_PVT.process_df_schedules',
1932 			        'Object version number or key missing in  schedule record : ' || i
1933 		        );
1934           END IF;
1935           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1936        ELSIF (p_x_df_schedules_tbl(i).unit_deferral_id IS NOT NULL AND
1937               p_x_df_schedules_tbl(i).unit_deferral_id <> p_df_header_rec.unit_deferral_id) THEN
1938            FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_SCH_HDR_MISS');
1939            FND_MSG_PUB.ADD;
1940            IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1941 		      fnd_log.string
1942 		        (
1943 			        fnd_log.level_unexpected,
1944 			        'ahl.plsql.AHL_PRD_DF_PVT.process_df_schedules',
1945 			        'Unit Deferral ID does not match in  schedule record : ' || i
1946 		        );
1947           END IF;
1948           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1949        END IF;
1950     ELSIF(p_x_df_schedules_tbl(i).operation_flag = G_OP_CREATE) THEN
1951        IF(p_x_df_schedules_tbl(i).unit_threshold_id IS NOT NULL OR
1952           p_x_df_schedules_tbl(i).object_version_number IS NOT NULL) THEN
1953           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_SCH_INV_OP');
1954           FND_MSG_PUB.ADD;
1955           IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1956 		      fnd_log.string
1957 		        (
1958 			        fnd_log.level_unexpected,
1959 			        'ahl.plsql.AHL_PRD_DF_PVT.process_df_schedules',
1960 			        'For Create Operation, Unit Threshold ID or Object Version Number is not null in schedule record : ' || i
1961 		        );
1962           END IF;
1963           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1964        END IF;
1965        IF(p_x_df_schedules_tbl(i).unit_deferral_id IS NULL OR
1966           p_x_df_schedules_tbl(i).unit_deferral_id = FND_API.G_MISS_NUM) THEN
1967           p_x_df_schedules_tbl(i).unit_deferral_id := p_df_header_rec.unit_deferral_id;
1968        ELSIF(p_x_df_schedules_tbl(i).unit_deferral_id <> p_df_header_rec.unit_deferral_id)THEN
1969           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_SCH_HDR_MISS');
1970           FND_MSG_PUB.ADD;
1971           IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
1972 		      fnd_log.string
1973 		        (
1974 			        fnd_log.level_unexpected,
1975 			        'ahl.plsql.AHL_PRD_DF_PVT.process_df_schedules',
1976 			        'For Create Operation, Header Unit Deferral ID does not match with same in schedule record : ' || i
1977 		        );
1978           END IF;
1979           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1980        END IF;
1981     END IF;
1982     -- value to id conversion for counter name
1983     IF(G_MODULE_TYPE = 'JSP' AND p_x_df_schedules_tbl(i).operation_flag IN (G_OP_CREATE,G_OP_UPDATE))THEN
1984        OPEN counter_id_csr(p_x_df_schedules_tbl(i).counter_name, p_df_header_rec.unit_effectivity_id);
1985        FETCH counter_id_csr INTO l_counter_id;
1986        IF(counter_id_csr%NOTFOUND)THEN
1987           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_CNT_NAME');
1988           FND_MESSAGE.Set_Token('COUNTER_NAME',p_x_df_schedules_tbl(i).counter_name);
1989           FND_MSG_PUB.ADD;
1990           IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
1991 		      fnd_log.string
1992 		        (
1993 			        fnd_log.level_error,
1994 			        'ahl.plsql.AHL_PRD_DF_PVT.process_df_schedules',
1995 			        'Invalid Counter name for schedule record : ' || i
1996 		        );
1997           END IF;
1998        ELSE
1999           p_x_df_schedules_tbl(i).counter_id := l_counter_id;
2000        END IF;
2001        CLOSE counter_id_csr;
2002     END IF;
2003     END LOOP;
2004 
2005     -- raise expected error
2006      IF(FND_MSG_PUB.count_msg > 0)THEN
2007          RAISE FND_API.G_EXC_ERROR;
2008      END IF;
2009 
2010     default_unchanged_df_schedules(p_x_df_schedules_tbl => p_x_df_schedules_tbl);
2011 
2012     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
2013         fnd_log.string
2014 	    (
2015 			fnd_log.level_statement,
2016 			'ahl.plsql.AHL_PRD_DF_PVT.process_df_schedules',
2017 			'Logging deferral schedule records prior to validations'
2018 	    );
2019         log_df_schedules(p_df_schedules_tbl  => p_x_df_schedules_tbl);
2020      END IF;
2021 
2022     validate_df_schedules(
2023        p_df_header_rec    => p_df_header_rec,
2024        p_df_schedules_tbl => p_x_df_schedules_tbl
2025     );
2026 
2027     IF(FND_MSG_PUB.count_msg > 0)THEN
2028        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2029     END IF;
2030 
2031 
2032 
2033     FOR i IN p_x_df_schedules_tbl.FIRST..p_x_df_schedules_tbl.LAST  LOOP
2034         IF(p_x_df_schedules_tbl(i).operation_flag = G_OP_DELETE) THEN
2035             AHL_UNIT_THRESHOLDS_PKG.delete_row(p_x_df_schedules_tbl(i).unit_threshold_id);
2036         END IF;
2037     END LOOP;
2038 
2039     FOR i IN p_x_df_schedules_tbl.FIRST..p_x_df_schedules_tbl.LAST  LOOP
2040         IF (p_x_df_schedules_tbl(i).operation_flag = G_OP_UPDATE) THEN
2041 
2042            p_x_df_schedules_tbl(i).object_version_number := p_x_df_schedules_tbl(i).object_version_number + 1;
2043 
2044            p_x_df_schedules_tbl(i).last_updated_by := fnd_global.user_id;
2045            p_x_df_schedules_tbl(i).last_update_date := SYSDATE;
2046            p_x_df_schedules_tbl(i).last_update_login := fnd_global.user_id;
2047 
2048            AHL_UNIT_THRESHOLDS_PKG.update_row(
2049            p_unit_threshold_id => p_x_df_schedules_tbl(i).unit_threshold_id,
2050            p_object_version_number => p_x_df_schedules_tbl(i).object_version_number,
2051            p_last_updated_by => p_x_df_schedules_tbl(i).last_updated_by,
2052            p_last_update_date => p_x_df_schedules_tbl(i).last_update_date,
2053            p_last_update_login => p_x_df_schedules_tbl(i).last_update_login,
2054            p_unit_deferral_id => p_x_df_schedules_tbl(i).unit_deferral_id,
2055            p_counter_id => p_x_df_schedules_tbl(i).counter_id,
2056            p_counter_value => p_x_df_schedules_tbl(i).counter_value,
2057            p_ctr_value_type_code => p_x_df_schedules_tbl(i).ctr_value_type_code,
2058            p_attribute_category => p_x_df_schedules_tbl(i).attribute_category,
2059            p_attribute1 => p_x_df_schedules_tbl(i).attribute1,
2060            p_attribute2 => p_x_df_schedules_tbl(i).attribute2,
2061            p_attribute3 => p_x_df_schedules_tbl(i).attribute3,
2062            p_attribute4 => p_x_df_schedules_tbl(i).attribute4,
2063            p_attribute5 => p_x_df_schedules_tbl(i).attribute5,
2064            p_attribute6 => p_x_df_schedules_tbl(i).attribute6,
2065            p_attribute7 => p_x_df_schedules_tbl(i).attribute7,
2066            p_attribute8 => p_x_df_schedules_tbl(i).attribute8,
2067            p_attribute9 => p_x_df_schedules_tbl(i).attribute9,
2068            p_attribute10 => p_x_df_schedules_tbl(i).attribute10,
2069            p_attribute11 => p_x_df_schedules_tbl(i).attribute11,
2070            p_attribute12 => p_x_df_schedules_tbl(i).attribute12,
2071            p_attribute13 => p_x_df_schedules_tbl(i).attribute13,
2072            p_attribute14 => p_x_df_schedules_tbl(i).attribute14,
2073            p_attribute15 => p_x_df_schedules_tbl(i).attribute15
2074            );
2075         END IF;
2076     END LOOP;
2077     FOR i IN p_x_df_schedules_tbl.FIRST..p_x_df_schedules_tbl.LAST  LOOP
2078         IF(p_x_df_schedules_tbl(i).operation_flag = G_OP_CREATE) THEN
2079 
2080            p_x_df_schedules_tbl(i).object_version_number := 1;
2081 
2082            p_x_df_schedules_tbl(i).created_by := fnd_global.user_id;
2083            p_x_df_schedules_tbl(i).creation_date := SYSDATE;
2084            p_x_df_schedules_tbl(i).last_updated_by := fnd_global.user_id;
2085            p_x_df_schedules_tbl(i).last_update_date := SYSDATE;
2086            p_x_df_schedules_tbl(i).last_update_login := fnd_global.user_id;
2087 
2088            AHL_UNIT_THRESHOLDS_PKG.insert_row(
2089            p_x_unit_threshold_id => p_x_df_schedules_tbl(i).unit_threshold_id,
2090            p_object_version_number => p_x_df_schedules_tbl(i).object_version_number,
2091            p_created_by => p_x_df_schedules_tbl(i).created_by,
2092            p_creation_date => p_x_df_schedules_tbl(i).creation_date,
2093            p_last_updated_by => p_x_df_schedules_tbl(i).last_updated_by,
2094            p_last_update_date => p_x_df_schedules_tbl(i).last_update_date,
2095            p_last_update_login => p_x_df_schedules_tbl(i).last_update_login,
2096            p_unit_deferral_id => p_x_df_schedules_tbl(i).unit_deferral_id,
2097            p_counter_id => p_x_df_schedules_tbl(i).counter_id,
2098            p_counter_value => p_x_df_schedules_tbl(i).counter_value,
2099            p_ctr_value_type_code => p_x_df_schedules_tbl(i).ctr_value_type_code,
2100            p_attribute_category => p_x_df_schedules_tbl(i).attribute_category,
2101            p_attribute1 => p_x_df_schedules_tbl(i).attribute1,
2102            p_attribute2 => p_x_df_schedules_tbl(i).attribute2,
2103            p_attribute3 => p_x_df_schedules_tbl(i).attribute3,
2104            p_attribute4 => p_x_df_schedules_tbl(i).attribute4,
2105            p_attribute5 => p_x_df_schedules_tbl(i).attribute5,
2106            p_attribute6 => p_x_df_schedules_tbl(i).attribute6,
2107            p_attribute7 => p_x_df_schedules_tbl(i).attribute7,
2108            p_attribute8 => p_x_df_schedules_tbl(i).attribute8,
2109            p_attribute9 => p_x_df_schedules_tbl(i).attribute9,
2110            p_attribute10 => p_x_df_schedules_tbl(i).attribute10,
2111            p_attribute11 => p_x_df_schedules_tbl(i).attribute11,
2112            p_attribute12 => p_x_df_schedules_tbl(i).attribute12,
2113            p_attribute13 => p_x_df_schedules_tbl(i).attribute13,
2114            p_attribute14 => p_x_df_schedules_tbl(i).attribute14,
2115            p_attribute15 => p_x_df_schedules_tbl(i).attribute15
2116            );
2117         END IF;
2118     END LOOP;
2119 
2120     IF(FND_MSG_PUB.count_msg > 0)THEN
2121         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2122     END IF;
2123 
2124     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
2125 		fnd_log.string
2126 		(
2127 			fnd_log.level_procedure,
2128 			'ahl.plsql.AHL_PRD_DF_PVT.process_df_schedules.end',
2129 			'At the end of PLSQL procedure'
2130 		);
2131     END IF;
2132 
2133 END process_df_schedules;
2134 -----------------------------------------------------------------------------------
2135 -- Procedure to dump deferral schedules records
2136 -----------------------------------------------------------------------------------
2137 PROCEDURE log_df_schedules(
2138     p_df_schedules_tbl    IN             AHL_PRD_DF_PVT.df_schedules_tbl_type) IS
2139 
2140 BEGIN
2141     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
2142     FOR i IN p_df_schedules_tbl.FIRST..p_df_schedules_tbl.LAST  LOOP
2143 	    fnd_log.string
2144 		(
2145 			    fnd_log.level_statement,
2146 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_schedules',
2147 			    'p_df_schedules_tbl('|| i ||').operation_flag : ' || p_df_schedules_tbl(i).operation_flag
2148 		);
2149         fnd_log.string
2150 		(
2151 			    fnd_log.level_statement,
2152 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_schedules',
2153 			    'p_df_schedules_tbl('|| i ||').unit_threshold_id : ' || p_df_schedules_tbl(i).unit_threshold_id
2154 		);
2155         fnd_log.string
2156 		(
2157 			    fnd_log.level_statement,
2158 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_schedules',
2159 			    'p_df_schedules_tbl('|| i ||').object_version_number : ' || p_df_schedules_tbl(i).object_version_number
2160 		);
2161         fnd_log.string
2162 		(
2163 			    fnd_log.level_statement,
2164 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_schedules',
2165 			    'p_df_schedules_tbl('|| i ||').unit_deferral_id : ' || p_df_schedules_tbl(i).unit_deferral_id
2166 		);
2167         fnd_log.string
2168 		(
2169 			    fnd_log.level_statement,
2170 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_schedules',
2171 			    'p_df_schedules_tbl('|| i ||').counter_id : ' || p_df_schedules_tbl(i).counter_id
2172 		);
2173         fnd_log.string
2174 		(
2175 			    fnd_log.level_statement,
2176 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_schedules',
2177 			    'p_df_schedules_tbl('|| i ||').counter_name : ' || p_df_schedules_tbl(i).counter_name
2178 		);
2179         fnd_log.string
2180 		(
2181 			    fnd_log.level_statement,
2182 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_schedules',
2183 			    'p_df_schedules_tbl('|| i ||').ctr_value_type_code : ' || p_df_schedules_tbl(i).ctr_value_type_code
2184 		);
2185         fnd_log.string
2186 		(
2187 			    fnd_log.level_statement,
2188 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_schedules',
2189 			    'p_df_schedules_tbl('|| i ||').counter_value : ' || p_df_schedules_tbl(i).counter_value
2190 		);
2191         fnd_log.string
2192 		(
2193 			    fnd_log.level_statement,
2194 			    'ahl.plsql.AHL_PRD_DF_PVT.log_df_schedules',
2195 			    'p_df_schedules_tbl('|| i ||').unit_of_measure : ' || p_df_schedules_tbl(i).unit_of_measure
2196 		);
2197     END LOOP;
2198     END IF;
2199 END log_df_schedules;
2200 
2201 PROCEDURE validate_df_schedules(
2202     p_df_header_rec       IN             AHL_PRD_DF_PVT.df_header_rec_type,
2203     p_df_schedules_tbl    IN             AHL_PRD_DF_PVT.df_schedules_tbl_type)IS
2204 
2205 
2206     CURSOR valid_counter_csr(p_unit_deferral_id IN NUMBER,p_counter_id IN NUMBER) IS
2207     --SELECT 'x' FROM  CSI_CP_COUNTERS_V CO, AHL_UNIT_EFFECTIVITIES_APP_V UE,AHL_UNIT_DEFERRALS_B UD
2208     SELECT 'x' FROM  CSI_CP_COUNTERS_V CO, AHL_UNIT_EFFECTIVITIES_B UE,AHL_UNIT_DEFERRALS_B UD -- Undid app usage related blind changes
2209     WHERE co.customer_product_id = ue.csi_item_instance_id
2210     AND co.counter_id = p_counter_id
2211     AND UE.unit_effectivity_id = UD.unit_effectivity_id
2212     AND UD.unit_deferral_id = p_unit_deferral_id;
2213 
2214     /*CURSOR mr_valid_counter_csr(p_unit_deferral_id IN NUMBER,p_counter_id IN NUMBER) IS
2215     SELECT 'x' from ahl_unit_effectivities_b UE, ahl_unit_deferrals_b UD,AHL_MR_INTERVALS_V MR,CSI_CP_COUNTERS_V CO
2216     WHERE UD.unit_deferral_id = p_unit_deferral_id
2217     AND UE.unit_effectivity_id = UD.unit_effectivity_id
2218     AND co.customer_product_id = ue.csi_item_instance_id
2219     AND UE.mr_effectivity_id = MR.mr_effectivity_id
2220     AND CO.counter_id = p_counter_id
2221     AND CO.counter_name = MR.counter_name;  */
2222 
2223 
2224     CURSOR valid_df_rec_del_csr(p_unit_threshold_id IN NUMBER, p_object_version_number IN NUMBER) IS
2225     SELECT 'x' FROM ahl_unit_thresholds
2226     WHERE object_version_number = p_object_version_number
2227     AND unit_threshold_id = p_unit_threshold_id;
2228 
2229     l_exists VARCHAR2(1);
2230     --l_current_counter_value NUMBER;
2231 
2232 BEGIN
2233     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
2234 		fnd_log.string
2235 		(
2236 			fnd_log.level_procedure,
2237 			'ahl.plsql.AHL_PRD_DF_PVT.validate_df_schedules.begin',
2238 			'At the start of PLSQL procedure'
2239 		);
2240     END IF;
2241 
2242     FOR i IN p_df_schedules_tbl.FIRST..p_df_schedules_tbl.LAST  LOOP
2243     -- not needed when module type is JSP as value to id conversion took care of that
2244     IF(p_df_schedules_tbl(i).operation_flag IN (G_OP_CREATE,G_OP_UPDATE) AND NVL(G_MODULE_TYPE,'x') <> 'JSP') THEN
2245        -- validate whether valid items' counter
2246        OPEN valid_counter_csr(p_df_schedules_tbl(i).unit_deferral_id,p_df_schedules_tbl(i).counter_id);
2247        FETCH valid_counter_csr INTO l_exists;
2248        IF(valid_counter_csr%NOTFOUND)THEN
2249           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_CNT_NAME');
2250           FND_MESSAGE.Set_Token('COUNTER_NAME',p_df_schedules_tbl(i).counter_name);
2251           FND_MSG_PUB.ADD;
2252           IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2253 		      fnd_log.string
2254 		        (
2255 			        fnd_log.level_error,
2256 			        'ahl.plsql.AHL_PRD_DF_PVT.validate_df_schedules',
2257 			        'Invalid Counter name for associated item instance in schedule record : ' || i
2258 		        );
2259           END IF;
2260        END IF;
2261        CLOSE valid_counter_csr;
2262        -- validate whether counter defined for this MR at FMP level
2263        /*IF(p_df_header_rec.deferral_type = 'MR')THEN
2264           OPEN mr_valid_counter_csr(p_df_schedules_tbl(i).unit_deferral_id,p_df_schedules_tbl(i).counter_id);
2265           FETCH mr_valid_counter_csr INTO l_exists;
2266           IF(mr_valid_counter_csr%NOTFOUND)THEN
2267              FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_SCH_INV_CNT');
2268              FND_MSG_PUB.ADD;
2269           END IF;
2270           CLOSE mr_valid_counter_csr;
2271        END IF;*/
2272 
2273     ELSIF(p_df_schedules_tbl(i).operation_flag = G_OP_DELETE) THEN
2274        -- validate whether record exists for delete
2275        OPEN  valid_df_rec_del_csr(p_df_schedules_tbl(i).unit_threshold_id,p_df_schedules_tbl(i).object_version_number);
2276        FETCH valid_df_rec_del_csr INTO l_exists;
2277        IF(valid_df_rec_del_csr%NOTFOUND) THEN
2278           FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_SCH_REC_MISS');
2279           FND_MSG_PUB.ADD;
2280           IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2281 		      fnd_log.string
2282 		        (
2283 			        fnd_log.level_error,
2284 			        'ahl.plsql.AHL_PRD_DF_PVT.validate_df_schedules',
2285 			        'Record for delete operation not found with keys in schedule record : ' || i
2286 		        );
2287           END IF;
2288        END IF;
2289        CLOSE valid_df_rec_del_csr;
2290     END IF;
2291     END LOOP;
2292 
2293     -- raise expected error
2294      IF(FND_MSG_PUB.count_msg > 0)THEN
2295          RAISE FND_API.G_EXC_ERROR;
2296      END IF;
2297 
2298     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
2299 		fnd_log.string
2300 		(
2301 			fnd_log.level_procedure,
2302 			'ahl.plsql.AHL_PRD_DF_PVT.validate_df_schedules.end',
2303 			'At the end of PLSQL procedure'
2304 		);
2305     END IF;
2306 
2307 END validate_df_schedules;
2308 
2309 PROCEDURE default_unchanged_df_schedules(
2310     p_x_df_schedules_tbl    IN OUT NOCOPY  AHL_PRD_DF_PVT.df_schedules_tbl_type)IS
2311 
2312 CURSOR df_schedules_csr(p_unit_threshold_id IN NUMBER, p_object_version_number IN NUMBER) IS
2313 SELECT unit_deferral_id,counter_id,counter_value,ctr_value_type_code,attribute_category, attribute1,attribute2, attribute3, attribute4,
2314      attribute5, attribute6, attribute7, attribute8, attribute9, attribute10, attribute11,
2315      attribute12, attribute13, attribute14, attribute15
2316 FROM ahl_unit_thresholds
2317 WHERE object_version_number= p_object_version_number
2318 AND unit_threshold_id = p_unit_threshold_id;
2319 
2320 l_df_schedules_rec AHL_PRD_DF_PVT.df_schedules_rec_type;
2321 
2322 BEGIN
2323     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
2324 		fnd_log.string
2325 		(
2326 			fnd_log.level_procedure,
2327 			'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules.begin',
2328 			'At the start of PLSQL procedure'
2329 		);
2330     END IF;
2331 
2332     FOR i IN p_x_df_schedules_tbl.FIRST..p_x_df_schedules_tbl.LAST  LOOP
2333     IF(p_x_df_schedules_tbl(i).operation_flag = G_OP_UPDATE) THEN
2334         OPEN df_schedules_csr(p_x_df_schedules_tbl(i).unit_threshold_id, p_x_df_schedules_tbl(i).object_version_number);
2335         FETCH df_schedules_csr INTO l_df_schedules_rec.unit_deferral_id,l_df_schedules_rec.counter_id,
2336          l_df_schedules_rec.counter_value, l_df_schedules_rec.ctr_value_type_code,
2337          l_df_schedules_rec.attribute_category,l_df_schedules_rec.attribute1,l_df_schedules_rec.attribute2,
2338          l_df_schedules_rec.attribute3, l_df_schedules_rec.attribute4, l_df_schedules_rec.attribute5,
2339          l_df_schedules_rec.attribute6, l_df_schedules_rec.attribute7, l_df_schedules_rec.attribute8,
2340          l_df_schedules_rec.attribute9, l_df_schedules_rec.attribute10, l_df_schedules_rec.attribute11,
2341          l_df_schedules_rec.attribute12, l_df_schedules_rec.attribute13, l_df_schedules_rec.attribute14, l_df_schedules_rec.attribute15;
2342         IF (df_schedules_csr%NOTFOUND) THEN
2343             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_SCH_REC_MISS');
2344             FND_MSG_PUB.ADD;
2345             IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2346 		         fnd_log.string
2347 		         (
2348 			         fnd_log.level_error,
2349 			         'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules',
2350 			         'Missing Deferral Schedule Record : ' || i
2351 		         );
2352             END IF;
2353         ELSE
2354             IF (p_x_df_schedules_tbl(i).unit_deferral_id IS NULL) THEN
2355                 p_x_df_schedules_tbl(i).unit_deferral_id := l_df_schedules_rec.unit_deferral_id;
2356             ELSIF(p_x_df_schedules_tbl(i).unit_deferral_id <> l_df_schedules_rec.unit_deferral_id) THEN
2357                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_SCH_HDR_MISS');
2358                 FND_MSG_PUB.ADD;
2359                 IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
2360 		           fnd_log.string
2361 		            (
2362 			         fnd_log.level_unexpected,
2363 			         'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules',
2364 			         'Unit Deferral ID does not match with deferral schedule record : ' || i
2365 		            );
2366                 END IF;
2367                 CLOSE df_schedules_csr;
2368                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2369             END IF;
2370 
2371             IF (p_x_df_schedules_tbl(i).counter_id IS NULL) THEN
2372                 p_x_df_schedules_tbl(i).counter_id := l_df_schedules_rec.counter_id;
2373             ELSIF(p_x_df_schedules_tbl(i).counter_id = FND_API.G_MISS_NUM) THEN
2374                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_CNT_NAME');
2375                 FND_MESSAGE.Set_Token('COUNTER_NAME',p_x_df_schedules_tbl(i).counter_name);
2376                 IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2377 		            fnd_log.string
2378 		            (
2379 			            fnd_log.level_error,
2380 			            'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules',
2381 			            'Missing counter ID in schedule Record : ' || i
2382 		            );
2383                END IF;
2384             END IF;
2385 
2386             IF (p_x_df_schedules_tbl(i).counter_value IS NULL) THEN
2387                 p_x_df_schedules_tbl(i).counter_value := l_df_schedules_rec.counter_value;
2388             ELSIF(p_x_df_schedules_tbl(i).counter_value = FND_API.G_MISS_NUM OR
2389                   p_x_df_schedules_tbl(i).counter_value <= 0) THEN
2390                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_CNTVAL');
2391                 FND_MESSAGE.Set_Token('COUNTER_NAME',p_x_df_schedules_tbl(i).counter_name);
2392                 FND_MESSAGE.Set_Token('COUNTER_VALUE',p_x_df_schedules_tbl(i).counter_value);
2393                 FND_MSG_PUB.ADD;
2394                 IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2395 		            fnd_log.string
2396 		            (
2397 			            fnd_log.level_error,
2398 			            'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules',
2399 			            'Missing counter Value in schedule Record : ' || i
2400 		            );
2401                END IF;
2402             END IF;
2403 
2404             IF (p_x_df_schedules_tbl(i).ctr_value_type_code IS NULL) THEN
2405                 p_x_df_schedules_tbl(i).ctr_value_type_code := l_df_schedules_rec.ctr_value_type_code;
2406             ELSIF(p_x_df_schedules_tbl(i).ctr_value_type_code NOT IN(G_DEFER_BY,G_DEFER_TO)) THEN
2407                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_CNTVL_TPCD');
2408                 FND_MSG_PUB.ADD;
2409                 IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
2410 		           fnd_log.string
2411 		            (
2412 			         fnd_log.level_unexpected,
2413 			         'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules',
2414 			         'Invalid counter value type code in deferral schedule record : ' || i
2415 		            );
2416                 END IF;
2417                 CLOSE df_schedules_csr;
2418                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2419             END IF;
2420 
2421             IF (p_x_df_schedules_tbl(i).attribute_category IS NULL) THEN
2422                 p_x_df_schedules_tbl(i).attribute_category := l_df_schedules_rec.attribute_category;
2423             ELSIF(p_x_df_schedules_tbl(i).attribute_category = FND_API.G_MISS_CHAR) THEN
2424                 p_x_df_schedules_tbl(i).attribute_category := NULL;
2425             END IF;
2426 
2427             IF (p_x_df_schedules_tbl(i).attribute1 IS NULL) THEN
2428                 p_x_df_schedules_tbl(i).attribute1 := l_df_schedules_rec.attribute1;
2429             ELSIF(p_x_df_schedules_tbl(i).attribute1 = FND_API.G_MISS_CHAR) THEN
2430                 p_x_df_schedules_tbl(i).attribute1 := NULL;
2431             END IF;
2432 
2433             IF (p_x_df_schedules_tbl(i).attribute2 IS NULL) THEN
2434                 p_x_df_schedules_tbl(i).attribute2 := l_df_schedules_rec.attribute2;
2435             ELSIF(p_x_df_schedules_tbl(i).attribute2 = FND_API.G_MISS_CHAR) THEN
2436                 p_x_df_schedules_tbl(i).attribute2 := NULL;
2437             END IF;
2438 
2439             IF (p_x_df_schedules_tbl(i).attribute3 IS NULL) THEN
2440                 p_x_df_schedules_tbl(i).attribute3 := l_df_schedules_rec.attribute3;
2441             ELSIF(p_x_df_schedules_tbl(i).attribute3 = FND_API.G_MISS_CHAR) THEN
2442                 p_x_df_schedules_tbl(i).attribute3 := NULL;
2443             END IF;
2444 
2445             IF (p_x_df_schedules_tbl(i).attribute4 IS NULL) THEN
2446                 p_x_df_schedules_tbl(i).attribute4 := l_df_schedules_rec.attribute4;
2447             ELSIF(p_x_df_schedules_tbl(i).attribute4 = FND_API.G_MISS_CHAR) THEN
2448                 p_x_df_schedules_tbl(i).attribute4 := NULL;
2449             END IF;
2450 
2451             IF (p_x_df_schedules_tbl(i).attribute5 IS NULL) THEN
2452                 p_x_df_schedules_tbl(i).attribute5 := l_df_schedules_rec.attribute5;
2453             ELSIF(p_x_df_schedules_tbl(i).attribute5 = FND_API.G_MISS_CHAR) THEN
2454                 p_x_df_schedules_tbl(i).attribute5 := NULL;
2455             END IF;
2456 
2457             IF (p_x_df_schedules_tbl(i).attribute6 IS NULL) THEN
2458                 p_x_df_schedules_tbl(i).attribute6 := l_df_schedules_rec.attribute6;
2459             ELSIF(p_x_df_schedules_tbl(i).attribute6 = FND_API.G_MISS_CHAR) THEN
2460                 p_x_df_schedules_tbl(i).attribute6 := NULL;
2461             END IF;
2462 
2463             IF (p_x_df_schedules_tbl(i).attribute7 IS NULL) THEN
2464                 p_x_df_schedules_tbl(i).attribute7 := l_df_schedules_rec.attribute7;
2465             ELSIF(p_x_df_schedules_tbl(i).attribute7 = FND_API.G_MISS_CHAR) THEN
2466                 p_x_df_schedules_tbl(i).attribute7 := NULL;
2467             END IF;
2468 
2469             IF (p_x_df_schedules_tbl(i).attribute8 IS NULL) THEN
2470                 p_x_df_schedules_tbl(i).attribute8 := l_df_schedules_rec.attribute8;
2471             ELSIF(p_x_df_schedules_tbl(i).attribute8 = FND_API.G_MISS_CHAR) THEN
2472                 p_x_df_schedules_tbl(i).attribute8 := NULL;
2473             END IF;
2474 
2475             IF (p_x_df_schedules_tbl(i).attribute9 IS NULL) THEN
2476                 p_x_df_schedules_tbl(i).attribute9 := l_df_schedules_rec.attribute9;
2477             ELSIF(p_x_df_schedules_tbl(i).attribute9 = FND_API.G_MISS_CHAR) THEN
2478                 p_x_df_schedules_tbl(i).attribute9 := NULL;
2479             END IF;
2480 
2481             IF (p_x_df_schedules_tbl(i).attribute10 IS NULL) THEN
2482                 p_x_df_schedules_tbl(i).attribute10 := l_df_schedules_rec.attribute10;
2483             ELSIF(p_x_df_schedules_tbl(i).attribute10 = FND_API.G_MISS_CHAR) THEN
2484                 p_x_df_schedules_tbl(i).attribute10 := NULL;
2485             END IF;
2486 
2487             IF (p_x_df_schedules_tbl(i).attribute11 IS NULL) THEN
2488                 p_x_df_schedules_tbl(i).attribute11 := l_df_schedules_rec.attribute11;
2489             ELSIF(p_x_df_schedules_tbl(i).attribute11 = FND_API.G_MISS_CHAR) THEN
2490                 p_x_df_schedules_tbl(i).attribute11 := NULL;
2491             END IF;
2492 
2493             IF (p_x_df_schedules_tbl(i).attribute12 IS NULL) THEN
2494                 p_x_df_schedules_tbl(i).attribute12 := l_df_schedules_rec.attribute12;
2495             ELSIF(p_x_df_schedules_tbl(i).attribute12 = FND_API.G_MISS_CHAR) THEN
2496                 p_x_df_schedules_tbl(i).attribute12 := NULL;
2497             END IF;
2498 
2499             IF (p_x_df_schedules_tbl(i).attribute13 IS NULL) THEN
2500                 p_x_df_schedules_tbl(i).attribute13 := l_df_schedules_rec.attribute13;
2501             ELSIF(p_x_df_schedules_tbl(i).attribute13 = FND_API.G_MISS_CHAR) THEN
2502                 p_x_df_schedules_tbl(i).attribute13 := NULL;
2503             END IF;
2504 
2505             IF (p_x_df_schedules_tbl(i).attribute14 IS NULL) THEN
2506                 p_x_df_schedules_tbl(i).attribute14 := l_df_schedules_rec.attribute14;
2507             ELSIF(p_x_df_schedules_tbl(i).attribute14 = FND_API.G_MISS_CHAR) THEN
2508                 p_x_df_schedules_tbl(i).attribute14 := NULL;
2509             END IF;
2510 
2511             IF (p_x_df_schedules_tbl(i).attribute15 IS NULL) THEN
2512                 p_x_df_schedules_tbl(i).attribute15 := l_df_schedules_rec.attribute15;
2513             ELSIF(p_x_df_schedules_tbl(i).attribute15 = FND_API.G_MISS_CHAR) THEN
2514                 p_x_df_schedules_tbl(i).attribute15 := NULL;
2515             END IF;
2516 
2517         END IF;
2518         CLOSE df_schedules_csr;
2519     ELSIF (p_x_df_schedules_tbl(i).operation_flag = G_OP_CREATE) THEN
2520 
2521         IF (p_x_df_schedules_tbl(i).unit_deferral_id IS NULL OR
2522             p_x_df_schedules_tbl(i).unit_deferral_id = FND_API.G_MISS_NUM) THEN
2523             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_UDID');
2524             FND_MSG_PUB.ADD;
2525             IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
2526 		        fnd_log.string
2527 		        (
2528 			      fnd_log.level_unexpected,
2529 			      'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules',
2530 			      'Missing Unit Deferral ID for create operation in deferral schedule record : ' || i
2531 		        );
2532             END IF;
2533             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2534         END IF;
2535 
2536         IF (p_x_df_schedules_tbl(i).counter_id IS NULL OR
2537             p_x_df_schedules_tbl(i).counter_id = FND_API.G_MISS_NUM) THEN
2538             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_CNT_NAME');
2539             FND_MESSAGE.Set_Token('COUNTER_NAME',p_x_df_schedules_tbl(i).counter_name);
2540             FND_MSG_PUB.ADD;
2541             IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2542 		        fnd_log.string
2543 		        (
2544 			         fnd_log.level_error,
2545 			         'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules',
2546 			         'Missing counter ID in schedule Record : ' || i
2547 		        );
2548            END IF;
2549         END IF;
2550 
2551         IF (p_x_df_schedules_tbl(i).counter_value IS NULL OR
2552             p_x_df_schedules_tbl(i).counter_value = FND_API.G_MISS_NUM OR
2553             p_x_df_schedules_tbl(i).counter_value <= 0 ) THEN
2554             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_CNTVAL');
2555             FND_MESSAGE.Set_Token('COUNTER_NAME',p_x_df_schedules_tbl(i).counter_name);
2556             FND_MESSAGE.Set_Token('COUNTER_VALUE',p_x_df_schedules_tbl(i).counter_value);
2557             FND_MSG_PUB.ADD;
2558             IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2559 		        fnd_log.string
2560 		        (
2561 			         fnd_log.level_error,
2562 			         'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules',
2563 			         'Missing or invalid counter Value in schedule Record : ' || i
2564 		        );
2565            END IF;
2566         END IF;
2567 
2568         IF (p_x_df_schedules_tbl(i).ctr_value_type_code IS NULL OR
2569             p_x_df_schedules_tbl(i).ctr_value_type_code NOT IN(G_DEFER_BY,G_DEFER_TO)) THEN
2570             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_CNTVL_TPCD');
2571             FND_MSG_PUB.ADD;
2572             IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
2573 		        fnd_log.string
2574 		        (
2575 			       fnd_log.level_unexpected,
2576 			       'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules',
2577 			       'Invalid counter value type code in deferral schedule record : ' || i
2578 		        );
2579             END IF;
2580             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2581         END IF;
2582 
2583         IF (p_x_df_schedules_tbl(i).attribute_category = FND_API.G_MISS_CHAR) THEN
2584             p_x_df_schedules_tbl(i).attribute_category := NULL;
2585         END IF;
2586 
2587         IF (p_x_df_schedules_tbl(i).attribute1 = FND_API.G_MISS_CHAR) THEN
2588             p_x_df_schedules_tbl(i).attribute1 := NULL;
2589         END IF;
2590 
2591         IF (p_x_df_schedules_tbl(i).attribute2 = FND_API.G_MISS_CHAR) THEN
2592             p_x_df_schedules_tbl(i).attribute2 := NULL;
2593         END IF;
2594 
2595         IF (p_x_df_schedules_tbl(i).attribute3 = FND_API.G_MISS_CHAR) THEN
2596             p_x_df_schedules_tbl(i).attribute3 := NULL;
2597         END IF;
2598 
2599         IF (p_x_df_schedules_tbl(i).attribute4 = FND_API.G_MISS_CHAR) THEN
2600             p_x_df_schedules_tbl(i).attribute4 := NULL;
2601         END IF;
2602 
2603         IF (p_x_df_schedules_tbl(i).attribute5 = FND_API.G_MISS_CHAR) THEN
2604             p_x_df_schedules_tbl(i).attribute5 := NULL;
2605         END IF;
2606 
2607         IF (p_x_df_schedules_tbl(i).attribute6 = FND_API.G_MISS_CHAR) THEN
2608             p_x_df_schedules_tbl(i).attribute6 := NULL;
2609         END IF;
2610 
2611         IF (p_x_df_schedules_tbl(i).attribute7 = FND_API.G_MISS_CHAR) THEN
2612             p_x_df_schedules_tbl(i).attribute7 := NULL;
2613         END IF;
2614 
2615         IF (p_x_df_schedules_tbl(i).attribute8 = FND_API.G_MISS_CHAR) THEN
2616             p_x_df_schedules_tbl(i).attribute8 := NULL;
2617         END IF;
2618 
2619         IF (p_x_df_schedules_tbl(i).attribute9 = FND_API.G_MISS_CHAR) THEN
2620             p_x_df_schedules_tbl(i).attribute9 := NULL;
2621         END IF;
2622 
2623         IF (p_x_df_schedules_tbl(i).attribute10 = FND_API.G_MISS_CHAR) THEN
2624             p_x_df_schedules_tbl(i).attribute10 := NULL;
2625         END IF;
2626 
2627         IF (p_x_df_schedules_tbl(i).attribute11 = FND_API.G_MISS_CHAR) THEN
2628             p_x_df_schedules_tbl(i).attribute11 := NULL;
2629         END IF;
2630 
2631         IF (p_x_df_schedules_tbl(i).attribute12 = FND_API.G_MISS_CHAR) THEN
2632             p_x_df_schedules_tbl(i).attribute12 := NULL;
2633         END IF;
2634 
2635         IF (p_x_df_schedules_tbl(i).attribute13 = FND_API.G_MISS_CHAR) THEN
2636             p_x_df_schedules_tbl(i).attribute13 := NULL;
2637         END IF;
2638 
2639         IF (p_x_df_schedules_tbl(i).attribute14 = FND_API.G_MISS_CHAR) THEN
2640             p_x_df_schedules_tbl(i).attribute14 := NULL;
2641         END IF;
2642 
2643         IF (p_x_df_schedules_tbl(i).attribute15 = FND_API.G_MISS_CHAR) THEN
2644             p_x_df_schedules_tbl(i).attribute15 := NULL;
2645         END IF;
2646 
2647     END IF;
2648     END LOOP;
2649 
2650     -- raise expected error
2651     IF(FND_MSG_PUB.count_msg > 0)THEN
2652          RAISE FND_API.G_EXC_ERROR;
2653     END IF;
2654 
2655     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
2656 		fnd_log.string
2657 		(
2658 			fnd_log.level_procedure,
2659 			'ahl.plsql.AHL_PRD_DF_PVT.default_unchanged_df_schedules.end',
2660 			'At the end of PLSQL procedure'
2661 		);
2662     END IF;
2663 
2664 END default_unchanged_df_schedules;
2665 --------------------------------------------------------------------------------
2666 -- Validate deferral record as a whole
2667 --------------------------------------------------------------------------------
2668 
2669 PROCEDURE validate_deferral_updates(
2670     p_df_header_rec       IN             AHL_PRD_DF_PVT.df_header_rec_type,
2671     x_warning_msg_data            OUT NOCOPY VARCHAR2)IS
2672 
2673     l_count1 NUMBER;
2674     l_count2 NUMBER;
2675 
2676     CURSOR counter_values_csr(p_unit_deferral_id IN NUMBER) IS
2677     SELECT UT.counter_id, CO.name, UT.counter_value, UT.ctr_value_type_code,CO.uom_code
2678     FROM CS_COUNTERS CO,ahl_unit_thresholds UT
2679     WHERE CO.counter_id = UT.counter_id
2680     AND UT.unit_deferral_id = p_unit_deferral_id;
2681 
2682     l_counter_id NUMBER;
2683     l_counter_name VARCHAR2(30);
2684     l_uom_code VARCHAR2(3);
2685     l_counter_value NUMBER;
2686     l_ctr_value_type_code VARCHAR2(30);
2687     i NUMBER := 0;
2688     l_defer_due_date DATE;
2689     l_calc_due_date_flag BOOLEAN := false;
2690     l_current_counter_value NUMBER := 0;
2691 
2692     l_return_status  VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
2693     l_msg_data       VARCHAR2(4000);
2694     l_msg_count      NUMBER;
2695 
2696     CURSOR curr_counter_val_csr(p_unit_deferral_id IN NUMBER, p_counter_id IN NUMBER,p_deferral_effective_on IN DATE) IS
2697     /* Modified to fix bug# 8328818: ignore disabled counter readings.
2698     SELECT NVL(net_reading, 0) FROM cs_ctr_counter_values_v ctrread, cs_counter_groups_v ctrgrp,
2699     --                                AHL_UNIT_EFFECTIVITIES_APP_V UE,AHL_UNIT_DEFERRALS_B UD
2700                                     AHL_UNIT_EFFECTIVITIES_B UE,AHL_UNIT_DEFERRALS_B UD -- Undid app usage related blind changes
2701     WHERE ctrread.VALUE_TIMESTAMP <= p_deferral_effective_on
2702     AND ctrread.counter_group_id = ctrgrp.counter_group_id
2703     AND SOURCE_OBJECT_CODE = 'CP'
2704     AND SOURCE_OBJECT_ID = UE.csi_item_instance_id
2705     AND ctrread.counter_id = p_counter_id
2706     AND UE.unit_effectivity_id = UD.unit_effectivity_id
2707     AND UD.unit_deferral_id = p_unit_deferral_id
2708     ORDER BY ctrread.counter_id asc, ctrread.VALUE_TIMESTAMP desc;
2709     */
2710 
2711     -- Fix for bug# 8328818: ignore disabled counter readings.
2712     -- rewrote above query as we do not need AHL_UNIT_EFFECTIVITIES_B,
2713     -- cs_counter_groups_v, AHL_UNIT_DEFERRALS_B tables.
2714     SELECT * FROM (
2715                    SELECT CCR.NET_READING
2716                    FROM CSI_COUNTER_READINGS CCR
2717                    WHERE CCR.COUNTER_ID = P_COUNTER_ID
2718                      AND nvl(CCR.disabled_flag,'N') = 'N'
2719                      AND CCR.VALUE_TIMESTAMP <= p_deferral_effective_on
2720                    ORDER BY CCR.VALUE_TIMESTAMP DESC
2721                   )
2722     WHERE rownum < 2;
2723 
2724     l_counter_values_tbl AHL_UMP_PROCESSUNIT_PVT.counter_values_tbl_type;
2725 
2726     CURSOR whichever_first_code_csr (p_unit_effectivity_id IN NUMBER) IS
2727     SELECT whichever_first_code
2728     --FROM AHL_MR_HEADERS_APP_V MR, AHL_UNIT_EFFECTIVITIES_APP_V UE
2729     FROM AHL_MR_HEADERS_B MR, AHL_UNIT_EFFECTIVITIES_B UE -- Undid blind changes for app_usage code
2730     WHERE MR.mr_header_id = UE.mr_header_id
2731     AND UE.unit_effectivity_id = p_unit_effectivity_id;
2732 
2733     l_whichever_first_code ahl_mr_headers_b.whichever_first_code%TYPE;
2734 
2735 
2736     CURSOR next_due_date_csr(p_unit_effectivity_id IN NUMBER) IS
2737     SELECT UE.due_date
2738     FROM AHL_UNIT_EFFECTIVITIES_B UE
2739     WHERE UE.mr_header_id = (
2740     SELECT mr_header_id FROM AHL_UNIT_EFFECTIVITIES_B where unit_effectivity_id = p_unit_effectivity_id)
2741     AND UE.csi_item_instance_id = (
2742     SELECT csi_item_instance_id FROM AHL_UNIT_EFFECTIVITIES_B where unit_effectivity_id = p_unit_effectivity_id)
2743     AND UE.unit_effectivity_id <> p_unit_effectivity_id
2744     AND ( UE.status_code IS NULL OR UE.status_code = 'INIT-DUE')
2745     ORDER BY DUE_DATE ASC;
2746 
2747     l_next_due_date DATE;
2748 
2749     -- JKJain, NR Analysis and Forecasting
2750     CURSOR get_csi_item_instance_id(c_unit_effectivity_id IN NUMBER) IS
2751     SELECT CSI_ITEM_INSTANCE_ID
2752     FROM AHL_UNIT_EFFECTIVITIES_B
2753     WHERE unit_effectivity_id = c_unit_effectivity_id;
2754     l_fleet_header_id NUMBER;
2755     l_csi_item_inst_id NUMBER;
2756     l_uc_header_id NUMBER;
2757 
2758 
2759 BEGIN
2760     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
2761 		fnd_log.string
2762 		(
2763 			fnd_log.level_procedure,
2764 			'ahl.plsql.AHL_PRD_DF_PVT.validate_deferral_updates.begin',
2765 			'At the start of PLSQL procedure'
2766 		);
2767     END IF;
2768 
2769     -- df schedule validity for the the unit_deferral_id.
2770     SELECT count(*) INTO l_count1 from (SELECT counter_id FROM ahl_unit_thresholds
2771                                         WHERE unit_deferral_id = p_df_header_rec.unit_deferral_id);
2772 
2773     SELECT count(*) INTO l_count2 from (SELECT DISTINCT counter_id FROM ahl_unit_thresholds
2774                                         WHERE unit_deferral_id = p_df_header_rec.unit_deferral_id);
2775     IF(l_count1 <> l_count2) THEN
2776        FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_CNT_NAME_REP');
2777        FND_MSG_PUB.ADD;
2778        IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2779 		   fnd_log.string
2780 		   (
2781 			   fnd_log.level_error,
2782 			   'ahl.plsql.AHL_PRD_DF_PVT.validate_deferral_updates',
2783 			   'Counters are repeating in schedules'
2784 		   );
2785        END IF;
2786     END IF;
2787 
2788     IF(l_count2 = 0)THEN
2789       IF(p_df_header_rec.set_due_date IS NULL)THEN
2790          FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_SET_DUE_MAND');
2791          FND_MSG_PUB.ADD;
2792          IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2793 		     fnd_log.string
2794 		     (
2795 			        fnd_log.level_error,
2796 			        'ahl.plsql.AHL_PRD_DF_PVT.validate_deferral_updates',
2797 			        'Set due date or counter values are mandatory '
2798 		    );
2799         END IF;
2800       ELSE
2801          l_defer_due_date := p_df_header_rec.set_due_date;
2802       END IF;
2803     ELSE
2804       l_calc_due_date_flag := true;
2805       IF(p_df_header_rec.deferral_effective_on IS NULL OR p_df_header_rec.deferral_effective_on > SYSDATE)THEN
2806          FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_DF_EFF_DT');
2807          FND_MESSAGE.Set_Token('DEFERRAL_EFFECTIVE_ON',p_df_header_rec.deferral_effective_on);
2808          FND_MSG_PUB.ADD;
2809          IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2810 		     fnd_log.string
2811 		     (
2812 			        fnd_log.level_error,
2813 			        'ahl.plsql.AHL_PRD_DF_PVT.validate_deferral_updates',
2814 			        'Deferral Effective On Date can not be null or greater than system date '
2815 		     );
2816         END IF;
2817       END IF;
2818     END IF;
2819 
2820     IF(FND_MSG_PUB.count_msg > 0)THEN
2821         RAISE FND_API.G_EXC_ERROR;
2822     END IF;
2823 
2824     IF(l_calc_due_date_flag)THEN
2825        -- validate counter values and populate table of counter, values to calculate due date
2826        OPEN counter_values_csr(p_df_header_rec.unit_deferral_id);
2827        LOOP
2828           FETCH counter_values_csr INTO l_counter_id,l_counter_name,
2829                                            l_counter_value,l_ctr_value_type_code,
2830                                            l_uom_code;
2831           IF(counter_values_csr%NOTFOUND) THEN
2832              EXIT;
2833           END IF;
2834           OPEN curr_counter_val_csr(p_df_header_rec.unit_deferral_id,l_counter_id,p_df_header_rec.deferral_effective_on);
2835           FETCH curr_counter_val_csr INTO l_current_counter_value;
2836           IF(curr_counter_val_csr%NOTFOUND) THEN
2837             l_current_counter_value := 0;
2838           END IF;
2839           CLOSE curr_counter_val_csr;
2840           IF(l_ctr_value_type_code = G_DEFER_BY) THEN
2841              l_counter_value := l_current_counter_value + l_counter_value;
2842           ELSE
2843              IF(l_counter_value < l_current_counter_value) THEN
2844                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_LS_CNTVAL');
2845                 FND_MESSAGE.Set_Token('COUNTER_NAME',l_counter_name);
2846                 FND_MESSAGE.Set_Token('COUNTER_VALUE',l_counter_value);
2847                 FND_MSG_PUB.ADD;
2848                 IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
2849 		            fnd_log.string
2850 		            (
2851 			            fnd_log.level_error,
2852 			            'ahl.plsql.AHL_PRD_DF_PVT.validate_deferral_updates',
2853 			            'Defer to counter value is less than current counter value for counter name : ' || l_counter_name
2854 		            );
2855                 END IF;
2856              END IF;
2857           END IF;
2858           l_counter_values_tbl(i).counter_id    := l_counter_id;
2859           l_counter_values_tbl(i).counter_name  := l_counter_name;
2860           l_counter_values_tbl(i).counter_value := l_counter_value;
2861           l_counter_values_tbl(i).uom_code      := l_uom_code;
2862           i := i + 1;
2863        END LOOP;
2864        CLOSE counter_values_csr;
2865        -- throw errors if any here and do not proceed.
2866        IF(FND_MSG_PUB.count_msg > 0)THEN
2867         RAISE FND_API.G_EXC_ERROR;
2868        END IF;
2869 
2870        IF((p_df_header_rec.deferral_type = G_DEFERRAL_TYPE_MR) AND
2871           (p_df_header_rec.mr_repetitive_flag = G_YES_FLAG)) THEN
2872           -- make a call to calculate due date with the table if mr is repetitive
2873           AHL_UMP_PROCESSUNIT_PVT.Get_Deferred_Due_Date (
2874                                  p_unit_effectivity_id    => p_df_header_rec.unit_effectivity_id,
2875                                  p_deferral_threshold_tbl => l_counter_values_tbl,
2876                                  x_due_date               => l_defer_due_date,
2877                                  x_return_status          => l_return_status ,
2878                                  x_msg_data               => l_msg_data,
2879                                  x_msg_count              => l_msg_count);
2880           IF(l_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
2881              FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_DUE_DT_CALC_ERR');
2882              FND_MSG_PUB.ADD;
2883              IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
2884 		         fnd_log.string
2885 		         (
2886 			            fnd_log.level_unexpected,
2887 			            'ahl.plsql.AHL_PRD_DF_PVT.validate_deferral_updates',
2888 			            'Calculate Due Date API threw Error'
2889 		         );
2890              END IF;
2891              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2892           END IF;
2893           IF(l_defer_due_date IS NOT NULL)THEN
2894             -- read whicever comes first or last code
2895             OPEN whichever_first_code_csr(p_df_header_rec.unit_effectivity_id);
2896             FETCH whichever_first_code_csr INTO l_whichever_first_code;
2897             IF(whichever_first_code_csr%NOTFOUND)THEN
2898                 l_whichever_first_code := 'FIRST';
2899             END IF;
2900             CLOSE whichever_first_code_csr;
2901 
2902             IF(l_whichever_first_code = 'FIRST') THEN
2903                 IF(TRUNC(p_df_header_rec.set_due_date) < TRUNC(l_defer_due_date)) THEN
2904                     l_defer_due_date := p_df_header_rec.set_due_date;
2905                 END IF;
2906             ELSE
2907                 IF(TRUNC(p_df_header_rec.set_due_date) > TRUNC(l_defer_due_date)) THEN
2908                 l_defer_due_date := p_df_header_rec.set_due_date;
2909                 END IF;
2910             END IF;
2911             -- read next due date if available
2912             OPEN next_due_date_csr(p_df_header_rec.unit_effectivity_id);
2913             FETCH next_due_date_csr INTO l_next_due_date;
2914             IF(next_due_date_csr%NOTFOUND)THEN
2915                 NULL;-- thorw warning here
2916             ELSIF( TRUNC(l_next_due_date) < TRUNC(l_defer_due_date))THEN
2917                 FND_MESSAGE.SET_NAME(G_APP_NAME, 'AHL_PRD_DF_DUE_DATE_WARN');
2918                 FND_MESSAGE.SET_TOKEN('DEFER_DUE_DATE',l_defer_due_date,false);
2919                 FND_MESSAGE.SET_TOKEN('NEXT_DUE_DATE',l_next_due_date,false);
2920                 l_msg_data := FND_MESSAGE.get;
2921             END IF;
2922             CLOSE next_due_date_csr;
2923           END IF;
2924 
2925        END IF;
2926     END IF;
2927     -- add validations here if needed in future
2928     -- throw errors if any
2929 
2930     -- JKJain, NR Analysis and Forecasting
2931     IF(l_defer_due_date IS NOT NULL) THEN
2932         l_fleet_header_id := get_fleet_from_effectivity(p_df_header_rec.unit_effectivity_id);
2933         IF(l_fleet_header_id IS NOT NULL) THEN
2934             OPEN get_csi_item_instance_id(p_df_header_rec.unit_effectivity_id);
2935             FETCH get_csi_item_instance_id INTO l_csi_item_inst_id;
2936             CLOSE get_csi_item_instance_id;
2937             l_uc_header_id := AHL_UTIL_UC_PKG.get_uc_header_id(l_csi_item_inst_id);
2938             IF(l_fleet_header_id <> nvl(AHL_UMP_ProcessUnit_PVT.get_fleet_from_unit_asso(l_uc_header_id,l_defer_due_date,null),-1)) THEN
2939             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_FLT_ASSO');
2940             FND_MSG_PUB.ADD;
2941             END IF;
2942         END IF;
2943     END IF;
2944 
2945     IF(FND_MSG_PUB.count_msg > 0)THEN
2946         RAISE FND_API.G_EXC_ERROR;
2947     END IF;
2948 
2949     x_warning_msg_data := l_msg_data;
2950 
2951     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
2952 		fnd_log.string
2953 		(
2954 			fnd_log.level_procedure,
2955 			'ahl.plsql.AHL_PRD_DF_PVT.validate_deferral_updates.end',
2956 			'At the end of PLSQL procedure'
2957 		);
2958     END IF;
2959 
2960 END validate_deferral_updates;
2961 
2962 PROCEDURE submit_for_approval(
2963     p_df_header_rec       IN             AHL_PRD_DF_PVT.df_header_rec_type)IS
2964 
2965     l_object                VARCHAR2(30):= G_WORKFLOW_OBJECT_KEY;
2966     l_approval_type         VARCHAR2(100):='CONCEPT';
2967     l_active                VARCHAR2(50):= 'N';
2968     l_process_name          VARCHAR2(50);
2969     l_item_type             VARCHAR2(50);
2970     l_return_status         VARCHAR2(50) := FND_API.G_RET_STS_SUCCESS;
2971     l_msg_count             NUMBER;
2972     l_msg_data              VARCHAR2(2000);
2973 
2974     l_new_status_code   VARCHAR2(30);
2975 
2976     l_mr_applicable VARCHAR2(1);
2977     l_active_end_date DATE;
2978     l_new_mr_header_id NUMBER;
2979     l_new_mr_applicable VARCHAR2(1);
2980     l_mr_expired VARCHAR2(3);
2981     l_mr_header_id NUMBER;
2982 
2983 BEGIN
2984     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
2985 		fnd_log.string
2986 		(
2987 			fnd_log.level_procedure,
2988 			'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval.begin',
2989 			'At the start of PLSQL procedure'
2990 		);
2991     END IF;
2992 
2993     IF(p_df_header_rec.approval_status_code NOT IN('DRAFT','DEFERRAL_REJECTED'))THEN
2994        FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_SUB_APPR_STS');
2995        FND_MSG_PUB.ADD;
2996        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
2997            fnd_log.string
2998 	       (
2999               fnd_log.level_unexpected,
3000 			  'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3001 		      'Can not submit for approval because current status is : ' || p_df_header_rec.approval_status_code
3002            );
3003        END IF;
3004        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3005     END IF;
3006 
3007     IF(valid_for_submission( p_df_header_rec.unit_effectivity_id) = FALSE)THEN
3008        FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_SUB_PRC_STS');
3009        FND_MSG_PUB.ADD;
3010        IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
3011 		   fnd_log.string
3012 		   (
3013 			  fnd_log.level_error,
3014 			  'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3015 			  'Can not submit for approval because a parent or child is in pending deferral approval status'
3016 		   );
3017        END IF;
3018        RAISE FND_API.G_EXC_ERROR;
3019     END IF;
3020 
3021     -- Skip for UMP Deferral
3022     IF NOT(is_ump_deferral(p_df_header_rec.unit_deferral_id)) THEN
3023 
3024        AHL_PRD_WORKORDER_PVT.validate_dependencies
3025        (
3026            p_api_version         => 1.0,
3027            p_init_msg_list       => FND_API.G_TRUE,
3028            p_commit              => FND_API.G_FALSE,
3029            p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
3030            p_default             => FND_API.G_FALSE,
3031            p_module_type         => NULL,
3032            x_return_status       =>l_return_status,
3033            x_msg_count           =>l_msg_count,
3034            x_msg_data            =>l_msg_data,
3035            p_visit_id            => NULL,
3036            p_unit_effectivity_id =>p_df_header_rec.unit_effectivity_id,
3037            p_workorder_id        => NULL
3038        );
3039     -- if workorders under UE has external dependencies, dont submit for approval, raise error.
3040        IF(l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3041           IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
3042 		   fnd_log.string
3043 		      (
3044 			    fnd_log.level_error,
3045 			    'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3046 			    'Can not go ahead with aubmission of approval because Workorder dependencies exists'
3047 		      );
3048           END IF;
3049           RAISE FND_API.G_EXC_ERROR;
3050        END IF; -- l_return_status
3051     END IF; -- is_ump_deferral.
3052 
3053     ahl_utility_pvt.get_wf_process_name(
3054                                     p_object       =>l_object,
3055                                     x_active       =>l_active,
3056                                     x_process_name =>l_process_name ,
3057                                     x_item_type    =>l_item_type,
3058                                     x_return_status=>l_return_status,
3059                                     x_msg_count    =>l_msg_count,
3060                                     x_msg_data     =>l_msg_data);
3061     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
3062 		   fnd_log.string
3063 		   (
3064 			    fnd_log.level_statement,
3065 			    'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3066 			    'Workflow active flag : ' || l_active
3067 		   );
3068            fnd_log.string
3069 		   (
3070 			    fnd_log.level_statement,
3071 			    'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3072 			    'l_process_name : ' || l_process_name
3073 		   );
3074            fnd_log.string
3075 		   (
3076 			    fnd_log.level_statement,
3077 			    'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3078 			    'l_item_type : ' || l_item_type
3079 		   );
3080 
3081     END IF;
3082 
3083     IF((l_return_status <> FND_API.G_RET_STS_SUCCESS) OR
3084        ( l_active <> G_YES_FLAG))THEN
3085        /*FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_WF_INACTIVE');
3086        FND_MSG_PUB.ADD;
3087        IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
3088 		   fnd_log.string
3089 		      (
3090 			    fnd_log.level_error,
3091 			    'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3092 			    'Can not submit for approval because workflow is not active for Deferral'
3093 		      );
3094        END IF;
3095        RAISE FND_API.G_EXC_ERROR;*/
3096        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
3097 		   fnd_log.string
3098 		      (
3099 			    fnd_log.level_statement,
3100 			    'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3101 			    'Workflow is not active so going for automatic approval'
3102 		      );
3103        END IF;
3104        l_active := G_NO_FLAG;
3105     END IF;
3106 
3107     -- make a call to update job status to pending deferral approval and update approval status
3108     AHL_PRD_DF_PVT.process_approval_initiated(
3109                          p_unit_deferral_id      => p_df_header_rec.unit_deferral_id,
3110                          p_object_version_number => p_df_header_rec.object_version_number,
3111                          p_new_status            => 'DEFERRAL_PENDING',
3112                          x_return_status         => l_return_status);
3113 
3114 
3115     IF(l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3116        IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
3117 		   fnd_log.string
3118 		      (
3119 			    fnd_log.level_error,
3120 			    'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3121 			    'Can not go ahead with approval because AHL_PRD_DF_PVT.process_approval_initiated threw error'
3122 		      );
3123        END IF;
3124        RAISE FND_API.G_EXC_ERROR;
3125     END IF;
3126 
3127     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
3128 		   fnd_log.string
3129 		   (
3130 			    fnd_log.level_statement,
3131 			    'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3132 			    'Workflow active flag : ' || l_active
3133 		   );
3134     END IF;
3135 
3136     l_mr_expired := FND_API.G_FALSE;
3137     SELECT mr_header_id INTO l_mr_header_id FROM ahl_unit_effectivities_b
3138     WHERE unit_effectivity_id = p_df_header_rec.unit_effectivity_id;
3139     IF(l_mr_header_id IS NOT NULL)THEN
3140          -- find whether deferral type is MR or SR
3141          -- if MR find whether active else pluggin new mr
3142          -- if SR, find the same for immediate children if any and repeat it for them
3143           AHL_PRD_DF_PVT.get_mr_termination_details(
3144           p_unit_effectivity_id   => p_df_header_rec.unit_effectivity_id,
3145             x_mr_applicable         => l_mr_applicable,
3146             x_active_end_date      => l_active_end_date,
3147             x_new_mr_header_id     => l_new_mr_header_id,
3148             x_new_mr_applicable    => l_new_mr_applicable,
3149             x_return_status        => l_return_status,
3150             x_msg_count            => l_msg_count,
3151             x_msg_data             => l_msg_data);
3152           IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) 	THEN
3153              RAISE FND_API.G_EXC_ERROR;
3154           ELSIF (l_mr_applicable = FND_API.G_FALSE AND l_new_mr_applicable = FND_API.G_FALSE)THEN
3155               l_mr_expired := FND_API.G_TRUE;
3156           END IF;
3157     END IF;
3158     IF(p_df_header_rec.skip_mr_flag = G_YES_FLAG AND p_df_header_rec.manually_planned_flag = G_NO_FLAG
3159        AND l_mr_expired = FND_API.G_TRUE)THEN
3160        l_new_status_code := 'MR-TERMINATE';
3161     ELSIF(p_df_header_rec.skip_mr_flag = G_YES_FLAG AND p_df_header_rec.manually_planned_flag = G_NO_FLAG)THEN
3162        l_new_status_code := 'TERMINATED';
3163     /*ELSIF(p_df_header_rec.skip_mr_flag = G_YES_FLAG AND p_df_header_rec.manually_planned_flag = G_YES_FLAG)THEN
3164        l_new_status_code := 'CANCELLED';*/
3165     ELSIF(p_df_header_rec.cancel_flag = G_YES_FLAG)THEN
3166        l_new_status_code := 'CANCELLED';
3167     ELSE
3168        l_new_status_code := 'DEFERRED';
3169     END IF;
3170 
3171     IF(l_active <> G_NO_FLAG)THEN
3172        Ahl_generic_aprv_pvt.Start_Wf_Process(
3173                          P_OBJECT                => l_object,
3174                          P_APPROVAL_TYPE         => 'CONCEPT',
3175                          P_ACTIVITY_ID           => p_df_header_rec.unit_deferral_id,--unit_deferral_id
3176                          P_OBJECT_VERSION_NUMBER => p_df_header_rec.object_version_number,
3177                          P_ORIG_STATUS_CODE      => p_df_header_rec.approval_status_code,
3178                          P_NEW_STATUS_CODE       => l_new_status_code ,
3179                          P_REJECT_STATUS_CODE    => 'DEFERRAL_REJECTED',
3180                          P_REQUESTER_USERID      => fnd_global.user_id,--1003259,--
3181                          P_NOTES_FROM_REQUESTER  => '',
3182                          P_WORKFLOWPROCESS       => 'AHL_GEN_APPROVAL',
3183                          P_ITEM_TYPE             => 'AHLGAPP');
3184     ELSE
3185       -- make a call for automatic approval
3186       AHL_PRD_DF_PVT.process_approval_approved(
3187                          p_unit_deferral_id      => p_df_header_rec.unit_deferral_id,
3188                          p_object_version_number => p_df_header_rec.object_version_number,
3189                          p_new_status            => l_new_status_code,
3190                          x_return_status         => l_return_status);
3191       IF(l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3192        IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
3193 		   fnd_log.string
3194 		      (
3195 			    fnd_log.level_error,
3196 			    'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval',
3197 			    'Can not go ahead with automatic approval because AHL_PRD_DF_PVT.process_approval_approved threw error'
3198 		      );
3199        END IF;
3200        RAISE FND_API.G_EXC_ERROR;
3201       END IF;
3202     END IF;
3203 
3204     -- throw errors if any
3205     IF(FND_MSG_PUB.count_msg > 0)THEN
3206         RAISE FND_API.G_EXC_ERROR;
3207     END IF;
3208 
3209 
3210     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
3211 		fnd_log.string
3212 		(
3213 			fnd_log.level_procedure,
3214 			'ahl.plsql.AHL_PRD_DF_PVT.submit_for_approval.end',
3215 			'At the end of PLSQL procedure'
3216 		);
3217     END IF;
3218 
3219 END submit_for_approval;
3220 
3221 -------------------------------------------------------------------------
3222 FUNCTION valid_for_submission(
3223     p_unit_effectivity_id IN             NUMBER) RETURN BOOLEAN IS
3224 
3225 
3226     CURSOR status_code_csr(p_unit_effectivity_id IN NUMBER)IS
3227     SELECT approval_status_code FROM ahl_unit_deferrals_b
3228     WHERE  unit_effectivity_id = p_unit_effectivity_id
3229     UNION
3230     SELECT approval_status_code FROM ahl_unit_deferrals_b
3231     WHERE unit_effectivity_id IN
3232        (
3233 
3234          /*SELECT     ue_id
3235          FROM       AHL_UE_RELATIONSHIPS
3236          WHERE      relationship_code = 'PARENT'
3237          START WITH related_ue_id = p_unit_effectivity_id
3238          CONNECT BY related_ue_id = PRIOR ue_id
3239          UNION*/--parents are taken care of by now
3240          SELECT    distinct related_ue_id
3241          FROM       AHL_UE_RELATIONSHIPS
3242          WHERE      relationship_code = 'PARENT'
3243          START WITH ue_id = p_unit_effectivity_id
3244          CONNECT BY ue_id = PRIOR related_ue_id
3245        );
3246 
3247     l_approval_status_code VARCHAR2(30);
3248 
3249 
3250 BEGIN
3251 
3252     OPEN status_code_csr(p_unit_effectivity_id);
3253     LOOP
3254         FETCH status_code_csr INTO l_approval_status_code;
3255         IF(l_approval_status_code = 'DEFERRAL_PENDING')THEN
3256            CLOSE status_code_csr;
3257            RETURN FALSE;
3258         END IF;
3259     EXIT WHEN status_code_csr%NOTFOUND;
3260     END LOOP;
3261 
3262     RETURN TRUE;
3263 
3264 END valid_for_submission;
3265 
3266 
3267 PROCEDURE process_approval_initiated (
3268 
3269     p_unit_deferral_id      IN             NUMBER,
3270     p_object_version_number IN             NUMBER,
3271     p_new_status            IN             VARCHAR2,
3272     x_return_status         OUT NOCOPY     VARCHAR2)IS
3273 
3274 BEGIN
3275     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)	THEN
3276 		fnd_log.string
3277 		(
3278 			fnd_log.level_procedure,
3279 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_initiated.begin',
3280 			'At the start of PLSQL procedure'
3281 		);
3282     END IF;
3283     x_return_status := FND_API.G_RET_STS_SUCCESS;
3284 
3285     IF NOT(is_ump_deferral(p_unit_deferral_id)) THEN
3286        process_workorders(
3287             p_unit_deferral_id      => p_unit_deferral_id,
3288             p_object_version_number => p_object_version_number,
3289             p_approval_result_code  => G_DEFERRAL_INITIATED,
3290             x_return_status         => x_return_status );
3291 
3292        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
3293 		fnd_log.string
3294 		(
3295 			fnd_log.level_statement,
3296 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_initiated',
3297 			'unit_deferral_id : ' || p_unit_deferral_id
3298 		);
3299            fnd_log.string
3300 		(
3301 			fnd_log.level_statement,
3302 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_initiated',
3303 			'object_version_number : ' || p_object_version_number
3304 		);
3305            fnd_log.string
3306 		(
3307 			fnd_log.level_statement,
3308 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_initiated',
3309 			'Return status after process_workorders API call : ' || x_return_status
3310 		);
3311        END IF;
3312 
3313        IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
3314           IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
3315    		   fnd_log.string
3316 		   (
3317 			    fnd_log.level_unexpected,
3318 			    'ahl.plsql.AHL_PRD_DF_PVT.process_approval_initiated',
3319 			    'process_workorders API API threw error'
3320 		   );
3321           END IF;
3322           RETURN;
3323        END IF;
3324     END IF; -- ump deferral.
3325 
3326     process_unit_maint_plan(
3327          p_unit_deferral_id      => p_unit_deferral_id,
3328          p_object_version_number => p_object_version_number,
3329          p_approval_result_code  => G_DEFERRAL_INITIATED,
3330          p_new_status            => NULL,
3331          x_return_status         => x_return_status);
3332 
3333     IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
3334        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
3335 		   fnd_log.string
3336 		   (
3337 			    fnd_log.level_unexpected,
3338 			    'ahl.plsql.AHL_PRD_DF_PVT.process_approval_initiated',
3339 			    'process_unit_maint_plan API threw error'
3340 		   );
3341        END IF;
3342        RETURN;
3343     END IF;
3344 
3345     UPDATE ahl_unit_deferrals_b
3346     SET approval_status_code = p_new_status
3347     WHERE unit_deferral_id = p_unit_deferral_id
3348     AND object_version_number = p_object_version_number;--same transaction of caller API and update already happened
3349 
3350     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)	THEN
3351 		fnd_log.string
3352 		(
3353 			fnd_log.level_procedure,
3354 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_initiated.end',
3355 			'At the end of PLSQL procedure'
3356 		);
3357     END IF;
3358 
3359 
3360 END process_approval_initiated;
3361 
3362 PROCEDURE process_approval_approved (
3363 
3364     p_unit_deferral_id      IN             NUMBER,
3365     p_object_version_number IN             NUMBER,
3366     p_new_status            IN              VARCHAR2,
3367     x_return_status         OUT NOCOPY     VARCHAR2)IS
3368 
3369     CURSOR csi_item_instance_id_csr(p_unit_deferral_id IN NUMBER)
3370                                     --,p_object_version_number IN NUMBER)
3371     IS
3372     SELECT csi_item_instance_id FROM AHL_UNIT_EFFECTIVITIES_B UE, ahl_unit_deferrals_b UD
3373     WHERE UE.unit_effectivity_id = UD.unit_effectivity_id
3374     --AND UD.object_version_number = p_object_version_number
3375     AND UD.unit_deferral_id = p_unit_deferral_id;
3376 
3377     l_csi_item_instance_id NUMBER;
3378 
3379     -- to check whether MR is not terminated already
3380     /*CURSOR valid_mr_csr(p_unit_deferral_id IN NUMBER,p_object_version_number IN NUMBER) IS
3381     SELECT 'x' from AHL_MR_HEADERS_APP_V mr, AHL_MR_HEADERS_APP_V def,
3382                     ahl_unit_effectivities_b UE,ahl_unit_deferrals_b UD
3383     WHERE UD.unit_deferral_id = p_unit_deferral_id
3384     AND UD.object_version_number = p_object_version_number
3385     AND UE.unit_effectivity_id = UD.unit_effectivity_id
3386     AND def.mr_header_id = NVL(UE.mr_header_id,def.mr_header_id)
3387     AND def.title = mr.title
3388     AND trunc(sysdate) between trunc(mr.effective_from)
3389     AND trunc(nvl(mr.effective_to, sysdate))
3390     AND mr.version_number >= def.version_number;
3391 
3392     l_exists VARCHAR2(1);*/
3393 
3394     CURSOR is_calc_needed(p_unit_deferral_id IN NUMBER)IS
3395     SELECT cancel_flag from ahl_unit_deferrals_b
3396     WHERE unit_deferral_id = p_unit_deferral_id;
3397 
3398     l_cancel_flag VARCHAR2(1);
3399 
3400 
3401 BEGIN
3402     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)	THEN
3403 		fnd_log.string
3404 		(
3405 			fnd_log.level_procedure,
3406 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved.begin',
3407 			'At the start of PLSQL procedure'
3408 		);
3409     END IF;
3410 
3411     x_return_status := FND_API.G_RET_STS_SUCCESS;
3412 
3413 
3414     /*OPEN valid_mr_csr(p_unit_deferral_id ,p_object_version_number);
3415     FETCH valid_mr_csr INTO l_exists;
3416     IF(valid_mr_csr%NOTFOUND)THEN
3417        FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_MR_TERM');
3418        FND_MSG_PUB.ADD;
3419        IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
3420 		   fnd_log.string
3421 		   (
3422 			  fnd_log.level_error,
3423 			  'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
3424 			  'Associated MR has been terminated in FMP'
3425 		    );
3426        END IF;
3427        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3428        CLOSE valid_mr_csr;
3429        RETURN;
3430     END IF;
3431     CLOSE valid_mr_csr; */
3432     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
3433 		fnd_log.string
3434 		(
3435 			fnd_log.level_statement,
3436 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3437 			'unit_deferral_id : ' || p_unit_deferral_id
3438 		);
3439         fnd_log.string
3440 		(
3441 			fnd_log.level_statement,
3442 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3443 			'object_version_number : ' || p_object_version_number
3444 		);
3445         fnd_log.string
3446 		(
3447 			fnd_log.level_statement,
3448 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3449 			'p_new_status : ' || p_new_status
3450 		);
3451     END IF;
3452 
3453     IF NOT(is_ump_deferral(p_unit_deferral_id)) THEN
3454        --update workorders
3455        process_workorders(
3456             p_unit_deferral_id      => p_unit_deferral_id,
3457             p_object_version_number => p_object_version_number,
3458             p_approval_result_code  => G_DEFERRAL_APPROVED,
3459             x_return_status         => x_return_status);
3460 
3461        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
3462            fnd_log.string
3463    		(
3464 			fnd_log.level_statement,
3465 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3466 			'Return status after process_workorders API call : ' || x_return_status
3467 		);
3468        END IF;
3469 
3470        IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
3471           IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
3472 		   fnd_log.string
3473 		   (
3474 			    fnd_log.level_unexpected,
3475 			    'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3476 			    'process_workorders API threw error'
3477 		   );
3478           END IF;
3479           RETURN;
3480        END IF;
3481     END IF; -- UMP deferral.
3482 
3483     -- copy unit effectivities and update ue status(update unit maintenance plan)
3484     process_unit_maint_plan(
3485          p_unit_deferral_id      => p_unit_deferral_id,
3486          p_object_version_number => p_object_version_number,
3487          p_approval_result_code  => G_DEFERRAL_APPROVED,
3488          p_new_status            => p_new_status,
3489          x_return_status         => x_return_status);
3490 
3491     IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
3492 
3493        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
3494 		   fnd_log.string
3495 		   (
3496 			    fnd_log.level_unexpected,
3497 			    'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3498 			    'process_unit_maint_plan API threw error'
3499 		   );
3500        END IF;
3501        RETURN;
3502     END IF;
3503 
3504     -- update unit_effectivity_status
3505     UPDATE ahl_unit_deferrals_b
3506     SET approval_status_code = 'DEFERRED',
3507     object_version_number    = p_object_version_number + 1
3508     WHERE unit_deferral_id   = p_unit_deferral_id
3509     AND object_version_number = p_object_version_number;
3510 
3511 
3512     IF (fnd_log.level_event >= fnd_log.g_current_runtime_level)THEN
3513 		fnd_log.string
3514 		(
3515 			fnd_log.level_event,
3516 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3517 			'Succesfully approved deferral for unit_deferral_id : ' || p_unit_deferral_id
3518 		);
3519     END IF;
3520 
3521     -- fetch item instance id
3522     OPEN csi_item_instance_id_csr(p_unit_deferral_id --,p_object_version_number
3523                                  );
3524     FETCH csi_item_instance_id_csr INTO l_csi_item_instance_id;
3525     IF(csi_item_instance_id_csr%NOTFOUND)THEN
3526        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3527        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
3528 		   fnd_log.string
3529 		   (
3530 			    fnd_log.level_unexpected,
3531 			    'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3532 			    'Unit Effectivity record not found when fetching item instance id'
3533 		   );
3534        END IF;
3535        CLOSE csi_item_instance_id_csr;
3536        RETURN;
3537     ELSE
3538         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)	THEN
3539 		   fnd_log.string
3540 		   (
3541 			    fnd_log.level_statement,
3542 			    'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3543 			    'p_csi_item_instance_id : ' || l_csi_item_instance_id
3544 		   );
3545         END IF;
3546         -- decide whether due date calculation is needed
3547         OPEN is_calc_needed(p_unit_deferral_id);
3548         FETCH is_calc_needed INTO l_cancel_flag;
3549         CLOSE is_calc_needed;--existence check is not need.. already done above
3550 
3551         IF NVL(l_cancel_flag,G_NO_FLAG) = G_NO_FLAG THEN
3552           -- then call due date calc concurrent request
3553           calculate_due_date(
3554             x_return_status         => x_return_status ,
3555            p_csi_item_instance_id 	=> l_csi_item_instance_id
3556           );
3557 
3558           IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
3559             IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
3560 		        fnd_log.string
3561 		        (
3562 			            fnd_log.level_unexpected,
3563 			            'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3564 			            'Could not calculate due date'
3565 		        );
3566             END IF;
3567             RETURN;
3568          END IF;
3569         END IF;
3570     END IF;
3571 
3572     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)	THEN
3573 		fnd_log.string
3574 		(
3575 			fnd_log.level_procedure,
3576 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved.end',
3577 			'At the end of PLSQL procedure'
3578 		);
3579     END IF;
3580 
3581 END process_approval_approved;
3582 
3583 PROCEDURE calculate_due_date(
3584   x_return_status               OUT NOCOPY VARCHAR2,
3585   p_csi_item_instance_id 	    IN	NUMBER
3586 ) IS
3587 
3588   l_targetp         NUMBER;
3589   l_activep         NUMBER;
3590   l_targetp1        NUMBER;
3591   l_activep1        NUMBER;
3592   l_pmon_method     VARCHAR2(30);
3593   l_callstat        NUMBER;
3594   l_req_id          NUMBER;
3595 
3596   l_can_submit_request BOOLEAN := TRUE;
3597   l_concurrent_request_sucess BOOLEAN := FALSE;
3598 
3599   l_msg_count NUMBER;
3600   l_msg_data VARCHAR2(4000);
3601 
3602 BEGIN
3603   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
3604 		fnd_log.string
3605 		(
3606 			fnd_log.level_procedure,
3607 			'ahl.plsql.AHL_PRD_DF_PVT.calculate_due_date.begin',
3608 			'At the start of PLSQL procedure'
3609 		);
3610   END IF;
3611   -- check whether Internal Concurrent Manager is up
3612   fnd_concurrent.get_manager_status(applid => 0,
3613                                     managerid => 1,
3614                                     targetp => l_targetp1,
3615                                     activep => l_activep1,
3616                                     pmon_method => l_pmon_method,
3617                                     callstat => l_callstat);
3618   -- check whether Standard Concurrent Manager is up, this is not optional.
3619   fnd_concurrent.get_manager_status(applid => 0,
3620                                     managerid => 0,
3621                                     targetp => l_targetp,
3622                                     activep => l_activep,
3623                                     pmon_method => l_pmon_method,
3624                                     callstat => l_callstat);
3625   IF (l_activep <= 0 OR l_activep1 <= 0) THEN
3626     l_can_submit_request := FALSE;
3627   ELSIF NOT fnd_program.program_exists('AHLUEFF','AHL') THEN
3628     l_can_submit_request := FALSE;
3629   ELSIF NOT fnd_program.executable_exists('AHLUEFF','AHL') THEN
3630     l_can_submit_request := FALSE;
3631   END IF;
3632 
3633   -- submit request
3634   --IF(l_can_submit_request)THEN
3635      IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)	THEN
3636       fnd_log.string
3637 	  (
3638 		 fnd_log.level_statement,
3639 		 'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3640 		 'Submitting concurrent request to calculate due date for p_csi_item_instance_id : ' || p_csi_item_instance_id
3641 	  );
3642      END IF;
3643      --l_req_id := fnd_request.submit_request('AHL','AHLUEFF',NULL,NULL,FALSE,NULL,NULL,p_csi_item_instance_id );
3644      -- modification due to additional parameters added to AHLUEFF
3645      l_req_id := fnd_request.submit_request('AHL','AHLUEFF',NULL,NULL,FALSE,NULL,NULL,p_csi_item_instance_id,NULL,NULL,1);
3646 
3647      IF (l_req_id = 0 ) THEN
3648         l_concurrent_request_sucess := FALSE;
3649         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)	THEN
3650            fnd_log.string
3651 	       (
3652 		     fnd_log.level_statement,
3653 		     'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3654 		     'Tried to submit concurrent request but failed'
3655 	       );
3656        END IF;
3657      ELSE
3658         l_concurrent_request_sucess := TRUE;
3659         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)	THEN
3660            fnd_log.string
3661 	       (
3662 		     fnd_log.level_statement,
3663 		     'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3664 		     'Concurrent request to calculate due date successful'
3665 	       );
3666         END IF;
3667      END IF;
3668   --END IF;
3669 
3670   /* -- launching concurrent program always
3671   IF NOT (l_concurrent_request_sucess) THEN
3672      -- submit online request
3673      IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)	THEN
3674            fnd_log.string
3675 	       (
3676 		     fnd_log.level_statement,
3677 		     'ahl.plsql.AHL_PRD_DF_PVT.process_approval_approved',
3678 		     'Calculating due date online'
3679 	       );
3680      END IF;
3681 
3682      AHL_UMP_PROCESSUNIT_PVT.Process_Unit (
3683                 p_commit                 =>  FND_API.G_FALSE,
3684                 p_init_msg_list          =>  FND_API.G_FALSE,
3685                 x_msg_count              =>  l_msg_count,
3686                 x_msg_data               =>  l_msg_data,
3687                 x_return_status          =>  x_return_status,
3688                 p_csi_item_instance_id   =>  p_csi_item_instance_id,
3689                 p_concurrent_flag        => 'N');
3690 
3691         IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
3692             IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
3693 		        fnd_log.string
3694 		        (
3695 			            fnd_log.level_unexpected,
3696 			            'ahl.plsql.AHL_PRD_DF_PVT.calculate_due_date',
3697 			            'AHL_UMP_PROCESSUNIT_PVT.Process_Unit API threw error'
3698 		        );
3699             END IF;
3700             RETURN;
3701        END IF;
3702   END IF; */
3703 
3704   x_return_status := FND_API.G_RET_STS_SUCCESS;
3705 
3706   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
3707 		fnd_log.string
3708 		(
3709 			fnd_log.level_procedure,
3710 			'ahl.plsql.AHL_PRD_DF_PVT.calculate_due_date.end',
3711 			'At the end of PLSQL procedure'
3712 		);
3713   END IF;
3714 
3715 END calculate_due_date;
3716 
3717 
3718 PROCEDURE process_approval_rejected (
3719 
3720     p_unit_deferral_id      IN             NUMBER,
3721     p_object_version_number IN             NUMBER,
3722     p_new_status            IN              VARCHAR2,
3723     x_return_status         OUT NOCOPY     VARCHAR2)IS
3724 BEGIN
3725     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
3726 		fnd_log.string
3727 		(
3728 			fnd_log.level_procedure,
3729 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_rejected.begin',
3730 			'At the start of PLSQL procedure'
3731 		);
3732     END IF;
3733 
3734     x_return_status := FND_API.G_RET_STS_SUCCESS;
3735 
3736     -- bypass for UMP Deferral
3737     IF NOT(Is_UMP_Deferral(p_unit_deferral_id)) THEN
3738 
3739        process_workorders(
3740          p_unit_deferral_id      => p_unit_deferral_id,
3741          p_object_version_number => p_object_version_number,
3742          p_approval_result_code  => G_DEFERRAL_REJECTED,
3743          x_return_status         => x_return_status);
3744 
3745        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
3746 		fnd_log.string
3747 		(
3748 			fnd_log.level_statement,
3749 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_rejected',
3750 			'unit_deferral_id : ' || p_unit_deferral_id
3751 		);
3752            fnd_log.string
3753 		(
3754 			fnd_log.level_statement,
3755 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_rejected',
3756 			'object_version_number : ' || p_object_version_number
3757 		);
3758            fnd_log.string
3759 		(
3760 			fnd_log.level_statement,
3761 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_rejected',
3762 			'Return status after process_workorders API call : ' || x_return_status
3763 		);
3764            fnd_log.string
3765 		(
3766 			fnd_log.level_statement,
3767 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_rejected',
3768 			'New approval status : ' || p_new_status
3769 		);
3770        END IF;
3771 
3772        IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
3773           IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
3774 		   fnd_log.string
3775 		   (
3776 			    fnd_log.level_unexpected,
3777 			    'ahl.plsql.AHL_PRD_DF_PVT.process_approval_rejected',
3778 			    'process_workorders API threw error'
3779 		   );
3780           END IF;
3781           RETURN;
3782        END IF; -- x_return_status
3783     END IF; -- is_ump_deferral.
3784 
3785     -- update unit maintenance plan)
3786     process_unit_maint_plan(
3787          p_unit_deferral_id      => p_unit_deferral_id,
3788          p_object_version_number => p_object_version_number,
3789          p_approval_result_code  => G_DEFERRAL_REJECTED,
3790          p_new_status            => NULL,
3791          x_return_status         => x_return_status);
3792 
3793     IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
3794        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
3795 		   fnd_log.string
3796 		   (
3797 			    fnd_log.level_unexpected,
3798 			    'ahl.plsql.AHL_PRD_DF_PVT.process_approval_rejected',
3799 			    'process_unit_maint_plan API threw error'
3800 		   );
3801        END IF;
3802        RETURN;
3803     END IF;
3804 
3805     UPDATE ahl_unit_deferrals_b
3806     SET approval_status_code = p_new_status,
3807     object_version_number    = p_object_version_number + 1
3808     WHERE unit_deferral_id = p_unit_deferral_id
3809     AND object_version_number = p_object_version_number;
3810 
3811     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
3812 		fnd_log.string
3813 		(
3814 			fnd_log.level_procedure,
3815 			'ahl.plsql.AHL_PRD_DF_PVT.process_approval_rejected.end',
3816 			'At the end of PLSQL procedure'
3817 		);
3818     END IF;
3819 
3820 END process_approval_rejected;
3821 
3822 
3823 PROCEDURE process_workorders(
3824          p_unit_deferral_id      IN             NUMBER,
3825          p_object_version_number IN             NUMBER,
3826          p_approval_result_code  IN             VARCHAR2,
3827          x_return_status         OUT NOCOPY     VARCHAR2) IS
3828 
3829     l_prd_workorder_rec AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REC;
3830     l_temp_prd_workorder_rec AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REC;
3831 
3832 
3833     l_prd_workoper_tbl  AHL_PRD_WORKORDER_PVT.PRD_WORKOPER_TBL;
3834 
3835     --rroy
3836     --ACL Changes
3837     -- Added object_type to query
3838     CURSOR unit_effectivity_id_csr(p_unit_deferral_id IN NUMBER,
3839                                    p_object_version_number IN NUMBER)IS
3840     SELECT UD.unit_effectivity_id, ue.object_type
3841     from ahl_unit_deferrals_b UD, AHL_UNIT_EFFECTIVITIES_B UE
3842     WHERE NVL(UE.status_code,'x') NOT IN('ACCOMPLISHED','DEFERRED','EXCEPTION','TERMINATED','CANCELLED','MR-TERMINATE')
3843     AND UE.unit_effectivity_id = UD.unit_effectivity_id
3844     AND UD.object_version_number = p_object_version_number
3845     AND UD.unit_deferral_id = p_unit_deferral_id;
3846     -- rroy
3847     -- ACL Changes
3848 
3849     l_unit_effectivity_id NUMBER;
3850 		l_ue_title						VARCHAR2(155);
3851     -- rroy
3852     -- ACL Changes
3853     l_object_type         VARCHAR2(3);
3854     l_return_status       VARCHAR2(1);
3855     -- rroy
3856     -- ACL Changes
3857 
3858     CURSOR validate_approver_privilages(p_unit_effectivity_id IN NUMBER)IS
3859 
3860     /* replaced as this query does not pick up master workorders.
3861     SELECT WO.workorder_id
3862     FROM ahl_workorder_tasks_v WO
3863     WHERE  WO.job_status_code NOT IN ( G_JOB_DRAFT,G_JOB_DELETED)
3864     AND WO.unit_effectivity_id  = p_unit_effectivity_id;    */
3865 
3866     SELECT WO.workorder_id
3867     FROM ahl_workorders wo, ahl_visit_tasks_b vts,
3868       ahl_visits_b vst,
3869       (SELECT ORGANIZATION_ID FROM INV_ORGANIZATION_INFO_V
3870        WHERE NVL (operating_unit, mo_global.get_current_org_id()) = mo_global.get_current_org_id()) ORG
3871     WHERE  wo.visit_task_id = vts.visit_task_id
3872     AND vts.visit_id = vst.visit_id
3873     AND vst.organization_id = org.organization_id
3874     AND WO.status_code NOT IN ( G_JOB_DRAFT,G_JOB_DELETED)
3875     AND vts.unit_effectivity_id  = p_unit_effectivity_id
3876     AND vts.task_type_code IN ('SUMMARY','UNASSOCIATED');
3877 
3878     l_workorder_id NUMBER;
3879 
3880     -- rroy
3881     -- ACL Changes
3882     -- Added workorder_name to select clause
3883     CURSOR workorder_csr(p_unit_effectivity_id IN NUMBER)IS
3884     SELECT WO.workorder_id,
3885 				WO.object_version_number,
3886 				WO.status_code,
3887 				WO.actual_start_date,
3888 				WO.actual_end_date,
3889 				WO.workorder_name
3890     FROM ahl_workorders WO , ahl_unit_effectivities_b UE, ahl_visit_tasks_b VST
3891     WHERE  WO.status_code NOT IN ( G_JOB_DRAFT,G_JOB_DELETED)
3892     AND WO.master_workorder_flag = 'N'
3893     AND WO.visit_task_id = VST.visit_task_id
3894     AND VST.unit_effectivity_id = UE.unit_effectivity_id
3895     AND UE.unit_effectivity_id  = p_unit_effectivity_id
3896     UNION
3897     SELECT WO.workorder_id,
3898 				WO.object_version_number,
3899 				WO.status_code,
3900 				WO.actual_start_date,
3901 				WO.actual_end_date,
3902 				WO.workorder_name
3903     FROM ahl_workorders WO , ahl_unit_effectivities_b UE, ahl_visit_tasks_b VST
3904     WHERE  WO.status_code NOT IN ( G_JOB_DRAFT,G_JOB_DELETED)
3905     AND WO.master_workorder_flag = 'N'
3906     AND WO.visit_task_id = VST.visit_task_id
3907     AND VST.unit_effectivity_id = UE.unit_effectivity_id
3908     AND UE.unit_effectivity_id IN
3909     (
3910 
3911          SELECT     distinct related_ue_id
3912          FROM       AHL_UE_RELATIONSHIPS
3913          WHERE      relationship_code = 'PARENT'
3914          START WITH ue_id = p_unit_effectivity_id
3915          CONNECT BY ue_id = PRIOR related_ue_id
3916     );
3917     -- rroy
3918     -- ACL Changes
3919 
3920     CURSOR workorder_objver_csr(p_workorder_id IN NUMBER) IS
3921     SELECT object_version_number from ahl_workorders
3922     WHERE workorder_id = p_workorder_id;
3923 
3924 	--Changes by nsikka for Bug 5324101
3925 	--Cursor added to fetch UE Title to be passed as token
3926 
3927     CURSOR ue_title_csr(p_unit_effectivity_id IN NUMBER) IS
3928     SELECT title from ahl_unit_effectivities_v
3929     WHERE UNIT_EFFECTIVITY_ID = p_unit_effectivity_id;
3930 
3931     l_update_flag BOOLEAN := false;
3932     --l_complete_flag BOOLEAN := false;  /* commented out as  workorder completion is no longer needed. */
3933 
3934     l_msg_count NUMBER;
3935     l_msg_data VARCHAR2(4000);
3936 
3937     l_temp VARCHAR2(30);
3938 
3939 -- fix for bug number 6990380
3940     CURSOR chk_inst_in_job (p_workorder_id IN NUMBER) IS
3941        SELECT 'x'
3942        FROM  CSI_ITEM_INSTANCES CII, AHL_WORKORDERS AWO
3943        WHERE CII.WIP_JOB_ID = AWO.WIP_ENTITY_ID
3944          AND AWO.workorder_id = p_workorder_id
3945          AND ACTIVE_START_DATE <= SYSDATE
3946          AND ((ACTIVE_END_DATE IS NULL) OR (ACTIVE_END_DATE >= SYSDATE))
3947          AND LOCATION_TYPE_CODE = 'WIP'
3948          AND NOT EXISTS (SELECT 'X' FROM CSI_II_RELATIONSHIPS CIR
3949                          WHERE CIR.SUBJECT_ID = CII.INSTANCE_ID
3950                            AND CIR.RELATIONSHIP_TYPE_CODE = 'COMPONENT-OF'
3951                            AND SYSDATE BETWEEN NVL(ACTIVE_START_DATE,SYSDATE) AND NVL(ACTIVE_END_DATE,SYSDATE));
3952 
3953     l_status_meaning VARCHAR2(80);
3954 
3955 BEGIN
3956     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)	THEN
3957 		fnd_log.string
3958 		(
3959 			fnd_log.level_procedure,
3960 			'ahl.plsql.AHL_PRD_DF_PVT.process_workorders.begin',
3961 			'At the start of PLSQL procedure'
3962 		);
3963     END IF;
3964 
3965     x_return_status := FND_API.G_RET_STS_SUCCESS;
3966 
3967     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
3968 		fnd_log.string
3969 		(
3970 			fnd_log.level_statement,
3971 			'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
3972 			'unit_deferral_id : ' || p_unit_deferral_id
3973 		);
3974         fnd_log.string
3975 		(
3976 			fnd_log.level_statement,
3977 			'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
3978 			'object_version_number : ' || p_object_version_number
3979 		);
3980         fnd_log.string
3981 		(
3982 			fnd_log.level_statement,
3983 			'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
3984 			'Approval Result Code : ' || p_approval_result_code
3985 		);
3986     END IF;
3987     -- validating ue and getting it
3988     OPEN unit_effectivity_id_csr(p_unit_deferral_id, p_object_version_number);
3989     FETCH unit_effectivity_id_csr INTO l_unit_effectivity_id, l_object_type;
3990     IF(unit_effectivity_id_csr%NOTFOUND)THEN
3991        FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INVOP_HREC_MISS');
3992        FND_MSG_PUB.ADD;
3993        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3994        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
3995 		    fnd_log.string
3996 		    (
3997 			    fnd_log.level_unexpected,
3998 			    'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
3999 			    'Unit Effectivity Record not found for unit deferral id : ' || p_unit_deferral_id
4000 		    );
4001        END IF;
4002     END IF;
4003     CLOSE unit_effectivity_id_csr;
4004 
4005     IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
4006        RETURN;
4007     END IF;
4008 
4009     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4010 		fnd_log.string
4011 		(
4012 			fnd_log.level_statement,
4013 			'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4014 			'unit_effectivity_id : ' || l_unit_effectivity_id
4015 		);
4016     END IF;
4017 
4018     IF (p_approval_result_code IN ( G_DEFERRAL_REJECTED,G_DEFERRAL_APPROVED ))THEN
4019        OPEN validate_approver_privilages(l_unit_effectivity_id);
4020        FETCH validate_approver_privilages INTO l_workorder_id;
4021        IF(validate_approver_privilages%NOTFOUND)THEN
4022          FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_APPR_SETUP');
4023          FND_MSG_PUB.ADD;
4024          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4025          IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)	THEN
4026 		    fnd_log.string
4027 		    (
4028 			    fnd_log.level_unexpected,
4029 			    'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4030 			    'Approver client information not same as the requester. workorders not found for approver'
4031 		    );
4032          END IF;
4033        END IF;
4034        CLOSE validate_approver_privilages;
4035     END IF;
4036 
4037     IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
4038        RETURN;
4039     END IF;
4040 
4041     --OPEN workorder_csr(l_unit_effectivity_id);
4042     FOR workorder_rec IN workorder_csr(l_unit_effectivity_id) LOOP
4043         l_update_flag := FALSE;
4044         --l_complete_flag := FALSE;
4045         l_prd_workorder_rec := l_temp_prd_workorder_rec;--initialize it
4046         l_prd_workorder_rec.workorder_id := workorder_rec.workorder_id;
4047         l_prd_workorder_rec.object_version_number := workorder_rec.object_version_number;
4048         l_prd_workorder_rec.status_code := workorder_rec.status_code;
4049         l_prd_workorder_rec.actual_start_date := workorder_rec.actual_start_date;
4050         l_prd_workorder_rec.actual_end_date := workorder_rec.actual_end_date;
4051 
4052     -- rroy
4053     -- ACL Changes
4054     l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_prd_workorder_rec.workorder_id,
4055                                                        p_ue_id => NULL, 																																																										p_visit_id => NULL,
4056                                                        p_item_instance_id => NULL);
4057 
4058 
4059 	--nsikka
4060 	--Changes made for Bug 5324101 .
4061 	--tokens passed changed to MR_TITLE
4062 
4063     IF l_return_status = FND_API.G_TRUE THEN
4064        IF l_object_type IS NOT NULL AND l_object_type = 'SR' THEN
4065           FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_DFSR_UNTLCKD');
4066           FND_MESSAGE.Set_Token('WO_NAME', workorder_rec.workorder_name);
4067           FND_MSG_PUB.ADD;
4068        ELSE
4069           OPEN ue_title_csr(l_unit_effectivity_id);
4070           FETCH ue_title_csr into l_ue_title;
4071           CLOSE ue_title_csr;
4072           FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_DFMR_UNTLCKD');
4073           FND_MESSAGE.Set_Token('MR_TITLE', l_ue_title);
4074           FND_MSG_PUB.ADD;
4075        END IF;
4076        EXIT;
4077      END IF;
4078      -- rroy
4079      -- ACL Changes
4080 
4081         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4082             fnd_log.string
4083 		    (
4084 			     fnd_log.level_statement,
4085 			     'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4086 			     'workorder_id : ' || l_prd_workorder_rec.workorder_id
4087 		    );
4088             fnd_log.string
4089 		    (
4090 			      fnd_log.level_statement,
4091 			      'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4092 			      'object_version_number : ' || l_prd_workorder_rec.object_version_number
4093 		    );
4094 		    fnd_log.string
4095 		    (
4096 			      fnd_log.level_statement,
4097 			      'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4098 			      'Current Workorder status : ' || l_prd_workorder_rec.status_code
4099 		    );
4100         END IF;
4101 
4102         IF(p_approval_result_code = G_DEFERRAL_INITIATED)THEN
4103            --l_prd_workorder_rec.status_code := G_JOB_UNRELEASED;
4104            --l_update_flag := TRUE;
4105            IF(isValidStatusUpdate(G_DEFERRAL_INITIATED, l_prd_workorder_rec.status_code))THEN
4106               l_update_flag := TRUE;
4107               l_prd_workorder_rec.status_code := G_JOB_PEND_DFR_APPR;
4108            END IF;
4109         ELSIF (p_approval_result_code = G_DEFERRAL_REJECTED)THEN
4110             IF(isValidStatusUpdate(G_DEFERRAL_REJECTED, l_prd_workorder_rec.status_code))THEN
4111               l_update_flag := TRUE;
4112               -- find out the old status and set it here
4113               l_prd_workorder_rec.status_code := getLastStatus(l_prd_workorder_rec.workorder_id);
4114             END IF;
4115         /* sracha: commented out as  workorder completion is no longer needed.*/
4116         /*ELSIF (p_approval_result_code = G_DEFERRAL_APPROVED)THEN
4117             -- find out the old status and populate here
4118             IF(l_prd_workorder_rec.status_code = G_JOB_PEND_DFR_APPR)THEN
4119                l_prd_workorder_rec.status_code := getLastStatus(l_prd_workorder_rec.workorder_id);
4120             END IF;
4121             --IF(isValidStatusUpdate(G_DEFERRAL_APPROVED, l_prd_workorder_rec.status_code))THEN
4122             --  l_update_flag := TRUE;
4123             --  l_prd_workorder_rec.status_code := G_JOB_CANCELLED;
4124             --ELSIF (l_prd_workorder_rec.status_code IN(G_JOB_RELEASED,G_JOB_PARTS_HOLD,G_JOB_ON_HOLD,G_JOB_PEND_QA_APPR))THEN
4125             --  l_complete_flag := TRUE;
4126             --END IF;
4127             IF (l_prd_workorder_rec.status_code IN(G_JOB_UNRELEASED,G_JOB_RELEASED,G_JOB_PARTS_HOLD,G_JOB_ON_HOLD,G_JOB_PEND_QA_APPR))THEN
4128               l_complete_flag := TRUE;
4129             END IF; */
4130         /* sracha - end */
4131         END IF;
4132 
4133         -- call production API to update job status or complete job
4134         IF(l_update_flag)THEN
4135             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4136                 fnd_log.string
4137 		        (
4138 			      fnd_log.level_statement,
4139 			      'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4140 			      'Workorder Update Flag :TRUE '
4141 		        );
4142                 fnd_log.string
4143 		        (
4144 			      fnd_log.level_statement,
4145 			      'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4146 			      'new Workorder status/Update : ' || l_prd_workorder_rec.status_code
4147 		        );
4148             END IF;
4149 
4150             IF (l_prd_workorder_rec.status_code IN (G_JOB_CANCELLED,G_JOB_PEND_DFR_APPR)) THEN
4151 	                  OPEN chk_inst_in_job(l_prd_workorder_rec.workorder_id);
4152 	                  FETCH chk_inst_in_job INTO l_temp;
4153 	                  IF (chk_inst_in_job%FOUND) THEN
4154 	                    --Get status meaning
4155 	                    SELECT meaning INTO l_status_meaning
4156 	    	            FROM fnd_lookup_values_vl
4157 	                    WHERE lookup_type = 'AHL_JOB_STATUS'
4158 	                    AND LOOKUP_CODE = l_prd_workorder_rec.status_code;
4159 	                    FND_MESSAGE.set_name('AHL','AHL_PRD_MAT_NOT_RETURN');
4160 	                    FND_MESSAGE.set_token('WO_STATUS', l_status_meaning);
4161 	                    FND_MESSAGE.set_token('WO_NAME', workorder_rec.workorder_name);
4162 	                    FND_MSG_PUB.add;
4163 	                    x_return_status := FND_API.G_RET_STS_ERROR;
4164 	                  END IF;
4165 	                  CLOSE chk_inst_in_job;
4166 	                END IF;
4167             IF(x_return_status = FND_API.G_RET_STS_SUCCESS)THEN
4168               -- call update job API
4169               AHL_PRD_WORKORDER_PVT.update_job
4170               (
4171                p_api_version         => 1.0,
4172                p_init_msg_list       => FND_API.G_FALSE,
4173                p_commit              => FND_API.G_FALSE,
4174                p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
4175                p_default             => FND_API.G_TRUE,
4176                p_module_type         => 'API',
4177                x_return_status       => x_return_status,
4178                x_msg_count           => l_msg_count,
4179                x_msg_data            => l_msg_data,
4180                p_x_prd_workorder_rec => l_prd_workorder_rec,
4181                p_x_prd_workoper_tbl  => l_prd_workoper_tbl
4182              );
4183              IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4184                 fnd_log.string
4185 		        (
4186 			      fnd_log.level_statement,
4187 			      'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4188 			      'Status after AHL_PRD_WORKORDER_PVT.update_job API call : ' || x_return_status
4189 		        );
4190              END IF;
4191              IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
4192                 FND_MESSAGE.SET_NAME(G_APP_NAME, 'AHL_PRD_DF_APPR_UPD_JB_FAIL');
4193                 FND_MSG_PUB.ADD;
4194                 IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
4195                     fnd_log.string
4196 		            (
4197 			            fnd_log.level_unexpected,
4198 			            'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4199 			            'AHL_PRD_WORKORDER_PVT.update_job API returned error '
4200 		            );
4201                 END IF;
4202                 EXIT;
4203              END IF;
4204         /* sracha: commented out as  workorder completion is no longer needed. */
4205         /* ELSIF(l_complete_flag)THEN
4206             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4207                 fnd_log.string
4208 		        (
4209 			      fnd_log.level_statement,
4210 			      'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4211 			      'Workorder Complete Flag :TRUE '
4212 		        );
4213                 fnd_log.string
4214 		        (
4215 			      fnd_log.level_statement,
4216 			      'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4217 			      'new Workorder status/Complete : ' || l_prd_workorder_rec.status_code
4218 		        );
4219             END IF;
4220             l_prd_workorder_rec.status_code := G_JOB_RELEASED;
4221 
4222             -- modified 4/24/06 to not pass actual start dates --FP bug# 5114848.
4223             -- actual dates are not needed if WO is being cancelled.
4224             --l_prd_workorder_rec.actual_start_date := NVL(l_prd_workorder_rec.actual_start_date,SYSDATE);
4225             --l_prd_workorder_rec.actual_end_date := NVL(l_prd_workorder_rec.actual_end_date,SYSDATE);
4226 
4227             -- call update job API
4228             AHL_PRD_WORKORDER_PVT.update_job
4229              (
4230                p_api_version         => 1.0,
4231                p_init_msg_list       => FND_API.G_FALSE,
4232                p_commit              => FND_API.G_FALSE,
4233                p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
4234                p_default             => FND_API.G_TRUE,
4235                p_module_type         => 'API',
4236                x_return_status       => x_return_status,
4237                x_msg_count           => l_msg_count,
4238                x_msg_data            => l_msg_data,
4239                p_x_prd_workorder_rec => l_prd_workorder_rec,
4240                p_x_prd_workoper_tbl  => l_prd_workoper_tbl
4241              );
4242              IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4243                 fnd_log.string
4244 		        (
4245 			      fnd_log.level_statement,
4246 			      'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4247 			      'Status after AHL_PRD_WORKORDER_PVT.update_job API call : ' || x_return_status
4248 		        );
4249              END IF;
4250              IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
4251                 FND_MESSAGE.SET_NAME(G_APP_NAME, 'AHL_PRD_DF_APPR_UPD_JB_FAIL');
4252                 FND_MSG_PUB.ADD;
4253                 IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
4254                     fnd_log.string
4255 		            (
4256 			            fnd_log.level_unexpected,
4257 			            'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4258 			            'AHL_PRD_WORKORDER_PVT.update_job API returned error '
4259 		            );
4260                 END IF;
4261                 EXIT;
4262             END IF; */
4263             -- sure to find record here
4264             -- Following code has been commented because we have got an API which will cancel all jobs for us
4265             -- after approval of deferral.
4266             -- also in 11.5.10+ we will cancel all workorders inspite of their statuses.
4267             /*OPEN workorder_objver_csr(l_prd_workorder_rec.workorder_id);
4268             FETCH workorder_objver_csr INTO l_prd_workorder_rec.object_version_number;
4269             CLOSE workorder_objver_csr;
4270 
4271             AHL_COMPLETIONS_PVT.defer_workorder
4272             (
4273                p_api_version         => 1.0,
4274                p_init_msg_list       => FND_API.G_FALSE,
4275                p_commit              => FND_API.G_FALSE,
4276                p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
4277                p_default             => FND_API.G_TRUE,
4278                p_module_type         => 'API',
4279                x_return_status       => x_return_status,
4280                x_msg_count           => l_msg_count,
4281                x_msg_data            => l_msg_data,
4282                p_workorder_id        => l_prd_workorder_rec.workorder_id,
4283                p_object_version_no   => l_prd_workorder_rec.object_version_number
4284              );
4285              IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4286                 fnd_log.string
4287 		        (
4288 			      fnd_log.level_statement,
4289 			      'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4290 			      'Status after AHL_COMPLETIONS_PVT.defer_workorder API call : ' || x_return_status
4291 		        );
4292              END IF;
4293              IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
4294                 FND_MESSAGE.SET_NAME(G_APP_NAME, 'AHL_PRD_DF_APPR_CMP_JB_FAIL');
4295                 FND_MSG_PUB.ADD;
4296                 IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
4297                     fnd_log.string
4298 		            (
4299 			            fnd_log.level_unexpected,
4300 			            'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4301 			            'AHL_COMPLETIONS_PVT.defer_workorder API returned error '
4302 		            );
4303                 END IF;
4304                 EXIT;
4305              END IF;*/
4306           END IF;
4307         END IF;
4308     END LOOP;
4309 
4310             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4311                 fnd_log.string
4312 		        (
4313 			      fnd_log.level_statement,
4314 			      'before ahl.plsql.AHL_PRD_WORKORDER_PVT.cancel_visit_jobs',
4315 			      'Workorder Cancel Visits Jobs '
4316 		        );
4317             END IF;
4318 
4319     -- throw errors if any
4320     IF(FND_MSG_PUB.count_msg > 0)THEN
4321         RETURN;
4322     END IF;
4323 
4324             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4325                 fnd_log.string
4326 		        (
4327 			      fnd_log.level_statement,
4328 			      'ahl.plsql.AHL_PRD_WORKORDER_PVT.cancel_visit_jobs',
4329 			      'Workorder Cancel Visits Jobs '
4330 		        );
4331             END IF;
4332 
4333     -- if approval was approved, cancel all workorders
4334     IF (p_approval_result_code = G_DEFERRAL_APPROVED)THEN
4335         AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
4336         (
4337             p_api_version         => 1.0,
4338             p_init_msg_list       => FND_API.G_TRUE,
4339             p_commit              => FND_API.G_FALSE,
4340             p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
4341             p_default             => FND_API.G_FALSE,
4342             p_module_type         => 'API',
4343             x_return_status       => x_return_status,
4344             x_msg_count           => l_msg_count,
4345             x_msg_data            => l_msg_data,
4346             p_visit_id            => NULL,
4347             p_unit_effectivity_id => l_unit_effectivity_id,
4348             p_workorder_id        => NULL
4349         );
4350         IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
4351            FND_MESSAGE.SET_NAME(G_APP_NAME, 'AHL_PRD_DF_APPR_CMP_JB_FAIL');
4352            FND_MSG_PUB.ADD;
4353            IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
4354                fnd_log.string
4355 		       (
4356 			       fnd_log.level_unexpected,
4357 			       'ahl.plsql.AHL_PRD_DF_PVT.process_workorders',
4358 			       'AHL_PRD_WORKORDERS_PVT.cancel_visit_jobs API returned error '
4359 		       );
4360            END IF;
4361         END IF;
4362     END IF;
4363 
4364     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)	THEN
4365 		fnd_log.string
4366 		(
4367 			fnd_log.level_procedure,
4368 			'ahl.plsql.AHL_PRD_DF_PVT.process_workorders.end',
4369 			'At the end of PLSQL procedure'
4370 		);
4371     END IF;
4372 END process_workorders;
4373 
4374 FUNCTION isValidStatusUpdate(
4375          operation_code VARCHAR2,
4376          status_code    VARCHAR2)RETURN BOOLEAN IS
4377 
4378   l_yes_flag boolean := FALSE;
4379 
4380 BEGIN
4381      IF(operation_code = G_DEFERRAL_INITIATED)THEN
4382        IF(status_code IN (G_JOB_UNRELEASED,G_JOB_RELEASED,G_JOB_PARTS_HOLD,G_JOB_ON_HOLD,G_JOB_PEND_QA_APPR))THEN
4383           l_yes_flag := TRUE;
4384        END IF;
4385      ELSIF(operation_code = G_DEFERRAL_REJECTED)THEN
4386        IF(status_code = G_JOB_PEND_DFR_APPR)THEN
4387           l_yes_flag := TRUE;
4388        END IF;
4389      /*ELSIF(operation_code = G_DEFERRAL_APPROVED)THEN
4390        IF(status_code IN (G_JOB_UNRELEASED))THEN
4391           l_yes_flag := TRUE;
4392        END IF;*/
4393      END IF;
4394      RETURN l_yes_flag;
4395 END isValidStatusUpdate;
4396 
4397 FUNCTION getLastStatus(p_workorder_id IN NUMBER) RETURN VARCHAR2 IS
4398 
4399     CURSOR last_status_code_csr(p_workorder_id IN NUMBER) IS
4400     SELECT status_code,last_update_date FROM ahl_workorder_txns
4401     WHERE workorder_id = p_workorder_id ORDER BY last_update_date DESC;
4402 
4403     l_junk_date DATE;
4404     l_last_status_code VARCHAR2(30);
4405 BEGIN
4406     OPEN last_status_code_csr(p_workorder_id);
4407     LOOP
4408        FETCH last_status_code_csr INTO l_last_status_code,l_junk_date;
4409        IF(last_status_code_csr%NOTFOUND)THEN
4410           l_last_status_code := G_JOB_UNRELEASED;
4411           EXIT;
4412        ELSIF (l_last_status_code <> G_JOB_PEND_DFR_APPR)THEN
4413           EXIT;
4414        END IF;
4415     END LOOP;
4416     CLOSE last_status_code_csr;
4417     RETURN l_last_status_code;
4418 END getLastStatus;
4419 
4420 
4421 PROCEDURE process_unit_maint_plan(
4422          p_unit_deferral_id      IN             NUMBER,
4423          p_object_version_number IN             NUMBER,
4424          p_approval_result_code  IN             VARCHAR2,
4425          p_new_status            IN             VARCHAR2,
4426          x_return_status         OUT NOCOPY     VARCHAR2)IS
4427 
4428     -- to fetch unit effectivity id
4429     CURSOR unit_effectivity_id_csr(p_unit_deferral_id  IN NUMBER,p_object_version_number IN NUMBER) IS
4430     SELECT UD.unit_effectivity_id,UE.mr_header_id,UE.manually_planned_flag,UE.defer_from_ue_id
4431     from ahl_unit_deferrals_b UD,ahl_unit_effectivities_b UE
4432     WHERE UE.unit_effectivity_id = UD.unit_effectivity_id
4433     AND UD.object_version_number = p_object_version_number
4434     AND UD.unit_deferral_id = p_unit_deferral_id;
4435 
4436     l_unit_effectivity_id NUMBER;
4437 
4438     CURSOR unit_effectivity_csr (p_unit_effectivity_id IN NUMBER) IS
4439     SELECT
4440       UNIT_EFFECTIVITY_ID, OBJECT_VERSION_NUMBER, CSI_ITEM_INSTANCE_ID, MR_INTERVAL_ID,
4441       MR_EFFECTIVITY_ID, MR_HEADER_ID, STATUS_CODE, SET_DUE_DATE, ACCOMPLISHED_DATE,
4442       DUE_DATE, DUE_COUNTER_VALUE, FORECAST_SEQUENCE, REPETITIVE_MR_FLAG,
4443       TOLERANCE_FLAG, DATE_RUN, PRECEDING_UE_ID, MESSAGE_CODE, REMARKS,
4444       SERVICE_LINE_ID, PROGRAM_MR_HEADER_ID, CANCEL_REASON_CODE, EARLIEST_DUE_DATE,
4445       LATEST_DUE_DATE, DEFER_FROM_UE_ID, CS_INCIDENT_ID, QA_COLLECTION_ID,
4446       ORIG_DEFERRAL_UE_ID, COUNTER_ID,OBJECT_TYPE,MANUALLY_PLANNED_FLAG,
4447       LOG_SERIES_CODE,LOG_SERIES_NUMBER,FLIGHT_NUMBER, MEL_CDL_TYPE_CODE,
4448       POSITION_PATH_ID, ATA_CODE, UNIT_CONFIG_HEADER_ID,
4449       ATTRIBUTE_CATEGORY, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3,
4450       ATTRIBUTE4, ATTRIBUTE5, ATTRIBUTE6, ATTRIBUTE7, ATTRIBUTE8,ATTRIBUTE9,
4451       ATTRIBUTE10, ATTRIBUTE11, ATTRIBUTE12, ATTRIBUTE13, ATTRIBUTE14,ATTRIBUTE15,
4452       ORIGINATING_WO_ID, ACCOMPLISH_TRIGGER_TYPE, LOOP_CHAIN_SEQ_NUM, START_LC_UE_ID
4453     FROM  AHL_UNIT_EFFECTIVITIES_VL UE
4454     WHERE unit_effectivity_id = p_unit_effectivity_id
4455     UNION
4456     SELECT
4457       UNIT_EFFECTIVITY_ID, OBJECT_VERSION_NUMBER, CSI_ITEM_INSTANCE_ID, MR_INTERVAL_ID,
4458       MR_EFFECTIVITY_ID, MR_HEADER_ID, STATUS_CODE, SET_DUE_DATE, ACCOMPLISHED_DATE,
4459       DUE_DATE, DUE_COUNTER_VALUE, FORECAST_SEQUENCE, REPETITIVE_MR_FLAG,
4460       TOLERANCE_FLAG, DATE_RUN, PRECEDING_UE_ID, MESSAGE_CODE, REMARKS,
4461       SERVICE_LINE_ID, PROGRAM_MR_HEADER_ID, CANCEL_REASON_CODE, EARLIEST_DUE_DATE,
4462       LATEST_DUE_DATE, DEFER_FROM_UE_ID, CS_INCIDENT_ID, QA_COLLECTION_ID,
4463       ORIG_DEFERRAL_UE_ID, COUNTER_ID,OBJECT_TYPE,MANUALLY_PLANNED_FLAG,
4464       LOG_SERIES_CODE,LOG_SERIES_NUMBER,FLIGHT_NUMBER, MEL_CDL_TYPE_CODE,
4465       POSITION_PATH_ID, ATA_CODE, UNIT_CONFIG_HEADER_ID,
4466       ATTRIBUTE_CATEGORY, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3,
4467       ATTRIBUTE4, ATTRIBUTE5, ATTRIBUTE6, ATTRIBUTE7, ATTRIBUTE8,ATTRIBUTE9,
4468       ATTRIBUTE10, ATTRIBUTE11, ATTRIBUTE12, ATTRIBUTE13, ATTRIBUTE14,ATTRIBUTE15,
4469       ORIGINATING_WO_ID, ACCOMPLISH_TRIGGER_TYPE, LOOP_CHAIN_SEQ_NUM, START_LC_UE_ID
4470     FROM  AHL_UNIT_EFFECTIVITIES_VL UE
4471     WHERE unit_effectivity_id IN
4472        (
4473 
4474          SELECT     distinct related_ue_id
4475          FROM       AHL_UE_RELATIONSHIPS
4476          WHERE      relationship_code = 'PARENT'
4477          START WITH ue_id = p_unit_effectivity_id
4478          CONNECT BY ue_id = PRIOR related_ue_id
4479        );
4480     --FOR UPDATE OF OBJECT_VERSION_NUMBER;
4481 
4482     l_rowid VARCHAR2(80);
4483     l_new_unit_effectivity_id NUMBER;
4484     l_FORECAST_SEQUENCE NUMBER;
4485     l_TOLERANCE_FLAG VARCHAR2(1);
4486     l_PRECEDING_UE_ID NUMBER;
4487     l_DUE_DATE DATE;
4488     l_EARLIEST_DUE_DATE DATE;
4489     l_LATEST_DUE_DATE DATE;
4490     l_DUE_COUNTER_VALUE  NUMBER;
4491     l_MR_EFFECTIVITY_ID NUMBER;
4492     l_MR_INTERVAL_ID  NUMBER;
4493     l_DATE_RUN DATE;
4494 
4495     CURSOR ue_relns_csr(p_unit_effectivity_id IN NUMBER)IS
4496     SELECT distinct ue_id, related_ue_id, originator_ue_id
4497     FROM   AHL_UE_RELATIONSHIPS
4498     WHERE  relationship_code = 'PARENT'
4499     START WITH ue_id = p_unit_effectivity_id
4500     CONNECT BY ue_id = PRIOR related_ue_id;
4501 
4502     TYPE ue_relns_rec_type IS RECORD(
4503     ue_id NUMBER,
4504     related_ue_id NUMBER,
4505     originator_ue_id NUMBER
4506     );
4507 
4508     TYPE ue_relns_tbl_type IS TABLE OF ue_relns_rec_type INDEX BY BINARY_INTEGER;
4509 
4510     l_ue_relns_tbl ue_relns_tbl_type;
4511 
4512     i NUMBER := 0;
4513     l_ue_relationship_id NUMBER;
4514     l_new_parent_ue_id NUMBER;
4515     l_orig_deferral_ue_id NUMBER;
4516     l_update_status VARCHAR2(30);
4517 
4518     -- TAMAL -- Begin changes for ER #3356804
4519     -- TAMAL -- Adding cursor to retrieve UE and SR details
4520     CURSOR get_ue_sr_details
4521     (
4522         p_ue_id in number
4523     )
4524     IS
4525 	  SELECT	ue.object_type,
4526         	sr.incident_id,
4527         	sr.incident_number,
4528         	sr.object_version_number
4529         FROM
4530         	ahl_unit_effectivities_b ue,
4531         	cs_incidents_all_b sr
4532         WHERE
4533         	ue.cs_incident_id = sr.incident_id (+) and
4534         	ue.unit_effectivity_id = p_ue_id;
4535 
4536     l_ue_obj_type		VARCHAR2(3);
4537     l_cs_incident_id		NUMBER;
4538     l_cs_incident_number	VARCHAR2(64);
4539     l_cs_incident_ovn		NUMBER;
4540     l_interaction_id		NUMBER;
4541     l_return_status		VARCHAR2(1);
4542     l_msg_count			NUMBER;
4543     l_msg_data			VARCHAR2(4000);
4544     -- TAMAL -- End changes for ER #3356804
4545 
4546     -- Support for SR cancellation.
4547     l_status_id                NUMBER;
4548 
4549     l_mr_applicable VARCHAR2(1);
4550     l_active_end_date DATE;
4551     l_new_mr_header_id NUMBER;
4552     l_new_mr_applicable VARCHAR2(1);
4553 
4554     l_mr_header_id NUMBER;
4555     l_ue_status_code VARCHAR2(30);
4556     l_deferral_type VARCHAR2(3);
4557 
4558     CURSOR immediate_child_check_csr(p_root_ue_id IN NUMBER,p_child_ue_id IN NUMBER)IS
4559     SELECT 'x'
4560     FROM   AHL_UE_RELATIONSHIPS
4561     WHERE  related_ue_id = p_child_ue_id
4562     AND relationship_code = 'PARENT'
4563     AND ue_id = p_root_ue_id;
4564 
4565     l_junc VARCHAR2(1);
4566     l_new_defer_from_ue_id NUMBER;
4567     l_curr_defer_from_ue_id NUMBER;
4568     l_manually_planned_flag VARCHAR2(1);
4569 
4570     -- SR Cancellation for nonserialized items.
4571     CURSOR is_sr_ue_nonserial(p_ue_id in number)
4572     IS
4573         SELECT cii.serial_number
4574         FROM ahl_unit_effectivities_b ue, csi_item_instances cii
4575         WHERE unit_effectivity_id = p_ue_id
4576           AND ue.csi_item_instance_id = cii.instance_id
4577           AND cii.quantity > 0
4578           AND ue.object_type = 'SR';
4579     l_serial_number  csi_item_instances.serial_number%TYPE;
4580 
4581     CURSOR is_initdue_def(p_ue_id in number)IS
4582     SELECT unit_deferral_id from ahl_unit_deferrals_b
4583     WHERE unit_effectivity_id = p_ue_id
4584     AND unit_deferral_type = 'INIT-DUE';
4585 
4586     l_init_due_deferral_id NUMBER;
4587 BEGIN
4588 
4589     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)	THEN
4590 		fnd_log.string
4591 		(
4592 			fnd_log.level_procedure,
4593 			'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan.begin',
4594 			'At the start of PLSQL procedure'
4595 		);
4596     END IF;
4597 
4598     x_return_status := FND_API.G_RET_STS_SUCCESS;
4599 
4600     OPEN unit_effectivity_id_csr(p_unit_deferral_id ,p_object_version_number);
4601     FETCH unit_effectivity_id_csr INTO l_unit_effectivity_id,l_mr_header_id,l_manually_planned_flag,l_curr_defer_from_ue_id;
4602     IF(unit_effectivity_id_csr%NOTFOUND)THEN
4603        FND_MESSAGE.SET_NAME(G_APP_NAME, 'AHL_PRD_DF_APPR_INV_DF');
4604        FND_MESSAGE.SET_TOKEN('DEFERRAL_ID',p_unit_deferral_id);
4605        FND_MSG_PUB.ADD;
4606        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
4607 		   fnd_log.string
4608 		   (
4609 			        fnd_log.level_unexpected,
4610 			        'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
4611 			        'Deferral record details not found for unit deferral id : ' || p_unit_deferral_id
4612 		   );
4613       END IF;
4614       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4615     ELSE
4616       IF(l_mr_header_id IS NOT NULL) THEN
4617         l_deferral_type := 'MR';
4618       ELSE
4619         l_deferral_type := 'SR';
4620         OPEN get_ue_sr_details (l_unit_effectivity_id);
4621 	      FETCH get_ue_sr_details INTO l_ue_obj_type, l_cs_incident_id, l_cs_incident_number, l_cs_incident_ovn;
4622 	      CLOSE get_ue_sr_details;
4623         OPEN is_sr_ue_nonserial(l_unit_effectivity_id);
4624         FETCH is_sr_ue_nonserial INTO l_serial_number;
4625         CLOSE is_sr_ue_nonserial;
4626 
4627         IF (l_ue_obj_type IS NOT NULL AND l_ue_obj_type = 'SR' AND p_new_status IS NOT NULL
4628            AND p_new_status IN ('DEFERRED','CANCELLED'))	THEN
4629 		       IF NOT (l_cs_incident_id IS NOT NULL AND l_cs_incident_id > 0)		THEN
4630 			        FND_MESSAGE.SET_NAME(G_APP_NAME, 'AHL_UMP_INVALID_INCIDENT_ID');
4631 			        FND_MESSAGE.SET_TOKEN('INCIDENT_ID', l_cs_incident_id);
4632 			        FND_MSG_PUB.ADD;
4633 			        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
4634 			        fnd_log.string
4635 			        (
4636 				        fnd_log.level_unexpected,	'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
4637 				       'Wrong SR incident id: ' || l_cs_incident_id
4638 			        );
4639 			        END IF;
4640 			        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4641               CLOSE unit_effectivity_id_csr;
4642 			        RETURN;
4643 		       END IF;
4644            -- Support for cancelled SRs.
4645            IF (p_new_status = 'CANCELLED' AND l_serial_number IS NULL)  THEN
4646               l_status_id := FND_PROFILE.VALUE('AHL_PRD_SR_CANCELLED_STATUS');
4647               IF (l_status_id IS NULL) THEN
4648                       l_status_id := 2; -- closed.
4649                END IF;
4650            ELSE -- Deferred
4651                l_status_id := 1; -- open.
4652            END IF;
4653            -- Call SR Update_Status API
4654            CS_ServiceRequest_PUB.Update_Status
4655            (
4656             p_api_version 			=> 2.0,
4657             p_init_msg_list 		=> FND_API.G_FALSE,
4658             p_commit 			=> FND_API.G_FALSE,
4659             p_resp_appl_id 			=> NULL,
4660             p_resp_id 			=> NULL,
4661             p_user_id 			=> NULL,
4662             p_login_id 			=> NULL,
4663             --p_status_id 			=> 1,   --OPEN
4664             p_status_id 			=> l_status_id,
4665             p_closed_date 			=> NULL,
4666             p_audit_comments 		=> NULL,
4667             p_called_by_workflow 		=> FND_API.G_FALSE,
4668             p_workflow_process_id 		=> NULL,
4669             p_comments 			=> NULL,
4670             p_public_comment_flag 		=> FND_API.G_FALSE,
4671             p_validate_sr_closure 		=> 'N',
4672             p_auto_close_child_entities 	=> 'N',
4673             p_request_id 			=> NULL,
4674             p_request_number 		=> l_cs_incident_number,
4675             x_return_status 		=> l_return_status,
4676             x_msg_count 			=> l_msg_count,
4677             x_msg_data 			=> l_msg_data,
4678             p_object_version_number 	=> l_cs_incident_ovn,
4679             --			p_status 			=> 'OPEN',
4680             x_interaction_id 		=> l_interaction_id
4681            );
4682 
4683 		       -- Abort if any error in calling the SR Update_Status API...
4684 		       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS)		THEN
4685 			       x_return_status := l_return_status;
4686 			       RETURN;
4687 		       END IF;
4688         END IF;
4689       END IF;
4690     END IF;
4691     CLOSE unit_effectivity_id_csr;
4692 
4693     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4694 		   fnd_log.string
4695 		   (
4696 			        fnd_log.level_statement,
4697 			        'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
4698 			        'x_return_status : ' || x_return_status
4699 		   );
4700        fnd_log.string
4701 		   (
4702 			        fnd_log.level_statement,
4703 			        'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
4704 			        'p_new_status : ' || p_new_status
4705 		   );
4706        fnd_log.string
4707 		   (
4708 			        fnd_log.level_statement,
4709 			        'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
4710 			        'p_approval_result_code : ' || p_approval_result_code
4711 		   );
4712 
4713       END IF;
4714 
4715     IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
4716        RETURN;
4717     END IF;
4718 
4719     IF(p_approval_result_code = G_DEFERRAL_APPROVED)THEN
4720       -- clean up prior deferrals
4721       process_prior_ump_deferrals(l_unit_effectivity_id);
4722       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4723 		   fnd_log.string
4724 		   (
4725 			        fnd_log.level_statement,
4726 			        'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
4727 			        'l_deferral_type : ' || l_deferral_type
4728 		   );
4729        fnd_log.string
4730 		   (
4731 			        fnd_log.level_statement,
4732 			        'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
4733 			        'l_manually_planned_flag : ' || l_manually_planned_flag
4734 		   );
4735       END IF;
4736       l_manually_planned_flag := NVL(l_manually_planned_flag,G_NO_FLAG);
4737       -- get relationship tree snapshot
4738       IF(p_new_status = 'DEFERRED' OR (l_deferral_type = 'MR' AND l_manually_planned_flag = G_NO_FLAG AND p_new_status = 'CANCELLED')
4739         OR (l_deferral_type = 'SR' AND p_new_status = 'CANCELLED' AND l_serial_number IS NOT NULL))THEN
4740        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4741 		    fnd_log.string
4742 		    (
4743 			        fnd_log.level_statement,
4744 			        'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
4745 			        'copying child tree : '
4746 		    );
4747        END IF;
4748        FOR ue_relns_rec IN ue_relns_csr(l_unit_effectivity_id) LOOP
4749            l_ue_relns_tbl(i).ue_id := ue_relns_rec.ue_id;
4750            l_ue_relns_tbl(i).related_ue_id := ue_relns_rec.related_ue_id;
4751            l_ue_relns_tbl(i).originator_ue_id := ue_relns_rec.originator_ue_id;
4752            i := i + 1;
4753        END LOOP;
4754       END IF;
4755       -- Loop through old records.update its status and insert new ones, update ue relationships table
4756       FOR ue_rec IN unit_effectivity_csr(l_unit_effectivity_id) LOOP
4757 
4758        IF(p_new_status = 'DEFERRED' OR (l_deferral_type = 'MR' AND l_manually_planned_flag = G_NO_FLAG AND p_new_status = 'CANCELLED')
4759         OR (l_deferral_type = 'SR' AND p_new_status = 'CANCELLED' AND l_serial_number IS NOT NULL))THEN
4760         -- copy records here
4761         l_new_unit_effectivity_id := NULL;
4762         l_rowid := NULL;
4763 
4764         l_mr_header_id := ue_rec.mr_header_id;
4765         l_ue_status_code := NULL;
4766         IF(ue_rec.mr_header_id IS NOT NULL AND l_deferral_type = 'MR' AND ue_rec.unit_effectivity_id = l_unit_effectivity_id)THEN
4767          -- find whether deferral type is MR or SR
4768          -- if MR find whether active else pluggin new mr
4769          -- if SR, find the same for immediate children if any and repeat it for them
4770           AHL_PRD_DF_PVT.get_mr_termination_details(
4771           p_unit_effectivity_id   => l_unit_effectivity_id,
4772             x_mr_applicable         => l_mr_applicable,
4773             x_active_end_date      => l_active_end_date,
4774             x_new_mr_header_id     => l_new_mr_header_id,
4775             x_new_mr_applicable    => l_new_mr_applicable,
4776             x_return_status        => l_return_status,
4777             x_msg_count            => l_msg_count,
4778             x_msg_data             => l_msg_data);
4779           IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) 	THEN
4780              x_return_status := l_return_status;
4781              RETURN;
4782           ELSE
4783             IF(l_mr_applicable = FND_API.G_FALSE AND l_new_mr_applicable = FND_API.G_TRUE)THEN
4784               l_mr_header_id := l_new_mr_header_id;
4785             ELSIF (l_mr_applicable = FND_API.G_FALSE AND l_new_mr_applicable = FND_API.G_FALSE)THEN
4786               l_ue_status_code := 'MR-TERMINATE';
4787             END IF;
4788           END IF;
4789         ELSIF(ue_rec.mr_header_id IS NOT NULL AND l_deferral_type = 'SR') THEN
4790            -- verify whether immediate child if yes/expired mr pluggin new MR
4791            OPEN immediate_child_check_csr(l_unit_effectivity_id,ue_rec.unit_effectivity_id);
4792            FETCH immediate_child_check_csr INTO l_junc;
4793            IF(immediate_child_check_csr%FOUND)THEN
4794              AHL_PRD_DF_PVT.get_mr_termination_details(
4795               p_unit_effectivity_id   => ue_rec.unit_effectivity_id,
4796               x_mr_applicable         => l_mr_applicable,
4797               x_active_end_date      => l_active_end_date,
4798               x_new_mr_header_id     => l_new_mr_header_id,
4799               x_new_mr_applicable    => l_new_mr_applicable,
4800               x_return_status        => l_return_status,
4801               x_msg_count            => l_msg_count,
4802               x_msg_data             => l_msg_data);
4803              IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) 	THEN
4804                x_return_status := l_return_status;
4805                RETURN;
4806             ELSE
4807               IF(l_mr_applicable = FND_API.G_FALSE AND l_new_mr_applicable = FND_API.G_TRUE)THEN
4808                 l_mr_header_id := l_new_mr_header_id;
4809               ELSIF (l_mr_applicable = FND_API.G_FALSE AND l_new_mr_applicable = FND_API.G_FALSE)THEN
4810                 l_ue_status_code := 'MR-TERMINATE';
4811               END IF;
4812             END IF;
4813            END IF;
4814            CLOSE immediate_child_check_csr;
4815         END IF;
4816 
4817         IF ((l_deferral_type = 'MR' AND l_manually_planned_flag = G_NO_FLAG AND p_new_status = 'CANCELLED') OR
4818            (l_deferral_type = 'SR' AND p_new_status = 'CANCELLED' AND l_serial_number IS NOT NULL))THEN
4819            l_new_defer_from_ue_id := l_curr_defer_from_ue_id;
4820         ELSE
4821            l_new_defer_from_ue_id := l_unit_effectivity_id;
4822         END IF;
4823 
4824         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4825 		    fnd_log.string
4826 		    (
4827 			        fnd_log.level_statement,
4828 			        'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
4829 			        'inserting new UMP :l_new_defer_from_ue_id : ' || l_new_defer_from_ue_id
4830 		    );
4831         END IF;
4832         -- these attributes need to be copied in this case
4833         IF(l_deferral_type = 'MR' AND l_manually_planned_flag = G_NO_FLAG AND p_new_status = 'CANCELLED')THEN
4834          l_FORECAST_SEQUENCE := ue_rec.FORECAST_SEQUENCE ;
4835          l_TOLERANCE_FLAG := ue_rec.TOLERANCE_FLAG ;
4836          l_PRECEDING_UE_ID := ue_rec.PRECEDING_UE_ID ;
4837          l_DUE_DATE := ue_rec.DUE_DATE ;
4838          l_EARLIEST_DUE_DATE := ue_rec.EARLIEST_DUE_DATE ;
4839          l_LATEST_DUE_DATE := ue_rec.LATEST_DUE_DATE ;
4840          l_DUE_COUNTER_VALUE  := ue_rec.DUE_COUNTER_VALUE ;
4841          l_MR_EFFECTIVITY_ID := ue_rec.MR_EFFECTIVITY_ID ;
4842          l_MR_INTERVAL_ID := ue_rec.MR_INTERVAL_ID ;
4843          l_DATE_RUN := ue_rec.DATE_RUN ;
4844          IF(ue_rec.status_code = 'INIT-DUE' AND NVL(l_ue_status_code,'x') <> 'MR-TERMINATE')THEN
4845            l_ue_status_code := ue_rec.status_code;
4846          END IF;
4847        ELSE
4848          l_FORECAST_SEQUENCE := NULL;
4849          l_TOLERANCE_FLAG  := NULL;
4850          l_PRECEDING_UE_ID  := NULL;
4851          l_DUE_DATE  := NULL;
4852          l_EARLIEST_DUE_DATE  := NULL;
4853          l_LATEST_DUE_DATE  := NULL;
4854          l_DUE_COUNTER_VALUE   := NULL;
4855          l_MR_EFFECTIVITY_ID  := NULL;
4856          l_MR_INTERVAL_ID := NULL;
4857          l_DATE_RUN := NULL;
4858        END IF;
4859 
4860         AHL_UNIT_EFFECTIVITIES_PKG.Insert_Row (
4861             X_ROWID                 => l_rowid,
4862             X_UNIT_EFFECTIVITY_ID   => l_new_unit_effectivity_id,
4863             X_CSI_ITEM_INSTANCE_ID  => ue_rec.csi_item_instance_id,
4864             X_MR_HEADER_ID          => l_mr_header_id,--ue_rec.mr_header_id,
4865             X_REPETITIVE_MR_FLAG    => ue_rec.repetitive_mr_flag,
4866             X_REMARKS               => ue_rec.remarks,
4867             X_SERVICE_LINE_ID       => ue_rec.service_line_id,
4868             X_PROGRAM_MR_HEADER_ID  => ue_rec.program_mr_header_id,
4869             X_CS_INCIDENT_ID        => ue_rec.cs_incident_id,
4870             X_DEFER_FROM_UE_ID      => l_new_defer_from_ue_id,--l_unit_effectivity_id,
4871             X_ORIG_DEFERRAL_UE_ID   => NULL,
4872             X_QA_COLLECTION_ID      => NULL, --ue_rec.qa_collection_id,
4873             X_MR_INTERVAL_ID        => l_MR_INTERVAL_ID,
4874             X_MR_EFFECTIVITY_ID     => l_MR_EFFECTIVITY_ID,
4875             X_STATUS_CODE           => l_ue_status_code,--null,
4876             X_DUE_DATE              => l_DUE_DATE,
4877             X_DUE_COUNTER_VALUE     => l_DUE_COUNTER_VALUE,
4878             X_FORECAST_SEQUENCE     => l_FORECAST_SEQUENCE,
4879             X_TOLERANCE_FLAG        => l_TOLERANCE_FLAG,
4880             X_MESSAGE_CODE          => null,
4881             X_PRECEDING_UE_ID       => l_PRECEDING_UE_ID,
4882             X_DATE_RUN              => l_DATE_RUN,
4883             X_SET_DUE_DATE          => null,
4884             X_ACCOMPLISHED_DATE     => null,
4885             X_CANCEL_REASON_CODE    => null,
4886             X_EARLIEST_DUE_DATE     => l_EARLIEST_DUE_DATE,
4887             X_LATEST_DUE_DATE       => l_LATEST_DUE_DATE,
4888             x_attribute_category => ue_rec.ATTRIBUTE_CATEGORY,
4889             x_attribute1 => ue_rec.ATTRIBUTE1,
4890             x_attribute2 => ue_rec.ATTRIBUTE2,
4891             x_attribute3 => ue_rec.ATTRIBUTE3,
4892             x_attribute4 => ue_rec.ATTRIBUTE4,
4893             x_attribute5 => ue_rec.ATTRIBUTE5,
4894             x_attribute6 => ue_rec.ATTRIBUTE6,
4895             x_attribute7 => ue_rec.ATTRIBUTE7,
4896             x_attribute8 => ue_rec.ATTRIBUTE8,
4897             x_attribute9 => ue_rec.ATTRIBUTE9,
4898             x_attribute10 => ue_rec.ATTRIBUTE10,
4899             x_attribute11 => ue_rec.ATTRIBUTE11,
4900             x_attribute12 => ue_rec.ATTRIBUTE12,
4901             x_attribute13 => ue_rec.ATTRIBUTE13,
4902             x_attribute14 => ue_rec.ATTRIBUTE14,
4903             x_attribute15 => ue_rec.ATTRIBUTE15,
4904             X_OBJECT_VERSION_NUMBER => 1,
4905             X_APPLICATION_USG_CODE  => RTRIM(LTRIM(FND_PROFILE.VALUE('AHL_APPLN_USAGE'))),
4906             X_OBJECT_TYPE           => ue_rec.object_type,
4907             X_MANUALLY_PLANNED_FLAG => ue_rec.manually_planned_flag,
4908             X_COUNTER_ID            => ue_rec.counter_id,
4909             X_LOG_SERIES_CODE       => ue_rec.log_series_code,
4910             X_LOG_SERIES_NUMBER     => ue_rec.log_series_number,
4911             X_FLIGHT_NUMBER         => ue_rec.flight_number,
4912             X_MEL_CDL_TYPE_CODE     => ue_rec.mel_cdl_type_code,
4913             X_POSITION_PATH_ID      => ue_rec.position_path_id,
4914             X_ATA_CODE              => ue_rec.ATA_CODE,
4915             X_UNIT_CONFIG_HEADER_ID => ue_rec.unit_config_header_id,
4916             X_CREATION_DATE         => sysdate,
4917             X_CREATED_BY            => fnd_global.user_id,
4918             X_LAST_UPDATE_DATE      => sysdate,
4919             X_LAST_UPDATED_BY       => fnd_global.user_id,
4920             X_LAST_UPDATE_LOGIN     => fnd_global.login_id );
4921 
4922             -- copy originating WO id seperately as table handler does not support it.
4923             UPDATE ahl_unit_effectivities_b
4924             SET originating_wo_id = ue_rec.originating_wo_id,
4925                 -- added for SB Enh
4926                 accomplish_trigger_type = ue_rec.accomplish_trigger_type,
4927                 start_lc_ue_id = ue_rec.start_lc_ue_id,
4928                 loop_chain_seq_num = ue_rec.loop_chain_seq_num
4929             WHERE ROWID = l_rowid;
4930 
4931             IF(ue_rec.unit_effectivity_id = l_unit_effectivity_id)THEN
4932                l_new_parent_ue_id := l_new_unit_effectivity_id;
4933             END IF;
4934 
4935             -- update l_ue_relns_tbl with the new unit effectivity id
4936             IF(l_ue_relns_tbl.count > 0)THEN
4937                FOR j IN l_ue_relns_tbl.FIRST..l_ue_relns_tbl.LAST  LOOP
4938                     IF(l_ue_relns_tbl(j).ue_id = ue_rec.unit_effectivity_id)THEN
4939                        l_ue_relns_tbl(j).ue_id := l_new_unit_effectivity_id;
4940                     END IF;
4941                     IF(l_ue_relns_tbl(j).related_ue_id = ue_rec.unit_effectivity_id)THEN
4942                        l_ue_relns_tbl(j).related_ue_id := l_new_unit_effectivity_id;
4943                     END IF;
4944                END LOOP;
4945             END IF;
4946           END IF;--
4947 
4948           IF(ue_rec.status_code IS NULL OR ue_rec.status_code IN ('INIT-DUE','DEFERRED','TERMINATED','CANCELLED','MR-TERMINATE'))THEN
4949              l_update_status := p_new_status;
4950           ELSE
4951              l_update_status := ue_rec.status_code;
4952           END IF;
4953           -- update thresholds
4954           IF(l_deferral_type = 'MR' AND l_manually_planned_flag = G_NO_FLAG AND p_new_status = 'CANCELLED')THEN
4955             OPEN is_initdue_def(ue_rec.unit_effectivity_id);
4956             FETCH is_initdue_def INTO l_init_due_deferral_id;
4957             IF is_initdue_def%FOUND THEN
4958               UPDATE AHL_UNIT_DEFERRALS_B
4959               SET unit_effectivity_id = l_new_unit_effectivity_id,
4960                   LAST_UPDATE_DATE = sysdate,
4961                   LAST_UPDATED_BY = fnd_global.user_id,
4962                   LAST_UPDATE_LOGIN  = fnd_global.login_id
4963               WHERE unit_deferral_id = l_init_due_deferral_id;
4964             END IF;
4965             CLOSE is_initdue_def;
4966           END IF;
4967           -- update status here
4968           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
4969 		       fnd_log.string
4970 		       (
4971 			        fnd_log.level_statement,
4972 			        'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
4973 			        'updating UMP :l_update_status : ' || l_update_status
4974 		       );
4975           END IF;
4976           AHL_UNIT_EFFECTIVITIES_PKG.update_row(
4977             x_unit_effectivity_id => ue_rec.UNIT_EFFECTIVITY_ID,
4978             x_csi_item_instance_id => ue_rec.CSI_ITEM_INSTANCE_ID,
4979             x_mr_interval_id => ue_rec.MR_INTERVAL_ID,
4980             x_mr_effectivity_id => ue_rec.MR_EFFECTIVITY_ID,
4981             x_mr_header_id => ue_rec.MR_HEADER_ID,
4982             x_status_code => l_update_status,
4983             x_due_date => ue_rec.DUE_DATE,
4984             x_due_counter_value => ue_rec.DUE_COUNTER_VALUE,
4985             x_forecast_sequence => ue_rec.FORECAST_SEQUENCE,
4986             x_repetitive_mr_flag => ue_rec.REPETITIVE_MR_FLAG,
4987             x_tolerance_flag => ue_rec.TOLERANCE_FLAG,
4988             x_remarks => ue_rec.REMARKS,
4989             x_message_code => ue_rec.MESSAGE_CODE,
4990             x_preceding_ue_id => ue_rec.PRECEDING_UE_ID,
4991             x_date_run => ue_rec.DATE_RUN,
4992             x_set_due_date => ue_rec.set_due_date,
4993             x_accomplished_date => ue_rec.accomplished_date,
4994             x_service_line_id   => ue_rec.service_line_id,
4995             x_program_mr_header_id => ue_rec.program_mr_header_id,
4996             x_cancel_reason_code   => ue_rec.cancel_reason_code,
4997             x_earliest_due_date    => ue_rec.earliest_due_date,
4998             x_latest_due_date      => ue_rec.latest_due_date,
4999             x_defer_from_ue_id     => ue_rec.defer_from_ue_id,
5000             x_qa_collection_id     => ue_rec.qa_collection_id,
5001             x_cs_incident_id       => ue_rec.cs_incident_id,
5002             x_orig_deferral_ue_id  => ue_rec.orig_deferral_ue_id,
5003             X_APPLICATION_USG_CODE  => RTRIM(LTRIM(FND_PROFILE.VALUE('AHL_APPLN_USAGE'))),
5004             X_COUNTER_ID            => ue_rec.counter_id,
5005             X_OBJECT_TYPE           => ue_rec.object_type,
5006             X_MANUALLY_PLANNED_FLAG => ue_rec.manually_planned_flag,
5007             X_LOG_SERIES_CODE       => ue_rec.log_series_code,
5008             X_LOG_SERIES_NUMBER     => ue_rec.log_series_number,
5009             X_FLIGHT_NUMBER         => ue_rec.flight_number,
5010             X_MEL_CDL_TYPE_CODE     => ue_rec.mel_cdl_type_code,
5011             X_POSITION_PATH_ID      => ue_rec.position_path_id,
5012             X_ATA_CODE              => ue_rec.ATA_CODE,
5013             X_UNIT_CONFIG_HEADER_ID  => ue_rec.unit_config_header_id,
5014             x_attribute_category => ue_rec.ATTRIBUTE_CATEGORY,
5015             x_attribute1 => ue_rec.ATTRIBUTE1,
5016             x_attribute2 => ue_rec.ATTRIBUTE2,
5017             x_attribute3 => ue_rec.ATTRIBUTE3,
5018             x_attribute4 => ue_rec.ATTRIBUTE4,
5019             x_attribute5 => ue_rec.ATTRIBUTE5,
5020             x_attribute6 => ue_rec.ATTRIBUTE6,
5021             x_attribute7 => ue_rec.ATTRIBUTE7,
5022             x_attribute8 => ue_rec.ATTRIBUTE8,
5023             x_attribute9 => ue_rec.ATTRIBUTE9,
5024             x_attribute10 => ue_rec.ATTRIBUTE10,
5025             x_attribute11 => ue_rec.ATTRIBUTE11,
5026             x_attribute12 => ue_rec.ATTRIBUTE12,
5027             x_attribute13 => ue_rec.ATTRIBUTE13,
5028             x_attribute14 => ue_rec.ATTRIBUTE14,
5029             x_attribute15 => ue_rec.ATTRIBUTE15,
5030             x_object_version_number => ue_rec.OBJECT_VERSION_NUMBER + 1,
5031             x_last_update_date => sysdate,
5032             x_last_updated_by => fnd_global.user_id,
5033             x_last_update_login => fnd_global.login_id
5034          );
5035       END LOOP;
5036       -- create tree here
5037       IF (l_ue_relns_tbl.count > 0 AND (p_new_status = 'DEFERRED' OR (l_deferral_type = 'MR' AND l_manually_planned_flag = G_NO_FLAG AND p_new_status = 'CANCELLED')
5038         OR (l_deferral_type = 'SR' AND p_new_status = 'CANCELLED' AND l_serial_number IS NOT NULL)))THEN
5039         FOR k IN l_ue_relns_tbl.FIRST..l_ue_relns_tbl.LAST  LOOP
5040           -- Insert into ahl_ue_relationships.
5041           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5042 		       fnd_log.string
5043 		       (
5044 			        fnd_log.level_statement,
5045 			        'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan',
5046 			        'inserting Relationships :l_ue_relns_tbl.count : ' || l_ue_relns_tbl.count
5047 		       );
5048           END IF;
5049           AHL_UE_RELATIONSHIPS_PKG.Insert_Row(
5050             X_UE_RELATIONSHIP_ID => l_ue_relationship_id,
5051             X_UE_ID              => l_ue_relns_tbl(k).ue_id,
5052             X_RELATED_UE_ID      => l_ue_relns_tbl(k).related_ue_id,
5053             X_RELATIONSHIP_CODE  => 'PARENT',
5054             X_ORIGINATOR_UE_ID   => l_new_parent_ue_id,
5055             X_ATTRIBUTE_CATEGORY => null,
5056             X_ATTRIBUTE1 => null,
5057             X_ATTRIBUTE2 => null,
5058             X_ATTRIBUTE3 => null,
5059             X_ATTRIBUTE4 => null,
5060             X_ATTRIBUTE5 => null,
5061             X_ATTRIBUTE6 => null,
5062             X_ATTRIBUTE7 => null,
5063             X_ATTRIBUTE8 => null,
5064             X_ATTRIBUTE9 => null,
5065             X_ATTRIBUTE10 => null,
5066             X_ATTRIBUTE11 => null,
5067             X_ATTRIBUTE12 => null,
5068             X_ATTRIBUTE13 => null,
5069             X_ATTRIBUTE14 => null,
5070             X_ATTRIBUTE15 => null,
5071             X_OBJECT_VERSION_NUMBER => 1,
5072             X_LAST_UPDATE_DATE => sysdate,
5073             X_LAST_UPDATED_BY  => fnd_global.user_id,
5074             X_CREATION_DATE => sysdate,
5075             X_CREATED_BY  => fnd_global.user_id,
5076             X_LAST_UPDATE_LOGIN => fnd_global.login_id);
5077         END LOOP;
5078       END IF;
5079       /* Insert SR update status call here after making sure that object type is 'SR' for p_unit_effectivity_id
5080       * This call should be made only when p_new_status = 'DEFERRED' as SR can not be terminated
5081       * IF SR need to be updated even when deferral has been rejected then make the same call in ELSIF
5082       * statement below
5083       */
5084     ELSIF(p_approval_result_code IN (G_DEFERRAL_INITIATED,G_DEFERRAL_REJECTED))THEN
5085       IF(p_approval_result_code = G_DEFERRAL_INITIATED)THEN
5086          l_orig_deferral_ue_id := l_unit_effectivity_id;
5087       ELSE
5088          l_orig_deferral_ue_id := NULL;
5089       END IF;
5090 
5091       FOR ue_rec IN unit_effectivity_csr(l_unit_effectivity_id) LOOP
5092          --update applicable unit deferral id for all children
5093          -- and removing it if deferral got rejected.
5094          IF(ue_rec.UNIT_EFFECTIVITY_ID <> l_unit_effectivity_id)THEN
5095             -- update status here
5096             AHL_UNIT_EFFECTIVITIES_PKG.update_row(
5097             x_unit_effectivity_id => ue_rec.UNIT_EFFECTIVITY_ID,
5098             x_csi_item_instance_id => ue_rec.CSI_ITEM_INSTANCE_ID,
5099             x_mr_interval_id => ue_rec.MR_INTERVAL_ID,
5100             x_mr_effectivity_id => ue_rec.MR_EFFECTIVITY_ID,
5101             x_mr_header_id => ue_rec.MR_HEADER_ID,
5102             x_status_code => ue_rec.status_code,
5103             x_due_date => ue_rec.DUE_DATE,
5104             x_due_counter_value => ue_rec.DUE_COUNTER_VALUE,
5105             x_forecast_sequence => ue_rec.FORECAST_SEQUENCE,
5106             x_repetitive_mr_flag => ue_rec.REPETITIVE_MR_FLAG,
5107             x_tolerance_flag => ue_rec.TOLERANCE_FLAG,
5108             x_remarks => ue_rec.REMARKS,
5109             x_message_code => ue_rec.MESSAGE_CODE,
5110             x_preceding_ue_id => ue_rec.PRECEDING_UE_ID,
5111             x_date_run => ue_rec.DATE_RUN,
5112             x_set_due_date => ue_rec.set_due_date,
5113             x_accomplished_date => ue_rec.accomplished_date,
5114             x_service_line_id   => ue_rec.service_line_id,
5115             x_program_mr_header_id => ue_rec.program_mr_header_id,
5116             x_cancel_reason_code   => ue_rec.cancel_reason_code,
5117             x_earliest_due_date    => ue_rec.earliest_due_date,
5118             x_latest_due_date      => ue_rec.latest_due_date,
5119             x_defer_from_ue_id     => ue_rec.defer_from_ue_id,
5120             x_qa_collection_id     => ue_rec.qa_collection_id,
5121             x_cs_incident_id       => ue_rec.cs_incident_id,
5122             x_orig_deferral_ue_id  => l_orig_deferral_ue_id,
5123             X_APPLICATION_USG_CODE  => RTRIM(LTRIM(FND_PROFILE.VALUE('AHL_APPLN_USAGE'))),
5124             X_OBJECT_TYPE           => ue_rec.object_type,
5125             X_MANUALLY_PLANNED_FLAG => ue_rec.manually_planned_flag,
5126             X_COUNTER_ID            => ue_rec.counter_id,
5127             X_LOG_SERIES_CODE       => ue_rec.log_series_code,
5128             X_LOG_SERIES_NUMBER     => ue_rec.log_series_number,
5129             X_FLIGHT_NUMBER         => ue_rec.flight_number,
5130             X_MEL_CDL_TYPE_CODE     => ue_rec.mel_cdl_type_code,
5131             X_POSITION_PATH_ID      => ue_rec.position_path_id,
5132             X_ATA_CODE              => ue_rec.ATA_CODE,
5133             X_UNIT_CONFIG_HEADER_ID  => ue_rec.unit_config_header_id,
5134             x_attribute_category => ue_rec.ATTRIBUTE_CATEGORY,
5135             x_attribute1 => ue_rec.ATTRIBUTE1,
5136             x_attribute2 => ue_rec.ATTRIBUTE2,
5137             x_attribute3 => ue_rec.ATTRIBUTE3,
5138             x_attribute4 => ue_rec.ATTRIBUTE4,
5139             x_attribute5 => ue_rec.ATTRIBUTE5,
5140             x_attribute6 => ue_rec.ATTRIBUTE6,
5141             x_attribute7 => ue_rec.ATTRIBUTE7,
5142             x_attribute8 => ue_rec.ATTRIBUTE8,
5143             x_attribute9 => ue_rec.ATTRIBUTE9,
5144             x_attribute10 => ue_rec.ATTRIBUTE10,
5145             x_attribute11 => ue_rec.ATTRIBUTE11,
5146             x_attribute12 => ue_rec.ATTRIBUTE12,
5147             x_attribute13 => ue_rec.ATTRIBUTE13,
5148             x_attribute14 => ue_rec.ATTRIBUTE14,
5149             x_attribute15 => ue_rec.ATTRIBUTE15,
5150             x_object_version_number => ue_rec.OBJECT_VERSION_NUMBER + 1,
5151             x_last_update_date => sysdate,
5152             x_last_updated_by => fnd_global.user_id,
5153             x_last_update_login => fnd_global.login_id);
5154          END IF;
5155      END LOOP;
5156    END IF;
5157 
5158    IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)	THEN
5159 		fnd_log.string
5160 		(
5161 			fnd_log.level_procedure,
5162 			'ahl.plsql.AHL_PRD_DF_PVT.process_unit_maint_plan.end',
5163 			'At the end of PLSQL procedure'
5164 		);
5165    END IF;
5166 
5167 END process_unit_maint_plan;
5168 
5169 -------------------------------------------------------------------------
5170 -------------------------------------------------------------------------
5171 PROCEDURE process_prior_ump_deferrals(
5172           p_unit_effectivity_id  IN             NUMBER) IS
5173 
5174     CURSOR prior_child_defer_to_ue_csr(p_unit_effectivity_id  IN  NUMBER) IS
5175     SELECT UE.unit_effectivity_id FROM ahl_unit_effectivities_b UE
5176     WHERE defer_from_ue_id IS NOT NULL
5177     --AND NOT EXISTS (Select 'x' from ahl_visit_tasks_b VST where VST.unit_effectivity_id = UE.unit_effectivity_id)
5178     AND defer_from_ue_id IN (
5179       SELECT related_ue_id
5180       FROM   AHL_UE_RELATIONSHIPS
5181       WHERE  relationship_code = 'PARENT'
5182       START WITH ue_id = p_unit_effectivity_id
5183       CONNECT BY ue_id = PRIOR related_ue_id
5184     );
5185 
5186     CURSOR assigned_to_visit_csr(p_unit_effectivity_id  IN  NUMBER) IS
5187     SELECT 'x' FROM ahl_visit_tasks_b VST
5188     WHERE VST.unit_effectivity_id = p_unit_effectivity_id;
5189 
5190     l_exists VARCHAR2(1);
5191 
5192     CURSOR ue_rel_id_csr(p_unit_effectivity_id  IN  NUMBER) IS
5193     SELECT ue_relationship_id FROM   AHL_UE_RELATIONSHIPS
5194     WHERE  relationship_code = 'PARENT'
5195     AND related_ue_id = p_unit_effectivity_id;
5196 
5197     l_ue_relationship_id  NUMBER;
5198 
5199     CURSOR unit_effectivity_csr (p_unit_effectivity_id IN NUMBER) IS
5200     SELECT
5201       UNIT_EFFECTIVITY_ID, OBJECT_VERSION_NUMBER, CSI_ITEM_INSTANCE_ID, MR_INTERVAL_ID,
5202       MR_EFFECTIVITY_ID, MR_HEADER_ID, STATUS_CODE, SET_DUE_DATE, ACCOMPLISHED_DATE,
5203       DUE_DATE, DUE_COUNTER_VALUE, FORECAST_SEQUENCE, REPETITIVE_MR_FLAG,
5204       TOLERANCE_FLAG, DATE_RUN, PRECEDING_UE_ID, MESSAGE_CODE, REMARKS,
5205       SERVICE_LINE_ID, PROGRAM_MR_HEADER_ID, CANCEL_REASON_CODE, EARLIEST_DUE_DATE,
5206       LATEST_DUE_DATE, DEFER_FROM_UE_ID, CS_INCIDENT_ID, QA_COLLECTION_ID,
5207       ORIG_DEFERRAL_UE_ID, COUNTER_ID,OBJECT_TYPE,MANUALLY_PLANNED_FLAG,
5208       LOG_SERIES_CODE,LOG_SERIES_NUMBER,FLIGHT_NUMBER, MEL_CDL_TYPE_CODE,
5209       POSITION_PATH_ID, ATA_CODE, UNIT_CONFIG_HEADER_ID,
5210       ATTRIBUTE_CATEGORY, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3,
5211       ATTRIBUTE4, ATTRIBUTE5, ATTRIBUTE6, ATTRIBUTE7, ATTRIBUTE8,ATTRIBUTE9,
5212       ATTRIBUTE10, ATTRIBUTE11, ATTRIBUTE12, ATTRIBUTE13, ATTRIBUTE14,ATTRIBUTE15
5213     FROM  AHL_UNIT_EFFECTIVITIES_VL UE
5214     WHERE unit_effectivity_id = p_unit_effectivity_id;
5215 
5216     CURSOR redundant_deferral_ue_csr(p_unit_effectivity_id  IN  NUMBER) IS
5217     SELECT UD.unit_deferral_id FROM ahl_unit_deferrals_b UD
5218     WHERE UD.unit_deferral_type = 'DEFERRAL'
5219     AND UD.unit_effectivity_id IN (
5220       SELECT related_ue_id
5221       FROM   AHL_UE_RELATIONSHIPS
5222       WHERE  relationship_code = 'PARENT'
5223       START WITH ue_id = p_unit_effectivity_id
5224       CONNECT BY ue_id = PRIOR related_ue_id
5225     )
5226     AND NOT EXISTS (
5227       SELECT 'x' FROM ahl_unit_effectivities_b
5228       WHERE defer_from_ue_id  = UD.unit_effectivity_id
5229     );
5230 
5231     CURSOR redundant_threshold_csr(p_unit_deferral_id IN NUMBER) IS
5232     SELECT unit_threshold_id FROM ahl_unit_thresholds
5233     WHERE unit_deferral_id = p_unit_deferral_id;
5234 
5235 
5236 BEGIN
5237     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5238 		fnd_log.string
5239 		(
5240 			fnd_log.level_procedure,
5241 			'ahl.plsql.AHL_PRD_DF_PVT.process_prior_ump_deferrals.begin',
5242 			'At the start of PLSQL procedure'
5243 		);
5244     END IF;
5245 
5246     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5247 		fnd_log.string
5248 		(
5249 			fnd_log.level_statement,
5250 			'ahl.plsql.AHL_PRD_DF_PVT.process_prior_ump_deferrals',
5251 			'deleting redundant ue, relationships and marking as exception if assigned to visit'
5252 		);
5253     END IF;
5254 
5255     FOR ue_id_rec IN prior_child_defer_to_ue_csr(p_unit_effectivity_id) LOOP
5256        -- determine whether assigned to a visit
5257        OPEN assigned_to_visit_csr(ue_id_rec.unit_effectivity_id);
5258        FETCH assigned_to_visit_csr INTO l_exists;
5259        IF(assigned_to_visit_csr%NOTFOUND)THEN
5260           -- if not assigned to a visit delete the ue rec and relationships
5261           AHL_UNIT_EFFECTIVITIES_PKG.delete_row(ue_id_rec.unit_effectivity_id);
5262           OPEN ue_rel_id_csr(ue_id_rec.unit_effectivity_id);
5263           FETCH ue_rel_id_csr INTO l_ue_relationship_id;
5264           IF(ue_rel_id_csr%FOUND) THEN
5265              AHL_UE_RELATIONSHIPS_PKG.delete_row(l_ue_relationship_id);
5266           END IF;
5267           CLOSE ue_rel_id_csr;
5268        ELSE -- assigned to visit -- mark as exception
5269           FOR ue_rec IN unit_effectivity_csr(ue_id_rec.unit_effectivity_id) LOOP
5270             -- update status
5271             AHL_UNIT_EFFECTIVITIES_PKG.update_row(
5272             x_unit_effectivity_id => ue_rec.UNIT_EFFECTIVITY_ID,
5273             x_csi_item_instance_id => ue_rec.CSI_ITEM_INSTANCE_ID,
5274             x_mr_interval_id => ue_rec.MR_INTERVAL_ID,
5275             x_mr_effectivity_id => ue_rec.MR_EFFECTIVITY_ID,
5276             x_mr_header_id => ue_rec.MR_HEADER_ID,
5277             x_status_code => 'EXCEPTION',
5278             x_due_date => ue_rec.DUE_DATE,
5279             x_due_counter_value => ue_rec.DUE_COUNTER_VALUE,
5280             x_forecast_sequence => ue_rec.FORECAST_SEQUENCE,
5281             x_repetitive_mr_flag => ue_rec.REPETITIVE_MR_FLAG,
5282             x_tolerance_flag => ue_rec.TOLERANCE_FLAG,
5283             x_remarks => ue_rec.REMARKS,
5284             x_message_code => ue_rec.MESSAGE_CODE,
5285             x_preceding_ue_id => ue_rec.PRECEDING_UE_ID,
5286             x_date_run => ue_rec.DATE_RUN,
5287             x_set_due_date => ue_rec.set_due_date,
5288             x_accomplished_date => ue_rec.accomplished_date,
5289             x_service_line_id   => ue_rec.service_line_id,
5290             x_program_mr_header_id => ue_rec.program_mr_header_id,
5291             x_cancel_reason_code   => ue_rec.cancel_reason_code,
5292             x_earliest_due_date    => ue_rec.earliest_due_date,
5293             x_latest_due_date      => ue_rec.latest_due_date,
5294             x_defer_from_ue_id     => ue_rec.defer_from_ue_id,
5295             x_qa_collection_id     => ue_rec.qa_collection_id,
5296             x_cs_incident_id       => ue_rec.cs_incident_id,
5297             x_orig_deferral_ue_id  => ue_rec.orig_deferral_ue_id,
5298             X_APPLICATION_USG_CODE  => RTRIM(LTRIM(FND_PROFILE.VALUE('AHL_APPLN_USAGE'))),
5299             X_OBJECT_TYPE           => ue_rec.object_type,
5300             X_MANUALLY_PLANNED_FLAG => ue_rec.manually_planned_flag,
5301             X_COUNTER_ID            => ue_rec.counter_id,
5302             X_LOG_SERIES_CODE       => ue_rec.log_series_code,
5303             X_LOG_SERIES_NUMBER     => ue_rec.log_series_number,
5304             X_FLIGHT_NUMBER         => ue_rec.flight_number,
5305             X_MEL_CDL_TYPE_CODE     => ue_rec.mel_cdl_type_code,
5306             X_POSITION_PATH_ID      => ue_rec.position_path_id,
5307             X_ATA_CODE              => ue_rec.ATA_CODE,
5308             X_UNIT_CONFIG_HEADER_ID  => ue_rec.unit_config_header_id,
5309             x_attribute_category => ue_rec.ATTRIBUTE_CATEGORY,
5310             x_attribute1 => ue_rec.ATTRIBUTE1,
5311             x_attribute2 => ue_rec.ATTRIBUTE2,
5312             x_attribute3 => ue_rec.ATTRIBUTE3,
5313             x_attribute4 => ue_rec.ATTRIBUTE4,
5314             x_attribute5 => ue_rec.ATTRIBUTE5,
5315             x_attribute6 => ue_rec.ATTRIBUTE6,
5316             x_attribute7 => ue_rec.ATTRIBUTE7,
5317             x_attribute8 => ue_rec.ATTRIBUTE8,
5318             x_attribute9 => ue_rec.ATTRIBUTE9,
5319             x_attribute10 => ue_rec.ATTRIBUTE10,
5320             x_attribute11 => ue_rec.ATTRIBUTE11,
5321             x_attribute12 => ue_rec.ATTRIBUTE12,
5322             x_attribute13 => ue_rec.ATTRIBUTE13,
5323             x_attribute14 => ue_rec.ATTRIBUTE14,
5324             x_attribute15 => ue_rec.ATTRIBUTE15,
5325             x_object_version_number => ue_rec.OBJECT_VERSION_NUMBER + 1,
5326             x_last_update_date => sysdate,
5327             x_last_updated_by => fnd_global.user_id,
5328             x_last_update_login => fnd_global.login_id);
5329           END LOOP;
5330        END IF;
5331        CLOSE assigned_to_visit_csr;
5332     END LOOP;
5333 
5334     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5335 		fnd_log.string
5336 		(
5337 			fnd_log.level_statement,
5338 			'ahl.plsql.AHL_PRD_DF_PVT.process_prior_ump_deferrals',
5339 			'deleting un-necessary deferral records'
5340 		);
5341     END IF;
5342 
5343     FOR redundant_deferral_rec IN redundant_deferral_ue_csr(p_unit_effectivity_id) LOOP
5344       FOR redundant_threshold_rec IN redundant_threshold_csr(redundant_deferral_rec.unit_deferral_id) LOOP
5345         AHL_UNIT_THRESHOLDS_PKG.delete_row(redundant_threshold_rec.unit_threshold_id);
5346       END LOOP;
5347       AHL_UNIT_DEFERRALS_PKG.delete_row(redundant_deferral_rec.unit_deferral_id);
5348     END LOOP;
5349 
5350 
5351     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5352 		fnd_log.string
5353 		(
5354 			fnd_log.level_procedure,
5355 			'ahl.plsql.AHL_PRD_DF_PVT.process_prior_ump_deferrals.end',
5356 			'At the end of PLSQL procedure'
5357 		);
5358      END IF;
5359 END process_prior_ump_deferrals;
5360 
5361 
5362 
5363 -------------------------------------------------------------------------
5364 -- Procedure to get deferral details attached to any unit effectivity --
5365 --------------------------------------------------------------------------
5366 PROCEDURE get_deferral_details (
5367 
5368     p_init_msg_list          IN          VARCHAR2  := FND_API.G_FALSE,
5369     p_unit_effectivity_id    IN          NUMBER,
5370 	x_df_header_info_rec     OUT NOCOPY  AHL_PRD_DF_PVT.df_header_info_rec_type,
5371     x_df_schedules_tbl       OUT NOCOPY  AHL_PRD_DF_PVT.df_schedules_tbl_type,
5372     x_return_status          OUT NOCOPY  VARCHAR2,
5373     x_msg_count              OUT NOCOPY  NUMBER,
5374     x_msg_data               OUT NOCOPY  VARCHAR2) IS
5375 
5376     l_api_name         CONSTANT VARCHAR2(30) := 'get_deferral_details';
5377 
5378     l_df_header_info_rec AHL_PRD_DF_PVT.df_header_info_rec_type;
5379     l_applicable_ue_id NUMBER;
5380 
5381     -- to fecth context information
5382     CURSOR context_info_csr(p_unit_effectivity_id IN NUMBER) IS
5383     SELECT due_date, mr_header_id,title,description,repetitive_mr_flag,cs_incident_id,cs_incident_number,
5384            cs_incident_summary,manually_planned_flag
5385     FROM ahl_ue_deferral_details_v
5386     WHERE unit_effectivity_id = p_unit_effectivity_id
5387     AND APPLICATION_USG_CODE = RTRIM(LTRIM(FND_PROFILE.VALUE('AHL_APPLN_USAGE'))) ;--this takes care of app_usage changes
5388 
5389     -- mr status meaning has to be fecthed seperately because function returns only code
5390     CURSOR mr_status_meaning_csr(p_status_code IN VARCHAR2)IS
5391     SELECT meaning FROM FND_LOOKUP_VALUES_VL
5392     WHERE lookup_code = p_status_code
5393     AND lookup_type = 'AHL_PRD_MR_STATUS';
5394 
5395     CURSOR ue_status_meaning_csr(p_status_code IN VARCHAR2)IS
5396     SELECT meaning FROM FND_LOOKUP_VALUES_VL
5397     WHERE lookup_code = p_status_code
5398     AND lookup_type = 'AHL_UNIT_EFFECTIVITY_STATUS';
5399 
5400     -- to fetch visit info
5401     CURSOR visit_info_csr(p_unit_effectivity_id IN NUMBER) IS
5402     SELECT VS.visit_id, VS.visit_number FROM ahl_visits_b VS,ahl_visit_tasks_b VST
5403     WHERE VST.visit_id = VS.visit_id
5404     AND VST.unit_effectivity_id = p_unit_effectivity_id;
5405 
5406      -- to check whether MR or any of its children has resettable counters
5407     CURSOR reset_counter_csr(p_unit_effectivity_id IN NUMBER) IS
5408     /* In R12, modified to use csi_counters_vl instead of csi_cp_counters_v.
5409     SELECT 'x' from csi_cp_counters_v CP, AHL_MR_INTERVALS_V MRI, AHL_MR_EFFECTIVITIES MRE, AHL_UNIT_EFFECTIVITIES_B UE
5410     WHERE CP.customer_product_id = UE.csi_item_instance_id
5411     AND CP.counter_name = MRI.counter_name
5412     AND MRI.reset_value IS NOT NULL
5413     AND MRI.mr_effectivity_id = MRE.mr_effectivity_id
5414     AND MRE.mr_header_id = UE.mr_header_id
5415     AND UE.unit_effectivity_id = p_unit_effectivity_id
5416     UNION
5417     SELECT 'x' from csi_cp_counters_v CP, AHL_MR_INTERVALS_V MRI, AHL_MR_EFFECTIVITIES MRE, AHL_UNIT_EFFECTIVITIES_B UE
5418     WHERE CP.customer_product_id = UE.csi_item_instance_id
5419     AND CP.counter_name = MRI.counter_name
5420     AND MRI.reset_value IS NOT NULL
5421     AND MRI.mr_effectivity_id = MRE.mr_effectivity_id
5422     AND MRE.mr_header_id = UE.mr_header_id
5423     AND UE.unit_effectivity_id IN
5424       (
5425 
5426          SELECT     related_ue_id
5427          FROM       AHL_UE_RELATIONSHIPS
5428          WHERE      relationship_code = 'PARENT'
5429          START WITH ue_id = p_unit_effectivity_id
5430          CONNECT BY ue_id = PRIOR related_ue_id
5431 
5432       );
5433     */
5434 
5435     SELECT 'x'
5436     from csi_counter_associations ca, csi_counters_vl CP, AHL_MR_INTERVALS_V MRI,
5437          AHL_MR_EFFECTIVITIES  MRE, AHL_UNIT_EFFECTIVITIES_B UE
5438     WHERE CA.source_object_id = UE.csi_item_instance_id
5439     AND ca.source_object_code = 'CP'
5440     AND CP.counter_template_name = MRI.counter_name
5441     AND MRI.reset_value IS NOT NULL
5442     AND MRI.mr_effectivity_id = MRE.mr_effectivity_id
5443     AND MRE.mr_header_id = UE.mr_header_id
5444     AND UE.unit_effectivity_id = p_unit_effectivity_id
5445     UNION
5446     SELECT 'x'
5447     from csi_counter_associations ca, csi_counters_vl CP, AHL_MR_INTERVALS_V MRI,
5448          AHL_MR_EFFECTIVITIES  MRE, AHL_UNIT_EFFECTIVITIES_B UE
5449     WHERE CA.source_object_id = UE.csi_item_instance_id
5450     AND ca.source_object_code = 'CP'
5451     AND CP.counter_template_name = MRI.counter_name
5452     AND MRI.reset_value IS NOT NULL
5453     AND MRI.mr_effectivity_id = MRE.mr_effectivity_id
5454     AND MRE.mr_header_id = UE.mr_header_id
5455     AND UE.unit_effectivity_id IN
5456       (
5457 
5458          SELECT     related_ue_id
5459          FROM       AHL_UE_RELATIONSHIPS
5460          WHERE      relationship_code = 'PARENT'
5461          START WITH ue_id = p_unit_effectivity_id
5462          CONNECT BY ue_id = PRIOR related_ue_id
5463 
5464       );
5465 
5466     l_exists VARCHAR2(1);
5467 
5468     -- to fetch df_header_rec
5469     CURSOR df_header_info_csr(p_unit_effectivity_id IN NUMBER) IS
5470     SELECT unit_deferral_id, object_version_number, approval_status_code,FLV.meaning approval_status_meaning,defer_reason_code,skip_mr_flag,
5471     cancel_flag, affect_due_calc_flag, set_due_date, deferral_effective_on,remarks,approver_notes, user_deferral_type, DTYP.meaning user_deferral_mean,
5472 	/*manisaga: added attributes for DFF Enablement on 22-Jan-2010--start     */
5473    ahl_unit_deferrals_vl.attribute_category,ahl_unit_deferrals_vl.attribute1,ahl_unit_deferrals_vl.attribute2,ahl_unit_deferrals_vl.attribute3,
5474    ahl_unit_deferrals_vl.attribute4,ahl_unit_deferrals_vl.attribute5,ahl_unit_deferrals_vl.attribute6,ahl_unit_deferrals_vl.attribute7,
5475    ahl_unit_deferrals_vl.attribute8,ahl_unit_deferrals_vl.attribute9,ahl_unit_deferrals_vl.attribute10,ahl_unit_deferrals_vl.attribute11,
5476    ahl_unit_deferrals_vl.attribute12,ahl_unit_deferrals_vl.attribute13,ahl_unit_deferrals_vl.attribute14,ahl_unit_deferrals_vl.attribute15
5477    /*manisaga: added attributes for DFF Enablement on 22-Jan-2010--end     */
5478 
5479     FROM ahl_unit_deferrals_vl,fnd_lookup_values_vl FLV, fnd_lookup_values_vl DTYP
5480     WHERE unit_deferral_type = 'DEFERRAL'
5481     AND unit_effectivity_id = p_unit_effectivity_id
5482     AND FLV.lookup_code = approval_status_code
5483     AND FLV.lookup_type = 'AHL_PRD_DF_APPR_STATUS_TYPES'
5484     AND DTYP.lookup_type(+) = 'AHL_PRD_DEFERRAL_TYPE'
5485     AND DTYP.lookup_code(+) = user_deferral_type ;
5486 
5487     -- fetch deferral schedule rec
5488     CURSOR df_schedule_tbl_csr(p_unit_deferral_id IN NUMBER) IS
5489     SELECT UT.unit_threshold_id,UT.object_version_number,UT.unit_deferral_id, UT.counter_id,
5490            CO.name, UT.counter_value, UT.ctr_value_type_code,MU.unit_of_measure
5491     FROM MTL_UNITS_OF_MEASURE_VL MU, CS_COUNTERS CO,ahl_unit_thresholds UT
5492     WHERE MU.uom_code = CO.uom_code
5493     AND CO.counter_id = UT.counter_id
5494     AND UT.unit_deferral_id = p_unit_deferral_id
5495     ORDER BY CO.name;
5496 
5497 
5498     i NUMBER := 0;
5499     l_df_schedules_tbl       AHL_PRD_DF_PVT.df_schedules_tbl_type;
5500 
5501     l_mr_applicable VARCHAR2(1);
5502     l_active_end_date DATE;
5503     l_new_mr_header_id NUMBER;
5504     l_new_mr_applicable VARCHAR2(1);
5505 
5506     CURSOR is_ue_inst_serial_ctld(p_unit_effectivity_id IN NUMBER)IS
5507     SELECT 'X' FROM csi_item_instances csi, ahl_unit_effectivities_b ue
5508     WHERE ue.UNIT_EFFECTIVITY_ID = p_unit_effectivity_id
5509     AND csi.instance_id = ue.CSI_ITEM_INSTANCE_ID AND csi.SERIAL_NUMBER IS NOT NULL;
5510 
5511 BEGIN
5512      IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5513 		fnd_log.string
5514 		(
5515 			fnd_log.level_procedure,
5516 			'ahl.plsql.AHL_PRD_DF_PVT.get_deferral_details.begin',
5517 			'At the start of PLSQL procedure'
5518 		);
5519      END IF;
5520       -- Initialize message list if p_init_msg_list is set to TRUE
5521      IF FND_API.To_Boolean( p_init_msg_list) THEN
5522         FND_MSG_PUB.Initialize;
5523      END IF;
5524      -- Initialize API return status to success
5525      x_return_status := FND_API.G_RET_STS_SUCCESS;
5526 
5527      IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5528 		fnd_log.string
5529 		(
5530 			fnd_log.level_statement,
5531 			'ahl.plsql.AHL_PRD_DF_PVT.get_deferral_details',
5532 			'Got request for deferral record of Unit effectivity ID : ' || p_unit_effectivity_id
5533 		);
5534      END IF;
5535 
5536      IF(p_unit_effectivity_id IS NULL OR p_unit_effectivity_id = FND_API.G_MISS_NUM)THEN
5537         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_HREC_KMISS');
5538         FND_MSG_PUB.ADD;
5539         IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
5540 		    fnd_log.string
5541 		    (
5542 			    fnd_log.level_unexpected,
5543 			    'ahl.plsql.AHL_PRD_DF_PVT.get_deferral_details',
5544 			    'Invalid request, Unit Effectivity IS NULL'
5545 		    );
5546         END IF;
5547         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5548      END IF;
5549      --get applicable ue id and find out whether deferral record should be shown.
5550      l_applicable_ue_id := get_applicable_ue(p_unit_effectivity_id);
5551 
5552      -- throw errors if any
5553      IF(FND_MSG_PUB.count_msg > 0)THEN
5554         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5555      END IF;
5556 
5557      IF(l_applicable_ue_id IS NULL)THEN
5558         l_applicable_ue_id := p_unit_effectivity_id;
5559         /*FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_MRSR_STATUS');
5560         FND_MSG_PUB.ADD;
5561         IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
5562 		   fnd_log.string
5563 		   (
5564 			  fnd_log.level_error,
5565 			  'ahl.plsql.AHL_PRD_DF_PVT.get_deferral_details',
5566 			  'Status of MR or SR is not valid for deferral'
5567 		   );
5568         END IF;*/
5569      END IF;
5570      l_df_header_info_rec.unit_effectivity_id := l_applicable_ue_id;
5571      --dbms_output.put_line('l_applicable_ue_id : ' || l_applicable_ue_id  );
5572      -- fill in context information
5573      OPEN context_info_csr(l_applicable_ue_id);
5574      FETCH context_info_csr INTO l_df_header_info_rec.due_date,l_df_header_info_rec.mr_header_id,
5575                                  l_df_header_info_rec.mr_title,l_df_header_info_rec.mr_description,
5576                                  l_df_header_info_rec.mr_repetitive_flag,l_df_header_info_rec.incident_id,
5577                                  l_df_header_info_rec.incident_number,l_df_header_info_rec.summary,
5578                                  l_df_header_info_rec.manually_planned_flag;
5579 
5580      IF(context_info_csr%NOTFOUND)THEN
5581         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_HREC_UE_ID');
5582         FND_MSG_PUB.ADD;
5583         IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
5584 		    fnd_log.string
5585 		    (
5586 			    fnd_log.level_unexpected,
5587 			    'ahl.plsql.AHL_PRD_DF_PVT.get_deferral_details',
5588 			    'Unit Effectivity record not found'
5589 		    );
5590         END IF;
5591         CLOSE context_info_csr;
5592         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5593      END IF;
5594      CLOSE context_info_csr;
5595 
5596 
5597      l_df_header_info_rec.ue_status_code := AHL_COMPLETIONS_PVT.get_mr_status(l_df_header_info_rec.unit_effectivity_id);
5598 
5599      OPEN mr_status_meaning_csr(l_df_header_info_rec.ue_status_code);
5600      FETCH mr_status_meaning_csr INTO l_df_header_info_rec.ue_status_meaning;
5601      IF(mr_status_meaning_csr%NOTFOUND)THEN
5602         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_UE_MR');
5603         FND_MSG_PUB.ADD;
5604         IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
5605 		    fnd_log.string
5606 		    (
5607 			    fnd_log.level_unexpected,
5608 			    'ahl.plsql.AHL_PRD_DF_PVT.get_deferral_details',
5609 			        'Invalid unit effectivity record, mr status meaning not found'
5610 		    );
5611         END IF;
5612         CLOSE mr_status_meaning_csr;
5613         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5614       END IF;
5615       CLOSE mr_status_meaning_csr;
5616 
5617      -- fill in visit information
5618      OPEN visit_info_csr(l_applicable_ue_id);
5619      FETCH visit_info_csr INTO l_df_header_info_rec.visit_id,l_df_header_info_rec.visit_number;
5620      /* R12: UMP Deferral.
5621      IF(visit_info_csr%NOTFOUND)THEN
5622         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_UE_VISIT');
5623         FND_MSG_PUB.ADD;
5624         IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
5625 		    fnd_log.string
5626 		    (
5627 			    fnd_log.level_unexpected,
5628 			    'ahl.plsql.AHL_PRD_DF_PVT.get_deferral_details',
5629 			    'Visit Information not found'
5630 		    );
5631         END IF;
5632         CLOSE visit_info_csr;
5633         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5634      END IF;
5635      */
5636      CLOSE visit_info_csr;
5637 
5638     -- filling in  mr/sr type and whether mr or its children has restettable counters
5639     IF(l_df_header_info_rec.mr_header_id IS NOT NULL) THEN
5640         l_df_header_info_rec.deferral_type := G_DEFERRAL_TYPE_MR;
5641         l_df_header_info_rec.reset_counter_flag := G_YES_FLAG;
5642         IF(l_df_header_info_rec.mr_repetitive_flag = G_YES_FLAG)THEN
5643            OPEN reset_counter_csr(l_applicable_ue_id);
5644            FETCH reset_counter_csr INTO l_exists;
5645            IF(reset_counter_csr%NOTFOUND)THEN
5646               l_df_header_info_rec.reset_counter_flag := G_NO_FLAG;
5647            END IF;
5648            CLOSE reset_counter_csr;
5649         END IF;
5650     ELSIF l_df_header_info_rec.incident_id IS NOT NULL THEN
5651         l_df_header_info_rec.deferral_type := G_DEFERRAL_TYPE_SR;
5652         l_df_header_info_rec.mr_repetitive_flag := G_NO_FLAG;
5653         l_df_header_info_rec.reset_counter_flag := G_YES_FLAG;
5654     END IF;
5655 
5656     OPEN is_ue_inst_serial_ctld(l_applicable_ue_id);
5657     FETCH is_ue_inst_serial_ctld INTO l_exists;
5658     IF(is_ue_inst_serial_ctld%NOTFOUND)THEN
5659         l_df_header_info_rec.WO_ITEM_SRL_CTRLD := G_NO_FLAG;
5660     ELSE
5661         l_df_header_info_rec.WO_ITEM_SRL_CTRLD := G_YES_FLAG;
5662     END IF;
5663    CLOSE is_ue_inst_serial_ctld;
5664 
5665     -- throw errors if any
5666     IF(FND_MSG_PUB.count_msg > 0)THEN
5667         RAISE FND_API.G_EXC_ERROR;
5668     END IF;
5669     -- fetch deferral header record
5670     OPEN df_header_info_csr(l_applicable_ue_id);
5671     FETCH df_header_info_csr INTO l_df_header_info_rec.unit_deferral_id,
5672                                   l_df_header_info_rec.object_version_number,
5673                                   l_df_header_info_rec.approval_status_code,
5674                                   l_df_header_info_rec.approval_status_meaning,
5675                                   l_df_header_info_rec.defer_reason_code,
5676                                   l_df_header_info_rec.skip_mr_flag,
5677                                   l_df_header_info_rec.cancel_flag,
5678                                   l_df_header_info_rec.affect_due_calc_flag,
5679                                   l_df_header_info_rec.set_due_date,
5680                                   l_df_header_info_rec.deferral_effective_on,
5681                                   l_df_header_info_rec.remarks,
5682                                   l_df_header_info_rec.approver_notes,
5683                                   l_df_header_info_rec.user_deferral_type_code,
5684                                   l_df_header_info_rec.user_deferral_type_mean,
5685 				    /*manisaga: added attributes for DFF Enablement on 22-Jan-2010--start     */
5686                                   l_df_header_info_rec.attribute_category,
5687                                   l_df_header_info_rec.attribute1,
5688                                   l_df_header_info_rec.attribute2,
5689                                   l_df_header_info_rec.attribute3,
5690                                   l_df_header_info_rec.attribute4,
5691                                   l_df_header_info_rec.attribute5,
5692                                   l_df_header_info_rec.attribute6,
5693                                   l_df_header_info_rec.attribute7,
5694                                   l_df_header_info_rec.attribute8,
5695                                   l_df_header_info_rec.attribute9,
5696                                   l_df_header_info_rec.attribute10,
5697                                   l_df_header_info_rec.attribute11,
5698                                   l_df_header_info_rec.attribute12,
5699                                   l_df_header_info_rec.attribute13,
5700                                   l_df_header_info_rec.attribute14,
5701                                   l_df_header_info_rec.attribute15;
5702                                   /*manisaga: added attributes for DFF Enablement on 22-Jan-2010--end     */
5703 
5704     IF(df_header_info_csr%NOTFOUND)THEN
5705        l_df_header_info_rec.cancel_flag := NULL;--keep it NULL
5706        l_df_header_info_rec.skip_mr_flag := G_NO_FLAG;
5707        l_df_header_info_rec.affect_due_calc_flag := G_YES_FLAG;
5708        l_df_header_info_rec.approval_status_code := 'DRAFT';
5709        IF(l_df_header_info_rec.deferral_type = G_DEFERRAL_TYPE_MR AND
5710           l_df_header_info_rec.reset_counter_flag = G_NO_FLAG)THEN
5711           l_df_header_info_rec.affect_due_calc_flag := G_NO_FLAG;
5712        END IF;
5713        l_df_header_info_rec.deferral_effective_on := SYSDATE;
5714     ELSIF(l_df_header_info_rec.approval_status_code = 'DEFERRAL_REJECTED')THEN--,'DEFERRAL_PENDING','DEFERRED'))THEN
5715        IF(l_df_header_info_rec.cancel_flag = G_YES_FLAG)THEN
5716            l_df_header_info_rec.ue_status_code := 'CANCEL_REJECTED';
5717            OPEN ue_status_meaning_csr(l_df_header_info_rec.ue_status_code);
5718            FETCH ue_status_meaning_csr INTO l_df_header_info_rec.ue_status_meaning;
5719            IF(ue_status_meaning_csr%NOTFOUND)THEN
5720              FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_UE_MR');
5721              FND_MSG_PUB.ADD;
5722              IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
5723 		          fnd_log.string
5724 		          (
5725 			          fnd_log.level_unexpected,
5726 			          'ahl.plsql.AHL_PRD_DF_PVT.get_deferral_details',
5727 			          'Invalid unit effectivity record, mr status meaning not found'
5728 		          );
5729              END IF;
5730              CLOSE ue_status_meaning_csr;
5731              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5732            END IF;
5733            CLOSE ue_status_meaning_csr;
5734        ELSE
5735            l_df_header_info_rec.ue_status_code := l_df_header_info_rec.approval_status_code;
5736            l_df_header_info_rec.ue_status_meaning := l_df_header_info_rec.approval_status_meaning;
5737        END IF;
5738     END IF;
5739     CLOSE df_header_info_csr;
5740 
5741     l_df_header_info_rec.CTR_UOM_REMAIN := get_uom_remain(l_applicable_ue_id);
5742 
5743     -- throw errors if any
5744     IF(FND_MSG_PUB.count_msg > 0)THEN
5745         RAISE FND_API.G_EXC_ERROR;
5746     END IF;
5747 
5748     -- fetch deferral schedule rec
5749     IF(l_df_header_info_rec.unit_deferral_id IS NOT NULL)THEN
5750        OPEN df_schedule_tbl_csr(l_df_header_info_rec.unit_deferral_id);
5751        LOOP
5752           FETCH df_schedule_tbl_csr INTO
5753                          l_df_schedules_tbl(i).unit_threshold_id,
5754                          l_df_schedules_tbl(i).object_version_number,
5755                          l_df_schedules_tbl(i).unit_deferral_id,
5756                          l_df_schedules_tbl(i).counter_id,
5757                          l_df_schedules_tbl(i).counter_name,
5758                          l_df_schedules_tbl(i).counter_value,
5759                          l_df_schedules_tbl(i).ctr_value_type_code,
5760                          l_df_schedules_tbl(i).unit_of_measure;
5761        EXIT WHEN df_schedule_tbl_csr%NOTFOUND;
5762         i := i + 1;
5763        END LOOP;
5764        CLOSE df_schedule_tbl_csr;
5765     END IF;
5766 
5767     -- throw errors if any
5768     IF(FND_MSG_PUB.count_msg > 0)THEN
5769         RAISE FND_API.G_EXC_ERROR;
5770     END IF;
5771 
5772     IF(l_df_header_info_rec.deferral_type = G_DEFERRAL_TYPE_MR)THEN
5773       AHL_PRD_DF_PVT.get_mr_termination_details(
5774          p_unit_effectivity_id   => l_applicable_ue_id,
5775          x_mr_applicable         => l_mr_applicable,
5776          x_active_end_date      => l_active_end_date,
5777          x_new_mr_header_id     => l_new_mr_header_id,
5778          x_new_mr_applicable    => l_new_mr_applicable,
5779          x_return_status        => x_return_status,
5780          x_msg_count            => x_msg_count,
5781          x_msg_data             => x_msg_data);
5782         IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) 	THEN
5783 			    RETURN;
5784         ELSE
5785           IF(l_mr_applicable = FND_API.G_FALSE AND l_new_mr_applicable = FND_API.G_FALSE)THEN
5786             l_df_header_info_rec.MR_APPL_EXPIRED := FND_API.G_TRUE;
5787             l_df_header_info_rec.cancel_flag := G_NO_FLAG;
5788           END IF;
5789         END IF;
5790     END IF;
5791 
5792     x_df_header_info_rec := l_df_header_info_rec;
5793     x_df_schedules_tbl   := l_df_schedules_tbl;
5794 
5795 
5796     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5797 		fnd_log.string
5798 		(
5799 			fnd_log.level_procedure,
5800 			'ahl.plsql.AHL_PRD_DF_PVT.get_deferral_details.end',
5801 			'At the end of PLSQL procedure'
5802 		);
5803     END IF;
5804 
5805 EXCEPTION
5806  WHEN FND_API.G_EXC_ERROR THEN
5807    x_df_header_info_rec := l_df_header_info_rec;
5808    x_df_schedules_tbl := l_df_schedules_tbl;
5809    x_return_status := FND_API.G_RET_STS_ERROR;
5810    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
5811                               p_data  => x_msg_data,
5812                               p_encoded => fnd_api.g_false);
5813 
5814 
5815  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5816    x_df_header_info_rec := l_df_header_info_rec;
5817    x_df_schedules_tbl := l_df_schedules_tbl;
5818    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5819    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
5820                               p_data  => x_msg_data,
5821                               p_encoded => fnd_api.g_false);
5822 
5823 
5824  WHEN OTHERS THEN
5825     x_df_header_info_rec := l_df_header_info_rec;
5826     x_df_schedules_tbl := l_df_schedules_tbl;
5827     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5828     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5829        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
5830                                p_procedure_name => l_api_name,
5831                                p_error_text     => SUBSTR(SQLERRM,1,500));
5832     END IF;
5833     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
5834                                p_data  => x_msg_data,
5835                                p_encoded => fnd_api.g_false);
5836 END get_deferral_details;
5837 
5838 FUNCTION get_applicable_ue(
5839        p_unit_effectivity_id NUMBER) RETURN NUMBER IS
5840 
5841     -- to fecth context information
5842     CURSOR  applicable_ue_csr(p_unit_effectivity_id IN NUMBER) IS
5843     SELECT  orig_deferral_ue_id,ue_status_code,def_status_code
5844     FROM ahl_ue_deferral_details_v
5845     WHERE unit_effectivity_id = p_unit_effectivity_id;
5846 
5847     l_orig_deferral_ue_id NUMBER;
5848     l_ue_status_code VARCHAR2(30);
5849     l_def_status_code VARCHAR2(30);
5850     l_applicable_ue_id NUMBER;
5851 BEGIN
5852     OPEN applicable_ue_csr(p_unit_effectivity_id);
5853     FETCH applicable_ue_csr INTO l_orig_deferral_ue_id,
5854                                  l_ue_status_code,
5855                                  l_def_status_code;
5856     IF(applicable_ue_csr%NOTFOUND)THEN
5857        FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_PRD_DF_INV_HREC_UE_ID');
5858        FND_MSG_PUB.ADD;
5859        IF (fnd_log.level_unexpected >= fnd_log.g_current_runtime_level)THEN
5860 		    fnd_log.string
5861 		    (
5862 			    fnd_log.level_unexpected,
5863 			    'ahl.plsql.AHL_PRD_DF_PVT.get_applicable_ue',
5864 			    'Unit Effectivity record not found'
5865 		    );
5866        END IF;
5867     ELSE
5868        l_applicable_ue_id := l_orig_deferral_ue_id;
5869        IF(l_orig_deferral_ue_id IS NULL)THEN
5870           IF((NVL(l_def_status_code,'x') IN ('DEFERRAL_PENDING','DEFERRED','TERMINATED','CANCELLED')) OR
5871               (NVL(l_ue_status_code,'x') IN ('DEFERRED','TERMINATED','CANCELLED')) OR
5872                l_ue_status_code IS NULL )THEN
5873              l_applicable_ue_id := p_unit_effectivity_id;
5874           END IF;
5875        END IF;
5876     END IF;
5877     CLOSE applicable_ue_csr;
5878     RETURN l_applicable_ue_id;
5879 
5880 END get_applicable_ue;
5881 
5882 --------------------------------------------------------------------------------
5883 FUNCTION process_deferred_exceptions(p_unit_effectivity_id IN NUMBER) RETURN BOOLEAN IS
5884 
5885     CURSOR unit_deferral_csr(p_unit_effectivity_id IN NUMBER) IS
5886     SELECT UD.unit_deferral_id FROM ahl_unit_deferrals_b UD
5887     WHERE UD.unit_deferral_type = 'DEFERRAL'
5888     AND UD.unit_effectivity_id = p_unit_effectivity_id;
5889 
5890     l_unit_deferral_id NUMBER;
5891 
5892     CURSOR redundant_threshold_csr(p_unit_deferral_id IN NUMBER) IS
5893     SELECT unit_threshold_id FROM ahl_unit_thresholds
5894     WHERE unit_deferral_id = p_unit_deferral_id;
5895 
5896 BEGIN
5897     OPEN unit_deferral_csr(p_unit_effectivity_id);
5898     FETCH unit_deferral_csr INTO l_unit_deferral_id;
5899     IF(unit_deferral_csr%NOTFOUND)THEN
5900        RETURN FALSE;
5901     ELSE
5902       FOR redundant_threshold_rec IN redundant_threshold_csr(l_unit_deferral_id) LOOP
5903         AHL_UNIT_THRESHOLDS_PKG.delete_row(redundant_threshold_rec.unit_threshold_id);
5904       END LOOP;
5905       AHL_UNIT_DEFERRALS_PKG.delete_row(l_unit_deferral_id);
5906     END IF;
5907     RETURN TRUE;
5908 END process_deferred_exceptions;
5909 
5910 
5911 FUNCTION Is_UMP_Deferral(p_unit_deferral_id IN NUMBER) RETURN BOOLEAN
5912 IS
5913   CURSOR wo_exists_csr(p_unit_deferral_id IN NUMBER) IS
5914     /* -- fix for bug# 6849943 (FP for Bug # 6815689).
5915     SELECT 'x'
5916     FROM   ahl_workorder_tasks_v wo, ahl_unit_deferrals_b udf
5917     WHERE  wo.unit_effectivity_id = udf.unit_effectivity_id
5918       AND  udf.unit_deferral_id = p_unit_deferral_id;
5919     */
5920 
5921     SELECT 'x'
5922     FROM   ahl_workorders wo, ahl_unit_deferrals_b udf,
5923            ahl_visit_tasks_b vts, ahl_visits_b vst,
5924            (SELECT ORGANIZATION_ID
5925             FROM INV_ORGANIZATION_INFO_V
5926             WHERE NVL (operating_unit, mo_global.get_current_org_id()) = mo_global.get_current_org_id()) ORG
5927     WHERE  WO.VISIT_TASK_ID=VTS.VISIT_TASK_ID
5928       AND VST.VISIT_ID=VTS.VISIT_ID
5929       AND VST.ORGANIZATION_ID=ORG.ORGANIZATION_ID
5930       AND vts.unit_effectivity_id = udf.unit_effectivity_id
5931       AND udf.unit_deferral_id = p_unit_deferral_id
5932       AND rownum < 2;
5933 
5934   l_exists  VARCHAR2(1);
5935   l_found   BOOLEAN;
5936 
5937 BEGIN
5938   OPEN wo_exists_csr(p_unit_deferral_id);
5939   FETCH wo_exists_csr INTO l_exists;
5940   IF (wo_exists_csr%FOUND) THEN
5941     l_found := FALSE;
5942   ELSE
5943     l_found := TRUE;
5944   END IF;
5945   CLOSE wo_exists_csr;
5946 
5947   RETURN l_found;
5948 
5949 END Is_UMP_Deferral;
5950 
5951 
5952 PROCEDURE get_mr_termination_details(
5953          p_unit_effectivity_id   IN  NUMBER,
5954          x_mr_applicable         OUT NOCOPY VARCHAR2,
5955          x_active_end_date       OUT NOCOPY DATE,
5956          x_new_mr_header_id      OUT NOCOPY NUMBER,
5957          x_new_mr_applicable     OUT NOCOPY VARCHAR2,
5958          x_return_status         OUT NOCOPY VARCHAR2,
5959          x_msg_count             OUT NOCOPY NUMBER,
5960          x_msg_data              OUT NOCOPY VARCHAR2) IS
5961 
5962 -- added active_end_date to fix bug# 12776603; sorao for backporting project
5963 CURSOR get_mr_details_csr(p_unit_effectivity_id   IN  NUMBER) IS
5964 SELECT MR.mr_header_id,MR.title,MR.effective_from,MR.effective_to,MR.version_number,UE.csi_item_instance_id,
5965 ii.active_end_date
5966 from ahl_mr_headers_b MR,ahl_unit_effectivities_b UE, csi_item_instances ii
5967 WHERE MR.mr_header_id = UE.mr_header_id
5968 AND UE.csi_item_instance_id = ii.instance_id
5969 AND UE.unit_effectivity_id = p_unit_effectivity_id;
5970 
5971 
5972 l_mr_header_id NUMBER;
5973 l_title ahl_mr_headers_b.title%TYPE;
5974 l_effective_from DATE;
5975 l_effective_to DATE;
5976 l_version_number ahl_mr_headers_b.version_number%TYPE;
5977 l_item_instance_id NUMBER;
5978 l_active_end_date  DATE;
5979 
5980 -- cursor fixed for bug 9143707
5981 CURSOR get_new_mr_details_csr(p_title      IN VARCHAR2,
5982                               p_mr_header_id      IN  NUMBER,
5983                               p_version_number IN NUMBER) IS
5984 Select mr_header_id FROM ahl_mr_headers_b
5985 WHERE title = p_title
5986 AND version_number > p_version_number
5987 AND sysdate between effective_from and NVL(effective_to,SYSDATE+1)
5988 AND MR_status_code = 'COMPLETE'
5989 ORDER BY version_number desc;
5990 
5991 l_new_mr_header_id NUMBER;
5992 
5993 --l_mr_item_instance_tbl AHL_FMP_PVT.MR_ITEM_INSTANCE_TBL_TYPE;
5994 l_mr_item_instance_tbl  AHL_FMP_PVT.applicable_mr_tbl_type;
5995 
5996 BEGIN
5997    x_return_status := FND_API.G_RET_STS_SUCCESS;
5998    x_mr_applicable := FND_API.G_TRUE;
5999    x_new_mr_applicable := FND_API.G_TRUE;
6000 
6001    OPEN get_mr_details_csr(p_unit_effectivity_id);
6002    FETCH get_mr_details_csr INTO l_mr_header_id,l_title, l_effective_from,
6003                                  l_effective_to,l_version_number,l_item_instance_id,l_active_end_date;
6004    CLOSE get_mr_details_csr;
6005 
6006    -- fix for bug# 12776603 ; sorao for backporting project
6007    -- if instance expired, return 'not applicable'.
6008    IF (l_active_end_date IS NOT NULL AND l_active_end_date < sysdate) THEN
6009       x_mr_applicable := FND_API.G_FALSE;
6010       x_new_mr_applicable := FND_API.G_FALSE;
6011       RETURN;
6012    END IF;
6013 
6014    x_active_end_date := l_effective_to;
6015    IF(trunc(NVL(x_active_end_date,SYSDATE+1)) <= trunc(SYSDATE))THEN
6016      x_mr_applicable := FND_API.G_FALSE;
6017    END IF;
6018 
6019    IF(x_mr_applicable = FND_API.G_FALSE)THEN
6020      OPEN get_new_mr_details_csr(l_title,l_mr_header_id,l_version_number);
6021      FETCH get_new_mr_details_csr INTO l_new_mr_header_id;
6022      IF(get_new_mr_details_csr%NOTFOUND) THEN
6023        x_new_mr_applicable := FND_API.G_FALSE;
6024      END IF;
6025      CLOSE get_new_mr_details_csr;
6026 
6027      IF(x_new_mr_applicable = FND_API.G_TRUE)THEN
6028        /* replacing with call get_applicable_mrs instead.
6029        AHL_FMP_PVT.GET_MR_AFFECTED_ITEMS (
6030         p_api_version           => 1.0,
6031         p_init_msg_list         =>  FND_API.G_FALSE,
6032         p_commit                =>  FND_API.G_FALSE,
6033         p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
6034         x_return_status         => x_return_status,
6035         x_msg_count             => x_msg_count,
6036         x_msg_data              => x_msg_data,
6037         p_mr_header_id          => l_new_mr_header_id,
6038         p_mr_effectivity_id     => NULL,
6039         p_top_node_flag         => 'N',
6040         p_unique_inst_flag      => 'N',
6041         p_sort_flag             => 'N',
6042         x_mr_item_inst_tbl      => l_mr_item_instance_tbl
6043        );
6044        */
6045 
6046        -- get applicable effectivities.
6047        AHL_FMP_PVT.Get_Applicable_MRs(p_api_version => 1.0,
6048                                       x_return_status          => x_return_status,
6049                                       x_msg_count              => x_msg_count,
6050                                       x_msg_data               => x_msg_data,
6051                                       p_item_instance_id       => l_item_instance_id,
6052                                       p_mr_header_id           => l_new_mr_header_id,
6053                                       p_components_flag        => 'N',
6054                                       x_applicable_mr_tbl      => l_mr_item_instance_tbl) ;
6055 
6056        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6057                    fnd_log.string
6058                    (
6059                            fnd_log.level_statement,
6060                            'ahl.plsql.AHL_PRD_DF_PVT.get_mr_termination_details',
6061                            'returned from AHL_FMP_PVT.Get_Applicable_MRs:status:' || x_return_status
6062                   );
6063        END IF;
6064 
6065        x_new_mr_applicable := FND_API.G_FALSE;
6066        IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6067          RETURN;
6068        ELSE
6069          -- added count check to fix bug# 8917761
6070          IF (l_mr_item_instance_tbl.COUNT > 0) THEN
6071            FOR i IN l_mr_item_instance_tbl.FIRST..l_mr_item_instance_tbl.LAST LOOP
6072              IF(l_mr_item_instance_tbl(i).ITEM_INSTANCE_ID = l_item_instance_id)THEN
6073                x_new_mr_applicable := FND_API.G_TRUE;
6074                x_new_mr_header_id := l_new_mr_header_id;
6075                IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6076                    fnd_log.string
6077                    (
6078                            fnd_log.level_statement,
6079                            'ahl.plsql.AHL_PRD_DF_PVT.get_mr_termination_details',
6080                            'Found new version of MR applicable:x_new_mr_header_id:' || x_new_mr_header_id
6081                    );
6082                END IF;
6083                EXIT;
6084              END IF;
6085            END LOOP;
6086          END IF; -- l_mr_item_instance_tbl.COUNT
6087        END IF; -- x_return_status
6088      END IF; -- x_new_mr_applicable
6089    ELSE
6090      -- SB Enh. Check if current MR is applicable.
6091      -- get applicable effectivities.
6092      AHL_FMP_PVT.Get_Applicable_MRs(p_api_version => 1.0,
6093                                     x_return_status          => x_return_status,
6094                                     x_msg_count              => x_msg_count,
6095                                     x_msg_data               => x_msg_data,
6096                                     p_item_instance_id       => l_item_instance_id,
6097                                     p_mr_header_id           => l_mr_header_id,
6098                                     p_components_flag        => 'N',
6099                                     x_applicable_mr_tbl      => l_mr_item_instance_tbl) ;
6100 
6101      IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6102                  fnd_log.string
6103                  (
6104                   fnd_log.level_statement,
6105                   'ahl.plsql.AHL_PRD_DF_PVT.get_mr_termination_details', 'Current MR:returned from AHL_FMP_PVT.Get_Applicable_MRs:status:' || x_return_status
6106                  );
6107      END IF;
6108      IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6109          RETURN;
6110      END IF;
6111 
6112      x_mr_applicable := FND_API.G_FALSE;
6113      x_new_mr_applicable := FND_API.G_FALSE;
6114      IF (l_mr_item_instance_tbl.COUNT > 0) THEN
6115         FOR i IN l_mr_item_instance_tbl.FIRST..l_mr_item_instance_tbl.LAST LOOP
6116           IF(l_mr_item_instance_tbl(i).ITEM_INSTANCE_ID = l_item_instance_id)THEN
6117             x_mr_applicable := FND_API.G_TRUE;
6118             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6119                 fnd_log.string
6120                 (
6121                  fnd_log.level_statement,
6122                  'ahl.plsql.AHL_PRD_DF_PVT.get_mr_termination_details', 'Found MR applicable:l_mr_header_id:' || l_mr_header_id
6123                 );
6124             END IF;
6125             EXIT;
6126              END IF;
6127            END LOOP;
6128            IF (x_mr_applicable = FND_API.G_TRUE) THEN
6129               x_new_mr_applicable := FND_API.G_TRUE;
6130            END IF;
6131      END IF; -- l_mr_item_instance_tbl.COUNT
6132 
6133    END IF; -- x_mr_applicable
6134 
6135    IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
6136               fnd_log.string
6137               (
6138                   fnd_log.level_procedure,
6139                   'ahl.plsql.AHL_PRD_DF_PVT.get_mr_termination_details',
6140                   'End of procedure'
6141               );
6142    END IF;
6143 
6144 END get_mr_termination_details;
6145 
6146 FUNCTION get_uom_remain(
6147     p_unit_effectivity_id IN NUMBER)
6148   RETURN VARCHAR2
6149 IS
6150   l_uom_remain VARCHAR2(240);
6151 
6152   CURSOR ump_details_csr(p_unit_effectivity_id IN NUMBER)
6153   IS
6154     SELECT UMP.counter_name,
6155       UMP.status_code,
6156       UMP.originator_title,
6157       UMP.csi_item_instance_id,
6158       UMP.orig_ue_instance_id,
6159       UMP.counter_id,
6160       UMP.due_counter_value
6161     FROM ahl_unit_effectivities_v UMP
6162     WHERE UMP.unit_effectivity_id = p_unit_effectivity_id;
6163 
6164   ump_rec ump_details_csr%rowtype;
6165 
6166   CURSOR get_net_reading_csr (p_csi_item_instance_id IN NUMBER, p_ctr_template_name IN VARCHAR2)
6167   IS
6168     SELECT cc.UOM_CODE,
6169       (SELECT ccr.net_reading
6170       FROM csi_counter_readings ccr
6171       WHERE ccr.counter_value_id     = cc.CTR_VAL_MAX_SEQ_NO
6172       AND NVL(ccr.disabled_flag,'N') = 'N'
6173       ) net_reading
6174   FROM CSI_COUNTER_ASSOCIATIONS CCA,
6175     CSI_COUNTERS_VL CC
6176   WHERE CCA.COUNTER_ID                   = CC.COUNTER_ID
6177   AND CCA.SOURCE_OBJECT_ID               = p_csi_item_instance_id
6178   AND CCA.SOURCE_OBJECT_CODE             = 'CP'
6179   AND CC.COUNTER_TEMPLATE_NAME           = p_ctr_template_name;
6180 
6181   CURSOR ump_ctr_name_csr (p_counter_id IN NUMBER)
6182   IS
6183     SELECT cc.counter_template_name counter_name,cc.UOM_CODE,
6184       (SELECT ccr.net_reading
6185       FROM csi_counter_readings ccr
6186       WHERE ccr.counter_value_id     = cc.CTR_VAL_MAX_SEQ_NO
6187       AND NVL(ccr.disabled_flag,'N') = 'N'
6188       )
6189   FROM csi_counters_vl cc
6190   WHERE cc.counter_id = p_counter_id;
6191 
6192   l_counter_name        VARCHAR2(240);
6193   l_uom_code        VARCHAR2(3);
6194   l_due_counter_value NUMBER;
6195   l_net_reading       NUMBER;
6196 BEGIN
6197   OPEN ump_details_csr(p_unit_effectivity_id);
6198   FETCH ump_details_csr INTO ump_rec;
6199   CLOSE ump_details_csr;
6200 
6201   IF (ump_rec.status_code    IS NULL OR ump_rec.status_code = 'INIT-DUE') THEN
6202     IF (ump_rec.COUNTER_NAME IS NOT NULL) THEN
6203       -- uom_remain based on interval threshold.
6204       IF (ump_rec.ORIGINATOR_TITLE IS NULL) THEN
6205         OPEN get_net_reading_csr ( ump_rec.CSI_ITEM_INSTANCE_ID, ump_rec.COUNTER_NAME);
6206       ELSE
6207         OPEN get_net_reading_csr ( ump_rec.orig_ue_instance_id, ump_rec.COUNTER_NAME);
6208       END IF;
6209       FETCH get_net_reading_csr INTO l_uom_code,l_net_reading;
6210       IF (get_net_reading_csr%NOTFOUND) OR (l_net_reading IS NULL) THEN
6211         l_net_reading                                     := 0;
6212       END IF;
6213       CLOSE get_net_reading_csr;
6214       l_uom_remain := ump_rec.COUNTER_NAME || '/' || (ump_rec.due_counter_value - l_net_reading) || ' ' || l_uom_code;
6215       -- UOM remain based on init due threshold counter_id.
6216     ELSIF (ump_rec.counter_id IS NOT NULL) THEN
6217       OPEN ump_ctr_name_csr(ump_rec.counter_id);
6218       FETCH ump_ctr_name_csr INTO l_COUNTER_NAME,l_uom_code, l_net_reading;
6219       IF (ump_ctr_name_csr%NOTFOUND) THEN
6220         l_net_reading      := 0;
6221       ELSIF (l_net_reading IS NULL) THEN
6222         l_net_reading      := 0;
6223       END IF;
6224       CLOSE ump_ctr_name_csr;
6225       l_uom_remain := l_COUNTER_NAME || '/' || (ump_rec.due_counter_value - l_net_reading) || ' ' || l_uom_code;
6226     END IF; -- x_results_mr_instance_tbl(l_counter).COUNTER_NAME
6227   ELSE
6228     l_uom_remain := NULL;
6229   END IF;
6230   RETURN l_uom_remain;
6231 END get_uom_remain;
6232 
6233 -- JKJain, NR Analysis and Forecasting
6234 FUNCTION get_fleet_from_effectivity(p_unit_effectivity_id IN NUMBER) RETURN NUMBER IS
6235 
6236 Cursor get_fleet_header_id(c_unit_effectivity_id NUMBER) IS
6237 SELECT eff.fleet_header_id from ahl_mr_effectivities eff, ahl_unit_effectivities_b ue
6238 WHERE eff.mr_effectivity_id = ue.mr_effectivity_id
6239 AND   ue.unit_effectivity_id = c_unit_effectivity_id;
6240 
6241 l_fleet_header_id NUMBER := null;
6242 BEGIN
6243 
6244 OPEN get_fleet_header_id(p_unit_effectivity_id);
6245 FETCH get_fleet_header_id INTO l_fleet_header_id;
6246 CLOSE get_fleet_header_id;
6247 
6248 RETURN l_fleet_header_id;
6249 
6250 END get_fleet_from_effectivity;
6251 
6252 END AHL_PRD_DF_PVT; -- Package body