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.6.12020000.2 2012/12/10 14:05:46 shnatu 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   -- bachandr added following logic for ADAT ER # 7415856
513   -- If start date or start value is present and user has not entered due date rule,
514   -- then due date rule is defaulted to 'At Start'.
515   -- ADAT ER # 7415856 -- start
516 
517   IF
518      (
519       p_x_interval_rec.duedate_rule_code IS NULL
520       OR
521       p_x_interval_rec.duedate_rule_code = FND_API.G_MISS_CHAR
522      )
523      AND
524      (
525       (
526        p_x_interval_rec.start_value IS NOT NULL
527        AND
528        p_x_interval_rec.start_value <> FND_API.G_MISS_NUM
529       )
530       OR
531       (
532        p_x_interval_rec.start_date IS NOT NULL
533        AND
534        p_x_interval_rec.start_date <> FND_API.G_MISS_DATE
535       )
536      )
537   THEN
538       p_x_interval_rec.duedate_rule_code := 'START';
539   END IF;
540   -- ADAT ER # 7415856 -- end
541 
542 END default_attributes;
543 
544  -- Procedure to add Default values for missing attributes (CREATE)
545 PROCEDURE default_missing_attributes
546 (
547   p_x_interval_rec       IN OUT NOCOPY   interval_rec_type
548 )
549 IS
550 
551 BEGIN
552 
553   -- Convert G_MISS values to NULL
554   IF ( p_x_interval_rec.earliest_due_value = FND_API.G_MISS_NUM ) THEN
555     p_x_interval_rec.earliest_due_value := null;
556   END IF;
557 
558   IF ( p_x_interval_rec.start_value = FND_API.G_MISS_NUM ) THEN
559     p_x_interval_rec.start_value := null;
560   END IF;
561 
562   IF ( p_x_interval_rec.stop_value = FND_API.G_MISS_NUM ) THEN
563     p_x_interval_rec.stop_value := null;
564   END IF;
565 
566   IF ( p_x_interval_rec.tolerance_before = FND_API.G_MISS_NUM ) THEN
567     p_x_interval_rec.tolerance_before := null;
568   END IF;
569 
570   IF ( p_x_interval_rec.tolerance_after = FND_API.G_MISS_NUM ) THEN
571     p_x_interval_rec.tolerance_after := null;
572   END IF;
573 
574   IF ( p_x_interval_rec.reset_value = FND_API.G_MISS_NUM ) THEN
575     p_x_interval_rec.reset_value := null;
576   END IF;
577 
578   IF ( p_x_interval_rec.start_date = FND_API.G_MISS_DATE ) THEN
579     p_x_interval_rec.start_date := null;
580   END IF;
581 
582   IF ( p_x_interval_rec.stop_date = FND_API.G_MISS_DATE ) THEN
583     p_x_interval_rec.stop_date := null;
584   END IF;
585 
586   IF ( p_x_interval_rec.attribute_category = FND_API.G_MISS_CHAR ) THEN
587     p_x_interval_rec.attribute_category := null;
588   END IF;
589 
590   IF ( p_x_interval_rec.attribute1 = FND_API.G_MISS_CHAR ) THEN
591     p_x_interval_rec.attribute1 := null;
592   END IF;
593 
594   IF ( p_x_interval_rec.attribute2 = FND_API.G_MISS_CHAR ) THEN
595     p_x_interval_rec.attribute2 := null;
596   END IF;
597 
598   IF ( p_x_interval_rec.attribute3 = FND_API.G_MISS_CHAR ) THEN
599     p_x_interval_rec.attribute3 := null;
600   END IF;
601 
602   IF ( p_x_interval_rec.attribute4 = FND_API.G_MISS_CHAR ) THEN
603     p_x_interval_rec.attribute4 := null;
604   END IF;
605 
606   IF ( p_x_interval_rec.attribute5 = FND_API.G_MISS_CHAR ) THEN
607     p_x_interval_rec.attribute5 := null;
608   END IF;
609 
610   IF ( p_x_interval_rec.attribute6 = FND_API.G_MISS_CHAR ) THEN
611     p_x_interval_rec.attribute6 := null;
612   END IF;
613 
614   IF ( p_x_interval_rec.attribute7 = FND_API.G_MISS_CHAR ) THEN
615     p_x_interval_rec.attribute7 := null;
616   END IF;
617 
618   IF ( p_x_interval_rec.attribute8 = FND_API.G_MISS_CHAR ) THEN
619     p_x_interval_rec.attribute8 := null;
620   END IF;
621 
622   IF ( p_x_interval_rec.attribute9 = FND_API.G_MISS_CHAR ) THEN
623     p_x_interval_rec.attribute9 := null;
624   END IF;
625 
626   IF ( p_x_interval_rec.attribute10 = FND_API.G_MISS_CHAR ) THEN
627     p_x_interval_rec.attribute10 := null;
628   END IF;
629 
630   IF ( p_x_interval_rec.attribute11 = FND_API.G_MISS_CHAR ) THEN
631     p_x_interval_rec.attribute11 := null;
632   END IF;
633 
634   IF ( p_x_interval_rec.attribute12 = FND_API.G_MISS_CHAR ) THEN
635     p_x_interval_rec.attribute12 := null;
636   END IF;
637 
638   IF ( p_x_interval_rec.attribute13 = FND_API.G_MISS_CHAR ) THEN
639     p_x_interval_rec.attribute13 := null;
640   END IF;
641 
642   IF ( p_x_interval_rec.attribute14 = FND_API.G_MISS_CHAR ) THEN
643     p_x_interval_rec.attribute14 := null;
644   END IF;
645 
646   IF ( p_x_interval_rec.attribute15 = FND_API.G_MISS_CHAR ) THEN
647     p_x_interval_rec.attribute15 := null;
648   END IF;
649 
650   --pdoki added for ADAT ER
651   IF ( p_x_interval_rec.duedate_rule_code = FND_API.G_MISS_CHAR ) THEN
652     p_x_interval_rec.duedate_rule_code := null;
653   END IF;
654 
655 END default_missing_attributes;
656 
657  -- Procedure to add Default values for unchanged attributes (UPDATE)
658 PROCEDURE default_unchanged_attributes
659 (
660   p_x_interval_rec       IN OUT NOCOPY   interval_rec_type
661 )
662 IS
663 
664 l_old_interval_rec       interval_rec_type;
665 
666 CURSOR get_old_rec ( c_mr_interval_id NUMBER )
667 IS
668 SELECT  counter_id,
669         interval_value,
670         earliest_due_value,
671         start_value,
672         stop_value,
673         tolerance_before,
674         tolerance_after,
675         reset_value,
676         start_date,
677         stop_date,
678         attribute_category,
679         attribute1,
680         attribute2,
681         attribute3,
682         attribute4,
683         attribute5,
684         attribute6,
685         attribute7,
686         attribute8,
687         attribute9,
688         attribute10,
689         attribute11,
690         attribute12,
691         attribute13,
692         attribute14,
693         attribute15,
694 	calc_duedate_rule_code --pdoki added for ADAT ER
695 FROM    AHL_MR_INTERVALS_APP_V
696 WHERE   mr_interval_id = c_mr_interval_id;
697 
698 BEGIN
699 
700   -- Get the old record from AHL_MR_INTERVALS.
701   OPEN  get_old_rec( p_x_interval_rec.mr_interval_id );
702 
703   FETCH get_old_rec INTO
704         l_old_interval_rec.counter_id,
705         l_old_interval_rec.interval_value,
706         l_old_interval_rec.earliest_due_value,
707         l_old_interval_rec.start_value,
708         l_old_interval_rec.stop_value,
709         l_old_interval_rec.tolerance_before,
710         l_old_interval_rec.tolerance_after,
711         l_old_interval_rec.reset_value,
712         l_old_interval_rec.start_date,
713         l_old_interval_rec.stop_date,
714         l_old_interval_rec.attribute_category,
715         l_old_interval_rec.attribute1,
716         l_old_interval_rec.attribute2,
717         l_old_interval_rec.attribute3,
718         l_old_interval_rec.attribute4,
719         l_old_interval_rec.attribute5,
720         l_old_interval_rec.attribute6,
721         l_old_interval_rec.attribute7,
722         l_old_interval_rec.attribute8,
723         l_old_interval_rec.attribute9,
724         l_old_interval_rec.attribute10,
725         l_old_interval_rec.attribute11,
726         l_old_interval_rec.attribute12,
727         l_old_interval_rec.attribute13,
728         l_old_interval_rec.attribute14,
729         l_old_interval_rec.attribute15,
730 	l_old_interval_rec.duedate_rule_code; --pdoki added for ADAT ER
731 
732   IF get_old_rec%NOTFOUND THEN
733     FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_INVALID_INTERVAL_REC' );
734     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_x_interval_rec ) );
735     FND_MSG_PUB.add;
736     CLOSE get_old_rec;
737     RAISE FND_API.G_EXC_ERROR;
738   END IF;
739 
740   CLOSE get_old_rec;
741 
742   -- Convert G_MISS values to NULL and NULL values to Old values
743   IF ( p_x_interval_rec.counter_id IS NULL ) THEN
744     p_x_interval_rec.counter_id := l_old_interval_rec.counter_id;
745   END IF;
746 
747   IF ( p_x_interval_rec.interval_value = FND_API.G_MISS_NUM ) THEN
748     p_x_interval_rec.interval_value := null;
749   ELSIF ( p_x_interval_rec.interval_value IS NULL ) THEN
750     p_x_interval_rec.interval_value := l_old_interval_rec.interval_value;
751   END IF;
752 
753   IF ( p_x_interval_rec.earliest_due_value = FND_API.G_MISS_NUM ) THEN
754     p_x_interval_rec.earliest_due_value := null;
755   ELSIF ( p_x_interval_rec.earliest_due_value IS NULL ) THEN
756     p_x_interval_rec.earliest_due_value := l_old_interval_rec.earliest_due_value;
757   END IF;
758 
759   IF ( p_x_interval_rec.start_value = FND_API.G_MISS_NUM ) THEN
760     p_x_interval_rec.start_value := null;
761   ELSIF ( p_x_interval_rec.start_value IS NULL ) THEN
762     p_x_interval_rec.start_value := l_old_interval_rec.start_value;
763   END IF;
764 
765   IF ( p_x_interval_rec.stop_value = FND_API.G_MISS_NUM ) THEN
766     p_x_interval_rec.stop_value := null;
767   ELSIF ( p_x_interval_rec.stop_value IS NULL ) THEN
768     p_x_interval_rec.stop_value := l_old_interval_rec.stop_value;
769   END IF;
770 
771   IF ( p_x_interval_rec.tolerance_before = FND_API.G_MISS_NUM ) THEN
772     p_x_interval_rec.tolerance_before := null;
773   ELSIF ( p_x_interval_rec.tolerance_before IS NULL ) THEN
774     p_x_interval_rec.tolerance_before := l_old_interval_rec.tolerance_before;
775   END IF;
776 
777   IF ( p_x_interval_rec.tolerance_after = FND_API.G_MISS_NUM ) THEN
778     p_x_interval_rec.tolerance_after := null;
779   ELSIF ( p_x_interval_rec.tolerance_after IS NULL ) THEN
780     p_x_interval_rec.tolerance_after := l_old_interval_rec.tolerance_after;
781   END IF;
782 
783   IF ( p_x_interval_rec.reset_value = FND_API.G_MISS_NUM ) THEN
784     p_x_interval_rec.reset_value := null;
785   ELSIF ( p_x_interval_rec.reset_value IS NULL ) THEN
786     p_x_interval_rec.reset_value := l_old_interval_rec.reset_value;
787   END IF;
788 
789 
790   IF ( p_x_interval_rec.start_date = FND_API.G_MISS_DATE ) THEN
791     p_x_interval_rec.start_date := null;
792   ELSIF ( p_x_interval_rec.start_date IS NULL ) THEN
793     p_x_interval_rec.start_date := l_old_interval_rec.start_date;
794   END IF;
795 
796   IF ( p_x_interval_rec.stop_date = FND_API.G_MISS_DATE ) THEN
797     p_x_interval_rec.stop_date := null;
798   ELSIF ( p_x_interval_rec.stop_date IS NULL ) THEN
799     p_x_interval_rec.stop_date := l_old_interval_rec.stop_date;
800   END IF;
801 
802   IF ( p_x_interval_rec.attribute_category = FND_API.G_MISS_CHAR ) THEN
803     p_x_interval_rec.attribute_category := null;
804   ELSIF ( p_x_interval_rec.attribute_category IS NULL ) THEN
805     p_x_interval_rec.attribute_category := l_old_interval_rec.attribute_category;
806   END IF;
807 
808   IF ( p_x_interval_rec.attribute1 = FND_API.G_MISS_CHAR ) THEN
809     p_x_interval_rec.attribute1 := null;
810   ELSIF ( p_x_interval_rec.attribute1 IS NULL ) THEN
811     p_x_interval_rec.attribute1 := l_old_interval_rec.attribute1;
812   END IF;
813 
814   IF ( p_x_interval_rec.attribute2 = FND_API.G_MISS_CHAR ) THEN
815     p_x_interval_rec.attribute2 := null;
816   ELSIF ( p_x_interval_rec.attribute2 IS NULL ) THEN
817     p_x_interval_rec.attribute2 := l_old_interval_rec.attribute2;
818   END IF;
819 
820   IF ( p_x_interval_rec.attribute3 = FND_API.G_MISS_CHAR ) THEN
821     p_x_interval_rec.attribute3 := null;
822   ELSIF ( p_x_interval_rec.attribute3 IS NULL ) THEN
823     p_x_interval_rec.attribute3 := l_old_interval_rec.attribute3;
824   END IF;
825 
826   IF ( p_x_interval_rec.attribute4 = FND_API.G_MISS_CHAR ) THEN
827     p_x_interval_rec.attribute4 := null;
828   ELSIF ( p_x_interval_rec.attribute4 IS NULL ) THEN
829     p_x_interval_rec.attribute4 := l_old_interval_rec.attribute4;
830   END IF;
831 
832   IF ( p_x_interval_rec.attribute5 = FND_API.G_MISS_CHAR ) THEN
833     p_x_interval_rec.attribute5 := null;
834   ELSIF ( p_x_interval_rec.attribute5 IS NULL ) THEN
835     p_x_interval_rec.attribute5 := l_old_interval_rec.attribute5;
836   END IF;
837 
838   IF ( p_x_interval_rec.attribute6 = FND_API.G_MISS_CHAR ) THEN
839     p_x_interval_rec.attribute6 := null;
840   ELSIF ( p_x_interval_rec.attribute6 IS NULL ) THEN
841     p_x_interval_rec.attribute6 := l_old_interval_rec.attribute6;
842   END IF;
843 
844   IF ( p_x_interval_rec.attribute7 = FND_API.G_MISS_CHAR ) THEN
845     p_x_interval_rec.attribute7 := null;
846   ELSIF ( p_x_interval_rec.attribute7 IS NULL ) THEN
847     p_x_interval_rec.attribute7 := l_old_interval_rec.attribute7;
848   END IF;
849 
850   IF ( p_x_interval_rec.attribute8 = FND_API.G_MISS_CHAR ) THEN
851     p_x_interval_rec.attribute8 := null;
852   ELSIF ( p_x_interval_rec.attribute8 IS NULL ) THEN
853     p_x_interval_rec.attribute8 := l_old_interval_rec.attribute8;
854   END IF;
855 
856   IF ( p_x_interval_rec.attribute9 = FND_API.G_MISS_CHAR ) THEN
857     p_x_interval_rec.attribute9 := null;
858   ELSIF ( p_x_interval_rec.attribute9 IS NULL ) THEN
859     p_x_interval_rec.attribute9 := l_old_interval_rec.attribute9;
860   END IF;
861 
862   IF ( p_x_interval_rec.attribute10 = FND_API.G_MISS_CHAR ) THEN
863     p_x_interval_rec.attribute10 := null;
864   ELSIF ( p_x_interval_rec.attribute10 IS NULL ) THEN
865     p_x_interval_rec.attribute10 := l_old_interval_rec.attribute10;
866   END IF;
867 
868   IF ( p_x_interval_rec.attribute11 = FND_API.G_MISS_CHAR ) THEN
869     p_x_interval_rec.attribute11 := null;
870   ELSIF ( p_x_interval_rec.attribute11 IS NULL ) THEN
871     p_x_interval_rec.attribute11 := l_old_interval_rec.attribute11;
872   END IF;
873 
874   IF ( p_x_interval_rec.attribute12 = FND_API.G_MISS_CHAR ) THEN
875     p_x_interval_rec.attribute12 := null;
876   ELSIF ( p_x_interval_rec.attribute12 IS NULL ) THEN
877     p_x_interval_rec.attribute12 := l_old_interval_rec.attribute12;
878   END IF;
879 
880   IF ( p_x_interval_rec.attribute13 = FND_API.G_MISS_CHAR ) THEN
881     p_x_interval_rec.attribute13 := null;
882   ELSIF ( p_x_interval_rec.attribute13 IS NULL ) THEN
883     p_x_interval_rec.attribute13 := l_old_interval_rec.attribute13;
884   END IF;
885 
886   IF ( p_x_interval_rec.attribute14 = FND_API.G_MISS_CHAR ) THEN
887     p_x_interval_rec.attribute14 := null;
888   ELSIF ( p_x_interval_rec.attribute14 IS NULL ) THEN
889     p_x_interval_rec.attribute14 := l_old_interval_rec.attribute14;
890   END IF;
891 
892   IF ( p_x_interval_rec.attribute15 = FND_API.G_MISS_CHAR ) THEN
893     p_x_interval_rec.attribute15 := null;
894   ELSIF ( p_x_interval_rec.attribute15 IS NULL ) THEN
895     p_x_interval_rec.attribute15 := l_old_interval_rec.attribute15;
896   END IF;
897 
898   --pdoki added for ADAT ER
899   IF ( p_x_interval_rec.duedate_rule_code = FND_API.G_MISS_CHAR ) THEN
900     p_x_interval_rec.duedate_rule_code := null;
901   ELSIF ( p_x_interval_rec.duedate_rule_code IS NULL ) THEN
902     p_x_interval_rec.duedate_rule_code := l_old_interval_rec.duedate_rule_code;
903   END IF;
904 
905 END default_unchanged_attributes;
906 
907 -- Procedure to validate individual interval attributes
908 PROCEDURE validate_attributes
909 (
910   p_interval_rec                 IN    interval_rec_type,
911   x_return_status                OUT NOCOPY VARCHAR2
912 )
913 IS
914 
915 BEGIN
916   x_return_status := FND_API.G_RET_STS_SUCCESS;
917 
918   -- Check if the Counter ID does not contain a null value.
919   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
920     IF ( ( p_interval_rec.dml_operation = 'C' AND
921            p_interval_rec.counter_id IS NULL AND
922            p_interval_rec.counter_name IS NULL ) OR
923          ( p_interval_rec.counter_id = FND_API.G_MISS_NUM AND
924            p_interval_rec.counter_name = FND_API.G_MISS_CHAR ) ) THEN
925       FND_MESSAGE.set_name( 'AHL','AHL_FMP_COUNTER_NULL' );
926       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
927       FND_MSG_PUB.add;
928     END IF;
929   END IF;
930 
931   -- Check if the Interval Value does not contain an invalid value
932   IF ( p_interval_rec.interval_value IS NOT NULL AND
933        p_interval_rec.interval_value <= 0 ) THEN
934     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_INTERVAL' );
935     FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.interval_value ) );
936     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
937     FND_MSG_PUB.add;
938   END IF;
939 
940   -- Check if the earliest due  Value does not contain an invalid value.
941   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
942     IF ( p_interval_rec.earliest_due_value IS NOT NULL AND
943          p_interval_rec.earliest_due_value <> FND_API.G_MISS_NUM AND
944          p_interval_rec.earliest_due_value < 0 ) THEN
945       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_EARL_DUE' );
946       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.earliest_due_value ) );
947       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
948       FND_MSG_PUB.add;
949     END IF;
950   END IF;
951 
952   -- Check if the Start Value does not contain an invalid value.
953   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
954     IF ( p_interval_rec.start_value IS NOT NULL AND
955          p_interval_rec.start_value <> FND_API.G_MISS_NUM AND
956          p_interval_rec.start_value < 0 ) THEN
957       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_START' );
958       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.start_value ) );
959       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
960       FND_MSG_PUB.add;
961     END IF;
962   END IF;
963 
964   -- Check if the Stop Value does not contain an invalid value.
965   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
966     IF ( p_interval_rec.stop_value IS NOT NULL AND
967          p_interval_rec.stop_value <> FND_API.G_MISS_NUM AND
968          p_interval_rec.stop_value <= 0 ) THEN
969       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_STOP' );
970       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.stop_value ) );
971       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
972       FND_MSG_PUB.add;
973     END IF;
974   END IF;
975 
976   -- Check if the Tolerance Before does not contain an invalid value.
977   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
978     IF ( p_interval_rec.tolerance_before IS NOT NULL AND
979          p_interval_rec.tolerance_before <> FND_API.G_MISS_NUM AND
980          p_interval_rec.tolerance_before < 0 ) THEN
981       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_TOLERANCE_BF' );
982       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.tolerance_before ) );
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   -- Check if the Tolerance After does not contain an invalid value.
989   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
990     IF ( p_interval_rec.tolerance_after IS NOT NULL AND
991          p_interval_rec.tolerance_after <> FND_API.G_MISS_NUM AND
992          p_interval_rec.tolerance_after < 0 ) THEN
993       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_TOLERANCE_AF' );
994       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.tolerance_after ) );
995       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
996       FND_MSG_PUB.add;
997     END IF;
998   END IF;
999 
1000   -- Check if the Reset After does not contain an invalid value.
1001   IF ( p_interval_rec.dml_operation <> 'D' ) THEN
1002     IF ( p_interval_rec.reset_value IS NOT NULL AND
1003          p_interval_rec.reset_value <> FND_API.G_MISS_NUM AND
1004          p_interval_rec.reset_value < 0 ) THEN
1005       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_RESET_VALUE' );
1006       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( p_interval_rec.reset_value ) );
1007       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1008       FND_MSG_PUB.add;
1009     END IF;
1010   END IF;
1011 
1012   -- Check if the mandatory Interval ID column contains a null value.
1013   IF ( p_interval_rec.dml_operation <> 'C' ) THEN
1014     IF ( p_interval_rec.mr_interval_id IS NULL OR
1015          p_interval_rec.mr_interval_id = FND_API.G_MISS_NUM ) THEN
1016       FND_MESSAGE.set_name( 'AHL','AHL_FMP_MR_INTERVAL_ID_NULL' );
1017       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1018       FND_MSG_PUB.add;
1019     END IF;
1020   END IF;
1021 
1022   -- Check if the mandatory Object Version Number column contains a null value.
1023   IF ( p_interval_rec.dml_operation <> 'C' ) THEN
1024     IF ( p_interval_rec.object_version_number IS NULL OR
1025          p_interval_rec.object_version_number = FND_API.G_MISS_NUM ) THEN
1026       FND_MESSAGE.set_name( 'AHL','AHL_FMP_INT_OBJ_VERSION_NULL' );
1027       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1028       FND_MSG_PUB.add;
1029     END IF;
1030   END IF;
1031 
1032 END validate_attributes;
1033 
1034 -- Procedure to Perform cross attribute validation and missing attribute checks (Record level validation)
1035 PROCEDURE validate_record
1036 (
1037   p_interval_rec                 IN    interval_rec_type,
1038   p_repetitive_flag              IN    VARCHAR2,
1039   p_appln_code                   IN    VARCHAR2,
1040   p_mr_type_code                 IN    VARCHAR2,
1041   x_return_status                OUT NOCOPY VARCHAR2
1042 )
1043 IS
1044 
1045 l_return_status              VARCHAR2(1);
1046 l_msg_data                   VARCHAR2(2000);
1047 l_initial_reading            NUMBER;
1048 
1049 BEGIN
1050   x_return_status := FND_API.G_RET_STS_SUCCESS;
1051 
1052   -- Check if the appropriate attributes are passed for PM Programs
1053   IF ( p_mr_type_code = 'PROGRAM' AND
1054        ( p_interval_rec.tolerance_before IS NOT NULL OR
1055          p_interval_rec.tolerance_after IS NOT NULL OR
1056          p_interval_rec.reset_value IS NOT NULL OR
1057          p_interval_rec.interval_value IS NOT NULL OR
1058          p_interval_rec.start_date IS NOT NULL OR
1059          p_interval_rec.stop_date IS NOT NULL ) ) THEN
1060     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_INPUTS' );
1061     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1062     FND_MSG_PUB.add;
1063   END IF;
1064 
1065   -- Check if the Interval Value is always passed for non-PM Programs
1066   IF ( ( p_mr_type_code IS NULL OR
1067          p_mr_type_code <> 'PROGRAM' ) AND
1068        ( p_interval_rec.dml_operation = 'C' AND
1069          p_interval_rec.interval_value IS NULL ) OR
1070        ( p_interval_rec.interval_value = FND_API.G_MISS_NUM ) ) THEN
1071     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INTERVAL_NULL' );
1072     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1073     FND_MSG_PUB.add;
1074   END IF;
1075 
1076   -- Check if Start is passed for PM Programs
1077   IF ( p_mr_type_code = 'PROGRAM' AND
1078        p_interval_rec.start_value IS NULL ) THEN
1079     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_START_NULL' );
1080     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1081     FND_MSG_PUB.add;
1082     RETURN;
1083   END IF;
1084 
1085   -- Check if Stop is passed for PM Programs
1086   IF ( p_mr_type_code = 'PROGRAM' AND
1087        p_interval_rec.stop_value IS NULL ) THEN
1088     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_STOP_NULL' );
1089     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1090     FND_MSG_PUB.add;
1091     RETURN;
1092   END IF;
1093 
1094   -- Check if Range is not passed for One Time MRs.
1095   IF ( ( p_mr_type_code IS NULL OR
1096          p_mr_type_code <> 'PROGRAM' ) AND
1097        p_repetitive_flag = 'N' AND
1098        ( p_interval_rec.start_value IS NOT NULL OR
1099          p_interval_rec.stop_value IS NOT NULL OR
1100          p_interval_rec.start_date IS NOT NULL OR
1101          p_interval_rec.stop_date IS NOT NULL ) ) THEN
1102     FND_MESSAGE.set_name( 'AHL','AHL_FMP_RANGE_NOTNULL' );
1103     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1104     FND_MSG_PUB.add;
1105     RETURN;
1106   END IF;
1107 
1108   -- Check if the Tolerance Before is less than the Interval Value
1109   IF ( p_interval_rec.tolerance_before IS NOT NULL AND
1110        p_interval_rec.tolerance_before >=  p_interval_rec.interval_value ) THEN
1111     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_TOL_BF_INT' );
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 Tolerance After is less than the Interval Value
1117   IF ( p_interval_rec.tolerance_after IS NOT NULL AND
1118        p_interval_rec.tolerance_after >=  p_interval_rec.interval_value ) THEN
1119     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_TOL_AF_INT' );
1120     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1121     FND_MSG_PUB.add;
1122   END IF;
1123 
1124   IF ( p_interval_rec.counter_id IS NOT NULL AND
1125        p_interval_rec.reset_value IS NOT NULL AND
1126        p_interval_rec.reset_value >= 0 ) THEN
1127 
1128     SELECT  NVL( initial_reading, 0 )
1129     INTO    l_initial_reading
1130     FROM    csi_counter_template_vl --amsriniv
1131     WHERE   counter_id = p_interval_rec.counter_id;
1132 
1133     -- Check if the Reset Value is less than the initial reading for the counter
1134     IF ( p_interval_rec.reset_value < l_initial_reading ) THEN
1135       FND_MESSAGE.set_name( 'AHL','AHL_FMP_RESET_LESS_INIT_VALUE' );
1136       FND_MESSAGE.set_token( 'FIELD', TO_CHAR( l_initial_reading ) );
1137       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1138       FND_MSG_PUB.add;
1139     END IF;
1140 
1141   END IF;
1142 
1143   -- Check if the Start Value is passed if Stop Value is passed
1144   IF ( p_interval_rec.start_value IS NULL AND
1145        p_interval_rec.stop_value IS NOT NULL ) THEN
1146     FND_MESSAGE.set_name( 'AHL','AHL_FMP_MISSING_VALUE_RANGE' );
1147     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1148     FND_MSG_PUB.add;
1149   END IF;
1150 
1151   -- Check if the Start Value is passed if Stop Value is passed
1152   IF ( p_interval_rec.start_value IS NULL AND
1153        p_interval_rec.start_date IS NULL AND
1154        p_interval_rec.earliest_due_value IS NOT NULL ) THEN
1155     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_INTERVAL_RANGE' );
1156     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1157     FND_MSG_PUB.add;
1158   END IF;
1159 
1160   -- Check if the Start Date is passed if Stop Date is passed
1161   IF ( p_interval_rec.start_date IS NULL AND
1162        p_interval_rec.stop_date IS NOT NULL ) THEN
1163     FND_MESSAGE.set_name( 'AHL','AHL_FMP_MISSING_DATE_RANGE' );
1164     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1165     FND_MSG_PUB.add;
1166   END IF;
1167 
1168   -- Check if the Stop Value is not greater than Start Value
1169   IF ( p_interval_rec.start_value IS NOT NULL AND
1170        p_interval_rec.stop_value IS NOT NULL AND
1171        p_interval_rec.stop_value < p_interval_rec.start_value ) THEN
1172     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_VALUE_RANGE' );
1173     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1174     FND_MSG_PUB.add;
1175   END IF;
1176 
1177   -- Check if the Stop date is not greater than Start date
1178   IF ( p_interval_rec.start_date IS NOT NULL AND
1179        p_interval_rec.stop_date IS NOT NULL AND
1180        p_interval_rec.stop_date < p_interval_rec.start_date ) THEN
1181     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_DATE_RANGE' );
1182     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1183     FND_MSG_PUB.add;
1184   END IF;
1185 
1186   -- Check if both Date based and Value based interval ranges are not passed
1187   IF ( ( p_interval_rec.start_date IS NOT NULL OR
1188          p_interval_rec.stop_date IS NOT NULL ) AND
1189        ( p_interval_rec.start_value IS NOT NULL OR
1190          p_interval_rec.stop_value IS NOT NULL ) ) THEN
1191     FND_MESSAGE.set_name( 'AHL','AHL_FMP_BOTH_DATE_VALUE_RANGE' );
1192     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1193     FND_MSG_PUB.add;
1194   END IF;
1195 
1196   -- Check if the Interval Value is between Start Value and Stop Value
1197   IF ( p_interval_rec.start_value IS NOT NULL AND
1198        p_interval_rec.stop_value IS NOT NULL AND
1199        p_interval_rec.interval_value >
1200          --( p_interval_rec.stop_value - p_interval_rec.start_value ) ) THEN
1201          -- Fix for bug# 3482307.
1202          ( p_interval_rec.stop_value - p_interval_rec.start_value + 1) ) THEN
1203     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_INTERVAL_RANGE' );
1204     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1205     FND_MSG_PUB.add;
1206   END IF;
1207 
1208   -- Check if the earliest due value is less than Start Value
1209   IF ( p_interval_rec.start_value IS NOT NULL AND
1210        p_interval_rec.earliest_due_value >  p_interval_rec.start_value ) THEN
1211     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_INTERVAL_RANGE' );
1212     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_interval_rec ) );
1213     FND_MSG_PUB.add;
1214   END IF;
1215 
1216 END validate_record;
1217 
1218 -- Procedure to Perform cross records validation and duplicate checks
1219 PROCEDURE validate_records
1220 (
1221   p_mr_effectivity_id       IN    NUMBER,
1222   p_repetitive_flag         IN    VARCHAR2,
1223   p_appln_code              IN    VARCHAR2,
1224   p_mr_type_code            IN    VARCHAR2,
1225   x_return_status           OUT NOCOPY VARCHAR2
1226 )
1227 IS
1228 
1229 l_interval_rec                    interval_rec_type;
1230 l_prev_counter_id                 NUMBER := NULL;
1231 l_prev_stop_date                  DATE := NULL;
1232 l_prev_stop_value                 NUMBER := NULL;
1233 l_counter_id                      NUMBER := NULL;
1234 l_counter_name                    VARCHAR2(30) := NULL;
1235 l_start_date                      DATE;
1236 l_stop_date                       DATE;
1237 l_start_value                     NUMBER;
1238 l_stop_value                      NUMBER;
1239 l_earliest_due_value              NUMBER;
1240 
1241 CURSOR get_pm_pgm_dup_rec( c_mr_effectivity_id NUMBER )
1242 IS
1243 SELECT   counter_id,
1244          counter_name
1245 FROM     AHL_MR_INTERVALS_V
1246 WHERE    mr_effectivity_id = c_mr_effectivity_id
1247 GROUP BY counter_id,
1248          counter_name
1249 HAVING   count(*) > 1;
1250 
1251 CURSOR get_dup_rec( c_mr_effectivity_id NUMBER )
1252 IS
1253 SELECT   counter_id,
1254          counter_name,
1255          start_value,
1256          stop_value,
1257          start_date,
1258          stop_date
1259 FROM     AHL_MR_INTERVALS_V
1260 WHERE    mr_effectivity_id = c_mr_effectivity_id
1261 GROUP BY counter_id,
1262          counter_name,
1263          start_value,
1264          stop_value,
1265          start_date,
1266          stop_date
1267 HAVING   count(*) > 1;
1268 
1269 CURSOR get_recs_for_date_range( c_mr_effectivity_id NUMBER )
1270 IS
1271 SELECT   counter_id,
1272          counter_name,
1273          start_date,
1274          stop_date
1275 FROM     AHL_MR_INTERVALS_V
1276 WHERE    mr_effectivity_id = c_mr_effectivity_id
1277 ORDER BY counter_id,
1278          start_date,
1279          stop_date;
1280 
1281 CURSOR get_recs_for_value_range( c_mr_effectivity_id NUMBER )
1282 IS
1283 SELECT   counter_id,
1284          counter_name,
1285          earliest_due_value,
1286          start_value,
1287          stop_value
1288 FROM     AHL_MR_INTERVALS_V
1289 WHERE    mr_effectivity_id = c_mr_effectivity_id
1290 ORDER BY counter_id,
1291          start_value,
1292          stop_value;
1293 
1294 CURSOR   check_unique_reset_value( c_mr_effectivity_id NUMBER )
1295 IS
1296 SELECT   counter_name
1297 FROM     AHL_MR_INTERVALS_V
1298 WHERE    mr_effectivity_id = c_mr_effectivity_id
1299 AND      reset_value IS NOT NULL
1300 GROUP BY counter_name
1301 HAVING   count(*) > 1;
1302 
1303 BEGIN
1304   x_return_status := FND_API.G_RET_STS_SUCCESS;
1305 
1306   -- Check whether any duplicate Interval record (based on Counter) exist
1307   -- For Preventive Maintenance Programs
1308 
1309   IF ( p_appln_code = 'PM' AND
1310        p_mr_type_code = 'PROGRAM' ) THEN
1311 
1312     OPEN  get_pm_pgm_dup_rec( p_mr_effectivity_id );
1313 
1314     LOOP
1315       FETCH get_pm_pgm_dup_rec INTO
1316         l_interval_rec.counter_id,
1317         l_interval_rec.counter_name;
1318 
1319       EXIT WHEN get_pm_pgm_dup_rec%NOTFOUND;
1320 
1321       FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_PM_PGM_DUP_INT_REC' );
1322       FND_MESSAGE.set_token( 'FIELD', l_interval_rec.counter_name );
1323       FND_MSG_PUB.add;
1324     END LOOP;
1325 
1326     IF ( get_pm_pgm_dup_rec%ROWCOUNT > 0 ) THEN
1327       x_return_status := FND_API.G_RET_STS_ERROR;
1328     END IF;
1329 
1330     CLOSE get_pm_pgm_dup_rec;
1331     RETURN;
1332 
1333   END IF;
1334 
1335   -- Check whether any duplicate Interval record (based on Counter and Range) exist
1336   OPEN  get_dup_rec( p_mr_effectivity_id );
1337 
1338   LOOP
1339     FETCH get_dup_rec INTO
1340       l_interval_rec.counter_id,
1341       l_interval_rec.counter_name,
1342       l_interval_rec.start_value,
1343       l_interval_rec.stop_value,
1344       l_interval_rec.start_date,
1345       l_interval_rec.stop_date;
1346 
1347     EXIT WHEN get_dup_rec%NOTFOUND;
1348 
1349     FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_DUPLICATE_INT_REC' );
1350     FND_MESSAGE.set_token( 'RECORD', get_record_identifier( l_interval_rec ) );
1351     FND_MSG_PUB.add;
1352   END LOOP;
1353 
1354   IF ( get_dup_rec%ROWCOUNT > 0 ) THEN
1355     CLOSE get_dup_rec;
1356     x_return_status := FND_API.G_RET_STS_ERROR;
1357     RETURN;
1358   END IF;
1359 
1360   CLOSE get_dup_rec;
1361 
1362   IF ( p_repetitive_flag = 'N' ) THEN
1363     RETURN;
1364   END IF;
1365 
1366   OPEN get_recs_for_date_range( p_mr_effectivity_id );
1367 
1368   LOOP
1369     FETCH get_recs_for_date_range INTO
1370       l_interval_rec.counter_id,
1371       l_interval_rec.counter_name,
1372       l_interval_rec.start_date,
1373       l_interval_rec.stop_date;
1374 
1375     EXIT WHEN get_recs_for_date_range%NOTFOUND;
1376 
1377     IF ( l_prev_counter_id IS NOT NULL AND
1378          l_prev_stop_date IS NOT NULL AND
1379          l_interval_rec.counter_id = l_prev_counter_id AND
1380          --l_interval_rec.start_date < l_prev_stop_date ) THEN
1381          -- Fix for bug# 3482307.
1382          l_interval_rec.start_date <= l_prev_stop_date ) THEN
1383       FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_OVERLAP_DATE_RANGE' );
1384       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( l_interval_rec ) );
1385       FND_MSG_PUB.add;
1386       CLOSE get_recs_for_date_range;
1387       x_return_status := FND_API.G_RET_STS_ERROR;
1388       RETURN;
1389     END IF;
1390 
1391     l_prev_counter_id := l_interval_rec.counter_id;
1392     l_prev_stop_date := l_interval_rec.stop_date;
1393 
1394   END LOOP;
1395 
1396   CLOSE get_recs_for_date_range;
1397   l_prev_counter_id := null;
1398 
1399   OPEN get_recs_for_value_range( p_mr_effectivity_id );
1400 
1401   LOOP
1402     FETCH get_recs_for_value_range INTO
1403       l_interval_rec.counter_id,
1404       l_interval_rec.counter_name,
1405       l_interval_rec.earliest_due_value,
1406       l_interval_rec.start_value,
1407       l_interval_rec.stop_value;
1408 
1409     EXIT WHEN get_recs_for_value_range%NOTFOUND;
1410 
1411     IF ( l_prev_counter_id IS NOT NULL AND
1412          l_prev_stop_value IS NOT NULL AND
1413          l_interval_rec.counter_id = l_prev_counter_id AND
1414          --l_interval_rec.start_value < l_prev_stop_value ) THEN
1415          -- Fix for bug# 3482307.
1416          l_interval_rec.start_value <= l_prev_stop_value ) THEN
1417       FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_OVERLAP_VALUE_RANGE' );
1418       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( l_interval_rec ) );
1419       FND_MSG_PUB.add;
1420       CLOSE get_recs_for_value_range;
1421       x_return_status := FND_API.G_RET_STS_ERROR;
1422       RETURN;
1423     END IF;
1424 
1425     IF ( l_prev_counter_id IS NOT NULL AND
1426          l_prev_stop_value IS NOT NULL AND
1427          l_interval_rec.counter_id = l_prev_counter_id AND
1428          l_interval_rec.earliest_due_value <= l_prev_stop_value ) THEN
1429       FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_OVERLAP_VALUE_RANGE' );
1430       FND_MESSAGE.set_token( 'RECORD', get_record_identifier( l_interval_rec ) );
1431       FND_MSG_PUB.add;
1432       CLOSE get_recs_for_value_range;
1433       x_return_status := FND_API.G_RET_STS_ERROR;
1434       RETURN;
1435     END IF;
1436 
1437     l_prev_counter_id := l_interval_rec.counter_id;
1438     l_prev_stop_value := l_interval_rec.stop_value;
1439 
1440   END LOOP;
1441 
1442   CLOSE get_recs_for_value_range;
1443 
1444   OPEN  check_unique_reset_value( p_mr_effectivity_id );
1445   LOOP
1446     FETCH check_unique_reset_value
1447     INTO  l_counter_name;
1448 
1449     EXIT WHEN check_unique_reset_value%NOTFOUND;
1450 
1451     FND_MESSAGE.set_name( 'AHL','AHL_FMP_RESET_VALUE_NONUNIQUE' );
1452     FND_MESSAGE.set_token( 'FIELD', l_counter_name );
1453     FND_MSG_PUB.add;
1454   END LOOP;
1455 
1456   IF ( check_unique_reset_value%ROWCOUNT > 0 ) THEN
1457     CLOSE check_unique_reset_value;
1458     x_return_status := FND_API.G_RET_STS_ERROR;
1459     RETURN;
1460   END IF;
1461 
1462   CLOSE check_unique_reset_value;
1463 
1464 END validate_records;
1465 
1466 -- Procedure to get the Repetitive Flag and Type for a MR
1467 PROCEDURE get_mr_header_details
1468 (
1469   p_mr_header_id            IN    NUMBER,
1470   x_repetitive_flag         OUT NOCOPY VARCHAR2,
1471   x_mr_type_code            OUT NOCOPY VARCHAR2
1472 )
1473 IS
1474 
1475 CURSOR get_mr_details( c_mr_header_id NUMBER )
1476 IS
1477 SELECT repetitive_flag,
1478        type_code
1479 FROM   AHL_MR_HEADERS_APP_V
1480 WHERE  mr_header_id = c_mr_header_id;
1481 
1482 BEGIN
1483 
1484   -- Get the Repetitive Flag and Type of the MR.
1485   OPEN get_mr_details( p_mr_header_id );
1486 
1487   FETCH get_mr_details INTO
1488     x_repetitive_flag,
1489     x_mr_type_code;
1490 
1491   CLOSE get_mr_details;
1492 
1493 END get_mr_header_details;
1494 
1495 -- Procedure to default the old value of the Threshold Date
1496 PROCEDURE default_threshold_attributes
1497 (
1498   p_x_threshold_rec             IN OUT NOCOPY    threshold_rec_type
1499 )
1500 IS
1501 
1502 CURSOR get_old_rec( c_mr_effectivity_id NUMBER )
1503 IS
1504 SELECT threshold_date,
1505        program_duration,
1506        program_duration_uom_code
1507 FROM   AHL_MR_EFFECTIVITIES_APP_V
1508 WHERE  mr_effectivity_id = c_mr_effectivity_id;
1509 
1510 l_old_rec          threshold_rec_type;
1511 
1512 BEGIN
1513 
1514   OPEN get_old_rec( p_x_threshold_rec.mr_effectivity_id );
1515 
1516   FETCH get_old_rec INTO
1517     l_old_rec.threshold_date,
1518     l_old_rec.program_duration,
1519     l_old_rec.program_duration_uom_code;
1520 
1521   CLOSE get_old_rec;
1522 
1523   IF ( p_x_threshold_rec.threshold_date = FND_API.G_MISS_DATE ) THEN
1524     p_x_threshold_rec.threshold_date := null;
1525   ELSIF ( p_x_threshold_rec.threshold_date IS NULL ) THEN
1526     p_x_threshold_rec.threshold_date := l_old_rec.threshold_date;
1527   END IF;
1528 
1529   IF ( p_x_threshold_rec.program_duration = FND_API.G_MISS_NUM ) THEN
1530     p_x_threshold_rec.program_duration := null;
1531   ELSIF ( p_x_threshold_rec.program_duration IS NULL ) THEN
1532     p_x_threshold_rec.program_duration := l_old_rec.program_duration;
1533   END IF;
1534 
1535   IF ( p_x_threshold_rec.program_duration_uom_code = FND_API.G_MISS_CHAR ) THEN
1536     p_x_threshold_rec.program_duration_uom_code := null;
1537   ELSIF ( p_x_threshold_rec.program_duration_uom_code IS NULL ) THEN
1538     p_x_threshold_rec.program_duration_uom_code := l_old_rec.program_duration_uom_code;
1539   END IF;
1540 
1541 END default_threshold_attributes;
1542 
1543 -- Procedure to validate and update the Threshold information
1544 PROCEDURE update_threshold
1545 (
1546   p_x_threshold_rec         IN OUT NOCOPY   threshold_rec_type,
1547   p_repetitive_flag         IN              VARCHAR2,
1548   p_appln_code              IN              VARCHAR2,
1549   p_mr_type_code            IN              VARCHAR2,
1550   x_return_status           OUT NOCOPY      VARCHAR2,
1551   p_super_user              IN            VARCHAR2,
1552   p_mr_header_id            IN             NUMBER
1553 )
1554 IS
1555 
1556 l_return_status            VARCHAR2(1);
1557 l_msg_data                 VARCHAR2(2000);
1558 l_old_threshold_rec        threshold_rec_type;
1559 l_mr_status_code            VARCHAR2(30);
1560 l_pm_install_flag           VARCHAR2(1);
1561 
1562 BEGIN
1563   x_return_status := FND_API.G_RET_STS_SUCCESS;
1564 
1565   -- Default unchanged value of Threshold attributes
1566   default_threshold_attributes
1567   (
1568     p_x_threshold_rec -- IN OUT
1569   );
1570 
1571   -- Check if the Threshold date is not set for repeating MRs.
1572   IF ( p_x_threshold_rec.threshold_date IS NOT NULL AND
1573        p_repetitive_flag = 'Y' ) THEN
1574     FND_MESSAGE.set_name( 'AHL','AHL_FMP_INVALID_THRESHOLD' );
1575     FND_MSG_PUB.add;
1576     x_return_status := FND_API.G_RET_STS_ERROR;
1577     RETURN;
1578   END IF;
1579 
1580   -- Check if the Threshold date is not set for PM Programs
1581   IF ( p_x_threshold_rec.threshold_date IS NOT NULL AND
1582        p_appln_code= 'PM' AND
1583        p_mr_type_code = 'PROGRAM' ) THEN
1584     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_THRESHOLD' );
1585     FND_MSG_PUB.add;
1586     x_return_status := FND_API.G_RET_STS_ERROR;
1587     RETURN;
1588   END IF;
1589 
1590   -- Check if the Program Duration is not specified for PM Activities.
1591   IF ( p_x_threshold_rec.program_duration IS NOT NULL AND
1592        p_appln_code = 'PM' AND
1593        p_mr_type_code = 'ACTIVITY' ) THEN
1594     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_ACT_PGM_DURATION' );
1595     FND_MSG_PUB.add;
1596     x_return_status := FND_API.G_RET_STS_ERROR;
1597     RETURN;
1598   END IF;
1599 
1600   -- Check if the Program Duration is a positive number.
1601   IF ( p_x_threshold_rec.program_duration IS NOT NULL AND
1602        p_x_threshold_rec.program_duration <= 0 ) THEN
1603     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_DUR_INVALID' );
1604     FND_MSG_PUB.add;
1605     x_return_status := FND_API.G_RET_STS_ERROR;
1606     RETURN;
1607   END IF;
1608 
1609   -- Check if the Program Duration is specified then the UOM should be specified.
1610   IF ( p_x_threshold_rec.program_duration IS NOT NULL AND
1611        p_x_threshold_rec.program_duration_uom_code IS NULL ) THEN
1612     FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_PGM_DUR_UOM_NULL' );
1613     FND_MSG_PUB.add;
1614     x_return_status := FND_API.G_RET_STS_ERROR;
1615     RETURN;
1616   END IF;
1617 
1618   -- Check if the Program Duration UOM is a valid value.
1619   IF ( p_x_threshold_rec.program_duration_uom_code IS NOT NULL ) THEN
1620 
1621     AHL_FMP_COMMON_PVT.validate_lookup
1622     (
1623       x_return_status        => l_return_status,
1624       x_msg_data             => l_msg_data,
1625       p_lookup_type          => 'AHL_UMP_TIME_UOM',
1626       p_lookup_meaning       => NULL,
1627       p_x_lookup_code        => p_x_threshold_rec.program_duration_uom_code
1628     );
1629 
1630     IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
1631       FND_MESSAGE.set_name( 'AHL','AHL_FMP_PM_INV_PGM_DUR_UOM' );
1632       FND_MSG_PUB.add;
1633       x_return_status := FND_API.G_RET_STS_ERROR;
1634       RETURN;
1635     END IF;
1636   END IF;
1637 
1638      -- Check Profile value
1639 
1640     IF  G_APPLN_USAGE IS NULL
1641     THEN
1642     FND_MESSAGE.SET_NAME('AHL','AHL_COM_APP_PRFL_UNDEF');
1643     FND_MSG_PUB.ADD;
1644     x_return_status := FND_API.G_RET_STS_ERROR;
1645         IF G_DEBUG = 'Y' THEN
1646             AHL_DEBUG_PUB.debug('APPLN USAGE CODE  IS NULL IN VALIDATE_API_INPUTS' );
1647         END IF;
1648     END IF;
1649 
1650 
1651   IF ( G_APPLN_USAGE = 'PM' ) THEN
1652     l_pm_install_flag:= 'Y';
1653   ELSE
1654     l_pm_install_flag:= 'N';
1655   END IF;
1656 
1657  -- Update effectivity only if changed attributes.
1658   IF ((p_x_threshold_rec.program_duration IS NULL AND
1659       l_old_threshold_rec.program_duration IS NOT NULL) OR
1660      (p_x_threshold_rec.program_duration IS NOT NULL AND
1661       l_old_threshold_rec.program_duration IS NOT NULL AND
1662       l_old_threshold_rec.program_duration <> p_x_threshold_rec.program_duration) OR
1663       (p_x_threshold_rec.program_duration IS NOT NULL AND
1664        l_old_threshold_rec.program_duration IS NULL) OR
1665 
1666       (p_x_threshold_rec.program_duration_uom_code IS NULL AND
1667       l_old_threshold_rec.program_duration_uom_code IS NOT NULL) OR
1668      (p_x_threshold_rec.program_duration_uom_code IS NOT NULL AND
1669       l_old_threshold_rec.program_duration_uom_code IS NOT NULL AND
1670       l_old_threshold_rec.program_duration_uom_code <> p_x_threshold_rec.program_duration_uom_code) OR
1671       (p_x_threshold_rec.program_duration_uom_code IS NOT NULL AND
1672        l_old_threshold_rec.program_duration_uom_code IS NULL) OR
1673 
1674      (p_x_threshold_rec.threshold_date IS NULL AND
1675       l_old_threshold_rec.threshold_date IS NOT NULL) OR
1676      (p_x_threshold_rec.threshold_date IS NOT NULL AND
1677       l_old_threshold_rec.threshold_date IS NOT NULL AND
1678       l_old_threshold_rec.threshold_date <> p_x_threshold_rec.threshold_date) OR
1679       (p_x_threshold_rec.threshold_date IS NOT NULL AND
1680        l_old_threshold_rec.threshold_date IS NULL)  ) THEN
1681 
1682    l_mr_status_code :=AHL_FMP_COMMON_PVT.check_mr_status(p_mr_header_id);
1683    IF ( l_pm_install_flag = 'Y' AND
1684         p_super_user = 'Y'      AND
1685         l_mr_status_code = 'COMPLETE' AND
1686         p_mr_type_code ='PROGRAM' ) THEN
1687         AHL_FMP_COMMON_PVT.validate_mr_type_program
1688         (
1689             x_return_status    => l_return_status,
1690             x_msg_data         => l_msg_data,
1691             p_mr_header_id     => p_mr_header_id,
1692             p_effectivity_id   => p_x_threshold_rec.MR_EFFECTIVITY_ID,
1693             p_eff_obj_version  => p_x_threshold_rec.OBJECT_VERSION_NUMBER
1694         );
1695         IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
1696            FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_PROGRAM_DURATION' );
1697            FND_MSG_PUB.add;
1698            x_return_status := FND_API.G_RET_STS_ERROR;
1699            RETURN;
1700         END IF;
1701    END IF;
1702 
1703    IF ( l_pm_install_flag = 'Y' AND
1704         p_super_user = 'Y'      AND
1705         l_mr_status_code = 'COMPLETE' AND
1706         p_mr_type_code ='ACTIVITY' ) THEN
1707         AHL_FMP_COMMON_PVT.validate_mr_type_activity
1708         (
1709             x_return_status    => l_return_status,
1710             x_msg_data         => l_msg_data,
1711             p_effectivity_id   => p_x_threshold_rec.MR_EFFECTIVITY_ID,
1712             p_eff_obj_version  => p_x_threshold_rec.OBJECT_VERSION_NUMBER
1713         );
1714         IF ( NVL( l_return_status, 'X' ) <> FND_API.G_RET_STS_SUCCESS ) THEN
1715            FND_MESSAGE.set_name( 'AHL', 'AHL_FMP_PROGRAM_DURATION' );
1716            FND_MSG_PUB.add;
1717            x_return_status := FND_API.G_RET_STS_ERROR;
1718            RETURN;
1719         END IF;
1720    END IF;
1721 
1722 
1723     -- Update the record
1724     UPDATE AHL_MR_EFFECTIVITIES SET
1725       object_version_number     = object_version_number + 1,
1726       threshold_date            = p_x_threshold_rec.threshold_date,
1727       program_duration          = p_x_threshold_rec.program_duration,
1728       program_duration_uom_code = p_x_threshold_rec.program_duration_uom_code,
1729       last_update_date          = SYSDATE,
1730       last_updated_by           = FND_GLOBAL.user_id,
1731       last_update_login         = FND_GLOBAL.login_id
1732     WHERE mr_effectivity_id     = p_x_threshold_rec.mr_effectivity_id
1733     AND   object_version_number = p_x_threshold_rec.object_version_number;
1734 
1735     -- If the record does not exist, then, abort API.
1736     IF ( SQL%ROWCOUNT = 0 ) THEN
1737       FND_MESSAGE.set_name('AHL','AHL_FMP_EFF_RECORD_CHANGED');
1738       FND_MSG_PUB.add;
1739       x_return_status := FND_API.G_RET_STS_ERROR;
1740       RETURN;
1741     END IF;
1742 
1743   END IF;
1744 
1745 END update_threshold;
1746 
1747 PROCEDURE process_interval
1748 (
1749  p_api_version        IN             NUMBER     := '1.0',
1750  p_init_msg_list      IN             VARCHAR2   := FND_API.G_TRUE,
1751  p_commit             IN             VARCHAR2   := FND_API.G_FALSE,
1752  p_validation_level   IN             NUMBER     := FND_API.G_VALID_LEVEL_FULL,
1753  p_default            IN             VARCHAR2   := FND_API.G_FALSE,
1754  p_module_type        IN             VARCHAR2   := NULL,
1755  x_return_status      OUT NOCOPY     VARCHAR2,
1756  x_msg_count          OUT NOCOPY     NUMBER,
1757  x_msg_data           OUT NOCOPY     VARCHAR2,
1758  p_x_interval_tbl     IN OUT NOCOPY  interval_tbl_type,
1759  p_x_threshold_rec    IN OUT NOCOPY  threshold_rec_type,
1760  p_mr_header_id       IN             NUMBER,
1761  p_super_user         IN            VARCHAR2
1762 )
1763 IS
1764 l_api_version    CONSTANT   NUMBER         := 1.0;
1765 l_return_status             VARCHAR2(1);
1766 l_msg_count                 NUMBER;
1767 l_mr_interval_id            NUMBER;
1768 
1769 l_fractional_trunc_flag     BOOLEAN := FALSE;
1770 
1771 BEGIN
1772   -- Initialize API return status to success
1773   x_return_status := FND_API.G_RET_STS_SUCCESS;
1774 
1775   -- Standard Start of API savepoint
1776   SAVEPOINT process_interval_PVT;
1777 
1778   -- Standard call to check for call compatibility.
1779   IF NOT FND_API.compatible_api_call
1780   (
1781     l_api_version,
1782     p_api_version,
1783     G_API_NAME,
1784     G_PKG_NAME
1785   )
1786   THEN
1787     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1788   END IF;
1789 
1790   -- Initialize message list if p_init_msg_list is set to TRUE.
1791   IF FND_API.to_boolean( p_init_msg_list ) THEN
1792     FND_MSG_PUB.initialize;
1793   END IF;
1794 
1795   -- Enable Debug (optional)
1796   IF ( G_DEBUG = 'Y' ) THEN
1797     AHL_DEBUG_PUB.enable_debug;
1798   END IF;
1799 
1800   IF G_DEBUG = 'Y' THEN
1801     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' : Begin API' );
1802   END IF;
1803 
1804   -- Get the PM Installation Flag
1805 
1806   IF G_DEBUG = 'Y' THEN
1807     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' : Application Installed : ' || G_APPLN_USAGE );
1808   END IF;
1809 
1810   -- Validate all the inputs of the API
1811   validate_api_inputs
1812   (
1813     p_x_interval_tbl, -- IN
1814     p_mr_header_id, -- IN
1815     p_x_threshold_rec, -- IN
1816     l_return_status, -- OUT
1817     p_super_user
1818   );
1819 
1820   -- If any severe error occurs, then, abort API.
1821   IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1822     RAISE FND_API.G_EXC_ERROR;
1823   ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1824     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1825   END IF;
1826 
1827   -- Get the Details for the given MR
1828   get_mr_header_details
1829   (
1830     p_mr_header_id, -- IN
1831     g_repetitive_flag, -- OUT
1832     g_mr_type_code -- OUT
1833   );
1834 
1835   -- Validate and Update the Threshold information
1836   update_threshold
1837   (
1838     p_x_threshold_rec, -- IN
1839     g_repetitive_flag, -- IN
1840     G_APPLN_USAGE, -- IN
1841     g_mr_type_code,
1842     l_return_status, -- OUT
1843     p_super_user,
1844     p_mr_header_id
1845 
1846   );
1847 
1848   -- If any severe error occurs, then, abort API.
1849   IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1850     RAISE FND_API.G_EXC_ERROR;
1851   ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1852     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1853   END IF;
1854 
1855   -- If the module type is JSP, then default values for ID columns of LOV attributes
1856   IF ( p_module_type = 'JSP' ) THEN
1857     FOR i IN 1..p_x_interval_tbl.count LOOP
1858       IF ( p_x_interval_tbl(i).dml_operation <> 'D' ) THEN
1859         clear_lov_attribute_ids
1860         (
1861           p_x_interval_tbl(i) -- IN OUT Record with Values and Ids
1862         );
1863       END IF;
1864     END LOOP;
1865   END IF;
1866 
1867   -- Convert Values into Ids.
1868   IF ( p_validation_level = FND_API.G_VALID_LEVEL_FULL ) THEN
1869     FOR i IN 1..p_x_interval_tbl.count LOOP
1870       IF ( p_x_interval_tbl(i).dml_operation <> 'D' ) THEN
1871         convert_values_to_ids
1872         (
1873           p_x_interval_tbl(i), -- IN OUT Record with Values and Ids
1874           p_x_threshold_rec.mr_effectivity_id, -- IN
1875           l_return_status -- OUT
1876         );
1877 
1878         -- If any severe error occurs, then, abort API.
1879         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1880           RAISE FND_API.G_EXC_ERROR;
1881         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1882           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1883         END IF;
1884       END IF;
1885     END LOOP;
1886   END IF;
1887 
1888   IF G_DEBUG = 'Y' THEN
1889     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after convert_values_to_ids' );
1890   END IF;
1891 
1892   -- Default interval attributes.
1893     FOR i IN 1..p_x_interval_tbl.count LOOP
1894       IF ( p_x_interval_tbl(i).dml_operation <> 'D' ) THEN
1895         default_attributes
1896         (
1897           p_x_interval_tbl(i), -- IN OUT
1898           l_fractional_trunc_flag  -- OUT
1899         );
1900       END IF;
1901     END LOOP;
1902 
1903   IF G_DEBUG = 'Y' THEN
1904     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after default_attributes' );
1905   END IF;
1906 
1907   -- Validate all attributes (Item level validation)
1908   IF ( p_validation_level = FND_API.G_VALID_LEVEL_FULL ) THEN
1909     FOR i IN 1..p_x_interval_tbl.count LOOP
1910       validate_attributes
1911       (
1912         p_x_interval_tbl(i), -- IN
1913         l_return_status -- OUT
1914       );
1915 
1916       -- If any severe error occurs, then, abort API.
1917       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1918         RAISE FND_API.G_EXC_ERROR;
1919       ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR  THEN
1920         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1921       END IF;
1922     END LOOP;
1923   END IF;
1924 
1925   IF G_DEBUG = 'Y' THEN
1926     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after validate_attributes' );
1927   END IF;
1928 
1929   -- Default missing and unchanged attributes.
1930   FOR i IN 1..p_x_interval_tbl.count LOOP
1931     IF ( p_x_interval_tbl(i).dml_operation = 'U' ) THEN
1932       default_unchanged_attributes
1933       (
1934         p_x_interval_tbl(i) -- IN OUT
1935       );
1936     ELSIF ( p_x_interval_tbl(i).dml_operation = 'C' ) THEN
1937       default_missing_attributes
1938       (
1939         p_x_interval_tbl(i) -- IN OUT
1940       );
1941     END IF;
1942   END LOOP;
1943 
1944   IF G_DEBUG = 'Y' THEN
1945     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after default_unchanged_attributes / default_missing_attributes' );
1946   END IF;
1947 
1948   -- Perform cross attribute validation and missing attribute checks (Record level validation)
1949   IF ( p_validation_level = FND_API.G_VALID_LEVEL_FULL ) THEN
1950     FOR i IN 1..p_x_interval_tbl.count LOOP
1951       IF ( p_x_interval_tbl(i).dml_operation <> 'D' ) THEN
1952         validate_record
1953         (
1954           p_x_interval_tbl(i), -- IN
1955           g_repetitive_flag, -- IN
1956           G_APPLN_USAGE, -- IN
1957           g_mr_type_code, -- IN
1958           l_return_status -- OUT
1959         );
1960 
1961         -- If any severe error occurs, then, abort API.
1962         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1963           RAISE FND_API.G_EXC_ERROR;
1964         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR  THEN
1965           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1966         END IF;
1967       END IF;
1968     END LOOP;
1969   END IF;
1970 
1971   IF G_DEBUG = 'Y' THEN
1972     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after validate_record' );
1973   END IF;
1974 
1975   --pdoki added for ADAT ER start.
1976   FOR i IN 1..p_x_interval_tbl.count LOOP
1977       IF ( p_x_interval_tbl(i).dml_operation <> 'D' ) THEN
1978         IF (p_x_interval_tbl(i).start_date IS NOT NULL OR p_x_interval_tbl(i).start_value IS NOT NULL) THEN
1979 	     IF (p_x_interval_tbl(i).duedate_rule_code IS NOT NULL) THEN
1980 	        AHL_RM_ROUTE_UTIL.validate_lookup(
1981 			x_return_status 	=>	x_return_status,
1982 			x_msg_data		=>	x_msg_data,
1983 			p_lookup_type		=>	'AHL_DUEDATE_RULE',
1984 			p_lookup_meaning	=>	p_x_interval_tbl(i).duedate_rule_meaning,
1985 			p_x_lookup_code		=>	p_x_interval_tbl(i).duedate_rule_code
1986 		   );
1987 		  IF x_return_status = FND_API.G_RET_STS_ERROR THEN
1988 		     RAISE FND_API.G_EXC_ERROR;
1989 		  END IF;
1990 	     END IF;
1991 	ELSE
1992 	  p_x_interval_tbl(i).duedate_rule_code := NULL;
1993 	END IF;
1994       END IF;
1995     END LOOP;
1996    --pdoki added for ADAT ER end.
1997 
1998   -- Get all the error messages from the previous steps (if any) and raise the appropriate Exception
1999   l_msg_count := FND_MSG_PUB.count_msg;
2000   IF l_msg_count > 0 THEN
2001     x_msg_count := l_msg_count;
2002     RAISE FND_API.G_EXC_ERROR;
2003   END IF;
2004 
2005   -- Perform the DML statement directly.
2006   FOR i IN 1..p_x_interval_tbl.count LOOP
2007     IF ( p_x_interval_tbl(i).dml_operation = 'C' ) THEN
2008 
2009       -- Insert the record
2010       INSERT INTO AHL_MR_INTERVALS
2011       (
2012         MR_INTERVAL_ID,
2013         OBJECT_VERSION_NUMBER,
2014         MR_EFFECTIVITY_ID,
2015         COUNTER_ID,
2016         INTERVAL_VALUE,
2017         EARLIEST_DUE_VALUE,
2018         START_VALUE,
2019         STOP_VALUE,
2020         START_DATE,
2021         STOP_DATE,
2022         TOLERANCE_BEFORE,
2023         TOLERANCE_AFTER,
2024         RESET_VALUE,
2025         ATTRIBUTE_CATEGORY,
2026         ATTRIBUTE1,
2027         ATTRIBUTE2,
2028         ATTRIBUTE3,
2029         ATTRIBUTE4,
2030         ATTRIBUTE5,
2031         ATTRIBUTE6,
2032         ATTRIBUTE7,
2033         ATTRIBUTE8,
2034         ATTRIBUTE9,
2035         ATTRIBUTE10,
2036         ATTRIBUTE11,
2037         ATTRIBUTE12,
2038         ATTRIBUTE13,
2039         ATTRIBUTE14,
2040         ATTRIBUTE15,
2041         LAST_UPDATE_DATE,
2042         LAST_UPDATED_BY,
2043         CREATION_DATE,
2044         CREATED_BY,
2045         LAST_UPDATE_LOGIN,
2046 	CALC_DUEDATE_RULE_CODE  --pdoki added for ADAT ER
2047       ) VALUES
2048       (
2049         AHL_MR_INTERVALS_S.NEXTVAL,
2050         p_x_interval_tbl(i).object_version_number,
2051         p_x_threshold_rec.mr_effectivity_id,
2052         p_x_interval_tbl(i).counter_id,
2053         p_x_interval_tbl(i).interval_value,
2054         p_x_interval_tbl(i).earliest_due_value,
2055         p_x_interval_tbl(i).start_value,
2056         p_x_interval_tbl(i).stop_value,
2057         p_x_interval_tbl(i).start_date,
2058         p_x_interval_tbl(i).stop_date,
2059         p_x_interval_tbl(i).tolerance_before,
2060         p_x_interval_tbl(i).tolerance_after,
2061         p_x_interval_tbl(i).reset_value,
2062         p_x_interval_tbl(i).attribute_category,
2063         p_x_interval_tbl(i).attribute1,
2064         p_x_interval_tbl(i).attribute2,
2065         p_x_interval_tbl(i).attribute3,
2066         p_x_interval_tbl(i).attribute4,
2067         p_x_interval_tbl(i).attribute5,
2068         p_x_interval_tbl(i).attribute6,
2069         p_x_interval_tbl(i).attribute7,
2070         p_x_interval_tbl(i).attribute8,
2071         p_x_interval_tbl(i).attribute9,
2072         p_x_interval_tbl(i).attribute10,
2073         p_x_interval_tbl(i).attribute11,
2074         p_x_interval_tbl(i).attribute12,
2075         p_x_interval_tbl(i).attribute13,
2076         p_x_interval_tbl(i).attribute14,
2077         p_x_interval_tbl(i).attribute15,
2078         p_x_interval_tbl(i).last_update_date,
2079         p_x_interval_tbl(i).last_updated_by,
2080         p_x_interval_tbl(i).creation_date,
2081         p_x_interval_tbl(i).created_by,
2082         p_x_interval_tbl(i).last_update_login,
2083 	p_x_interval_tbl(i).duedate_rule_code  --pdoki added for ADAT ER
2084       ) RETURNING mr_interval_id INTO l_mr_interval_id;
2085 
2086       -- Set OUT values
2087       p_x_interval_tbl(i).mr_interval_id := l_mr_interval_id;
2088 
2089     ELSIF ( p_x_interval_tbl(i).dml_operation = 'U' ) THEN
2090 
2091       -- Update the record
2092       UPDATE AHL_MR_INTERVALS SET
2093         object_version_number = object_version_number + 1,
2094         counter_id            = p_x_interval_tbl(i).counter_id,
2095         interval_value        = p_x_interval_tbl(i).interval_value,
2096         earliest_due_value    = p_x_interval_tbl(i).earliest_due_value,
2097         start_value           = p_x_interval_tbl(i).start_value,
2098         stop_value            = p_x_interval_tbl(i).stop_value,
2099         start_date            = p_x_interval_tbl(i).start_date,
2100         stop_date             = p_x_interval_tbl(i).stop_date,
2101         tolerance_before      = p_x_interval_tbl(i).tolerance_before,
2102         tolerance_after       = p_x_interval_tbl(i).tolerance_after,
2103         reset_value           = p_x_interval_tbl(i).reset_value,
2104         attribute_category    = p_x_interval_tbl(i).attribute_category,
2105         attribute1            = p_x_interval_tbl(i).attribute1,
2106         attribute2            = p_x_interval_tbl(i).attribute2,
2107         attribute3            = p_x_interval_tbl(i).attribute3,
2108         attribute4            = p_x_interval_tbl(i).attribute4,
2109         attribute5            = p_x_interval_tbl(i).attribute5,
2110         attribute6            = p_x_interval_tbl(i).attribute6,
2111         attribute7            = p_x_interval_tbl(i).attribute7,
2112         attribute8            = p_x_interval_tbl(i).attribute8,
2113         attribute9            = p_x_interval_tbl(i).attribute9,
2114         attribute10           = p_x_interval_tbl(i).attribute10,
2115         attribute11           = p_x_interval_tbl(i).attribute11,
2116         attribute12           = p_x_interval_tbl(i).attribute12,
2117         attribute13           = p_x_interval_tbl(i).attribute13,
2118         attribute14           = p_x_interval_tbl(i).attribute14,
2119         attribute15           = p_x_interval_tbl(i).attribute15,
2120         last_update_date      = p_x_interval_tbl(i).last_update_date,
2121         last_updated_by       = p_x_interval_tbl(i).last_updated_by,
2122         last_update_login     = p_x_interval_tbl(i).last_update_login,
2123 	calc_duedate_rule_code= p_x_interval_tbl(i).duedate_rule_code --pdoki added for ADAT ER
2124       WHERE mr_interval_id  = p_x_interval_tbl(i).mr_interval_id
2125       AND   object_version_number     = p_x_interval_tbl(i).object_version_number;
2126 
2127       -- If the record does not exist, then, abort API.
2128       IF ( SQL%ROWCOUNT = 0 ) THEN
2129         FND_MESSAGE.set_name('AHL','AHL_FMP_RECORD_CHANGED');
2130         FND_MESSAGE.set_token( 'RECORD', get_record_identifier( p_x_interval_tbl(i) ) );
2131         FND_MSG_PUB.add;
2132         RAISE FND_API.G_EXC_ERROR;
2133       END IF;
2134 
2135       -- Set OUT values
2136       p_x_interval_tbl(i).object_version_number := p_x_interval_tbl(i).object_version_number + 1;
2137 
2138     ELSIF ( p_x_interval_tbl(i).dml_operation = 'D' ) THEN
2139 
2140       -- Delete the record
2141       DELETE AHL_MR_INTERVALS
2142       WHERE mr_interval_id        = p_x_interval_tbl(i).mr_interval_id
2143       AND   object_version_number = p_x_interval_tbl(i).object_version_number;
2144 
2145       -- If the record does not exist, then, abort API.
2146       IF ( SQL%ROWCOUNT = 0 ) THEN
2147         FND_MESSAGE.set_name('AHL','AHL_FMP_RECORD_CHANGED');
2148         FND_MESSAGE.set_token( 'RECORD', TO_CHAR( i ) );
2149         FND_MSG_PUB.add;
2150         RAISE FND_API.G_EXC_ERROR;
2151       END IF;
2152 
2153     END IF;
2154   END LOOP;
2155 
2156   IF G_DEBUG = 'Y' THEN
2157     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after DML operation' );
2158   END IF;
2159 
2160   -- Perform cross records validations and duplicate records check
2161   validate_records
2162   (
2163     p_x_threshold_rec.mr_effectivity_id, -- IN
2164     g_repetitive_flag, -- IN
2165     G_APPLN_USAGE, -- IN
2166     g_mr_type_code, -- IN
2167     l_return_status -- OUT
2168   );
2169 
2170   -- If any severe error occurs, then, abort API.
2171   IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2172     RAISE FND_API.G_EXC_ERROR;
2173   ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR  THEN
2174     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2175   END IF;
2176 
2177   IF G_DEBUG = 'Y' THEN
2178     AHL_DEBUG_PUB.debug( G_PKG_NAME || '.' || G_API_NAME || ' :  after validate_records' );
2179   END IF;
2180 
2181   -- Perform the Commit (if requested)
2182   IF FND_API.to_boolean( p_commit ) THEN
2183     COMMIT WORK;
2184   END IF;
2185 
2186   -- Add informational message if any truncation of interval values occured.
2187   -- Fix for bug#3482307
2188   IF (l_fractional_trunc_flag) THEN
2189     FND_MESSAGE.Set_Name('AHL','AHL_FMP_FRACTION_TRUNC');
2190     FND_MSG_PUB.ADD;
2191   END IF;
2192 
2193   -- Count and Get messages (optional)
2194   FND_MSG_PUB.count_and_get
2195   (
2196     p_encoded  => FND_API.G_FALSE,
2197     p_count    => x_msg_count,
2198     p_data     => x_msg_data
2199   );
2200 
2201   -- Disable debug (if enabled)
2202   IF ( G_DEBUG = 'Y' ) THEN
2203     AHL_DEBUG_PUB.disable_debug;
2204   END IF;
2205 
2206 EXCEPTION
2207 
2208   WHEN FND_API.G_EXC_ERROR THEN
2209     ROLLBACK TO process_interval_PVT;
2210     x_return_status := FND_API.G_RET_STS_ERROR ;
2211     FND_MSG_PUB.count_and_get
2212     (
2213       p_encoded  => FND_API.G_FALSE,
2214       p_count    => x_msg_count,
2215       p_data     => x_msg_data
2216     );
2217 
2218     -- Disable debug (if enabled)
2219     IF ( G_DEBUG = 'Y' ) THEN
2220       AHL_DEBUG_PUB.disable_debug;
2221     END IF;
2222 
2223   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2224     ROLLBACK TO process_interval_PVT;
2225     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2226     FND_MSG_PUB.count_and_get
2227     (
2228       p_encoded  => FND_API.G_FALSE,
2229       p_count    => x_msg_count,
2230       p_data     => x_msg_data
2231     );
2232 
2233     -- Disable debug (if enabled)
2234     IF ( G_DEBUG = 'Y' ) THEN
2235       AHL_DEBUG_PUB.disable_debug;
2236     END IF;
2237 
2238   WHEN OTHERS THEN
2239     ROLLBACK TO process_interval_PVT;
2240     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2241     IF FND_MSG_PUB.check_msg_level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR )
2242     THEN
2243       FND_MSG_PUB.add_exc_msg
2244       (
2245         p_pkg_name         => G_PKG_NAME,
2246         p_procedure_name   => G_API_NAME,
2247         p_error_text       => SUBSTRB(SQLERRM,1,240)
2248       );
2249     END IF;
2250     FND_MSG_PUB.count_and_get
2251     (
2252       p_encoded  => FND_API.G_FALSE,
2253       p_count    => x_msg_count,
2254       p_data     => x_msg_data
2255     );
2256 
2257     -- Disable debug (if enabled)
2258     IF ( G_DEBUG = 'Y' ) THEN
2259       AHL_DEBUG_PUB.disable_debug;
2260     END IF;
2261 
2262 END process_interval;
2263 
2264 END AHL_FMP_MR_INTERVAL_PVT;