DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_FMP_MR_INTERVAL_PVT

Source


1 PACKAGE BODY AHL_FMP_MR_INTERVAL_PVT AS
2 /* $Header: AHLVMITB.pls 120.4 2007/11/07 22:50:23 sikumar ship $ */
3 
4 G_PKG_NAME      VARCHAR2(30) := 'AHL_FMP_MR_INTERVAL_PVT';
5 G_API_NAME      VARCHAR2(30) := 'PROCESS_INTERVAL';
6 G_DEBUG         VARCHAR2(1)     :=AHL_DEBUG_PUB.is_log_enabled;
7 
8 G_APPLN_USAGE    VARCHAR2(30)  := FND_PROFILE.value( 'AHL_APPLN_USAGE' );
9 
10 
11 g_repetitive_flag           VARCHAR2(1) := NULL;
12 g_mr_type_code              VARCHAR2(30) := NULL;
13 
14 -- Function to get the Record Identifier for Error Messages
15 FUNCTION get_record_identifier
16 (
17   p_interval_rec       IN    interval_rec_type
18 ) RETURN VARCHAR2
19 IS
20 
21 l_record_identifier         VARCHAR2(2000) := '';
22 
23 BEGIN
24 
25   -- For PM Programs
26   IF ( G_APPLN_USAGE = 'PM' AND
27        g_mr_type_code = 'PROGRAM' ) THEN
28 
29     IF ( p_interval_rec.earliest_due_value IS NOT NULL AND
30          p_interval_rec.earliest_due_value <> FND_API.G_MISS_NUM ) THEN
31       l_record_identifier := l_record_identifier || TO_CHAR( p_interval_rec.earliest_due_value );
32     END IF;
33 
34     l_record_identifier := l_record_identifier || ' - ';
35 
36     IF ( p_interval_rec.start_value IS NOT NULL AND
37          p_interval_rec.start_value <> FND_API.G_MISS_NUM ) THEN
38       l_record_identifier := l_record_identifier || TO_CHAR( p_interval_rec.start_value );
39     END IF;
40 
41     l_record_identifier := l_record_identifier || ' - ';
42 
43     IF ( p_interval_rec.stop_value IS NOT NULL AND
44          p_interval_rec.stop_value <> FND_API.G_MISS_NUM ) THEN
45       l_record_identifier := l_record_identifier || TO_CHAR( p_interval_rec.stop_value );
46     END IF;
47 
48     l_record_identifier := l_record_identifier || ' - ';
49 
50   -- For One-Time Maintenencce Requirements
51   ELSIF ( g_repetitive_flag = 'N' ) THEN
52     IF ( p_interval_rec.interval_value IS NOT NULL AND
53          p_interval_rec.interval_value <> FND_API.G_MISS_NUM ) THEN
54       l_record_identifier := l_record_identifier || TO_CHAR( p_interval_rec.interval_value );
55     END IF;
56 
57     l_record_identifier := l_record_identifier || ' - ';
58 
59   -- For All other Maintenance Requirements
60   ELSE
61 
62     IF ( p_interval_rec.start_date IS NOT NULL AND
63          p_interval_rec.start_date <> FND_API.G_MISS_DATE ) THEN
64       l_record_identifier := l_record_identifier || TO_CHAR( p_interval_rec.start_date, 'DD-MON_YYYY' );
65     END IF;
66 
67     l_record_identifier := l_record_identifier || ' - ';
68 
69     IF ( p_interval_rec.stop_date IS NOT NULL AND
70          p_interval_rec.stop_date <> FND_API.G_MISS_DATE ) THEN
71       l_record_identifier := l_record_identifier || TO_CHAR( p_interval_rec.stop_date, 'DD-MON-YYYY' );
72     END IF;
73 
74     l_record_identifier := l_record_identifier || ' - ';
75 
76     IF ( p_interval_rec.earliest_due_value IS NOT NULL AND
77          p_interval_rec.earliest_due_value <> FND_API.G_MISS_NUM ) THEN
78       l_record_identifier := l_record_identifier || TO_CHAR( p_interval_rec.earliest_due_value );
79     END IF;
80 
81     l_record_identifier := l_record_identifier || ' - ';
82 
83     IF ( p_interval_rec.start_value IS NOT NULL AND
84          p_interval_rec.start_value <> FND_API.G_MISS_NUM ) THEN
85       l_record_identifier := l_record_identifier || TO_CHAR( p_interval_rec.start_value );
86     END IF;
87 
88     l_record_identifier := l_record_identifier || ' - ';
89 
90     IF ( p_interval_rec.interval_value IS NOT NULL AND
91          p_interval_rec.interval_value <> FND_API.G_MISS_NUM ) THEN
92       l_record_identifier := l_record_identifier || TO_CHAR( p_interval_rec.interval_value );
93     END IF;
94 
95     l_record_identifier := l_record_identifier || ' - ';
96 
97     IF ( p_interval_rec.stop_value IS NOT NULL AND
98          p_interval_rec.stop_value <> FND_API.G_MISS_NUM ) THEN
99       l_record_identifier := l_record_identifier || TO_CHAR( p_interval_rec.stop_value );
100     END IF;
101 
102     l_record_identifier := l_record_identifier || ' - ';
103 
104   END IF;
105 
106   -- Common Identifiers
107   IF ( p_interval_rec.counter_name IS NOT NULL AND
108        p_interval_rec.counter_name <> FND_API.G_MISS_CHAR ) THEN
109     l_record_identifier := l_record_identifier || p_interval_rec.counter_name;
110   END IF;
111 
112   RETURN l_record_identifier;
113 
114 END get_record_identifier;
115 
116 -- Procedure to validate the Inputs of the API
117 PROCEDURE validate_api_inputs
118 (
119   p_interval_tbl                   IN   interval_tbl_type,
120   p_mr_header_id                   IN   NUMBER,
121   p_threshold_rec                  IN   threshold_rec_type,
122   x_return_status                  OUT  NOCOPY VARCHAR2,
123   p_super_user                     IN   VARCHAR2
124 )
125 IS
126 
127 l_return_status             VARCHAR2(1);
128 l_msg_data                  VARCHAR2(2000);
129 l_mr_status_code            VARCHAR2(30);
130 l_mr_type_code              VARCHAR2(30);
131 l_pm_install_flag           VARCHAR2(1);
132 
133 BEGIN
134   x_return_status := FND_API.G_RET_STS_SUCCESS;
135 
136   -- Check if a valid value is passed in p_mr_header_id
137   IF ( p_mr_header_id = FND_API.G_MISS_NUM OR
138        p_mr_header_id IS NULL ) THEN
139     FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_MR_HEADER_ID_NULL' );
140     FND_MSG_PUB.add;
141     x_return_status := FND_API.G_RET_STS_ERROR;
142     RETURN;
143   END IF;
144 
145    -- Check Profile value
146 
147     IF  G_APPLN_USAGE IS NULL
148     THEN
149     FND_MESSAGE.SET_NAME('AHL','AHL_COM_APP_PRFL_UNDEF');
150     FND_MSG_PUB.ADD;
151     x_return_status := FND_API.G_RET_STS_ERROR;
152     RETURN;
153         IF G_DEBUG = 'Y' THEN
154             AHL_DEBUG_PUB.debug('APPLN USAGE CODE  IS NULL IN VALIDATE_API_INPUTS' );
155         END IF;
156     END IF;
157 
158 
159   IF ( G_APPLN_USAGE = 'PM' ) THEN
160     l_pm_install_flag:= 'Y';
161   ELSE
162     l_pm_install_flag:= 'N';
163   END IF;
164 
165    --check if mr is terminated and get the mr status.
166     l_mr_status_code :=AHL_FMP_COMMON_PVT.check_mr_status(p_mr_header_id);
167    IF l_mr_status_code IS NULL  THEN
168     FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_INVALID_MR' );
169     FND_MSG_PUB.add;
170     x_return_status := FND_API.G_RET_STS_ERROR;
171     RETURN;
172    END IF;
173 
174    -- Check if the Maintenance Requirement is in Updatable status based on the pm,super user,mrstatus
175     IF ( l_pm_install_flag = 'Y' AND
176          p_super_user ='Y' AND
177          l_mr_status_code = 'COMPLETE') THEN
178          AHL_FMP_COMMON_PVT.validate_mr_pm_status
179          (
180                 x_return_status        => l_return_status,
181                 x_msg_data             => l_msg_data,
182                 p_mr_header_id         => p_mr_header_id
183          );
184      ELSE
185          AHL_FMP_COMMON_PVT.validate_mr_status
186          (
187                 x_return_status        => l_return_status,
188                 x_msg_data             => l_msg_data,
189                 p_mr_header_id         => p_mr_header_id
190          );
191       END IF;
192 
193   IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
194     FND_MESSAGE.set_name( 'AHL', l_msg_data );
195     FND_MSG_PUB.add;
196     x_return_status := l_return_status;
197     RETURN;
198   END IF;
199 
200 
201   -- Check if a valid value is passed in p_mr_effectivity_id
202   IF ( p_threshold_rec.mr_effectivity_id = FND_API.G_MISS_NUM OR
203        p_threshold_rec.mr_effectivity_id IS NULL ) THEN
204     FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_MRE_ID_NULL' );
205     FND_MSG_PUB.add;
206     x_return_status := FND_API.G_RET_STS_ERROR;
207     RETURN;
208   END IF;
209 
210   -- Check if the Maintenance Requirement Effectivity exists
211   AHL_FMP_COMMON_PVT.validate_mr_effectivity
212   (
213     x_return_status          => l_return_status,
214     x_msg_data               => l_msg_data,
215     p_mr_effectivity_id      => p_threshold_rec.mr_effectivity_id,
216     p_object_version_number  => p_threshold_rec.object_version_number
217   );
218 
219   IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
220     FND_MESSAGE.set_name( 'AHL', l_msg_data );
221     FND_MSG_PUB.add;
222     x_return_status := l_return_status;
223     RETURN;
224   END IF;
225 
226      l_mr_type_code :=AHL_FMP_COMMON_PVT.check_mr_type(p_mr_header_id);
227 
228   -- Check if atleast one record is passed in p_interval_tbl or p_threshold_rec is passed
229   IF ( p_interval_tbl.count < 1 AND
230        ( p_threshold_rec.threshold_date IS NULL OR
231          p_threshold_rec.threshold_date = FND_API.G_MISS_DATE ) AND
232        ( p_threshold_rec.program_duration IS NULL OR
233          p_threshold_rec.program_duration = FND_API.G_MISS_NUM ) ) THEN
234     FND_MESSAGE.set_name( 'AHL', 'AHL_COM_INVALID_PROCEDURE_CALL' );
235     FND_MESSAGE.set_token( 'PROCEDURE', G_PKG_NAME || '.' || G_API_NAME );
236     FND_MSG_PUB.add;
237     x_return_status := FND_API.G_RET_STS_ERROR;
238     RETURN;
239   END IF;
240 
241   -- Validate DML Operation
242   FOR i IN 1..p_interval_tbl.count LOOP
243     IF ( p_interval_tbl(i).dml_operation <> 'D' AND
244          p_interval_tbl(i).dml_operation <> 'U' AND
245          p_interval_tbl(i).dml_operation <> 'C' ) THEN
246       FND_MESSAGE.set_name( 'AHL', 'AHL_COM_DML_INVALID' );
247       FND_MESSAGE.set_token( 'FIELD', p_interval_tbl(i).dml_operation );
248       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_tbl(i) ) );
249       FND_MSG_PUB.add;
250       x_return_status := FND_API.G_RET_STS_ERROR;
251       RETURN;
252     END IF;
253 
254     --BASED on the discussion with sracha on Nov02 2004 to show the error msg.
255       IF ( l_pm_install_flag = 'Y' AND
256            p_interval_tbl(i).dml_operation = 'U' AND
257            p_super_user ='Y' AND
258            l_mr_status_code = 'COMPLETE') THEN
259       FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_INVALID_DML' );
260       FND_MSG_PUB.add;
261       x_return_status := FND_API.G_RET_STS_ERROR;
262       RETURN;
263     END IF;
264 
265 
266        IF ( l_pm_install_flag = 'Y' AND
267            p_super_user ='Y' AND
268            p_interval_tbl(i).dml_operation = 'D' AND
269            l_mr_status_code = 'COMPLETE' AND
270            l_mr_type_code ='ACTIVITY')THEN
271            AHL_FMP_COMMON_PVT.validate_mr_type_activity
272            (
273                 x_return_status    => l_return_status,
274                 x_msg_data         => l_msg_data,
275                 p_effectivity_id   => p_threshold_rec.MR_EFFECTIVITY_ID,
276                 p_eff_obj_version  => p_threshold_rec.OBJECT_VERSION_NUMBER
277            );
278            IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
279            FND_MESSAGE.set_name( 'AHL', l_msg_data );
280            FND_MSG_PUB.add;
281            x_return_status := FND_API.G_RET_STS_ERROR;
282            RETURN;
283            END IF;
284        END IF;
285 
286 
287     IF ( l_pm_install_flag = 'Y' AND
288          p_super_user ='Y' AND
289          p_interval_tbl(i).dml_operation = 'D' AND
290          l_mr_status_code = 'COMPLETE' AND
291          l_mr_type_code ='PROGRAM') THEN
292          AHL_FMP_COMMON_PVT.validate_mr_type_program
293          (
294                 x_return_status    => l_return_status,
295                 x_msg_data         => l_msg_data,
296                 p_mr_header_id     => p_mr_header_id,
297                 p_effectivity_id   => p_threshold_rec.MR_EFFECTIVITY_ID,
298                 p_eff_obj_version  => p_threshold_rec.OBJECT_VERSION_NUMBER
299          );
300          IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
301          FND_MESSAGE.set_name( 'AHL', l_msg_data );
302          FND_MSG_PUB.add;
303          x_return_status := FND_API.G_RET_STS_ERROR;
304          RETURN;
305          END IF;
306     END IF;
307   END LOOP;
308 
309 
310   -- Check if a valid value is passed in p_threshold_rec.object_version_number if any other threshold information is passed
311   IF ( ( p_threshold_rec.threshold_date <> FND_API.G_MISS_DATE AND
312          p_threshold_rec.program_duration <> FND_API.G_MISS_NUM AND
313          p_threshold_rec.mr_effectivity_id IS NOT NULL ) AND
314        ( p_threshold_rec.object_version_number IS NULL OR
315          p_threshold_rec.object_version_number = FND_API.G_MISS_NUM ) ) THEN
316     FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_MRE_OBJ_VERSION_NULL' );
317     FND_MSG_PUB.add;
318     x_return_status := FND_API.G_RET_STS_ERROR;
319     RETURN;
320   END IF;
321 
322 END validate_api_inputs;
323 
324 -- Procedure to Default NULL / G_MISS Values for LOV attributes
325 PROCEDURE clear_lov_attribute_ids
326 (
327   p_x_interval_rec       IN OUT NOCOPY  interval_rec_type
328 )
329 IS
330 
331 BEGIN
332 
333   IF ( p_x_interval_rec.counter_name IS NULL ) THEN
334     p_x_interval_rec.counter_id := NULL;
335   ELSIF ( p_x_interval_rec.counter_name = FND_API.G_MISS_CHAR ) THEN
336     p_x_interval_rec.counter_id := FND_API.G_MISS_NUM;
337   END IF;
338 
339 END clear_lov_attribute_ids;
340 
341 -- Procedure to perform Value to ID conversion for appropriate attributes
342 PROCEDURE convert_values_to_ids
343 (
344   p_x_interval_rec             IN OUT NOCOPY  interval_rec_type,
345   p_mr_effectivity_id          IN             NUMBER,
346   x_return_status              OUT NOCOPY     VARCHAR2
347 )
348 IS
349 
350 l_return_status           VARCHAR2(1);
351 l_msg_data                VARCHAR2(2000);
352 l_inventory_item_id       NUMBER;
353 l_item_number             VARCHAR2(40);
354 l_relationship_id         NUMBER;
355 l_position_ref_meaning    VARCHAR2(80);
356 
357 CURSOR get_item_effectivity ( c_mr_effectivity_id NUMBER )
358 IS
359 SELECT  DECODE( relationship_id, null,
360                                  inventory_item_id,
361                                  position_inventory_item_id ),
362         DECODE( relationship_id, null,
363                                  item_number,
364                                  position_item_number ),
365         relationship_id,
366         position_ref_meaning
367 FROM    AHL_MR_EFFECTIVITIES_V
368 WHERE   mr_effectivity_id = c_mr_effectivity_id;
369 
370 BEGIN
371   x_return_status := FND_API.G_RET_STS_SUCCESS;
372 
373   -- Convert / Validate Counter
374   IF ( ( p_x_interval_rec.counter_id IS NOT NULL AND
375          p_x_interval_rec.counter_id <> FND_API.G_MISS_NUM ) OR
376        ( p_x_interval_rec.counter_name IS NOT NULL AND
377          p_x_interval_rec.counter_name <> FND_API.G_MISS_CHAR ) ) THEN
378 
379     OPEN get_item_effectivity( p_mr_effectivity_id );
380 
381     FETCH get_item_effectivity INTO
382       l_inventory_item_id,
383       l_item_number,
384       l_relationship_id,
385       l_position_ref_meaning;
386 
387     CLOSE get_item_effectivity;
388 
389     AHL_FMP_COMMON_PVT.validate_counter_template
390     (
391       x_return_status        => l_return_status,
392       x_msg_data             => l_msg_data,
393       p_inventory_item_id    => l_inventory_item_id,
394       p_relationship_id      => l_relationship_id,
395       p_counter_name         => p_x_interval_rec.counter_name,
396       p_x_counter_id         => p_x_interval_rec.counter_id
397     );
398 
399     IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
400       FND_MESSAGE.set_name( 'AHL', l_msg_data );
401 
402       IF ( l_msg_data = 'AHL_FMP_INVALID_COUNTER' OR
403            l_msg_data = 'AHL_FMP_TOO_MANY_COUNTERS' ) THEN
404         IF ( p_x_interval_rec.counter_name IS NULL OR
405              p_x_interval_rec.counter_name = FND_API.G_MISS_CHAR ) THEN
406           FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_x_interval_rec.counter_id ));
407         ELSE
408           FND_MESSAGE.set_token( 'FIELD', p_x_interval_rec.counter_name );
409         END IF;
410       ELSE
411         IF ( p_x_interval_rec.counter_name IS NULL OR
412              p_x_interval_rec.counter_name = FND_API.G_MISS_CHAR ) THEN
413           FND_MESSAGE.set_token( 'FIELD1', TO_CHAR( p_x_interval_rec.counter_id ) );
414         ELSE
415           FND_MESSAGE.set_token( 'FIELD1', p_x_interval_rec.counter_name );
416         END IF;
417 
418         IF ( l_position_ref_meaning IS NOT NULL ) THEN
419           FND_MESSAGE.set_token( 'FIELD2', l_position_ref_meaning );
420         ELSE
421           FND_MESSAGE.set_token( 'FIELD2', l_item_number );
422         END IF;
423       END IF;
424 
425       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_x_interval_rec ) );
426       FND_MSG_PUB.add;
427     END IF;
428 
429   END IF;
430 
431 END convert_values_to_ids;
432 
433 -- Procedure to add Default values for interval attributes
434 PROCEDURE default_attributes
435 (
436   p_x_interval_rec       IN OUT NOCOPY   interval_rec_type,
437   x_fractional_trunc_flag   OUT NOCOPY   BOOLEAN
438 )
439 IS
440 
441   l_value  NUMBER;
442 
443 BEGIN
444 
445   x_fractional_trunc_flag := FALSE;
446 
447   p_x_interval_rec.last_update_date := SYSDATE;
448   p_x_interval_rec.last_updated_by := FND_GLOBAL.user_id;
449   p_x_interval_rec.last_update_login := FND_GLOBAL.login_id;
450 
451   IF ( p_x_interval_rec.dml_operation = 'C' ) THEN
452     p_x_interval_rec.object_version_number := 1;
453     p_x_interval_rec.creation_date := SYSDATE;
454     p_x_interval_rec.created_by := FND_GLOBAL.user_id;
455   END IF;
456 
457   -- Fix for bug# 3482307.
458   IF (p_x_interval_rec.earliest_due_value IS NOT NULL AND
459       p_x_interval_rec.earliest_due_value <> FND_API.G_MISS_NUM) THEN
460         l_value := p_x_interval_rec.earliest_due_value;
461         p_x_interval_rec.earliest_due_value := trunc(p_x_interval_rec.earliest_due_value);
462         IF (l_value <> p_x_interval_rec.earliest_due_value) THEN
463            x_fractional_trunc_flag := TRUE;
464         END IF;
465   END IF;
466 
467   IF (p_x_interval_rec.start_value IS NOT NULL AND
468       p_x_interval_rec.start_value <> FND_API.G_MISS_NUM) THEN
469         l_value := p_x_interval_rec.start_value;
470         p_x_interval_rec.start_value := trunc(p_x_interval_rec.start_value);
471         IF (l_value <> p_x_interval_rec.start_value) THEN
472            x_fractional_trunc_flag := TRUE;
473         END IF;
474   END IF;
475 
476   IF (p_x_interval_rec.stop_value IS NOT NULL AND
477       p_x_interval_rec.stop_value <> FND_API.G_MISS_NUM) THEN
478         l_value := p_x_interval_rec.stop_value;
479         p_x_interval_rec.stop_value := trunc(p_x_interval_rec.stop_value);
480         IF (l_value <> p_x_interval_rec.stop_value) THEN
481            x_fractional_trunc_flag := TRUE;
482         END IF;
483   END IF;
484 
485   IF (p_x_interval_rec.interval_value IS NOT NULL AND
486       p_x_interval_rec.interval_value <> FND_API.G_MISS_NUM) THEN
487         l_value := p_x_interval_rec.interval_value;
488         p_x_interval_rec.interval_value := trunc(p_x_interval_rec.interval_value);
489         IF (l_value <> p_x_interval_rec.interval_value) THEN
490            x_fractional_trunc_flag := TRUE;
491         END IF;
492   END IF;
493 
494   IF (p_x_interval_rec.tolerance_before IS NOT NULL AND
495       p_x_interval_rec.tolerance_before <> FND_API.G_MISS_NUM) THEN
496         l_value := p_x_interval_rec.tolerance_before;
497         p_x_interval_rec.tolerance_before := trunc(p_x_interval_rec.tolerance_before);
498           IF (l_value <> p_x_interval_rec.tolerance_before) THEN
499            x_fractional_trunc_flag := TRUE;
500         END IF;
501   END IF;
502 
503   IF (p_x_interval_rec.tolerance_after IS NOT NULL AND
504       p_x_interval_rec.tolerance_after <> FND_API.G_MISS_NUM) THEN
505         l_value := p_x_interval_rec.tolerance_after;
506         p_x_interval_rec.tolerance_after := trunc(p_x_interval_rec.tolerance_after);
507         IF (l_value <> p_x_interval_rec.tolerance_after) THEN
508            x_fractional_trunc_flag := TRUE;
509         END IF;
510   END IF;
511 
512 END default_attributes;
513 
514  -- Procedure to add Default values for missing attributes (CREATE)
515 PROCEDURE default_missing_attributes
516 (
517   p_x_interval_rec       IN OUT NOCOPY   interval_rec_type
518 )
519 IS
520 
521 BEGIN
522 
523   -- Convert G_MISS values to NULL
524   IF ( p_x_interval_rec.earliest_due_value = FND_API.G_MISS_NUM ) THEN
525     p_x_interval_rec.earliest_due_value := null;
526   END IF;
527 
528   IF ( p_x_interval_rec.start_value = FND_API.G_MISS_NUM ) THEN
529     p_x_interval_rec.start_value := null;
530   END IF;
531 
532   IF ( p_x_interval_rec.stop_value = FND_API.G_MISS_NUM ) THEN
533     p_x_interval_rec.stop_value := null;
534   END IF;
535 
536   IF ( p_x_interval_rec.tolerance_before = FND_API.G_MISS_NUM ) THEN
537     p_x_interval_rec.tolerance_before := null;
538   END IF;
539 
540   IF ( p_x_interval_rec.tolerance_after = FND_API.G_MISS_NUM ) THEN
541     p_x_interval_rec.tolerance_after := null;
542   END IF;
543 
544   IF ( p_x_interval_rec.reset_value = FND_API.G_MISS_NUM ) THEN
545     p_x_interval_rec.reset_value := null;
546   END IF;
547 
548   IF ( p_x_interval_rec.start_date = FND_API.G_MISS_DATE ) THEN
549     p_x_interval_rec.start_date := null;
550   END IF;
551 
552   IF ( p_x_interval_rec.stop_date = FND_API.G_MISS_DATE ) THEN
553     p_x_interval_rec.stop_date := null;
554   END IF;
555 
556   IF ( p_x_interval_rec.attribute_category = FND_API.G_MISS_CHAR ) THEN
557     p_x_interval_rec.attribute_category := null;
558   END IF;
559 
560   IF ( p_x_interval_rec.attribute1 = FND_API.G_MISS_CHAR ) THEN
561     p_x_interval_rec.attribute1 := null;
562   END IF;
563 
564   IF ( p_x_interval_rec.attribute2 = FND_API.G_MISS_CHAR ) THEN
565     p_x_interval_rec.attribute2 := null;
566   END IF;
567 
568   IF ( p_x_interval_rec.attribute3 = FND_API.G_MISS_CHAR ) THEN
569     p_x_interval_rec.attribute3 := null;
570   END IF;
571 
572   IF ( p_x_interval_rec.attribute4 = FND_API.G_MISS_CHAR ) THEN
573     p_x_interval_rec.attribute4 := null;
574   END IF;
575 
576   IF ( p_x_interval_rec.attribute5 = FND_API.G_MISS_CHAR ) THEN
577     p_x_interval_rec.attribute5 := null;
578   END IF;
579 
580   IF ( p_x_interval_rec.attribute6 = FND_API.G_MISS_CHAR ) THEN
581     p_x_interval_rec.attribute6 := null;
582   END IF;
583 
584   IF ( p_x_interval_rec.attribute7 = FND_API.G_MISS_CHAR ) THEN
585     p_x_interval_rec.attribute7 := null;
586   END IF;
587 
588   IF ( p_x_interval_rec.attribute8 = FND_API.G_MISS_CHAR ) THEN
589     p_x_interval_rec.attribute8 := null;
590   END IF;
591 
592   IF ( p_x_interval_rec.attribute9 = FND_API.G_MISS_CHAR ) THEN
593     p_x_interval_rec.attribute9 := null;
594   END IF;
595 
596   IF ( p_x_interval_rec.attribute10 = FND_API.G_MISS_CHAR ) THEN
597     p_x_interval_rec.attribute10 := null;
598   END IF;
599 
600   IF ( p_x_interval_rec.attribute11 = FND_API.G_MISS_CHAR ) THEN
601     p_x_interval_rec.attribute11 := null;
602   END IF;
603 
604   IF ( p_x_interval_rec.attribute12 = FND_API.G_MISS_CHAR ) THEN
605     p_x_interval_rec.attribute12 := null;
606   END IF;
607 
608   IF ( p_x_interval_rec.attribute13 = FND_API.G_MISS_CHAR ) THEN
609     p_x_interval_rec.attribute13 := null;
610   END IF;
611 
612   IF ( p_x_interval_rec.attribute14 = FND_API.G_MISS_CHAR ) THEN
613     p_x_interval_rec.attribute14 := null;
614   END IF;
615 
616   IF ( p_x_interval_rec.attribute15 = FND_API.G_MISS_CHAR ) THEN
617     p_x_interval_rec.attribute15 := null;
618   END IF;
619 
620 END default_missing_attributes;
621 
622  -- Procedure to add Default values for unchanged attributes (UPDATE)
623 PROCEDURE default_unchanged_attributes
624 (
625   p_x_interval_rec       IN OUT NOCOPY   interval_rec_type
626 )
627 IS
628 
629 l_old_interval_rec       interval_rec_type;
630 
631 CURSOR get_old_rec ( c_mr_interval_id NUMBER )
632 IS
633 SELECT  counter_id,
634         interval_value,
635         earliest_due_value,
636         start_value,
637         stop_value,
638         tolerance_before,
639         tolerance_after,
640         reset_value,
641         start_date,
642         stop_date,
643         attribute_category,
644         attribute1,
645         attribute2,
646         attribute3,
647         attribute4,
648         attribute5,
649         attribute6,
650         attribute7,
651         attribute8,
652         attribute9,
653         attribute10,
654         attribute11,
655         attribute12,
656         attribute13,
657         attribute14,
658         attribute15
659 FROM    AHL_MR_INTERVALS_APP_V
660 WHERE   mr_interval_id = c_mr_interval_id;
661 
662 BEGIN
663 
664   -- Get the old record from AHL_MR_INTERVALS.
665   OPEN  get_old_rec( p_x_interval_rec.mr_interval_id );
666 
667   FETCH get_old_rec INTO
668         l_old_interval_rec.counter_id,
669         l_old_interval_rec.interval_value,
670         l_old_interval_rec.earliest_due_value,
671         l_old_interval_rec.start_value,
672         l_old_interval_rec.stop_value,
673         l_old_interval_rec.tolerance_before,
674         l_old_interval_rec.tolerance_after,
675         l_old_interval_rec.reset_value,
676         l_old_interval_rec.start_date,
677         l_old_interval_rec.stop_date,
678         l_old_interval_rec.attribute_category,
679         l_old_interval_rec.attribute1,
680         l_old_interval_rec.attribute2,
681         l_old_interval_rec.attribute3,
682         l_old_interval_rec.attribute4,
683         l_old_interval_rec.attribute5,
684         l_old_interval_rec.attribute6,
685         l_old_interval_rec.attribute7,
686         l_old_interval_rec.attribute8,
687         l_old_interval_rec.attribute9,
688         l_old_interval_rec.attribute10,
689         l_old_interval_rec.attribute11,
690         l_old_interval_rec.attribute12,
691         l_old_interval_rec.attribute13,
692         l_old_interval_rec.attribute14,
693         l_old_interval_rec.attribute15;
694 
695   IF get_old_rec%NOTFOUND THEN
696     FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_INVALID_INTERVAL_REC' );
697     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_x_interval_rec ) );
698     FND_MSG_PUB.add;
699     CLOSE get_old_rec;
700     RAISE FND_API.G_EXC_ERROR;
701   END IF;
702 
703   CLOSE get_old_rec;
704 
705   -- Convert G_MISS values to NULL and NULL values to Old values
706   IF ( p_x_interval_rec.counter_id IS NULL ) THEN
707     p_x_interval_rec.counter_id := l_old_interval_rec.counter_id;
708   END IF;
709 
710   IF ( p_x_interval_rec.interval_value = FND_API.G_MISS_NUM ) THEN
711     p_x_interval_rec.interval_value := null;
712   ELSIF ( p_x_interval_rec.interval_value IS NULL ) THEN
713     p_x_interval_rec.interval_value := l_old_interval_rec.interval_value;
714   END IF;
715 
716   IF ( p_x_interval_rec.earliest_due_value = FND_API.G_MISS_NUM ) THEN
717     p_x_interval_rec.earliest_due_value := null;
718   ELSIF ( p_x_interval_rec.earliest_due_value IS NULL ) THEN
719     p_x_interval_rec.earliest_due_value := l_old_interval_rec.earliest_due_value;
720   END IF;
721 
722   IF ( p_x_interval_rec.start_value = FND_API.G_MISS_NUM ) THEN
723     p_x_interval_rec.start_value := null;
724   ELSIF ( p_x_interval_rec.start_value IS NULL ) THEN
725     p_x_interval_rec.start_value := l_old_interval_rec.start_value;
726   END IF;
727 
728   IF ( p_x_interval_rec.stop_value = FND_API.G_MISS_NUM ) THEN
729     p_x_interval_rec.stop_value := null;
730   ELSIF ( p_x_interval_rec.stop_value IS NULL ) THEN
731     p_x_interval_rec.stop_value := l_old_interval_rec.stop_value;
732   END IF;
733 
734   IF ( p_x_interval_rec.tolerance_before = FND_API.G_MISS_NUM ) THEN
735     p_x_interval_rec.tolerance_before := null;
736   ELSIF ( p_x_interval_rec.tolerance_before IS NULL ) THEN
737     p_x_interval_rec.tolerance_before := l_old_interval_rec.tolerance_before;
738   END IF;
739 
740   IF ( p_x_interval_rec.tolerance_after = FND_API.G_MISS_NUM ) THEN
741     p_x_interval_rec.tolerance_after := null;
742   ELSIF ( p_x_interval_rec.tolerance_after IS NULL ) THEN
743     p_x_interval_rec.tolerance_after := l_old_interval_rec.tolerance_after;
744   END IF;
745 
746   IF ( p_x_interval_rec.reset_value = FND_API.G_MISS_NUM ) THEN
747     p_x_interval_rec.reset_value := null;
748   ELSIF ( p_x_interval_rec.reset_value IS NULL ) THEN
749     p_x_interval_rec.reset_value := l_old_interval_rec.reset_value;
750   END IF;
751 
752 
753   IF ( p_x_interval_rec.start_date = FND_API.G_MISS_DATE ) THEN
754     p_x_interval_rec.start_date := null;
755   ELSIF ( p_x_interval_rec.start_date IS NULL ) THEN
756     p_x_interval_rec.start_date := l_old_interval_rec.start_date;
757   END IF;
758 
759   IF ( p_x_interval_rec.stop_date = FND_API.G_MISS_DATE ) THEN
760     p_x_interval_rec.stop_date := null;
761   ELSIF ( p_x_interval_rec.stop_date IS NULL ) THEN
762     p_x_interval_rec.stop_date := l_old_interval_rec.stop_date;
763   END IF;
764 
765   IF ( p_x_interval_rec.attribute_category = FND_API.G_MISS_CHAR ) THEN
766     p_x_interval_rec.attribute_category := null;
767   ELSIF ( p_x_interval_rec.attribute_category IS NULL ) THEN
768     p_x_interval_rec.attribute_category := l_old_interval_rec.attribute_category;
769   END IF;
770 
771   IF ( p_x_interval_rec.attribute1 = FND_API.G_MISS_CHAR ) THEN
772     p_x_interval_rec.attribute1 := null;
773   ELSIF ( p_x_interval_rec.attribute1 IS NULL ) THEN
774     p_x_interval_rec.attribute1 := l_old_interval_rec.attribute1;
775   END IF;
776 
777   IF ( p_x_interval_rec.attribute2 = FND_API.G_MISS_CHAR ) THEN
778     p_x_interval_rec.attribute2 := null;
779   ELSIF ( p_x_interval_rec.attribute2 IS NULL ) THEN
780     p_x_interval_rec.attribute2 := l_old_interval_rec.attribute2;
781   END IF;
782 
783   IF ( p_x_interval_rec.attribute3 = FND_API.G_MISS_CHAR ) THEN
784     p_x_interval_rec.attribute3 := null;
785   ELSIF ( p_x_interval_rec.attribute3 IS NULL ) THEN
786     p_x_interval_rec.attribute3 := l_old_interval_rec.attribute3;
787   END IF;
788 
789   IF ( p_x_interval_rec.attribute4 = FND_API.G_MISS_CHAR ) THEN
790     p_x_interval_rec.attribute4 := null;
791   ELSIF ( p_x_interval_rec.attribute4 IS NULL ) THEN
792     p_x_interval_rec.attribute4 := l_old_interval_rec.attribute4;
793   END IF;
794 
795   IF ( p_x_interval_rec.attribute5 = FND_API.G_MISS_CHAR ) THEN
796     p_x_interval_rec.attribute5 := null;
797   ELSIF ( p_x_interval_rec.attribute5 IS NULL ) THEN
798     p_x_interval_rec.attribute5 := l_old_interval_rec.attribute5;
799   END IF;
800 
801   IF ( p_x_interval_rec.attribute6 = FND_API.G_MISS_CHAR ) THEN
802     p_x_interval_rec.attribute6 := null;
803   ELSIF ( p_x_interval_rec.attribute6 IS NULL ) THEN
804     p_x_interval_rec.attribute6 := l_old_interval_rec.attribute6;
805   END IF;
806 
807   IF ( p_x_interval_rec.attribute7 = FND_API.G_MISS_CHAR ) THEN
808     p_x_interval_rec.attribute7 := null;
809   ELSIF ( p_x_interval_rec.attribute7 IS NULL ) THEN
810     p_x_interval_rec.attribute7 := l_old_interval_rec.attribute7;
811   END IF;
812 
813   IF ( p_x_interval_rec.attribute8 = FND_API.G_MISS_CHAR ) THEN
814     p_x_interval_rec.attribute8 := null;
815   ELSIF ( p_x_interval_rec.attribute8 IS NULL ) THEN
816     p_x_interval_rec.attribute8 := l_old_interval_rec.attribute8;
817   END IF;
818 
819   IF ( p_x_interval_rec.attribute9 = FND_API.G_MISS_CHAR ) THEN
820     p_x_interval_rec.attribute9 := null;
821   ELSIF ( p_x_interval_rec.attribute9 IS NULL ) THEN
822     p_x_interval_rec.attribute9 := l_old_interval_rec.attribute9;
823   END IF;
824 
825   IF ( p_x_interval_rec.attribute10 = FND_API.G_MISS_CHAR ) THEN
826     p_x_interval_rec.attribute10 := null;
827   ELSIF ( p_x_interval_rec.attribute10 IS NULL ) THEN
828     p_x_interval_rec.attribute10 := l_old_interval_rec.attribute10;
829   END IF;
830 
831   IF ( p_x_interval_rec.attribute11 = FND_API.G_MISS_CHAR ) THEN
832     p_x_interval_rec.attribute11 := null;
833   ELSIF ( p_x_interval_rec.attribute11 IS NULL ) THEN
834     p_x_interval_rec.attribute11 := l_old_interval_rec.attribute11;
835   END IF;
836 
837   IF ( p_x_interval_rec.attribute12 = FND_API.G_MISS_CHAR ) THEN
838     p_x_interval_rec.attribute12 := null;
839   ELSIF ( p_x_interval_rec.attribute12 IS NULL ) THEN
840     p_x_interval_rec.attribute12 := l_old_interval_rec.attribute12;
841   END IF;
842 
843   IF ( p_x_interval_rec.attribute13 = FND_API.G_MISS_CHAR ) THEN
844     p_x_interval_rec.attribute13 := null;
845   ELSIF ( p_x_interval_rec.attribute13 IS NULL ) THEN
846     p_x_interval_rec.attribute13 := l_old_interval_rec.attribute13;
847   END IF;
848 
849   IF ( p_x_interval_rec.attribute14 = FND_API.G_MISS_CHAR ) THEN
850     p_x_interval_rec.attribute14 := null;
851   ELSIF ( p_x_interval_rec.attribute14 IS NULL ) THEN
852     p_x_interval_rec.attribute14 := l_old_interval_rec.attribute14;
853   END IF;
854 
855   IF ( p_x_interval_rec.attribute15 = FND_API.G_MISS_CHAR ) THEN
856     p_x_interval_rec.attribute15 := null;
857   ELSIF ( p_x_interval_rec.attribute15 IS NULL ) THEN
858     p_x_interval_rec.attribute15 := l_old_interval_rec.attribute15;
859   END IF;
860 
861 END default_unchanged_attributes;
862 
863 -- Procedure to validate individual interval attributes
864 PROCEDURE validate_attributes
865 (
866   p_interval_rec                 IN    interval_rec_type,
867   x_return_status                OUT NOCOPY VARCHAR2
868 )
869 IS
870 
871 BEGIN
872   x_return_status := FND_API.G_RET_STS_SUCCESS;
873 
874   -- Check if the Counter ID does not contain a null value.
875   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
876     IF ( ( p_interval_rec.dml_operation = 'C' AND
877            p_interval_rec.counter_id IS NULL AND
878            p_interval_rec.counter_name IS NULL ) OR
879          ( p_interval_rec.counter_id = FND_API.G_MISS_NUM AND
880            p_interval_rec.counter_name = FND_API.G_MISS_CHAR ) ) THEN
881       FND_MESSAGE.set_name( 'AHL','AHL_FMP_COUNTER_NULL' );
882       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
883       FND_MSG_PUB.add;
884     END IF;
885   END IF;
886 
887   -- Check if the Interval Value does not contain an invalid value
888   IF ( p_interval_rec.interval_value IS NOT NULL AND
889        p_interval_rec.interval_value <= 0 ) THEN
890     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_INTERVAL' );
891     FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.interval_value ) );
892     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
893     FND_MSG_PUB.add;
894   END IF;
895 
896   -- Check if the earliest due  Value does not contain an invalid value.
897   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
898     IF ( p_interval_rec.earliest_due_value IS NOT NULL AND
899          p_interval_rec.earliest_due_value <> FND_API.G_MISS_NUM AND
900          p_interval_rec.earliest_due_value < 0 ) THEN
901       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_EARL_DUE' );
902       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.earliest_due_value ) );
903       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
904       FND_MSG_PUB.add;
905     END IF;
906   END IF;
907 
908   -- Check if the Start Value does not contain an invalid value.
909   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
910     IF ( p_interval_rec.start_value IS NOT NULL AND
911          p_interval_rec.start_value <> FND_API.G_MISS_NUM AND
912          p_interval_rec.start_value < 0 ) THEN
913       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_START' );
914       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.start_value ) );
915       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
916       FND_MSG_PUB.add;
917     END IF;
918   END IF;
919 
920   -- Check if the Stop Value does not contain an invalid value.
921   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
922     IF ( p_interval_rec.stop_value IS NOT NULL AND
923          p_interval_rec.stop_value <> FND_API.G_MISS_NUM AND
924          p_interval_rec.stop_value <= 0 ) THEN
925       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_STOP' );
926       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.stop_value ) );
927       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
928       FND_MSG_PUB.add;
929     END IF;
930   END IF;
931 
932   -- Check if the Tolerance Before does not contain an invalid value.
933   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
934     IF ( p_interval_rec.tolerance_before IS NOT NULL AND
935          p_interval_rec.tolerance_before <> FND_API.G_MISS_NUM AND
936          p_interval_rec.tolerance_before < 0 ) THEN
937       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_TOLERANCE_BF' );
938       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.tolerance_before ) );
939       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
940       FND_MSG_PUB.add;
941     END IF;
942   END IF;
943 
944   -- Check if the Tolerance After does not contain an invalid value.
945   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
946     IF ( p_interval_rec.tolerance_after IS NOT NULL AND
947          p_interval_rec.tolerance_after <> FND_API.G_MISS_NUM AND
948          p_interval_rec.tolerance_after < 0 ) THEN
949       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_TOLERANCE_AF' );
950       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.tolerance_after ) );
951       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
952       FND_MSG_PUB.add;
953     END IF;
954   END IF;
955 
956   -- Check if the Reset After does not contain an invalid value.
957   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
958     IF ( p_interval_rec.reset_value IS NOT NULL AND
959          p_interval_rec.reset_value <> FND_API.G_MISS_NUM AND
960          p_interval_rec.reset_value < 0 ) THEN
961       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_RESET_VALUE' );
962       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.reset_value ) );
963       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
964       FND_MSG_PUB.add;
965     END IF;
966   END IF;
967 
968   -- Check if the mandatory Interval ID column contains a null value.
969   IF ( p_interval_rec.dml_operation <> 'C' ) THEN
970     IF ( p_interval_rec.mr_interval_id IS NULL OR
971          p_interval_rec.mr_interval_id = FND_API.G_MISS_NUM ) THEN
972       FND_MESSAGE.set_name( 'AHL','AHL_FMP_MR_INTERVAL_ID_NULL' );
973       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
974       FND_MSG_PUB.add;
975     END IF;
976   END IF;
977 
978   -- Check if the mandatory Object Version Number column contains a null value.
979   IF ( p_interval_rec.dml_operation <> 'C' ) THEN
980     IF ( p_interval_rec.object_version_number IS NULL OR
981          p_interval_rec.object_version_number = FND_API.G_MISS_NUM ) THEN
982       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INT_OBJ_VERSION_NULL' );
983       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
984       FND_MSG_PUB.add;
985     END IF;
986   END IF;
987 
988 END validate_attributes;
989 
990 -- Procedure to Perform cross attribute validation and missing attribute checks (Record level validation)
991 PROCEDURE validate_record
992 (
993   p_interval_rec                 IN    interval_rec_type,
994   p_repetitive_flag              IN    VARCHAR2,
995   p_appln_code                   IN    VARCHAR2,
996   p_mr_type_code                 IN    VARCHAR2,
997   x_return_status                OUT NOCOPY VARCHAR2
998 )
999 IS
1000 
1001 l_return_status              VARCHAR2(1);
1002 l_msg_data                   VARCHAR2(2000);
1003 l_initial_reading            NUMBER;
1004 
1005 BEGIN
1006   x_return_status := FND_API.G_RET_STS_SUCCESS;
1007 
1008   -- Check if the appropriate attributes are passed for PM Programs
1009   IF ( p_mr_type_code = 'PROGRAM' AND
1010        ( p_interval_rec.tolerance_before IS NOT NULL OR
1011          p_interval_rec.tolerance_after IS NOT NULL OR
1012          p_interval_rec.reset_value IS NOT NULL OR
1013          p_interval_rec.interval_value IS NOT NULL OR
1014          p_interval_rec.start_date IS NOT NULL OR
1015          p_interval_rec.stop_date IS NOT NULL ) ) THEN
1016     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_INPUTS' );
1017     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1018     FND_MSG_PUB.add;
1019   END IF;
1020 
1021   -- Check if the Interval Value is always passed for non-PM Programs
1022   IF ( ( p_mr_type_code IS NULL OR
1023          p_mr_type_code <> 'PROGRAM' ) AND
1024        ( p_interval_rec.dml_operation = 'C' AND
1025          p_interval_rec.interval_value IS NULL ) OR
1026        ( p_interval_rec.interval_value = FND_API.G_MISS_NUM ) ) THEN
1027     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INTERVAL_NULL' );
1028     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1029     FND_MSG_PUB.add;
1030   END IF;
1031 
1032   -- Check if Start is passed for PM Programs
1033   IF ( p_mr_type_code = 'PROGRAM' AND
1034        p_interval_rec.start_value IS NULL ) THEN
1035     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_START_NULL' );
1036     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1037     FND_MSG_PUB.add;
1038     RETURN;
1039   END IF;
1040 
1041   -- Check if Stop is passed for PM Programs
1042   IF ( p_mr_type_code = 'PROGRAM' AND
1043        p_interval_rec.stop_value IS NULL ) THEN
1044     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_STOP_NULL' );
1045     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1046     FND_MSG_PUB.add;
1047     RETURN;
1048   END IF;
1049 
1050   -- Check if Range is not passed for One Time MRs.
1051   IF ( ( p_mr_type_code IS NULL OR
1052          p_mr_type_code <> 'PROGRAM' ) AND
1053        p_repetitive_flag = 'N' AND
1054        ( p_interval_rec.start_value IS NOT NULL OR
1055          p_interval_rec.stop_value IS NOT NULL OR
1056          p_interval_rec.start_date IS NOT NULL OR
1057          p_interval_rec.stop_date IS NOT NULL ) ) THEN
1058     FND_MESSAGE.set_name( 'AHL','AHL_FMP_RANGE_NOTNULL' );
1059     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1060     FND_MSG_PUB.add;
1061     RETURN;
1062   END IF;
1063 
1064   -- Check if the Tolerance Before is less than the Interval Value
1065   IF ( p_interval_rec.tolerance_before IS NOT NULL AND
1066        p_interval_rec.tolerance_before >=  p_interval_rec.interval_value ) THEN
1067     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_TOL_BF_INT' );
1068     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1069     FND_MSG_PUB.add;
1070   END IF;
1071 
1072   -- Check if the Tolerance After is less than the Interval Value
1073   IF ( p_interval_rec.tolerance_after IS NOT NULL AND
1074        p_interval_rec.tolerance_after >=  p_interval_rec.interval_value ) THEN
1075     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_TOL_AF_INT' );
1076     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1077     FND_MSG_PUB.add;
1078   END IF;
1079 
1080   IF ( p_interval_rec.counter_id IS NOT NULL AND
1081        p_interval_rec.reset_value IS NOT NULL AND
1082        p_interval_rec.reset_value >= 0 ) THEN
1083 
1084     SELECT  NVL( initial_reading, 0 )
1085     INTO    l_initial_reading
1086     FROM    csi_counter_template_vl --amsriniv
1087     WHERE   counter_id = p_interval_rec.counter_id;
1088 
1089     -- Check if the Reset Value is less than the initial reading for the counter
1090     IF ( p_interval_rec.reset_value < l_initial_reading ) THEN
1091       FND_MESSAGE.set_name( 'AHL','AHL_FMP_RESET_LESS_INIT_VALUE' );
1092       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( l_initial_reading ) );
1093       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1094       FND_MSG_PUB.add;
1095     END IF;
1096 
1097   END IF;
1098 
1099   -- Check if the Start Value is passed if Stop Value is passed
1100   IF ( p_interval_rec.start_value IS NULL AND
1101        p_interval_rec.stop_value IS NOT NULL ) THEN
1102     FND_MESSAGE.set_name( 'AHL','AHL_FMP_MISSING_VALUE_RANGE' );
1103     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1104     FND_MSG_PUB.add;
1105   END IF;
1106 
1107   -- Check if the Start Value is passed if Stop Value is passed
1108   IF ( p_interval_rec.start_value IS NULL AND
1109        p_interval_rec.start_date IS NULL AND
1110        p_interval_rec.earliest_due_value IS NOT NULL ) THEN
1111     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_INTERVAL_RANGE' );
1112     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1113     FND_MSG_PUB.add;
1114   END IF;
1115 
1116   -- Check if the Start Date is passed if Stop Date is passed
1117   IF ( p_interval_rec.start_date IS NULL AND
1118        p_interval_rec.stop_date IS NOT NULL ) THEN
1119     FND_MESSAGE.set_name( 'AHL','AHL_FMP_MISSING_DATE_RANGE' );
1120     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1121     FND_MSG_PUB.add;
1122   END IF;
1123 
1124   -- Check if the Stop Value is not greater than Start Value
1125   IF ( p_interval_rec.start_value IS NOT NULL AND
1126        p_interval_rec.stop_value IS NOT NULL AND
1127        p_interval_rec.stop_value < p_interval_rec.start_value ) THEN
1128     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_VALUE_RANGE' );
1129     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1130     FND_MSG_PUB.add;
1131   END IF;
1132 
1133   -- Check if the Stop date is not greater than Start date
1134   IF ( p_interval_rec.start_date IS NOT NULL AND
1135        p_interval_rec.stop_date IS NOT NULL AND
1136        p_interval_rec.stop_date < p_interval_rec.start_date ) THEN
1137     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_DATE_RANGE' );
1138     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1139     FND_MSG_PUB.add;
1140   END IF;
1141 
1142   -- Check if both Date based and Value based interval ranges are not passed
1143   IF ( ( p_interval_rec.start_date IS NOT NULL OR
1144          p_interval_rec.stop_date IS NOT NULL ) AND
1145        ( p_interval_rec.start_value IS NOT NULL OR
1146          p_interval_rec.stop_value IS NOT NULL ) ) THEN
1147     FND_MESSAGE.set_name( 'AHL','AHL_FMP_BOTH_DATE_VALUE_RANGE' );
1148     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1149     FND_MSG_PUB.add;
1150   END IF;
1151 
1152   -- Check if the Interval Value is between Start Value and Stop Value
1153   IF ( p_interval_rec.start_value IS NOT NULL AND
1154        p_interval_rec.stop_value IS NOT NULL AND
1155        p_interval_rec.interval_value >
1156          --( p_interval_rec.stop_value - p_interval_rec.start_value ) ) THEN
1157          -- Fix for bug# 3482307.
1158          ( p_interval_rec.stop_value - p_interval_rec.start_value + 1) ) THEN
1159     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_INTERVAL_RANGE' );
1160     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1161     FND_MSG_PUB.add;
1162   END IF;
1163 
1164   -- Check if the earliest due value is less than Start Value
1165   IF ( p_interval_rec.start_value IS NOT NULL AND
1166        p_interval_rec.earliest_due_value >  p_interval_rec.start_value ) THEN
1167     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_INTERVAL_RANGE' );
1168     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1169     FND_MSG_PUB.add;
1170   END IF;
1171 
1172 END validate_record;
1173 
1174 -- Procedure to Perform cross records validation and duplicate checks
1175 PROCEDURE validate_records
1176 (
1177   p_mr_effectivity_id       IN    NUMBER,
1178   p_repetitive_flag         IN    VARCHAR2,
1179   p_appln_code              IN    VARCHAR2,
1180   p_mr_type_code            IN    VARCHAR2,
1181   x_return_status           OUT NOCOPY VARCHAR2
1182 )
1183 IS
1184 
1185 l_interval_rec                    interval_rec_type;
1186 l_prev_counter_id                 NUMBER := NULL;
1187 l_prev_stop_date                  DATE := NULL;
1188 l_prev_stop_value                 NUMBER := NULL;
1189 l_counter_id                      NUMBER := NULL;
1190 l_counter_name                    VARCHAR2(30) := NULL;
1191 l_start_date                      DATE;
1192 l_stop_date                       DATE;
1193 l_start_value                     NUMBER;
1194 l_stop_value                      NUMBER;
1195 l_earliest_due_value              NUMBER;
1196 
1197 CURSOR get_pm_pgm_dup_rec( c_mr_effectivity_id NUMBER )
1198 IS
1199 SELECT   counter_id,
1200          counter_name
1201 FROM     AHL_MR_INTERVALS_V
1202 WHERE    mr_effectivity_id = c_mr_effectivity_id
1203 GROUP BY counter_id,
1204          counter_name
1205 HAVING   count(*) > 1;
1206 
1207 CURSOR get_dup_rec( c_mr_effectivity_id NUMBER )
1208 IS
1209 SELECT   counter_id,
1210          counter_name,
1211          start_value,
1212          stop_value,
1213          start_date,
1214          stop_date
1215 FROM     AHL_MR_INTERVALS_V
1216 WHERE    mr_effectivity_id = c_mr_effectivity_id
1217 GROUP BY counter_id,
1218          counter_name,
1219          start_value,
1220          stop_value,
1221          start_date,
1222          stop_date
1223 HAVING   count(*) > 1;
1224 
1225 CURSOR get_recs_for_date_range( c_mr_effectivity_id NUMBER )
1226 IS
1227 SELECT   counter_id,
1228          counter_name,
1229          start_date,
1230          stop_date
1231 FROM     AHL_MR_INTERVALS_V
1232 WHERE    mr_effectivity_id = c_mr_effectivity_id
1233 ORDER BY counter_id,
1234          start_date,
1235          stop_date;
1236 
1237 CURSOR get_recs_for_value_range( c_mr_effectivity_id NUMBER )
1238 IS
1239 SELECT   counter_id,
1240          counter_name,
1241          earliest_due_value,
1242          start_value,
1243          stop_value
1244 FROM     AHL_MR_INTERVALS_V
1245 WHERE    mr_effectivity_id = c_mr_effectivity_id
1246 ORDER BY counter_id,
1247          start_value,
1248          stop_value;
1249 
1250 CURSOR   check_unique_reset_value( c_mr_effectivity_id NUMBER )
1251 IS
1252 SELECT   counter_name
1253 FROM     AHL_MR_INTERVALS_V
1254 WHERE    mr_effectivity_id = c_mr_effectivity_id
1255 AND      reset_value IS NOT NULL
1256 GROUP BY counter_name
1257 HAVING   count(*) > 1;
1258 
1259 BEGIN
1260   x_return_status := FND_API.G_RET_STS_SUCCESS;
1261 
1262   -- Check whether any duplicate Interval record (based on Counter) exist
1263   -- For Preventive Maintenance Programs
1264 
1265   IF ( p_appln_code = 'PM' AND
1266        p_mr_type_code = 'PROGRAM' ) THEN
1267 
1268     OPEN  get_pm_pgm_dup_rec( p_mr_effectivity_id );
1269 
1270     LOOP
1271       FETCH get_pm_pgm_dup_rec INTO
1272         l_interval_rec.counter_id,
1273         l_interval_rec.counter_name;
1274 
1275       EXIT WHEN get_pm_pgm_dup_rec%NOTFOUND;
1276 
1277       FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_PM_PGM_DUP_INT_REC' );
1278       FND_MESSAGE.set_token( 'FIELD', l_interval_rec.counter_name );
1279       FND_MSG_PUB.add;
1280     END LOOP;
1281 
1282     IF ( get_pm_pgm_dup_rec%ROWCOUNT > 0 ) THEN
1283       x_return_status := FND_API.G_RET_STS_ERROR;
1284     END IF;
1285 
1286     CLOSE get_pm_pgm_dup_rec;
1287     RETURN;
1288 
1289   END IF;
1290 
1291   -- Check whether any duplicate Interval record (based on Counter and Range) exist
1292   OPEN  get_dup_rec( p_mr_effectivity_id );
1293 
1294   LOOP
1295     FETCH get_dup_rec INTO
1296       l_interval_rec.counter_id,
1297       l_interval_rec.counter_name,
1298       l_interval_rec.start_value,
1299       l_interval_rec.stop_value,
1300       l_interval_rec.start_date,
1301       l_interval_rec.stop_date;
1302 
1303     EXIT WHEN get_dup_rec%NOTFOUND;
1304 
1305     FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_DUPLICATE_INT_REC' );
1306     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( l_interval_rec ) );
1307     FND_MSG_PUB.add;
1308   END LOOP;
1309 
1310   IF ( get_dup_rec%ROWCOUNT > 0 ) THEN
1311     CLOSE get_dup_rec;
1312     x_return_status := FND_API.G_RET_STS_ERROR;
1313     RETURN;
1314   END IF;
1315 
1316   CLOSE get_dup_rec;
1317 
1318   IF ( p_repetitive_flag = 'N' ) THEN
1319     RETURN;
1320   END IF;
1321 
1322   OPEN get_recs_for_date_range( p_mr_effectivity_id );
1323 
1324   LOOP
1325     FETCH get_recs_for_date_range INTO
1326       l_interval_rec.counter_id,
1327       l_interval_rec.counter_name,
1328       l_interval_rec.start_date,
1329       l_interval_rec.stop_date;
1330 
1331     EXIT WHEN get_recs_for_date_range%NOTFOUND;
1332 
1333     IF ( l_prev_counter_id IS NOT NULL AND
1334          l_prev_stop_date IS NOT NULL AND
1335          l_interval_rec.counter_id = l_prev_counter_id AND
1336          --l_interval_rec.start_date < l_prev_stop_date ) THEN
1337          -- Fix for bug# 3482307.
1338          l_interval_rec.start_date <= l_prev_stop_date ) THEN
1339       FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_OVERLAP_DATE_RANGE' );
1340       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( l_interval_rec ) );
1341       FND_MSG_PUB.add;
1342       CLOSE get_recs_for_date_range;
1343       x_return_status := FND_API.G_RET_STS_ERROR;
1344       RETURN;
1345     END IF;
1346 
1347     l_prev_counter_id := l_interval_rec.counter_id;
1348     l_prev_stop_date := l_interval_rec.stop_date;
1349 
1350   END LOOP;
1351 
1352   CLOSE get_recs_for_date_range;
1353   l_prev_counter_id := null;
1354 
1355   OPEN get_recs_for_value_range( p_mr_effectivity_id );
1356 
1357   LOOP
1358     FETCH get_recs_for_value_range INTO
1359       l_interval_rec.counter_id,
1360       l_interval_rec.counter_name,
1361       l_interval_rec.earliest_due_value,
1362       l_interval_rec.start_value,
1363       l_interval_rec.stop_value;
1364 
1365     EXIT WHEN get_recs_for_value_range%NOTFOUND;
1366 
1367     IF ( l_prev_counter_id IS NOT NULL AND
1368          l_prev_stop_value IS NOT NULL AND
1369          l_interval_rec.counter_id = l_prev_counter_id AND
1370          --l_interval_rec.start_value < l_prev_stop_value ) THEN
1371          -- Fix for bug# 3482307.
1372          l_interval_rec.start_value <= l_prev_stop_value ) THEN
1373       FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_OVERLAP_VALUE_RANGE' );
1374       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( l_interval_rec ) );
1375       FND_MSG_PUB.add;
1376       CLOSE get_recs_for_value_range;
1377       x_return_status := FND_API.G_RET_STS_ERROR;
1378       RETURN;
1379     END IF;
1380 
1381     IF ( l_prev_counter_id IS NOT NULL AND
1382          l_prev_stop_value IS NOT NULL AND
1383          l_interval_rec.counter_id = l_prev_counter_id AND
1384          l_interval_rec.earliest_due_value <= l_prev_stop_value ) THEN
1385       FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_OVERLAP_VALUE_RANGE' );
1386       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( l_interval_rec ) );
1387       FND_MSG_PUB.add;
1388       CLOSE get_recs_for_value_range;
1389       x_return_status := FND_API.G_RET_STS_ERROR;
1390       RETURN;
1391     END IF;
1392 
1393     l_prev_counter_id := l_interval_rec.counter_id;
1394     l_prev_stop_value := l_interval_rec.stop_value;
1395 
1396   END LOOP;
1397 
1398   CLOSE get_recs_for_value_range;
1399 
1400   OPEN  check_unique_reset_value( p_mr_effectivity_id );
1401   LOOP
1402     FETCH check_unique_reset_value
1403     INTO  l_counter_name;
1404 
1405     EXIT WHEN check_unique_reset_value%NOTFOUND;
1406 
1407     FND_MESSAGE.set_name( 'AHL','AHL_FMP_RESET_VALUE_NONUNIQUE' );
1408     FND_MESSAGE.set_token( 'FIELD', l_counter_name );
1409     FND_MSG_PUB.add;
1410   END LOOP;
1411 
1412   IF ( check_unique_reset_value%ROWCOUNT > 0 ) THEN
1413     CLOSE check_unique_reset_value;
1414     x_return_status := FND_API.G_RET_STS_ERROR;
1415     RETURN;
1416   END IF;
1417 
1418   CLOSE check_unique_reset_value;
1419 
1420 END validate_records;
1421 
1422 -- Procedure to get the Repetitive Flag and Type for a MR
1423 PROCEDURE get_mr_header_details
1424 (
1425   p_mr_header_id            IN    NUMBER,
1426   x_repetitive_flag         OUT NOCOPY VARCHAR2,
1427   x_mr_type_code            OUT NOCOPY VARCHAR2
1428 )
1429 IS
1430 
1431 CURSOR get_mr_details( c_mr_header_id NUMBER )
1432 IS
1433 SELECT repetitive_flag,
1434        type_code
1435 FROM   AHL_MR_HEADERS_APP_V
1436 WHERE  mr_header_id = c_mr_header_id;
1437 
1438 BEGIN
1439 
1440   -- Get the Repetitive Flag and Type of the MR.
1441   OPEN get_mr_details( p_mr_header_id );
1442 
1443   FETCH get_mr_details INTO
1444     x_repetitive_flag,
1445     x_mr_type_code;
1446 
1447   CLOSE get_mr_details;
1448 
1449 END get_mr_header_details;
1450 
1451 -- Procedure to default the old value of the Threshold Date
1452 PROCEDURE default_threshold_attributes
1453 (
1454   p_x_threshold_rec             IN OUT NOCOPY    threshold_rec_type
1455 )
1456 IS
1457 
1458 CURSOR get_old_rec( c_mr_effectivity_id NUMBER )
1459 IS
1460 SELECT threshold_date,
1461        program_duration,
1462        program_duration_uom_code
1463 FROM   AHL_MR_EFFECTIVITIES_APP_V
1464 WHERE  mr_effectivity_id = c_mr_effectivity_id;
1465 
1466 l_old_rec          threshold_rec_type;
1467 
1468 BEGIN
1469 
1470   OPEN get_old_rec( p_x_threshold_rec.mr_effectivity_id );
1471 
1472   FETCH get_old_rec INTO
1473     l_old_rec.threshold_date,
1474     l_old_rec.program_duration,
1475     l_old_rec.program_duration_uom_code;
1476 
1477   CLOSE get_old_rec;
1478 
1479   IF ( p_x_threshold_rec.threshold_date = FND_API.G_MISS_DATE ) THEN
1480     p_x_threshold_rec.threshold_date := null;
1481   ELSIF ( p_x_threshold_rec.threshold_date IS NULL ) THEN
1482     p_x_threshold_rec.threshold_date := l_old_rec.threshold_date;
1483   END IF;
1484 
1485   IF ( p_x_threshold_rec.program_duration = FND_API.G_MISS_NUM ) THEN
1486     p_x_threshold_rec.program_duration := null;
1487   ELSIF ( p_x_threshold_rec.program_duration IS NULL ) THEN
1488     p_x_threshold_rec.program_duration := l_old_rec.program_duration;
1489   END IF;
1490 
1491   IF ( p_x_threshold_rec.program_duration_uom_code = FND_API.G_MISS_CHAR ) THEN
1492     p_x_threshold_rec.program_duration_uom_code := null;
1493   ELSIF ( p_x_threshold_rec.program_duration_uom_code IS NULL ) THEN
1494     p_x_threshold_rec.program_duration_uom_code := l_old_rec.program_duration_uom_code;
1495   END IF;
1496 
1497 END default_threshold_attributes;
1498 
1499 -- Procedure to validate and update the Threshold information
1500 PROCEDURE update_threshold
1501 (
1502   p_x_threshold_rec         IN OUT NOCOPY   threshold_rec_type,
1503   p_repetitive_flag         IN              VARCHAR2,
1504   p_appln_code              IN              VARCHAR2,
1505   p_mr_type_code            IN              VARCHAR2,
1506   x_return_status           OUT NOCOPY      VARCHAR2,
1507   p_super_user              IN            VARCHAR2,
1508   p_mr_header_id            IN             NUMBER
1509 )
1510 IS
1511 
1512 l_return_status            VARCHAR2(1);
1513 l_msg_data                 VARCHAR2(2000);
1514 l_old_threshold_rec        threshold_rec_type;
1515 l_mr_status_code            VARCHAR2(30);
1516 l_pm_install_flag           VARCHAR2(1);
1517 
1518 BEGIN
1519   x_return_status := FND_API.G_RET_STS_SUCCESS;
1520 
1521   -- Default unchanged value of Threshold attributes
1522   default_threshold_attributes
1523   (
1524     p_x_threshold_rec -- IN OUT
1525   );
1526 
1527   -- Check if the Threshold date is not set for repeating MRs.
1528   IF ( p_x_threshold_rec.threshold_date IS NOT NULL AND
1529        p_repetitive_flag = 'Y' ) THEN
1530     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_THRESHOLD' );
1531     FND_MSG_PUB.add;
1532     x_return_status := FND_API.G_RET_STS_ERROR;
1533     RETURN;
1534   END IF;
1535 
1536   -- Check if the Threshold date is not set for PM Programs
1537   IF ( p_x_threshold_rec.threshold_date IS NOT NULL AND
1538        p_appln_code= 'PM' AND
1539        p_mr_type_code = 'PROGRAM' ) THEN
1540     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_THRESHOLD' );
1541     FND_MSG_PUB.add;
1542     x_return_status := FND_API.G_RET_STS_ERROR;
1543     RETURN;
1544   END IF;
1545 
1546   -- Check if the Program Duration is not specified for PM Activities.
1547   IF ( p_x_threshold_rec.program_duration IS NOT NULL AND
1548        p_appln_code = 'PM' AND
1549        p_mr_type_code = 'ACTIVITY' ) THEN
1550     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_ACT_PGM_DURATION' );
1551     FND_MSG_PUB.add;
1552     x_return_status := FND_API.G_RET_STS_ERROR;
1553     RETURN;
1554   END IF;
1555 
1556   -- Check if the Program Duration is a positive number.
1557   IF ( p_x_threshold_rec.program_duration IS NOT NULL AND
1558        p_x_threshold_rec.program_duration <= 0 ) THEN
1559     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_DUR_INVALID' );
1560     FND_MSG_PUB.add;
1561     x_return_status := FND_API.G_RET_STS_ERROR;
1562     RETURN;
1563   END IF;
1564 
1565   -- Check if the Program Duration is specified then the UOM should be specified.
1566   IF ( p_x_threshold_rec.program_duration IS NOT NULL AND
1567        p_x_threshold_rec.program_duration_uom_code IS NULL ) THEN
1568     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_DUR_UOM_NULL' );
1569     FND_MSG_PUB.add;
1570     x_return_status := FND_API.G_RET_STS_ERROR;
1571     RETURN;
1572   END IF;
1573 
1574   -- Check if the Program Duration UOM is a valid value.
1575   IF ( p_x_threshold_rec.program_duration_uom_code IS NOT NULL ) THEN
1576 
1577     AHL_FMP_COMMON_PVT.validate_lookup
1578     (
1579       x_return_status        => l_return_status,
1580       x_msg_data             => l_msg_data,
1581       p_lookup_type          => 'AHL_UMP_TIME_UOM',
1582       p_lookup_meaning       => NULL,
1583       p_x_lookup_code        => p_x_threshold_rec.program_duration_uom_code
1584     );
1585 
1586     IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
1587       FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_INV_PGM_DUR_UOM' );
1588       FND_MSG_PUB.add;
1589       x_return_status := FND_API.G_RET_STS_ERROR;
1590       RETURN;
1591     END IF;
1592   END IF;
1593 
1594      -- Check Profile value
1595 
1596     IF  G_APPLN_USAGE IS NULL
1597     THEN
1598     FND_MESSAGE.SET_NAME('AHL','AHL_COM_APP_PRFL_UNDEF');
1599     FND_MSG_PUB.ADD;
1600     x_return_status := FND_API.G_RET_STS_ERROR;
1601         IF G_DEBUG = 'Y' THEN
1602             AHL_DEBUG_PUB.debug('APPLN USAGE CODE  IS NULL IN VALIDATE_API_INPUTS' );
1603         END IF;
1604     END IF;
1605 
1606 
1607   IF ( G_APPLN_USAGE = 'PM' ) THEN
1608     l_pm_install_flag:= 'Y';
1609   ELSE
1610     l_pm_install_flag:= 'N';
1611   END IF;
1612 
1613  -- Update effectivity only if changed attributes.
1614   IF ((p_x_threshold_rec.program_duration IS NULL AND
1615       l_old_threshold_rec.program_duration IS NOT NULL) OR
1616      (p_x_threshold_rec.program_duration IS NOT NULL AND
1617       l_old_threshold_rec.program_duration IS NOT NULL AND
1618       l_old_threshold_rec.program_duration <> p_x_threshold_rec.program_duration) OR
1619       (p_x_threshold_rec.program_duration IS NOT NULL AND
1620        l_old_threshold_rec.program_duration IS NULL) OR
1621 
1622       (p_x_threshold_rec.program_duration_uom_code IS NULL AND
1623       l_old_threshold_rec.program_duration_uom_code IS NOT NULL) OR
1624      (p_x_threshold_rec.program_duration_uom_code IS NOT NULL AND
1625       l_old_threshold_rec.program_duration_uom_code IS NOT NULL AND
1626       l_old_threshold_rec.program_duration_uom_code <> p_x_threshold_rec.program_duration_uom_code) OR
1627       (p_x_threshold_rec.program_duration_uom_code IS NOT NULL AND
1628        l_old_threshold_rec.program_duration_uom_code IS NULL) OR
1629 
1630      (p_x_threshold_rec.threshold_date IS NULL AND
1631       l_old_threshold_rec.threshold_date IS NOT NULL) OR
1632      (p_x_threshold_rec.threshold_date IS NOT NULL AND
1633       l_old_threshold_rec.threshold_date IS NOT NULL AND
1634       l_old_threshold_rec.threshold_date <> p_x_threshold_rec.threshold_date) OR
1635       (p_x_threshold_rec.threshold_date IS NOT NULL AND
1636        l_old_threshold_rec.threshold_date IS NULL)  ) THEN
1637 
1638    l_mr_status_code :=AHL_FMP_COMMON_PVT.check_mr_status(p_mr_header_id);
1639    IF ( l_pm_install_flag = 'Y' AND
1640         p_super_user = 'Y'      AND
1641         l_mr_status_code = 'COMPLETE' AND
1642         p_mr_type_code ='PROGRAM' ) THEN
1643         AHL_FMP_COMMON_PVT.validate_mr_type_program
1644         (
1645             x_return_status    => l_return_status,
1646             x_msg_data         => l_msg_data,
1647             p_mr_header_id     => p_mr_header_id,
1648             p_effectivity_id   => p_x_threshold_rec.MR_EFFECTIVITY_ID,
1649             p_eff_obj_version  => p_x_threshold_rec.OBJECT_VERSION_NUMBER
1650         );
1651         IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
1652            FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_PROGRAM_DURATION' );
1653            FND_MSG_PUB.add;
1654            x_return_status := FND_API.G_RET_STS_ERROR;
1655            RETURN;
1656         END IF;
1657    END IF;
1658 
1659    IF ( l_pm_install_flag = 'Y' AND
1660         p_super_user = 'Y'      AND
1661         l_mr_status_code = 'COMPLETE' AND
1662         p_mr_type_code ='ACTIVITY' ) THEN
1663         AHL_FMP_COMMON_PVT.validate_mr_type_activity
1664         (
1665             x_return_status    => l_return_status,
1666             x_msg_data         => l_msg_data,
1667             p_effectivity_id   => p_x_threshold_rec.MR_EFFECTIVITY_ID,
1668             p_eff_obj_version  => p_x_threshold_rec.OBJECT_VERSION_NUMBER
1669         );
1670         IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
1671            FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_PROGRAM_DURATION' );
1672            FND_MSG_PUB.add;
1673            x_return_status := FND_API.G_RET_STS_ERROR;
1674            RETURN;
1675         END IF;
1676    END IF;
1677 
1678 
1679     -- Update the record
1680     UPDATE AHL_MR_EFFECTIVITIES SET
1681       object_version_number     = object_version_number + 1,
1682       threshold_date            = p_x_threshold_rec.threshold_date,
1683       program_duration          = p_x_threshold_rec.program_duration,
1684       program_duration_uom_code = p_x_threshold_rec.program_duration_uom_code,
1685       last_update_date          = SYSDATE,
1686       last_updated_by           = FND_GLOBAL.user_id,
1687       last_update_login         = FND_GLOBAL.login_id
1688     WHERE mr_effectivity_id     = p_x_threshold_rec.mr_effectivity_id
1689     AND   object_version_number = p_x_threshold_rec.object_version_number;
1690 
1691     -- If the record does not exist, then, abort API.
1692     IF ( SQL%ROWCOUNT = 0 ) THEN
1693       FND_MESSAGE.set_name('AHL','AHL_FMP_EFF_RECORD_CHANGED');
1694       FND_MSG_PUB.add;
1695       x_return_status := FND_API.G_RET_STS_ERROR;
1696       RETURN;
1697     END IF;
1698 
1699   END IF;
1700 
1701 END update_threshold;
1702 
1703 PROCEDURE process_interval
1704 (
1705  p_api_version        IN             NUMBER     := '1.0',
1706  p_init_msg_list      IN             VARCHAR2   := FND_API.G_TRUE,
1707  p_commit             IN             VARCHAR2   := FND_API.G_FALSE,
1708  p_validation_level   IN             NUMBER     := FND_API.G_VALID_LEVEL_FULL,
1709  p_default            IN             VARCHAR2   := FND_API.G_FALSE,
1710  p_module_type        IN             VARCHAR2   := NULL,
1711  x_return_status      OUT NOCOPY     VARCHAR2,
1712  x_msg_count          OUT NOCOPY     NUMBER,
1713  x_msg_data           OUT NOCOPY     VARCHAR2,
1714  p_x_interval_tbl     IN OUT NOCOPY  interval_tbl_type,
1715  p_x_threshold_rec    IN OUT NOCOPY  threshold_rec_type,
1716  p_mr_header_id       IN             NUMBER,
1717  p_super_user         IN            VARCHAR2
1718 )
1719 IS
1720 l_api_version    CONSTANT   NUMBER         := 1.0;
1721 l_return_status             VARCHAR2(1);
1722 l_msg_count                 NUMBER;
1723 l_mr_interval_id            NUMBER;
1724 
1725 l_fractional_trunc_flag     BOOLEAN := FALSE;
1726 
1727 BEGIN
1728   -- Initialize API return status to success
1729   x_return_status := FND_API.G_RET_STS_SUCCESS;
1730 
1731   -- Standard Start of API savepoint
1732   SAVEPOINT process_interval_PVT;
1733 
1734   -- Standard call to check for call compatibility.
1735   IF NOT FND_API.compatible_api_call
1736   (
1737     l_api_version,
1738     p_api_version,
1739     G_API_NAME,
1740     G_PKG_NAME
1741   )
1742   THEN
1743     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1744   END IF;
1745 
1746   -- Initialize message list if p_init_msg_list is set to TRUE.
1747   IF FND_API.to_boolean( p_init_msg_list ) THEN
1748     FND_MSG_PUB.initialize;
1749   END IF;
1750 
1751   -- Enable Debug (optional)
1752   IF ( G_DEBUG = 'Y' ) THEN
1753     AHL_DEBUG_PUB.enable_debug;
1754   END IF;
1755 
1756   IF G_DEBUG = 'Y' THEN
1757     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' : Begin API' );
1758   END IF;
1759 
1760   -- Get the PM Installation Flag
1761 
1762   IF G_DEBUG = 'Y' THEN
1763     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' : Application Installed : ' || G_APPLN_USAGE );
1764   END IF;
1765 
1766   -- Validate all the inputs of the API
1767   validate_api_inputs
1768   (
1769     p_x_interval_tbl, -- IN
1770     p_mr_header_id, -- IN
1771     p_x_threshold_rec, -- IN
1772     l_return_status, -- OUT
1773     p_super_user
1774   );
1775 
1776   -- If any severe error occurs, then, abort API.
1777   IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1778     RAISE FND_API.G_EXC_ERROR;
1779   ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1780     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1781   END IF;
1782 
1783   -- Get the Details for the given MR
1784   get_mr_header_details
1785   (
1786     p_mr_header_id, -- IN
1787     g_repetitive_flag, -- OUT
1788     g_mr_type_code -- OUT
1789   );
1790 
1791   -- Validate and Update the Threshold information
1792   update_threshold
1793   (
1794     p_x_threshold_rec, -- IN
1795     g_repetitive_flag, -- IN
1796     G_APPLN_USAGE, -- IN
1797     g_mr_type_code,
1798     l_return_status, -- OUT
1799     p_super_user,
1800     p_mr_header_id
1801 
1802   );
1803 
1804   -- If any severe error occurs, then, abort API.
1805   IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1806     RAISE FND_API.G_EXC_ERROR;
1807   ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1808     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1809   END IF;
1810 
1811   -- If the module type is JSP, then default values for ID columns of LOV attributes
1812   IF ( p_module_type = 'JSP' ) THEN
1813     FOR i IN 1..p_x_interval_tbl.count LOOP
1814       IF ( p_x_interval_tbl(i).dml_operation <> 'D' ) THEN
1815         clear_lov_attribute_ids
1816         (
1817           p_x_interval_tbl(i) -- IN OUT Record with Values and Ids
1818         );
1819       END IF;
1820     END LOOP;
1821   END IF;
1822 
1823   -- Convert Values into Ids.
1824   IF ( p_validation_level = FND_API.G_VALID_LEVEL_FULL ) THEN
1825     FOR i IN 1..p_x_interval_tbl.count LOOP
1826       IF ( p_x_interval_tbl(i).dml_operation <> 'D' ) THEN
1827         convert_values_to_ids
1828         (
1829           p_x_interval_tbl(i), -- IN OUT Record with Values and Ids
1830           p_x_threshold_rec.mr_effectivity_id, -- IN
1831           l_return_status -- OUT
1832         );
1833 
1834         -- If any severe error occurs, then, abort API.
1835         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1836           RAISE FND_API.G_EXC_ERROR;
1837         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1838           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1839         END IF;
1840       END IF;
1841     END LOOP;
1842   END IF;
1843 
1844   IF G_DEBUG = 'Y' THEN
1845     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after convert_values_to_ids' );
1846   END IF;
1847 
1848   -- Default interval attributes.
1849     FOR i IN 1..p_x_interval_tbl.count LOOP
1850       IF ( p_x_interval_tbl(i).dml_operation <> 'D' ) THEN
1851         default_attributes
1852         (
1853           p_x_interval_tbl(i), -- IN OUT
1854           l_fractional_trunc_flag  -- OUT
1855         );
1856       END IF;
1857     END LOOP;
1858 
1859   IF G_DEBUG = 'Y' THEN
1860     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after default_attributes' );
1861   END IF;
1862 
1863   -- Validate all attributes (Item level validation)
1864   IF ( p_validation_level = FND_API.G_VALID_LEVEL_FULL ) THEN
1865     FOR i IN 1..p_x_interval_tbl.count LOOP
1866       validate_attributes
1867       (
1868         p_x_interval_tbl(i), -- IN
1869         l_return_status -- OUT
1870       );
1871 
1872       -- If any severe error occurs, then, abort API.
1873       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1874         RAISE FND_API.G_EXC_ERROR;
1875       ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR  THEN
1876         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1877       END IF;
1878     END LOOP;
1879   END IF;
1880 
1881   IF G_DEBUG = 'Y' THEN
1882     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after validate_attributes' );
1883   END IF;
1884 
1885   -- Default missing and unchanged attributes.
1886   FOR i IN 1..p_x_interval_tbl.count LOOP
1887     IF ( p_x_interval_tbl(i).dml_operation = 'U' ) THEN
1888       default_unchanged_attributes
1889       (
1890         p_x_interval_tbl(i) -- IN OUT
1891       );
1892     ELSIF ( p_x_interval_tbl(i).dml_operation = 'C' ) THEN
1893       default_missing_attributes
1894       (
1895         p_x_interval_tbl(i) -- IN OUT
1896       );
1897     END IF;
1898   END LOOP;
1899 
1900   IF G_DEBUG = 'Y' THEN
1901     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after default_unchanged_attributes / default_missing_attributes' );
1902   END IF;
1903 
1904   -- Perform cross attribute validation and missing attribute checks (Record level validation)
1905   IF ( p_validation_level = FND_API.G_VALID_LEVEL_FULL ) THEN
1906     FOR i IN 1..p_x_interval_tbl.count LOOP
1907       IF ( p_x_interval_tbl(i).dml_operation <> 'D' ) THEN
1908         validate_record
1909         (
1910           p_x_interval_tbl(i), -- IN
1911           g_repetitive_flag, -- IN
1912           G_APPLN_USAGE, -- IN
1913           g_mr_type_code, -- IN
1914           l_return_status -- OUT
1915         );
1916 
1917         -- If any severe error occurs, then, abort API.
1918         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1919           RAISE FND_API.G_EXC_ERROR;
1920         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR  THEN
1921           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1922         END IF;
1923       END IF;
1924     END LOOP;
1925   END IF;
1926 
1927   IF G_DEBUG = 'Y' THEN
1928     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after validate_record' );
1929   END IF;
1930 
1931   -- Get all the error messages from the previous steps (if any) and raise the appropriate Exception
1932   l_msg_count := FND_MSG_PUB.count_msg;
1933   IF l_msg_count > 0 THEN
1934     x_msg_count := l_msg_count;
1935     RAISE FND_API.G_EXC_ERROR;
1936   END IF;
1937 
1938   -- Perform the DML statement directly.
1939   FOR i IN 1..p_x_interval_tbl.count LOOP
1940     IF ( p_x_interval_tbl(i).dml_operation = 'C' ) THEN
1941 
1942       -- Insert the record
1943       INSERT INTO AHL_MR_INTERVALS
1944       (
1945         MR_INTERVAL_ID,
1946         OBJECT_VERSION_NUMBER,
1947         MR_EFFECTIVITY_ID,
1948         COUNTER_ID,
1949         INTERVAL_VALUE,
1950         EARLIEST_DUE_VALUE,
1951         START_VALUE,
1952         STOP_VALUE,
1953         START_DATE,
1954         STOP_DATE,
1955         TOLERANCE_BEFORE,
1956         TOLERANCE_AFTER,
1957         RESET_VALUE,
1958         ATTRIBUTE_CATEGORY,
1959         ATTRIBUTE1,
1960         ATTRIBUTE2,
1961         ATTRIBUTE3,
1962         ATTRIBUTE4,
1963         ATTRIBUTE5,
1964         ATTRIBUTE6,
1965         ATTRIBUTE7,
1966         ATTRIBUTE8,
1967         ATTRIBUTE9,
1968         ATTRIBUTE10,
1969         ATTRIBUTE11,
1970         ATTRIBUTE12,
1971         ATTRIBUTE13,
1972         ATTRIBUTE14,
1973         ATTRIBUTE15,
1974         LAST_UPDATE_DATE,
1975         LAST_UPDATED_BY,
1976         CREATION_DATE,
1977         CREATED_BY,
1978         LAST_UPDATE_LOGIN
1979       ) VALUES
1980       (
1981         AHL_MR_INTERVALS_S.NEXTVAL,
1982         p_x_interval_tbl(i).object_version_number,
1983         p_x_threshold_rec.mr_effectivity_id,
1984         p_x_interval_tbl(i).counter_id,
1985         p_x_interval_tbl(i).interval_value,
1986         p_x_interval_tbl(i).earliest_due_value,
1987         p_x_interval_tbl(i).start_value,
1988         p_x_interval_tbl(i).stop_value,
1989         p_x_interval_tbl(i).start_date,
1990         p_x_interval_tbl(i).stop_date,
1991         p_x_interval_tbl(i).tolerance_before,
1992         p_x_interval_tbl(i).tolerance_after,
1993         p_x_interval_tbl(i).reset_value,
1994         p_x_interval_tbl(i).attribute_category,
1995         p_x_interval_tbl(i).attribute1,
1996         p_x_interval_tbl(i).attribute2,
1997         p_x_interval_tbl(i).attribute3,
1998         p_x_interval_tbl(i).attribute4,
1999         p_x_interval_tbl(i).attribute5,
2000         p_x_interval_tbl(i).attribute6,
2001         p_x_interval_tbl(i).attribute7,
2002         p_x_interval_tbl(i).attribute8,
2003         p_x_interval_tbl(i).attribute9,
2004         p_x_interval_tbl(i).attribute10,
2005         p_x_interval_tbl(i).attribute11,
2006         p_x_interval_tbl(i).attribute12,
2007         p_x_interval_tbl(i).attribute13,
2008         p_x_interval_tbl(i).attribute14,
2009         p_x_interval_tbl(i).attribute15,
2010         p_x_interval_tbl(i).last_update_date,
2011         p_x_interval_tbl(i).last_updated_by,
2012         p_x_interval_tbl(i).creation_date,
2013         p_x_interval_tbl(i).created_by,
2014         p_x_interval_tbl(i).last_update_login
2015       ) RETURNING mr_interval_id INTO l_mr_interval_id;
2016 
2017       -- Set OUT values
2018       p_x_interval_tbl(i).mr_interval_id := l_mr_interval_id;
2019 
2020     ELSIF ( p_x_interval_tbl(i).dml_operation = 'U' ) THEN
2021 
2022       -- Update the record
2023       UPDATE AHL_MR_INTERVALS SET
2024         object_version_number = object_version_number + 1,
2025         counter_id            = p_x_interval_tbl(i).counter_id,
2026         interval_value        = p_x_interval_tbl(i).interval_value,
2027         earliest_due_value    = p_x_interval_tbl(i).earliest_due_value,
2028         start_value           = p_x_interval_tbl(i).start_value,
2029         stop_value            = p_x_interval_tbl(i).stop_value,
2030         start_date            = p_x_interval_tbl(i).start_date,
2031         stop_date             = p_x_interval_tbl(i).stop_date,
2032         tolerance_before      = p_x_interval_tbl(i).tolerance_before,
2033         tolerance_after       = p_x_interval_tbl(i).tolerance_after,
2034         reset_value           = p_x_interval_tbl(i).reset_value,
2035         attribute_category    = p_x_interval_tbl(i).attribute_category,
2036         attribute1            = p_x_interval_tbl(i).attribute1,
2037         attribute2            = p_x_interval_tbl(i).attribute2,
2038         attribute3            = p_x_interval_tbl(i).attribute3,
2039         attribute4            = p_x_interval_tbl(i).attribute4,
2040         attribute5            = p_x_interval_tbl(i).attribute5,
2041         attribute6            = p_x_interval_tbl(i).attribute6,
2042         attribute7            = p_x_interval_tbl(i).attribute7,
2043         attribute8            = p_x_interval_tbl(i).attribute8,
2044         attribute9            = p_x_interval_tbl(i).attribute9,
2045         attribute10           = p_x_interval_tbl(i).attribute10,
2046         attribute11           = p_x_interval_tbl(i).attribute11,
2047         attribute12           = p_x_interval_tbl(i).attribute12,
2048         attribute13           = p_x_interval_tbl(i).attribute13,
2049         attribute14           = p_x_interval_tbl(i).attribute14,
2050         attribute15           = p_x_interval_tbl(i).attribute15,
2051         last_update_date      = p_x_interval_tbl(i).last_update_date,
2052         last_updated_by       = p_x_interval_tbl(i).last_updated_by,
2053         last_update_login     = p_x_interval_tbl(i).last_update_login
2054       WHERE mr_interval_id  = p_x_interval_tbl(i).mr_interval_id
2055       AND   object_version_number     = p_x_interval_tbl(i).object_version_number;
2056 
2057       -- If the record does not exist, then, abort API.
2058       IF ( SQL%ROWCOUNT = 0 ) THEN
2059         FND_MESSAGE.set_name('AHL','AHL_FMP_RECORD_CHANGED');
2060         FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_x_interval_tbl(i) ) );
2061         FND_MSG_PUB.add;
2062         RAISE FND_API.G_EXC_ERROR;
2063       END IF;
2064 
2065       -- Set OUT values
2066       p_x_interval_tbl(i).object_version_number := p_x_interval_tbl(i).object_version_number + 1;
2067 
2068     ELSIF ( p_x_interval_tbl(i).dml_operation = 'D' ) THEN
2069 
2070       -- Delete the record
2071       DELETE AHL_MR_INTERVALS
2072       WHERE mr_interval_id        = p_x_interval_tbl(i).mr_interval_id
2073       AND   object_version_number = p_x_interval_tbl(i).object_version_number;
2074 
2075       -- If the record does not exist, then, abort API.
2076       IF ( SQL%ROWCOUNT = 0 ) THEN
2077         FND_MESSAGE.set_name('AHL','AHL_FMP_RECORD_CHANGED');
2078         FND_MESSAGE.set_token( 'RECORD', TO_CHAR( i ) );
2079         FND_MSG_PUB.add;
2080         RAISE FND_API.G_EXC_ERROR;
2081       END IF;
2082 
2083     END IF;
2084   END LOOP;
2085 
2086   IF G_DEBUG = 'Y' THEN
2087     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after DML operation' );
2088   END IF;
2089 
2090   -- Perform cross records validations and duplicate records check
2091   validate_records
2092   (
2093     p_x_threshold_rec.mr_effectivity_id, -- IN
2094     g_repetitive_flag, -- IN
2095     G_APPLN_USAGE, -- IN
2096     g_mr_type_code, -- IN
2097     l_return_status -- OUT
2098   );
2099 
2100   -- If any severe error occurs, then, abort API.
2101   IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2102     RAISE FND_API.G_EXC_ERROR;
2103   ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR  THEN
2104     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2105   END IF;
2106 
2107   IF G_DEBUG = 'Y' THEN
2108     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after validate_records' );
2109   END IF;
2110 
2111   -- Perform the Commit (if requested)
2112   IF FND_API.to_boolean( p_commit ) THEN
2113     COMMIT WORK;
2114   END IF;
2115 
2116   -- Add informational message if any truncation of interval values occured.
2117   -- Fix for bug#3482307
2118   IF (l_fractional_trunc_flag) THEN
2119     FND_MESSAGE.Set_Name('AHL','AHL_FMP_FRACTION_TRUNC');
2120     FND_MSG_PUB.ADD;
2121   END IF;
2122 
2123   -- Count and Get messages (optional)
2124   FND_MSG_PUB.count_and_get
2125   (
2126     p_encoded  => FND_API.G_FALSE,
2127     p_count    => x_msg_count,
2128     p_data     => x_msg_data
2129   );
2130 
2131   -- Disable debug (if enabled)
2132   IF ( G_DEBUG = 'Y' ) THEN
2133     AHL_DEBUG_PUB.disable_debug;
2134   END IF;
2135 
2136 EXCEPTION
2137 
2138   WHEN FND_API.G_EXC_ERROR THEN
2139     ROLLBACK TO process_interval_PVT;
2140     x_return_status := FND_API.G_RET_STS_ERROR ;
2141     FND_MSG_PUB.count_and_get
2142     (
2143       p_encoded  => FND_API.G_FALSE,
2144       p_count    => x_msg_count,
2145       p_data     => x_msg_data
2146     );
2147 
2148     -- Disable debug (if enabled)
2149     IF ( G_DEBUG = 'Y' ) THEN
2150       AHL_DEBUG_PUB.disable_debug;
2151     END IF;
2152 
2153   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2154     ROLLBACK TO process_interval_PVT;
2155     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2156     FND_MSG_PUB.count_and_get
2157     (
2158       p_encoded  => FND_API.G_FALSE,
2159       p_count    => x_msg_count,
2160       p_data     => x_msg_data
2161     );
2162 
2163     -- Disable debug (if enabled)
2164     IF ( G_DEBUG = 'Y' ) THEN
2165       AHL_DEBUG_PUB.disable_debug;
2166     END IF;
2167 
2168   WHEN OTHERS THEN
2169     ROLLBACK TO process_interval_PVT;
2170     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2171     IF FND_MSG_PUB.check_msg_level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR )
2172     THEN
2173       FND_MSG_PUB.add_exc_msg
2174       (
2175         p_pkg_name         => G_PKG_NAME,
2176         p_procedure_name   => G_API_NAME,
2177         p_error_text       => SUBSTRB(SQLERRM,1,240)
2178       );
2179     END IF;
2180     FND_MSG_PUB.count_and_get
2181     (
2182       p_encoded  => FND_API.G_FALSE,
2183       p_count    => x_msg_count,
2184       p_data     => x_msg_data
2185     );
2186 
2187     -- Disable debug (if enabled)
2188     IF ( G_DEBUG = 'Y' ) THEN
2189       AHL_DEBUG_PUB.disable_debug;
2190     END IF;
2191 
2192 END process_interval;
2193 
2194 END AHL_FMP_MR_INTERVAL_PVT;