DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSI_COUNTER_READINGS_PVT

Source


1 PACKAGE BODY CSI_COUNTER_READINGS_PVT as
2 /* $Header: csivcrdb.pls 120.60.12020000.3 2012/10/11 10:39:16 mvaradam ship $ */
3 --
4 G_PKG_NAME CONSTANT VARCHAR2(30):= 'CSI_COUNTER_READINGS_PVT';
5 G_FILE_NAME CONSTANT VARCHAR2(12) := 'csivcrdb.pls';
6 CMRO_CALL VARCHAR(2);
7 --
8 FUNCTION get_reading_before_reset(p_counter_id NUMBER,
9                                   p_value_timestamp DATE)
10 RETURN  NUMBER IS
11 
12   CURSOR c1 IS
13   SELECT counter_reading
14   FROM   csi_counter_readings
15   WHERE counter_id = p_counter_id
16   AND   value_timestamp < p_value_timestamp
17   AND   nvl(disabled_flag,'N') = 'N'
18   ORDER BY value_timestamp desc;
19   --
20   l_reading_before_reset NUMBER;
21 BEGIN
22    OPEN c1;
23    FETCH c1 INTO l_reading_before_reset;
24    CLOSE c1;
25    --
26    RETURN l_reading_before_reset;
27 END get_reading_before_reset;
28 --
29 FUNCTION get_previous_net_reading(p_counter_id NUMBER,
30                                   p_value_timestamp DATE)
31 RETURN  NUMBER IS
32 
33   CURSOR c1 IS
34   SELECT net_reading
35   FROM   csi_counter_readings
36   WHERE counter_id = p_counter_id
37   AND   value_timestamp < p_value_timestamp
38   AND   nvl(disabled_flag,'N') = 'N'
39   ORDER BY value_timestamp desc;
40   --
41   l_prev_net_reading NUMBER;
42 BEGIN
43    OPEN c1;
44    FETCH c1 INTO l_prev_net_reading;
45    CLOSE c1;
46    --
47    RETURN l_prev_net_reading;
48 END get_previous_net_reading;
49 --
50 FUNCTION get_latest_reading(p_counter_id NUMBER)
51 RETURN  NUMBER IS
52   l_counter_value_id NUMBER;
53 BEGIN
54   --Modified function for bug 7563117
55   BEGIN
56     SELECT ctr_val_max_seq_no
57     INTO l_counter_value_id
58     FROM csi_counters_b
59     WHERE counter_id = p_counter_id
60     AND EXISTS(SELECT 'Y' FROM csi_counter_readings WHERE counter_value_id=ctr_val_max_seq_no);
61   EXCEPTION
62     WHEN NO_DATA_FOUND THEN
63       l_counter_value_id := NULL;
64   END;
65 
66   RETURN l_counter_value_id;
67 END get_latest_reading;
68 --
69 FUNCTION Transaction_ID_Exists
70                (p_transaction_id IN NUMBER)
71 RETURN BOOLEAN IS
72    l_return_value  BOOLEAN := FALSE;
73    l_exists        VARCHAR2(1);
74 BEGIN
75    Begin
76       select 'x'
77       into l_exists
78       from CSI_TRANSACTIONS
79       where transaction_id = p_transaction_id;
80       l_return_value := TRUE;
81    Exception
82       when no_data_found then
83          l_return_value := FALSE;
84    End;
85    RETURN l_return_value;
86 END Transaction_ID_Exists;
87 --
88 FUNCTION Counter_Value_Exists
89                (p_ctr_value_id IN NUMBER)
90 RETURN BOOLEAN IS
91    l_return_value  BOOLEAN := FALSE;
92    l_exists        VARCHAR2(1);
93 BEGIN
94    Begin
95       select 'x'
96       into l_exists
97       from CSI_COUNTER_READINGS
98       where counter_value_id = p_ctr_value_id;
99       l_return_value := TRUE;
100    Exception
101       when no_data_found then
102          l_return_value := FALSE;
103    End;
104    RETURN l_return_value;
105 END Counter_Value_Exists;
106 --
107 FUNCTION Counter_Prop_Value_Exists
108                (p_ctr_prop_value_id IN NUMBER)
109 RETURN BOOLEAN IS
110    l_return_value  BOOLEAN := FALSE;
111    l_exists        VARCHAR2(1);
112 BEGIN
113    Begin
114       select 'x'
115       into l_exists
116       from CSI_CTR_PROPERTY_READINGS
117       where counter_prop_value_id = p_ctr_prop_value_id;
118       l_return_value := TRUE;
119    Exception
120       when no_data_found then
121          l_return_value := FALSE;
122    End;
123    RETURN l_return_value;
124 END Counter_Prop_Value_Exists;
125 --
126 FUNCTION Estimated_Rdg_ID_Exists
127                (p_estimated_rdg_id IN NUMBER)
128 RETURN BOOLEAN IS
129    l_return_value  BOOLEAN := FALSE;
130    l_exists        VARCHAR2(1);
131 BEGIN
132    Begin
133       select 'x'
134       into l_exists
135       from CSI_CTR_ESTIMATED_READINGS
136       where estimated_reading_id = p_estimated_rdg_id;
137       l_return_value := TRUE;
138    Exception
139       when no_data_found then
140          l_return_value := FALSE;
141    End;
142    RETURN l_return_value;
143 END Estimated_Rdg_ID_Exists;
144 --
145 FUNCTION Is_Formula_Counter
146               (p_counter_id IN NUMBER)
147 RETURN BOOLEAN IS
148    l_return_value  BOOLEAN := FALSE;
149    l_exists        VARCHAR2(1);
150    l_rel_type      VARCHAR2(30) := 'FORMULA';
151 BEGIN
152    Begin
153       select '1'
154       into l_exists
155       from dual
156       where exists (select 'x'
157                     from CSI_COUNTER_RELATIONSHIPS
158                     where object_counter_id = p_counter_id
159                     and   relationship_type_code = l_rel_type);
160       l_return_value := TRUE;
161    Exception
162       when no_data_found then
163          l_return_value := FALSE;
164    End;
165    RETURN l_return_value;
166 END Is_Formula_Counter;
167 --
168 FUNCTION Is_Target_Counter
169               (p_counter_id IN NUMBER)
170 RETURN BOOLEAN IS
171    l_return_value  BOOLEAN := FALSE;
172    l_exists        VARCHAR2(1);
173    l_rel_type      VARCHAR2(30) := 'CONFIGURATION';
174 BEGIN
175    Begin
176       select '1'
177       into l_exists
178       from dual
179       where exists (select 'x'
180                     from CSI_COUNTER_RELATIONSHIPS
181                     where object_counter_id = p_counter_id
182                     and   relationship_type_code = l_rel_type
183                     and   nvl(active_end_date,(sysdate+1)) > sysdate);
184       l_return_value := TRUE;
185    Exception
186       when no_data_found then
187          l_return_value := FALSE;
188    End;
189    RETURN l_return_value;
190 END Is_Target_Counter;
191 --
192 FUNCTION Valid_Adjustment_Type
193               (p_adjustment_type IN VARCHAR2)
194 RETURN BOOLEAN IS
195    l_return_value  BOOLEAN := FALSE;
196    l_exists        VARCHAR2(1);
197    l_adj_type      VARCHAR2(30) := 'CSI_CTR_ADJUST_READING_TYPE';
198 BEGIN
199    Begin
200       select 'x'
201       into l_exists
202       from CSI_LOOKUPS
203       where lookup_type = l_adj_type
204       and   lookup_code = p_adjustment_type;
205       l_return_value := TRUE;
206    Exception
207       when no_data_found then
208          l_return_value := FALSE;
209    End;
210    RETURN l_return_value;
211 END Valid_Adjustment_Type;
212 --
213 FUNCTION Valid_Reset_Mode
214               (p_reset_mode IN VARCHAR2)
215 RETURN BOOLEAN IS
216    l_return_value  BOOLEAN := FALSE;
217    l_exists        VARCHAR2(1);
218    l_adj_type      VARCHAR2(30) := 'CSI_CTR_READING_RESET_TYPE';
219 BEGIN
220    Begin
221       select 'x'
222       into l_exists
223       from CSI_LOOKUPS
224       where lookup_type = l_adj_type
225       and   lookup_code = p_reset_mode;
226       l_return_value := TRUE;
227    Exception
228       when no_data_found then
229          l_return_value := FALSE;
230    End;
231    RETURN l_return_value;
232 END Valid_Reset_Mode;
233 --
234 FUNCTION Valid_Ctr_Property_ID
235               (p_ctr_value_id IN NUMBER
236               ,p_ctr_prop_id  IN NUMBER)
237 RETURN BOOLEAN IS
238    l_return_value  BOOLEAN := FALSE;
239    l_exists        VARCHAR2(1);
240 BEGIN
241    Begin
242       select 'x'
243       into l_exists
244       from CSI_COUNTER_READINGS ccr,
245            CSI_COUNTER_PROPERTIES_B ccp
246       where ccr.counter_value_id = p_ctr_value_id
247       and   ccp.counter_id = ccr.counter_id
248       and   ccp.counter_property_id = p_ctr_prop_id
249       and   nvl(ccp.end_date_active,(sysdate+1)) > sysdate;
250       --
251       l_return_value := TRUE;
252    Exception
253       when no_data_found then
254          l_return_value := FALSE;
255    End;
256    RETURN l_return_value;
257 END Valid_Ctr_Property_ID;
258 --
259 FUNCTION HAS_PROPERTY_VALUE(
260     p_counter_property_id in number,
261     p_counter_value_id in number
262   ) RETURN VARCHAR2
263   IS
264      l_s_temp varchar2(1);
265 BEGIN
266     select 'x'
267     into l_s_temp
268     from CSI_CTR_PROPERTY_READINGS
269     where counter_property_id = p_counter_property_id
270     and counter_value_id = p_counter_value_id;
271     return 'T';
272 EXCEPTION
273    when no_data_found then
274       return 'F';
275 END HAS_PROPERTY_VALUE;
276 --
277 PROCEDURE Calculate_Net_Reading
278    (
279      p_prev_net_rdg    IN         NUMBER
280     ,p_prev_ltd_rdg    IN         NUMBER
281     ,p_curr_rdg        IN         NUMBER
282     ,p_prev_rdg        IN         NUMBER
283     ,p_curr_adj        IN         NUMBER
284     ,p_rdg_type        IN         NUMBER
285     ,p_direction       IN         VARCHAR2
286     ,l_ctr_rdg_rec     IN         csi_ctr_datastructures_pub.counter_readings_rec
287     ,px_net_rdg        OUT NOCOPY NUMBER
288     ,px_ltd_rdg        OUT NOCOPY NUMBER
289    ) IS
290    l_curr_adj          NUMBER;
291    l_debug_level       NUMBER;    -- 8214848 - dsingire
292 BEGIN
293    -- For Bi-directional counters, Net and LTD will be same as Counter Reading
294    -- Read the debug profiles values in to global variable 7197402
295     IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
296 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
297 	  END IF;                      -- 8214848 - dsingire
298 
299     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
300     IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
301       csi_ctr_gen_utility_pvt.put_line('Calculate Net Reading Procedure');
302       csi_ctr_gen_utility_pvt.put_line('6398254: p_prev_net_rdg' || p_prev_net_rdg);
303       csi_ctr_gen_utility_pvt.put_line('6398254: p_prev_ltd_rdg' || p_prev_ltd_rdg);
304       csi_ctr_gen_utility_pvt.put_line('6398254: p_curr_rdg' || p_curr_rdg);
305       csi_ctr_gen_utility_pvt.put_line('6398254: p_prev_rdg' || p_prev_rdg);
306       csi_ctr_gen_utility_pvt.put_line(' p_curr_adj' || p_curr_adj);
307       csi_ctr_gen_utility_pvt.put_line('6398254: p_rdg_type' || p_rdg_type);
308       csi_ctr_gen_utility_pvt.put_line('p_direction' || p_direction);
309       csi_ctr_gen_utility_pvt.put_line('6398254: l_ctr_rdg_rec.reset_mode' || l_ctr_rdg_rec.reset_mode);   -- added 6398254
310       csi_ctr_gen_utility_pvt.put_line('6398254: l_ctr_rdg_rec.reset_reason' || l_ctr_rdg_rec.reset_reason);   -- added 6398254
311     END IF;                -- 8214848 - dsingire
312    /* Only return if a Bi-directional counter AND a reset flow */
313 
314         --
315 
316   /* Treat Adjustments of Fluctuating counters like Ascending counters */
317    IF p_curr_adj IS NULL OR p_curr_adj = FND_API.G_MISS_NUM THEN
318       l_curr_adj := 0;
319    ELSE
320       l_curr_adj := p_curr_adj;
321    END IF;
322    -- Adjustment will get added if Descending. To retain the same formula we just mutiply with -1
323    IF NVL(p_direction,'X') = 'D' THEN
324       l_curr_adj := l_curr_adj * -1;
325    END IF;
326    --
327    IF p_rdg_type = 1 THEN -- Absolute
328       -- Net Reading = Prev Net + (Curr Rdg - Prev Rdg) - Curr Adj
329       -- LTD Reading = Prev LTD + (Curr Rdg - Prev Rdg)
330       px_net_rdg := nvl(p_prev_net_rdg,0) +
331                     (nvl(p_curr_rdg,0) - nvl(p_prev_rdg,0)) - l_curr_adj;
332       px_ltd_rdg := nvl(p_prev_ltd_rdg,0) + (nvl(p_curr_rdg,0) - nvl(p_prev_rdg,0));
333    ELSIF p_rdg_type = 2 THEN -- Change
334       -- Net Reading = Prev Net + Curr Rdg - Curr Adj -- For Ascending
335       -- Net Reading = Prev Net - Curr Rdg - Curr Adj -- For Descending
336       IF NVL(p_direction,'X') = 'A' or NVL(p_direction,'X') = 'B' THEN
337          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
338           csi_ctr_gen_utility_pvt.put_line('Inside the IF block');
339          END IF;         -- 8214848 - dsingire
340          px_net_rdg := nvl(p_prev_net_rdg,0) + nvl(p_curr_rdg,0) - l_curr_adj;
341          px_ltd_rdg := nvl(p_prev_ltd_rdg,0) + nvl(p_curr_rdg,0);
342       ELSIF NVL(p_direction,'X') = 'D' THEN
343          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
344             csi_ctr_gen_utility_pvt.put_line('Calculate Net Reading for Desc');
345             csi_ctr_gen_utility_pvt.put_line('Prev Reading = '||to_char(p_prev_rdg));
346             csi_ctr_gen_utility_pvt.put_line('Prev Net Reading = '||to_char(nvl(p_prev_net_rdg,0)));
347             csi_ctr_gen_utility_pvt.put_line('Prev LTD Reading = '||to_char(nvl(p_prev_ltd_rdg,0)));
348             csi_ctr_gen_utility_pvt.put_line('Current Reading = '||to_char(nvl(p_curr_rdg,0)));
349          END IF;                     -- 8214848 - dsingire
350          IF nvl(p_prev_net_rdg,0) = 0 THEN
351             /* Check if there is a previous reading */
352             IF p_prev_rdg IS NOT  NULL THEN
353                px_net_rdg := nvl(p_prev_net_rdg,0) - nvl(p_curr_rdg,0);
354             ELSE
355                px_net_rdg := nvl(p_curr_rdg,0) - l_curr_adj;
356             END IF;
357          ELSE
358             px_net_rdg := nvl(p_prev_net_rdg,0) - nvl(p_curr_rdg,0) - l_curr_adj;
359          END IF;
360 
361          IF nvl(p_prev_ltd_rdg,0) = 0 THEN
362             IF p_prev_rdg IS NOT NULL THEN
363                px_ltd_rdg := nvl(p_prev_ltd_rdg,0) - nvl(p_curr_rdg,0);
364             ELSE
365                px_ltd_rdg := nvl(p_curr_rdg,0);
366             END IF;
367          ELSE
368             px_ltd_rdg := nvl(p_prev_ltd_rdg,0) - nvl(p_curr_rdg,0);
369          END IF;
370          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
371             csi_ctr_gen_utility_pvt.put_line('New Net Reading = '||to_char(px_net_rdg));
372             csi_ctr_gen_utility_pvt.put_line('New LTD Reading = '||to_char(px_ltd_rdg));
373          END IF;       -- 8214848 - dsingire
374       END IF;
375    END IF;
376     IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
377     /* added 6398254 */
378       csi_ctr_gen_utility_pvt.put_line('6398254: New Net Reading = '||to_char(px_net_rdg));
379       csi_ctr_gen_utility_pvt.put_line('6398254: New LTD Reading = '||to_char(px_ltd_rdg));
380       /* end addition */
381     END IF;     -- 8214848 - dsingire
382     IF NVL(p_direction,'X') = 'B' AND p_rdg_type = 2 THEN
383     IF p_curr_adj IS NULL OR p_curr_adj = FND_API.G_MISS_NUM THEN
384     IF l_ctr_rdg_rec.reset_mode = 'SOFT' THEN
385     -- AND NVL(l_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR THEN
386         -- csi_ctr_gen_utility_pvt.put_line('6398254: Inside Bidir Reset Block p_curr_rdg' || p_curr_rdg);
387 
388         px_net_rdg := nvl(p_curr_rdg,0);
389         px_ltd_rdg := nvl(p_prev_ltd_rdg,0);
390         -- Return;
391         END IF;
392     END IF;
393    END IF;
394 
395 END Calculate_Net_Reading;
396 --
397 PROCEDURE Reset_Target_Counters
398    (
399      p_txn_rec               IN     csi_datastructures_pub.transaction_rec
400     ,p_ctr_rdg_rec           IN     csi_ctr_datastructures_pub.counter_readings_rec
401     ,x_return_status         OUT    NOCOPY VARCHAR2
402     ,x_msg_count             OUT    NOCOPY NUMBER
403     ,x_msg_data              OUT    NOCOPY VARCHAR2
404  )
405 IS
406    l_rel_type                      VARCHAR2(30) := 'CONFIGURATION';
407    l_counter_reading               NUMBER;
408    l_ctr_rdg_rec                   csi_ctr_datastructures_pub.counter_readings_rec;
409    l_temp_ctr_rdg_rec              csi_ctr_datastructures_pub.counter_readings_rec;
410    l_process_flag                  BOOLEAN;
411    l_mode                          VARCHAR2(30);
412 
413     -- Bug 8214848
414     l_ctr_val_max                 NUMBER := -1;
415     l_prev_ctr_max_reading        NUMBER;
416     l_prev_net_max_reading        NUMBER;
417     l_prev_ltd_max_reading        NUMBER;
418     l_prev_value_max_timestamp    DATE;
419 
420 
421    --
422    CURSOR OBJECT_CTR_CUR IS
423    select ccr.object_counter_id,nvl(ccr.factor,1) factor,
424           ccv.direction,ccv.reading_type, ccv.uom_code object_uom_code
425    from CSI_COUNTER_RELATIONSHIPS ccr,
426         CSI_COUNTERS_B ccv
427    where ccr.source_counter_id = p_ctr_rdg_rec.counter_id
428    and   ccr.relationship_type_code =l_rel_type
429    and   nvl(ccr.active_start_date,sysdate) <= p_ctr_rdg_rec.value_timestamp
430    and   nvl(ccr.active_end_date,(sysdate+1)) > p_ctr_rdg_rec.value_timestamp
431    and   ccv.counter_id = ccr.object_counter_id;
432    -- and   ccv.reading_type <> 2;  -- Exclude Change counters as resets are not allowed
433    --
434    CURSOR PREV_READING_CUR(p_counter_id IN NUMBER,p_value_timestamp IN DATE) IS
435    select counter_reading,net_reading,life_to_date_reading
436    from CSI_COUNTER_READINGS
437    where counter_id = p_counter_id
438    and   nvl(disabled_flag,'N') = 'N'
439    and   value_timestamp < p_value_timestamp
440    ORDER BY value_timestamp desc;
441    --,counter_value_id desc;
442    --
443    CURSOR GET_UOM_CLASS(p_uom_code VARCHAR2) IS
444    SELECT uom_class
445    FROM   mtl_units_of_measure
446    WHERE  uom_code =  p_uom_code;
447 
448    l_previous_ctr_rdg NUMBER;
449    l_previous_net_rdg NUMBER;
450    l_previous_ltd_rdg NUMBER;
451 
452    l_source_uom_class VARCHAR2(10);
453    l_object_uom_class VARCHAR2(10);
454    l_source_uom_code  VARCHAR2(3);
455    l_source_direction VARCHAR2(1);
456    l_uom_rate         NUMBER;
457    l_src_reading_type VARCHAR2(1);
458    l_debug_level       NUMBER;    -- 8214848 - dsingire
459    l_user_id 				  NUMBER := fnd_global.user_id;        -- 8214848 - dsingire
460    l_conc_login_id		NUMBER := fnd_global.conc_login_id;  -- 8214848 - dsingire
461       -- Added for bug#14561696
462    l_ctr_name                      VARCHAR2(50);
463    l_ctr_type                      VARCHAR2(30);
464    l_rollover_last_rdg             NUMBER;
465    l_rollover_first_rdg            NUMBER;
466    l_direction                     VARCHAR2(1);
467    l_reading_type                  NUMBER;
468    l_auto_rollover                 VARCHAR2(1);
469        -- Added for bug#14561696
470 BEGIN
471    SAVEPOINT  reset_target_counters;
472    --  Initialize API return status to success
473    x_return_status := FND_API.G_RET_STS_SUCCESS;
474    --
475 
476    -- Read the debug profiles values in to global variable 7197402
477     IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
478 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
479 	  END IF;                      -- 8214848 - dsingire
480 
481    l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
482 
483    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
484     csi_ctr_gen_utility_pvt.put_line('6398254: Inside Reset_Target_Counters...');
485     csi_ctr_gen_utility_pvt.dump_counter_readings_rec(p_ctr_rdg_rec);
486    END IF;      -- 8214848 - dsingire
487    IF p_txn_rec.transaction_type_id in (88,91,92,94,95) THEN
488       l_mode := 'Meter';
489    ELSE
490       l_mode := 'Counter';
491    END IF;
492    --
493    FOR obj_cur IN OBJECT_CTR_CUR LOOP
494       -- Check previous reading exists
495       l_previous_ctr_rdg := NULL;
496       --
497 
498 	 -- Added for bug#14561696
499 	 Begin
500          select name,counter_type,rollover_last_reading,
501                 rollover_first_reading,direction,reading_type,
502                 automatic_rollover
503          into l_ctr_name,l_ctr_type,l_rollover_last_rdg,l_rollover_first_rdg,
504               l_direction,l_reading_type,l_auto_rollover
505          from CSI_COUNTERS_VL -- Need to be changed
506          where counter_id = p_ctr_rdg_rec.counter_id
507          and   nvl(end_date_active,(sysdate+1)) > sysdate;
508       Exception
509          when no_data_found then
510 	    csi_ctr_gen_utility_pvt.ExitWithErrMsg
511 		 ( p_msg_name     => 'CSI_API_CTR_INVALID',
512 		   p_token1_name  => 'MODE',
513 		   p_token1_val   => l_mode
514 		 );
515       End;
516 	 -- Added for bug#14561696
517 
518       -- Get the last reading for this counter
519   -- Bug 	8214848
520    BEGIN
521     SELECT CTR_VAL_MAX_SEQ_NO INTO l_ctr_val_max
522       FROM CSI_COUNTERS_B WHERE COUNTER_ID = obj_cur.object_counter_id;
523 
524    SELECT COUNTER_READING,NET_READING,LIFE_TO_DATE_READING
525          INTO l_prev_ctr_max_reading,
526               l_prev_net_max_reading,
527               l_prev_ltd_max_reading
528               --,l_prev_value_max_timestamp
529               --l_prev_max_comments
530    FROM CSI_COUNTER_READINGS WHERE COUNTER_VALUE_ID = NVL(l_ctr_val_max,-1);
531 
532    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
533     csi_ctr_gen_utility_pvt.put_line('l_ctr_val_max - ' || l_ctr_val_max );
534    END IF;      -- 8214848 - dsingire
535 
536   EXCEPTION
537    WHEN OTHERS THEN
538     -- Assign max counter value id to 0 and use the PREV_READING_CUR cursor
539     l_ctr_val_max := -1;
540   END;  --
541 
542    IF (l_prev_value_max_timestamp <=  p_ctr_rdg_rec.value_timestamp
543             AND NVL(l_ctr_val_max,-1) > 0) THEN
544 
545       -- The requested timestamp is greater than the timestamp of the
546       -- CTR_VAL_MAX_SEQ_NO
547       l_previous_ctr_rdg := l_prev_ctr_max_reading;
548       l_previous_net_rdg := l_prev_net_max_reading;
549       l_previous_ltd_rdg := l_prev_ltd_max_reading;
550       --l_prev_value_timestamp := l_prev_value_max_timestamp;
551       --l_prev_comments := l_prev_max_comments;
552 
553       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
554         csi_ctr_gen_utility_pvt.put_line('Max Value counter id used');
555       END IF;      -- 8214848 - dsingire
556    ELSE
557       OPEN PREV_READING_CUR(obj_cur.object_counter_id,p_ctr_rdg_rec.value_timestamp);
558       FETCH PREV_READING_CUR
559       INTO l_previous_ctr_rdg,
560            l_previous_net_rdg,
561            l_previous_ltd_rdg;
562       CLOSE PREV_READING_CUR;
563    END IF;
564       --
565       IF l_previous_ctr_rdg = NULL THEN
566          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
567           csi_ctr_gen_utility_pvt.put_line('Target Counter ID '||to_char(obj_cur.object_counter_id)||
568                                         ' does not have any prior readings. First reading cannot be reset');
569          END IF;       -- 8214848 - dsingire
570 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
571 	    ( p_msg_name    =>  'CSI_API_CTR_INVALID_FIRST_RDG',
572 	      p_token1_name =>  'MODE',
573 	      p_token1_val  =>  l_mode
574 	    );
575       END IF;
576       --
577 	 IF l_direction = 'A' THEN -- Added for bug#14561696
578       IF p_ctr_rdg_rec.counter_reading > l_previous_ctr_rdg THEN
579    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
580 	  csi_ctr_gen_utility_pvt.put_line('Reset counter reading has to be less than the previous reading');
581    END IF;       -- 8214848 - dsingire
582 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
583 	    ( p_msg_name    =>  'CSI_API_CTR_LESS_RESET_RDG',
584 	      p_token1_name =>  'PREV_RDG',
585 	      p_token1_val  =>  to_char(l_previous_ctr_rdg),
586 	      p_token2_name =>  'MODE',
587 	      p_token2_val  =>  l_mode
588 	    );
589       END IF;
590 	 END IF;-- Added for bug#14561696
591       --
592       l_ctr_rdg_rec := l_temp_ctr_rdg_rec;
593       --
594 
595       l_ctr_rdg_rec.counter_id := obj_cur.object_counter_id;
596       l_ctr_rdg_rec.source_counter_value_id := p_ctr_rdg_rec.counter_value_id;
597       l_ctr_rdg_rec.value_timestamp := p_ctr_rdg_rec.value_timestamp;
598       l_ctr_rdg_rec.counter_reading := p_ctr_rdg_rec.counter_reading;
599       l_ctr_rdg_rec.net_reading := l_previous_net_rdg;
600       l_ctr_rdg_rec.life_to_date_reading := l_previous_ltd_rdg;
601       l_ctr_rdg_rec.reset_mode := p_ctr_rdg_rec.reset_mode;
602       l_ctr_rdg_rec.reset_reason := p_ctr_rdg_rec.reset_reason;
603       l_ctr_rdg_rec.source_code := p_ctr_rdg_rec.source_code;
604       l_ctr_rdg_rec.source_line_id := p_ctr_rdg_rec.source_line_id;
605       l_ctr_rdg_rec.comments := p_ctr_rdg_rec.comments;
606 
607       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
608       csi_ctr_gen_utility_pvt.put_line('6398254: reset reason' || l_ctr_rdg_rec.reset_reason);
609       csi_ctr_gen_utility_pvt.put_line('6398254: net reading' || l_ctr_rdg_rec.net_reading);
610       end IF;            -- 8214848 - dsingire
611       --
612       -- Generate the Value_id for insert
613       l_process_flag := TRUE;
614       WHILE l_process_flag LOOP
615 	 select CSI_COUNTER_READINGS_S.nextval
616 	 into l_ctr_rdg_rec.counter_value_id from dual;
617 	 IF NOT Counter_Value_Exists(l_ctr_rdg_rec.counter_value_id) THEN
618 	    l_process_flag := FALSE;
619 	 END IF;
620 
621       END LOOP;
622 
623       /* Check reset factor */
624       BEGIN
625          SELECT uom_code, direction, reading_type
626          INTO   l_source_uom_code, l_source_direction, l_src_reading_type
627          FROM   csi_counters_b
628          WHERE  counter_id = p_ctr_rdg_rec.counter_id;
629       EXCEPTION
630          WHEN OTHERS THEN
631             NULL;
632       END;
633 
634       IF obj_cur.object_uom_code <> l_source_uom_code THEN
635           /* Validate if same UOM class */
636           OPEN get_uom_class(obj_cur.object_uom_code);
637           FETCH get_uom_class into l_object_uom_class;
638 
639           IF get_uom_class%notfound THEN
640              csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_ALL_INVALID_UOM_CODE');
641           END IF;
642 
643           IF get_uom_class%ISOPEN THEN
644              CLOSE get_uom_class;
645           END IF;
646 
647           OPEN get_uom_class(l_source_uom_code);
648           FETCH get_uom_class into l_source_uom_class;
649 
650           IF get_uom_class%notfound THEN
651              csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_ALL_INVALID_UOM_CODE');
652           END IF;
653 
654           IF get_uom_class%ISOPEN THEN
655              CLOSE get_uom_class;
656           END IF;
657 
658           IF l_source_uom_class = l_object_uom_class THEN
659              /* Do a conversion */
660              INV_CONVERT.INV_UM_CONVERSION(l_source_uom_code
661                               ,obj_cur.object_uom_code
662                               ,null
663                               ,l_uom_rate);
664              IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
665               csi_ctr_gen_utility_pvt.put_line('Object UOM Code = '||obj_cur.object_uom_code);
666               csi_ctr_gen_utility_pvt.put_line('Source UOM Code = '||l_source_uom_code);
667               csi_ctr_gen_utility_pvt.put_line('UOM Rate = '||to_char(l_uom_rate));
668              END IF;                 -- 8214848 - dsingire
669              IF l_uom_rate = -99999 then
670                  csi_ctr_gen_utility_pvt.put_line(' Error during the conversion of UOM');
671              END IF;
672           ELSE
673              l_uom_rate := 1;
674           END IF;
675        ELSE
676           l_uom_rate := 1;
677        END IF;
678 
679        IF obj_cur.reading_type = 1 THEN
680           IF l_source_direction = 'A' AND obj_cur.direction = 'D' THEN
681                 l_counter_reading := ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor) * -1;
682           END IF;
683 
684           IF l_source_direction = 'D' and obj_cur.direction = 'A' THEN
685                 l_counter_reading := (p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor;
686           END IF;
687 
688 	  IF obj_cur.direction = 'A'  and l_source_direction = 'A' THEN
689 	      l_counter_reading := (p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor;
690 	  ELSIF obj_cur.direction = 'D' and l_source_direction = 'D' THEN
691 	      l_counter_reading := (p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor;
692               l_counter_reading := l_counter_reading * -1;
693           ELSIF obj_cur.direction = 'B'  and l_source_direction = 'B' THEN
694               l_counter_reading := (p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor;
695 	  END IF;
696        ELSE
697           l_counter_reading := (p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor;
698       END IF;
699 
700       l_ctr_rdg_rec.counter_reading := l_counter_reading;
701 
702       --
703       -- Call the Table Handler to insert into CSI_COUNTER_READINGS
704       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
705         csi_ctr_gen_utility_pvt.put_line('Resetting target Counter '||to_char(l_ctr_rdg_rec.counter_id));
706       END IF;       -- 8214848 - dsingire
707       --
708       CSI_COUNTER_READINGS_PKG.Insert_Row(
709 	  px_COUNTER_VALUE_ID         =>  l_ctr_rdg_rec.counter_value_id
710 	 ,p_COUNTER_ID                =>  l_ctr_rdg_rec.counter_id
711 	 ,p_VALUE_TIMESTAMP           =>  l_ctr_rdg_rec.value_timestamp
712 	 ,p_COUNTER_READING           =>  l_ctr_rdg_rec.counter_reading
713 	 ,p_RESET_MODE                =>  l_ctr_rdg_rec.reset_mode
714 	 ,p_RESET_REASON              =>  l_ctr_rdg_rec.reset_reason
715 	 ,p_ADJUSTMENT_TYPE           =>  NULL
716 	 ,p_ADJUSTMENT_READING        =>  NULL
717 	 ,p_OBJECT_VERSION_NUMBER     =>  1
718 	 ,p_LAST_UPDATE_DATE          =>  SYSDATE
719 	 ,p_LAST_UPDATED_BY           =>  l_user_id
720 	 ,p_CREATION_DATE             =>  SYSDATE
721 	 ,p_CREATED_BY                =>  l_user_id
722 	 ,p_LAST_UPDATE_LOGIN         =>  l_conc_login_id
723 	 ,p_ATTRIBUTE1                =>  l_ctr_rdg_rec.attribute1
724 	 ,p_ATTRIBUTE2                =>  l_ctr_rdg_rec.attribute2
725 	 ,p_ATTRIBUTE3                =>  l_ctr_rdg_rec.attribute3
726 	 ,p_ATTRIBUTE4                =>  l_ctr_rdg_rec.attribute4
727 	 ,p_ATTRIBUTE5                =>  l_ctr_rdg_rec.attribute5
728 	 ,p_ATTRIBUTE6                =>  l_ctr_rdg_rec.attribute6
729 	 ,p_ATTRIBUTE7                =>  l_ctr_rdg_rec.attribute7
730 	 ,p_ATTRIBUTE8                =>  l_ctr_rdg_rec.attribute8
731 	 ,p_ATTRIBUTE9                =>  l_ctr_rdg_rec.attribute9
732 	 ,p_ATTRIBUTE10               =>  l_ctr_rdg_rec.attribute10
733 	 ,p_ATTRIBUTE11               =>  l_ctr_rdg_rec.attribute11
734 	 ,p_ATTRIBUTE12               =>  l_ctr_rdg_rec.attribute12
735 	 ,p_ATTRIBUTE13               =>  l_ctr_rdg_rec.attribute13
736 	 ,p_ATTRIBUTE14               =>  l_ctr_rdg_rec.attribute14
737 	 ,p_ATTRIBUTE15               =>  l_ctr_rdg_rec.attribute15
738 	 ,p_ATTRIBUTE16               =>  l_ctr_rdg_rec.attribute16
739 	 ,p_ATTRIBUTE17               =>  l_ctr_rdg_rec.attribute17
740 	 ,p_ATTRIBUTE18               =>  l_ctr_rdg_rec.attribute18
741 	 ,p_ATTRIBUTE19               =>  l_ctr_rdg_rec.attribute19
742 	 ,p_ATTRIBUTE20               =>  l_ctr_rdg_rec.attribute20
743 	 ,p_ATTRIBUTE21               =>  l_ctr_rdg_rec.attribute21
744 	 ,p_ATTRIBUTE22               =>  l_ctr_rdg_rec.attribute22
745 	 ,p_ATTRIBUTE23               =>  l_ctr_rdg_rec.attribute23
746 	 ,p_ATTRIBUTE24               =>  l_ctr_rdg_rec.attribute24
747 	 ,p_ATTRIBUTE25               =>  l_ctr_rdg_rec.attribute25
748 	 ,p_ATTRIBUTE26               =>  l_ctr_rdg_rec.attribute26
749 	 ,p_ATTRIBUTE27               =>  l_ctr_rdg_rec.attribute27
750 	 ,p_ATTRIBUTE28               =>  l_ctr_rdg_rec.attribute28
751 	 ,p_ATTRIBUTE29               =>  l_ctr_rdg_rec.attribute29
752 	 ,p_ATTRIBUTE30               =>  l_ctr_rdg_rec.attribute30
753 	 ,p_ATTRIBUTE_CATEGORY        =>  l_ctr_rdg_rec.attribute_category
754 	 ,p_MIGRATED_FLAG             =>  'N'
755 	 ,p_COMMENTS                  =>  l_ctr_rdg_rec.comments
756 	 ,p_LIFE_TO_DATE_READING      =>  l_ctr_rdg_rec.life_to_date_reading
757 	 ,p_TRANSACTION_ID            =>  p_txn_rec.transaction_id
758 	 ,p_AUTOMATIC_ROLLOVER_FLAG   =>  l_ctr_rdg_rec.automatic_rollover_flag
759 	 ,p_INCLUDE_TARGET_RESETS     =>  l_ctr_rdg_rec.include_target_resets
760 	 ,p_SOURCE_COUNTER_VALUE_ID   =>  l_ctr_rdg_rec.source_counter_value_id
761 	 ,p_NET_READING               =>  l_ctr_rdg_rec.net_reading
762 	 ,p_DISABLED_FLAG             =>  'N'
763 	 ,p_SOURCE_CODE               =>  l_ctr_rdg_rec.source_code
764 	 ,p_SOURCE_LINE_ID            =>  l_ctr_rdg_rec.source_line_id
765 	 ,p_INITIAL_READING_FLAG      =>  l_ctr_rdg_rec.initial_reading_flag
766        );
767 
768        --Add call to CSI_COUNTER_PVT.update_ctr_val_max_seq_no
769        --for bug 7374316
770        CSI_COUNTER_PVT.update_ctr_val_max_seq_no(
771            p_api_version           =>  1.0
772 	  ,p_commit                =>  fnd_api.g_false
773 	  ,p_init_msg_list         =>  fnd_api.g_true
774 	  ,p_validation_level      =>  fnd_api.g_valid_level_full
775           ,p_counter_id            =>  l_ctr_rdg_rec.counter_id
776           ,px_ctr_val_max_seq_no   =>  l_ctr_rdg_rec.counter_value_id
777           ,x_return_status         =>  x_return_status
778 	  ,x_msg_count             =>  x_msg_count
779 	  ,x_msg_data              =>  x_msg_data
780         );
781    END LOOP; -- Obj Cursor
782    --
783 EXCEPTION
784    WHEN FND_API.G_EXC_ERROR THEN
785       x_return_status := FND_API.G_RET_STS_ERROR ;
786       ROLLBACK TO reset_target_counters;
787       FND_MSG_PUB.Count_And_Get
788          ( p_count => x_msg_count,
789            p_data  => x_msg_data
790          );
791    WHEN OTHERS THEN
792       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
793       ROLLBACK TO reset_target_counters;
794 END Reset_Target_Counters;
795 --
796 PROCEDURE Disable_Target_Derive_Rdg
797   ( p_src_counter_value_id   IN  NUMBER,
798     x_return_status          OUT NOCOPY VARCHAR2
799   )
800 IS
801  l_ctr_val_max_seq_no   NUMBER;
802  l_msg_data             VARCHAR2(2000);
803  l_msg_index            NUMBER;
804  l_msg_count            NUMBER;
805  x_msg_data             VARCHAR2(2000);
806  x_msg_count            NUMBER;
807  l_user_id 				      NUMBER := fnd_global.user_id;        -- 8214848 - dsingire
808 
809  CURSOR derived_readings_cur IS
810  SELECT counter_value_id, counter_id
811  FROM   csi_counter_readings
812  WHERE  source_counter_value_id = p_src_counter_value_id
813  AND    nvl(disabled_flag,'N') <> 'Y';
814 BEGIN
815    x_return_status := FND_API.G_RET_STS_SUCCESS;
816    FOR derived_reading IN derived_readings_cur LOOP
817       UPDATE CSI_COUNTER_READINGS
818       SET    disabled_flag = 'Y',
819              last_updated_by = l_user_id,
820              last_update_date = SYSDATE,
821              object_version_number = object_version_number + 1
822       WHERE  counter_value_id = derived_reading.counter_value_id;
823 
824       l_ctr_val_max_seq_no := NULL;
825 
826       CSI_COUNTER_PVT.update_ctr_val_max_seq_no(
827           p_api_version           =>  1.0
828          ,p_commit                =>  fnd_api.g_false
829          ,p_init_msg_list         =>  fnd_api.g_true
830          ,p_validation_level      =>  fnd_api.g_valid_level_full
831          ,p_counter_id            =>  derived_reading.counter_id
832          ,px_ctr_val_max_seq_no   =>  l_ctr_val_max_seq_no
833          ,x_return_status         =>  x_return_status
834          ,x_msg_count             =>  x_msg_count
835          ,x_msg_data              =>  x_msg_data
836          );
837 
838        IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
839           l_msg_index := 1;
840 	  l_msg_count := x_msg_count;
841 	  WHILE l_msg_count > 0 LOOP
842             x_msg_data := FND_MSG_PUB.GET
843               (l_msg_index,
844                FND_API.G_FALSE
845 	      );
846 	      csi_ctr_gen_utility_pvt.put_line('ERROR FROM CSI_COUNTER_PVT.update_ctr_val_max_seq_no');
847   	    csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
848 	    l_msg_index := l_msg_index + 1;
849 	    l_msg_count := l_msg_count - 1;
850 	  END LOOP;
851 	  RAISE FND_API.G_EXC_ERROR;
852        END IF;
853    END LOOP;
854 EXCEPTION
855    WHEN OTHERS THEN
856       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
857 END Disable_Target_Derive_Rdg;
858 --
859 PROCEDURE Calculate_Rollover_Reading
860   ( p_prev_net_rdg      IN   NUMBER
861    ,p_prev_ltd_rdg      IN   NUMBER
862    ,p_curr_rdg          IN   NUMBER
863    ,p_prev_rdg          IN   NUMBER
864    ,p_rollover_fm       IN   NUMBER
865    ,p_rollover_to       IN   NUMBER
866    ,px_net_rdg          OUT  NOCOPY NUMBER
867    ,px_ltd_rdg          OUT  NOCOPY NUMBER
868   )
869 IS
870 BEGIN
871    px_net_rdg := nvl(p_prev_net_rdg,0) +
872                     (nvl(p_curr_rdg,0) - nvl(p_prev_rdg,0)) + p_rollover_fm - p_rollover_to;
873    px_ltd_rdg := nvl(p_prev_ltd_rdg,0) +
874                     (nvl(p_curr_rdg,0) - nvl(p_prev_rdg,0)) + p_rollover_fm - p_rollover_to;
875 END Calculate_Rollover_Reading;
876 --
877 PROCEDURE Create_Reading_Transaction
878    ( p_api_version           IN     NUMBER
879     ,p_commit                IN     VARCHAR2
880     ,p_init_msg_list         IN     VARCHAR2
881     ,p_validation_level      IN     NUMBER
882     ,p_txn_rec               IN OUT NOCOPY csi_datastructures_pub.transaction_rec
883     ,x_return_status         OUT    NOCOPY VARCHAR2
884     ,x_msg_count             OUT    NOCOPY NUMBER
885     ,x_msg_data              OUT    NOCOPY VARCHAR2
886    ) IS
887    --
888    l_process_flag             BOOLEAN := TRUE;
889    l_dummy                    VARCHAR2(1);
890    l_api_name                 VARCHAR2(30) := 'CREATE_READING_TRANSACTION';
891    l_debug_level       NUMBER;    -- 8214848 - dsingire
892    l_user_id 				  NUMBER := fnd_global.user_id;        -- 8214848 - dsingire
893    l_conc_login_id		NUMBER := fnd_global.conc_login_id;  -- 8214848 - dsingire
894 BEGIN
895    SAVEPOINT create_reading_transaction;
896    --
897    -- Read the debug profiles values in to global variable 7197402
898    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
899 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
900 	  END IF;                      -- 8214848 - dsingire
901 
902     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
903 
904    -- Initialize message list if p_init_msg_list is set to TRUE.
905    IF FND_API.to_Boolean(nvl(p_init_msg_list,FND_API.G_FALSE)) THEN
906       FND_MSG_PUB.initialize;
907    END IF;
908    --  Initialize API return status to success
909    x_return_status := FND_API.G_RET_STS_SUCCESS;
910    --
911    -- Create Transaction
912    IF p_txn_rec.transaction_id IS NULL OR
913       p_txn_rec.transaction_id = FND_API.G_MISS_NUM THEN
914       l_process_flag := TRUE;
915       WHILE l_process_flag LOOP
916 	 select CSI_TRANSACTIONS_S.nextval
917 	 into p_txn_rec.transaction_id from dual;
918 	 IF NOT csi_counter_readings_pvt.Transaction_ID_Exists(p_txn_rec.transaction_id) THEN
919 	    l_process_flag := FALSE;
920 	 END IF;
921       END LOOP;
922    ELSE
923       IF csi_counter_readings_pvt.Transaction_ID_Exists(p_txn_rec.transaction_id) THEN
924          csi_ctr_gen_utility_pvt.ExitWithErrMsg
925                ( p_msg_name    =>  'CSI_TXN_ID_ALREADY_EXISTS'
926                 ,p_token1_name =>  'TRANSACTION_ID'
927                 ,p_token1_val  =>  to_char(p_txn_rec.transaction_id)
928                );
929       END IF;
930    END IF;
931    --
932    IF p_txn_rec.transaction_type_id IS NULL OR
933       p_txn_rec.transaction_type_id = FND_API.G_MISS_NUM THEN
934       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_NO_TXN_TYPE_ID');
935    ELSE
936       IF p_txn_rec.transaction_type_id NOT in (80,81,82,83,84,85,86,87,88,89,91,92,94,95)
937       THEN
938          csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_INVALID_TXN_TYPE_ID');
939       ELSE
940          Begin
941             SELECT  'x'
942             INTO    l_dummy
943             FROM    csi_txn_types
944             WHERE   transaction_type_id = p_txn_rec.transaction_type_id;
945          Exception
946             when no_data_found THEN
947                csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_INVALID_TXN_TYPE_ID');
948          End;
949       END IF;
950    END IF;
951    --
952    IF p_txn_rec.source_transaction_date IS NULL OR
953       p_txn_rec.source_transaction_date = FND_API.G_MISS_DATE THEN
954       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_NO_TXN_DATE');
955    END IF;
956    --
957    IF p_txn_rec.transaction_date IS NULL OR
958       p_txn_rec.transaction_date = FND_API.G_MISS_DATE THEN
959       p_txn_rec.transaction_date := sysdate;
960    END IF;
961    --
962    p_txn_rec.object_version_number := 1;
963    p_txn_rec.gl_interface_status_code := 1; -- Pending
964    --
965    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
966    csi_ctr_gen_utility_pvt.put_line( '....create_reading_transactions'               ||'-'||
967                                   p_api_version                              ||'-'||
968                                   nvl(p_commit,FND_API.G_FALSE)              ||'-'||
969                                   nvl(p_init_msg_list,FND_API.G_FALSE)       ||'-'||
970                                   nvl(p_validation_level,FND_API.G_VALID_LEVEL_FULL) );
971    END IF;       -- 8214848 - dsingire
972 
973    CSI_TRANSACTIONS_PKG.Insert_Row
974 	 ( px_transaction_id             => p_txn_rec.transaction_id,
975 	   p_transaction_date            => p_txn_rec.transaction_date,
976 	   p_source_transaction_date     => p_txn_rec.source_transaction_date,
977 	   p_transaction_type_id         => p_txn_rec.transaction_type_id,
978 	   p_txn_sub_type_id             => p_txn_rec.txn_sub_type_id,
979 	   p_source_group_ref_id         => p_txn_rec.source_group_ref_id,
980 	   p_source_group_ref            => p_txn_rec.source_group_ref,
981 	   p_source_header_ref_id        => p_txn_rec.source_header_ref_id,
982 	   p_source_header_ref           => p_txn_rec.source_header_ref,
983 	   p_source_line_ref_id          => p_txn_rec.source_line_ref_id,
984 	   p_source_line_ref             => p_txn_rec.source_line_ref,
985 	   p_source_dist_ref_id1         => p_txn_rec.source_dist_ref_id1,
986 	   p_source_dist_ref_id2         => p_txn_rec.source_dist_ref_id2,
987 	   p_inv_material_transaction_id => p_txn_rec.inv_material_transaction_id,
988 	   p_transaction_quantity        => p_txn_rec.transaction_quantity,
989 	   p_transaction_uom_code        => p_txn_rec.transaction_uom_code,
990 	   p_transacted_by               => p_txn_rec.transacted_by,
991 	   p_transaction_status_code     => p_txn_rec.transaction_status_code,
992 	   p_transaction_action_code     => p_txn_rec.transaction_action_code,
993 	   p_message_id                  => p_txn_rec.message_id,
994 	   p_context                     => p_txn_rec.context,
995 	   p_attribute1                  => p_txn_rec.attribute1,
996 	   p_attribute2                  => p_txn_rec.attribute2,
997 	   p_attribute3                  => p_txn_rec.attribute3,
998 	   p_attribute4                  => p_txn_rec.attribute4,
999 	   p_attribute5                  => p_txn_rec.attribute5,
1000 	   p_attribute6                  => p_txn_rec.attribute6,
1001 	   p_attribute7                  => p_txn_rec.attribute7,
1002 	   p_attribute8                  => p_txn_rec.attribute8,
1003 	   p_attribute9                  => p_txn_rec.attribute9,
1004 	   p_attribute10                 => p_txn_rec.attribute10,
1005 	   p_attribute11                 => p_txn_rec.attribute11,
1006 	   p_attribute12                 => p_txn_rec.attribute12,
1007 	   p_attribute13                 => p_txn_rec.attribute13,
1008 	   p_attribute14                 => p_txn_rec.attribute14,
1009 	   p_attribute15                 => p_txn_rec.attribute15,
1010 	   p_created_by                  => l_user_id,
1011 	   p_creation_date               => SYSDATE,
1012 	   p_last_updated_by             => l_user_id,
1013 	   p_last_update_date            => SYSDATE,
1014 	   p_last_update_login           => l_conc_login_id,
1015 	   p_object_version_number       => p_txn_rec.object_version_number,
1016 	   p_split_reason_code           => p_txn_rec.split_reason_code,
1017            p_gl_interface_status_code    => p_txn_rec.gl_interface_status_code
1018         );
1019    --
1020    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
1021       COMMIT WORK;
1022    END IF;
1023    --
1024    -- Standard call to get message count and IF count is  get message info.
1025    FND_MSG_PUB.Count_And_Get
1026       ( p_count  =>  x_msg_count,
1027         p_data   =>  x_msg_data
1028       );
1029 EXCEPTION
1030    WHEN FND_API.G_EXC_ERROR THEN
1031       x_return_status := FND_API.G_RET_STS_ERROR ;
1032       ROLLBACK TO create_reading_transaction;
1033       FND_MSG_PUB.Count_And_Get
1034          ( p_count => x_msg_count,
1035            p_data  => x_msg_data
1036          );
1037    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1038       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1039       ROLLBACK TO create_reading_transaction;
1040       FND_MSG_PUB.Count_And_Get
1041          ( p_count => x_msg_count,
1042            p_data  => x_msg_data
1043          );
1044    WHEN OTHERS THEN
1045       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1046       ROLLBACK TO create_reading_transaction;
1047       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1048          FND_MSG_PUB.Add_Exc_Msg
1049             ( G_PKG_NAME,
1050               l_api_name
1051             );
1052       END IF;
1053       FND_MSG_PUB.Count_And_Get
1054          ( p_count  => x_msg_count,
1055            p_data   => x_msg_data
1056          );
1057 END Create_Reading_Transaction;
1058 --
1059 /*----------------------------------------------------*/
1060 /* procedure name: Capture_Counter_Reading            */
1061 /* description :   procedure used to                  */
1062 /*                 capture counter readings           */
1063 /*----------------------------------------------------*/
1064 
1065 PROCEDURE Capture_Counter_Reading
1066  (
1067      p_api_version           IN     NUMBER
1068     ,p_commit                IN     VARCHAR2
1069     ,p_init_msg_list         IN     VARCHAR2
1070     ,p_validation_level      IN     NUMBER
1071     ,p_txn_rec               IN OUT NOCOPY csi_datastructures_pub.transaction_rec
1072     ,p_ctr_rdg_rec           IN OUT NOCOPY csi_ctr_datastructures_pub.counter_readings_rec
1073     ,x_return_status         OUT    NOCOPY VARCHAR2
1074     ,x_msg_count             OUT    NOCOPY NUMBER
1075     ,x_msg_data              OUT    NOCOPY VARCHAR2
1076  )
1077 IS
1078    l_api_name                      CONSTANT VARCHAR2(30)   := 'CAPTURE_COUNTER_READING_PVT';
1079    l_api_version                   CONSTANT NUMBER         := 1.0;
1080    l_msg_data                      VARCHAR2(2000);
1081    l_msg_index                     NUMBER;
1082    l_msg_count                     NUMBER;
1083    l_prev_ctr_reading              NUMBER;
1084    l_prev_net_reading              NUMBER;
1085    l_prev_ltd_reading              NUMBER;
1086    l_prev_value_timestamp          DATE;
1087    l_next_ctr_reading              NUMBER;
1088    l_next_value_timestamp          DATE;
1089    l_next_reset_mode               VARCHAR2(30);
1090    l_ctr_name                      VARCHAR2(50);
1091    l_ctr_type                      VARCHAR2(30);
1092    l_rollover_last_rdg             NUMBER;
1093    l_rollover_first_rdg            NUMBER;
1094    l_direction                     VARCHAR2(1);
1095    l_reading_type                  NUMBER;
1096    l_auto_rollover                 VARCHAR2(1);
1097    l_net_reading                   NUMBER;
1098    l_ltd_reading                   NUMBER;
1099    l_previous_rdg                  NUMBER;
1100    l_previous_net                  NUMBER;
1101    l_previous_ltd                  NUMBER;
1102    l_process_flag                  BOOLEAN := TRUE;
1103    l_reset_value_id                NUMBER;
1104    l_seq_num                       NUMBER;
1105    l_rdg_lock_date                 DATE;
1106    l_curr_adj                      NUMBER;
1107    l_target_ctr_rec                csi_ctr_datastructures_pub.counter_readings_rec;
1108    l_reset_rdg_rec                 csi_ctr_datastructures_pub.counter_readings_rec;
1109    l_recalc_fl_rdg_rec             csi_ctr_datastructures_pub.counter_readings_rec;
1110    l_temp_ctr_rdg_rec              csi_ctr_datastructures_pub.counter_readings_rec;
1111    l_disabled_ctr_rec              csi_ctr_datastructures_pub.counter_readings_rec;
1112    l_reset_timestamp               DATE;
1113    l_exists                        VARCHAR2(1);
1114    l_target_ctr_exist              VARCHAR2(1);
1115    l_update_loop                   BOOLEAN := FALSE;
1116    l_derive_ctr_rec                csi_ctr_datastructures_pub.counter_readings_rec;
1117    l_mode                          VARCHAR2(30);
1118    l_prev_comments                 VARCHAR2(240);
1119    l_next_comments                 VARCHAR2(240);
1120    l_rec_count                     NUMBER;
1121    l_counter_value_id              NUMBER;
1122    l_obj_version_num               NUMBER;
1123    Skip_Process                    EXCEPTION;
1124    --
1125    -- Bug 8214848
1126     l_ctr_val_max                 NUMBER := -1;
1127     l_prev_ctr_max_reading        NUMBER;
1128     l_prev_net_max_reading        NUMBER;
1129     l_prev_ltd_max_reading        NUMBER;
1130     l_prev_value_max_timestamp    DATE;
1131     l_prev_max_comments           VARCHAR2(240);
1132     l_counter_id NUMBER;
1133     l_debug_level       NUMBER;    -- 8214848 - dsingire
1134     l_user_id 				  NUMBER := fnd_global.user_id;        -- 8214848 - dsingire
1135     l_conc_login_id		  NUMBER := fnd_global.conc_login_id;  -- 8214848 - dsingire
1136     l_date_format       VARCHAR2(50) := nvl(fnd_profile.value('ICX_DATE_FORMAT_MASK'),'DD-MON-YYYY HH24:MI:SS');
1137 	-- Bug 9148094
1138 	l_update_net_flag VARCHAR2(1) := NVL(fnd_profile.value('CSI_UPDATE_NET_READINGS_ON_RESET'), 'Y');
1139 
1140    CURSOR PREV_READING_CUR(p_counter_id IN NUMBER,p_value_timestamp IN DATE) IS
1141    select counter_reading,net_reading,life_to_date_reading,
1142           value_timestamp
1143    from CSI_COUNTER_READINGS
1144    where counter_id = p_counter_id
1145    and   nvl(disabled_flag,'N') = 'N'
1146    and   value_timestamp < p_value_timestamp
1147    ORDER BY value_timestamp desc;
1148    --,counter_value_id desc;
1149    --
1150    CURSOR NEXT_READING_CUR(p_counter_id IN NUMBER,p_value_timestamp IN DATE) IS
1151    select counter_reading,value_timestamp,reset_mode
1152    from CSI_COUNTER_READINGS
1153    where counter_id = p_counter_id
1154    and   nvl(disabled_flag,'N') = 'N'
1155    and   value_timestamp > p_value_timestamp
1156    ORDER BY value_timestamp asc;
1157    --,counter_value_id asc;
1158 
1159    CURSOR WO_COUNTER_VALUE_CUR(p_counter_id IN NUMBER, p_value_timestamp IN DATE) IS
1160     SELECT COUNTER_VALUE_ID, OBJECT_VERSION_NUMBER
1161       FROM   CSI_COUNTER_READINGS
1162       WHERE  COUNTER_ID = p_counter_id
1163       AND    VALUE_TIMESTAMP = p_value_timestamp;
1164 
1165    --
1166    CURSOR LATER_READINGS_CUR(p_counter_id IN NUMBER,p_value_timestamp IN DATE) IS
1167    select counter_value_id,counter_reading,net_reading,value_timestamp,adjustment_reading
1168          ,reset_mode,adjustment_type,include_target_resets, comments
1169    from CSI_COUNTER_READINGS
1170    where counter_id = p_counter_id
1171    and   nvl(disabled_flag,'N') = 'N'
1172    and   value_timestamp > p_value_timestamp
1173    ORDER BY value_timestamp asc, counter_value_id asc;
1174    --
1175    -- Added for bug 9402292
1176    CURSOR OBJECT_CTR_CUR IS
1177    select ccr.object_counter_id,nvl(ccr.factor,1) factor,
1178           ccv.direction,ccv.reading_type, ccv.uom_code object_uom_code,
1179           cct.name object_counter_name
1180    from   CSI_COUNTER_RELATIONSHIPS ccr,
1181           CSI_COUNTERS_B ccv,
1182           CSI_COUNTERS_TL cct
1183    where  ccr.source_counter_id = p_ctr_rdg_rec.counter_id
1184    and    ccr.relationship_type_code = 'CONFIGURATION'
1185    and    nvl(ccr.active_start_date,sysdate) <= p_ctr_rdg_rec.value_timestamp
1186    and    nvl(ccr.active_end_date,(sysdate+1)) > p_ctr_rdg_rec.value_timestamp
1187    and    ccv.counter_id = ccr.object_counter_id
1188    and    ccv.counter_id = cct.counter_id
1189    and    cct.language = USERENV('LANG');
1190 
1191 BEGIN
1192 
1193    -- Standard Start of API savepoint
1194    SAVEPOINT  capture_counter_reading_pvt;
1195    -- Standard call to check for call compatibility.
1196 
1197    IF NOT FND_API.Compatible_API_Call (l_api_version,
1198                                        p_api_version,
1199                                        l_api_name   ,
1200                                        G_PKG_NAME   ) THEN
1201       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1202    END IF;
1203    -- Initialize message list if p_init_msg_list is set to TRUE.
1204    IF FND_API.to_Boolean(nvl(p_init_msg_list,FND_API.G_FALSE)) THEN
1205       FND_MSG_PUB.initialize;
1206    END IF;
1207    --  Initialize API return status to success
1208    x_return_status := FND_API.G_RET_STS_SUCCESS;
1209    --
1210 
1211    -- Read the debug profiles values in to global variable 7197402
1212    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
1213 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
1214 	  END IF;                      -- 8214848 - dsingire
1215 
1216    l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
1217 
1218    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1219    csi_ctr_gen_utility_pvt.put_line( '....capture_counter_reading_pvt'               ||'-'||
1220                                   p_api_version                              ||'-'||
1221                                   nvl(p_commit,FND_API.G_FALSE)              ||'-'||
1222                                   nvl(p_init_msg_list,FND_API.G_FALSE)       ||'-'||
1223                                   nvl(p_validation_level,FND_API.G_VALID_LEVEL_FULL) );
1224 	csi_ctr_gen_utility_pvt.put_line('CMRO_CALL : '||CMRO_CALL);
1225    csi_ctr_gen_utility_pvt.put_line('Passed Transaction ID is '||to_char(p_txn_rec.transaction_id));
1226    END IF;          -- 8214848 - dsingire
1227    -- *
1228 
1229    --
1230    IF p_txn_rec.transaction_type_id in (91,92,94,95) THEN
1231       l_mode := 'Meter';
1232    ELSE
1233       l_mode := 'Counter';
1234    END IF;
1235    --
1236    IF p_ctr_rdg_rec.counter_id IS NULL OR
1237       p_ctr_rdg_rec.counter_id = FND_API.G_MISS_NUM THEN
1238       csi_ctr_gen_utility_pvt.ExitWithErrMsg
1239 	   ( p_msg_name     => 'CSI_API_CTR_INVALID',
1240 	     p_token1_name  => 'MODE',
1241 	     p_token1_val   => l_mode
1242 	   );
1243    ELSE
1244       -- Get the counter definition
1245       Begin
1246          select name,counter_type,rollover_last_reading,
1247                 rollover_first_reading,direction,reading_type,
1248                 automatic_rollover
1249          into l_ctr_name,l_ctr_type,l_rollover_last_rdg,l_rollover_first_rdg,
1250               l_direction,l_reading_type,l_auto_rollover
1251          from CSI_COUNTERS_VL -- Need to be changed
1252          where counter_id = p_ctr_rdg_rec.counter_id
1253          and   nvl(end_date_active,(sysdate+1)) > sysdate;
1254       Exception
1255          when no_data_found then
1256 	    csi_ctr_gen_utility_pvt.ExitWithErrMsg
1257 		 ( p_msg_name     => 'CSI_API_CTR_INVALID',
1258 		   p_token1_name  => 'MODE',
1259 		   p_token1_val   => l_mode
1260 		 );
1261       End;
1262    END IF;
1263    -- Atleast one reading should be captured.
1264    IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM AND
1265       NVL(p_ctr_rdg_rec.adjustment_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM AND
1266       NVL(p_ctr_rdg_rec.reset_counter_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
1267       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1268         csi_ctr_gen_utility_pvt.put_line('At least one reading should be entered...');
1269       END IF;              -- 8214848 - dsingire
1270       csi_ctr_gen_utility_pvt.ExitWithErrMsg
1271          ( p_msg_name     => 'CSI_API_CTR_RDG_MISSING',
1272            p_token1_name  => 'MODE',
1273            p_token1_val   => l_mode
1274          );
1275    END IF;
1276    --
1277    IF nvl(l_direction,'X') NOT IN ('A','D','B') THEN
1278       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1279         csi_ctr_gen_utility_pvt.put_line('Counter has invalid Direction...');
1280       END IF;             -- 8214848 - dsingire
1281       csi_ctr_gen_utility_pvt.ExitWithErrMsg
1282 	   ( p_msg_name     => 'CSI_API_CTR_INVALID_DIR',
1283 	     p_token1_name  => 'MODE',
1284 	     p_token1_val   => l_mode
1285 	   );
1286    END IF;
1287    --
1288    IF nvl(p_ctr_rdg_rec.disabled_flag,'N') = 'Y' THEN
1289       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1290         csi_ctr_gen_utility_pvt.put_line('Cannot disable the value during Insert...');
1291       END IF;             -- 8214848 - dsingire
1292       csi_ctr_gen_utility_pvt.ExitWithErrMsg
1293 	   ( p_msg_name     => 'CSI_API_CTR_NO_RDG_DISABLE',
1294 	     p_token1_name  => 'MODE',
1295 	     p_token1_val   => l_mode
1296 	   );
1297    END IF;
1298    --
1299    -- Cannot Capture Reading for Target Counters as they are driven by source counters
1300    IF Is_Target_Counter(p_ctr_rdg_rec.counter_id) THEN
1301       IF p_txn_rec.transaction_type_id in (91,92,94,95) THEN
1302          l_rec_count := 0;
1303          select count(*)
1304          into l_rec_count
1305          from CSI_COUNTER_READINGS
1306          where counter_id = p_ctr_rdg_rec.counter_id
1307          and   ROWNUM = 1;
1308          --
1309          IF l_rec_count > 0 THEN
1310             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1311               csi_ctr_gen_utility_pvt.put_line('Only First Reading can be captured for a Target Counter manually');
1312             END IF;                      -- 8214848 - dsingire
1313 	    csi_ctr_gen_utility_pvt.ExitWithErrMsg
1314 		 ( p_msg_name     => 'CSI_API_NO_RDG_TARGET_CTR',
1315 		   p_token1_name  => 'MODE',
1316 		   p_token1_val   => l_mode
1317 		 );
1318          END IF;
1319       ELSE
1320          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1321           csi_ctr_gen_utility_pvt.put_line('Cannot Capture Reading for a Target Counter...');
1322          END IF;      -- 8214848 - dsingire
1323          csi_ctr_gen_utility_pvt.ExitWithErrMsg
1324 	      ( p_msg_name     => 'CSI_API_NO_RDG_TARGET_CTR',
1325 	        p_token1_name  => 'MODE',
1326 	        p_token1_val   => l_mode
1327 	      );
1328       END IF;
1329    END IF;
1330    --
1331    -- Cannot Capture Reading for Formula Counters
1332    IF Is_Formula_Counter(p_ctr_rdg_rec.counter_id) THEN
1333       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1334         csi_ctr_gen_utility_pvt.put_line('Cannot Capture Reading for a Formula Counter...');
1335       END IF;    -- 8214848 - dsingire
1336       csi_ctr_gen_utility_pvt.ExitWithErrMsg
1337 	   ( p_msg_name     => 'CSI_API_NO_RDG_FORMULA_CTR',
1338 	     p_token1_name  => 'MODE',
1339 	     p_token1_val   => l_mode
1340 	   );
1341    END IF;
1342    --
1343    IF p_ctr_rdg_rec.value_timestamp IS NULL OR
1344       p_ctr_rdg_rec.value_timestamp = FND_API.G_MISS_DATE THEN
1345       p_ctr_rdg_rec.value_timestamp := sysdate;
1346      -- csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_INVALID_RDG_DATE');
1347    END IF;
1348    --
1349 
1350    Begin
1351       -- Bug 8214848
1352       select counter_id
1353       into   l_counter_id
1354       from   CSI_COUNTER_READINGS
1355       where  counter_id = p_ctr_rdg_rec.counter_id
1356       and    value_timestamp = p_ctr_rdg_rec.value_timestamp
1357       and    disabled_flag = 'N';  -- BUG 12536849
1358 
1359       /* Readings return status fixes */
1360       IF p_txn_rec.transaction_type_id in (91,92,94,95) THEN
1361          BEGIN
1362             select 'x'
1363             into   l_exists
1364             from   dual
1365             where  exists (select 'x'
1366        	                   from   CSI_COUNTER_READINGS
1367 		           where  counter_id = p_ctr_rdg_rec.counter_id
1368 		           and    value_timestamp = p_ctr_rdg_rec.value_timestamp
1369 		           and    counter_reading = p_ctr_rdg_rec.counter_reading);
1370 
1371             --Added for bug 9402292 - START
1372             IF p_txn_rec.transaction_type_id = 92 THEN
1373               FOR obj_cur IN OBJECT_CTR_CUR LOOP
1374                 IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1375                   csi_ctr_gen_utility_pvt.put_line('Calling Update_Last_Service_Reading_Wo for '|| obj_cur.object_counter_id );
1376                 END IF;          -- 8214848 - dsingire
1377                 Eam_Meters_Util.Update_Last_Service_Reading_Wo
1378                   (
1379                     p_wip_entity_id    =>  p_txn_rec.source_header_ref_id,
1380                     p_meter_id         =>  obj_cur.object_counter_id,
1381 	                  p_meter_reading    =>  p_ctr_rdg_rec.counter_reading,
1382 	                  p_wo_end_date      =>  p_ctr_rdg_rec.value_timestamp,
1383                     X_return_status    =>  x_return_status,
1384                     X_msg_count        =>  x_msg_count,
1385                     X_msg_data         =>  x_msg_data
1386 	                );
1387 	              IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1388                   csi_ctr_gen_utility_pvt.put_line('ERROR FROM Update_Last_Service_Reading_Wo API ');
1389                   l_msg_index := 1;
1390                   l_msg_count := x_msg_count;
1391                   WHILE l_msg_count > 0 LOOP
1392 	                  x_msg_data := FND_MSG_PUB.GET
1393 	                                  (  l_msg_index,
1394                                       FND_API.G_FALSE
1395 	                                  );
1396 	                  csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
1397 	                  l_msg_index := l_msg_index + 1;
1398 	                  l_msg_count := l_msg_count - 1;
1399                   END LOOP;
1400                   RAISE FND_API.G_EXC_ERROR;
1401 	              END IF;
1402               END LOOP;
1403             END IF; -- Call Update_Last_Service_Reading_WO check
1404             --Added for bug 9402292 -END
1405             raise skip_process;
1406          EXCEPTION
1407             WHEN NO_DATA_FOUND THEN
1408                IF p_txn_rec.transaction_type_id = 92 THEN
1409                   /* ECO 5344596, Disable previous reading and capture new
1410                      WO Recompletion Reading */
1411 
1412                   -- Bug 8214848
1413                   l_counter_value_id := null;
1414                   l_obj_version_num := null;
1415 
1416                   OPEN WO_COUNTER_VALUE_CUR(p_ctr_rdg_rec.counter_id, p_ctr_rdg_rec.value_timestamp);
1417                   FETCH WO_COUNTER_VALUE_CUR INTO
1418                     l_counter_value_id,
1419                     l_obj_version_num;
1420                   CLOSE WO_COUNTER_VALUE_CUR;
1421                   -- Enf of addition for bug 8214848
1422 
1423                   l_disabled_ctr_rec.counter_value_id := l_counter_value_id;
1424                   l_disabled_ctr_rec.disabled_flag    := 'Y';
1425                   l_disabled_ctr_rec.object_version_number := l_obj_version_num;
1426 
1427                   update_counter_reading
1428 	            (p_api_version           =>  1.0
1429 	             ,p_commit               =>  p_commit
1430 	             ,p_init_msg_list        =>  p_init_msg_list
1431 	             ,p_validation_level     =>  p_validation_level
1432 	             ,p_ctr_rdg_rec          =>  l_disabled_ctr_rec
1433 	             ,x_return_status        =>  x_return_status
1434 	             ,x_msg_count            =>  x_msg_count
1435 	             ,x_msg_data             =>  x_msg_data
1436 	            );
1437 	          IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1438                IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1439 	              csi_ctr_gen_utility_pvt.put_line('ERROR FROM Update_Counter_Reading when disabling WO ');
1440                END IF;                -- 8214848 - dsingire
1441 	             l_msg_index := 1;
1442 	             l_msg_count := x_msg_count;
1443 	             WHILE l_msg_count > 0 LOOP
1444 	                x_msg_data := FND_MSG_PUB.GET
1445 	                (l_msg_index,
1446 		         FND_API.G_FALSE
1447 	                );
1448                   IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1449 	                  csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
1450                   END IF;
1451 	                l_msg_index := l_msg_index + 1;
1452 	                l_msg_count := l_msg_count - 1;
1453 	             END LOOP;
1454 	             RAISE FND_API.G_EXC_ERROR;
1455                   END IF;
1456                ELSE
1457                   csi_ctr_gen_utility_pvt.ExitWithErrMsg
1458                     (p_msg_name     => 'CSI_API_CTR_RDG_DATE_EXISTS',
1459 	             p_token1_name  => 'VALUE_TIMESTAMP',
1460 	             p_token1_val   => to_char(p_ctr_rdg_rec.value_timestamp,l_date_format),
1461 	             p_token2_name  => 'MODE',
1462 	             p_token2_val   => l_mode
1463 	             );
1464                END IF;
1465          END;
1466       ELSE
1467          /* end of return status fixes */
1468          csi_ctr_gen_utility_pvt.ExitWithErrMsg
1469             (p_msg_name     => 'CSI_API_CTR_RDG_DATE_EXISTS',
1470 	     p_token1_name  => 'VALUE_TIMESTAMP',
1471 	     p_token1_val   => to_char(p_ctr_rdg_rec.value_timestamp,l_date_format),
1472 	     p_token2_name  => 'MODE',
1473 	     p_token2_val   => l_mode
1474 	    );
1475       END IF;
1476    Exception
1477       when no_data_found then
1478          null;
1479    End;
1480    --
1481    IF p_ctr_rdg_rec.value_timestamp > sysdate THEN
1482       csi_ctr_gen_utility_pvt.ExitWithErrMsg
1483          ( p_msg_name     => 'CSI_API_CTR_FUTURE_RDG_DATE',
1484            p_token1_name  => 'VALUE_TIMESTAMP',
1485            p_token1_val   => to_char(p_ctr_rdg_rec.value_timestamp,l_date_format),
1486 	   p_token2_name  => 'MODE',
1487 	   p_token2_val   => l_mode
1488          );
1489    END IF;
1490    -- *
1491    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1492     csi_ctr_gen_utility_pvt.put_line('Adjustment type is..' || p_ctr_rdg_rec.adjustment_type);
1493    END IF;
1494 
1495    IF NVL(p_ctr_rdg_rec.adjustment_type,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR THEN
1496       -- Validate Adjustment Type against lookups
1497       IF NOT Valid_Adjustment_Type(p_ctr_rdg_rec.adjustment_type) THEN
1498          csi_ctr_gen_utility_pvt.ExitWithErrMsg
1499              ( p_msg_name     =>  'CSI_API_CTR_INV_ADJ_TYPE',
1500                p_token1_name  =>  'ADJ_TYPE',
1501                p_token1_val   =>  p_ctr_rdg_rec.adjustment_type
1502              );
1503       END IF;
1504    END IF;
1505    --
1506    IF NVL(p_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR THEN
1507       -- Validate Reset Mode against lookups
1508       -- IF NOT Valid_Reset_Mode(p_ctr_rdg_rec.reset_mode) THEN
1509       -- Since we allow only SOFT reset at this point, no need to check against Lookups
1510       IF p_ctr_rdg_rec.reset_mode <> 'SOFT' THEN
1511          csi_ctr_gen_utility_pvt.ExitWithErrMsg
1512              ( p_msg_name     =>  'CSI_API_CTR_INV_RESET_MODE',
1513                p_token1_name  =>  'RESET_MODE',
1514                p_token1_val   =>  p_ctr_rdg_rec.reset_mode
1515              );
1516       END IF;
1517       --
1518       IF NVL(p_ctr_rdg_rec.reset_counter_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
1519          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1520           csi_ctr_gen_utility_pvt.put_line('Reset counter reading is mandatory for SOFT reset..');
1521          END IF;          -- 8214848 - dsingire
1522 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1523 	    ( p_msg_name     => 'CSI_API_CTR_SOFT_RDG_MISS',
1524 	      p_token1_name  => 'MODE',
1525 	      p_token1_val   => l_mode
1526 	    );
1527       END IF;
1528       --
1529 
1530 
1531       IF NVL(p_ctr_rdg_rec.reset_reason,FND_API.G_MISS_CHAR) = FND_API.G_MISS_CHAR THEN
1532 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1533 	    ( p_msg_name     => 'CSI_API_CTR_RESET_REASON_MISS',
1534 	      p_token1_name  => 'MODE',
1535 	      p_token1_val   => l_mode
1536 	    );
1537       END IF;
1538    END IF; -- Reset Mode check
1539    --
1540    -- Adjustment reading is Mandatory for Adjustments
1541    IF NVL(p_ctr_rdg_rec.adjustment_type,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR AND
1542       NVL(p_ctr_rdg_rec.adjustment_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
1543       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1544       csi_ctr_gen_utility_pvt.put_line('Adjustment Reading cannot be Null or Zero for Adjustments...');
1545       END IF;                   -- 8214848 - dsingire
1546       csi_ctr_gen_utility_pvt.ExitWithErrMsg
1547 	 ( p_msg_name     => 'CSI_API_CTR_ADJ_RDG_MISS',
1548 	   p_token1_name  => 'MODE',
1549 	   p_token1_val   => l_mode
1550 	 );
1551    END IF;
1552    --
1553    -- Reverse Validation
1554    IF NVL(p_ctr_rdg_rec.adjustment_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM AND
1555       NVL(p_ctr_rdg_rec.adjustment_type,FND_API.G_MISS_CHAR) = FND_API.G_MISS_CHAR THEN
1556       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1557         csi_ctr_gen_utility_pvt.put_line('Adjustment Type is Mandatory for Adjustments...');
1558       END IF;          -- 8214848 - dsingire
1559       csi_ctr_gen_utility_pvt.ExitWithErrMsg
1560 	 ( p_msg_name     => 'CSI_API_CTR_ADJ_TYPE_MISS',
1561 	   p_token1_name  => 'MODE',
1562 	   p_token1_val   => l_mode
1563 	 );
1564    END IF;
1565    --
1566    IF NVL(p_ctr_rdg_rec.adjustment_reading,FND_API.G_MISS_NUM) <= 0 THEN
1567       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1568         csi_ctr_gen_utility_pvt.put_line('Adjustment Reading cannot be Zero or Negative...');
1569       END IF;          -- 8214848 - dsingire
1570       csi_ctr_gen_utility_pvt.ExitWithErrMsg
1571 	 ( p_msg_name     => 'CSI_API_CTR_POSITIVE_ADJ_RDG',
1572 	   p_token1_name  => 'MODE',
1573 	   p_token1_val   => l_mode
1574 	 );
1575    END IF;
1576    -- Reverse Validations
1577    IF NVL(p_ctr_rdg_rec.reset_counter_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
1578       IF NVL(p_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) = FND_API.G_MISS_CHAR THEN
1579         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1580          csi_ctr_gen_utility_pvt.put_line('Reset Mode is Mandatory for Resets...');
1581         END IF;          -- 8214848 - dsingire
1582 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1583 	    ( p_msg_name     => 'CSI_API_CTR_RESET_MODE_MISS',
1584 	      p_token1_name  => 'MODE',
1585 	      p_token1_val   => l_mode
1586 	    );
1587       END IF;
1588       -- Reset Reason is Mandatory
1589       IF NVL(p_ctr_rdg_rec.reset_reason,FND_API.G_MISS_CHAR) = FND_API.G_MISS_CHAR THEN
1590 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1591 	    ( p_msg_name     => 'CSI_API_CTR_RESET_REASON_MISS',
1592 	      p_token1_name  => 'MODE',
1593 	      p_token1_val   => l_mode
1594 	    );
1595       END IF;
1596    END IF;
1597    -- *
1598    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1599     csi_ctr_gen_utility_pvt.put_line('Reset Mode is Mandatory for Resets...'|| p_ctr_rdg_rec.reset_counter_reading );
1600    END IF;          -- 8214848 - dsingire
1601    IF NVL(p_ctr_rdg_rec.reset_reason,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR THEN
1602       IF NVL(p_ctr_rdg_rec.reset_counter_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
1603          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1604           csi_ctr_gen_utility_pvt.put_line('Reset Reading is Mandatory for Resets...');
1605          END IF;          -- 8214848 - dsingire
1606 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1607 	    ( p_msg_name     => 'CSI_API_CTR_RESET_RDG_MISS',
1608 	      p_token1_name  => 'MODE',
1609 	      p_token1_val   => l_mode
1610 	    );
1611       END IF;
1612       --
1613       IF NVL(p_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) = FND_API.G_MISS_CHAR THEN
1614         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1615          csi_ctr_gen_utility_pvt.put_line('Reset Mode is Mandatory for Resets...');
1616         END IF;          -- 8214848 - dsingire
1617 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1618 	    ( p_msg_name     => 'CSI_API_CTR_RESET_MODE_MISS',
1619 	      p_token1_name  => 'MODE',
1620 	      p_token1_val   => l_mode
1621 	    );
1622       END IF;
1623    END IF;
1624    --
1625    -- Atleast one reading should be captured.
1626    IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM AND
1627       NVL(p_ctr_rdg_rec.adjustment_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM AND
1628       NVL(p_ctr_rdg_rec.reset_counter_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
1629       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1630       csi_ctr_gen_utility_pvt.put_line('At least one reading should be entered...');
1631       END IF;          -- 8214848 - dsingire
1632       csi_ctr_gen_utility_pvt.ExitWithErrMsg
1633 	 ( p_msg_name     => 'CSI_API_CTR_RDG_MISSING',
1634 	   p_token1_name  => 'MODE',
1635 	   p_token1_val   => l_mode
1636 	 );
1637    END IF;
1638    --
1639    -- If the Source counter or its object counters have a reading lock date then
1640    -- the reading date cannot be earlier than the lock date (Max of all)
1641    l_rdg_lock_date := NULL;
1642 
1643   Begin
1644 	  SELECT MAX(READING_LOCK_DATE)
1645 	  INTO l_rdg_lock_date
1646 	  FROM CSI_COUNTER_READING_LOCKS
1647 	  WHERE COUNTER_ID IN (SELECT OBJECT_COUNTER_ID FROM
1648       CSI_COUNTER_RELATIONSHIPS WHERE SOURCE_COUNTER_ID = p_ctr_rdg_rec.counter_id AND
1649       NVL(ACTIVE_END_DATE,(p_ctr_rdg_rec.value_timestamp + 1)) > p_ctr_rdg_rec.value_timestamp
1650 	  UNION ALL SELECT p_ctr_rdg_rec.counter_id FROM DUAL);
1651    End;
1652    --
1653    IF l_rdg_lock_date IS NOT NULL THEN
1654       IF p_ctr_rdg_rec.value_timestamp <= l_rdg_lock_date THEN
1655          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1656           csi_ctr_gen_utility_pvt.put_line('Reading Date cannot be earlier than the Reading Lock Date...');
1657          END IF;          -- 8214848 - dsingire
1658          csi_ctr_gen_utility_pvt.ExitWithErrMsg
1659              ( p_msg_name     =>  'CSI_API_CTR_RDG_DATE_LOCKED',
1660                p_token1_name  =>  'LOCKED_DATE',
1661                p_token1_val   =>  to_char(l_rdg_lock_date,l_date_format), --fix for bug 5435071
1662                p_token2_name  =>  'MODE',
1663                p_token2_val   =>  l_mode
1664              );
1665       END IF;
1666    END IF;
1667    -- *
1668    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1669     csi_ctr_gen_utility_pvt.put_line('Getting PREV Counter reading' || p_ctr_rdg_rec.value_timestamp );
1670    END IF;          -- 8214848 - dsingire
1671 
1672   -- Get the last reading for this counter
1673   -- Bug 	8214848
1674    BEGIN
1675     SELECT CTR_VAL_MAX_SEQ_NO INTO l_ctr_val_max
1676       FROM CSI_COUNTERS_B WHERE COUNTER_ID = p_ctr_rdg_rec.counter_id;
1677 
1678    SELECT COUNTER_READING,NET_READING,LIFE_TO_DATE_READING,
1679           VALUE_TIMESTAMP
1680          INTO l_prev_ctr_max_reading,
1681               l_prev_net_max_reading,
1682               l_prev_ltd_max_reading,
1683               l_prev_value_max_timestamp
1684               --l_prev_max_comments
1685    FROM CSI_COUNTER_READINGS WHERE COUNTER_VALUE_ID = NVL(l_ctr_val_max,-1);
1686 
1687    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1688     csi_ctr_gen_utility_pvt.put_line('l_ctr_val_max - ' || l_ctr_val_max );
1689    END IF;          -- 8214848 - dsingire
1690 
1691   EXCEPTION
1692    WHEN OTHERS THEN
1693     -- Assign max counter value id to 0 and use the PREV_READING_CUR cursor
1694     l_ctr_val_max := -1;
1695   END;  --
1696 
1697    IF (l_prev_value_max_timestamp <=  p_ctr_rdg_rec.value_timestamp
1698             AND NVL(l_ctr_val_max,-1) > 0) THEN
1699 
1700       -- The requested timestamp is greater than the timestamp of the
1701       -- CTR_VAL_MAX_SEQ_NO
1702       l_prev_ctr_reading := l_prev_ctr_max_reading;
1703       l_prev_net_reading := l_prev_net_max_reading;
1704       l_prev_ltd_reading := l_prev_ltd_max_reading;
1705       l_prev_value_timestamp := l_prev_value_max_timestamp;
1706       --l_prev_comments := l_prev_max_comments;
1707 
1708       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1709         csi_ctr_gen_utility_pvt.put_line('Max Value counter id used');
1710       END IF;          -- 8214848 - dsingire
1711 
1712    ELSE
1713 
1714      OPEN PREV_READING_CUR(p_ctr_rdg_rec.counter_id,p_ctr_rdg_rec.value_timestamp);
1715      FETCH PREV_READING_CUR
1716      INTO  l_prev_ctr_reading,
1717           l_prev_net_reading,
1718           l_prev_ltd_reading,
1719           l_prev_value_timestamp;
1720           --l_prev_comments;
1721      CLOSE PREV_READING_CUR;
1722    END IF;
1723 
1724    -- End of modification for the bug 	8214848
1725    -- *
1726    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1727     csi_ctr_gen_utility_pvt.put_line('PREV Counter reading' || l_prev_ctr_reading );
1728   END IF;          -- 8214848 - dsingire
1729 
1730 
1731    --
1732    -- Check whether this is the first reading
1733    IF l_prev_ctr_reading IS NULL THEN -- First Reading
1734       IF NVL(p_ctr_rdg_rec.adjustment_type,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR OR
1735          NVL(p_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR OR
1736          NVL(p_ctr_rdg_rec.automatic_rollover_flag,'N') = 'Y' THEN
1737          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1738             csi_ctr_gen_utility_pvt.put_line('First Reading cannot be Adjustment or Reset or Automatic Rollover');
1739          END IF;          -- 8214848 - dsingire
1740 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1741 	    ( p_msg_name    =>  'CSI_API_CTR_INVALID_FIRST_RDG',
1742 	      p_token1_name =>  'MODE',
1743 	      p_token1_val  =>  l_mode
1744 	    );
1745       END IF;
1746    ELSE
1747       IF NVL(p_ctr_rdg_rec.adjustment_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
1748          IF p_ctr_rdg_rec.adjustment_reading > l_prev_net_reading THEN
1749             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1750               csi_ctr_gen_utility_pvt.put_line('Adjustment Reading cannot be greater than Previous Net Reading');
1751             END IF;          -- 8214848 - dsingire
1752             csi_ctr_gen_utility_pvt.ExitWithErrMsg
1753                ( p_msg_name     =>  'CSI_API_CTR_INVALID_ADJ_RDG',
1754                  p_token1_name  =>  'PREV_NET',
1755                  p_token1_val   =>  to_char(l_prev_net_reading)
1756                );
1757          END IF;
1758       END IF;
1759    END IF;
1760 
1761    -- *
1762    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1763     csi_ctr_gen_utility_pvt.put_line('Getting LAST Counter reading' || to_char(p_ctr_rdg_rec.value_timestamp,'DD-MON-YYYY HH24:MI:SS'));
1764 
1765     csi_ctr_gen_utility_pvt.put_line('next value timestamp before fetch' || l_next_value_timestamp);
1766    END IF;          -- 8214848 - dsingire
1767 
1768    -- Get the next reading for this counter
1769    OPEN NEXT_READING_CUR(p_ctr_rdg_rec.counter_id,p_ctr_rdg_rec.value_timestamp);
1770    FETCH NEXT_READING_CUR
1771    INTO  l_next_ctr_reading,
1772 	 l_next_value_timestamp,
1773          l_next_reset_mode;
1774          --l_next_comments;
1775    CLOSE NEXT_READING_CUR;
1776 
1777    -- *
1778    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1779    csi_ctr_gen_utility_pvt.put_line('LAST Counter reading' ||  l_next_ctr_reading );
1780    csi_ctr_gen_utility_pvt.put_line('LAST Counter reading' ||  to_char(l_next_value_timestamp,'DD-MON-YYYY HH24:MI:SS') );
1781    csi_ctr_gen_utility_pvt.put_line('Reading Type is' ||  l_reading_type );
1782    END IF;          -- 8214848 - dsingire
1783    --
1784    --
1785    IF NVL(p_ctr_rdg_rec.automatic_rollover_flag,'N') = 'Y' THEN
1786       IF NVL(l_auto_rollover,'N') <> 'Y' OR
1787          l_rollover_last_rdg IS NULL OR
1788          l_rollover_first_rdg IS NULL THEN
1789          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1790           csi_ctr_gen_utility_pvt.put_line('Counter does not have automatic rollover attributes set...');
1791          END IF;          -- 8214848 - dsingire
1792 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1793 	    ( p_msg_name    =>  'CSI_API_CTR_ROLLOVER_ATTR_MISS',
1794 	      p_token1_name =>  'MODE',
1795 	      p_token1_val  =>  l_mode
1796 	    );
1797       END IF;
1798    END IF;
1799    -- For Change Counters Reset and Automatic rollover are not allowed
1800 
1801    IF l_reading_type = 2 THEN
1802       /* IF NVL(p_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR THEN
1803          csi_ctr_gen_utility_pvt.put_line('Soft Reset is not allowed for Change Counters..');
1804 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1805 	    ( p_msg_name    =>  'CSI_API_NO_RESET_CHG_CTR',
1806 	      p_token1_name =>  'MODE',
1807 	      p_token1_val  =>  l_mode
1808 	    );
1809       END IF;
1810       */
1811       --
1812       IF NVL(p_ctr_rdg_rec.automatic_rollover_flag,'N') = 'Y' THEN
1813         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1814          csi_ctr_gen_utility_pvt.put_line('Automatic Rollover  is not allowed for Change Counters..');
1815         END IF;          -- 8214848 - dsingire
1816 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1817 	    ( p_msg_name    =>  'CSI_API_NO_AUTO_CHG_CTR',
1818 	      p_token1_name =>  'MODE',
1819 	      p_token1_val  =>  l_mode
1820 	    );
1821       END IF;
1822       --
1823       /* IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) < 0 THEN
1824          csi_ctr_gen_utility_pvt.put_line('Counter Reading cannot be negative for Change Counters...');
1825 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1826 	    ( p_msg_name    =>  'CSI_API_CTR_NEG_RDG',
1827 	      p_token1_name =>  'MODE',
1828 	      p_token1_val  =>  l_mode
1829 	    );
1830       END IF
1831       */
1832    END IF;
1833    -- For Bi-Directionsl Counters Adjustments, Reset and Automatic rollover are not allowed
1834    IF l_direction = 'B' THEN
1835     --Commented by Anju for cMRO bug
1836      /* IF NVL(p_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR THEN
1837          csi_ctr_gen_utility_pvt.put_line('Reset is not allowed for Bi-directional Counters..');
1838 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1839 	    ( p_msg_name    =>  'CSI_API_NO_RESET_BID_CTR',
1840 	      p_token1_name =>  'MODE',
1841 	      p_token1_val  =>  l_mode
1842 	    );
1843       END IF;*/
1844 
1845       --
1846       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1847         csi_ctr_gen_utility_pvt.put_line( 'p_ctr_rdg_rec.reset_mode ' || p_ctr_rdg_rec.reset_mode);
1848       END IF;          -- 8214848 - dsingire
1849       IF NVL(p_ctr_rdg_rec.automatic_rollover_flag,'N') = 'Y' THEN
1850          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1851           csi_ctr_gen_utility_pvt.put_line('Automatic Rollover is not allowed for Bi-directional Counters..');
1852          END IF;          -- 8214848 - dsingire
1853 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1854 	    ( p_msg_name    =>  'CSI_API_NO_AUTO_BID_CTR',
1855 	      p_token1_name =>  'MODE',
1856 	      p_token1_val  =>  l_mode
1857 	    );
1858       END IF;
1859       --
1860 
1861       /* IF NVL(p_ctr_rdg_rec.adjustment_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM
1862          THEN
1863          csi_ctr_gen_utility_pvt.put_line('Adjustment Reading is' || p_ctr_rdg_rec.adjustment_reading);
1864          csi_ctr_gen_utility_pvt.put_line('Adjustment is not allowed for Bi-directional Counters..');
1865 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
1866 	    ( p_msg_name    =>  'CSI_API_NO_ADJ_BID_CTR',
1867 	      p_token1_name =>  'MODE',
1868 	      p_token1_val  =>  l_mode
1869 	    );
1870       END IF;*/
1871 
1872    END IF;
1873    -- Automatic Rollover cannot be combined with other reading captures.
1874    IF NVL(p_ctr_rdg_rec.automatic_rollover_flag,'N') = 'Y' THEN
1875       IF NVL(p_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR OR
1876          NVL(p_ctr_rdg_rec.adjustment_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
1877          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1878          csi_ctr_gen_utility_pvt.put_line('Automatic Rollover cannot be combined with Reset or Adj...');
1879          END IF;          -- 8214848 - dsingire
1880          csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_INVALID_AUTO_RDG');
1881       END IF;
1882    END IF;
1883    -- *
1884    --csi_ctr_gen_utility_pvt.put_line( '1');         -- 8214848 - dsingire
1885    IF l_next_value_timestamp IS NOT NULL THEN
1886         -- *
1887         --csi_ctr_gen_utility_pvt.put_line( '2');    -- 8214848 - dsingire
1888         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1889           csi_ctr_gen_utility_pvt.put_line( 'l_next_value_timestamp' || l_next_value_timestamp);
1890         END IF;          -- 8214848 - dsingire
1891       -- Automatic Rollover Cannot occur inbetween readings
1892       IF NVL(p_ctr_rdg_rec.automatic_rollover_flag,'N') = 'Y' THEN
1893          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1894           csi_ctr_gen_utility_pvt.put_line('Next counter reading exists. Cannot Rollover...');     ----- this point
1895          END IF;          -- 8214848 - dsingire
1896 
1897          csi_ctr_gen_utility_pvt.ExitWithErrMsg
1898                  ( p_msg_name     => 'CSI_API_CTR_NEXT_RDG_DT_EXISTS',
1899                    p_token1_name  => 'NEXT_DATE',
1900                    p_token1_val   => to_char(l_next_value_timestamp,l_date_format)
1901                  );
1902       END IF;
1903       -- Reset cannot happen in between. It has to be at the end
1904       IF NVL(p_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR THEN
1905         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1906          csi_ctr_gen_utility_pvt.put_line('Next counter reading exists. Cannot Reset in between...');
1907         END IF;          -- 8214848 - dsingire
1908 
1909          csi_ctr_gen_utility_pvt.ExitWithErrMsg
1910                  ( p_msg_name     => 'CSI_API_CTR_NEXT_RDG_DT_EXISTS',
1911                    p_token1_name  => 'NEXT_DATE',
1912                    p_token1_val   => to_char(l_next_value_timestamp,l_date_format)
1913                  );
1914       END IF;
1915       --
1916       -- Inbetween Adjustments cannot be clubbed with other readings
1917       IF NVL(p_ctr_rdg_rec.adjustment_type,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR OR
1918          NVL(p_ctr_rdg_rec.adjustment_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
1919          IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
1920             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1921               csi_ctr_gen_utility_pvt.put_line('Between readings adjustments cannot be clubbed with others...');
1922             END IF;          -- 8214848 - dsingire
1923             csi_ctr_gen_utility_pvt.ExitWithErrMsg
1924                  ( p_msg_name     => 'CSI_API_CTR_ADJ_RDG_ONLY',
1925                    p_token1_name  => 'NEXT_DATE',
1926                    p_token1_val   => to_char(l_next_value_timestamp,l_date_format)
1927                  );
1928          END IF;
1929       END IF;
1930    END IF; -- Look for Next Value
1931 
1932 
1933    -- Reset Counter reading cannot be greater than previous counter reading
1934    IF NVL(p_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR THEN
1935       IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
1936          IF l_direction = 'D' THEN
1937             /* Validate that the reset reading is between the rollover if
1938                rollover attributes does exists */
1939             IF nvl(l_auto_rollover,'N') = 'Y'  THEN
1940                IF p_ctr_rdg_rec.reset_counter_reading < l_rollover_last_rdg OR
1941                   p_ctr_rdg_rec.reset_counter_reading > l_rollover_first_rdg THEN
1942                   IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1943                     csi_ctr_gen_utility_pvt.put_line('Reset counter reading not in the range of valid rollover values ...D Dir ');
1944                   END IF;          -- 8214848 - dsingire
1945 	          csi_ctr_gen_utility_pvt.ExitWithErrMsg
1946 		     ( p_msg_name       =>  'CSI_API_CTR_DSC_ROLLOVER_RDG',
1947 		       p_token1_name    =>  'MODE',
1948 		       p_token1_val     =>  l_mode
1949                      );
1950                END IF;
1951             END IF;
1952 
1953 
1954             IF p_ctr_rdg_rec.reset_counter_reading < l_prev_ctr_reading THEN
1955               IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1956                csi_ctr_gen_utility_pvt.put_line('Reset counter reading has to be greater than the previous reading ...D Dir ');
1957                END IF;          -- 8214848 - dsingire
1958                csi_ctr_gen_utility_pvt.ExitWithErrMsg
1959                   ( p_msg_name    =>  'CSI_API_CTR_MORE_RESET_RDG',
1960                     p_token1_name =>  'PREV_RDG',
1961                     p_token1_val  =>  to_char(l_prev_ctr_reading),
1962 	            p_token2_name =>  'MODE',
1963 	            p_token2_val  =>  l_mode
1964                   );
1965             END IF;
1966          ELSIF l_direction = 'A' THEN
1967             IF nvl(l_auto_rollover,'N') = 'Y'  THEN
1968                IF p_ctr_rdg_rec.reset_counter_reading > l_rollover_last_rdg OR
1969                   p_ctr_rdg_rec.reset_counter_reading < l_rollover_first_rdg THEN
1970 
1971                   IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1972                     csi_ctr_gen_utility_pvt.put_line('Reset counter reading not in the range of valid rollover values ...A Dir ');
1973                   END IF;          -- 8214848 - dsingire
1974 	          csi_ctr_gen_utility_pvt.ExitWithErrMsg
1975 		     ( p_msg_name       =>  'CSI_API_CTR_ASC_ROLLOVER_RDG',
1976 		       p_token1_name    =>  'MODE',
1977 		       p_token1_val     =>  l_mode
1978                      );
1979                END IF;
1980             END IF;
1981             IF p_ctr_rdg_rec.reset_counter_reading > l_prev_ctr_reading THEN
1982                IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1983                 csi_ctr_gen_utility_pvt.put_line('Reset counter reading has to be less than the previous reading ... A Dir');
1984                END IF;          -- 8214848 - dsingire
1985                csi_ctr_gen_utility_pvt.ExitWithErrMsg
1986                   ( p_msg_name    =>  'CSI_API_CTR_LESS_RESET_RDG',
1987                     p_token1_name =>  'PREV_RDG',
1988                     p_token1_val  =>  to_char(l_prev_ctr_reading),
1989 	            p_token2_name =>  'MODE',
1990 	            p_token2_val  =>  l_mode
1991                   );
1992             END IF;
1993          END IF;
1994       ELSE
1995          IF l_direction = 'D' THEN
1996             IF p_ctr_rdg_rec.reset_counter_reading < l_prev_ctr_reading THEN
1997                IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
1998                 csi_ctr_gen_utility_pvt.put_line('Reset counter reading has to be greater than the previous reading ...D Dir ');
1999                END IF;          -- 8214848 - dsingire
2000                csi_ctr_gen_utility_pvt.ExitWithErrMsg
2001                   ( p_msg_name    =>  'CSI_API_CTR_MORE_RESET_RDG',
2002                     p_token1_name =>  'PREV_RDG',
2003                     p_token1_val  =>  to_char(l_prev_ctr_reading),
2004 	            p_token2_name =>  'MODE',
2005 	            p_token2_val  =>  l_mode
2006                   );
2007             END IF;
2008         /* As in 11.5.10, ensure that Reset of Bidirection counter, reading is less than current reading */
2009          ELSIF l_direction = 'A' THEN
2010             IF p_ctr_rdg_rec.reset_counter_reading > l_prev_ctr_reading THEN
2011                IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2012                csi_ctr_gen_utility_pvt.put_line('Reset counter reading has to be less than the previous reading ... A Dir');
2013                END IF;          -- 8214848 - dsingire
2014                csi_ctr_gen_utility_pvt.ExitWithErrMsg
2015                   ( p_msg_name    =>  'CSI_API_CTR_LESS_RESET_RDG',
2016                     p_token1_name =>  'PREV_RDG',
2017                     p_token1_val  =>  to_char(l_prev_ctr_reading),
2018 	            p_token2_name =>  'MODE',
2019 	            p_token2_val  =>  l_mode
2020                   );
2021             END IF;
2022          END IF;
2023       END IF;
2024    END IF;
2025       --
2026    -- For Absolute counters check the Counter reading based on the Direction
2027    -- If Reading is captured inbetween then also it should be within prev and next readings
2028    -- If rollover flag is set then current reading can be less than previous reading
2029    IF NVL(p_ctr_rdg_rec.automatic_rollover_flag,'N') <> 'Y' THEN
2030       IF l_reading_type = 1  THEN -- Absolute
2031          -- OR l_reading_type = 2 THEN -- Changed
2032 	 IF nvl(l_direction,'X') = 'A' THEN
2033 	    IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
2034 	       IF ( (p_ctr_rdg_rec.counter_reading < nvl(l_prev_ctr_reading,p_ctr_rdg_rec.counter_reading)) OR
2035 		    ( l_next_ctr_reading IS NOT NULL AND
2036 		      p_ctr_rdg_rec.counter_reading > l_next_ctr_reading) ) THEN
2037       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2038 		  csi_ctr_gen_utility_pvt.put_line('1. Reading should be in increasing order...');
2039       END IF;          -- 8214848 - dsingire
2040 		  csi_ctr_gen_utility_pvt.ExitWithErrMsg
2041                       ( p_msg_name       =>  'CSI_API_CTR_INV_RDG',
2042                         p_token1_name    =>  'DIRECTION',
2043                         -- p_token1_val     =>  l_direction,
2044                         p_token1_val     =>  'an Ascending',
2045   	                p_token2_name    =>  'MODE',
2046 	                p_token2_val     =>  l_mode,
2047   	                p_token3_name    =>  'CTR_NAME',
2048 	                p_token3_val     =>  l_ctr_name
2049                       );
2050 	       END IF;
2051 	    END IF;
2052 	 ELSIF nvl(l_direction,'X') = 'D' THEN
2053 	    IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
2054 	       IF ( (p_ctr_rdg_rec.counter_reading > nvl(l_prev_ctr_reading,p_ctr_rdg_rec.counter_reading)) OR
2055 		    ( l_next_ctr_reading IS NOT NULL AND
2056 		      p_ctr_rdg_rec.counter_reading < l_next_ctr_reading) ) THEN
2057       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2058 		  csi_ctr_gen_utility_pvt.put_line('2. Reading should be in decreasing order...');
2059       END IF;          -- 8214848 - dsingire
2060 		  csi_ctr_gen_utility_pvt.ExitWithErrMsg
2061                       ( p_msg_name       =>  'CSI_API_CTR_INV_RDG',
2062                         p_token1_name    =>  'DIRECTION',
2063                         -- p_token1_val     =>  l_direction,
2064                         p_token1_val     =>  'a Descending',
2065   	                p_token2_name    =>  'MODE',
2066 	                p_token2_val     =>  l_mode,
2067   	                p_token3_name    =>  'CTR_NAME',
2068 	                p_token3_val     =>  l_ctr_name
2069                       );
2070 	       END IF;
2071 	    END IF;
2072 	 END IF;
2073       END IF; -- Reading Type and Direction check
2074    ELSE -- Automatic Rollover
2075       IF nvl(l_direction,'X') = 'A' THEN
2076          IF p_ctr_rdg_rec.counter_reading > l_rollover_last_rdg OR
2077             p_ctr_rdg_rec.counter_reading < l_rollover_first_rdg THEN
2078             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2079               csi_ctr_gen_utility_pvt.put_line('Counter Reading has to be within Rollover From-To Rdgs..');
2080             END IF;          -- 8214848 - dsingire
2081 	    csi_ctr_gen_utility_pvt.ExitWithErrMsg
2082 		( p_msg_name       =>  'CSI_API_CTR_ASC_ROLLOVER_RDG',
2083 		  p_token1_name    =>  'MODE',
2084 		  p_token1_val     =>  l_mode
2085 		);
2086          END IF;
2087       ELSIF nvl(l_direction,'X') = 'D' THEN
2088          IF p_ctr_rdg_rec.counter_reading < l_rollover_last_rdg OR
2089             p_ctr_rdg_rec.counter_reading > l_rollover_first_rdg THEN
2090             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2091               csi_ctr_gen_utility_pvt.put_line('Counter Reading has to be within Rollover From-To Rdgs..');
2092             END IF;          -- 8214848 - dsingire
2093 	    csi_ctr_gen_utility_pvt.ExitWithErrMsg
2094 		( p_msg_name       =>  'CSI_API_CTR_DSC_ROLLOVER_RDG',
2095 		  p_token1_name    =>  'MODE',
2096 		  p_token1_val     =>  l_mode
2097 		);
2098          END IF;
2099       END IF;
2100    END IF; -- Rollover flag check
2101    --
2102    -- If counter reading is not entered then look for adjustments
2103    IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
2104       IF NVL(p_ctr_rdg_rec.adjustment_type,FND_API.G_MISS_CHAR) <> FND_API.G_MISS_CHAR THEN
2105          IF l_reading_type = 1 THEN
2106             p_ctr_rdg_rec.counter_reading := l_prev_ctr_reading;
2107          ELSE
2108             p_ctr_rdg_rec.counter_reading := 0;
2109          END IF;
2110       END IF;
2111    END IF; -- Null counter reading
2112    --
2113    p_ctr_rdg_rec.object_version_number := 1;
2114    --
2115    -- If counter_reading gets a user entered value or thru' adjustments (Previous value)
2116    -- Insert into CSI_COUNTER_READINGS
2117    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2118     csi_ctr_gen_utility_pvt.put_line( 'l_reading_type ' || l_reading_type);
2119     csi_ctr_gen_utility_pvt.put_line( 'p_ctr_rdg_rec.counter_reading ' || p_ctr_rdg_rec.counter_reading);
2120     csi_ctr_gen_utility_pvt.put_line( 'p_ctr_rdg_rec.automatic_rollover_flag ' || p_ctr_rdg_rec.automatic_rollover_flag);
2121     csi_ctr_gen_utility_pvt.put_line( 'p_ctr_rdg_rec.reset_mode ' || p_ctr_rdg_rec.reset_mode);
2122 
2123     csi_ctr_gen_utility_pvt.put_line( 'p_ctr_rdg_rec.reset_reason ' || p_ctr_rdg_rec.reset_reason);
2124 
2125     csi_ctr_gen_utility_pvt.put_line( 'p_ctr_rdg_rec.reset_counter_reading ' || p_ctr_rdg_rec.reset_counter_reading);
2126    END IF;          -- 8214848 - dsingire
2127 
2128    IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
2129    IF NVL(p_ctr_rdg_rec.reset_counter_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM OR
2130    (NVL(p_ctr_rdg_rec.reset_counter_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM
2131     AND (p_ctr_rdg_rec.counter_reading <> p_ctr_rdg_rec.reset_counter_reading)) THEN
2132     -- check := true;
2133    --csi_ctr_gen_utility_pvt.put_line( 'check' || check);
2134    -- IF (p_ctr_rdg_rec.counter_reading <> p_ctr_rdg_rec.reset_counter_reading) THEN   -- for cMRO resetTHEN
2135       IF NVL(p_ctr_rdg_rec.automatic_rollover_flag,'N') <> 'Y' THEN
2136 
2137          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2138           csi_ctr_gen_utility_pvt.put_line('Calculate Net Reading 1');
2139          END IF;          -- 8214848 - dsingire
2140 
2141          Calculate_Net_Reading
2142             ( p_prev_net_rdg      => l_prev_net_reading
2143              ,p_prev_ltd_rdg      => l_prev_ltd_reading
2144              ,p_curr_rdg          => p_ctr_rdg_rec.counter_reading
2145              ,p_prev_rdg          => l_prev_ctr_reading
2146              ,p_curr_adj          => p_ctr_rdg_rec.adjustment_reading
2147              ,p_rdg_type          => l_reading_type
2148              ,p_direction         => l_direction
2149              ,px_net_rdg          => l_net_reading
2150              ,px_ltd_rdg          => l_ltd_reading
2151              ,l_ctr_rdg_rec      => p_ctr_rdg_rec -- added 6398254
2152             );
2153 
2154          IF l_reading_type = 2 THEN
2155 			IF nvl(l_direction,'X') = 'A' THEN
2156 				IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
2157 					IF (l_ltd_reading < l_prev_ltd_reading) THEN
2158 						IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2159 							csi_ctr_gen_utility_pvt.put_line('3. LTD Reading should be in increasing orde for a CHANGE COUNTER...');
2160 						END IF;          -- 8214848 - dsingire
2161 						csi_ctr_gen_utility_pvt.ExitWithErrMsg
2162                         ( p_msg_name       =>  'CSI_API_CTR_INV_RDG',
2163                            p_token1_name    =>  'DIRECTION',
2164                            -- p_token1_val     =>  l_direction,
2165                            p_token1_val     =>  'an Ascending',
2166   	                   p_token2_name    =>  'MODE',
2167 	                   p_token2_val     =>  l_mode,
2168   	                   p_token3_name    =>  'CTR_NAME',
2169 	                   p_token3_val     =>  l_ctr_name
2170                          );
2171 					END IF;
2172 				END IF;
2173 			ELSIF nvl(l_direction,'X') = 'D' THEN
2174 				IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM THEN
2175 					IF (l_ltd_reading > l_prev_ltd_reading) THEN
2176 						IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2177 							csi_ctr_gen_utility_pvt.put_line('4. LTD Reading should be in decreasing order for a CHANGE COUNTER...');
2178 						END IF;          -- 8214848 - dsingire
2179 						csi_ctr_gen_utility_pvt.ExitWithErrMsg
2180                          ( p_msg_name       =>  'CSI_API_CTR_INV_RDG',
2181                            p_token1_name    =>  'DIRECTION',
2182                            -- p_token1_val     =>  l_direction,
2183                            p_token1_val     =>  'a Descending',
2184 							p_token2_name    =>  'MODE',
2185 	                   p_token2_val     =>  l_mode,
2186   	                   p_token3_name    =>  'CTR_NAME',
2187 	                   p_token3_val     =>  l_ctr_name
2188                          );
2189 					END IF;
2190 				END IF;
2191             END IF;
2192          END IF;
2193     ELSE
2194          Calculate_Rollover_Reading
2195             ( p_prev_net_rdg      => l_prev_net_reading
2196              ,p_prev_ltd_rdg      => l_prev_ltd_reading
2197              ,p_curr_rdg          => p_ctr_rdg_rec.counter_reading
2198              ,p_prev_rdg          => l_prev_ctr_reading
2199              ,p_rollover_fm       => l_rollover_last_rdg
2200              ,p_rollover_to       => l_rollover_first_rdg
2201              ,px_net_rdg          => l_net_reading
2202              ,px_ltd_rdg          => l_ltd_reading
2203             );
2204       END IF; -- automatic_rollover_flag check
2205       -- Need to pass back the Net and LTD Readings
2206       p_ctr_rdg_rec.net_reading := l_net_reading;
2207       p_ctr_rdg_rec.life_to_date_reading := l_ltd_reading;
2208       --
2209       -- Call Table Handler to insert into CSI_COUNTER_READINGS
2210       -- Check and Generate Counter_value_id
2211       IF p_ctr_rdg_rec.counter_value_id IS NULL OR
2212 	 p_ctr_rdg_rec.counter_value_id = FND_API.G_MISS_NUM THEN
2213 	 WHILE l_process_flag LOOP
2214 	    select CSI_COUNTER_READINGS_S.nextval
2215 	    into p_ctr_rdg_rec.counter_value_id from dual;
2216 	    IF NOT Counter_Value_Exists(p_ctr_rdg_rec.counter_value_id) THEN
2217 	       l_process_flag := FALSE;
2218 	    END IF;
2219 	 END LOOP;
2220       ELSE
2221 	 IF Counter_Value_Exists(p_ctr_rdg_rec.counter_value_id) THEN
2222 	    csi_ctr_gen_utility_pvt.ExitWithErrMsg
2223 		    ( p_msg_name     => 'CSI_API_CTR_VALUE_EXISTS',
2224 		      p_token1_name  => 'CTR_NAME',
2225 		      p_token1_val   => l_ctr_name,
2226 		      p_token2_name  => 'CTR_VALUE_ID',
2227 		      p_token2_val   => to_char(p_ctr_rdg_rec.counter_value_id),
2228 		      p_token3_name  => 'MODE',
2229 		      p_token3_val   => l_mode
2230 		    );
2231 	 END IF;
2232       END IF;
2233       --
2234 
2235       --
2236       CSI_COUNTER_READINGS_PKG.Insert_Row(
2237 	  px_COUNTER_VALUE_ID         =>  p_ctr_rdg_rec.counter_value_id
2238 	 ,p_COUNTER_ID                =>  p_ctr_rdg_rec.counter_id
2239 	 ,p_VALUE_TIMESTAMP           =>  p_ctr_rdg_rec.value_timestamp
2240 	 ,p_COUNTER_READING           =>  p_ctr_rdg_rec.counter_reading
2241 	 ,p_RESET_MODE                =>  p_ctr_rdg_rec.reset_mode    -- NULL 6398254
2242 	 ,p_RESET_REASON              =>  p_ctr_rdg_rec.reset_reason   --NULL  6398254
2243 	 ,p_ADJUSTMENT_TYPE           =>  p_ctr_rdg_rec.adjustment_type
2244 	 ,p_ADJUSTMENT_READING        =>  p_ctr_rdg_rec.adjustment_reading
2245 	 ,p_OBJECT_VERSION_NUMBER     =>  p_ctr_rdg_rec.object_version_number
2246 	 ,p_LAST_UPDATE_DATE          =>  SYSDATE
2247 	 ,p_LAST_UPDATED_BY           =>  l_user_id
2248 	 ,p_CREATION_DATE             =>  SYSDATE
2249 	 ,p_CREATED_BY                =>  l_user_id
2250 	 ,p_LAST_UPDATE_LOGIN         =>  l_conc_login_id
2251 	 ,p_ATTRIBUTE1                =>  p_ctr_rdg_rec.attribute1
2252 	 ,p_ATTRIBUTE2                =>  p_ctr_rdg_rec.attribute2
2253 	 ,p_ATTRIBUTE3                =>  p_ctr_rdg_rec.attribute3
2254 	 ,p_ATTRIBUTE4                =>  p_ctr_rdg_rec.attribute4
2255 	 ,p_ATTRIBUTE5                =>  p_ctr_rdg_rec.attribute5
2256 	 ,p_ATTRIBUTE6                =>  p_ctr_rdg_rec.attribute6
2257 	 ,p_ATTRIBUTE7                =>  p_ctr_rdg_rec.attribute7
2258 	 ,p_ATTRIBUTE8                =>  p_ctr_rdg_rec.attribute8
2259 	 ,p_ATTRIBUTE9                =>  p_ctr_rdg_rec.attribute9
2260 	 ,p_ATTRIBUTE10               =>  p_ctr_rdg_rec.attribute10
2261 	 ,p_ATTRIBUTE11               =>  p_ctr_rdg_rec.attribute11
2262 	 ,p_ATTRIBUTE12               =>  p_ctr_rdg_rec.attribute12
2263 	 ,p_ATTRIBUTE13               =>  p_ctr_rdg_rec.attribute13
2264 	 ,p_ATTRIBUTE14               =>  p_ctr_rdg_rec.attribute14
2265 	 ,p_ATTRIBUTE15               =>  p_ctr_rdg_rec.attribute15
2266 	 ,p_ATTRIBUTE16               =>  p_ctr_rdg_rec.attribute16
2267 	 ,p_ATTRIBUTE17               =>  p_ctr_rdg_rec.attribute17
2268 	 ,p_ATTRIBUTE18               =>  p_ctr_rdg_rec.attribute18
2269 	 ,p_ATTRIBUTE19               =>  p_ctr_rdg_rec.attribute19
2270 	 ,p_ATTRIBUTE20               =>  p_ctr_rdg_rec.attribute20
2271 	 ,p_ATTRIBUTE21               =>  p_ctr_rdg_rec.attribute21
2272 	 ,p_ATTRIBUTE22               =>  p_ctr_rdg_rec.attribute22
2273 	 ,p_ATTRIBUTE23               =>  p_ctr_rdg_rec.attribute23
2274 	 ,p_ATTRIBUTE24               =>  p_ctr_rdg_rec.attribute24
2275 	 ,p_ATTRIBUTE25               =>  p_ctr_rdg_rec.attribute25
2276 	 ,p_ATTRIBUTE26               =>  p_ctr_rdg_rec.attribute26
2277 	 ,p_ATTRIBUTE27               =>  p_ctr_rdg_rec.attribute27
2278 	 ,p_ATTRIBUTE28               =>  p_ctr_rdg_rec.attribute28
2279 	 ,p_ATTRIBUTE29               =>  p_ctr_rdg_rec.attribute29
2280 	 ,p_ATTRIBUTE30               =>  p_ctr_rdg_rec.attribute30
2281 	 ,p_ATTRIBUTE_CATEGORY        =>  p_ctr_rdg_rec.attribute_category
2282 	 ,p_MIGRATED_FLAG             =>  'N'
2283 	 ,p_COMMENTS                  =>  p_ctr_rdg_rec.comments
2284 	 ,p_LIFE_TO_DATE_READING      =>  p_ctr_rdg_rec.life_to_date_reading
2285 	 ,p_TRANSACTION_ID            =>  p_txn_rec.transaction_id
2286 	 ,p_AUTOMATIC_ROLLOVER_FLAG   =>  p_ctr_rdg_rec.automatic_rollover_flag
2287 	 ,p_INCLUDE_TARGET_RESETS     =>  NULL
2288 	 ,p_SOURCE_COUNTER_VALUE_ID   =>  NULL
2289 	 ,p_NET_READING               =>  p_ctr_rdg_rec.net_reading
2290 	 ,p_DISABLED_FLAG             =>  'N'
2291 	 ,p_SOURCE_CODE               =>  p_ctr_rdg_rec.source_code
2292 	 ,p_SOURCE_LINE_ID            =>  p_ctr_rdg_rec.source_line_id
2293 	 ,p_INITIAL_READING_FLAG      =>  p_ctr_rdg_rec.initial_reading_flag
2294        );
2295 
2296        --Add call to CSI_COUNTER_PVT.update_ctr_val_max_seq_no
2297        --for bug 7374316
2298         CSI_COUNTER_PVT.update_ctr_val_max_seq_no(
2299             p_api_version           =>  1.0
2300 			,p_commit                =>  fnd_api.g_false
2301 			,p_init_msg_list         =>  fnd_api.g_true
2302 			,p_validation_level      =>  fnd_api.g_valid_level_full
2303             ,p_counter_id            =>  p_ctr_rdg_rec.counter_id
2304             ,px_ctr_val_max_seq_no   =>  p_ctr_rdg_rec.counter_value_id
2305             ,x_return_status         =>  x_return_status
2306 			,x_msg_count             =>  x_msg_count
2307 			,x_msg_data              =>  x_msg_data
2308          );
2309         IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2310 			IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2311 				csi_ctr_gen_utility_pvt.put_line('ERROR FROM CSI_COUNTER_PVT.update_ctr_val_max_seq_no');
2312 			END IF;          -- 8214848 - dsingire
2313 			l_msg_index := 1;
2314 			l_msg_count := x_msg_count;
2315 			WHILE l_msg_count > 0 LOOP
2316 				x_msg_data := FND_MSG_PUB.GET
2317 				(  l_msg_index,
2318 				FND_API.G_FALSE
2319 				);
2320 				IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2321 					csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
2322 				END IF;          -- 8214848 - dsingire
2323 				l_msg_index := l_msg_index + 1;
2324 				l_msg_count := l_msg_count - 1;
2325 			END LOOP;
2326 			RAISE FND_API.G_EXC_ERROR;
2327         END IF;
2328     END IF;
2329       --
2330       BEGIN
2331           select 'Y'
2332           into   l_target_ctr_exist
2333           from   CSI_COUNTER_RELATIONSHIPS ccr,
2334                  CSI_COUNTERS_B ccv,
2335                  CSI_COUNTERS_TL cct
2336           where  ccr.source_counter_id = p_ctr_rdg_rec.counter_id
2337           and    ccr.relationship_type_code = 'CONFIGURATION'
2338           and    nvl(ccr.active_start_date,sysdate) <= p_ctr_rdg_rec.value_timestamp
2339           and    nvl(ccr.active_end_date,(sysdate+1)) > p_ctr_rdg_rec.value_timestamp
2340           and    ccv.counter_id = ccr.object_counter_id
2341           and    ccv.counter_id = cct.counter_id
2342           and    cct.language = USERENV('LANG');
2343      EXCEPTION
2344         WHEN NO_DATA_FOUND THEN
2345            l_target_ctr_exist := 'N';
2346         WHEN TOO_MANY_ROWS THEN
2347            l_target_ctr_exist := 'Y';
2348     END;
2349 
2350       --
2351     IF l_target_ctr_exist = 'Y' THEN
2352         -- Exclude Bi-Directional Counters as Target counters won't be defined for them.
2353 		-- Need to Compute Target Counters
2354 		-- For this we need to pass the usage of the current counter based on the current reading
2355 		-- If Reading type is 'ABSOLUTE' then Usage is (Curr Rdg - Prev Rdg)
2356 		-- If Reading type is 'CHANGE' then Usage is (Curr Rdg)
2357 		--
2358 		l_target_ctr_rec := l_temp_ctr_rdg_rec;
2359 		--
2360 		l_target_ctr_rec.counter_value_id := p_ctr_rdg_rec.counter_value_id; -- source_counter_value_id
2361 		l_target_ctr_rec.counter_id := p_ctr_rdg_rec.counter_id;
2362 		l_target_ctr_rec.value_timestamp := p_ctr_rdg_rec.value_timestamp;
2363 		l_target_ctr_rec.adjustment_reading := p_ctr_rdg_rec.adjustment_reading;
2364 		l_target_ctr_rec.adjustment_type := p_ctr_rdg_rec.adjustment_type;
2365 		l_target_ctr_rec.source_code := p_ctr_rdg_rec.source_code;
2366 		l_target_ctr_rec.source_line_id := p_ctr_rdg_rec.source_line_id;
2367         l_target_ctr_rec.comments := p_ctr_rdg_rec.comments;
2368 		--
2369 		IF NVL(p_ctr_rdg_rec.automatic_rollover_flag,'N') = 'Y' THEN
2370 			-- For rollover Usage = curr - prev + roll from - roll to
2371 			--
2372 			-- l_target_ctr_rec.counter_reading := ABS(p_ctr_rdg_rec.counter_reading-nvl(l_prev_ctr_reading,0) + l_rollover_last_rdg - l_rollover_first_rdg);
2373 			l_target_ctr_rec.counter_reading := p_ctr_rdg_rec.counter_reading-nvl(l_prev_ctr_reading,0) + l_rollover_last_rdg - l_rollover_first_rdg;
2374 		ELSE
2375 			IF l_reading_type = 1 THEN
2376 				-- l_target_ctr_rec.counter_reading := ABS(p_ctr_rdg_rec.counter_reading - nvl(l_prev_ctr_reading,0));
2377 				IF l_direction = 'D' THEN
2378 					l_target_ctr_rec.counter_reading := ABS(p_ctr_rdg_rec.counter_reading - nvl(l_prev_ctr_reading,0));
2379 				ELSE
2380 					l_target_ctr_rec.counter_reading := p_ctr_rdg_rec.counter_reading - nvl(l_prev_ctr_reading,0);
2381 				END IF;
2382 			ELSIF l_reading_type = 2 THEN
2383 				-- l_target_ctr_rec.counter_reading := ABS(p_ctr_rdg_rec.counter_reading);
2384 				l_target_ctr_rec.counter_reading := p_ctr_rdg_rec.counter_reading;
2385 			END IF;
2386 		END IF; -- Rollover flag check
2387         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2388 			csi_ctr_gen_utility_pvt.put_line('Target counter reading = '||to_char(l_target_ctr_rec.counter_reading));
2389 			csi_ctr_gen_utility_pvt.put_line('Calling Compute_Target_Counters 1...');
2390         END IF;          -- 8214848 - dsingire
2391 
2392 		--
2393 		-- Call Compute_Target_Counters
2394 		--
2395 
2396 		Compute_Target_Counters
2397 	    (
2398 			p_api_version           =>  1.0
2399 			,p_commit                =>  p_commit
2400 			,p_init_msg_list         =>  p_init_msg_list
2401 			,p_validation_level      =>  p_validation_level
2402 			,p_txn_rec               =>  p_txn_rec
2403 			,p_ctr_rdg_rec           =>  l_target_ctr_rec
2404 			,p_mode                  =>  'CREATE'
2405 			,x_return_status         =>  x_return_status
2406 			,x_msg_count             =>  x_msg_count
2407 			,x_msg_data              =>  x_msg_data
2408 		);
2409 		IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2410 			csi_ctr_gen_utility_pvt.put_line('ERROR FROM Compute_Target_Counters API ');
2411 			l_msg_index := 1;
2412 			l_msg_count := x_msg_count;
2413 			WHILE l_msg_count > 0 LOOP
2414 				x_msg_data := FND_MSG_PUB.GET
2415 				(  l_msg_index,
2416 				FND_API.G_FALSE
2417 				);
2418 				csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
2419 				l_msg_index := l_msg_index + 1;
2420 				l_msg_count := l_msg_count - 1;
2421 			END LOOP;
2422 			RAISE FND_API.G_EXC_ERROR;
2423         END IF;
2424     END IF; -- l_target_ctr_exist check
2425     --
2426     -- Since Bi-Directional counter readings cannot impact Later readings no need to proceed further.
2427     -- Also re-sets are not allowed for such counters
2428     /*IF l_direction = 'B' and l_reading_type = 1 THEN
2429 		Raise Skip_Process;
2430     END IF; */
2431     --
2432     -- Since Automatic rollover has to be the last reading, no need to proceed further
2433     --
2434     IF NVL(p_ctr_rdg_rec.automatic_rollover_flag,'N') = 'Y' THEN
2435         Raise Skip_Process;
2436     END IF;
2437     --
2438     -- Following variables will be set inside the loop
2439     l_previous_rdg := p_ctr_rdg_rec.counter_reading;
2440     l_previous_net := p_ctr_rdg_rec.net_reading;
2441     l_previous_ltd := p_ctr_rdg_rec.life_to_date_reading;
2442     -- For Adjustments or next reading was a reset then
2443     -- adjust the Net Reading of Subsequent readings
2444     -- Re-calculate the formula counters only if the subsequent net reading changes
2445     -- Re-calculate Target counters irrespective of net reading changes.
2446 
2447     IF l_reading_type = 2 OR
2448 		(p_ctr_rdg_rec.adjustment_reading IS NOT NULL AND
2449         p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM AND
2450         p_ctr_rdg_rec.adjustment_reading <> 0) OR
2451         NVL(l_next_reset_mode,'X') = 'SOFT' THEN
2452         -- *
2453         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2454 			csi_ctr_gen_utility_pvt.put_line('Re-calculating target counters');
2455         END IF;          -- 8214848 - dsingire
2456         l_update_loop := TRUE;
2457         FOR later_rdg IN LATER_READINGS_CUR(p_ctr_rdg_rec.counter_id,p_ctr_rdg_rec.value_timestamp)
2458         LOOP
2459 
2460             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2461                 csi_ctr_gen_utility_pvt.put_line('Updating Later Readings for Ctr Value ID : '||to_char(later_rdg.counter_value_id));
2462             END IF;          -- 8214848 - dsingire
2463 
2464             IF NVL(later_rdg.reset_mode,'X') = 'SOFT' THEN
2465                 IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2466                 csi_ctr_gen_utility_pvt.put_line('SOFT and re-calculating net readings');
2467             END IF;          -- 8214848 - dsingire
2468 
2469 			-- added IF for Bug 9148094
2470 
2471 			csi_ctr_gen_utility_pvt.put_line(' Update Net Reading Flag : '||l_update_net_flag);
2472 			IF l_update_net_flag = 'Y' THEN
2473 				UPDATE CSI_COUNTER_READINGS
2474 			    set net_reading = later_rdg.counter_reading, -- l_previous_net
2475 				life_to_date_reading = l_previous_ltd,
2476 				last_update_date = sysdate,
2477 				last_updated_by = l_user_id
2478 				where counter_value_id = later_rdg.counter_value_id;
2479 				l_previous_net := later_rdg.counter_reading;
2480 			ELSE
2481 				UPDATE CSI_COUNTER_READINGS
2482 				set net_reading = l_previous_net,
2483 				life_to_date_reading = l_previous_ltd,
2484 				last_update_date = sysdate,
2485 				last_updated_by = l_user_id
2486 				where counter_value_id = later_rdg.counter_value_id;
2487 			END IF;
2488 
2489          ELSE
2490 
2491 		Calculate_Net_Reading
2492 		  ( p_prev_net_rdg      => l_previous_net
2493 		   ,p_prev_ltd_rdg      => l_previous_ltd
2494 		   ,p_curr_rdg          => later_rdg.counter_reading
2495 		   ,p_prev_rdg          => l_previous_rdg
2496 		   ,p_curr_adj          => later_rdg.adjustment_reading
2497 		   ,p_rdg_type          => l_reading_type
2498                    ,p_direction         => l_direction
2499 		   ,px_net_rdg          => l_net_reading
2500 		   ,px_ltd_rdg          => l_ltd_reading
2501                   ,l_ctr_rdg_rec       => p_ctr_rdg_rec -- added 6398254
2502 		  );
2503 
2504         --Bug 12632134 : Reverted the code changes done for bug 9555599
2505         --As l_update_net_flag is only for reset cases and this code is in else part of reset case.
2506 
2507         UPDATE CSI_COUNTER_READINGS
2508         set net_reading = l_net_reading,
2509         life_to_date_reading = l_ltd_reading,
2510         last_update_date = sysdate,
2511         last_updated_by = l_user_id
2512         where counter_value_id = later_rdg.counter_value_id;
2513 
2514         l_previous_net := l_net_reading;
2515         l_previous_ltd := l_ltd_reading;
2516 
2517 /* commented for bug 12632134
2518 		IF l_update_net_flag = 'Y' THEN
2519 				UPDATE CSI_COUNTER_READINGS
2520 			    set net_reading = later_rdg.counter_reading, -- l_previous_net
2521 				life_to_date_reading = l_previous_ltd,
2522 				last_update_date = sysdate,
2523 				last_updated_by = l_user_id
2524 				where counter_value_id = later_rdg.counter_value_id;
2525 				l_previous_net := later_rdg.counter_reading;
2526 		ELSE
2527 				UPDATE CSI_COUNTER_READINGS
2528 				set net_reading = l_previous_net,
2529 				life_to_date_reading = l_previous_ltd,
2530 				last_update_date = sysdate,
2531 				last_updated_by = l_user_id
2532 				where counter_value_id = later_rdg.counter_value_id;
2533 		END IF;
2534 
2535         --l_previous_net := l_net_reading;
2536         --l_previous_ltd := l_ltd_reading;
2537 */ -- end of changes for bug 12632134
2538     END IF;
2539             --
2540             --
2541             -- Re-calculate Compute Target Counters
2542             -- For Resets which did not include Targets before, no need to Re-compute
2543             --
2544             IF later_rdg.reset_mode IS NULL OR
2545               (later_rdg.reset_mode IS NOT NULL AND NVL(later_rdg.include_target_resets,'N') = 'Y') THEN
2546 	       l_target_ctr_rec := l_temp_ctr_rdg_rec;
2547 	       --
2548 	       l_target_ctr_rec.counter_value_id := later_rdg.counter_value_id; -- source_counter_value_id
2549 	       l_target_ctr_rec.counter_id := p_ctr_rdg_rec.counter_id;
2550 	       l_target_ctr_rec.value_timestamp := later_rdg.value_timestamp;
2551 	       l_target_ctr_rec.adjustment_reading := later_rdg.adjustment_reading;
2552 	       l_target_ctr_rec.adjustment_type := later_rdg.adjustment_type;
2553 	       l_target_ctr_rec.comments := later_rdg.comments;
2554 	       --
2555 	       IF later_rdg.reset_mode IS NOT NULL AND NVL(later_rdg.include_target_resets,'N') = 'Y' THEN
2556 		  -- l_target_ctr_rec.counter_reading := ABS(later_rdg.counter_reading);
2557 		  l_target_ctr_rec.counter_reading := later_rdg.counter_reading;
2558 	       ELSE
2559 		  IF l_reading_type = 1 THEN
2560 		     -- l_target_ctr_rec.counter_reading := ABS(later_rdg.counter_reading - nvl(l_previous_rdg,0));
2561 		     l_target_ctr_rec.counter_reading := later_rdg.counter_reading - nvl(l_previous_rdg,0);
2562 		  ELSIF l_reading_type = 2 THEN
2563 		     -- l_target_ctr_rec.counter_reading := ABS(later_rdg.counter_reading);
2564 		     l_target_ctr_rec.counter_reading := later_rdg.counter_reading;
2565 		  END IF;
2566 	       END IF;
2567                IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2568                 csi_ctr_gen_utility_pvt.put_line('Calling Compute_Target_Counters for Update ...');
2569                END IF;          -- 8214848 - dsingire
2570 	       Compute_Target_Counters
2571 		  (
2572 		    p_api_version           =>  1.0
2573 		   ,p_commit                =>  p_commit
2574 		   ,p_init_msg_list         =>  p_init_msg_list
2575 		   ,p_validation_level      =>  p_validation_level
2576 		   ,p_txn_rec               =>  p_txn_rec
2577 		   ,p_ctr_rdg_rec           =>  l_target_ctr_rec
2578 		   ,p_mode                  =>  'UPDATE'
2579 		   ,x_return_status         =>  x_return_status
2580 		   ,x_msg_count             =>  x_msg_count
2581 		   ,x_msg_data              =>  x_msg_data
2582 		 );
2583 	       IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2584 		  csi_ctr_gen_utility_pvt.put_line('ERROR FROM Compute_Target_Counters API ');
2585 		  l_msg_index := 1;
2586 		  l_msg_count := x_msg_count;
2587 		  WHILE l_msg_count > 0 LOOP
2588 		     x_msg_data := FND_MSG_PUB.GET
2589 		     (  l_msg_index,
2590 			FND_API.G_FALSE
2591 		     );
2592 		     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
2593 		     l_msg_index := l_msg_index + 1;
2594 		     l_msg_count := l_msg_count - 1;
2595 		  END LOOP;
2596 		  RAISE FND_API.G_EXC_ERROR;
2597 	       END IF;
2598             END IF;  -- End of Target counter call check
2599 	    --
2600             l_previous_rdg := later_rdg.counter_reading;
2601          END LOOP; -- Later Readings loop
2602       END IF; -- Condition to loop thru' later readings
2603       --
2604       -- If the above loop was not executed then to re-calculate the Traget counters we loop thru'
2605       -- This is because target counter readings could change even if the net reading did not change.
2606       --
2607       l_previous_rdg := p_ctr_rdg_rec.counter_reading;
2608       --
2609       IF NOT l_update_loop THEN
2610          FOR later_rdg IN LATER_READINGS_CUR(p_ctr_rdg_rec.counter_id,p_ctr_rdg_rec.value_timestamp)
2611          LOOP
2612               IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2613               csi_ctr_gen_utility_pvt.put_line('6398254: If not update_loop');
2614               END IF;          -- 8214848 - dsingire
2615             -- Re-calculate Compute Target Counters
2616             -- For Resets which did not include Targets before, no need to Re-compute
2617             --
2618             IF later_rdg.reset_mode IS NULL OR
2619               (later_rdg.reset_mode IS NOT NULL AND NVL(later_rdg.include_target_resets,'N') = 'Y') THEN
2620 	       l_target_ctr_rec := l_temp_ctr_rdg_rec;
2621 	       --
2622 	       l_target_ctr_rec.counter_value_id := later_rdg.counter_value_id; -- source_counter_value_id
2623 	       l_target_ctr_rec.counter_id := p_ctr_rdg_rec.counter_id;
2624 	       l_target_ctr_rec.value_timestamp := later_rdg.value_timestamp;
2625 	       l_target_ctr_rec.adjustment_reading := later_rdg.adjustment_reading;
2626 	       l_target_ctr_rec.adjustment_type := later_rdg.adjustment_type;
2627 	       l_target_ctr_rec.comments := later_rdg.comments;
2628 	       --
2629 	       IF later_rdg.reset_mode IS NOT NULL AND NVL(later_rdg.include_target_resets,'N') = 'Y' THEN
2630 		  -- l_target_ctr_rec.counter_reading := ABS(later_rdg.counter_reading);
2631 		  l_target_ctr_rec.counter_reading := later_rdg.counter_reading;
2632 	       ELSE
2633 		  IF l_reading_type = 1 THEN
2634 		     -- l_target_ctr_rec.counter_reading := ABS(later_rdg.counter_reading - nvl(l_previous_rdg,0));
2635 		     l_target_ctr_rec.counter_reading := later_rdg.counter_reading - nvl(l_previous_rdg,0);
2636 		  ELSIF l_reading_type = 2 THEN
2637 		     -- l_target_ctr_rec.counter_reading := ABS(later_rdg.counter_reading);
2638 		     l_target_ctr_rec.counter_reading := later_rdg.counter_reading;
2639 		  END IF;
2640 	       END IF;
2641 	       IF l_reading_type <> 1 THEN             -- Added for bug 14155070
2642                IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2643                csi_ctr_gen_utility_pvt.put_line('Calling Compute_Target_Counters for Update 2...');
2644                END IF;          -- 8214848 - dsingire
2645 	       Compute_Target_Counters
2646 		  (
2647 		    p_api_version           =>  1.0
2648 		   ,p_commit                =>  p_commit
2649 		   ,p_init_msg_list         =>  p_init_msg_list
2650 		   ,p_validation_level      =>  p_validation_level
2651 		   ,p_txn_rec               =>  p_txn_rec
2652 		   ,p_ctr_rdg_rec           =>  l_target_ctr_rec
2653 		   ,p_mode                  =>  'UPDATE'
2654 		   ,x_return_status         =>  x_return_status
2655 		   ,x_msg_count             =>  x_msg_count
2656 		   ,x_msg_data              =>  x_msg_data
2657 		 );
2658 	       IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2659 		  csi_ctr_gen_utility_pvt.put_line('ERROR FROM Compute_Target_Counters API ');
2660 		  l_msg_index := 1;
2661 		  l_msg_count := x_msg_count;
2662 		  WHILE l_msg_count > 0 LOOP
2663 		     x_msg_data := FND_MSG_PUB.GET
2664 		     (  l_msg_index,
2665 			FND_API.G_FALSE
2666 		     );
2667 		     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
2668 		     l_msg_index := l_msg_index + 1;
2669 		     l_msg_count := l_msg_count - 1;
2670 		  END LOOP;
2671 		  RAISE FND_API.G_EXC_ERROR;
2672 	       END IF;
2673 	       END IF;             -- Added for bug 14155070
2674             END IF;  -- End of Target counter call check
2675 	    --
2676             l_previous_rdg := later_rdg.counter_reading;
2677          END LOOP;
2678       END IF; -- l_update_loop check
2679    END IF; -- Current counter reading not null check
2680    --
2681 
2682    IF NVL(p_ctr_rdg_rec.reset_mode,FND_API.G_MISS_CHAR) = 'SOFT' THEN
2683       -- Introduce a delay. Basically, value_timestamp of reset should be slightly > than the curr Reading
2684       -- For Reset Mode insert a separate record in CSI_COUNTER_READINGS with the Reset counter reading.
2685       -- Net and LTD readings are from the previous counter reading.
2686       -- If only Reset is performed then no need to introduce the delay.
2687       --
2688       l_reset_rdg_rec := l_temp_ctr_rdg_rec;
2689       --
2690 
2691       IF NVL(p_ctr_rdg_rec.counter_reading,FND_API.G_MISS_NUM) <> FND_API.G_MISS_NUM
2692       AND (p_ctr_rdg_rec.counter_reading <> p_ctr_rdg_rec.reset_counter_reading) THEN
2693          l_reset_timestamp := p_ctr_rdg_rec.value_timestamp + (1/(24*60*60)); -- Add 1 Sec
2694       ELSE -- Only Reset is performed
2695 	 l_reset_timestamp := p_ctr_rdg_rec.value_timestamp;
2696       END IF;
2697       --
2698       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2699       csi_ctr_gen_utility_pvt.put_line('Reset Timestamp is : '||to_char(l_reset_timestamp,'DD-MON-YYYY HH24:MI:SS'));
2700       END IF;          -- 8214848 - dsingire
2701 
2702       --
2703       l_reset_rdg_rec.counter_id := p_ctr_rdg_rec.counter_id;
2704       l_reset_rdg_rec.value_timestamp := l_reset_timestamp;
2705       l_reset_rdg_rec.counter_reading := p_ctr_rdg_rec.reset_counter_reading;
2706       l_reset_rdg_rec.source_code := p_ctr_rdg_rec.source_code;
2707       l_reset_rdg_rec.source_line_id := p_ctr_rdg_rec.source_line_id;
2708       l_reset_rdg_rec.reset_mode := p_ctr_rdg_rec.reset_mode;
2709       l_reset_rdg_rec.reset_reason := p_ctr_rdg_rec.reset_reason;
2710       --
2711       -- If counter reading had been captured along with the reset then net and ltd would take the
2712       -- calculated values stored in p_ctr_rdg_rec. Otherwise, use the previous values.
2713       --
2714 	  IF NVL(p_ctr_rdg_rec.net_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
2715 		 -- added IF for Bug 9148094
2716 			csi_ctr_gen_utility_pvt.put_line(' Update Net Reading Flag : '||l_update_net_flag);
2717 			IF l_update_net_flag = 'Y' THEN
2718 				l_reset_rdg_rec.net_reading := p_ctr_rdg_rec.reset_counter_reading;
2719 			ELSE
2720 				l_reset_rdg_rec.net_reading := l_prev_net_reading;
2721 			END IF;
2722       ELSE
2723 			IF l_update_net_flag = 'Y' THEN
2724 				l_reset_rdg_rec.net_reading := p_ctr_rdg_rec.reset_counter_reading;
2725 			ELSE
2726 				l_reset_rdg_rec.net_reading := p_ctr_rdg_rec.net_reading;
2727 			END IF;
2728       END IF;
2729       IF NVL(p_ctr_rdg_rec.life_to_date_reading,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
2730          l_reset_rdg_rec.life_to_date_reading := l_prev_ltd_reading;
2731       ELSE
2732          l_reset_rdg_rec.life_to_date_reading := p_ctr_rdg_rec.life_to_date_reading;
2733       END IF;
2734       --
2735       -- Generate the Value_id
2736       l_process_flag := TRUE;
2737       WHILE l_process_flag LOOP
2738          select CSI_COUNTER_READINGS_S.nextval
2739          into l_reset_rdg_rec.counter_value_id from dual;
2740          IF NOT Counter_Value_Exists(l_reset_rdg_rec.counter_value_id) THEN
2741             l_process_flag := FALSE;
2742          END IF;
2743       END LOOP;
2744       --
2745       -- If only Reset is captured then we need to pass the reset counter value_id to p_ctr_rdg_rec
2746       --
2747       IF NVL(p_ctr_rdg_rec.counter_value_id,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
2748          p_ctr_rdg_rec.counter_value_id := l_reset_rdg_rec.counter_value_id;
2749       END IF;
2750       -- Call the Table Handler to insert the Reset Reading into CSI_COUNTER_READINGS
2751       --
2752       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2753       csi_ctr_gen_utility_pvt.put_line('Inserting Reset Record with Ctr Value ID '||to_char(l_reset_rdg_rec.counter_value_id));
2754       END IF;          -- 8214848 - dsingire
2755 
2756       --
2757       CSI_COUNTER_READINGS_PKG.Insert_Row(
2758 	  px_COUNTER_VALUE_ID         =>  l_reset_rdg_rec.counter_value_id
2759 	 ,p_COUNTER_ID                =>  l_reset_rdg_rec.counter_id
2760 	 ,p_VALUE_TIMESTAMP           =>  l_reset_rdg_rec.value_timestamp
2761 	 ,p_COUNTER_READING           =>  l_reset_rdg_rec.counter_reading
2762 	 ,p_RESET_MODE                =>  l_reset_rdg_rec.reset_mode
2763 	 ,p_RESET_REASON              =>  l_reset_rdg_rec.reset_reason
2764 	 ,p_ADJUSTMENT_TYPE           =>  NULL
2765 	 ,p_ADJUSTMENT_READING        =>  NULL
2766 	 ,p_OBJECT_VERSION_NUMBER     =>  1
2767 	 ,p_LAST_UPDATE_DATE          =>  SYSDATE
2768 	 ,p_LAST_UPDATED_BY           =>  l_user_id
2769 	 ,p_CREATION_DATE             =>  SYSDATE
2770 	 ,p_CREATED_BY                =>  l_user_id
2771 	 ,p_LAST_UPDATE_LOGIN         =>  l_conc_login_id
2772 	 ,p_ATTRIBUTE1                =>  l_reset_rdg_rec.attribute1
2773 	 ,p_ATTRIBUTE2                =>  l_reset_rdg_rec.attribute2
2774 	 ,p_ATTRIBUTE3                =>  l_reset_rdg_rec.attribute3
2775 	 ,p_ATTRIBUTE4                =>  l_reset_rdg_rec.attribute4
2776 	 ,p_ATTRIBUTE5                =>  l_reset_rdg_rec.attribute5
2777 	 ,p_ATTRIBUTE6                =>  l_reset_rdg_rec.attribute6
2778 	 ,p_ATTRIBUTE7                =>  l_reset_rdg_rec.attribute7
2779 	 ,p_ATTRIBUTE8                =>  l_reset_rdg_rec.attribute8
2780 	 ,p_ATTRIBUTE9                =>  l_reset_rdg_rec.attribute9
2781 	 ,p_ATTRIBUTE10               =>  l_reset_rdg_rec.attribute10
2782 	 ,p_ATTRIBUTE11               =>  l_reset_rdg_rec.attribute11
2783 	 ,p_ATTRIBUTE12               =>  l_reset_rdg_rec.attribute12
2784 	 ,p_ATTRIBUTE13               =>  l_reset_rdg_rec.attribute13
2785 	 ,p_ATTRIBUTE14               =>  l_reset_rdg_rec.attribute14
2786 	 ,p_ATTRIBUTE15               =>  l_reset_rdg_rec.attribute15
2787 	 ,p_ATTRIBUTE16               =>  l_reset_rdg_rec.attribute16
2788 	 ,p_ATTRIBUTE17               =>  l_reset_rdg_rec.attribute17
2789 	 ,p_ATTRIBUTE18               =>  l_reset_rdg_rec.attribute18
2790 	 ,p_ATTRIBUTE19               =>  l_reset_rdg_rec.attribute19
2791 	 ,p_ATTRIBUTE20               =>  l_reset_rdg_rec.attribute20
2792 	 ,p_ATTRIBUTE21               =>  l_reset_rdg_rec.attribute21
2793 	 ,p_ATTRIBUTE22               =>  l_reset_rdg_rec.attribute22
2794 	 ,p_ATTRIBUTE23               =>  l_reset_rdg_rec.attribute23
2795 	 ,p_ATTRIBUTE24               =>  l_reset_rdg_rec.attribute24
2796 	 ,p_ATTRIBUTE25               =>  l_reset_rdg_rec.attribute25
2797 	 ,p_ATTRIBUTE26               =>  l_reset_rdg_rec.attribute26
2798 	 ,p_ATTRIBUTE27               =>  l_reset_rdg_rec.attribute27
2799 	 ,p_ATTRIBUTE28               =>  l_reset_rdg_rec.attribute28
2800 	 ,p_ATTRIBUTE29               =>  l_reset_rdg_rec.attribute29
2801 	 ,p_ATTRIBUTE30               =>  l_reset_rdg_rec.attribute30
2802 	 ,p_ATTRIBUTE_CATEGORY        =>  l_reset_rdg_rec.attribute_category
2803 	 ,p_MIGRATED_FLAG             =>  'N'
2804 	 ,p_COMMENTS                  =>  l_reset_rdg_rec.comments
2805 	 ,p_LIFE_TO_DATE_READING      =>  l_reset_rdg_rec.life_to_date_reading
2806 	 ,p_TRANSACTION_ID            =>  p_txn_rec.transaction_id
2807 	 ,p_AUTOMATIC_ROLLOVER_FLAG   =>  l_reset_rdg_rec.automatic_rollover_flag
2808 	 ,p_INCLUDE_TARGET_RESETS     =>  p_ctr_rdg_rec.include_target_resets
2809 	 ,p_SOURCE_COUNTER_VALUE_ID   =>  NULL
2810 	 ,p_NET_READING               =>  l_reset_rdg_rec.net_reading
2811 	 ,p_DISABLED_FLAG             =>  'N'
2812 	 ,p_SOURCE_CODE               =>  l_reset_rdg_rec.source_code
2813 	 ,p_SOURCE_LINE_ID            =>  l_reset_rdg_rec.source_line_id
2814 	 ,p_INITIAL_READING_FLAG      =>  l_reset_rdg_rec.initial_reading_flag
2815        );
2816 
2817        --Add call to CSI_COUNTER_PVT.update_ctr_val_max_seq_no
2818        --for bug 7374316
2819        CSI_COUNTER_PVT.update_ctr_val_max_seq_no(
2820            p_api_version           =>  1.0
2821 	  ,p_commit                =>  fnd_api.g_false
2822 	  ,p_init_msg_list         =>  fnd_api.g_true
2823 	  ,p_validation_level      =>  fnd_api.g_valid_level_full
2824           ,p_counter_id            =>  l_reset_rdg_rec.counter_id
2825           ,px_ctr_val_max_seq_no   =>  l_reset_rdg_rec.counter_value_id
2826           ,x_return_status         =>  x_return_status
2827 	  ,x_msg_count             =>  x_msg_count
2828 	  ,x_msg_data              =>  x_msg_data
2829         );
2830         IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2831 	    csi_ctr_gen_utility_pvt.put_line('ERROR FROM CSI_COUNTER_PVT.update_ctr_val_max_seq_no');
2832 	    l_msg_index := 1;
2833 	    l_msg_count := x_msg_count;
2834 	    WHILE l_msg_count > 0 LOOP
2835 	       x_msg_data := FND_MSG_PUB.GET
2836 	       (  l_msg_index,
2837 		  FND_API.G_FALSE
2838 	       );
2839 	       csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
2840 	       l_msg_index := l_msg_index + 1;
2841 	       l_msg_count := l_msg_count - 1;
2842 	    END LOOP;
2843 	    RAISE FND_API.G_EXC_ERROR;
2844         END IF;
2845      --   END IF;
2846       --
2847       --
2848       -- Compute Target counters if Include Target flag is checked
2849       IF NVL(p_ctr_rdg_rec.include_target_resets,'N') = 'Y' THEN
2850 	 -- Re-calculate Compute Target Counters
2851 	 l_target_ctr_rec := l_temp_ctr_rdg_rec;
2852 	 --
2853 	 l_target_ctr_rec.counter_value_id := l_reset_rdg_rec.counter_value_id; -- source_counter_value_id
2854 	 l_target_ctr_rec.counter_id := l_reset_rdg_rec.counter_id;
2855 	 l_target_ctr_rec.value_timestamp := l_reset_rdg_rec.value_timestamp;
2856 	 l_target_ctr_rec.counter_reading := l_reset_rdg_rec.counter_reading;
2857          l_target_ctr_rec.source_code := l_reset_rdg_rec.source_code;
2858          l_target_ctr_rec.source_line_id := l_reset_rdg_rec.source_line_id;
2859          l_target_ctr_rec.reset_mode := l_reset_rdg_rec.reset_mode;
2860          l_target_ctr_rec.reset_reason := l_reset_rdg_rec.reset_reason;
2861          l_target_ctr_rec.comments := l_reset_rdg_rec.comments;
2862 	 --
2863 	  -- added 6398254
2864         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
2865          csi_ctr_gen_utility_pvt.put_line('6398254: l_reset_rdg_rec.reset_reason' || l_reset_rdg_rec.reset_reason);
2866          csi_ctr_gen_utility_pvt.put_line('Calling Reset_Target_Counters 1...');
2867         END IF;          -- 8214848 - dsingire
2868 	 -- Call Re-Compute Target Counters
2869 	 Reset_Target_Counters
2870 	    (
2871 	      p_txn_rec               =>  p_txn_rec
2872 	     ,p_ctr_rdg_rec           =>  l_target_ctr_rec
2873 	     ,x_return_status         =>  x_return_status
2874              ,x_msg_count             =>  x_msg_count
2875              ,x_msg_data              =>  x_msg_data
2876 	   );
2877 	 IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
2878 	    csi_ctr_gen_utility_pvt.put_line('ERROR FROM Reset_Target_Counters API ');
2879 	    l_msg_index := 1;
2880 	    l_msg_count := x_msg_count;
2881 	    WHILE l_msg_count > 0 LOOP
2882 	       x_msg_data := FND_MSG_PUB.GET
2883 	       (  l_msg_index,
2884 		  FND_API.G_FALSE
2885 	       );
2886 	       csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
2887 	       l_msg_index := l_msg_index + 1;
2888 	       l_msg_count := l_msg_count - 1;
2889 	    END LOOP;
2890 	    RAISE FND_API.G_EXC_ERROR;
2891 	 END IF;
2892       END IF; -- Include Target Resets check
2893       --
2894       -- No need to compute Derived Filters for SOFT reset as it has the same net reading
2895       -- as the previous counter reading.
2896    END IF; -- Reset Mode check
2897    --
2898    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
2899       COMMIT WORK;
2900    END IF;
2901    --
2902    -- Standard call to get message count and IF count is  get message info.
2903    FND_MSG_PUB.Count_And_Get
2904       ( p_count  =>  x_msg_count,
2905         p_data   =>  x_msg_data
2906       );
2907 EXCEPTION
2908    WHEN Skip_Process THEN
2909       x_return_status := FND_API.G_RET_STS_SUCCESS;
2910       FND_MSG_PUB.Count_And_Get
2911          ( p_count  =>  x_msg_count,
2912            p_data   =>  x_msg_data
2913          );
2914    WHEN FND_API.G_EXC_ERROR THEN
2915       x_return_status := FND_API.G_RET_STS_ERROR ;
2916       ROLLBACK TO capture_counter_reading_pvt;
2917       FND_MSG_PUB.Count_And_Get
2918          ( p_count => x_msg_count,
2919            p_data  => x_msg_data
2920          );
2921    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2922       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2923       ROLLBACK TO capture_counter_reading_pvt;
2924       FND_MSG_PUB.Count_And_Get
2925          ( p_count => x_msg_count,
2926            p_data  => x_msg_data
2927          );
2928    WHEN OTHERS THEN
2929       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2930       ROLLBACK TO capture_counter_reading_pvt;
2931       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2932          FND_MSG_PUB.Add_Exc_Msg
2933             ( G_PKG_NAME,
2934               l_api_name
2935             );
2936       END IF;
2937       FND_MSG_PUB.Count_And_Get
2938          ( p_count  => x_msg_count,
2939            p_data   => x_msg_data
2940          );
2941 END Capture_Counter_Reading;
2942 --
2943 PROCEDURE Compute_Formula_Counters
2944    (
2945      p_api_version           IN     NUMBER
2946     ,p_commit                IN     VARCHAR2
2947     ,p_init_msg_list         IN     VARCHAR2
2948     ,p_validation_level      IN     NUMBER
2949     ,p_txn_rec               IN OUT NOCOPY csi_datastructures_pub.transaction_rec
2950     ,p_ctr_rdg_rec           IN     csi_ctr_datastructures_pub.counter_readings_rec
2951     ,x_return_status         OUT    NOCOPY VARCHAR2
2952     ,x_msg_count             OUT    NOCOPY NUMBER
2953     ,x_msg_data              OUT    NOCOPY VARCHAR2
2954  )
2955 IS
2956    l_api_name                      CONSTANT VARCHAR2(30)   := 'COMPUTE_FORMULA_COUNTERS';
2957    l_api_version                   CONSTANT NUMBER         := 1.0;
2958    l_msg_data                      VARCHAR2(2000);
2959    l_msg_index                     NUMBER;
2960    l_msg_count                     NUMBER;
2961    l_rel_type                      VARCHAR2(30) := 'FORMULA';
2962    l_formula_text                  CSI_COUNTERS_B.formula_text%TYPE;
2963    l_cursor_handle                 INTEGER;  --Dynamic SQL cursor handler
2964    l_n_temp                        INTEGER;
2965    l_counter_reading               NUMBER;
2966    l_bind_var_value                NUMBER;
2967    l_bind_var_name                 VARCHAR2(255);
2968    l_other_src_captured            VARCHAR2(1);
2969    l_disabled_flag                 VARCHAR2(1);
2970    l_exists                        VARCHAR2(1);
2971    l_ctr_value_id                  NUMBER;
2972    l_process_flag                  BOOLEAN;
2973    l_mode                          VARCHAR2(30);
2974    Process_Next                    EXCEPTION;
2975    l_debug_level       NUMBER;    -- 8214848 - dsingire
2976    l_user_id 				  NUMBER := fnd_global.user_id;        -- 8214848 - dsingire
2977    l_conc_login_id		NUMBER := fnd_global.conc_login_id;  -- 8214848 - dsingire
2978    l_ctr_val_max                 NUMBER := -1;
2979    l_net_reading_bind            NUMBER;
2980    l_value_max_timestamp         DATE;
2981    l_net_max_reading             NUMBER;
2982 
2983    --
2984    TYPE source_ctr_rec IS RECORD
2985      ( source_counter_id     NUMBER,
2986        bind_variable_name    VARCHAR2(255)
2987      );
2988    TYPE source_ctr_tbl IS TABLE OF source_ctr_rec INDEX BY BINARY_INTEGER;
2989    --
2990    l_src_ctr_tbl                  source_ctr_tbl;
2991    l_src_count                    NUMBER := 0;
2992    l_tmp_ctr_value_id             NUMBER;
2993    --
2994    CURSOR OBJECT_CTR_CUR(p_src_ctr_id IN NUMBER) IS
2995    select distinct object_counter_id
2996    from csi_counter_relationships
2997    where source_counter_id = p_src_ctr_id
2998    and   relationship_type_code = l_rel_type
2999    and   nvl(active_end_date,(sysdate+1)) > sysdate;
3000    --
3001    CURSOR SOURCE_CTR_CUR(p_obj_ctr_id IN NUMBER) IS
3002    select source_counter_id,bind_variable_name
3003    from csi_counter_relationships
3004    where object_counter_id = p_obj_ctr_id
3005    and   relationship_type_code = l_rel_type
3006    and   nvl(active_end_date,(sysdate+1)) > sysdate;
3007    --
3008    CURSOR GET_NET_RDG_CUR(p_counter_id IN NUMBER,p_value_timestamp IN DATE) IS
3009    select net_reading
3010    from CSI_COUNTER_READINGS
3011    where counter_id = p_counter_id
3012    and   nvl(disabled_flag,'N') = 'N'
3013    and   value_timestamp <= p_value_timestamp
3014    ORDER BY value_timestamp desc;
3015    --,counter_value_id desc;
3016    --
3017    CURSOR LATER_FORMULA_CUR(p_obj_ctr_id IN NUMBER,p_value_timestamp IN DATE) IS
3018    select counter_value_id,value_timestamp
3019    from CSI_COUNTER_READINGS
3020    where counter_id = p_obj_ctr_id
3021    and   value_timestamp > p_value_timestamp
3022    and   nvl(disabled_flag,'N') = 'N'
3023    ORDER BY value_timestamp desc, counter_value_id desc;
3024 BEGIN
3025    -- Standard Start of API savepoint
3026    SAVEPOINT  compute_formula_counters;
3027    -- Standard call to check for call compatibility.
3028    IF NOT FND_API.Compatible_API_Call (l_api_version,
3029                                        p_api_version,
3030                                        l_api_name   ,
3031                                        G_PKG_NAME   ) THEN
3032       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3033    END IF;
3034    -- Initialize message list if p_init_msg_list is set to TRUE.
3035    IF FND_API.to_Boolean(nvl(p_init_msg_list,FND_API.G_FALSE)) THEN
3036       FND_MSG_PUB.initialize;
3037    END IF;
3038    --  Initialize API return status to success
3039    x_return_status := FND_API.G_RET_STS_SUCCESS;
3040 
3041    -- Read the debug profiles values in to global variable 7197402
3042    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
3043 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
3044 	  END IF;                      -- 8214848 - dsingire
3045 
3046     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
3047    --
3048    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
3049     csi_ctr_gen_utility_pvt.put_line( 'compute_formula_counters'                  ||'-'||
3050                                   p_api_version                              ||'-'||
3051                                   nvl(p_commit,FND_API.G_FALSE)              ||'-'||
3052                                   nvl(p_init_msg_list,FND_API.G_FALSE)       ||'-'||
3053                                   nvl(p_validation_level,FND_API.G_VALID_LEVEL_FULL) );
3054     csi_ctr_gen_utility_pvt.dump_counter_readings_rec(p_ctr_rdg_rec);
3055    END IF;          -- 8214848 - dsingire
3056    --
3057 
3058    --
3059    IF p_txn_rec.transaction_type_id in (88,91,92,94,95) THEN
3060       l_mode := 'Meter';
3061    ELSE
3062       l_mode := 'Counter';
3063    END IF;
3064    --
3065    IF p_ctr_rdg_rec.counter_id IS NULL OR
3066       p_ctr_rdg_rec.counter_id = FND_API.G_MISS_NUM THEN
3067       csi_ctr_gen_utility_pvt.ExitWithErrMsg
3068         ( p_msg_name    => 'CSI_API_CTR_INVALID',
3069           p_token1_name => 'MODE',
3070           p_token1_val  => l_mode
3071         );
3072    END IF;
3073    --
3074    IF p_ctr_rdg_rec.disabled_flag IS NULL OR
3075       p_ctr_rdg_rec.disabled_flag = FND_API.G_MISS_CHAR THEN
3076       l_disabled_flag := 'N';
3077    ELSE
3078       l_disabled_flag := p_ctr_rdg_rec.disabled_flag;
3079    END IF;
3080    --
3081    FOR obj_cur IN OBJECT_CTR_CUR(p_ctr_rdg_rec.counter_id) LOOP
3082       Begin
3083          l_formula_text := NULL;
3084 	 Begin
3085 	    select formula_text
3086 	    into l_formula_text
3087 	    from CSI_COUNTERS_B -- Need to be changed
3088 	    where counter_id = obj_cur.object_counter_id
3089 	    and   nvl(end_date_active,(sysdate+1)) > sysdate;
3090 	 Exception
3091 	    when no_data_found then
3092 	       RAISE Process_Next;
3093 	 End;
3094 	 --
3095 	 l_cursor_handle := dbms_sql.open_cursor;
3096 	 l_formula_text := 'SELECT '||l_formula_text||' FROM DUAL';
3097 	 --
3098 	 Begin
3099 	    DBMS_SQL.PARSE(l_cursor_handle, l_formula_text, dbms_sql.native);
3100 	 Exception
3101 	    when others then
3102 	       csi_ctr_gen_utility_pvt.ExitWithErrMsg
3103 		       ( p_msg_name     => 'CSI_API_CTR_FORMULA_DEF_INV',
3104 			 p_token1_name  => 'FMLA_TEXT',
3105 			 p_token1_val   => l_formula_text
3106 		       );
3107 	 End;
3108 	 --
3109 	 DBMS_SQL.DEFINE_COLUMN(l_cursor_handle,1,l_counter_reading);
3110 	 --
3111 	 l_src_count := 0;
3112 	 l_src_ctr_tbl.DELETE;
3113 	 -- l_src_ctr_bl will be used when we re-calculate the later readings of this formula counter
3114 	 -- as the set of source counters remain same
3115 	 --
3116 	 -- For each source_counter, get the bind_variable_name and the net reading
3117          l_other_src_captured := 'F';
3118          --
3119 	 FOR sub_cur IN SOURCE_CTR_CUR(obj_cur.object_counter_id) LOOP
3120             -- Check whether the other source counters are read for the same timestamp.
3121             -- If so, then we can't disable the formula counter reading. We use the calculated net rdg.
3122             -- If the other source counters are not read then we can disable the formula counter reading.
3123             IF NVL(p_ctr_rdg_rec.disabled_flag,'N') = 'Y' AND
3124                sub_cur.source_counter_id <> p_ctr_rdg_rec.counter_id AND
3125                l_other_src_captured <> 'T' THEN
3126                Begin
3127                   select '1'
3128                   into l_exists from dual
3129                   where exists (select 'x'
3130                                 from CSI_COUNTER_READINGS
3131                                 where counter_id = sub_cur.source_counter_id
3132                                 and   value_timestamp = p_ctr_rdg_rec.value_timestamp
3133                                 and   nvl(disabled_flag,'N') <> 'Y');
3134                   l_other_src_captured := 'T';
3135                Exception
3136                   when no_data_found then
3137                      null;
3138                End;
3139             END IF;
3140             --
3141 	    l_bind_var_name := ':'||ltrim(sub_cur.bind_variable_name);
3142 	    l_src_count := l_src_count + 1;
3143 	    l_src_ctr_tbl(l_src_count).source_counter_id := sub_cur.source_counter_id;
3144 	    l_src_ctr_tbl(l_src_count).bind_variable_name := sub_cur.bind_variable_name;
3145 	    --
3146             l_bind_var_value := NULL;
3147             --
3148       -- Bug 9230940
3149       /*OPEN GET_NET_RDG_CUR(sub_cur.source_counter_id,p_ctr_rdg_rec.value_timestamp);
3150 	    FETCH GET_NET_RDG_CUR INTO l_bind_var_value;
3151 	    CLOSE GET_NET_RDG_CUR;
3152       */
3153       BEGIN
3154       SELECT CTR_VAL_MAX_SEQ_NO INTO l_ctr_val_max
3155         FROM CSI_COUNTERS_B WHERE COUNTER_ID = sub_cur.source_counter_id;
3156        SELECT NET_READING, VALUE_TIMESTAMP
3157              INTO l_net_max_reading,
3158                   l_value_max_timestamp
3159        FROM CSI_COUNTER_READINGS WHERE COUNTER_VALUE_ID = NVL(l_ctr_val_max,-1);
3160        IF (l_debug_level > 0) THEN
3161         csi_ctr_gen_utility_pvt.put_line('l_ctr_val_max - ' || l_ctr_val_max );
3162        END IF;
3163       EXCEPTION
3164        WHEN OTHERS THEN
3165         l_ctr_val_max := -1;
3166       END;  --
3167        IF (l_value_max_timestamp <=  p_ctr_rdg_rec.value_timestamp
3168                 AND NVL(l_ctr_val_max,-1) > 0) THEN
3169           -- The requested timestamp is greater than the timestamp of the
3170           -- CTR_VAL_MAX_SEQ_NO
3171           l_bind_var_value := l_net_max_reading;
3172           IF (l_debug_level > 0) THEN
3173             csi_ctr_gen_utility_pvt.put_line('Max Value counter id used');
3174           END IF;
3175      ELSE
3176 	    OPEN GET_NET_RDG_CUR(sub_cur.source_counter_id,p_ctr_rdg_rec.value_timestamp);
3177 	    FETCH GET_NET_RDG_CUR INTO l_bind_var_value;
3178 	    CLOSE GET_NET_RDG_CUR;
3179      END IF;
3180      -- End Bug 9230940
3181 	    DBMS_SQL.BIND_VARIABLE(l_cursor_handle, l_bind_var_name, nvl(l_bind_var_value,0));
3182 	 END LOOP; -- Sub Cursor
3183 	 --
3184 	 l_n_temp := dbms_sql.execute(l_cursor_handle);
3185 	 --Get the value
3186 	 IF dbms_sql.fetch_rows(l_cursor_handle) > 0 THEN
3187 	    dbms_sql.column_value(l_cursor_handle,1,l_counter_reading);
3188 	 ELSE
3189 	    l_counter_reading := 0;
3190 	 END IF;
3191 	 --Close cursor
3192 	 DBMS_SQL.close_cursor(l_cursor_handle);
3193          --
3194 	 -- If the source counter reading is not disabled then we update/insert the row for formula
3195          -- counter.
3196 	 --
3197          IF NVL(p_ctr_rdg_rec.disabled_flag,'N') <> 'Y' THEN
3198             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
3199             csi_ctr_gen_utility_pvt.put_line('Trying to Update Object Ctr : '||to_char(obj_cur.object_counter_id));
3200             END IF;          -- 8214848 - dsingire
3201 	    Update CSI_COUNTER_READINGS
3202 	    set counter_reading = l_counter_reading,
3203 		net_reading = l_counter_reading,
3204 		life_to_date_reading = l_counter_reading,
3205 		disabled_flag = 'N',
3206 		last_update_date = sysdate,
3207 		last_updated_by = l_user_id
3208 	    where counter_id = obj_cur.object_counter_id
3209 	    and   value_timestamp = p_ctr_rdg_rec.value_timestamp;
3210 	    --
3211 	    IF SQL%ROWCOUNT = 0 THEN -- If update was not successfull
3212 	       -- Generate the Value_id for insert
3213 	       l_process_flag := TRUE;
3214 	       WHILE l_process_flag LOOP
3215 		  select CSI_COUNTER_READINGS_S.nextval
3216 		  into l_ctr_value_id from dual;
3217 		  IF NOT Counter_Value_Exists(l_ctr_value_id) THEN
3218 		     l_process_flag := FALSE;
3219 		  END IF;
3220 	       END LOOP;
3221 	       --
3222               IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
3223                csi_ctr_gen_utility_pvt.put_line('Unable to Update. Inserting Object Ctr : '||to_char(obj_cur.object_counter_id));
3224               END IF;          -- 8214848 - dsingire
3225 	       -- Call the Table Handler to insert the new reading
3226 	       CSI_COUNTER_READINGS_PKG.Insert_Row(
3227 		   px_COUNTER_VALUE_ID         =>  l_ctr_value_id
3228 		  ,p_COUNTER_ID                =>  obj_cur.object_counter_id
3229 		  ,p_VALUE_TIMESTAMP           =>  p_ctr_rdg_rec.value_timestamp
3230 		  ,p_COUNTER_READING           =>  l_counter_reading
3231 		  ,p_RESET_MODE                =>  NULL
3232 		  ,p_RESET_REASON              =>  NULL
3233 		  ,p_ADJUSTMENT_TYPE           =>  NULL
3234 		  ,p_ADJUSTMENT_READING        =>  NULL
3235 		  ,p_OBJECT_VERSION_NUMBER     =>  1
3236 		  ,p_LAST_UPDATE_DATE          =>  SYSDATE
3237 		  ,p_LAST_UPDATED_BY           =>  l_user_id
3238 		  ,p_CREATION_DATE             =>  SYSDATE
3239 		  ,p_CREATED_BY                =>  l_user_id
3240 		  ,p_LAST_UPDATE_LOGIN         =>  l_conc_login_id
3241 		  ,p_ATTRIBUTE1                =>  NULL
3242 		  ,p_ATTRIBUTE2                =>  NULL
3243 		  ,p_ATTRIBUTE3                =>  NULL
3244 		  ,p_ATTRIBUTE4                =>  NULL
3245 		  ,p_ATTRIBUTE5                =>  NULL
3246 		  ,p_ATTRIBUTE6                =>  NULL
3247 		  ,p_ATTRIBUTE7                =>  NULL
3248 		  ,p_ATTRIBUTE8                =>  NULL
3249 		  ,p_ATTRIBUTE9                =>  NULL
3250 		  ,p_ATTRIBUTE10               =>  NULL
3251 		  ,p_ATTRIBUTE11               =>  NULL
3252 		  ,p_ATTRIBUTE12               =>  NULL
3253 		  ,p_ATTRIBUTE13               =>  NULL
3254 		  ,p_ATTRIBUTE14               =>  NULL
3255 		  ,p_ATTRIBUTE15               =>  NULL
3256 		  ,p_ATTRIBUTE16               =>  NULL
3257 		  ,p_ATTRIBUTE17               =>  NULL
3258 		  ,p_ATTRIBUTE18               =>  NULL
3259 		  ,p_ATTRIBUTE19               =>  NULL
3260 		  ,p_ATTRIBUTE20               =>  NULL
3261 		  ,p_ATTRIBUTE21               =>  NULL
3262 		  ,p_ATTRIBUTE22               =>  NULL
3263 		  ,p_ATTRIBUTE23               =>  NULL
3264 		  ,p_ATTRIBUTE24               =>  NULL
3265 		  ,p_ATTRIBUTE25               =>  NULL
3266 		  ,p_ATTRIBUTE26               =>  NULL
3267 		  ,p_ATTRIBUTE27               =>  NULL
3268 		  ,p_ATTRIBUTE28               =>  NULL
3269 		  ,p_ATTRIBUTE29               =>  NULL
3270 		  ,p_ATTRIBUTE30               =>  NULL
3271 		  ,p_ATTRIBUTE_CATEGORY        =>  NULL
3272 		  ,p_MIGRATED_FLAG             =>  'N'
3273 		  ,p_COMMENTS                  =>  NULL
3274 		  ,p_LIFE_TO_DATE_READING      =>  l_counter_reading
3275 		  ,p_TRANSACTION_ID            =>  p_txn_rec.transaction_id
3276 		  ,p_AUTOMATIC_ROLLOVER_FLAG   =>  NULL
3277 		  ,p_INCLUDE_TARGET_RESETS     =>  NULL
3278 		  ,p_SOURCE_COUNTER_VALUE_ID   =>  NULL
3279 		  ,p_NET_READING               =>  l_counter_reading
3280 		  ,p_DISABLED_FLAG             =>  'N'
3281 		  ,p_SOURCE_CODE               =>  p_ctr_rdg_rec.source_code
3282 		  ,p_SOURCE_LINE_ID            =>  p_ctr_rdg_rec.source_line_id
3283 		  ,p_INITIAL_READING_FLAG      =>  p_ctr_rdg_rec.initial_reading_flag
3284 		);
3285 
3286                 --Add call to CSI_COUNTER_PVT.update_ctr_val_max_seq_no
3287                 --for bug 7374316
3288                 CSI_COUNTER_PVT.update_ctr_val_max_seq_no(
3289                    p_api_version           =>  1.0
3290                   ,p_commit                =>  fnd_api.g_false
3291                   ,p_init_msg_list         =>  fnd_api.g_true
3292                   ,p_validation_level      =>  fnd_api.g_valid_level_full
3293                   ,p_counter_id            =>  obj_cur.object_counter_id
3294                   ,px_ctr_val_max_seq_no   =>  l_ctr_value_id
3295                   ,x_return_status         =>  x_return_status
3296                   ,x_msg_count             =>  x_msg_count
3297                   ,x_msg_data              =>  x_msg_data
3298                 );
3299                 IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
3300                   csi_ctr_gen_utility_pvt.put_line('ERROR FROM CSI_COUNTER_PVT.update_ctr_val_max_seq_no');
3301                   l_msg_index := 1;
3302                   l_msg_count := x_msg_count;
3303                   WHILE l_msg_count > 0 LOOP
3304                     x_msg_data := FND_MSG_PUB.GET
3305                     (  l_msg_index,
3306                        FND_API.G_FALSE
3307                     );
3308                     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
3309                     l_msg_index := l_msg_index + 1;
3310                     l_msg_count := l_msg_count - 1;
3311                   END LOOP;
3312                   RAISE FND_API.G_EXC_ERROR;
3313                 END IF;
3314             ELSE
3315                 --Add call to CSI_COUNTER_PVT.update_ctr_val_max_seq_no
3316                 --for bug 7374316
3317                 l_tmp_ctr_value_id := NULL;
3318                 CSI_COUNTER_PVT.update_ctr_val_max_seq_no(
3319                    p_api_version           =>  1.0
3320                   ,p_commit                =>  fnd_api.g_false
3321                   ,p_init_msg_list         =>  fnd_api.g_true
3322                   ,p_validation_level      =>  fnd_api.g_valid_level_full
3323                   ,p_counter_id            =>  obj_cur.object_counter_id
3324                   ,px_ctr_val_max_seq_no   =>  l_tmp_ctr_value_id
3325                   ,x_return_status         =>  x_return_status
3326                   ,x_msg_count             =>  x_msg_count
3327                   ,x_msg_data              =>  x_msg_data
3328                 );
3329                 IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
3330                   csi_ctr_gen_utility_pvt.put_line('ERROR FROM CSI_COUNTER_PVT.update_ctr_val_max_seq_no');
3331                   l_msg_index := 1;
3332                   l_msg_count := x_msg_count;
3333                   WHILE l_msg_count > 0 LOOP
3334                     x_msg_data := FND_MSG_PUB.GET
3335                     (  l_msg_index,
3336                        FND_API.G_FALSE
3337                     );
3338                     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
3339                     l_msg_index := l_msg_index + 1;
3340                     l_msg_count := l_msg_count - 1;
3341                   END LOOP;
3342                   RAISE FND_API.G_EXC_ERROR;
3343                 END IF;
3344 	    END IF;
3345          ELSE -- If source counter is disabled then the corresponding formula counter reading is updated
3346             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
3347               csi_ctr_gen_utility_pvt.put_line('Disabling Obj Ctr '||to_char(obj_cur.object_counter_id));
3348             END IF;          -- 8214848 - dsingire
3349 	    Update CSI_COUNTER_READINGS
3350 	    set counter_reading = l_counter_reading,
3351 		net_reading = l_counter_reading,
3352 		life_to_date_reading = l_counter_reading,
3353 		disabled_flag = decode(l_disabled_flag,'Y',decode(l_other_src_captured,'T','N','Y'),'N'),
3354 		last_update_date = sysdate,
3355 		last_updated_by = l_user_id
3356 	    where counter_id = obj_cur.object_counter_id
3357 	    and   value_timestamp = p_ctr_rdg_rec.value_timestamp;
3358 
3359             IF (l_disabled_flag = 'Y') AND (l_other_src_captured <> 'T') THEN
3360                 --Add call to CSI_COUNTER_PVT.update_ctr_val_max_seq_no
3361                 --for bug 7374316
3362                 l_tmp_ctr_value_id := NULL;
3363                 CSI_COUNTER_PVT.update_ctr_val_max_seq_no(
3364                    p_api_version           =>  1.0
3365                   ,p_commit                =>  fnd_api.g_false
3366                   ,p_init_msg_list         =>  fnd_api.g_true
3367                   ,p_validation_level      =>  fnd_api.g_valid_level_full
3368                   ,p_counter_id            =>  obj_cur.object_counter_id
3369                   ,px_ctr_val_max_seq_no   =>  l_tmp_ctr_value_id
3370                   ,x_return_status         =>  x_return_status
3371                   ,x_msg_count             =>  x_msg_count
3372                   ,x_msg_data              =>  x_msg_data
3373                 );
3374                 IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
3375                   csi_ctr_gen_utility_pvt.put_line('ERROR FROM CSI_COUNTER_PVT.update_ctr_val_max_seq_no');
3376                   l_msg_index := 1;
3377                   l_msg_count := x_msg_count;
3378                   WHILE l_msg_count > 0 LOOP
3379                     x_msg_data := FND_MSG_PUB.GET
3380                     (  l_msg_index,
3381                        FND_API.G_FALSE
3382                     );
3383                     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
3384                     l_msg_index := l_msg_index + 1;
3385                     l_msg_count := l_msg_count - 1;
3386                   END LOOP;
3387                   RAISE FND_API.G_EXC_ERROR;
3388                 END IF;
3389             END IF;
3390          END IF; -- Check for disabled_flag
3391 	 --
3392 	 -- Re-compute Later Formula Counter Readings
3393 	 -- For this Formula counter, pick up the readings later than passed timestamp and re-compute
3394 	 --
3395 	 FOR later_rec IN LATER_FORMULA_CUR(obj_cur.object_counter_id,p_ctr_rdg_rec.value_timestamp) LOOP
3396 	    l_cursor_handle := dbms_sql.open_cursor;
3397          -- Formula Text is reused from the above
3398 	 --   l_formula_text := 'SELECT '||l_formula_text||' FROM DUAL';
3399 	    --
3400 	    Begin
3401 	       DBMS_SQL.PARSE(l_cursor_handle, l_formula_text, dbms_sql.native);
3402 	    Exception
3403 	       when others then
3404 		  csi_ctr_gen_utility_pvt.ExitWithErrMsg
3405 			  ( p_msg_name     => 'CSI_API_CTR_FORMULA_DEF_INV',
3406 			    p_token1_name  => 'FMLA_TEXT',
3407 			    p_token1_val   => l_formula_text
3408 			  );
3409 	    End;
3410 	    --
3411 	    DBMS_SQL.DEFINE_COLUMN(l_cursor_handle,1,l_counter_reading);
3412 	    --
3413 	    -- Since we already have the list of Source counters for this Object (Formula) we are using it.
3414 	    IF l_src_ctr_tbl.count > 0 THEN
3415 	       FOR src_rec in l_src_ctr_tbl.FIRST .. l_src_ctr_tbl.LAST LOOP
3416 		  l_bind_var_name := ':'||ltrim(l_src_ctr_tbl(src_rec).bind_variable_name);
3417                   l_bind_var_value := NULL;
3418       -- Bug 9230940
3419 		  /*OPEN GET_NET_RDG_CUR(l_src_ctr_tbl(src_rec).source_counter_id,later_rec.value_timestamp);
3420 		  FETCH GET_NET_RDG_CUR INTO l_bind_var_value;
3421 		  CLOSE GET_NET_RDG_CUR;*/
3422      BEGIN
3423       SELECT CTR_VAL_MAX_SEQ_NO INTO l_ctr_val_max
3424         FROM CSI_COUNTERS_B WHERE COUNTER_ID = l_src_ctr_tbl(src_rec).source_counter_id;
3425        SELECT NET_READING, VALUE_TIMESTAMP
3426              INTO l_net_max_reading,
3427                   l_value_max_timestamp
3428        FROM CSI_COUNTER_READINGS WHERE COUNTER_VALUE_ID = NVL(l_ctr_val_max,-1);
3429        IF (l_debug_level > 0) THEN
3430         csi_ctr_gen_utility_pvt.put_line('l_ctr_val_max - ' || l_ctr_val_max );
3431        END IF;
3432       EXCEPTION
3433        WHEN OTHERS THEN
3434         l_ctr_val_max := -1;
3435       END;  --
3436        IF (l_value_max_timestamp <=  later_rec.value_timestamp
3437                 AND NVL(l_ctr_val_max,-1) > 0) THEN
3438           -- The requested timestamp is greater than the timestamp of the
3439           -- CTR_VAL_MAX_SEQ_NO
3440           l_bind_var_value := l_net_max_reading;
3441           IF (l_debug_level > 0) THEN
3442             csi_ctr_gen_utility_pvt.put_line('Max Value counter id used');
3443           END IF;
3444      ELSE
3445 		  OPEN GET_NET_RDG_CUR(l_src_ctr_tbl(src_rec).source_counter_id,later_rec.value_timestamp);
3446 		  FETCH GET_NET_RDG_CUR INTO l_bind_var_value;
3447 		  CLOSE GET_NET_RDG_CUR;
3448      END IF;
3449      -- End Bug 9230940
3450 		  DBMS_SQL.BIND_VARIABLE(l_cursor_handle, l_bind_var_name, nvl(l_bind_var_value,0));
3451 	       END LOOP;
3452 	    END IF;
3453 	    --
3454 	    l_n_temp := dbms_sql.execute(l_cursor_handle);
3455 	    --Get the value
3456 	    IF dbms_sql.fetch_rows(l_cursor_handle) > 0 THEN
3457 	       dbms_sql.column_value(l_cursor_handle,1,l_counter_reading);
3458 	       -- Updating Formula Counter
3459               IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
3460                csi_ctr_gen_utility_pvt.put_line('Re-computing later formula Ctr Value ID '||to_char(later_rec.counter_value_id));
3461               END IF;          -- 8214848 - dsingire
3462 	       Update CSI_COUNTER_READINGS
3463 	       set counter_reading = l_counter_reading,
3464 		   net_reading = l_counter_reading,
3465 		   life_to_date_reading = l_counter_reading,
3466 		   last_update_date = sysdate,
3467 		   last_updated_by = l_user_id
3468 	       where counter_value_id = later_rec.counter_value_id;
3469 	    ELSE
3470 	       l_counter_reading := 0;
3471 	    END IF;
3472 	    --Close cursor
3473 	    DBMS_SQL.close_cursor(l_cursor_handle);
3474 	 END LOOP; -- Later Formula Readings Loop
3475       Exception
3476          when Process_Next then
3477             null;
3478       End;
3479    END LOOP; -- Obj Cursor
3480    --
3481    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
3482       COMMIT WORK;
3483    END IF;
3484    --
3485    -- Standard call to get message count and IF count is  get message info.
3486    FND_MSG_PUB.Count_And_Get
3487       ( p_count  =>  x_msg_count,
3488         p_data   =>  x_msg_data
3489       );
3490 EXCEPTION
3491    WHEN FND_API.G_EXC_ERROR THEN
3492       x_return_status := FND_API.G_RET_STS_ERROR ;
3493       ROLLBACK TO compute_formula_counters;
3494       FND_MSG_PUB.Count_And_Get
3495          ( p_count => x_msg_count,
3496            p_data  => x_msg_data
3497          );
3498    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3499       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3500       ROLLBACK TO compute_formula_counters;
3501       FND_MSG_PUB.Count_And_Get
3502          ( p_count => x_msg_count,
3503            p_data  => x_msg_data
3504          );
3505    WHEN OTHERS THEN
3506       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3507       ROLLBACK TO compute_formula_counters;
3508       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3509          FND_MSG_PUB.Add_Exc_Msg
3510             ( G_PKG_NAME,
3511               l_api_name
3512             );
3513       END IF;
3514       FND_MSG_PUB.Count_And_Get
3515          ( p_count  => x_msg_count,
3516            p_data   => x_msg_data
3517          );
3518 END Compute_Formula_Counters;
3519 --
3520 PROCEDURE Compute_Derive_Counters(
3521     P_Api_Version           IN   NUMBER,
3522     P_Init_Msg_List         IN   VARCHAR2,
3523     P_Commit                IN   VARCHAR2,
3524     p_validation_level      IN   NUMBER,
3525     p_txn_rec               IN OUT NOCOPY  csi_datastructures_pub.transaction_rec,
3526     p_ctr_rdg_rec           IN   csi_ctr_datastructures_pub.counter_readings_rec,
3527     p_mode                  IN   VARCHAR2,
3528     X_Return_Status         OUT  NOCOPY VARCHAR2,
3529     X_Msg_Count             OUT  NOCOPY NUMBER,
3530     X_Msg_Data              OUT  NOCOPY VARCHAR2
3531     )
3532 IS
3533   l_api_name                CONSTANT VARCHAR2(30) := 'COMPUTE_DERIVE_COUNTERS';
3534   l_msg_index               NUMBER;
3535   l_msg_count               NUMBER;
3536   -- Start fix for bug 6852415, part 1 of 3
3537   CURSOR base_ctrs IS
3538     SELECT  counter_id      AS base_ctr_id,
3539             value_timestamp AS base_ctr_timestamp
3540     FROM    csi_counter_readings
3541     WHERE   counter_value_id = p_ctr_rdg_rec.counter_value_id;
3542   CURSOR ctrs_to_be_calc(base_ctr_id NUMBER, base_ctr_timestamp DATE) IS
3543     SELECT  counter_id,
3544             derive_function,
3545             derive_counter_id,
3546             derive_property_id,
3547             filter_reading_count,
3548             filter_type,
3549             filter_time_uom
3550     FROM    csi_counters_b
3551     WHERE   derive_counter_id = base_ctr_id
3552     AND     NVL(start_date_active, base_ctr_timestamp) <= base_ctr_timestamp
3553     AND     NVL(end_date_active, (base_ctr_timestamp + 1)) > base_ctr_timestamp;
3554 /*
3555   CURSOR CTRS_TO_BE_CALC IS
3556   SELECT ctr.counter_id, ctr.derive_function,
3557   ctr.derive_counter_id, ctr.derive_property_id,ctr.filter_reading_count,ctr.filter_type,
3558   ctr.filter_time_uom, cv.value_timestamp as new_rdg_dt, cv.counter_id as base_ctr_id
3559   FROM CSI_COUNTERS_B ctr, CSI_COUNTER_READINGS cv
3560   WHERE cv.counter_value_id = p_ctr_rdg_rec.counter_value_id
3561   AND   ctr.derive_counter_id = cv.counter_id
3562   AND   NVL(ctr.start_date_active,cv.value_timestamp) <= cv.value_timestamp
3563   AND   NVL(ctr.end_date_active,(cv.value_timestamp+1)) > cv.value_timestamp;
3564 */
3565   -- End fix for bug 6852415, part 1 of 3
3566   CURSOR DER_FILTERS(b_counter_id IN NUMBER) IS
3567   SELECT filt.counter_property_id, filt.seq_no,filt.left_parent left_paren,
3568          filt.right_parent right_paren, filt.relational_operator,
3569          filt.logical_operator, filt.right_value,
3570          pro.property_data_type
3571   FROM CSI_COUNTER_DERIVED_FILTERS filt, CSI_COUNTER_PROPERTIES_B pro
3572   WHERE filt.counter_id = b_counter_id
3573   AND pro.counter_property_id(+) = filt.counter_property_id;
3574   --
3575   CURSOR GET_TIME_UOM_CUR(p_filter_time_uom IN VARCHAR2) IS
3576   SELECT uom_code
3577   FROM OKC_TIME_CODE_UNITS_V
3578   WHERE uom_code=p_filter_time_uom;
3579   --
3580   l_sqlstr_init          VARCHAR2(2000);
3581   l_sqlstr               VARCHAR2(2000);
3582   l_sqlwhere             VARCHAR2(1000);
3583   l_sqlfrom              VARCHAR2(1000);
3584   l_cursor_handle        NUMBER;
3585   l_ctr_value            NUMBER;
3586   l_n_temp               NUMBER;
3587   l_ctr_value_id         NUMBER;
3588   l_process_flag         BOOLEAN;
3589   l_ctr_in               csi_ctr_datastructures_pub.counter_readings_rec;
3590   l_temp_ctr_rdg_rec     csi_ctr_datastructures_pub.counter_readings_rec;
3591   --
3592   --variable and arrays for binding dbmssql
3593   TYPE FILTS IS RECORD(
3594       BINDNAME_RIGHTVAL  VARCHAR2(240),
3595       BINDVAL_RIGHTVAL   VARCHAR2(240),
3596       BINDNAME_CTRPROPID VARCHAR2(240),
3597       BINDVAL_CTRPROPID  NUMBER
3598     );
3599   --
3600   TYPE T1 is TABLE OF FILTS index by binary_integer;
3601   T2 T1;
3602   i NUMBER := 1;
3603   lj NUMBER := 1;
3604   --
3605   BINDVAL_DERIVECTRID     NUMBER;
3606   --
3607   l_bind_varname          VARCHAR2(240);
3608   l_bind_varvalc          VARCHAR2(240);
3609   l_bind_varvaln          NUMBER;
3610   l_debug_level       NUMBER;    -- 8214848 - dsingire
3611   l_user_id 				  NUMBER := fnd_global.user_id;        -- 8214848 - dsingire
3612   l_conc_login_id		  NUMBER := fnd_global.conc_login_id;  -- 8214848 - dsingire
3613 
3614 BEGIN
3615    -- Standard Start of API savepoint
3616    SAVEPOINT  compute_derive_counters;
3617    -- Initialize message list if p_init_msg_list is set to TRUE.
3618    IF FND_API.to_Boolean(nvl(p_init_msg_list,FND_API.G_FALSE)) THEN
3619       FND_MSG_PUB.initialize;
3620    END IF;
3621    x_return_status := FND_API.G_RET_STS_SUCCESS;
3622    --
3623 
3624    -- Read the debug profiles values in to global variable 7197402
3625    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
3626 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
3627 	  END IF;                      -- 8214848 - dsingire
3628 
3629     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
3630 
3631    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
3632     csi_ctr_gen_utility_pvt.put_line('Inside Compute_Derive_Counters...');
3633     csi_ctr_gen_utility_pvt.dump_counter_readings_rec(p_ctr_rdg_rec);
3634    END IF;          -- 8214848 - dsingire
3635    --
3636 -- Start fix for bug 6852415, part 2 of 3
3637 FOR base_ctr IN base_ctrs LOOP
3638    FOR ctrs IN ctrs_to_be_calc(base_ctr.base_ctr_id, base_ctr.base_ctr_timestamp) LOOP
3639 -- End fix for bug 6852415, part 2 of 3
3640       IF ctrs.derive_function = 'AVERAGE' AND ctrs.filter_type = 'COUNT' THEN
3641          Declare
3642 	    n number;
3643 	    j number := 0;
3644             l_rec_count number;
3645 	    l_ctr_rdg number;
3646 	    l_sum_rdg number := 0;
3647 	    l_avg_rdg number;
3648             l_previous_net number;
3649             --
3650 	    CURSOR CTR_RDGS(d1_counter_id number) is
3651 	    SELECT net_reading net_rdg,value_timestamp
3652             FROM CSI_COUNTER_READINGS
3653 	    WHERE counter_id = d1_counter_id
3654             AND   value_timestamp <= p_ctr_rdg_rec.value_timestamp
3655             AND   NVL(disabled_flag,'N') = 'N'
3656 	    order by value_timestamp desc;
3657             --
3658          Begin
3659             -- We need n+1 readings to compute the average where n is the filter count. This is because
3660             -- we don't have the previous net_reading in the same record.
3661             --
3662             IF nvl(ctrs.filter_reading_count,0) <= 0 THEN
3663               IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
3664                csi_ctr_gen_utility_pvt.put_line('Invalid Filter Reading count for the Counter '||
3665                                                    to_char(ctrs.counter_id));
3666               END IF;          -- 8214848 - dsingire
3667 	       csi_ctr_gen_utility_pvt.ExitWithErrMsg
3668 			 ( p_msg_name     => 'CSI_INVD_FILTER_READING_COUNT',
3669 			   p_token1_name  => 'COUNTER_ID',
3670 			   p_token1_val   => to_char(ctrs.counter_id)
3671 			 );
3672             END IF;
3673             --
3674             l_rec_count := ctrs.filter_reading_count + 1;
3675             l_previous_net := null;
3676             --
3677             FOR ctr_rdgs_rec in CTR_RDGS(ctrs.derive_counter_id) LOOP
3678                j := j+1;
3679                IF l_previous_net IS NOT NULL THEN -- To skip the first one
3680                   l_sum_rdg := l_sum_rdg + ABS((l_previous_net) - (ctr_rdgs_rec.net_rdg));
3681                END IF;
3682                IF j = l_rec_count THEN
3683                   l_previous_net := ctr_rdgs_rec.net_rdg; -- will be used if j = 1
3684                   exit;
3685                END IF;
3686                l_previous_net := ctr_rdgs_rec.net_rdg;
3687             END LOOP;
3688             --
3689             IF j = 1 THEN -- If only one reading was found
3690                l_sum_rdg := l_previous_net;
3691             ELSIF j < l_rec_count THEN -- Not enough readings found
3692                j := j - 1;
3693             ELSE
3694                j := ctrs.filter_reading_count;
3695             END IF;
3696             --
3697             l_ctr_value := round(nvl(l_sum_rdg,0) / j,2);
3698             --
3699          End; -- 'AVERAGE' and 'COUNT' combination
3700       ELSIF ctrs.derive_function = 'AVERAGE' AND ctrs.filter_type = 'TIME' THEN
3701          Declare
3702 	    CURSOR GET_TIME_UOM_CUR(p_filter_time_uom IN VARCHAR2) IS
3703 	    select uom_code
3704 	    from OKC_TIME_CODE_UNITS_V
3705 	    where uom_code=p_filter_time_uom;
3706             --
3707 	    CURSOR GET_FIRST_READING(d3_counter_id IN NUMBER) IS
3708 	    SELECT net_reading,value_timestamp
3709 	    FROM   CSI_COUNTER_READINGS
3710 	    WHERE  counter_id = d3_counter_id
3711             AND    NVL(disabled_flag,'N') = 'N'
3712             order by value_timestamp asc;
3713             --
3714 	    CURSOR CTR_CUR_RDG IS
3715 	    SELECT net_reading
3716 	    FROM CSI_COUNTER_READINGS
3717 	    WHERE counter_value_id = p_ctr_rdg_rec.counter_value_id;
3718             --
3719 	    l_time_uom  VARCHAR2(10);
3720 	    l_min_date  DATE;
3721 	    l_first_rdg NUMBER;
3722 	    l_captured_rdg NUMBER;
3723 	    l_no_of_days NUMBER;
3724 	    l_target_qty  NUMBER;
3725 	    l_new_datetime DATE := p_ctr_rdg_rec.value_timestamp;
3726          Begin
3727             OPEN  GET_TIME_UOM_CUR(ctrs.filter_time_uom);
3728             FETCH GET_TIME_UOM_CUR INTO l_time_uom;
3729             CLOSE GET_TIME_UOM_CUR;
3730             --
3731             OPEN GET_FIRST_READING(ctrs.derive_counter_id);
3732             FETCH GET_FIRST_READING INTO l_first_rdg,l_min_date;
3733             CLOSE GET_FIRST_READING;
3734             --
3735             OPEN CTR_CUR_RDG;
3736             FETCH CTR_CUR_RDG INTO l_captured_rdg;
3737             CLOSE CTR_CUR_RDG;
3738             --
3739             IF l_time_uom IS NULL THEN
3740 	       csi_ctr_gen_utility_pvt.ExitWithErrMsg
3741                    ( p_msg_name    =>  'CSI_API_CTR_INVALID_FILT_UOM',
3742                      p_token1_name =>  'UOM_CODE',
3743                      p_token1_val  =>  ctrs.filter_time_uom
3744                    );
3745             ELSE
3746 	       DECLARE
3747 		  l_source_qty number;
3748 		  l_period_uom_code varchar2(200);
3749 		  l_status varchar2(2000);
3750 		  l_offset number :=0;
3751 	       BEGIN
3752 		  l_period_uom_code := 'DAY';
3753 		  l_source_qty      := l_new_datetime - l_min_date;
3754 		  IF l_source_qty = 0 THEN
3755                      l_source_qty := 1;
3756 		  END IF;
3757 
3758 		  l_target_qty := oks_time_measures_pub.get_target_qty(l_min_date,
3759 					  l_source_qty,
3760 					  l_period_uom_code,
3761 					  ctrs.filter_time_uom,
3762 					  5);
3763 
3764 		  IF l_target_qty = 0 THEN
3765                      l_target_qty := 1;
3766 		  END IF;
3767 		  l_ctr_value:=round(( l_captured_rdg-l_first_rdg)/l_target_qty,2) ;
3768 	       END;
3769             END IF; -- get_time_uom check
3770          End; -- 'AVERAGE' and 'TIME' combination
3771       ELSE
3772          i := 1;
3773          lj := 1;
3774          l_sqlstr_init := 'select '||ctrs.derive_function||'( nvl(net_reading,0) )';
3775 	 l_sqlstr_init := l_sqlstr_init || ' from CSI_COUNTER_READINGS cv ';
3776 	 l_sqlstr :=  ' where counter_value_id in (';
3777 	 l_sqlstr := l_sqlstr || ' select distinct cv1.counter_value_id from ';
3778 	 l_sqlfrom := ' CSI_COUNTER_READINGS cv1';
3779 	 l_sqlwhere := '';
3780          --
3781 	 FOR filts IN der_filters(ctrs.counter_id) LOOP
3782 	   l_sqlfrom := l_sqlfrom ||', CSI_CTR_PROPERTY_READINGS pv';
3783 	   l_sqlfrom := l_sqlfrom ||ltrim(rtrim(filts.seq_no));
3784 	   l_sqlwhere := l_sqlwhere || nvl(filts.left_paren,' ')||' pv';
3785 	   l_sqlwhere := l_sqlwhere || ltrim(rtrim(filts.seq_no));
3786 	   l_sqlwhere := l_sqlwhere || '.property_value ';
3787 
3788 
3789 	   l_sqlwhere := l_sqlwhere ||filts.relational_operator;
3790 
3791 	   T2(i).BINDVAL_RIGHTVAL := filts.right_value;
3792 	   T2(i).BINDNAME_RIGHTVAL := ':x_right_value'||ltrim(rtrim(filts.seq_no));
3793 
3794 	   if filts.property_data_type = 'NUMBER' then
3795 	     l_sqlwhere := l_sqlwhere || ':x_right_value'||ltrim(rtrim(filts.seq_no));
3796 	   elsif filts.property_data_type = 'DATE' then
3797 	     l_sqlwhere := l_sqlwhere || 'to_date( '||':x_right_value'||ltrim(rtrim(filts.seq_no))||','||'''DD-MON-RRRR'''||' )';
3798 	   else
3799 	     l_sqlwhere := l_sqlwhere || ':x_right_value'||ltrim(rtrim(filts.seq_no));
3800 	   end if;
3801 
3802 
3803 	   l_sqlwhere := l_sqlwhere || nvl(filts.right_paren,' ');
3804 	   l_sqlwhere := l_sqlwhere || filts.logical_operator;
3805 	   l_sqlwhere := l_sqlwhere || ' and pv'||ltrim(rtrim(filts.seq_no)) ;
3806 	   l_sqlwhere := l_sqlwhere || '.counter_value_id = cv.counter_value_id ';
3807 	   l_sqlwhere := l_sqlwhere || ' and pv'||ltrim(rtrim(filts.seq_no)) ;
3808 	   l_sqlwhere := l_sqlwhere || '.counter_property_id = ';
3809 
3810 	   T2(i).BINDVAL_CTRPROPID := filts.counter_property_id;
3811 	   T2(i).BINDNAME_CTRPROPID := ':x_ctr_prop_id'||ltrim(rtrim(filts.seq_no));
3812 	   l_sqlwhere := l_sqlwhere ||':x_ctr_prop_id'||ltrim(rtrim(filts.seq_no));
3813 
3814 	   l_sqlwhere := l_sqlwhere || ' and cv.counter_id = ';
3815 	   l_sqlwhere := l_sqlwhere || ':x_derive_counter_id';
3816 	   --l_sqlwhere := l_sqlwhere || ctrs.derive_counter_id;
3817 	 END LOOP;
3818          --
3819 	 if l_sqlwhere is null then
3820 	    l_sqlstr := l_sqlstr_init || ' where cv.counter_id = :x_derive_counter_id';
3821 	    l_cursor_handle := dbms_sql.open_cursor;
3822 	    DBMS_SQL.PARSE(l_cursor_handle, l_sqlstr, dbms_sql.native);
3823 	    DBMS_SQL.DEFINE_COLUMN(l_cursor_handle,1,l_ctr_value);
3824 	    BINDVAL_DERIVECTRID := ctrs.derive_counter_id;
3825 	    DBMS_SQL.BIND_VARIABLE(l_cursor_handle, ':x_derive_counter_id',BINDVAL_DERIVECTRID);
3826          else
3827 	    l_sqlstr := l_sqlstr_init||l_sqlstr || l_sqlfrom || ' where '||l_sqlwhere||')';
3828 	    l_cursor_handle := dbms_sql.open_cursor;
3829 	    DBMS_SQL.PARSE(l_cursor_handle, l_sqlstr, dbms_sql.native);
3830 	    DBMS_SQL.DEFINE_COLUMN(l_cursor_handle,1,l_ctr_value);
3831 
3832 	    BINDVAL_DERIVECTRID := ctrs.derive_counter_id;
3833 	    DBMS_SQL.BIND_VARIABLE(l_cursor_handle, ':x_derive_counter_id',BINDVAL_DERIVECTRID);
3834 
3835 	    while lj < i+1
3836 	    loop
3837 	       l_bind_varname := t2(lj).BINDNAME_RIGHTVAL;
3838 	       l_bind_varvalc := t2(lj).BINDVAL_RIGHTVAL;
3839 	       DBMS_SQL.BIND_VARIABLE(l_cursor_handle, l_bind_varname, l_bind_varvalc);
3840 	       l_bind_varname := t2(lj).BINDNAME_CTRPROPID;
3841 	       l_bind_varvaln := t2(lj).BINDVAL_CTRPROPID;
3842 	       DBMS_SQL.BIND_VARIABLE(l_cursor_handle, l_bind_varname, l_bind_varvaln);
3843 	       lj:= lj+1;
3844             end loop;
3845          end if;
3846          --
3847          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
3848          csi_ctr_gen_utility_pvt.put_line('SQL String is '||l_sqlstr);
3849          END IF;          -- 8214848 - dsingire
3850 	 l_n_temp := dbms_sql.execute(l_cursor_handle);
3851 	 IF dbms_sql.fetch_rows(l_cursor_handle) > 0 THEN
3852 	    dbms_sql.column_value(l_cursor_handle,1,l_ctr_value);
3853 	 END IF;
3854 	 DBMS_SQL.close_cursor(l_cursor_handle);
3855       END IF;
3856       --
3857       --  Capture Reading
3858       IF l_ctr_value IS NOT NULL THEN
3859 	 l_ctr_in := l_temp_ctr_rdg_rec;
3860 	 --
3861 	 l_ctr_in.COUNTER_ID := ctrs.counter_id;
3862 
3863 	 -- Pass the reading date of the base counter to the group avg ctr and sysdate for sum and count
3864 	 --
3865 	 --Modified for bug 10248209, reading date of the base counter should be passed for all types of derive function
3866 	 --IF ctrs.derive_function = 'AVERAGE' THEN
3867 	   l_ctr_in.VALUE_TIMESTAMP := base_ctr.base_ctr_timestamp; -- Modified for bug 6852415
3868 	 /*ELSE  commented for bug 10248209
3869 	   l_ctr_in.VALUE_TIMESTAMP := sysdate;
3870 	 END IF;     */
3871 	 --
3872 	 l_ctr_in.COUNTER_READING := l_ctr_value;
3873 	 l_ctr_in.source_counter_value_id := p_ctr_rdg_rec.counter_value_id;
3874 	 l_ctr_in.source_code := p_ctr_rdg_rec.source_code;
3875 	 l_ctr_in.source_line_id := p_ctr_rdg_rec.source_line_id;
3876 	 --
3877 	 IF p_mode = 'UPDATE' THEN
3878 	    UPDATE CSI_COUNTER_READINGS
3879 	    set counter_reading = l_ctr_value,
3880 		net_reading = l_ctr_value,
3881 		life_to_date_reading = l_ctr_value,
3882 		last_update_date = sysdate,
3883 		last_updated_by = l_user_id
3884 	    where counter_id = ctrs.counter_id
3885 	    and   value_timestamp = l_ctr_in.value_timestamp
3886 	    and   source_counter_value_id = l_ctr_in.source_counter_value_id;
3887 	 ELSIF p_mode = 'CREATE' THEN
3888 	    -- Generate the Value_id for insert
3889 	    l_process_flag := TRUE;
3890 	    WHILE l_process_flag LOOP
3891 	       select CSI_COUNTER_READINGS_S.nextval
3892 	       into l_ctr_value_id from dual;
3893 	       IF NOT Counter_Value_Exists(l_ctr_value_id) THEN
3894 		  l_process_flag := FALSE;
3895 	       END IF;
3896 	    END LOOP;
3897 	    --
3898 	    -- Call the Table Handler to insert the new reading
3899 	    CSI_COUNTER_READINGS_PKG.Insert_Row(
3900 		px_COUNTER_VALUE_ID         =>  l_ctr_value_id
3901 	       ,p_COUNTER_ID                =>  l_ctr_in.counter_id
3902 	       ,p_VALUE_TIMESTAMP           =>  l_ctr_in.value_timestamp
3903 	       ,p_COUNTER_READING           =>  l_ctr_value
3904 	       ,p_RESET_MODE                =>  NULL
3905 	       ,p_RESET_REASON              =>  NULL
3906 	       ,p_ADJUSTMENT_TYPE           =>  NULL
3907 	       ,p_ADJUSTMENT_READING        =>  NULL
3908 	       ,p_OBJECT_VERSION_NUMBER     =>  1
3909 	       ,p_LAST_UPDATE_DATE          =>  SYSDATE
3910 	       ,p_LAST_UPDATED_BY           =>  l_user_id
3911 	       ,p_CREATION_DATE             =>  SYSDATE
3912 	       ,p_CREATED_BY                =>  l_user_id
3913 	       ,p_LAST_UPDATE_LOGIN         =>  l_conc_login_id
3914 	       ,p_ATTRIBUTE1                =>  NULL
3915 	       ,p_ATTRIBUTE2                =>  NULL
3916 	       ,p_ATTRIBUTE3                =>  NULL
3917 	       ,p_ATTRIBUTE4                =>  NULL
3918 	       ,p_ATTRIBUTE5                =>  NULL
3919 	       ,p_ATTRIBUTE6                =>  NULL
3920 	       ,p_ATTRIBUTE7                =>  NULL
3921 	       ,p_ATTRIBUTE8                =>  NULL
3922 	       ,p_ATTRIBUTE9                =>  NULL
3923 	       ,p_ATTRIBUTE10               =>  NULL
3924 	       ,p_ATTRIBUTE11               =>  NULL
3925 	       ,p_ATTRIBUTE12               =>  NULL
3926 	       ,p_ATTRIBUTE13               =>  NULL
3927 	       ,p_ATTRIBUTE14               =>  NULL
3928 	       ,p_ATTRIBUTE15               =>  NULL
3929 	       ,p_ATTRIBUTE16               =>  NULL
3930 	       ,p_ATTRIBUTE17               =>  NULL
3931 	       ,p_ATTRIBUTE18               =>  NULL
3932 	       ,p_ATTRIBUTE19               =>  NULL
3933 	       ,p_ATTRIBUTE20               =>  NULL
3934 	       ,p_ATTRIBUTE21               =>  NULL
3935 	       ,p_ATTRIBUTE22               =>  NULL
3936 	       ,p_ATTRIBUTE23               =>  NULL
3937 	       ,p_ATTRIBUTE24               =>  NULL
3938 	       ,p_ATTRIBUTE25               =>  NULL
3939 	       ,p_ATTRIBUTE26               =>  NULL
3940 	       ,p_ATTRIBUTE27               =>  NULL
3941 	       ,p_ATTRIBUTE28               =>  NULL
3942 	       ,p_ATTRIBUTE29               =>  NULL
3943 	       ,p_ATTRIBUTE30               =>  NULL
3944 	       ,p_ATTRIBUTE_CATEGORY        =>  NULL
3945 	       ,p_MIGRATED_FLAG             =>  'N'
3946 	       ,p_COMMENTS                  =>  NULL
3947 	       ,p_LIFE_TO_DATE_READING      =>  l_ctr_value
3948 	       ,p_TRANSACTION_ID            =>  p_txn_rec.transaction_id
3949 	       ,p_AUTOMATIC_ROLLOVER_FLAG   =>  NULL
3950 	       ,p_INCLUDE_TARGET_RESETS     =>  NULL
3951 	       ,p_SOURCE_COUNTER_VALUE_ID   =>  l_ctr_in.source_counter_value_id
3952 	       ,p_NET_READING               =>  l_ctr_value
3953 	       ,p_DISABLED_FLAG             =>  'N'
3954 	       ,p_SOURCE_CODE               =>  l_ctr_in.source_code
3955 	       ,p_SOURCE_LINE_ID            =>  l_ctr_in.source_line_id
3956 	       ,p_INITIAL_READING_FLAG      =>  l_ctr_in.initial_reading_flag
3957 	     );
3958 
3959           --Add call to CSI_COUNTER_PVT.update_ctr_val_max_seq_no
3960           --for bug 7374316
3961           CSI_COUNTER_PVT.update_ctr_val_max_seq_no(
3962             p_api_version           =>  1.0
3963             ,p_commit                =>  fnd_api.g_false
3964             ,p_init_msg_list         =>  fnd_api.g_true
3965             ,p_validation_level      =>  fnd_api.g_valid_level_full
3966             ,p_counter_id            =>  l_ctr_in.counter_id
3967             ,px_ctr_val_max_seq_no   =>  l_ctr_value_id
3968             ,x_return_status         =>  x_return_status
3969             ,x_msg_count             =>  x_msg_count
3970             ,x_msg_data              =>  x_msg_data
3971           );
3972           IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
3973             csi_ctr_gen_utility_pvt.put_line('ERROR FROM CSI_COUNTER_PVT.update_ctr_val_max_seq_no');
3974             l_msg_index := 1;
3975             l_msg_count := x_msg_count;
3976             WHILE l_msg_count > 0 LOOP
3977               x_msg_data := FND_MSG_PUB.GET
3978               (  l_msg_index,
3979                  FND_API.G_FALSE
3980               );
3981               csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
3982               l_msg_index := l_msg_index + 1;
3983               l_msg_count := l_msg_count - 1;
3984             END LOOP;
3985             RAISE FND_API.G_EXC_ERROR;
3986           END IF;
3987 	 END IF; -- p_mode check
3988       ELSE
3989          csi_ctr_gen_utility_pvt.put_line('No derive filters computed for '||to_char(ctrs.counter_id));
3990       END IF; -- l_ctr_value check
3991    END LOOP;
3992 -- Start fix bug 6852415, part 3 of 3
3993 END LOOP;
3994 -- End fix bug 6852415, part 3 of 3
3995 EXCEPTION
3996    WHEN FND_API.G_EXC_ERROR THEN
3997       x_return_status := FND_API.G_RET_STS_ERROR ;
3998       ROLLBACK TO compute_derive_counters;
3999       FND_MSG_PUB.Count_And_Get
4000          ( p_count => x_msg_count,
4001            p_data  => x_msg_data
4002          );
4003    WHEN OTHERS THEN
4004       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
4005       ROLLBACK TO compute_derive_counters;
4006       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4007  	 FND_MSG_PUB.Add_Exc_Msg
4008  	   ( G_PKG_NAME,
4009 	     l_api_name
4010 	   );
4011       END IF;
4012       FND_MSG_PUB.Count_And_Get
4013 	( p_count  => x_msg_count,
4014 	  p_data   => x_msg_data
4015 	);
4016       IF DBMS_SQL.IS_OPEN(l_cursor_handle) THEN
4017          DBMS_SQL.CLOSE_cursor(l_cursor_handle);
4018       END IF;
4019 END Compute_Derive_Counters;
4020 --
4021 PROCEDURE Compute_Target_Counters
4022    (
4023      p_api_version           IN     NUMBER
4024     ,p_commit                IN     VARCHAR2
4025     ,p_init_msg_list         IN     VARCHAR2
4026     ,p_validation_level      IN     NUMBER
4027     ,p_txn_rec               IN OUT NOCOPY    csi_datastructures_pub.transaction_rec
4028     ,p_ctr_rdg_rec           IN     csi_ctr_datastructures_pub.counter_readings_rec
4029     ,p_mode                  IN     VARCHAR2
4030     ,x_return_status         OUT    NOCOPY VARCHAR2
4031     ,x_msg_count             OUT    NOCOPY NUMBER
4032     ,x_msg_data              OUT    NOCOPY VARCHAR2
4033  )
4034 IS
4035    l_api_name                      CONSTANT VARCHAR2(30)   := 'COMPUTE_TARGET_COUNTERS';
4036    l_api_version                   CONSTANT NUMBER         := 1.0;
4037    l_msg_data                      VARCHAR2(2000);
4038    l_msg_index                     NUMBER;
4039    l_msg_count                     NUMBER;
4040    l_rel_type                      VARCHAR2(30) := 'CONFIGURATION';
4041    l_counter_reading               NUMBER;
4042    l_prev_ctr_reading              NUMBER;
4043    l_prev_net_reading              NUMBER;
4044    l_prev_ltd_reading              NUMBER;
4045    l_prev_value_timestamp          DATE;
4046    l_net_reading                   NUMBER;
4047    l_ltd_reading                   NUMBER;
4048    l_ctr_rdg_rec                   csi_ctr_datastructures_pub.counter_readings_rec;
4049    l_temp_ctr_rdg_rec              csi_ctr_datastructures_pub.counter_readings_rec;
4050    l_process_flag                  BOOLEAN;
4051    l_mode                          VARCHAR2(30);
4052    Process_next                    EXCEPTION;
4053    l_instance_id                   NUMBER;
4054 
4055    -- Bug 8214848
4056     l_ctr_val_max                 NUMBER := -1;
4057     l_prev_ctr_max_reading        NUMBER;
4058     l_prev_net_max_reading        NUMBER;
4059     l_prev_ltd_max_reading        NUMBER;
4060     l_prev_value_max_timestamp    DATE;
4061     l_prev_max_comments           VARCHAR2(240);
4062    --
4063    CURSOR OBJECT_CTR_CUR IS
4064    select ccr.object_counter_id,nvl(ccr.factor,1) factor,
4065           ccv.direction,ccv.reading_type, ccv.uom_code object_uom_code,
4066           cct.name object_counter_name
4067    from   CSI_COUNTER_RELATIONSHIPS ccr,
4068           CSI_COUNTERS_B ccv,
4069           CSI_COUNTERS_TL cct
4070    where  ccr.source_counter_id = p_ctr_rdg_rec.counter_id
4071    and    ccr.relationship_type_code = l_rel_type
4072    and    nvl(ccr.active_start_date,sysdate) <= p_ctr_rdg_rec.value_timestamp
4073    and    nvl(ccr.active_end_date,(sysdate+1)) > p_ctr_rdg_rec.value_timestamp
4074    and    ccv.counter_id = ccr.object_counter_id
4075    and    ccv.counter_id = cct.counter_id
4076    and    cct.language = USERENV('LANG');
4077    --
4078    CURSOR UPD_OBJ_CUR IS
4079    SELECT crg.counter_value_id,crg.value_timestamp,crg.counter_id object_counter_id,
4080           crg.adjustment_reading,crg.counter_reading,nvl(ccr.factor,1) factor,
4081           ccv.direction,ccv.reading_type,crg.reset_mode,
4082           ccv.uom_code object_uom_code, cct.name object_counter_name
4083    from CSI_COUNTER_READINGS crg,
4084         CSI_COUNTER_RELATIONSHIPS ccr,
4085         CSI_COUNTERS_B ccv,
4086         CSI_COUNTERS_TL cct
4087    where crg.source_counter_value_id = p_ctr_rdg_rec.counter_value_id
4088    and   ccr.object_counter_id = crg.counter_id
4089    and   ccr.source_counter_id = p_ctr_rdg_rec.counter_id
4090    and   ccr.relationship_type_code = l_rel_type
4091    and   ccv.counter_id = crg.counter_id
4092    and   ccv.counter_id = cct.counter_id
4093    and   cct.language = USERENV('LANG');
4094    --
4095    CURSOR PREV_READING_CUR(p_counter_id IN NUMBER,p_value_timestamp IN DATE) IS
4096    select counter_reading,net_reading,life_to_date_reading,value_timestamp
4097    from CSI_COUNTER_READINGS
4098    where counter_id = p_counter_id
4099    and   nvl(disabled_flag,'N') = 'N'
4100    and   value_timestamp < p_value_timestamp
4101    ORDER BY value_timestamp desc;
4102    --,counter_value_id desc;
4103    --
4104    CURSOR GET_UOM_CLASS(p_uom_code VARCHAR2) IS
4105    SELECT uom_class
4106    FROM   mtl_units_of_measure
4107    WHERE  uom_code =  p_uom_code;
4108 
4109    l_source_uom_class VARCHAR2(10);
4110    l_object_uom_class VARCHAR2(10);
4111    l_source_uom_code  VARCHAR2(3);
4112    l_source_direction VARCHAR2(1);
4113    l_uom_rate         NUMBER;
4114    l_src_reading_type VARCHAR2(1);
4115    l_debug_level       NUMBER;    -- 8214848 - dsingire
4116    l_user_id 				  NUMBER := fnd_global.user_id;        -- 8214848 - dsingire
4117    l_conc_login_id		NUMBER := fnd_global.conc_login_id;  -- 8214848 - dsingire
4118 BEGIN
4119    -- Standard Start of API savepoint
4120    SAVEPOINT  compute_target_counters;
4121    -- Standard call to check for call compatibility.
4122    IF NOT FND_API.Compatible_API_Call (l_api_version,
4123                                        p_api_version,
4124                                        l_api_name   ,
4125                                        G_PKG_NAME   ) THEN
4126       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4127    END IF;
4128    -- Initialize message list if p_init_msg_list is set to TRUE.
4129    IF FND_API.to_Boolean(nvl(p_init_msg_list,FND_API.G_FALSE)) THEN
4130       FND_MSG_PUB.initialize;
4131    END IF;
4132    --  Initialize API return status to success
4133    x_return_status := FND_API.G_RET_STS_SUCCESS;
4134    --
4135 
4136    -- Read the debug profiles values in to global variable 7197402
4137    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
4138 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
4139 	  END IF;                      -- 8214848 - dsingire
4140 
4141     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
4142 
4143    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4144     csi_ctr_gen_utility_pvt.put_line( 'compute_target_counters'                   ||'-'||
4145                                   p_api_version                              ||'-'||
4146                                   p_mode                                     ||'-'||
4147                                   nvl(p_commit,FND_API.G_FALSE)              ||'-'||
4148                                   nvl(p_init_msg_list,FND_API.G_FALSE)       ||'-'||
4149                                   nvl(p_validation_level,FND_API.G_VALID_LEVEL_FULL) );
4150     csi_ctr_gen_utility_pvt.dump_counter_readings_rec(p_ctr_rdg_rec);
4151    END IF;          -- 8214848 - dsingire
4152    --
4153 
4154    --
4155    IF p_txn_rec.transaction_type_id IN (88,91,92,94,95) THEN
4156       l_mode := 'Meter';
4157    ELSE
4158       l_mode := 'Counter';
4159    END IF;
4160    --
4161    IF p_ctr_rdg_rec.counter_id IS NULL OR
4162       p_ctr_rdg_rec.counter_id = FND_API.G_MISS_NUM THEN
4163       csi_ctr_gen_utility_pvt.ExitWithErrMsg
4164 	 ( p_msg_name    =>  'CSI_API_CTR_INVALID',
4165 	   p_token1_name =>  'MODE',
4166 	   p_token1_val  =>  l_mode
4167 	 );
4168    END IF;
4169    --
4170    IF p_ctr_rdg_rec.value_timestamp IS NULL OR
4171       p_ctr_rdg_rec.value_timestamp = FND_API.G_MISS_DATE THEN
4172       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_INVALID_RDG_DATE');
4173    END IF;
4174    --
4175    -- Fundamental Assumption is, the direction of All Target counters should be same as the Source Counter
4176    --
4177    IF p_mode = 'UPDATE' THEN
4178       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4179         csi_ctr_gen_utility_pvt.put_line(' Compute Target Counters - UPDATE');
4180       END IF;          -- 8214848 - dsingire
4181       FOR obj_cur in UPD_OBJ_CUR LOOP
4182 	 IF NVL(obj_cur.direction,'X') NOT IN ('A','D','B') THEN
4183 	    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4184       csi_ctr_gen_utility_pvt.put_line('Target Counter has Invalid Direction...');
4185       END IF;          -- 8214848 - dsingire
4186 	    csi_ctr_gen_utility_pvt.ExitWithErrMsg
4187 		 ( p_msg_name     => 'CSI_API_CTR_INVALID_DIR',
4188 		   p_token1_name  => 'MODE',
4189 		   p_token1_val   => l_mode
4190 		 );
4191 	 END IF;
4192 	 --
4193          BEGIN
4194             SELECT uom_code, direction, reading_type
4195             INTO   l_source_uom_code, l_source_direction, l_src_reading_type
4196             FROM   csi_counters_b
4197             WHERE  counter_id = p_ctr_rdg_rec.counter_id;
4198          EXCEPTION
4199             WHEN OTHERS THEN
4200                NULL;
4201          END;
4202 
4203          /* Validate direction */
4204          IF obj_cur.direction = 'B' and l_source_direction <> 'B'  THEN
4205              CSI_CTR_GEN_UTILITY_PVT.ExitWithErrMsg('CSI_API_CTR_INV_REL_DIR');
4206          END IF;
4207 
4208          IF l_source_direction = 'B' and obj_cur.direction <> 'B' THEN
4209             CSI_CTR_GEN_UTILITY_PVT.ExitWithErrMsg('CSI_API_CTR_INV_REL_DIR');
4210          END IF;
4211 
4212          IF obj_cur.object_uom_code <> l_source_uom_code THEN
4213             /* Validate if same UOM class */
4214             OPEN get_uom_class(obj_cur.object_uom_code);
4215             FETCH get_uom_class into l_object_uom_class;
4216 
4217             IF get_uom_class%notfound THEN
4218                csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_ALL_INVALID_UOM_CODE');
4219             END IF;
4220 
4221             IF get_uom_class%ISOPEN THEN
4222                CLOSE get_uom_class;
4223             END IF;
4224 
4225             OPEN get_uom_class(l_source_uom_code);
4226             FETCH get_uom_class into l_source_uom_class;
4227 
4228             IF get_uom_class%notfound THEN
4229                csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_ALL_INVALID_UOM_CODE');
4230             END IF;
4231 
4232             IF get_uom_class%ISOPEN THEN
4233                CLOSE get_uom_class;
4234             END IF;
4235 
4236             IF l_source_uom_class = l_object_uom_class THEN
4237                /* Do a conversion */
4238                INV_CONVERT.INV_UM_CONVERSION(l_source_uom_code
4239                                              ,obj_cur.object_uom_code
4240                                              ,null
4241                                              ,l_uom_rate);
4242                IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4243                 csi_ctr_gen_utility_pvt.put_line('Object UOM Code = '||obj_cur.object_uom_code);
4244                 csi_ctr_gen_utility_pvt.put_line('Source UOM Code = '||l_source_uom_code);
4245                 csi_ctr_gen_utility_pvt.put_line('UOM Rate = '||to_char(l_uom_rate));
4246                END IF;          -- 8214848 - dsingire
4247                IF l_uom_rate = -99999 THEN
4248                   IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4249                     csi_ctr_gen_utility_pvt.put_line(' Error during the conversion of UOM');
4250                   END IF;          -- 8214848 - dsingire
4251                END IF;
4252             ELSE
4253                l_uom_rate := 1;
4254             END IF;
4255          ELSE
4256             l_uom_rate := 1;
4257          END IF;
4258          --
4259          l_prev_ctr_reading := NULL;
4260 	 l_prev_net_reading := NULL;
4261 	 l_prev_ltd_reading := NULL;
4262 	 l_prev_value_timestamp := NULL;
4263          --
4264 
4265   -- Get the last reading for this counter
4266   -- Bug 	8214848
4267    BEGIN
4268     SELECT CTR_VAL_MAX_SEQ_NO INTO l_ctr_val_max
4269       FROM CSI_COUNTERS_B WHERE COUNTER_ID = obj_cur.object_counter_id;
4270 
4271    SELECT COUNTER_READING,NET_READING,LIFE_TO_DATE_READING,
4272           VALUE_TIMESTAMP
4273          INTO l_prev_ctr_max_reading,
4274               l_prev_net_max_reading,
4275               l_prev_ltd_max_reading,
4276               l_prev_value_max_timestamp
4277               --l_prev_max_comments
4278    FROM CSI_COUNTER_READINGS WHERE COUNTER_VALUE_ID = NVL(l_ctr_val_max,-1);
4279 
4280    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4281     csi_ctr_gen_utility_pvt.put_line('l_ctr_val_max - ' || l_ctr_val_max );
4282    END IF;          -- 8214848 - dsingire
4283 
4284   EXCEPTION
4285    WHEN OTHERS THEN
4286     -- Assign max counter value id to 0 and use the PREV_READING_CUR cursor
4287     l_ctr_val_max := -1;
4288   END;  --
4289 
4290    IF (l_prev_value_max_timestamp <=  obj_cur.value_timestamp
4291             AND NVL(l_ctr_val_max,-1) > 0) THEN
4292 
4293       -- The requested timestamp is greater than the timestamp of the
4294       -- CTR_VAL_MAX_SEQ_NO
4295       l_prev_ctr_reading := l_prev_ctr_max_reading;
4296       l_prev_net_reading := l_prev_net_max_reading;
4297       l_prev_ltd_reading := l_prev_ltd_max_reading;
4298       l_prev_value_timestamp := l_prev_value_max_timestamp;
4299       --l_prev_comments := l_prev_max_comments;
4300 
4301       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4302         csi_ctr_gen_utility_pvt.put_line('Max Value counter id used');
4303       END IF;          -- 8214848 - dsingire
4304 
4305    ELSE
4306 
4307      OPEN PREV_READING_CUR(obj_cur.object_counter_id,obj_cur.value_timestamp);
4308      FETCH PREV_READING_CUR
4309      INTO  l_prev_ctr_reading,
4310            l_prev_net_reading,
4311            l_prev_ltd_reading,
4312            l_prev_value_timestamp;
4313      CLOSE PREV_READING_CUR;
4314 	 END IF;
4315    --
4316          -- p_ctr_rdg_rec.counter_reading contains the Usage from the source counter readings
4317          -- Since there is no change to adjustments, no need to take the passed adjustment.
4318          -- It will be same as the obj_cur.adjustment_reading.
4319 
4320          IF obj_cur.reset_mode IS NOT NULL THEN
4321             l_counter_reading := p_ctr_rdg_rec.counter_reading;
4322          ELSE
4323             IF obj_cur.reading_type = 1 THEN
4324                IF l_source_direction = 'A' AND obj_cur.direction = 'D' THEN
4325                   IF nvl(l_prev_ctr_reading, 0) = 0 THEN
4326                      l_counter_reading := ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor) * -1;
4327                   ELSE
4328                      IF l_prev_ctr_reading < 0 THEN
4329                         l_counter_reading := ((l_prev_ctr_reading * -1) - ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor));
4330                         l_counter_reading := l_counter_reading * -1;
4331                      ELSE
4332                         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4333                           csi_ctr_gen_utility_pvt.put_line('Source is A, Target is D');
4334                           csi_ctr_gen_utility_pvt.put_line('l_prev_ctr_reading = '||to_char(l_prev_ctr_reading));
4335                           csi_ctr_gen_utility_pvt.put_line('p_ctr_reading = '||to_char(p_ctr_rdg_rec.counter_reading));
4336                           csi_ctr_gen_utility_pvt.put_line('l_uom_rate = '||to_char(l_uom_rate));
4337                           csi_ctr_gen_utility_pvt.put_line('factor  = '||to_char(obj_cur.factor));
4338                         END IF;          -- 8214848 - dsingire
4339 
4340                         l_counter_reading := nvl(l_prev_ctr_reading,0) - ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4341                      END IF;
4342                   END IF;
4343                END IF;
4344 
4345                IF l_source_direction = 'D' and obj_cur.direction = 'A' THEN
4346                   IF nvl(l_prev_ctr_reading, 0) = 0 THEN
4347                      l_counter_reading := ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4348 
4349                      IF l_counter_reading < 0 THEN
4350                         l_counter_reading := l_counter_reading * -1;
4351                      END IF;
4352                   ELSE
4353                      l_counter_reading := nvl(l_prev_ctr_reading,0) + ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4354                   END IF;
4355                END IF;
4356 
4357                IF obj_cur.direction = 'A'  and l_source_direction = 'A' THEN
4358                   l_counter_reading := nvl(l_prev_ctr_reading,0) + ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4359                ELSIF obj_cur.direction = 'D' and l_source_direction = 'D' THEN
4360                   IF nvl(l_prev_ctr_reading, 0) = 0 THEN
4361                      l_counter_reading := ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4362                   ELSE
4363                      IF l_prev_ctr_reading < 0 THEN
4364                         l_counter_reading := ((l_prev_ctr_reading * -1) - ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor));
4365                         l_counter_reading := l_counter_reading * -1;
4366                      ELSE
4367                         l_counter_reading := nvl(l_prev_ctr_reading,0) - ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4368                      END IF;
4369                   END IF;
4370                ELSIF obj_cur.direction = 'B'  and l_source_direction = 'B' THEN
4371                   l_counter_reading := nvl(l_prev_ctr_reading,0) + ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4372                END IF;
4373             ELSE
4374                l_counter_reading := (p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor;
4375             END IF;
4376          END IF;
4377 
4378 	 -- Calculate Net and LTD Readings
4379          IF obj_cur.reset_mode IS NULL THEN
4380             Calculate_Net_Reading
4381 	       ( p_prev_net_rdg      => l_prev_net_reading
4382 		,p_prev_ltd_rdg      => l_prev_ltd_reading
4383 		,p_curr_rdg          => l_counter_reading
4384 		,p_prev_rdg          => l_prev_ctr_reading
4385 		,p_curr_adj          => obj_cur.adjustment_reading
4386 		,p_rdg_type          => obj_cur.reading_type
4387 		,p_direction         => obj_cur.direction
4388 		,px_net_rdg          => l_net_reading
4389 		,px_ltd_rdg          => l_ltd_reading
4390 		,l_ctr_rdg_rec      => p_ctr_rdg_rec -- added 6398254
4391 	       );
4392             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4393               csi_ctr_gen_utility_pvt.put_line('Prev net reading = '||to_char(l_prev_net_reading));
4394               csi_ctr_gen_utility_pvt.put_line('Prev ltd reading = '||to_char(l_prev_ltd_reading));
4395               csi_ctr_gen_utility_pvt.put_line('Prev reading  = '||to_char(l_prev_ctr_reading));
4396               csi_ctr_gen_utility_pvt.put_line('5. Current reading  = '||to_char(l_counter_reading));
4397             END IF;          -- 8214848 - dsingire
4398             IF obj_cur.reading_type = 1  THEN -- Added condition for bug 10418370, Check on direct should be done for absolute counters alone
4399               IF obj_cur.direction = 'D' THEN
4400                  IF l_counter_reading > nvl(l_prev_ctr_reading, l_counter_reading) THEN
4401                     csi_ctr_gen_utility_pvt.ExitWithErrMsg
4402                         ( p_msg_name       =>  'CSI_API_CTR_INV_RDG',
4403                           p_token1_name    =>  'DIRECTION',
4404                           -- p_token1_val     =>  obj_cur.direction,
4405                           p_token1_val     =>  'a Descending',
4406                           p_token2_name    =>  'MODE',
4407                           p_token2_val     =>  l_mode,
4408                           p_token3_name    =>  'CTR_NAME',
4409                           p_token3_val     =>  obj_cur.object_counter_name
4410                       );
4411                  END IF;
4412               ELSIF obj_cur.direction = 'A' THEN
4413                  IF l_counter_reading < nvl(l_prev_ctr_reading, l_counter_reading) THEN
4414                     IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4415                       csi_ctr_gen_utility_pvt.put_line('6. Current reading ');
4416                     END IF;          -- 8214848 - dsingire
4417                     csi_ctr_gen_utility_pvt.ExitWithErrMsg
4418                       ( p_msg_name       =>  'CSI_API_CTR_INV_RDG',
4419                         p_token1_name    =>  'DIRECTION',
4420                         -- p_token1_val     =>  obj_cur.direction,
4421                         p_token1_val     =>  'an Ascending',
4422                         p_token2_name    =>  'MODE',
4423                         p_token2_val     =>  l_mode,
4424                         p_token3_name    =>  'CTR_NAME',
4425                         p_token3_val     =>  obj_cur.object_counter_name
4426                       );
4427                  END IF;
4428               END IF;
4429             END IF;
4430          ELSE
4431             l_net_reading := l_prev_net_reading;
4432             l_ltd_reading := l_prev_ltd_reading;
4433          END IF;
4434 	 --
4435         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4436           csi_ctr_gen_utility_pvt.put_line('Updating Target Counter Value ID : '||to_char(obj_cur.counter_value_id));
4437         END IF;          -- 8214848 - dsingire
4438 
4439 	 Update CSI_COUNTER_READINGS
4440 	 set counter_reading = l_counter_reading,
4441 	     net_reading = l_net_reading,
4442 	     life_to_date_reading = l_ltd_reading,
4443 	     last_update_date = sysdate,
4444 	     last_updated_by = l_user_id
4445 	 where counter_value_id = obj_cur.counter_value_id;
4446       END LOOP;
4447    ELSIF p_mode = 'CREATE' THEN
4448       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4449         csi_ctr_gen_utility_pvt.put_line(' Compute Target Counters - CREATE');
4450       END IF;          -- 8214848 - dsingire
4451       FOR obj_cur IN OBJECT_CTR_CUR LOOP
4452          Begin
4453 	    IF NVL(obj_cur.direction,'X') NOT IN ('A','D','B') THEN
4454         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4455 	       csi_ctr_gen_utility_pvt.put_line('Target Counter has Invalid Direction...');
4456         END IF;          -- 8214848 - dsingire
4457 	       csi_ctr_gen_utility_pvt.ExitWithErrMsg
4458 		    ( p_msg_name     => 'CSI_API_CTR_INVALID_DIR',
4459 		      p_token1_name  => 'MODE',
4460 		      p_token1_val   => l_mode
4461                     );
4462 	    END IF;
4463 	    --
4464              BEGIN
4465                 SELECT uom_code, direction, reading_type
4466                 INTO   l_source_uom_code, l_source_direction, l_src_reading_type
4467                 FROM   csi_counters_b
4468                 WHERE  counter_id = p_ctr_rdg_rec.counter_id;
4469              EXCEPTION
4470                 WHEN OTHERS THEN
4471                    NULL;
4472              END;
4473 
4474              /* Validate direction */
4475              IF obj_cur.direction = 'B' and l_source_direction <> 'B'  THEN
4476                 CSI_CTR_GEN_UTILITY_PVT.ExitWithErrMsg('CSI_API_CTR_INV_REL_DIR');
4477              END IF;
4478 
4479              IF l_source_direction = 'B' and obj_cur.direction <> 'B' THEN
4480                 CSI_CTR_GEN_UTILITY_PVT.ExitWithErrMsg('CSI_API_CTR_INV_REL_DIR');
4481              END IF;
4482 
4483              IF obj_cur.object_uom_code <> l_source_uom_code THEN
4484                 /* Validate if same UOM class */
4485                 OPEN get_uom_class(obj_cur.object_uom_code);
4486                 FETCH get_uom_class into l_object_uom_class;
4487 
4488                 IF get_uom_class%notfound THEN
4489                    csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_ALL_INVALID_UOM_CODE');
4490                 END IF;
4491 
4492                 IF get_uom_class%ISOPEN THEN
4493                    CLOSE get_uom_class;
4494                 END IF;
4495 
4496                 OPEN get_uom_class(l_source_uom_code);
4497                 FETCH get_uom_class into l_source_uom_class;
4498 
4499                 IF get_uom_class%notfound THEN
4500                    csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_ALL_INVALID_UOM_CODE');
4501                 END IF;
4502 
4503                 IF get_uom_class%ISOPEN THEN
4504                    CLOSE get_uom_class;
4505                 END IF;
4506 
4507                 IF l_source_uom_class = l_object_uom_class THEN
4508                    /* Do a conversion */
4509                    INV_CONVERT.INV_UM_CONVERSION(l_source_uom_code
4510                                                  ,obj_cur.object_uom_code
4511                                                  ,null
4512                                                  ,l_uom_rate);
4513                    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4514                     csi_ctr_gen_utility_pvt.put_line('Object UOM Code = '||obj_cur.object_uom_code);
4515                     csi_ctr_gen_utility_pvt.put_line('Source UOM Code = '||l_source_uom_code);
4516                     csi_ctr_gen_utility_pvt.put_line('UOM Rate = '||to_char(l_uom_rate));
4517                    END IF;          -- 8214848 - dsingire
4518                    IF l_uom_rate = -99999 THEN
4519                     IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4520                       csi_ctr_gen_utility_pvt.put_line(' Error during the conversion of UOM');
4521                     END IF;          -- 8214848 - dsingire
4522                    END IF;
4523                 ELSE
4524                    l_uom_rate := 1;
4525                 END IF;
4526              ELSE
4527                 l_uom_rate := 1;
4528              END IF;
4529 
4530             --
4531 	    l_ctr_rdg_rec := l_temp_ctr_rdg_rec;
4532 	    --
4533 	    l_ctr_rdg_rec.counter_id := obj_cur.object_counter_id;
4534 	    l_ctr_rdg_rec.value_timestamp := p_ctr_rdg_rec.value_timestamp;
4535 	    l_ctr_rdg_rec.adjustment_type := p_ctr_rdg_rec.adjustment_type;
4536 	    l_ctr_rdg_rec.adjustment_reading := p_ctr_rdg_rec.adjustment_reading;
4537 	    l_ctr_rdg_rec.source_counter_value_id := p_ctr_rdg_rec.counter_value_id;
4538 	    l_ctr_rdg_rec.source_code := p_ctr_rdg_rec.source_code;
4539 	    l_ctr_rdg_rec.source_line_id := p_ctr_rdg_rec.source_line_id;
4540 	    l_ctr_rdg_rec.comments := p_ctr_rdg_rec.comments;
4541 	    --
4542 	    -- Get the last reading for this counter
4543 	    l_prev_ctr_reading := NULL;
4544 	    l_prev_net_reading := NULL;
4545 	    l_prev_ltd_reading := NULL;
4546 	    l_prev_value_timestamp := NULL;
4547 	    --
4548 
4549         -- Get the last reading for this counter
4550   -- Bug 	8214848
4551    BEGIN
4552     SELECT CTR_VAL_MAX_SEQ_NO INTO l_ctr_val_max
4553       FROM CSI_COUNTERS_B WHERE COUNTER_ID = obj_cur.object_counter_id;
4554 
4555    SELECT COUNTER_READING,NET_READING,LIFE_TO_DATE_READING,
4556           VALUE_TIMESTAMP
4557          INTO l_prev_ctr_max_reading,
4558               l_prev_net_max_reading,
4559               l_prev_ltd_max_reading,
4560               l_prev_value_max_timestamp
4561               --l_prev_max_comments
4562    FROM CSI_COUNTER_READINGS WHERE COUNTER_VALUE_ID = NVL(l_ctr_val_max,-1);
4563 
4564    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4565     csi_ctr_gen_utility_pvt.put_line('l_ctr_val_max - ' || l_ctr_val_max );
4566    END IF;          -- 8214848 - dsingire
4567 
4568   EXCEPTION
4569    WHEN OTHERS THEN
4570     -- Assign max counter value id to 0 and use the PREV_READING_CUR cursor
4571     l_ctr_val_max := -1;
4572   END;  --
4573 
4574    IF (l_prev_value_max_timestamp <=  p_ctr_rdg_rec.value_timestamp
4575             AND NVL(l_ctr_val_max,-1) > 0) THEN
4576 
4577       -- The requested timestamp is greater than the timestamp of the
4578       -- CTR_VAL_MAX_SEQ_NO
4579       l_prev_ctr_reading := l_prev_ctr_max_reading;
4580       l_prev_net_reading := l_prev_net_max_reading;
4581       l_prev_ltd_reading := l_prev_ltd_max_reading;
4582       l_prev_value_timestamp := l_prev_value_max_timestamp;
4583       --l_prev_comments := l_prev_max_comments;
4584 
4585       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4586         csi_ctr_gen_utility_pvt.put_line('Max Value counter id used');
4587       END IF;          -- 8214848 - dsingire
4588 
4589    ELSE
4590 
4591 	    OPEN PREV_READING_CUR(obj_cur.object_counter_id,p_ctr_rdg_rec.value_timestamp);
4592 	    FETCH PREV_READING_CUR
4593 	    INTO  l_prev_ctr_reading,
4594 		  l_prev_net_reading,
4595 		  l_prev_ltd_reading,
4596 		  l_prev_value_timestamp;
4597 	    CLOSE PREV_READING_CUR;
4598 
4599    END IF;
4600       --
4601             IF l_prev_ctr_reading IS NULL AND
4602                (p_ctr_rdg_rec.adjustment_type IS NOT NULL AND
4603                 p_ctr_rdg_rec.adjustment_type <> FND_API.G_MISS_CHAR) THEN
4604                IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4605                   csi_ctr_gen_utility_pvt.put_line('First reading of this Target Counter '||
4606                      to_char(obj_cur.object_counter_id)||' cannot be an Adjustment reading. Ingoring it..');
4607                END IF;          -- 8214848 - dsingire
4608                Raise Process_next;
4609             END IF;
4610             --
4611             /* Check if the readings needed to be reverse based on the
4612                source and target direction combination */
4613             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4614               csi_ctr_gen_utility_pvt.put_line('Reading Type = '||to_char(obj_cur.reading_type));
4615               csi_ctr_gen_utility_pvt.put_line('Source Direction = '||l_source_direction);
4616               csi_ctr_gen_utility_pvt.put_line('Object Direction = '||obj_cur.direction);
4617               csi_ctr_gen_utility_pvt.put_line('Factor = '||to_char(obj_cur.factor));
4618               csi_ctr_gen_utility_pvt.put_line('UOM Rate = '||to_char(l_uom_rate));
4619               csi_ctr_gen_utility_pvt.put_line('target prev rdg = '||to_char(l_prev_ctr_reading));
4620               csi_ctr_gen_utility_pvt.put_line('source prev rdg = '||to_char(p_ctr_rdg_rec.counter_reading));
4621             END IF;          -- 8214848 - dsingire
4622 	    IF obj_cur.reading_type = 1 THEN
4623                IF l_source_direction = 'A' AND obj_cur.direction = 'D' THEN
4624                   IF nvl(l_prev_ctr_reading, 0) = 0 THEN
4625                      l_counter_reading := ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor) * -1;
4626                      IF p_ctr_rdg_rec.adjustment_reading is not null and p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM then
4627                         l_ctr_rdg_rec.adjustment_reading := ((p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor) * -1;
4628                      END IF;
4629                   ELSE
4630                      IF l_prev_ctr_reading < 0 THEN
4631                         l_counter_reading := ((l_prev_ctr_reading * -1) - (((p_ctr_rdg_rec.counter_reading * -1) * l_uom_rate) * obj_cur.factor));
4632                         l_counter_reading := l_counter_reading * -1;
4633                         IF p_ctr_rdg_rec.adjustment_reading is not null and p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM then
4634                            l_ctr_rdg_rec.adjustment_reading := (p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor;
4635                            l_ctr_rdg_rec.adjustment_reading := l_ctr_rdg_rec.adjustment_reading * -1;
4636                         END IF;
4637                      ELSE
4638                         l_counter_reading := nvl(l_prev_ctr_reading,0) - ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4639                         IF p_ctr_rdg_rec.adjustment_reading is not null and p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM then
4640                            l_ctr_rdg_rec.adjustment_reading := (p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor;
4641                         END IF;
4642                      END IF;
4643                   END IF;
4644                   IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4645                     csi_ctr_gen_utility_pvt.put_line('New target reading = '||to_char(l_counter_reading));
4646                   END IF;          -- 8214848 - dsingire
4647               END IF;
4648 
4649 
4650                IF l_source_direction = 'D' and obj_cur.direction = 'A' THEN
4651                   IF nvl(l_prev_ctr_reading, 0) = 0 THEN
4652                      l_counter_reading := ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4653 
4654                      IF l_counter_reading < 0 THEN
4655                         l_counter_reading := l_counter_reading * -1;
4656                      END IF;
4657 
4658                      IF p_ctr_rdg_rec.adjustment_reading is not null and p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM then
4659                         l_ctr_rdg_rec.adjustment_reading := ((p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor);
4660 
4661                         IF l_ctr_rdg_rec.adjustment_reading < 0 THEN
4662                            l_ctr_rdg_rec.adjustment_reading := l_ctr_rdg_rec.adjustment_reading * -1;
4663                         END IF;
4664                      END IF;
4665                   ELSE
4666                      l_counter_reading := nvl(l_prev_ctr_reading,0) + ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4667                      IF p_ctr_rdg_rec.adjustment_reading is not null  and p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM then
4668                         l_ctr_rdg_rec.adjustment_reading := (p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor;
4669                      END IF;
4670                   END IF;
4671                END IF;
4672                IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4673                 csi_ctr_gen_utility_pvt.put_line('New target reading = '||to_char(l_counter_reading));
4674                END IF;          -- 8214848 - dsingire
4675 
4676 	       IF obj_cur.direction = 'A'  and l_source_direction = 'A' THEN
4677 		  l_counter_reading := nvl(l_prev_ctr_reading,0) + ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4678                   IF p_ctr_rdg_rec.adjustment_reading is not null and p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM then
4679 		     l_ctr_rdg_rec.adjustment_reading := (p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor;
4680                   END IF;
4681 	       ELSIF obj_cur.direction = 'D' and l_source_direction = 'D' THEN
4682                   IF nvl(l_prev_ctr_reading, 0) = 0 THEN
4683                      l_counter_reading := ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4684                      IF p_ctr_rdg_rec.adjustment_reading is not null and p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM then
4685                         l_ctr_rdg_rec.adjustment_reading := ((p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor);
4686                      END IF;
4687                   ELSE
4688                      IF l_prev_ctr_reading < 0 THEN
4689 		        l_counter_reading := ((l_prev_ctr_reading * -1) - ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor));
4690                         l_counter_reading := l_counter_reading * -1;
4691                         IF p_ctr_rdg_rec.adjustment_reading is not null  and p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM then
4692 		           l_ctr_rdg_rec.adjustment_reading := (p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor;
4693                            l_ctr_rdg_rec.adjustment_reading := l_ctr_rdg_rec.adjustment_reading * -1;
4694                         END IF;
4695                      ELSE
4696 		        l_counter_reading := nvl(l_prev_ctr_reading,0) - ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4697                         IF p_ctr_rdg_rec.adjustment_reading is not null then
4698 		           l_ctr_rdg_rec.adjustment_reading := (p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor;
4699                         END IF;
4700                      END IF;
4701 	          END IF;
4702             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4703               csi_ctr_gen_utility_pvt.put_line('New target reading = '||to_char(l_counter_reading));
4704             END IF;          -- 8214848 - dsingire
4705                ELSIF obj_cur.direction = 'B'  and l_source_direction = 'B' THEN
4706                   l_counter_reading := nvl(l_prev_ctr_reading,0) + ((p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor);
4707                   IF p_ctr_rdg_rec.adjustment_reading is not null and p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM then
4708                      l_ctr_rdg_rec.adjustment_reading := (p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor;
4709 	          END IF;
4710 	       END IF;
4711 	    ELSE
4712 	       l_counter_reading := (p_ctr_rdg_rec.counter_reading * l_uom_rate) * obj_cur.factor;
4713                IF p_ctr_rdg_rec.adjustment_reading is not null and p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM then
4714 	          l_ctr_rdg_rec.adjustment_reading := (p_ctr_rdg_rec.adjustment_reading * l_uom_rate) * obj_cur.factor;
4715 	       END IF;
4716 	    END IF;
4717       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4718         csi_ctr_gen_utility_pvt.put_line('New target reading = '||to_char(l_counter_reading));
4719       END IF;          -- 8214848 - dsingire
4720 	    -- Calculate Net and LTD Readings
4721 	    Calculate_Net_Reading
4722 	       ( p_prev_net_rdg      => l_prev_net_reading
4723 		,p_prev_ltd_rdg      => l_prev_ltd_reading
4724 		,p_curr_rdg          => l_counter_reading
4725 		,p_prev_rdg          => l_prev_ctr_reading
4726 		,p_curr_adj          => l_ctr_rdg_rec.adjustment_reading
4727 		,p_rdg_type          => obj_cur.reading_type
4728 		,p_direction         => obj_cur.direction
4729 		,px_net_rdg          => l_net_reading
4730 		,px_ltd_rdg          => l_ltd_reading
4731 		,l_ctr_rdg_rec      => p_ctr_rdg_rec -- added 6398254
4732 	       );
4733 
4734             IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4735               csi_ctr_gen_utility_pvt.put_line('Current reading  = '||to_char(l_counter_reading));
4736             END IF;          -- 8214848 - dsingire
4737             IF obj_cur.reading_type = 1  THEN -- Added condition for bug 10418370, Check on direct should be done for absolute counters alone
4738               IF obj_cur.direction = 'D' THEN
4739                  IF l_counter_reading > nvl(l_prev_ctr_reading, l_counter_reading) THEN
4740                     IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4741                       csi_ctr_gen_utility_pvt.put_line('7. Current reading ');
4742                     END IF;          -- 8214848 - dsingire
4743                     csi_ctr_gen_utility_pvt.ExitWithErrMsg
4744                         ( p_msg_name       =>  'CSI_API_CTR_INV_RDG',
4745                           p_token1_name    =>  'DIRECTION',
4746                           -- p_token1_val     =>  obj_cur.direction,
4747                           p_token1_val     =>  'a Descending',
4748                           p_token2_name    =>  'MODE',
4749                           p_token2_val     =>  l_mode,
4750                           p_token3_name    =>  'CTR_NAME',
4751                           p_token3_val     =>  obj_cur.object_counter_name
4752                         );
4753                  END IF;
4754               ELSIF obj_cur.direction = 'A' THEN
4755                  IF l_counter_reading < nvl(l_prev_ctr_reading, l_counter_reading) THEN
4756                     IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4757                       csi_ctr_gen_utility_pvt.put_line('8. Current reading ');
4758                     END IF;          -- 8214848 - dsingire
4759                     csi_ctr_gen_utility_pvt.ExitWithErrMsg
4760                         ( p_msg_name       =>  'CSI_API_CTR_INV_RDG',
4761                           p_token1_name    =>  'DIRECTION',
4762                           -- p_token1_val     =>  obj_cur.direction,
4763                           p_token1_val     =>  'an Ascending',
4764                           p_token2_name    =>  'MODE',
4765                           p_token2_val     =>  l_mode,
4766                           p_token3_name    =>  'CTR_NAME',
4767                           p_token3_val     =>  obj_cur.object_counter_name
4768                         );
4769                  END IF;
4770               END IF;
4771             END IF;
4772             --
4773             IF p_txn_rec.transaction_type_id in (88,91,92,94,95) THEN
4774                IF p_txn_rec.transaction_type_id = 91 THEN
4775                   l_instance_id := p_txn_rec.source_header_ref_id;
4776                ELSE
4777                   l_instance_id := null;
4778                END IF;
4779                IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4780                   csi_ctr_gen_utility_pvt.put_line('Calling Insert Meter Log...');
4781                END IF;          -- 8214848 - dsingire
4782                Eam_Asset_Log_Pvt.Insert_Meter_Log
4783                   (
4784                     P_api_version           =>  1.0,
4785                     P_init_msg_list         =>  fnd_api.g_false,
4786                     P_commit                =>  fnd_api.g_false,
4787                     P_validation_level      =>  fnd_api.g_valid_level_full,
4788                     P_event_date            =>  l_ctr_rdg_rec.value_timestamp,
4789                     P_instance_id           =>  l_instance_id,
4790                     P_ref_id                =>  l_ctr_rdg_rec.counter_id,
4791                     X_return_status         =>  x_return_status,
4792                     X_msg_count             =>  x_msg_count,
4793                     X_msg_data              =>  x_msg_data
4794                );
4795                -- Since this is only for logging we are ignoring the x_return_status.
4796                -- Just report the API error and proceed.
4797                --
4798 	       IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
4799          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4800 		      csi_ctr_gen_utility_pvt.put_line('ERROR FROM Insert_Meter_Log API ');
4801          END IF;          -- 8214848 - dsingire
4802 		  l_msg_index := 1;
4803 		  l_msg_count := x_msg_count;
4804 		  WHILE l_msg_count > 0 LOOP
4805 		     x_msg_data := FND_MSG_PUB.GET
4806 		     (  l_msg_index,
4807 			FND_API.G_FALSE
4808 		     );
4809 		     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
4810 		     l_msg_index := l_msg_index + 1;
4811 		     l_msg_count := l_msg_count - 1;
4812 		  END LOOP;
4813                   -- DO NOT RAISE ERROR
4814 	       END IF;
4815             END IF; -- EAM Logging Check
4816             --
4817             IF p_txn_rec.transaction_type_id = 92 THEN
4818               IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4819                csi_ctr_gen_utility_pvt.put_line('Calling Update_Last_Service_Reading_Wo...');
4820               END IF;          -- 8214848 - dsingire
4821               -- Added condition for Bug 12536426
4822               -- For change counters, LifeToDate reading needs to be passed to  Update_Last_Service_Reading_Wo
4823               IF obj_cur.reading_type = 2 THEN
4824                Eam_Meters_Util.Update_Last_Service_Reading_Wo
4825                   (
4826                     p_wip_entity_id    =>  p_txn_rec.source_header_ref_id,
4827                     p_meter_id         =>  l_ctr_rdg_rec.counter_id,
4828 	            p_meter_reading    =>  l_ltd_reading,
4829 	            p_wo_end_date      =>  l_ctr_rdg_rec.value_timestamp,
4830                     X_return_status    =>  x_return_status,
4831                     X_msg_count        =>  x_msg_count,
4832                     X_msg_data         =>  x_msg_data
4833 	           );
4834              ELSE
4835                Eam_Meters_Util.Update_Last_Service_Reading_Wo
4836                   (
4837                     p_wip_entity_id    =>  p_txn_rec.source_header_ref_id,
4838                     p_meter_id         =>  l_ctr_rdg_rec.counter_id,
4839 	            p_meter_reading    =>  l_counter_reading,
4840 	            p_wo_end_date      =>  l_ctr_rdg_rec.value_timestamp,
4841                     X_return_status    =>  x_return_status,
4842                     X_msg_count        =>  x_msg_count,
4843                     X_msg_data         =>  x_msg_data
4844 	           );
4845              END IF; --Bug 12536426
4846 
4847 	       IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
4848 		  csi_ctr_gen_utility_pvt.put_line('ERROR FROM Update_Last_Service_Reading_Wo API ');
4849 		  l_msg_index := 1;
4850 		  l_msg_count := x_msg_count;
4851 		  WHILE l_msg_count > 0 LOOP
4852 		     x_msg_data := FND_MSG_PUB.GET
4853 		     (  l_msg_index,
4854 			FND_API.G_FALSE
4855 		     );
4856 		     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
4857 		     l_msg_index := l_msg_index + 1;
4858 		     l_msg_count := l_msg_count - 1;
4859 		  END LOOP;
4860 		  RAISE FND_API.G_EXC_ERROR;
4861 	       END IF;
4862             END IF; -- Call Update_Last_Service_Reading_WO check
4863 
4864 	    --
4865 	    -- Generate the Value_id for insert
4866 	    l_process_flag := TRUE;
4867 	    WHILE l_process_flag LOOP
4868 	       select CSI_COUNTER_READINGS_S.nextval
4869 	       into l_ctr_rdg_rec.counter_value_id from dual;
4870 	       IF NOT Counter_Value_Exists(l_ctr_rdg_rec.counter_value_id) THEN
4871 		  l_process_flag := FALSE;
4872 	       END IF;
4873 	    END LOOP;
4874 	    --
4875       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
4876 	      csi_ctr_gen_utility_pvt.put_line('Inserting Target Counter ID : '||to_char(l_ctr_rdg_rec.counter_id));
4877       END IF;          -- 8214848 - dsingire
4878 	    -- Call the Table Handler to insert into CSI_COUNTER_READINGS
4879 	    CSI_COUNTER_READINGS_PKG.Insert_Row(
4880 		px_COUNTER_VALUE_ID         =>  l_ctr_rdg_rec.counter_value_id
4881 	       ,p_COUNTER_ID                =>  l_ctr_rdg_rec.counter_id
4882 	       ,p_VALUE_TIMESTAMP           =>  l_ctr_rdg_rec.value_timestamp
4883 	       ,p_COUNTER_READING           =>  l_counter_reading
4884 	       ,p_RESET_MODE                =>  p_ctr_rdg_rec.reset_mode  -- NULL 6398254
4885 	       ,p_RESET_REASON              =>  p_ctr_rdg_rec.reset_reason -- NULL 6398254
4886 	       ,p_ADJUSTMENT_TYPE           =>  l_ctr_rdg_rec.adjustment_type
4887 	       ,p_ADJUSTMENT_READING        =>  l_ctr_rdg_rec.adjustment_reading
4888 	       ,p_OBJECT_VERSION_NUMBER     =>  1
4889 	       ,p_LAST_UPDATE_DATE          =>  SYSDATE
4890 	       ,p_LAST_UPDATED_BY           =>  l_user_id
4891 	       ,p_CREATION_DATE             =>  SYSDATE
4892 	       ,p_CREATED_BY                =>  l_user_id
4893 	       ,p_LAST_UPDATE_LOGIN         =>  l_conc_login_id
4894 	       ,p_ATTRIBUTE1                =>  l_ctr_rdg_rec.attribute1
4895 	       ,p_ATTRIBUTE2                =>  l_ctr_rdg_rec.attribute2
4896 	       ,p_ATTRIBUTE3                =>  l_ctr_rdg_rec.attribute3
4897 	       ,p_ATTRIBUTE4                =>  l_ctr_rdg_rec.attribute4
4898 	       ,p_ATTRIBUTE5                =>  l_ctr_rdg_rec.attribute5
4899 	       ,p_ATTRIBUTE6                =>  l_ctr_rdg_rec.attribute6
4900 	       ,p_ATTRIBUTE7                =>  l_ctr_rdg_rec.attribute7
4901 	       ,p_ATTRIBUTE8                =>  l_ctr_rdg_rec.attribute8
4902 	       ,p_ATTRIBUTE9                =>  l_ctr_rdg_rec.attribute9
4903 	       ,p_ATTRIBUTE10               =>  l_ctr_rdg_rec.attribute10
4904 	       ,p_ATTRIBUTE11               =>  l_ctr_rdg_rec.attribute11
4905 	       ,p_ATTRIBUTE12               =>  l_ctr_rdg_rec.attribute12
4906 	       ,p_ATTRIBUTE13               =>  l_ctr_rdg_rec.attribute13
4907 	       ,p_ATTRIBUTE14               =>  l_ctr_rdg_rec.attribute14
4908 	       ,p_ATTRIBUTE15               =>  l_ctr_rdg_rec.attribute15
4909 	       ,p_ATTRIBUTE16               =>  l_ctr_rdg_rec.attribute16
4910 	       ,p_ATTRIBUTE17               =>  l_ctr_rdg_rec.attribute17
4911 	       ,p_ATTRIBUTE18               =>  l_ctr_rdg_rec.attribute18
4912 	       ,p_ATTRIBUTE19               =>  l_ctr_rdg_rec.attribute19
4913 	       ,p_ATTRIBUTE20               =>  l_ctr_rdg_rec.attribute20
4914 	       ,p_ATTRIBUTE21               =>  l_ctr_rdg_rec.attribute21
4915 	       ,p_ATTRIBUTE22               =>  l_ctr_rdg_rec.attribute22
4916 	       ,p_ATTRIBUTE23               =>  l_ctr_rdg_rec.attribute23
4917 	       ,p_ATTRIBUTE24               =>  l_ctr_rdg_rec.attribute24
4918 	       ,p_ATTRIBUTE25               =>  l_ctr_rdg_rec.attribute25
4919 	       ,p_ATTRIBUTE26               =>  l_ctr_rdg_rec.attribute26
4920 	       ,p_ATTRIBUTE27               =>  l_ctr_rdg_rec.attribute27
4921 	       ,p_ATTRIBUTE28               =>  l_ctr_rdg_rec.attribute28
4922 	       ,p_ATTRIBUTE29               =>  l_ctr_rdg_rec.attribute29
4923 	       ,p_ATTRIBUTE30               =>  l_ctr_rdg_rec.attribute30
4924 	       ,p_ATTRIBUTE_CATEGORY        =>  l_ctr_rdg_rec.attribute_category
4925 	       ,p_MIGRATED_FLAG             =>  'N'
4926 	       ,p_COMMENTS                  =>  l_ctr_rdg_rec.comments
4927 	       ,p_LIFE_TO_DATE_READING      =>  l_ltd_reading
4928 	       ,p_TRANSACTION_ID            =>  p_txn_rec.transaction_id
4929 	       ,p_AUTOMATIC_ROLLOVER_FLAG   =>  l_ctr_rdg_rec.automatic_rollover_flag
4930 	       ,p_INCLUDE_TARGET_RESETS     =>  l_ctr_rdg_rec.include_target_resets
4931 	       ,p_SOURCE_COUNTER_VALUE_ID   =>  l_ctr_rdg_rec.source_counter_value_id
4932 	       ,p_NET_READING               =>  l_net_reading
4933 	       ,p_DISABLED_FLAG             =>  'N'
4934 	       ,p_SOURCE_CODE               =>  l_ctr_rdg_rec.source_code
4935 	       ,p_SOURCE_LINE_ID            =>  l_ctr_rdg_rec.source_line_id
4936 	       ,p_INITIAL_READING_FLAG      =>  l_ctr_rdg_rec.initial_reading_flag
4937 	     );
4938 
4939           --Add call to CSI_COUNTER_PVT.update_ctr_val_max_seq_no
4940           --for bug 7374316
4941           CSI_COUNTER_PVT.update_ctr_val_max_seq_no(
4942             p_api_version           =>  1.0
4943             ,p_commit                =>  fnd_api.g_false
4944             ,p_init_msg_list         =>  fnd_api.g_true
4945             ,p_validation_level      =>  fnd_api.g_valid_level_full
4946             ,p_counter_id            =>  l_ctr_rdg_rec.counter_id
4947             ,px_ctr_val_max_seq_no   =>  l_ctr_rdg_rec.counter_value_id
4948             ,x_return_status         =>  x_return_status
4949             ,x_msg_count             =>  x_msg_count
4950             ,x_msg_data              =>  x_msg_data
4951           );
4952           IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
4953             csi_ctr_gen_utility_pvt.put_line('ERROR FROM CSI_COUNTER_PVT.update_ctr_val_max_seq_no');
4954             l_msg_index := 1;
4955             l_msg_count := x_msg_count;
4956             WHILE l_msg_count > 0 LOOP
4957               x_msg_data := FND_MSG_PUB.GET
4958               (  l_msg_index,
4959                  FND_API.G_FALSE
4960               );
4961               csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
4962               l_msg_index := l_msg_index + 1;
4963               l_msg_count := l_msg_count - 1;
4964             END LOOP;
4965             RAISE FND_API.G_EXC_ERROR;
4966           END IF;
4967          Exception
4968             when Process_next then
4969                null;
4970          End;
4971       END LOOP; -- Obj Cursor
4972    END IF; -- p_mode check
4973    --
4974    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
4975       COMMIT WORK;
4976    END IF;
4977    --
4978    -- Standard call to get message count and IF count is  get message info.
4979    FND_MSG_PUB.Count_And_Get
4980       ( p_count  =>  x_msg_count,
4981         p_data   =>  x_msg_data
4982       );
4983 EXCEPTION
4984    WHEN FND_API.G_EXC_ERROR THEN
4985       x_return_status := FND_API.G_RET_STS_ERROR ;
4986       ROLLBACK TO compute_target_counters;
4987       FND_MSG_PUB.Count_And_Get
4988          ( p_count => x_msg_count,
4989            p_data  => x_msg_data
4990          );
4991    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4992       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
4993       ROLLBACK TO compute_target_counters;
4994       FND_MSG_PUB.Count_And_Get
4995          ( p_count => x_msg_count,
4996            p_data  => x_msg_data
4997          );
4998    WHEN OTHERS THEN
4999       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
5000       ROLLBACK TO compute_target_counters;
5001       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5002          FND_MSG_PUB.Add_Exc_Msg
5003             ( G_PKG_NAME,
5004               l_api_name
5005             );
5006       END IF;
5007       FND_MSG_PUB.Count_And_Get
5008          ( p_count  => x_msg_count,
5009            p_data   => x_msg_data
5010          );
5011 END Compute_Target_Counters;
5012 --
5013 /*----------------------------------------------------*/
5014 /* procedure name: Update_Counter_Reading             */
5015 /* description :   procedure used to                  */
5016 /*                 disable counter readings           */
5017 /*----------------------------------------------------*/
5018 
5019 PROCEDURE Update_Counter_Reading
5020  (
5021      p_api_version           IN     NUMBER
5022     ,p_commit                IN     VARCHAR2
5023     ,p_init_msg_list         IN     VARCHAR2
5024     ,p_validation_level      IN     NUMBER
5025     ,p_ctr_rdg_rec           IN OUT NOCOPY csi_ctr_datastructures_pub.counter_readings_rec
5026     ,x_return_status         OUT    NOCOPY VARCHAR2
5027     ,x_msg_count             OUT    NOCOPY NUMBER
5028     ,x_msg_data              OUT    NOCOPY VARCHAR2
5029  )
5030 IS
5031    l_api_name                      CONSTANT VARCHAR2(30)   := 'UPDATE_COUNTER_READING_PVT';
5032    l_api_version                   CONSTANT NUMBER         := 1.0;
5033    l_msg_data                      VARCHAR2(2000);
5034    l_msg_index                     NUMBER;
5035    l_msg_count                     NUMBER;
5036    l_prev_ctr_reading              NUMBER;
5037    l_prev_net_reading              NUMBER;
5038    l_prev_ltd_reading              NUMBER;
5039    l_prev_value_timestamp          DATE;
5040    l_next_ctr_reading              NUMBER;
5041    l_next_value_timestamp          DATE;
5042    l_next_reset_mode               VARCHAR2(30);
5043    l_next_adj_type                 VARCHAR2(30);
5044    l_next_auto_rollover            VARCHAR2(1);
5045    l_later_ctr_reading             NUMBER;
5046    l_adj_ctr                       NUMBER;
5047    l_ctr_name                      VARCHAR2(50);
5048    l_ctr_type                      VARCHAR2(30);
5049    l_rollover_last_rdg             NUMBER;
5050    l_rollover_first_rdg            NUMBER;
5051    l_direction                     VARCHAR2(1);
5052    l_reading_type                  NUMBER;
5053    l_auto_rollover                 VARCHAR2(1);
5054    l_net_reading                   NUMBER;
5055    l_ltd_reading                   NUMBER;
5056    l_previous_rdg                  NUMBER;
5057    l_upd_previous_rdg              NUMBER;
5058    l_previous_net                  NUMBER;
5059    l_previous_ltd                  NUMBER;
5060    l_process_flag                  BOOLEAN := TRUE;
5061    l_seq_num                       NUMBER;
5062    l_rdg_lock_date                 DATE;
5063    l_target_ctr_rec                csi_ctr_datastructures_pub.counter_readings_rec;
5064    l_temp_ctr_rdg_rec              csi_ctr_datastructures_pub.counter_readings_rec;
5065    l_exists                        VARCHAR2(1);
5066    l_update_loop                   BOOLEAN := FALSE;
5067    l_upd_fl_rdg_rec                csi_ctr_datastructures_pub.counter_readings_rec;
5068    l_derive_ctr_rec                csi_ctr_datastructures_pub.counter_readings_rec;
5069    l_txn_rec                       csi_datastructures_pub.transaction_rec;
5070    l_mode                          VARCHAR2(30);
5071    l_txn_type_id                   NUMBER;
5072    l_ctr_val_max_seq_no            NUMBER;
5073 
5074     -- Bug 8214848
5075     l_ctr_val_max                 NUMBER := -1;
5076     l_prev_ctr_max_reading        NUMBER;
5077     l_prev_net_max_reading        NUMBER;
5078     l_prev_ltd_max_reading        NUMBER;
5079     l_prev_value_max_timestamp    DATE;
5080     l_prev_max_comments           VARCHAR2(240);
5081     l_debug_level       NUMBER;    -- 8214848 - dsingire
5082     l_user_id 				  NUMBER := fnd_global.user_id;        -- 8214848 - dsingire
5083     l_conc_login_id		  NUMBER := fnd_global.conc_login_id;  -- 8214848 - dsingire
5084     l_date_format       VARCHAR2(50) := nvl(fnd_profile.value('ICX_DATE_FORMAT_MASK'),'DD-MON-YYYY HH24:MI:SS');
5085    --
5086    -- Bug 9148094
5087      l_update_net_flag VARCHAR2(1) := NVL(fnd_profile.value('CSI_UPDATE_NET_READINGS_ON_RESET'), 'Y');
5088    --
5089    CURSOR CURRENT_READING_CUR(p_counter_value_id IN NUMBER) IS
5090    select * from
5091    CSI_COUNTER_READINGS
5092    where counter_value_id = p_counter_value_id;
5093    --
5094    l_curr_ctr_rdg_rec              CURRENT_READING_CUR%rowtype;
5095    --
5096    CURSOR PREV_READING_CUR(p_counter_id IN NUMBER,p_value_timestamp IN DATE) IS
5097    select counter_reading,net_reading,life_to_date_reading,value_timestamp
5098    from CSI_COUNTER_READINGS
5099    where counter_id = p_counter_id
5100    and   nvl(disabled_flag,'N') = 'N'
5101    and   value_timestamp < p_value_timestamp
5102    ORDER BY value_timestamp desc;
5103    --,counter_value_id desc;
5104    --
5105    CURSOR NEXT_READING_CUR(p_counter_id IN NUMBER,p_value_timestamp IN DATE) IS
5106    select counter_reading,value_timestamp,reset_mode,
5107           adjustment_type,automatic_rollover_flag
5108    from CSI_COUNTER_READINGS
5109    where counter_id = p_counter_id
5110    and   nvl(disabled_flag,'N') = 'N'
5111    and   value_timestamp > p_value_timestamp
5112    ORDER BY value_timestamp asc;
5113    --,counter_value_id asc;
5114    --
5115    CURSOR LATER_READINGS_CUR(p_counter_id IN NUMBER,p_value_timestamp IN DATE) IS
5116    select counter_value_id,counter_reading,net_reading,value_timestamp,adjustment_reading
5117          ,reset_mode,adjustment_type,include_target_resets
5118    from CSI_COUNTER_READINGS
5119    where counter_id = p_counter_id
5120    and   nvl(disabled_flag,'N') = 'N'
5121    and   value_timestamp > p_value_timestamp
5122    ORDER BY value_timestamp asc, counter_value_id asc;
5123    --
5124 BEGIN
5125 
5126    -- Standard Start of API savepoint
5127    SAVEPOINT  update_counter_reading_pvt;
5128    -- Standard call to check for call compatibility.
5129    IF NOT FND_API.Compatible_API_Call (l_api_version,
5130                                        p_api_version,
5131                                        l_api_name   ,
5132                                        G_PKG_NAME   ) THEN
5133       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5134    END IF;
5135    -- Initialize message list if p_init_msg_list is set to TRUE.
5136    IF FND_API.to_Boolean(nvl(p_init_msg_list,FND_API.G_FALSE)) THEN
5137       FND_MSG_PUB.initialize;
5138    END IF;
5139    --  Initialize API return status to success
5140    x_return_status := FND_API.G_RET_STS_SUCCESS;
5141    --
5142 
5143    -- Read the debug profiles values in to global variable 7197402
5144    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
5145 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
5146 	  END IF;                      -- 8214848 - dsingire
5147 
5148     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
5149 
5150    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5151    csi_ctr_gen_utility_pvt.put_line( 'update_counter_reading_pvt'               ||'-'||
5152                                   p_api_version                              ||'-'||
5153                                   nvl(p_commit,FND_API.G_FALSE)              ||'-'||
5154                                   nvl(p_init_msg_list,FND_API.G_FALSE)       ||'-'||
5155                                   nvl(p_validation_level,FND_API.G_VALID_LEVEL_FULL) );
5156    END IF;          -- 8214848 - dsingire
5157    --
5158    IF NVL(p_ctr_rdg_rec.counter_value_id,FND_API.G_MISS_NUM) = FND_API.G_MISS_NUM THEN
5159       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5160         csi_ctr_gen_utility_pvt.put_line('Invalid Counter Value ID...');
5161       END IF;          -- 8214848 - dsingire
5162       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_VALUE_ID_MISS');
5163    ELSE
5164       OPEN CURRENT_READING_CUR(p_ctr_rdg_rec.counter_value_id);
5165       FETCH CURRENT_READING_CUR INTO l_curr_ctr_rdg_rec;
5166       CLOSE CURRENT_READING_CUR;
5167       --
5168       IF l_curr_ctr_rdg_rec.counter_value_id IS NULL THEN
5169         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5170           csi_ctr_gen_utility_pvt.put_line('Invalid Counter Value ID...');
5171         END IF;          -- 8214848 - dsingire
5172          csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_VALUE_ID_MISS');
5173       END IF;
5174       --
5175       Begin
5176          select transaction_type_id
5177          into l_txn_type_id
5178          from csi_transactions
5179          where transaction_id = l_curr_ctr_rdg_rec.transaction_id;
5180       Exception
5181          when no_data_found then
5182             l_txn_type_id := -1;
5183       End;
5184       --
5185       IF l_txn_type_id IN (88,91,92,94,95) THEN
5186          l_mode := 'Meter';
5187       ELSE
5188          l_mode := 'Counter';
5189       END IF;
5190       --
5191       IF l_curr_ctr_rdg_rec.object_version_number <> NVL(p_ctr_rdg_rec.object_version_number,0) THEN
5192 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
5193 	    ( p_msg_name    =>  'CSI_API_CTR_OBJ_VER_MISMATCH',
5194 	      p_token1_name =>  'MODE',
5195 	      p_token1_val  =>  l_mode
5196 	    );
5197       END IF;
5198       --
5199       IF NVL(l_curr_ctr_rdg_rec.disabled_flag,'N') = 'Y' THEN
5200         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5201           csi_ctr_gen_utility_pvt.put_line('Counter Reading is already disabled...');
5202         END IF;          -- 8214848 - dsingire
5203 	 csi_ctr_gen_utility_pvt.ExitWithErrMsg
5204 	    ( p_msg_name    =>  'CSI_API_CTR_DISABLED_RDG',
5205 	      p_token1_name =>  'MODE',
5206 	      p_token1_val  =>  l_mode
5207 	    );
5208       END IF;
5209    END IF;
5210    --
5211    IF p_ctr_rdg_rec.counter_id <> FND_API.G_MISS_NUM AND
5212       p_ctr_rdg_rec.counter_id IS NOT NULL AND
5213       p_ctr_rdg_rec.counter_id <> l_curr_ctr_rdg_rec.counter_id THEN
5214       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5215         csi_ctr_gen_utility_pvt.put_line('Cannot Update Counter ID...');
5216       END IF;          -- 8214848 - dsingire
5217       csi_ctr_gen_utility_pvt.ExitWithErrMsg
5218 	 ( p_msg_name    =>  'CSI_API_CTR_UPD_COUNTER_ID',
5219 	   p_token1_name =>  'MODE',
5220 	   p_token1_val  =>  l_mode
5221 	 );
5222    ELSE
5223       -- Get the counter definition
5224       Begin
5225          select name,counter_type,rollover_last_reading,
5226                 rollover_first_reading,direction,reading_type,
5227                 automatic_rollover
5228          into l_ctr_name,l_ctr_type,l_rollover_last_rdg,l_rollover_first_rdg,
5229               l_direction,l_reading_type,l_auto_rollover
5230          from CSI_COUNTERS_VL
5231          where counter_id = l_curr_ctr_rdg_rec.counter_id
5232          and   nvl(end_date_active,(sysdate+1)) > sysdate;
5233       Exception
5234          when no_data_found then
5235             csi_ctr_gen_utility_pvt.ExitWithErrMsg
5236                ( p_msg_name    =>  'CSI_API_CTR_INVALID',
5237                  p_token1_name =>  'MODE',
5238                  p_token1_val  =>  l_mode
5239                );
5240       End;
5241    END IF;
5242    --
5243    IF nvl(p_ctr_rdg_rec.disabled_flag,'N') <> 'Y' THEN
5244       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5245         csi_ctr_gen_utility_pvt.put_line('Disabled flag is not set...');
5246       END IF;          -- 8214848 - dsingire
5247       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_INV_DISABLED_FLAG');
5248    END IF;
5249    --
5250    IF NVL(l_direction,'X') NOT IN ('A','D','B') THEN
5251       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5252         csi_ctr_gen_utility_pvt.put_line('This counter has an Invalid Direction...');
5253       END IF;          -- 8214848 - dsingire
5254       csi_ctr_gen_utility_pvt.ExitWithErrMsg
5255 	   ( p_msg_name     => 'CSI_API_CTR_INVALID_DIR',
5256 	     p_token1_name  => 'MODE',
5257 	     p_token1_val   => l_mode
5258 	   );
5259    END IF;
5260    --
5261    IF l_curr_ctr_rdg_rec.reset_mode IS NOT NULL THEN
5262       /* Check if there are readings after the reset */
5263       OPEN NEXT_READING_CUR(l_curr_ctr_rdg_rec.counter_id,
5264                             l_curr_ctr_rdg_rec.value_timestamp);
5265       FETCH NEXT_READING_CUR
5266       INTO  l_next_ctr_reading,
5267 	    l_next_value_timestamp,
5268             l_next_reset_mode,
5269             l_next_adj_type,
5270             l_next_auto_rollover;
5271       CLOSE NEXT_READING_CUR;
5272 
5273       IF l_next_ctr_reading IS NOT NULL THEN
5274          /* End of checking */
5275          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5276           csi_ctr_gen_utility_pvt.put_line('Cannot Disable Reset Reading...');
5277          END IF;          -- 8214848 - dsingire
5278          csi_ctr_gen_utility_pvt.ExitWithErrMsg
5279 	    ( p_msg_name     => 'CSI_API_CTR_DISABLE_RESET',
5280 	      p_token1_name  => 'MODE',
5281 	      p_token1_val   => l_mode
5282 	    );
5283       END IF;
5284    END IF;
5285    --
5286    IF NVL(l_curr_ctr_rdg_rec.automatic_rollover_flag,'N') = 'Y' THEN
5287       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5288         csi_ctr_gen_utility_pvt.put_line('Cannot Disable Automatic Rollover Reading...');
5289       END IF;          -- 8214848 - dsingire
5290       csi_ctr_gen_utility_pvt.ExitWithErrMsg
5291 	   ( p_msg_name     => 'CSI_API_CTR_DISABLE_ROLLOVER',
5292 	     p_token1_name  => 'MODE',
5293 	     p_token1_val   => l_mode
5294 	   );
5295    END IF;
5296    --
5297    -- Cannot Disable Target Counters as they are driven by source counters
5298    IF Is_Target_Counter(l_curr_ctr_rdg_rec.counter_id) THEN
5299      IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5300       csi_ctr_gen_utility_pvt.put_line('Cannot Disable Target Counter...');
5301      END IF;          -- 8214848 - dsingire
5302       csi_ctr_gen_utility_pvt.ExitWithErrMsg
5303 	   ( p_msg_name     => 'CSI_API_CTR_DISABLE_TARGET',
5304 	     p_token1_name  => 'MODE',
5305 	     p_token1_val   => l_mode
5306 	   );
5307    END IF;
5308    --
5309    -- Cannot Disable Formula Counters Readings
5310    IF Is_Formula_Counter(l_curr_ctr_rdg_rec.counter_id) THEN
5311       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5312         csi_ctr_gen_utility_pvt.put_line('Cannot Disable Formula Counter...');
5313       END IF;          -- 8214848 - dsingire
5314       csi_ctr_gen_utility_pvt.ExitWithErrMsg
5315 	   ( p_msg_name     => 'CSI_API_CTR_DISABLE_FORMULA',
5316 	     p_token1_name  => 'MODE',
5317 	     p_token1_val   => l_mode
5318 	   );
5319    END IF;
5320    --
5321    IF p_ctr_rdg_rec.value_timestamp <> FND_API.G_MISS_DATE AND
5322       p_ctr_rdg_rec.value_timestamp IS NOT NULL AND
5323       p_ctr_rdg_rec.value_timestamp <> l_curr_ctr_rdg_rec.value_timestamp THEN
5324       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5325         csi_ctr_gen_utility_pvt.put_line('Cannot Update Value Timestamp...');
5326       END IF;          -- 8214848 - dsingire
5327       csi_ctr_gen_utility_pvt.ExitWithErrMsg
5328 	   ( p_msg_name     => 'CSI_API_CTR_UPD_READING_DATE',
5329 	     p_token1_name  => 'MODE',
5330 	     p_token1_val   => l_mode
5331 	   );
5332    END IF;
5333    --
5334    IF p_ctr_rdg_rec.counter_reading <> FND_API.G_MISS_NUM AND
5335       p_ctr_rdg_rec.counter_reading IS NOT NULL AND
5336       p_ctr_rdg_rec.counter_reading <> NVL(l_curr_ctr_rdg_rec.counter_reading,0) THEN
5337       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5338         csi_ctr_gen_utility_pvt.put_line('Cannot Update Counter Reading...');
5339       END IF;          -- 8214848 - dsingire
5340       csi_ctr_gen_utility_pvt.ExitWithErrMsg
5341 	   ( p_msg_name     => 'CSI_API_CTR_UPD_CTR_READING',
5342 	     p_token1_name  => 'MODE',
5343 	     p_token1_val   => l_mode
5344 	   );
5345    END IF;
5346    --
5347    IF p_ctr_rdg_rec.adjustment_type <> FND_API.G_MISS_CHAR AND
5348       p_ctr_rdg_rec.adjustment_type IS NOT NULL AND
5349       p_ctr_rdg_rec.adjustment_type <> NVL(l_curr_ctr_rdg_rec.adjustment_type,'$#$') THEN
5350       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5351         csi_ctr_gen_utility_pvt.put_line('Cannot Update Adjustment Type...');
5352       END IF;          -- 8214848 - dsingire
5353       csi_ctr_gen_utility_pvt.ExitWithErrMsg
5354 	   ( p_msg_name     => 'CSI_API_CTR_UPD_ADJ_TYPE',
5355 	     p_token1_name  => 'MODE',
5356 	     p_token1_val   => l_mode
5357 	   );
5358    END IF;
5359    --
5360    IF p_ctr_rdg_rec.adjustment_reading <> FND_API.G_MISS_NUM AND
5361       p_ctr_rdg_rec.adjustment_reading IS NOT NULL AND
5362       p_ctr_rdg_rec.adjustment_reading <> NVL(l_curr_ctr_rdg_rec.adjustment_reading,0) THEN
5363       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5364         csi_ctr_gen_utility_pvt.put_line('Cannot Update Adjustment Reading...');
5365       END IF;          -- 8214848 - dsingire
5366       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_UPD_ADJ_RDG');
5367    END IF;
5368    --
5369    -- If the Source counter or its object counters have a reading lock date then
5370    -- the reading date cannot be earlier than the lock date (Max of all)
5371    l_rdg_lock_date := NULL;
5372    Begin
5373 	  SELECT MAX(READING_LOCK_DATE)
5374 	  INTO l_rdg_lock_date
5375 	  FROM CSI_COUNTER_READING_LOCKS
5376 	  WHERE COUNTER_ID IN (SELECT OBJECT_COUNTER_ID FROM
5377       CSI_COUNTER_RELATIONSHIPS WHERE SOURCE_COUNTER_ID = l_curr_ctr_rdg_rec.counter_id AND
5378       NVL(ACTIVE_END_DATE,(l_curr_ctr_rdg_rec.value_timestamp + 1)) > l_curr_ctr_rdg_rec.value_timestamp
5379 	  UNION ALL SELECT l_curr_ctr_rdg_rec.counter_id FROM DUAL);
5380    End;
5381    --
5382    IF l_rdg_lock_date IS NOT NULL THEN
5383       IF l_curr_ctr_rdg_rec.value_timestamp <= l_rdg_lock_date THEN
5384          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5385            csi_ctr_gen_utility_pvt.put_line('Reading Date cannot be earlier than the Reading Lock Date...');
5386          END IF;          -- 8214848 - dsingire
5387          csi_ctr_gen_utility_pvt.ExitWithErrMsg
5388              ( p_msg_name     =>  'CSI_API_CTR_RDG_DATE_LOCKED',
5389                p_token1_name  =>  'LOCKED_DATE',
5390                p_token1_val   =>  to_char(l_rdg_lock_date,l_date_format), --fix for bug 5435071
5391                p_token2_name  =>  'MODE',
5392                p_token2_val   =>  l_mode
5393              );
5394       END IF;
5395    END IF;
5396    --
5397    -- Get the last reading for this counter
5398 
5399    -- Get the last reading for this counter
5400   -- Bug 	8214848
5401    BEGIN
5402     SELECT CTR_VAL_MAX_SEQ_NO INTO l_ctr_val_max
5403       FROM CSI_COUNTERS_B WHERE COUNTER_ID = l_curr_ctr_rdg_rec.counter_id;
5404 
5405    SELECT COUNTER_READING,NET_READING,LIFE_TO_DATE_READING,
5406           VALUE_TIMESTAMP
5407          INTO l_prev_ctr_max_reading,
5408               l_prev_net_max_reading,
5409               l_prev_ltd_max_reading,
5410               l_prev_value_max_timestamp
5411               --l_prev_max_comments
5412    FROM CSI_COUNTER_READINGS WHERE COUNTER_VALUE_ID = NVL(l_ctr_val_max,-1);
5413 
5414    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5415     csi_ctr_gen_utility_pvt.put_line('l_ctr_val_max - ' || l_ctr_val_max );
5416    END IF;          -- 8214848 - dsingire
5417 
5418   EXCEPTION
5419    WHEN OTHERS THEN
5420     -- Assign max counter value id to 0 and use the PREV_READING_CUR cursor
5421     l_ctr_val_max := -1;
5422   END;  --
5423 
5424    IF (l_prev_value_max_timestamp <=  l_curr_ctr_rdg_rec.value_timestamp
5425             AND NVL(l_ctr_val_max,-1) > 0) THEN
5426 
5427       -- The requested timestamp is greater than the timestamp of the
5428       -- CTR_VAL_MAX_SEQ_NO
5429       l_prev_ctr_reading := l_prev_ctr_max_reading;
5430       l_prev_net_reading := l_prev_net_max_reading;
5431       l_prev_ltd_reading := l_prev_ltd_max_reading;
5432       l_prev_value_timestamp := l_prev_value_max_timestamp;
5433       --l_prev_comments := l_prev_max_comments;
5434 
5435       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5436         csi_ctr_gen_utility_pvt.put_line('Max Value counter id used');
5437       END IF;          -- 8214848 - dsingire
5438 
5439    ELSE
5440 
5441      OPEN PREV_READING_CUR(l_curr_ctr_rdg_rec.counter_id,l_curr_ctr_rdg_rec.value_timestamp);
5442      FETCH PREV_READING_CUR
5443      INTO  l_prev_ctr_reading,
5444      l_prev_net_reading,
5445            l_prev_ltd_reading,
5446      l_prev_value_timestamp;
5447      CLOSE PREV_READING_CUR;
5448    END IF;
5449 
5450    --
5451    -- Get the next reading for this counter
5452    OPEN NEXT_READING_CUR(l_curr_ctr_rdg_rec.counter_id,l_curr_ctr_rdg_rec.value_timestamp);
5453    FETCH NEXT_READING_CUR
5454    INTO  l_next_ctr_reading,
5455 	 l_next_value_timestamp,
5456          l_next_reset_mode,
5457          l_next_adj_type,
5458          l_next_auto_rollover;
5459    CLOSE NEXT_READING_CUR;
5460    --
5461    IF l_prev_ctr_reading IS NULL AND
5462       l_next_reset_mode IS NOT NULL THEN
5463       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5464         csi_ctr_gen_utility_pvt.put_line('Next Reading is a Reset. Disabling the current reading will cause the Reset Reading to be the first reading.');
5465       END IF;          -- 8214848 - dsingire
5466       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NEXT_RESET_RDG');
5467    END IF;
5468    --
5469    IF l_prev_ctr_reading IS NULL AND
5470       l_next_adj_type IS NOT NULL THEN
5471       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5472         csi_ctr_gen_utility_pvt.put_line('Next Reading is a Adjustment. Disabling the current reading will cause the Adjustment Reading to be the first reading.');
5473       END IF;          -- 8214848 - dsingire
5474       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NEXT_ADJ_RDG');
5475    END IF;
5476    --
5477    IF l_prev_ctr_reading IS NULL AND
5478       nvl(l_next_auto_rollover,'N') = 'Y' THEN
5479       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5480         csi_ctr_gen_utility_pvt.put_line('Next Reading is an Automatic Rollover. Disabling the current reading will cause the Automatic Rollover Reading to be the first reading.');
5481       END IF;          -- 8214848 - dsingire
5482       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NEXT_AUTO_RDG');
5483    END IF;
5484    --
5485    p_ctr_rdg_rec.object_version_number := l_curr_ctr_rdg_rec.object_version_number + 1;
5486    --
5487    -- Below two assignments are required by Update public API to call OKC Assembler
5488    p_ctr_rdg_rec.counter_id := l_curr_ctr_rdg_rec.counter_id;
5489    p_ctr_rdg_rec.value_timestamp := l_curr_ctr_rdg_rec.value_timestamp;
5490    --
5491    -- Call Table Handler to Update CSI_COUNTER_READINGS
5492    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5493       csi_ctr_gen_utility_pvt.put_line('Calling Update Row to Disable the Reading...');
5494    END IF;          -- 8214848 - dsingire
5495    CSI_COUNTER_READINGS_PKG.Update_Row(
5496 	 p_COUNTER_VALUE_ID           =>  p_ctr_rdg_rec.counter_value_id
5497 	,p_COUNTER_ID                 =>  NULL
5498 	,p_VALUE_TIMESTAMP            =>  NULL
5499 	,p_COUNTER_READING            =>  NULL
5500 	,p_RESET_MODE                 =>  NULL
5501 	,p_RESET_REASON               =>  p_ctr_rdg_rec.reset_reason -- NULL 6398254
5502 	,p_ADJUSTMENT_TYPE            =>  NULL
5503 	,p_ADJUSTMENT_READING         =>  NULL
5504 	,p_OBJECT_VERSION_NUMBER      =>  p_ctr_rdg_rec.object_version_number
5505 	,p_LAST_UPDATE_DATE           =>  SYSDATE
5506 	,p_LAST_UPDATED_BY            =>  l_user_id
5507 	,p_CREATION_DATE              =>  NULL
5508 	,p_CREATED_BY                 =>  NULL
5509 	,p_LAST_UPDATE_LOGIN          =>  l_conc_login_id
5510 	,p_ATTRIBUTE1                 =>  NULL
5511 	,p_ATTRIBUTE2                 =>  NULL
5512 	,p_ATTRIBUTE3                 =>  NULL
5513 	,p_ATTRIBUTE4                 =>  NULL
5514 	,p_ATTRIBUTE5                 =>  NULL
5515 	,p_ATTRIBUTE6                 =>  NULL
5516 	,p_ATTRIBUTE7                 =>  NULL
5517 	,p_ATTRIBUTE8                 =>  NULL
5518 	,p_ATTRIBUTE9                 =>  NULL
5519 	,p_ATTRIBUTE10                =>  NULL
5520 	,p_ATTRIBUTE11                =>  NULL
5521 	,p_ATTRIBUTE12                =>  NULL
5522 	,p_ATTRIBUTE13                =>  NULL
5523 	,p_ATTRIBUTE14                =>  NULL
5524 	,p_ATTRIBUTE15                =>  NULL
5525 	,p_ATTRIBUTE16                =>  NULL
5526 	,p_ATTRIBUTE17                =>  NULL
5527 	,p_ATTRIBUTE18                =>  NULL
5528 	,p_ATTRIBUTE19                =>  NULL
5529 	,p_ATTRIBUTE20                =>  NULL
5530 	,p_ATTRIBUTE21                =>  NULL
5531 	,p_ATTRIBUTE22                =>  NULL
5532 	,p_ATTRIBUTE23                =>  NULL
5533 	,p_ATTRIBUTE24                =>  NULL
5534 	,p_ATTRIBUTE25                =>  NULL
5535 	,p_ATTRIBUTE26                =>  NULL
5536 	,p_ATTRIBUTE27                =>  NULL
5537 	,p_ATTRIBUTE28                =>  NULL
5538 	,p_ATTRIBUTE29                =>  NULL
5539 	,p_ATTRIBUTE30                =>  NULL
5540 	,p_ATTRIBUTE_CATEGORY         =>  NULL
5541 	,p_MIGRATED_FLAG              =>  NULL
5542 	,p_COMMENTS                   =>  NULL
5543 	,p_LIFE_TO_DATE_READING       =>  NULL
5544 	,p_TRANSACTION_ID             =>  NULL
5545 	,p_AUTOMATIC_ROLLOVER_FLAG    =>  NULL
5546 	,p_INCLUDE_TARGET_RESETS      =>  NULL
5547 	,p_SOURCE_COUNTER_VALUE_ID    =>  NULL
5548 	,p_NET_READING                =>  NULL
5549 	,p_DISABLED_FLAG              =>  p_ctr_rdg_rec.disabled_flag
5550 	,p_SOURCE_CODE                =>  NULL
5551 	,p_SOURCE_LINE_ID             =>  NULL
5552 	,p_INITIAL_READING_FLAG       =>  NULL
5553 	);
5554 
5555    IF p_ctr_rdg_rec.disabled_flag = 'Y' THEN
5556        l_ctr_val_max_seq_no := NULL;
5557        --Add call to CSI_COUNTER_PVT.update_ctr_val_max_seq_no
5558        --for bug 7374316
5559        CSI_COUNTER_PVT.update_ctr_val_max_seq_no(
5560           p_api_version           =>  1.0
5561          ,p_commit                =>  fnd_api.g_false
5562          ,p_init_msg_list         =>  fnd_api.g_true
5563          ,p_validation_level      =>  fnd_api.g_valid_level_full
5564          ,p_counter_id            =>  p_ctr_rdg_rec.counter_id
5565          ,px_ctr_val_max_seq_no   =>  l_ctr_val_max_seq_no
5566          ,x_return_status         =>  x_return_status
5567          ,x_msg_count             =>  x_msg_count
5568          ,x_msg_data              =>  x_msg_data
5569          );
5570 
5571        IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5572           l_msg_index := 1;
5573 	  l_msg_count := x_msg_count;
5574 	  WHILE l_msg_count > 0 LOOP
5575             x_msg_data := FND_MSG_PUB.GET
5576               (l_msg_index,
5577                FND_API.G_FALSE
5578 	      );
5579 	    csi_ctr_gen_utility_pvt.put_line('ERROR FROM CSI_COUNTER_PVT.update_ctr_val_max_seq_no');
5580 	    csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
5581 	    l_msg_index := l_msg_index + 1;
5582 	    l_msg_count := l_msg_count - 1;
5583 	  END LOOP;
5584 	  RAISE FND_API.G_EXC_ERROR;
5585        END IF;
5586    END IF;
5587    --
5588    Disable_Target_Derive_Rdg
5589      ( p_src_counter_value_id   => p_ctr_rdg_rec.counter_value_id,
5590        x_return_status          => x_return_status
5591      );
5592    IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5593       csi_ctr_gen_utility_pvt.put_line('ERROR FROM Disable_Target_Derive_Rdg API ');
5594       RAISE FND_API.G_EXC_ERROR;
5595    END IF;
5596    --
5597    -- Following variables will be set inside the loop
5598    l_previous_rdg := l_prev_ctr_reading;
5599    l_upd_previous_rdg := l_prev_ctr_reading;
5600    l_previous_net := l_prev_net_reading;
5601    l_previous_ltd := l_prev_ltd_reading;
5602    --
5603    -- For Adjustments or next reading was a reset then
5604    -- adjust the Net Reading of Subsequent readings.
5605    -- Re-calculate Target counters irrespective of net reading changes.
5606 
5607    --Modified if condition for bug 7589871, to allow later reading to be updated for Changed Fluctuating counter
5608    IF (l_direction <> 'B') OR (l_direction = 'B' AND l_reading_type = 2) THEN
5609       IF l_reading_type = 2 OR
5610 	 l_curr_ctr_rdg_rec.adjustment_reading IS NOT NULL OR
5611 	 l_next_adj_type IS NOT NULL OR
5612 	 NVL(l_next_reset_mode,'X') = 'SOFT' THEN
5613 	 l_update_loop := TRUE;
5614 	 l_adj_ctr := 0;
5615    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5616 	  csi_ctr_gen_utility_pvt.put_line('Updating Later Readings for Ctr ID '||to_char(l_curr_ctr_rdg_rec.counter_id));
5617    END IF;          -- 8214848 - dsingire
5618 	 FOR later_rdg IN LATER_READINGS_CUR(l_curr_ctr_rdg_rec.counter_id
5619 					    ,l_curr_ctr_rdg_rec.value_timestamp)
5620 	 LOOP
5621 	    l_adj_ctr := l_adj_ctr + 1;
5622 	    --
5623 	    -- If the immediate reading after the current disabled rdg is an Adjustment then
5624 	    -- we need to update the counter reading of that adjustment, provided it took the same disabled
5625 	    -- counter reading. If a counter rdg was also captured as the part of adjustment then
5626 	    -- no need to update the counter reading. Just retain the same and pass it to Net rdg calculation.
5627 	    -- It will come back with the same values.
5628 	    --
5629 	    -- Above statements are true only for Absolute counters since we take the usage for Change counters
5630 	    --
5631 	    -- l_previous_rdg always takes the un-updated counter reading from the cursor
5632 	    -- l_upd_previous_rdg takes the updated value which will be used to compute the usage for Targets
5633 	    -- l_prev_ctr_reading is read outside the loop and never change. Used only for the first record
5634 	    -- in the following Loop.
5635 	    --
5636 	    IF later_rdg.adjustment_type IS NOT NULL AND
5637 	       l_reading_type = 1 THEN
5638 	       IF l_adj_ctr = 1 THEN -- First record of Later Readings (Immediate record after disabled rdg)
5639 		  -- Checking whether it took the same rdg as the disabled one.
5640 		  IF later_rdg.counter_reading = l_curr_ctr_rdg_rec.counter_reading THEN
5641 		     l_later_ctr_reading := l_prev_ctr_reading; -- The one before disable rdg
5642 		  ELSE -- Retain the counter reading
5643 		     l_later_ctr_reading := later_rdg.counter_reading;
5644 		  END IF;
5645 	       ELSE
5646 		  IF later_rdg.counter_reading <> l_previous_rdg THEN
5647 		     l_later_ctr_reading := later_rdg.counter_reading;
5648 		  -- ELSE part is basically retaining the l_later_ctr_reading derived in Previous iteration
5649 		  END IF;
5650 	       END IF;
5651 	    ELSE
5652 	       l_later_ctr_reading := later_rdg.counter_reading;
5653 	    END IF;
5654 	    --
5655       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5656 	      csi_ctr_gen_utility_pvt.put_line('Updating Counter Value ID '||to_char(later_rdg.counter_value_id));
5657       END IF;          -- 8214848 - dsingire
5658 	    IF NVL(later_rdg.reset_mode,'X') = 'SOFT' THEN
5659 			-- added IF for Bug 9148094
5660 			csi_ctr_gen_utility_pvt.put_line(' Update Net Reading Flag : '||l_update_net_flag);
5661 			IF l_update_net_flag = 'Y' THEN
5662 				UPDATE CSI_COUNTER_READINGS
5663 				set net_reading = later_rdg.counter_reading,
5664 				life_to_date_reading = l_previous_ltd,
5665 				last_update_date = sysdate,
5666 				last_updated_by = l_user_id
5667 				where counter_value_id = later_rdg.counter_value_id;
5668 				l_previous_net := later_rdg.counter_reading;
5669 			ELSE
5670 				UPDATE CSI_COUNTER_READINGS
5671 				set net_reading = l_previous_net,
5672 				life_to_date_reading = l_previous_ltd,
5673 				last_update_date = sysdate,
5674 				last_updated_by = l_user_id
5675 				where counter_value_id = later_rdg.counter_value_id;
5676 			END IF;
5677 	    ELSE
5678 	       Calculate_Net_Reading
5679 		  ( p_prev_net_rdg      => l_previous_net
5680 		   ,p_prev_ltd_rdg      => l_previous_ltd
5681 		   ,p_curr_rdg          => l_later_ctr_reading -- later_rdg.counter_reading
5682 		   ,p_prev_rdg          => l_upd_previous_rdg -- l_previous_rdg
5683 		   ,p_curr_adj          => later_rdg.adjustment_reading
5684 		   ,p_rdg_type          => l_reading_type
5685 		   ,p_direction         => l_direction
5686 		   ,px_net_rdg          => l_net_reading
5687 		   ,px_ltd_rdg          => l_ltd_reading
5688 		   ,l_ctr_rdg_rec      => p_ctr_rdg_rec -- added 6398254
5689 		  );
5690 	       UPDATE CSI_COUNTER_READINGS
5691 	       set counter_reading = l_later_ctr_reading,
5692 		   net_reading = l_net_reading,
5693 		   life_to_date_reading = l_ltd_reading,
5694 		   last_update_date = sysdate,
5695 		   last_updated_by = l_user_id
5696 	       where counter_value_id = later_rdg.counter_value_id;
5697 	       --
5698 	       l_previous_net := l_net_reading;
5699 	       l_previous_ltd := l_ltd_reading;
5700 	    END IF;
5701 	    --
5702 	    --
5703 	    -- Re-calculate Compute Target Counters
5704 	    -- For Resets which did not include Targets before, no need to Re-compute
5705 	    --
5706 	    IF later_rdg.reset_mode IS NULL OR
5707 	       (later_rdg.reset_mode IS NOT NULL AND NVL(later_rdg.include_target_resets,'N') = 'Y') THEN
5708 	       l_target_ctr_rec := l_temp_ctr_rdg_rec;
5709 	       --
5710 	       l_target_ctr_rec.counter_value_id := later_rdg.counter_value_id; -- source_counter_value_id
5711 	       l_target_ctr_rec.counter_id := l_curr_ctr_rdg_rec.counter_id;
5712 	       l_target_ctr_rec.value_timestamp := later_rdg.value_timestamp;
5713 	       l_target_ctr_rec.adjustment_reading := later_rdg.adjustment_reading;
5714 	       l_target_ctr_rec.adjustment_type := later_rdg.adjustment_type;
5715 	       --
5716 	       -- Used l_later_ctr_reading instead of later_rdg.counter_reading
5717 	       --
5718 	       IF later_rdg.reset_mode IS NOT NULL AND NVL(later_rdg.include_target_resets,'N') = 'Y' THEN
5719 		  -- l_target_ctr_rec.counter_reading := ABS(later_rdg.counter_reading);
5720 		  l_target_ctr_rec.counter_reading := later_rdg.counter_reading;
5721 	       ELSE
5722 		  IF l_reading_type = 1 THEN
5723 		     -- l_target_ctr_rec.counter_reading := ABS(l_later_ctr_reading - nvl(l_upd_previous_rdg,0));
5724 		     l_target_ctr_rec.counter_reading := l_later_ctr_reading - nvl(l_upd_previous_rdg,0);
5725 		  ELSIF l_reading_type = 2 THEN
5726 		     -- l_target_ctr_rec.counter_reading := ABS(l_later_ctr_reading);
5727 		     l_target_ctr_rec.counter_reading := l_later_ctr_reading;
5728 		  END IF;
5729 	       END IF;
5730 	       --
5731          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5732 	          csi_ctr_gen_utility_pvt.put_line('Calling Compute_Target_Counters for Update...');
5733          END IF;          -- 8214848 - dsingire
5734 	       Compute_Target_Counters
5735 		  (
5736 		    p_api_version           =>  1.0
5737 		   ,p_commit                =>  p_commit
5738 		   ,p_init_msg_list         =>  p_init_msg_list
5739 		   ,p_validation_level      =>  p_validation_level
5740 		   ,p_txn_rec               =>  l_txn_rec
5741 		   ,p_ctr_rdg_rec           =>  l_target_ctr_rec
5742 		   ,p_mode                  =>  'UPDATE'
5743 		   ,x_return_status         =>  x_return_status
5744 		   ,x_msg_count             =>  x_msg_count
5745 		   ,x_msg_data              =>  x_msg_data
5746 		 );
5747 	       IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5748 		  l_msg_index := 1;
5749 		  l_msg_count := x_msg_count;
5750 		  WHILE l_msg_count > 0 LOOP
5751 		     x_msg_data := FND_MSG_PUB.GET
5752 		     (  l_msg_index,
5753 			FND_API.G_FALSE
5754 		     );
5755 		     csi_ctr_gen_utility_pvt.put_line('ERROR FROM Compute_Target_Counters API ');
5756 		     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
5757 		     l_msg_index := l_msg_index + 1;
5758 		     l_msg_count := l_msg_count - 1;
5759 		  END LOOP;
5760 		  RAISE FND_API.G_EXC_ERROR;
5761 	       END IF;
5762 	    END IF; -- Target Counter call check
5763 	    --
5764 	    -- Re-compute Derive comunters.
5765 	    -- No need for SOFT reset as we would not have created it before.
5766 	    --
5767 	    IF NVL(later_rdg.reset_mode,'$#$') <> 'SOFT' THEN
5768 	       l_derive_ctr_rec := l_temp_ctr_rdg_rec;
5769 	       --
5770 	       l_derive_ctr_rec.counter_value_id := later_rdg.counter_value_id; -- source_counter_value_id
5771 	       l_derive_ctr_rec.counter_id := l_curr_ctr_rdg_rec.counter_id;
5772 	       l_derive_ctr_rec.value_timestamp := later_rdg.value_timestamp;
5773 	       --
5774 	       -- Compute Derive Counters
5775          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5776 	          csi_ctr_gen_utility_pvt.put_line('Calling Compute_Derive_Counters for Update...');
5777          END IF;          -- 8214848 - dsingire
5778 	       Compute_Derive_Counters
5779 		  (
5780 		    p_api_version           => 1.0
5781 		   ,p_commit                => p_commit
5782 		   ,p_init_msg_list         => p_init_msg_list
5783 		   ,p_validation_level      => p_validation_level
5784 		   ,p_txn_rec               => l_txn_rec
5785 		   ,p_ctr_rdg_rec           => l_derive_ctr_rec
5786 		   ,p_mode                  => 'UPDATE'
5787 		   ,x_return_status         => x_return_status
5788 		   ,x_msg_count             => x_msg_count
5789 		   ,x_msg_data              => x_msg_data
5790 		 );
5791 	       IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5792 		  csi_ctr_gen_utility_pvt.put_line('ERROR FROM Compute_Derive_Counters API ');
5793 		  l_msg_index := 1;
5794 		  l_msg_count := x_msg_count;
5795 		  WHILE l_msg_count > 0 LOOP
5796 		     x_msg_data := FND_MSG_PUB.GET
5797 		     (  l_msg_index,
5798 			FND_API.G_FALSE
5799 		     );
5800 		     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
5801 		     l_msg_index := l_msg_index + 1;
5802 		     l_msg_count := l_msg_count - 1;
5803 		  END LOOP;
5804 		  RAISE FND_API.G_EXC_ERROR;
5805 	       END IF;
5806 	    END IF; -- Derive Counters call check
5807 	    --
5808 	    l_previous_rdg := later_rdg.counter_reading;
5809 	    l_upd_previous_rdg := l_later_ctr_reading;
5810 	 END LOOP; -- Later Readings loop
5811       END IF; -- Condition to loop thru' later readings
5812       --
5813       -- If the above loop was not executed then to re-calculate the Traget counters we loop thru'
5814       -- This is because target counter readings could change even if the net reading did not change.
5815       --
5816       l_previous_rdg := l_prev_ctr_reading; -- Assigning it to Rdg before Disable Rdg (Just in case...)
5817       --
5818       IF NOT l_update_loop THEN
5819 	 FOR later_rdg IN LATER_READINGS_CUR(l_curr_ctr_rdg_rec.counter_id,
5820 					     l_curr_ctr_rdg_rec.value_timestamp)
5821 	 LOOP
5822 	    -- Re-calculate Compute Target Counters
5823 	    -- For Resets which did not include Targets before, no need to Re-compute
5824 	    --
5825 	    IF later_rdg.reset_mode IS NULL OR
5826 	       (later_rdg.reset_mode IS NOT NULL AND NVL(later_rdg.include_target_resets,'N') = 'Y') THEN
5827 	       l_target_ctr_rec := l_temp_ctr_rdg_rec;
5828 	       --
5829 	       l_target_ctr_rec.counter_value_id := later_rdg.counter_value_id; -- source_counter_value_id
5830 	       l_target_ctr_rec.counter_id := l_curr_ctr_rdg_rec.counter_id;
5831 	       l_target_ctr_rec.value_timestamp := later_rdg.value_timestamp;
5832 	       l_target_ctr_rec.adjustment_reading := later_rdg.adjustment_reading;
5833 	       l_target_ctr_rec.adjustment_type := later_rdg.adjustment_type;
5834 	       --
5835 	       IF later_rdg.reset_mode IS NOT NULL AND NVL(later_rdg.include_target_resets,'N') = 'Y' THEN
5836 		  -- l_target_ctr_rec.counter_reading := ABS(later_rdg.counter_reading);
5837 		  l_target_ctr_rec.counter_reading := later_rdg.counter_reading;
5838 	       ELSE
5839 		  IF l_reading_type = 1 THEN
5840 		     -- l_target_ctr_rec.counter_reading := ABS(later_rdg.counter_reading - nvl(l_previous_rdg,0));
5841 		     l_target_ctr_rec.counter_reading := later_rdg.counter_reading - nvl(l_previous_rdg,0);
5842 		  ELSIF l_reading_type = 2 THEN
5843 		     -- l_target_ctr_rec.counter_reading := ABS(later_rdg.counter_reading);
5844 		     l_target_ctr_rec.counter_reading := later_rdg.counter_reading;
5845 		  END IF;
5846 	       END IF;
5847 	       --
5848 	       -- Call Compute Target Counters
5849          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5850 	          csi_ctr_gen_utility_pvt.put_line('Calling Compute_Target_Counters for Update...');
5851          END IF;          -- 8214848 - dsingire
5852 	       Compute_Target_Counters
5853 		  (
5854 		    p_api_version           =>  1.0
5855 		   ,p_commit                =>  p_commit
5856 		   ,p_init_msg_list         =>  p_init_msg_list
5857 		   ,p_validation_level      =>  p_validation_level
5858 		   ,p_txn_rec               =>  l_txn_rec
5859 		   ,p_ctr_rdg_rec           =>  l_target_ctr_rec
5860 		   ,p_mode                  =>  'UPDATE'
5861 		   ,x_return_status         =>  x_return_status
5862 		   ,x_msg_count             =>  x_msg_count
5863 		   ,x_msg_data              =>  x_msg_data
5864 		 );
5865 	       IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5866 		  l_msg_index := 1;
5867 		  l_msg_count := x_msg_count;
5868 		  WHILE l_msg_count > 0 LOOP
5869 		     x_msg_data := FND_MSG_PUB.GET
5870 		     (  l_msg_index,
5871 			FND_API.G_FALSE
5872 		     );
5873 		     csi_ctr_gen_utility_pvt.put_line('ERROR FROM Compute_Target_Counters API ');
5874 		     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
5875 		     l_msg_index := l_msg_index + 1;
5876 		     l_msg_count := l_msg_count - 1;
5877 		  END LOOP;
5878 		  RAISE FND_API.G_EXC_ERROR;
5879 	       END IF;
5880 	    END IF; -- Target counter call check
5881 	    --
5882 	    -- Re-Compute Derive Counters
5883 	    -- No need for SOFT reset as we would not have created it before.
5884 	    IF NVL(later_rdg.reset_mode,'$#$') <> 'SOFT' THEN
5885 	       l_derive_ctr_rec := l_temp_ctr_rdg_rec;
5886 	       --
5887 	       l_derive_ctr_rec.counter_value_id := later_rdg.counter_value_id; -- source_counter_value_id
5888 	       l_derive_ctr_rec.counter_id := l_curr_ctr_rdg_rec.counter_id;
5889 	       l_derive_ctr_rec.value_timestamp := later_rdg.value_timestamp;
5890 	       --
5891          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5892 	          csi_ctr_gen_utility_pvt.put_line('Calling Compute_Derive_Counters for Update...');
5893          END IF;          -- 8214848 - dsingire
5894 	       Compute_Derive_Counters
5895 		  (
5896 		    p_api_version           => 1.0
5897 		   ,p_commit                => p_commit
5898 		   ,p_init_msg_list         => p_init_msg_list
5899 		   ,p_validation_level      => p_validation_level
5900 		   ,p_txn_rec               => l_txn_rec
5901 		   ,p_ctr_rdg_rec           => l_derive_ctr_rec
5902 		   ,p_mode                  => 'UPDATE'
5903 		   ,x_return_status         => x_return_status
5904 		   ,x_msg_count             => x_msg_count
5905 		   ,x_msg_data              => x_msg_data
5906 		 );
5907 	       IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5908 		  l_msg_index := 1;
5909 		  l_msg_count := x_msg_count;
5910 		  WHILE l_msg_count > 0 LOOP
5911 		     x_msg_data := FND_MSG_PUB.GET
5912 		     (  l_msg_index,
5913 			FND_API.G_FALSE
5914 		     );
5915 		     csi_ctr_gen_utility_pvt.put_line('ERROR FROM Compute_Derive_Counters API ');
5916 		     csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
5917 		     l_msg_index := l_msg_index + 1;
5918 		     l_msg_count := l_msg_count - 1;
5919 		  END LOOP;
5920 		  RAISE FND_API.G_EXC_ERROR;
5921 	       END IF;
5922 	    END IF; -- Derive counters call check
5923 	    --
5924 	    l_previous_rdg := later_rdg.counter_reading;
5925 	 END LOOP;
5926       END IF; -- l_update_loop check
5927    ELSE
5928       -- For Bi-directional counters just Re-compute the Derived filters for Later readings
5929       FOR later_rdg IN LATER_READINGS_CUR(l_curr_ctr_rdg_rec.counter_id,
5930 					  l_curr_ctr_rdg_rec.value_timestamp)
5931       LOOP
5932 	 -- Re-Compute Derive Counters
5933 	 -- No need for SOFT reset as we would not have created it before.
5934 	 IF NVL(later_rdg.reset_mode,'$#$') <> 'SOFT' THEN
5935 	    l_derive_ctr_rec := l_temp_ctr_rdg_rec;
5936 	    --
5937 	    l_derive_ctr_rec.counter_value_id := later_rdg.counter_value_id; -- source_counter_value_id
5938 	    l_derive_ctr_rec.counter_id := l_curr_ctr_rdg_rec.counter_id;
5939 	    l_derive_ctr_rec.value_timestamp := later_rdg.value_timestamp;
5940 	    --
5941       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5942 	      csi_ctr_gen_utility_pvt.put_line('Calling Compute_Derive_Counters for Update...');
5943       END IF;          -- 8214848 - dsingire
5944 	    Compute_Derive_Counters
5945 	       (
5946 		 p_api_version           => 1.0
5947 		,p_commit                => p_commit
5948 		,p_init_msg_list         => p_init_msg_list
5949 		,p_validation_level      => p_validation_level
5950 		,p_txn_rec               => l_txn_rec
5951 		,p_ctr_rdg_rec           => l_derive_ctr_rec
5952 		,p_mode                  => 'UPDATE'
5953 		,x_return_status         => x_return_status
5954 		,x_msg_count             => x_msg_count
5955 		,x_msg_data              => x_msg_data
5956 	      );
5957 	    IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5958 	       l_msg_index := 1;
5959 	       l_msg_count := x_msg_count;
5960 	       WHILE l_msg_count > 0 LOOP
5961 		  x_msg_data := FND_MSG_PUB.GET
5962 		  (  l_msg_index,
5963 		     FND_API.G_FALSE
5964 		  );
5965 		  csi_ctr_gen_utility_pvt.put_line('ERROR FROM Compute_Derive_Counters API ');
5966 		  csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
5967 		  l_msg_index := l_msg_index + 1;
5968 		  l_msg_count := l_msg_count - 1;
5969 	       END LOOP;
5970 	       RAISE FND_API.G_EXC_ERROR;
5971 	    END IF;
5972 	 END IF; -- Derive counters call check
5973       END LOOP;
5974    END IF; -- l_direction check
5975    --
5976    l_upd_fl_rdg_rec.counter_id := l_curr_ctr_rdg_rec.counter_id;
5977    l_upd_fl_rdg_rec.value_timestamp := l_curr_ctr_rdg_rec.value_timestamp;
5978    l_upd_fl_rdg_rec.disabled_flag := 'Y';
5979    --
5980    -- Call Compute Formula
5981    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
5982     csi_ctr_gen_utility_pvt.put_line('Calling Compute_Formula_Counters for Update...');
5983    END IF;          -- 8214848 - dsingire
5984    Compute_Formula_Counters
5985       (
5986 	p_api_version           => 1.0
5987        ,p_commit                => p_commit
5988        ,p_init_msg_list         => p_init_msg_list
5989        ,p_validation_level      => p_validation_level
5990        ,p_txn_rec               => l_txn_rec
5991        ,p_ctr_rdg_rec           => l_upd_fl_rdg_rec
5992        ,x_return_status         => x_return_status
5993        ,x_msg_count             => x_msg_count
5994        ,x_msg_data              => x_msg_data
5995      );
5996    IF NOT(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5997       csi_ctr_gen_utility_pvt.put_line('Error from Compute_Formula_Counters API...');
5998       l_msg_index := 1;
5999       l_msg_count := x_msg_count;
6000       WHILE l_msg_count > 0 LOOP
6001 	 x_msg_data := FND_MSG_PUB.GET
6002 	 (  l_msg_index,
6003 	    FND_API.G_FALSE
6004 	 );
6005 	 csi_ctr_gen_utility_pvt.put_line('ERROR FROM Compute_Formula_Counters API ');
6006 	 csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
6007 	 l_msg_index := l_msg_index + 1;
6008 	 l_msg_count := l_msg_count - 1;
6009       END LOOP;
6010       RAISE FND_API.G_EXC_ERROR;
6011    END IF;
6012    --
6013    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
6014       COMMIT WORK;
6015    END IF;
6016    --
6017    -- Standard call to get message count and IF count is  get message info.
6018    FND_MSG_PUB.Count_And_Get
6019       ( p_count  =>  x_msg_count,
6020         p_data   =>  x_msg_data
6021       );
6022 EXCEPTION
6023    WHEN FND_API.G_EXC_ERROR THEN
6024       x_return_status := FND_API.G_RET_STS_ERROR ;
6025       ROLLBACK TO update_counter_reading_pvt;
6026       FND_MSG_PUB.Count_And_Get
6027          ( p_count => x_msg_count,
6028            p_data  => x_msg_data
6029          );
6030    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6031       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6032       ROLLBACK TO update_counter_reading_pvt;
6033       FND_MSG_PUB.Count_And_Get
6034          ( p_count => x_msg_count,
6035            p_data  => x_msg_data
6036          );
6037    WHEN OTHERS THEN
6038       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6039       ROLLBACK TO update_counter_reading_pvt;
6040       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6041          FND_MSG_PUB.Add_Exc_Msg
6042             ( G_PKG_NAME,
6043               l_api_name
6044             );
6045       END IF;
6046       FND_MSG_PUB.Count_And_Get
6047          ( p_count  => x_msg_count,
6048            p_data   => x_msg_data
6049          );
6050 END Update_Counter_Reading;
6051 --
6052 PROCEDURE Capture_Ctr_Property_Reading
6053    (
6054      p_api_version           IN     NUMBER
6055     ,p_commit                IN     VARCHAR2
6056     ,p_init_msg_list         IN     VARCHAR2
6057     ,p_validation_level      IN     NUMBER
6058     ,p_ctr_prop_rdg_rec      IN OUT NOCOPY csi_ctr_datastructures_pub.ctr_property_readings_rec
6059     ,x_return_status         OUT    NOCOPY VARCHAR2
6060     ,x_msg_count             OUT    NOCOPY NUMBER
6061     ,x_msg_data              OUT    NOCOPY VARCHAR2
6062  )
6063 IS
6064    l_api_name                      CONSTANT VARCHAR2(30)   := 'CAPTURE_CTR_PROPERTY_READING';
6065    l_api_version                   CONSTANT NUMBER         := 1.0;
6066    l_msg_data                      VARCHAR2(2000);
6067    l_msg_index                     NUMBER;
6068    l_msg_count                     NUMBER;
6069    l_pval                          VARCHAR2(1) := 'F';
6070    l_prop_lov_type                 VARCHAR2(30);
6071    l_property_type                 VARCHAR2(30);
6072    l_is_nullable                   VARCHAR2(30);
6073    l_n_temp                        NUMBER;
6074    l_d_temp                        DATE;
6075    l_process_flag                  BOOLEAN := TRUE;
6076    l_debug_level       NUMBER;    -- 8214848 - dsingire
6077    l_user_id 				  NUMBER := fnd_global.user_id;        -- 8214848 - dsingire
6078    l_conc_login_id		NUMBER := fnd_global.conc_login_id;  -- 8214848 - dsingire
6079    --
6080    CURSOR PROP_LOV_CUR(p_prop_id IN NUMBER) IS
6081    select lookup_code,meaning   --Meaning added for bug #6904836
6082    from CSI_LOOKUPS
6083    where lookup_type = (select property_lov_type
6084                         from CSI_COUNTER_PROPERTIES_B
6085                         where counter_property_id = p_prop_id);
6086 BEGIN
6087    -- Standard Start of API savepoint
6088    SAVEPOINT  capture_ctr_property_reading;
6089    -- Standard call to check for call compatibility.
6090    IF NOT FND_API.Compatible_API_Call (l_api_version,
6091                                        p_api_version,
6092                                        l_api_name   ,
6093                                        G_PKG_NAME   ) THEN
6094       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6095    END IF;
6096    -- Initialize message list if p_init_msg_list is set to TRUE.
6097    IF FND_API.to_Boolean(nvl(p_init_msg_list,FND_API.G_FALSE)) THEN
6098       FND_MSG_PUB.initialize;
6099    END IF;
6100    --  Initialize API return status to success
6101    x_return_status := FND_API.G_RET_STS_SUCCESS;
6102    --
6103 
6104    -- Read the debug profiles values in to global variable 7197402
6105    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
6106 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
6107 	  END IF;                      -- 8214848 - dsingire
6108 
6109     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
6110 
6111    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
6112    csi_ctr_gen_utility_pvt.put_line( 'capture_ctr_property_reading'              ||'-'||
6113                                   p_api_version                              ||'-'||
6114                                   nvl(p_commit,FND_API.G_FALSE)              ||'-'||
6115                                   nvl(p_init_msg_list,FND_API.G_FALSE)       ||'-'||
6116                                   nvl(p_validation_level,FND_API.G_VALID_LEVEL_FULL) );
6117    END IF;          -- 8214848 - dsingire
6118    --
6119    IF p_ctr_prop_rdg_rec.counter_value_id IS NULL OR
6120       p_ctr_prop_rdg_rec.counter_value_id = FND_API.G_MISS_NUM THEN
6121       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_VALUE_ID_MISS');
6122    END IF;
6123    --
6124    IF p_ctr_prop_rdg_rec.counter_property_id IS NULL OR
6125       p_ctr_prop_rdg_rec.counter_property_id = FND_API.G_MISS_NUM THEN
6126       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_PROP_INVALID');
6127    END IF;
6128    --
6129    IF p_ctr_prop_rdg_rec.value_timestamp IS NULL OR
6130       p_ctr_prop_rdg_rec.value_timestamp = FND_API.G_MISS_DATE THEN
6131       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_INVALID_RDG_DATE');
6132    END IF;
6133    --
6134    Begin
6135       select property_lov_type,property_data_type,is_nullable
6136       into l_prop_lov_type,l_property_type, l_is_nullable
6137       from CSI_COUNTER_PROPERTIES_B
6138       where counter_property_id = p_ctr_prop_rdg_rec.counter_property_id
6139       and   nvl(end_date_active,(sysdate+1)) > sysdate;
6140    Exception
6141       when no_data_found THEN
6142          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
6143             csi_ctr_gen_utility_pvt.put_line('Counter Property is Invalid or Expired...');
6144          END IF;          -- 8214848 - dsingire
6145          csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_PROP_INVALID');
6146    End;
6147    --
6148    IF l_is_nullable <> 'Y' THEN
6149 	   IF p_ctr_prop_rdg_rec.property_value IS NULL OR
6150 	      p_ctr_prop_rdg_rec.property_value = FND_API.G_MISS_CHAR THEN
6151 	      csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_PROP_VALUE_MISSING');
6152 	   END IF;
6153    END IF;
6154    --
6155    IF NOT Valid_Ctr_Property_ID
6156             (p_ctr_value_id    =>   p_ctr_prop_rdg_rec.counter_value_id
6157             ,p_ctr_prop_id     =>   p_ctr_prop_rdg_rec.counter_property_id) THEN
6158       -- Property does not belong to the captured counter
6159       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_PROP_INVALID');
6160    END IF;
6161    --
6162    IF Has_Property_Value(p_counter_property_id   =>  p_ctr_prop_rdg_rec.counter_property_id,
6163                          p_counter_value_id      =>  p_ctr_prop_rdg_rec.counter_value_id) = 'T' THEN
6164       -- Property value already exists
6165       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_PROP_VALUE_EXISTS');
6166    END IF;
6167    --
6168    IF l_is_nullable <> 'Y' THEN
6169 	   IF l_prop_lov_type IS NOT NULL THEN
6170 	      FOR prop_rec in PROP_LOV_CUR(p_ctr_prop_rdg_rec.counter_property_id) LOOP
6171 		 IF RTRIM(p_ctr_prop_rdg_rec.PROPERTY_VALUE) = RTRIM(prop_rec.lookup_code) OR
6172         RTRIM(p_ctr_prop_rdg_rec.PROPERTY_VALUE) = RTRIM(prop_rec.meaning) THEN    --Condition added for bug #6904836
6173         l_pval := 'T';
6174 		 END IF;
6175 	      END LOOP;
6176 	   ELSE -- LOV Type Not defined
6177 	      l_pval := 'T';
6178 	   END IF;
6179 	   --
6180 	   IF l_pval = 'F' THEN
6181         IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
6182 	        csi_ctr_gen_utility_pvt.put_line('Property Value does not match with Property LOV Type...');
6183         END IF;          -- 8214848 - dsingire
6184 	      csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_PROP_LOV_MISMATCH');
6185 	   END IF;
6186 	   --
6187 	   /***********************************************
6188 	    *Check if value is valid for property data type
6189 	    ***********************************************/
6190 	   IF l_property_type = 'NUMBER' THEN
6191 	      BEGIN
6192 		 l_n_temp := TO_NUMBER(p_ctr_prop_rdg_rec.PROPERTY_VALUE);
6193 	      EXCEPTION
6194 		 WHEN OTHERS THEN
6195 		    IF (SQLCODE = -6502) THEN
6196 		       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_PROP_DATA_MISMATCH');
6197 		    ELSE
6198 		       RAISE;
6199 		    END IF;
6200 	      END;
6201 	   ELSIF l_property_type = 'CHAR' then
6202 	      null;
6203 	   ELSIF l_property_type = 'DATE' then
6204 	      BEGIN
6205 		 l_d_temp := to_date(p_ctr_prop_rdg_rec.PROPERTY_VALUE,'MM-DD-YYYY');
6206 	      EXCEPTION
6207 		 WHEN OTHERS THEN
6208 		    IF (SQLCODE BETWEEN -1899 AND -1800) THEN
6209 		       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_PROP_DATA_MISMATCH');
6210 		    ELSE
6211 		       RAISE;
6212 		    END IF;
6213 	      END;
6214 	   ELSE
6215 	      csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_PROP_DATA_MISMATCH');
6216 	   END IF;
6217 
6218    END IF;
6219    --
6220    -- Generate Counter_Prop_Value_id
6221    IF p_ctr_prop_rdg_rec.counter_prop_value_id IS NULL OR
6222       p_ctr_prop_rdg_rec.counter_prop_value_id = FND_API.G_MISS_NUM THEN
6223       WHILE l_process_flag LOOP
6224          select CSI_CTR_PROPERTY_READINGS_S.nextval
6225          into p_ctr_prop_rdg_rec.counter_prop_value_id from dual;
6226          IF NOT Counter_Prop_Value_Exists(p_ctr_prop_rdg_rec.counter_prop_value_id) THEN
6227             l_process_flag := FALSE;
6228          END IF;
6229       END LOOP;
6230    ELSE
6231       IF Counter_Prop_Value_Exists(p_ctr_prop_rdg_rec.counter_prop_value_id) THEN
6232          csi_ctr_gen_utility_pvt.ExitWithErrMsg
6233               ( p_msg_name     =>  'CSI_API_CTR_PROP_VALUE_EXISTS',
6234                 p_token1_name  =>  'PROP_VALUE_ID',
6235                 p_token1_val   =>  to_char(p_ctr_prop_rdg_rec.counter_prop_value_id)
6236               );
6237       END IF;
6238    END IF;
6239    --
6240    p_ctr_prop_rdg_rec.object_version_number := 1;
6241    --
6242    CSI_CTR_PROPERTY_READING_PKG.Insert_Row(
6243 	 px_COUNTER_PROP_VALUE_ID         => p_ctr_prop_rdg_rec.counter_prop_value_id
6244 	,p_COUNTER_VALUE_ID               => p_ctr_prop_rdg_rec.counter_value_id
6245 	,p_COUNTER_PROPERTY_ID            => p_ctr_prop_rdg_rec.counter_property_id
6246 	,p_PROPERTY_VALUE                 => p_ctr_prop_rdg_rec.property_value
6247 	,p_VALUE_TIMESTAMP                => p_ctr_prop_rdg_rec.value_timestamp
6248 	,p_OBJECT_VERSION_NUMBER          => p_ctr_prop_rdg_rec.object_version_number
6249 	,p_LAST_UPDATE_DATE               => SYSDATE
6250 	,p_LAST_UPDATED_BY                => l_user_id
6251 	,p_CREATION_DATE                  => SYSDATE
6252 	,p_CREATED_BY                     => l_user_id
6253 	,p_LAST_UPDATE_LOGIN              => l_conc_login_id
6254 	,p_ATTRIBUTE1                     => p_ctr_prop_rdg_rec.attribute1
6255 	,p_ATTRIBUTE2                     => p_ctr_prop_rdg_rec.attribute2
6256 	,p_ATTRIBUTE3                     => p_ctr_prop_rdg_rec.attribute3
6257 	,p_ATTRIBUTE4                     => p_ctr_prop_rdg_rec.attribute4
6258 	,p_ATTRIBUTE5                     => p_ctr_prop_rdg_rec.attribute5
6259 	,p_ATTRIBUTE6                     => p_ctr_prop_rdg_rec.attribute6
6260 	,p_ATTRIBUTE7                     => p_ctr_prop_rdg_rec.attribute7
6261 	,p_ATTRIBUTE8                     => p_ctr_prop_rdg_rec.attribute8
6262 	,p_ATTRIBUTE9                     => p_ctr_prop_rdg_rec.attribute9
6263 	,p_ATTRIBUTE10                    => p_ctr_prop_rdg_rec.attribute10
6264 	,p_ATTRIBUTE11                    => p_ctr_prop_rdg_rec.attribute11
6265 	,p_ATTRIBUTE12                    => p_ctr_prop_rdg_rec.attribute12
6266 	,p_ATTRIBUTE13                    => p_ctr_prop_rdg_rec.attribute13
6267 	,p_ATTRIBUTE14                    => p_ctr_prop_rdg_rec.attribute14
6268 	,p_ATTRIBUTE15                    => p_ctr_prop_rdg_rec.attribute15
6269 	,p_ATTRIBUTE_CATEGORY             => p_ctr_prop_rdg_rec.attribute_category
6270 	,p_MIGRATED_FLAG                  => 'N'
6271    );
6272    --
6273    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
6274       COMMIT WORK;
6275    END IF;
6276    --
6277    -- Standard call to get message count and IF count is  get message info.
6278    FND_MSG_PUB.Count_And_Get
6279       ( p_count  =>  x_msg_count,
6280         p_data   =>  x_msg_data
6281       );
6282 EXCEPTION
6283    WHEN FND_API.G_EXC_ERROR THEN
6284       x_return_status := FND_API.G_RET_STS_ERROR ;
6285       ROLLBACK TO capture_ctr_property_reading;
6286       FND_MSG_PUB.Count_And_Get
6287          ( p_count => x_msg_count,
6288            p_data  => x_msg_data
6289          );
6290    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6291       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6292       ROLLBACK TO capture_ctr_property_reading;
6293       FND_MSG_PUB.Count_And_Get
6294          ( p_count => x_msg_count,
6295            p_data  => x_msg_data
6296          );
6297    WHEN OTHERS THEN
6298       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6299       ROLLBACK TO capture_ctr_property_reading;
6300       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6301          FND_MSG_PUB.Add_Exc_Msg
6302             ( G_PKG_NAME,
6303               l_api_name
6304             );
6305       END IF;
6306       FND_MSG_PUB.Count_And_Get
6307          ( p_count  => x_msg_count,
6308            p_data   => x_msg_data
6309          );
6310 END Capture_Ctr_Property_Reading;
6311 --
6312 FUNCTION Est_daily_avg(
6313     p_start_date	IN DATE,
6314     p_start_reading	IN NUMBER,
6315     p_end_date		IN DATE,
6316     p_end_reading	IN NUMBER
6317    ) RETURN NUMBER IS
6318     l_daily_avg   NUMBER;
6319 BEGIN
6320     l_daily_avg :=  (p_end_reading-p_start_reading)/(trunc(p_end_date)-trunc(p_start_date));
6321     RETURN (l_daily_avg);
6322 END;
6323 --
6324 PROCEDURE ESTIMATE_START_READINGS(
6325     P_api_version                IN   NUMBER,
6326     P_Init_Msg_List              IN   VARCHAR2,
6327     P_Commit                     IN   VARCHAR2,
6328     p_validation_level           IN   NUMBER,
6329     p_counter_id                 IN   NUMBER,
6330     p_default_value		 IN   NUMBER,
6331     p_calculation_start_date     IN   DATE,
6332     x_calc_start_reading         OUT  NOCOPY NUMBER,
6333     X_Return_Status              OUT  NOCOPY VARCHAR2,
6334     X_Msg_Count                  OUT  NOCOPY NUMBER,
6335     X_Msg_Data                   OUT  NOCOPY VARCHAR2
6336     )
6337 IS
6338    CURSOR PRIOR_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
6339    select b.net_reading "prev_reading",b.value_timestamp "prev_rdg_date"
6340    from CSI_COUNTER_READINGS b
6341    where b.counter_id = b_counter_id
6342    and   b.value_timestamp < b_rdg_date
6343    and   nvl(b.disabled_flag,'N') = 'N'
6344    order by b.value_timestamp desc;
6345    --
6346    l_prev_reading   NUMBER;
6347    l_prev_value_timestamp  DATE;
6348    --
6349    CURSOR POST_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
6350    select b.net_reading "post_reading",b.value_timestamp "post_rdg_date"
6351    from CSI_COUNTER_READINGS b
6352    where b.counter_id = b_counter_id
6353    and   b.value_timestamp > b_rdg_date
6354    and   nvl(b.disabled_flag,'N') = 'N'
6355    order by b.value_timestamp asc;
6356    --
6357    l_post_reading    NUMBER;
6358    l_post_value_timestamp  DATE;
6359    --
6360    CURSOR PASSED_DT_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
6361    select b.net_reading "passed_dt_reading", b.value_timestamp "passed_rdg_date"
6362    from CSI_COUNTER_READINGS b
6363    where b.counter_id = b_counter_id
6364    and   nvl(b.disabled_flag,'N') = 'N'
6365    and   trunc(b.value_timestamp) = trunc(b_rdg_date)
6366    order by b.value_timestamp desc;
6367    --
6368    l_passed_dt_reading   NUMBER;
6369    l_passed_rdg_date     DATE;
6370    --
6371    CURSOR FIRST_RDG_VALUES(b_counter_id NUMBER) IS
6372    select b.net_reading "first_reading",b.value_timestamp "first_rdg_date"
6373    from CSI_COUNTER_READINGS b
6374    where b.counter_id = b_counter_id
6375    and   nvl(b.disabled_flag,'N') = 'N'
6376    order by b.value_timestamp asc;
6377    --
6378    l_first_reading   NUMBER;
6379    l_first_rdg_date  DATE;
6380    --
6381    CURSOR CTR_START_DATE(b_counter_id NUMBER) IS
6382    select nvl(start_date_active,creation_date) "ctr_start_date"
6383    from CSI_COUNTERS_B
6384    where counter_id = b_counter_id;
6385 
6386    CURSOR CTR_DIRECTION(b_counter_id NUMBER) IS
6387    select direction
6388    from CSI_COUNTERS_B
6389    where counter_id = b_counter_id;
6390    --
6391    l_ctr_direction VARCHAR2(1);
6392    --
6393    l_api_name              CONSTANT VARCHAR2(30)   := 'ESTIMATE_START_READINGS';
6394    l_api_version           CONSTANT NUMBER         := 1.0;
6395    l_calculation_start_rdg NUMBER;
6396    l_calculation_start_dt  DATE;
6397    l_calc_daily_avg        NUMBER;
6398    l_calc_usage            NUMBER;
6399    l_calc_start_rdg        NUMBER;
6400    l_debug_level           NUMBER;    -- 8214848 - dsingire
6401 BEGIN
6402    SAVEPOINT ESTIMATE_START_READINGS;
6403    -- Initialize message list if p_init_msg_list is set to TRUE.
6404    IF FND_API.to_Boolean( p_init_msg_list ) THEN
6405       FND_MSG_PUB.initialize;
6406    END IF;
6407    -- Initialize API return status to SUCCESS
6408    x_return_status := FND_API.G_RET_STS_SUCCESS;
6409    --
6410 
6411    -- Read the debug profiles values in to global variable 7197402
6412    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
6413 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
6414 	  END IF;                      -- 8214848 - dsingire
6415 
6416     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
6417 
6418    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
6419       csi_ctr_gen_utility_pvt.put_line( 'Inside Estimate_Start_Readings...');
6420    END IF;          -- 8214848 - dsingire
6421    --
6422    -- fetch the reading of the passed avg calculation start date
6423    OPEN PASSED_DT_RDG_VALUES(p_counter_id, p_calculation_start_date);
6424    FETCH PASSED_DT_RDG_VALUES
6425    INTO l_calculation_start_rdg,l_calculation_start_dt;
6426    CLOSE PASSED_DT_RDG_VALUES;
6427    -- if no actual reading on passed avg calc start dt then compute the reading.
6428    IF l_calculation_start_rdg is NULL THEN
6429       OPEN PRIOR_RDG_VALUES(p_counter_id,p_calculation_start_date);
6430       FETCH PRIOR_RDG_VALUES
6431       INTO l_prev_reading,l_prev_value_timestamp;
6432       CLOSE PRIOR_RDG_VALUES;
6433       --
6434       IF l_prev_reading IS NOT NULL THEN
6435          OPEN POST_RDG_VALUES(p_counter_id,p_calculation_start_date);
6436          FETCH POST_RDG_VALUES
6437          INTO l_post_reading,l_post_value_timestamp;
6438          CLOSE POST_RDG_VALUES;
6439          --
6440          IF l_post_reading IS NOT NULL THEN
6441             l_calc_daily_avg := Est_daily_avg(l_prev_value_timestamp,l_prev_reading,l_post_value_timestamp,l_post_reading);
6442             l_calc_usage := (trunc(p_calculation_start_date) - trunc(l_prev_value_timestamp))*l_calc_daily_avg;
6443             l_calc_start_rdg := l_prev_reading + l_calc_usage;
6444          ELSE  --l_post_reading is null
6445             OPEN FIRST_RDG_VALUES(p_counter_id);
6446             FETCH FIRST_RDG_VALUES
6447             INTO l_first_reading,l_first_rdg_date;
6448             CLOSE FIRST_RDG_VALUES;
6449             --
6450             IF (trunc(l_first_rdg_date) = trunc(l_prev_value_timestamp)) THEN
6451                IF p_default_Value IS NULL THEN
6452                   csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_EST_DEF_VAL_NULL');
6453                END IF;
6454                --
6455                l_calc_start_rdg := (trunc(p_calculation_start_date) - trunc(l_first_rdg_date)) * p_default_Value;
6456                -- get the next reading after the period start date to check for erroneous readings
6457                -- For Descending counter
6458                OPEN CTR_DIRECTION(p_counter_id);
6459                FETCH CTR_DIRECTION
6460                INTO l_ctr_direction;
6461                CLOSE CTR_DIRECTION;
6462                --
6463                IF nvl(l_ctr_direction,'X') = 'D' THEN
6464                  l_calc_start_rdg := l_first_reading - l_calc_start_rdg;
6465                ELSIF nvl(l_ctr_direction,'X') = 'A' THEN
6466                  l_calc_start_rdg := l_first_reading + l_calc_start_rdg;
6467                END IF;
6468             ELSE
6469                l_calc_daily_avg := Est_daily_avg(l_first_rdg_date,l_first_reading,l_prev_value_timestamp,l_prev_reading);
6470                l_calc_usage := (trunc(p_calculation_start_date) - trunc(l_prev_value_timestamp))*l_calc_daily_avg;
6471                l_calc_start_rdg := l_prev_reading + l_calc_usage;
6472             END IF;
6473          END IF; --l_post_reading not null
6474       ELSE  --prev reading is null
6475          csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NO_RDG_PR_CAL_STDT');
6476       END IF; --l_prev_reading not null
6477       --
6478       x_calc_start_reading := round(l_calc_start_rdg);
6479       --
6480    ELSE --_calculation_start_rdg not null
6481       x_calc_start_reading := round(l_calculation_start_rdg);
6482    END IF; --l_calculation_start_rdg null
6483    --
6484    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
6485       COMMIT WORK;
6486    END IF;
6487    --
6488    -- Standard call to get message count and IF count is  get message info.
6489    FND_MSG_PUB.Count_And_Get
6490       ( p_count  =>  x_msg_count,
6491         p_data   =>  x_msg_data
6492       );
6493 
6494 EXCEPTION
6495    WHEN FND_API.G_EXC_ERROR THEN
6496       ROLLBACK TO ESTIMATE_START_READINGS;
6497       x_return_status := FND_API.G_RET_STS_ERROR ;
6498       FND_MSG_PUB.Count_And_Get
6499       (p_count => x_msg_count,
6500        p_data => x_msg_data
6501       );
6502    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6503       ROLLBACK TO ESTIMATE_START_READINGS;
6504       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6505       FND_MSG_PUB.Count_And_Get
6506       (
6507        p_count => x_msg_count,
6508        p_data => x_msg_data
6509            );
6510    WHEN OTHERS THEN
6511       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6512       ROLLBACK TO ESTIMATE_START_READINGS;
6513       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6514          FND_MSG_PUB.Add_Exc_Msg
6515             ( G_PKG_NAME,
6516               l_api_name
6517             );
6518       END IF;
6519       FND_MSG_PUB.Count_And_Get
6520          ( p_count  => x_msg_count,
6521            p_data   => x_msg_data
6522          );
6523 END ESTIMATE_START_READINGS;
6524 --
6525 PROCEDURE EST_PERIOD_START_READINGS(
6526     P_api_version                IN   NUMBER,
6527     P_Init_Msg_List              IN   VARCHAR2,
6528     P_Commit                     IN   VARCHAR2,
6529     p_validation_level           IN   NUMBER,
6530     p_counter_id                 IN   NUMBER,
6531     p_default_value		 IN   NUMBER,
6532     p_avg_calculation_start_date  IN    DATE,
6533     p_calculation_start_date     IN   DATE,
6534     x_calc_start_reading         OUT  NOCOPY NUMBER,
6535     X_Return_Status              OUT  NOCOPY VARCHAR2,
6536     X_Msg_Count                  OUT  NOCOPY NUMBER,
6537     X_Msg_Data                   OUT  NOCOPY VARCHAR2
6538     )
6539 IS
6540    l_api_name              CONSTANT VARCHAR2(30)   := 'EST_PERIOD_START_READINGS';
6541    l_api_version           CONSTANT NUMBER         := 1.0;
6542    l_msg_data                       VARCHAR2(2000);
6543    l_msg_index                      NUMBER;
6544    l_msg_count                      NUMBER;
6545    --
6546    CURSOR PRIOR_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
6547    select b.net_reading "prev_reading",b.value_timestamp "prev_rdg_date"
6548    from CSI_COUNTER_READINGS b
6549    where b.counter_id = b_counter_id
6550    and   b.value_timestamp < b_rdg_date
6551    and   nvl(b.disabled_flag,'N') = 'N'
6552    order by b.value_timestamp desc;
6553 
6554    l_prev_reading   NUMBER;
6555    l_prev_value_timestamp  DATE;
6556 
6557    CURSOR POST_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
6558    select b.net_reading "post_reading",b.value_timestamp "post_rdg_date"
6559    from CSI_COUNTER_READINGS b
6560    where b.counter_id = b_counter_id
6561    and   b.value_timestamp > b_rdg_date
6562    and   nvl(b.disabled_flag,'N') = 'N'
6563    order by b.value_timestamp asc;
6564 
6565    l_post_reading    NUMBER;
6566    l_post_value_timestamp  DATE;
6567 
6568    CURSOR PASSED_DT_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
6569    select b.net_reading "passed_dt_reading", b.value_timestamp "passed_rdg_date"
6570    from CSI_COUNTER_READINGS b
6571    where b.counter_id = b_counter_id
6572    and   nvl(b.disabled_flag,'N') = 'N'
6573    and   trunc(b.value_timestamp) = trunc(b_rdg_date)
6574    order by b.value_timestamp desc;
6575 
6576    l_passed_dt_reading   NUMBER;
6577    l_passed_rdg_date     DATE;
6578 
6579    CURSOR first_rdg_values(b_counter_id NUMBER) IS
6580    select b.net_reading "first_reading",b.value_timestamp "first_rdg_date"
6581    from CSI_COUNTER_READINGS b
6582    where b.counter_id = b_counter_id
6583    and   nvl(b.disabled_flag,'N') = 'N'
6584    order by b.value_timestamp asc;
6585 
6586    l_first_reading   NUMBER;
6587    l_first_rdg_date  DATE;
6588 
6589    CURSOR ctr_start_date(b_counter_id NUMBER) IS
6590    select nvl(start_date_active,creation_date) "ctr_start_date"
6591    from CSI_COUNTERS_B
6592    where counter_id = b_counter_id;
6593 
6594    CURSOR CTR_DIRECTION(b_counter_id NUMBER) IS
6595    select direction
6596    from CSI_COUNTERS_B
6597    where counter_id = b_counter_id;
6598 
6599    l_ctr_direction VARCHAR2(1);
6600 
6601    l_calculation_start_rdg NUMBER;
6602    l_calculation_start_dt  DATE;
6603    l_calc_daily_avg   NUMBER;
6604    l_calc_usage  NUMBER;
6605    l_calc_start_rdg  NUMBER;
6606 
6607    l_avg_calc_start_rdg NUMBER;
6608    l_debug_level       NUMBER;    -- 8214848 - dsingire
6609 BEGIN
6610    SAVEPOINT EST_PERIOD_START_READINGS;
6611    -- Initialize message list if p_init_msg_list is set to TRUE.
6612    IF FND_API.to_Boolean( p_init_msg_list ) THEN
6613       FND_MSG_PUB.initialize;
6614    END IF;
6615    -- Initialize API return status to SUCCESS
6616    x_return_status := FND_API.G_RET_STS_SUCCESS;
6617    --
6618    -- Read the debug profiles values in to global variable 7197402
6619    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
6620 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
6621 	  END IF;                      -- 8214848 - dsingire
6622 
6623     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
6624 
6625    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
6626     csi_ctr_gen_utility_pvt.put_line( 'Inside Est_Period_Start_Readings...');
6627    END IF;          -- 8214848 - dsingire
6628    --
6629    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
6630       COMMIT WORK;
6631    END IF;
6632    --
6633    -- fetch the reading of the passed avg calculation start date
6634    OPEN PASSED_DT_RDG_VALUES(p_counter_id, p_calculation_start_date);
6635    FETCH PASSED_DT_RDG_VALUES
6636    INTO l_calculation_start_rdg,l_calculation_start_dt;
6637    CLOSE PASSED_DT_RDG_VALUES;
6638    -- if no actual reading on passed avg calc start dt then compute the reading.
6639    IF l_calculation_start_rdg is NULL THEN
6640       IF p_avg_calculation_start_date  IS NULL THEN
6641          OPEN PRIOR_RDG_VALUES(p_counter_id,p_calculation_start_date);
6642          FETCH PRIOR_RDG_VALUES INTO l_prev_reading,l_prev_value_timestamp;
6643          CLOSE PRIOR_RDG_VALUES;
6644          --
6645          IF l_prev_reading IS NOT NULL THEN
6646             OPEN POST_RDG_VALUES(p_counter_id,p_calculation_start_date);
6647             FETCH POST_RDG_VALUES INTO l_post_reading,l_post_value_timestamp;
6648             CLOSE POST_RDG_VALUES;
6649             --
6650             IF l_post_reading IS NOT NULL THEN
6651                l_calc_daily_avg := Est_daily_avg(l_prev_value_timestamp,l_prev_reading,l_post_value_timestamp,l_post_reading);
6652                l_calc_usage := (trunc(p_calculation_start_date) - trunc(l_prev_value_timestamp))*l_calc_daily_avg;
6653                l_calc_start_rdg := l_prev_reading + l_calc_usage;
6654             ELSE  --l_post_reading is null
6655                OPEN FIRST_RDG_VALUES(p_counter_id);
6656                FETCH FIRST_RDG_VALUES
6657                INTO l_first_reading,l_first_rdg_date;
6658                CLOSE FIRST_RDG_VALUES;
6659                --
6660                IF (trunc(l_first_rdg_date) = trunc(l_prev_value_timestamp)) THEN
6661                   IF p_default_Value IS NULL THEN
6662                      csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_EST_DEF_VAL_NULL');
6663                   END IF;
6664                   l_calc_start_rdg := (trunc(p_calculation_start_date) - trunc(l_first_rdg_date)) * p_default_Value;
6665                   OPEN CTR_DIRECTION(p_counter_id);
6666                   FETCH CTR_DIRECTION
6667                   INTO l_ctr_direction;
6668                   CLOSE CTR_DIRECTION;
6669                   --
6670                   IF nvl(l_ctr_direction,'X') = 'D' THEN
6671                      l_calc_start_rdg := l_first_reading - l_calc_start_rdg;
6672                   ELSIF nvl(l_ctr_direction,'X') = 'A' THEN
6673                      l_calc_start_rdg := l_first_reading + l_calc_start_rdg;
6674                   END IF;
6675                ELSE
6676 		  l_calc_daily_avg := Est_daily_avg(l_first_rdg_date,l_first_reading,l_prev_value_timestamp,l_prev_reading);
6677 		  l_calc_usage := (trunc(p_calculation_start_date) - trunc(l_prev_value_timestamp))*l_calc_daily_avg;
6678 		  l_calc_start_rdg := l_prev_reading + l_calc_usage;
6679                END IF;
6680             END IF; --l_post_reading not null
6681          ELSE  --prev reading is null
6682             csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NO_RDG_PR_PRD_STDT');
6683          END IF; --l_prev_reading not null
6684       ELSE --p avg calculation start date is not null
6685          -- get the avg calculation start reading.
6686          IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
6687             csi_ctr_gen_utility_pvt.put_line('Calling Estimate_Start_Readings...');
6688          END IF;          -- 8214848 - dsingire
6689          ESTIMATE_START_READINGS(
6690 	     P_api_version                     => 1.0,
6691 	     P_Init_Msg_List                   => P_Init_Msg_List,
6692 	     P_Commit                          => P_Commit,
6693 	     p_validation_level                => p_validation_level,
6694 	     p_counter_id                      => p_counter_id,
6695 	     p_default_value                   => p_default_value,
6696 	     p_calculation_start_date          => p_avg_calculation_start_date,
6697 	     x_calc_start_reading              => l_avg_calc_start_rdg,
6698 	     X_Return_Status                   => X_Return_Status,
6699 	     X_Msg_Count                       => X_Msg_Count,
6700 	     X_Msg_Data                        => X_Msg_Data
6701            );
6702       	 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6703 	    csi_ctr_gen_utility_pvt.put_line('ERROR FROM Estimate_Start_Readings API ');
6704 	    l_msg_index := 1;
6705 	    l_msg_count := x_msg_count;
6706 	    WHILE l_msg_count > 0 LOOP
6707 	       x_msg_data := FND_MSG_PUB.GET
6708 	       (  l_msg_index,
6709 		  FND_API.G_FALSE
6710 	       );
6711 	       csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
6712 	       l_msg_index := l_msg_index + 1;
6713 	       l_msg_count := l_msg_count - 1;
6714 	    END LOOP;
6715 	    RAISE FND_API.G_EXC_ERROR;
6716     	 END IF;
6717          --
6718 	 OPEN PRIOR_RDG_VALUES(p_counter_id,p_calculation_start_date);
6719 	 FETCH PRIOR_RDG_VALUES
6720          INTO l_prev_reading,l_prev_value_timestamp;
6721 	 CLOSE PRIOR_RDG_VALUES;
6722          --
6723          IF l_prev_reading IS NOT NULL THEN
6724             OPEN POST_RDG_VALUES(p_counter_id,p_calculation_start_date);
6725             FETCH POST_RDG_VALUES
6726             INTO l_post_reading,l_post_value_timestamp;
6727             CLOSE POST_RDG_VALUES;
6728             --
6729             IF l_post_reading IS NOT NULL THEN
6730                l_calc_daily_avg := Est_daily_avg(l_prev_value_timestamp,l_prev_reading,l_post_value_timestamp,l_post_reading);
6731                l_calc_usage := (trunc(p_calculation_start_date) - trunc(l_prev_value_timestamp))*l_calc_daily_avg;
6732                l_calc_start_rdg := l_prev_reading + l_calc_usage;
6733             ELSE  --l_post_reading is null
6734                IF trunc(l_prev_value_timestamp) > trunc(p_avg_calculation_start_date) THEN
6735                   l_calc_daily_avg := Est_daily_avg(p_avg_calculation_start_date,l_avg_calc_start_rdg,l_prev_value_timestamp,l_prev_reading);
6736                   l_calc_usage := (trunc(p_calculation_start_date) - trunc(l_prev_value_timestamp)) * l_calc_daily_avg;
6737                   l_calc_start_rdg := l_prev_reading + l_calc_usage;
6738                ELSE
6739                   IF p_default_Value IS NULL THEN
6740                      csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_EST_DEF_VAL_NULL');
6741                   END IF;
6742                   l_calc_start_rdg := (trunc(p_calculation_start_date) - trunc(p_avg_calculation_start_date)) * p_default_Value;
6743                   OPEN CTR_DIRECTION(p_counter_id);
6744                   FETCH CTR_DIRECTION INTO l_ctr_direction;
6745                   CLOSE CTR_DIRECTION;
6746                   --
6747                   IF nvl(l_ctr_direction,'X') = 'D' THEN
6748                      l_calc_start_rdg := l_avg_calc_start_rdg - l_calc_start_rdg;
6749                   ELSIF nvl(l_ctr_direction,'X') = 'A' THEN
6750                      l_calc_start_rdg := l_avg_calc_start_rdg + l_calc_start_rdg;
6751                   END IF;
6752                END IF;
6753             END IF; --l_post_reading not null
6754          ELSE  --prev reading is null
6755             csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NO_RDG_PR_PRD_STDT');
6756          END IF; --l_prev_reading not null
6757       END IF; -- p avg calculation start date is null
6758       --
6759       x_calc_start_reading := round(l_calc_start_rdg);
6760       --
6761    ELSE --l_calculation_start_rdg not null
6762       x_calc_start_reading := round(l_calculation_start_rdg);
6763    END IF; --l_calculation_start_rdg null
6764    --
6765    -- Standard call to get message count and IF count is  get message info.
6766    FND_MSG_PUB.Count_And_Get
6767       ( p_count  =>  x_msg_count,
6768         p_data   =>  x_msg_data
6769       );
6770 
6771 EXCEPTION
6772    WHEN FND_API.G_EXC_ERROR THEN
6773       ROLLBACK TO EST_PERIOD_START_READINGS;
6774       x_return_status := FND_API.G_RET_STS_ERROR ;
6775       FND_MSG_PUB.Count_And_Get
6776       (p_count => x_msg_count,
6777        p_data => x_msg_data
6778       );
6779    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6780       ROLLBACK TO EST_PERIOD_START_READINGS;
6781       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6782       FND_MSG_PUB.Count_And_Get
6783       (
6784        p_count => x_msg_count,
6785        p_data => x_msg_data
6786            );
6787    WHEN OTHERS THEN
6788       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6789       ROLLBACK TO EST_PERIOD_START_READINGS;
6790       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6791          FND_MSG_PUB.Add_Exc_Msg
6792             ( G_PKG_NAME,
6793               l_api_name
6794             );
6795       END IF;
6796       FND_MSG_PUB.Count_And_Get
6797          ( p_count  => x_msg_count,
6798            p_data   => x_msg_data
6799          );
6800 END EST_PERIOD_START_READINGS;
6801 --
6802 PROCEDURE ESTIMATE_USAGE(
6803     P_api_version                IN   NUMBER,
6804     P_Init_Msg_List              IN   VARCHAR2,
6805     P_Commit                     IN   VARCHAR2,
6806     p_validation_level           IN   NUMBER,
6807     p_counter_id                 IN   NUMBER,
6808     p_usage_markup		 IN   NUMBER,
6809     p_default_value		 IN   NUMBER,
6810     p_estimation_avg_type        IN   VARCHAR2,
6811     p_estimation_period_start_date IN DATE,
6812     p_estimation_period_end_date IN   DATE,
6813     p_avg_calculation_start_date  IN    DATE,
6814     p_number_of_readings         IN   NUMBER,
6815     x_estimated_usage_qty        OUT  NOCOPY NUMBER,
6816     x_estimated_meter_reading    OUT  NOCOPY NUMBER,
6817     x_estimated_period_start_rdg OUT  NOCOPY NUMBER,
6818     X_Return_Status              OUT  NOCOPY VARCHAR2,
6819     X_Msg_Count                  OUT  NOCOPY NUMBER,
6820     X_Msg_Data                   OUT  NOCOPY VARCHAR2
6821     )
6822 IS
6823    l_api_name              CONSTANT VARCHAR2(30)   := 'ESTIMATE_USAGE';
6824    l_api_version           CONSTANT NUMBER         := 1.0;
6825    l_msg_data                       VARCHAR2(2000);
6826    l_msg_index                      NUMBER;
6827    l_msg_count                      NUMBER;
6828    --
6829    CURSOR PRIOR_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
6830    select b.net_reading "prev_reading",b.value_timestamp "prev_rdg_date"
6831    from CSI_COUNTER_READINGS b
6832    where b.counter_id = b_counter_id
6833    and   b.value_timestamp < b_rdg_date
6834    and   nvl(b.disabled_flag,'N') = 'N'
6835    order by b.value_timestamp desc;
6836    --
6837    l_prev_reading   NUMBER;
6838    l_prev_value_timestamp  DATE;
6839    --
6840    CURSOR POST_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
6841    select b.net_reading "post_reading",b.value_timestamp "post_rdg_date"
6842    from CSI_COUNTER_READINGS b
6843    where b.counter_id = b_counter_id
6844    and   b.value_timestamp > b_rdg_date
6845    and   nvl(b.disabled_flag,'N') = 'N'
6846    order by b.value_timestamp asc;
6847    --
6848    l_post_reading    NUMBER;
6849    l_post_value_timestamp  DATE;
6850 
6851    CURSOR PASSED_DT_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
6852    select b.net_reading "passed_dt_reading", b.value_timestamp "passed_rdg_date"
6853    from CSI_COUNTER_READINGS b
6854    where b.counter_id = b_counter_id
6855    and   nvl(b.disabled_flag,'N') = 'N'
6856    and   trunc(b.value_timestamp) = trunc(b_rdg_date)
6857    order by b.value_timestamp desc;
6858    --
6859    l_passed_dt_reading   NUMBER;
6860    l_passed_rdg_date     DATE;
6861 
6862    CURSOR first_rdg_values(b_counter_id NUMBER) IS
6863    select b.net_reading "first_reading",b.value_timestamp "first_rdg_date"
6864    from CSI_COUNTER_READINGS b
6865    where b.counter_id = b_counter_id
6866    and   nvl(b.disabled_flag,'N') = 'N'
6867    order by b.value_timestamp asc;
6868    --
6869    l_first_reading   NUMBER;
6870    l_first_rdg_date  DATE;
6871 
6872    CURSOR ctr_start_date(b_counter_id NUMBER) IS
6873    select nvl(start_date_active,creation_date) "ctr_start_date"
6874    from CSI_COUNTERS_B
6875    where counter_id = b_counter_id;
6876    --
6877    CURSOR CTR_DIRECTION(b_counter_id NUMBER) IS
6878    select direction
6879    from CSI_COUNTERS_B
6880    where counter_id = b_counter_id;
6881    --
6882    l_ctr_direction VARCHAR2(1);
6883    --
6884    l_avg_calc_start_reading  NUMBER;
6885    l_period_start_reading  NUMBER;
6886 
6887    l_daily_avg_for_est NUMBER;
6888    l_usage_for_est NUMBER;
6889    l_estimated_meter_rdg NUMBER;
6890    l_estimated_usage NUMBER;
6891 
6892    l_num_ctr_rdg number;
6893    l_num_value_timestamp DATE;
6894 
6895    lp_period_start_reading number;
6896    lprdst_num_ctr_rdg number;
6897    lprdst_num_value_timestamp date;
6898    l_debug_level       NUMBER;    -- 8214848 - dsingire
6899 BEGIN
6900    SAVEPOINT ESTIMATE_USAGE;
6901    -- Initialize message list if p_init_msg_list is set to TRUE.
6902    IF FND_API.to_Boolean( p_init_msg_list ) THEN
6903       FND_MSG_PUB.initialize;
6904    END IF;
6905    -- Initialize API return status to SUCCESS
6906    x_return_status := FND_API.G_RET_STS_SUCCESS;
6907    --
6908 
6909    -- Read the debug profiles values in to global variable 7197402
6910    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
6911 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
6912 	  END IF;                      -- 8214848 - dsingire
6913 
6914     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
6915 
6916    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
6917    csi_ctr_gen_utility_pvt.put_line( 'Inside Estimate_Usage...');
6918    END IF;          -- 8214848 - dsingire
6919    --
6920    IF p_avg_calculation_start_date IS NOT NULL THEN
6921       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
6922         csi_ctr_gen_utility_pvt.put_line('Calling Estimate_Start_Readings...');
6923       END IF;          -- 8214848 - dsingire
6924       ESTIMATE_START_READINGS(
6925 	  P_api_version                     => 1.0,
6926 	  P_Init_Msg_List                   => P_Init_Msg_List,
6927 	  P_Commit                          => P_Commit,
6928 	  p_validation_level                => p_validation_level,
6929 	  p_counter_id                      => p_counter_id,
6930 	  p_default_value                   => p_default_value,
6931 	  p_calculation_start_date          => p_avg_calculation_start_date,
6932 	  x_calc_start_reading              => l_avg_calc_start_reading,
6933 	  X_Return_Status                   => X_Return_Status,
6934  	  X_Msg_Count                       => X_Msg_Count,
6935 	  X_Msg_Data                        => X_Msg_Data
6936         );
6937       IF x_return_status<>FND_API.G_RET_STS_SUCCESS THEN
6938          l_msg_index := 1;
6939          l_msg_count := x_msg_count;
6940          WHILE l_msg_count > 0 LOOP
6941             x_msg_data := FND_MSG_PUB.GET
6942             (  l_msg_index,
6943                FND_API.G_FALSE
6944             );
6945             csi_ctr_gen_utility_pvt.put_line('ERROR FROM Estimate_Start_Readings API ');
6946             csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
6947             l_msg_index := l_msg_index + 1;
6948             l_msg_count := l_msg_count - 1;
6949          END LOOP;
6950          RAISE FND_API.G_EXC_ERROR;
6951       END IF;
6952    END IF;
6953 
6954    IF p_estimation_period_start_date IS NOT NULL THEN
6955       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
6956         csi_ctr_gen_utility_pvt.put_line('Calling Est_Period_Start_Readings...');
6957       END IF;          -- 8214848 - dsingire
6958       EST_PERIOD_START_READINGS(
6959 	  P_api_version                     => 1.0,
6960 	  P_Init_Msg_List                   => P_Init_Msg_List,
6961 	  P_Commit                          => P_Commit,
6962 	  p_validation_level                => p_validation_level,
6963 	  p_counter_id                      => p_counter_id,
6964 	  p_default_value                   => p_default_value,
6965 	  p_avg_calculation_start_date      => p_avg_calculation_start_date,
6966 	  p_calculation_start_date          => p_estimation_period_start_date,
6967 	  x_calc_start_reading              => l_period_start_reading,
6968 	  X_Return_Status                   => X_Return_Status,
6969 	  X_Msg_Count                       => X_Msg_Count,
6970 	  X_Msg_Data                        => X_Msg_Data
6971         );
6972       IF x_return_status<>FND_API.G_RET_STS_SUCCESS THEN
6973          l_msg_index := 1;
6974          l_msg_count := x_msg_count;
6975          WHILE l_msg_count > 0 LOOP
6976             x_msg_data := FND_MSG_PUB.GET
6977             (  l_msg_index,
6978                FND_API.G_FALSE
6979             );
6980             csi_ctr_gen_utility_pvt.put_line('ERROR FROM Est_Period_Start_Readings API ');
6981             csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
6982             l_msg_index := l_msg_index + 1;
6983             l_msg_count := l_msg_count - 1;
6984          END LOOP;
6985          RAISE FND_API.G_EXC_ERROR;
6986       END IF;
6987    END IF;
6988    -- estimation usage calculation
6989    -- fetch the reading of the passed estimation period end date
6990    OPEN PASSED_DT_RDG_VALUES(p_counter_id, p_estimation_period_end_date);
6991    FETCH PASSED_DT_RDG_VALUES
6992    INTO l_estimated_meter_rdg,l_passed_rdg_date;
6993    CLOSE PASSED_DT_RDG_VALUES;
6994    -- if no actual reading on passed estimation period end dt then compute the reading.
6995    IF l_estimated_meter_rdg is NULL THEN
6996       IF p_avg_calculation_start_date IS NOT NULL THEN
6997          OPEN PRIOR_RDG_VALUES(p_counter_id, p_estimation_period_end_date);
6998          FETCH PRIOR_RDG_VALUES
6999          INTO l_prev_reading,l_prev_value_timestamp;
7000          CLOSE PRIOR_RDG_VALUES;
7001          --
7002 	 IF l_prev_reading IS NOT NULL THEN
7003 	    OPEN POST_RDG_VALUES(p_counter_id,p_estimation_period_end_date);
7004 	    FETCH POST_RDG_VALUES
7005 	    INTO l_post_reading,l_post_value_timestamp;
7006 	    CLOSE POST_RDG_VALUES;
7007 	    --
7008 	    IF l_post_reading IS NOT NULL THEN
7009 	       l_daily_avg_for_est := Est_daily_avg(l_prev_value_timestamp,l_prev_reading,l_post_value_timestamp,l_post_reading);
7010 	       l_usage_for_est := (trunc(p_estimation_period_end_date) - trunc(l_prev_value_timestamp)) * l_daily_avg_for_est;
7011 	       l_usage_for_est := l_usage_for_est + ((nvl(p_usage_markup,0)/100) * (l_usage_for_est));
7012 	       l_estimated_meter_rdg := l_prev_reading + l_usage_for_est;
7013 	       IF p_estimation_period_start_date IS NOT NULL THEN
7014 		  l_estimated_usage := l_estimated_meter_rdg - l_period_start_reading;
7015 	       END IF;
7016 	    ELSE  --l_post_reading is null
7017 	       IF trunc(l_prev_value_timestamp) > trunc(p_avg_calculation_start_date) THEN
7018 		  l_daily_avg_for_est := Est_daily_avg(p_avg_calculation_start_date,l_avg_calc_start_reading,l_prev_value_timestamp,l_prev_reading);
7019 		  l_usage_for_est := (trunc(p_estimation_period_end_date) - trunc(l_prev_value_timestamp)) * l_daily_avg_for_est;
7020 		  l_usage_for_est := l_usage_for_est + ((nvl(p_usage_markup,0)/100) * (l_usage_for_est));
7021 		  l_estimated_meter_rdg := l_prev_reading + l_usage_for_est;
7022 		  IF p_estimation_period_start_date IS NOT NULL THEN
7023 		     l_estimated_usage := l_estimated_meter_rdg - l_period_start_reading;
7024 		  END IF;
7025 	       ELSE
7026 		  IF p_default_Value IS NULL THEN
7027                      csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_EST_DEF_VAL_NULL');
7028 		  END IF;
7029 		  l_estimated_meter_rdg := (trunc(p_estimation_period_end_date) - trunc(p_avg_calculation_start_date)) * p_default_Value;
7030 		  l_estimated_meter_rdg := l_estimated_meter_rdg + ((nvl(p_usage_markup,0)/100) * (l_estimated_meter_rdg));
7031 		  -- get the next reading after the period start date to check for erroneous readings
7032 		  OPEN CTR_DIRECTION(p_counter_id);
7033 		  FETCH CTR_DIRECTION
7034 		  INTO l_ctr_direction;
7035 		  CLOSE CTR_DIRECTION;
7036 		  --
7037 		  IF nvl(l_ctr_direction,'X') = 'D' THEN
7038 		     l_estimated_meter_rdg := l_avg_calc_start_reading - l_estimated_meter_rdg;
7039 		  ELSIF nvl(l_ctr_direction,'X') = 'A' THEN
7040 		     l_estimated_meter_rdg := l_avg_calc_start_reading + l_estimated_meter_rdg;
7041 		  END IF;
7042 		  --
7043 		  IF p_estimation_period_start_date IS NOT NULL THEN
7044 		     l_estimated_usage := l_estimated_meter_rdg - l_period_start_reading;
7045 		  END IF;
7046 	       END IF; --l_prev_value_timestamp>p_avg_calculation_start_date
7047 	    END IF; --l_post_reading not null
7048 	 ELSE --l_prev_reading is null
7049             csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NO_RDG_PR_PRD_ENDT');
7050 	 END IF; --l_prev_reading not null
7051       ELSIF P_number_of_readings is not null then -- p_number of rdgs not null
7052 	 Declare
7053 	    n number;
7054 	    j number := 0;
7055 	    l_min_seqno number;
7056 	    CURSOR CTR_RDGS(d1_counter_id number, b_prd_rdg_date DATE) IS
7057 	    select cval.net_reading AS NET_RDG, cval.value_timestamp
7058 	    from CSI_COUNTER_READINGS cval
7059 	    where cval.counter_id = d1_counter_id
7060 	    and   cval.value_timestamp <   b_prd_rdg_date
7061             and   nvl(cval.disabled_flag,'N') = 'N'
7062 	    order by cval.value_timestamp desc;
7063 	    --for prd start reading
7064 	    n1 number;
7065 	    j1 number := 0;
7066 	 Begin
7067 	    -- estimation start meter reading.
7068 	    IF p_estimation_period_start_date IS NOT NULL THEN
7069 	       FOR prd_st_ctr_rdgs_rec in CTR_RDGS(p_counter_id,p_estimation_period_start_date) LOOP
7070 		  j1 := j1+1;
7071 		  lprdst_num_ctr_rdg := nvl(prd_st_ctr_rdgs_rec.net_rdg,0);
7072 		  lprdst_num_value_timestamp := prd_st_ctr_rdgs_rec.value_timestamp;
7073 		  IF j1 = p_number_of_readings then
7074 		     exit;
7075 		  END IF;
7076 	       END LOOP;
7077 	       --
7078 	       IF J1 < 2 THEN
7079 		  lprdst_num_ctr_rdg := null;
7080                   csi_ctr_gen_utility_pvt.ExitWithErrMsg
7081                       ( p_msg_name     =>  'CSI_API_CTR_INVD_NUM_OF_RDGS',
7082                         p_token1_name  =>  'P_NUMBER_OF_READINGS',
7083                         p_token1_val   =>  to_char(p_number_of_readings)
7084                       );
7085 	       ELSE
7086 		  OPEN PRIOR_RDG_VALUES(p_counter_id, p_estimation_period_start_date);
7087 		  FETCH PRIOR_RDG_VALUES
7088 		  INTO l_prev_reading,l_prev_value_timestamp;
7089 		  CLOSE PRIOR_RDG_VALUES;
7090 		  --
7091 		  IF l_prev_reading IS NOT NULL THEN
7092 		     l_daily_avg_for_est := Est_daily_avg(lprdst_num_value_timestamp,lprdst_num_ctr_rdg,l_prev_value_timestamp,l_prev_reading);
7093 		     l_usage_for_est := (trunc(p_estimation_period_start_date) - trunc(l_prev_value_timestamp)) * l_daily_avg_for_est;
7094 		     lp_period_start_reading := l_prev_reading + l_usage_for_est;
7095 		     l_period_start_reading := round(lp_period_start_reading);
7096 		  ELSE
7097 		     csi_ctr_gen_utility_pvt.ExitWithErrMsg
7098 			 ( p_msg_name     =>  'CSI_API_CTR_INVD_NUM_OF_RDGS',
7099 			   p_token1_name  =>  'P_NUMBER_OF_READINGS',
7100 			   p_token1_val   =>  to_char(p_number_of_readings)
7101 			 );
7102 		  END IF;
7103 	       END IF;
7104 	    END IF;
7105 	    --
7106 	    l_prev_reading :=  null;
7107 	    l_prev_value_timestamp := null;
7108 	    l_daily_avg_for_est :=  null;
7109 	    l_usage_for_est := null;
7110 	    --estimation end meter reading.
7111 	    FOR ctr_rdgs_rec in CTR_RDGS(p_counter_id, p_estimation_period_end_date) LOOP
7112 	      j:=j+1;
7113 	      l_num_ctr_rdg := nvl(ctr_rdgs_rec.net_rdg,0);
7114 	      l_num_value_timestamp := ctr_rdgs_rec.value_timestamp;
7115 	      IF j = p_number_of_readings then
7116 		 exit;
7117 	      END IF;
7118 	    END LOOP;
7119 	    --
7120 	    IF J < 2 THEN   --J <> p_number_of_readings then
7121 	       l_num_ctr_rdg := null;
7122 	       csi_ctr_gen_utility_pvt.ExitWithErrMsg
7123 		   ( p_msg_name     =>  'CSI_API_CTR_INVD_NUM_OF_RDGS',
7124 		     p_token1_name  =>  'P_NUMBER_OF_READINGS',
7125 		     p_token1_val   =>  to_char(p_number_of_readings)
7126 		   );
7127 	    END IF;
7128 	 End;
7129 	 --
7130 	 OPEN PRIOR_RDG_VALUES(p_counter_id, p_estimation_period_end_date);
7131 	 FETCH PRIOR_RDG_VALUES INTO l_prev_reading,l_prev_value_timestamp;
7132 	 CLOSE PRIOR_RDG_VALUES;
7133 	 IF l_prev_reading IS NOT NULL THEN
7134 	     l_daily_avg_for_est := Est_daily_avg(l_num_value_timestamp,l_num_ctr_rdg,l_prev_value_timestamp,l_prev_reading);
7135 	     l_usage_for_est := (trunc(p_estimation_period_end_date) - trunc(l_prev_value_timestamp)) * l_daily_avg_for_est;
7136 	     l_usage_for_est := l_usage_for_est + ((nvl(p_usage_markup,0)/100) * (l_usage_for_est));
7137 	     l_estimated_meter_rdg := l_prev_reading + l_usage_for_est;
7138 	     IF p_estimation_period_start_date IS NOT NULL THEN
7139 		l_estimated_usage := l_estimated_meter_rdg - lp_period_start_reading;
7140 	     END IF;
7141 	 ELSE
7142 	    csi_ctr_gen_utility_pvt.ExitWithErrMsg
7143 		( p_msg_name     =>  'CSI_API_CTR_INVD_NUM_OF_RDGS',
7144 		  p_token1_name  =>  'P_NUMBER_OF_READINGS',
7145 		  p_token1_val   =>  to_char(p_number_of_readings)
7146 		);
7147 	 END IF;
7148       ELSIF p_avg_calculation_start_date IS NULL and P_number_of_readings IS NULL THEN
7149 	 OPEN PRIOR_RDG_VALUES(p_counter_id, p_estimation_period_end_date);
7150 	 FETCH PRIOR_RDG_VALUES
7151 	 INTO l_prev_reading,l_prev_value_timestamp;
7152 	 CLOSE PRIOR_RDG_VALUES;
7153 	 --
7154 	 IF l_prev_reading IS NOT NULL THEN
7155 	    OPEN POST_RDG_VALUES(p_counter_id,p_estimation_period_end_date);
7156 	    FETCH POST_RDG_VALUES
7157 	    INTO l_post_reading,l_post_value_timestamp;
7158 	    CLOSE POST_RDG_VALUES;
7159 	    --
7160 	    IF l_post_reading IS NOT NULL THEN
7161 	       l_daily_avg_for_est := Est_daily_avg(l_prev_value_timestamp,l_prev_reading,l_post_value_timestamp,l_post_reading);
7162 	       l_usage_for_est := (trunc(p_estimation_period_end_date) - trunc(l_prev_value_timestamp)) * l_daily_avg_for_est;
7163 	       l_usage_for_est := l_usage_for_est + ((nvl(p_usage_markup,0)/100) * (l_usage_for_est));
7164 	       l_estimated_meter_rdg := l_prev_reading + l_usage_for_est;
7165 	       IF p_estimation_period_start_date IS NOT NULL THEN
7166 		  l_estimated_usage := l_estimated_meter_rdg - l_period_start_reading;
7167 	       END IF;
7168 	    ELSE  --l_post_reading is null
7169 	       OPEN FIRST_RDG_VALUES(p_counter_id);
7170 	       FETCH FIRST_RDG_VALUES
7171 	       INTO l_first_reading,l_first_rdg_date;
7172 	       CLOSE FIRST_RDG_VALUES;
7173 	       --
7174 	       IF trunc(l_prev_value_timestamp) = trunc(l_first_rdg_date) THEN
7175 		  IF p_default_Value IS NULL THEN
7176                      csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_EST_DEF_VAL_NULL');
7177 		  END IF;
7178 		  l_estimated_meter_rdg := (trunc(p_estimation_period_end_date) - trunc(l_first_rdg_date)) * p_default_Value;
7179 		  l_estimated_meter_rdg := l_estimated_meter_rdg + ((nvl(p_usage_markup,0)/100) * (l_estimated_meter_rdg));
7180 		  OPEN CTR_DIRECTION(p_counter_id);
7181 		  FETCH CTR_DIRECTION
7182 		  INTO l_ctr_direction;
7183 		  CLOSE CTR_DIRECTION;
7184 		  --
7185 		  IF nvl(l_ctr_direction,'X') = 'D' THEN
7186 		    l_estimated_meter_rdg := l_first_reading - l_estimated_meter_rdg;
7187 		  ELSIF nvl(l_ctr_direction,'X') = 'A' THEN
7188 		    l_estimated_meter_rdg := l_first_reading + l_estimated_meter_rdg;
7189 		  END IF;
7190 		  IF p_estimation_period_start_date IS NOT NULL THEN
7191 		     l_estimated_usage := l_estimated_meter_rdg - l_period_start_reading;
7192 		  END IF;
7193 	       ELSE
7194 		  l_daily_avg_for_est := Est_daily_avg(l_first_rdg_date,l_first_reading,l_prev_value_timestamp,l_prev_reading);
7195 		  l_usage_for_est := (trunc(p_estimation_period_end_date) - trunc(l_prev_value_timestamp)) * l_daily_avg_for_est;
7196 		  l_usage_for_est := l_usage_for_est + ((nvl(p_usage_markup,0)/100) * (l_usage_for_est));
7197 		  l_estimated_meter_rdg := l_prev_reading + l_usage_for_est;
7198 		  IF p_estimation_period_start_date IS NOT NULL THEN
7199 		     l_estimated_usage := l_estimated_meter_rdg - l_period_start_reading;
7200 		  END IF;
7201 	       END IF;
7202 	    END IF; --l_post_reading not null
7203          ELSE --l_prev_reading is null
7204 	  --error out - not enough readings to calculate the estimation
7205             csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NO_RDG_PR_PRD_ENDT');
7206          END IF;
7207       END IF; --p_avg_calculation_start_date not null
7208    ELSE  --l_estimated_meter_rdg is  NOT NULL
7209       IF p_estimation_period_start_date IS NOT NULL THEN
7210          l_estimated_usage := l_estimated_meter_rdg - l_period_start_reading;
7211       END IF;
7212    END IF; -- l_estimated_meter_rdg is NULL
7213    --
7214    x_estimated_meter_reading := round(l_estimated_meter_rdg);
7215    x_estimated_usage_qty     := abs(round(l_estimated_usage));
7216    x_estimated_period_start_rdg := l_period_start_reading;
7217    --
7218    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
7219       COMMIT WORK;
7220    END IF;
7221    --
7222    -- Standard call to get message count and IF count is  get message info.
7223    FND_MSG_PUB.Count_And_Get
7224       ( p_count  =>  x_msg_count,
7225         p_data   =>  x_msg_data
7226       );
7227 
7228 EXCEPTION
7229    WHEN FND_API.G_EXC_ERROR THEN
7230       ROLLBACK TO ESTIMATE_USAGE;
7231       x_return_status := FND_API.G_RET_STS_ERROR ;
7232       FND_MSG_PUB.Count_And_Get
7233       (p_count => x_msg_count,
7234        p_data => x_msg_data
7235       );
7236    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7237       ROLLBACK TO ESTIMATE_USAGE;
7238       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7239       FND_MSG_PUB.Count_And_Get
7240       (
7241        p_count => x_msg_count,
7242        p_data => x_msg_data
7243            );
7244    WHEN OTHERS THEN
7245       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7246       ROLLBACK TO ESTIMATE_USAGE;
7247       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7248          FND_MSG_PUB.Add_Exc_Msg
7249             ( G_PKG_NAME,
7250               l_api_name
7251             );
7252       END IF;
7253       FND_MSG_PUB.Count_And_Get
7254          ( p_count  => x_msg_count,
7255            p_data   => x_msg_data
7256          );
7257 END ESTIMATE_USAGE;
7258 --
7259 PROCEDURE ESTIMATE_COUNTER_READING(
7260     P_api_version                IN   NUMBER,
7261     P_Init_Msg_List              IN   VARCHAR2,
7262     P_Commit                     IN   VARCHAR2,
7263     p_validation_level           IN   NUMBER,
7264     p_counter_id                 IN   NUMBER,
7265     p_estimation_period_start_date IN DATE,
7266     p_estimation_period_end_date IN   DATE,
7267     p_avg_calculation_start_date  IN    DATE,
7268     p_number_of_readings         IN   NUMBER,
7269     x_estimated_usage_qty        OUT  NOCOPY NUMBER,
7270     x_estimated_meter_reading    OUT  NOCOPY NUMBER,
7271     x_estimated_period_start_rdg OUT  NOCOPY NUMBER,
7272     X_Return_Status              OUT  NOCOPY VARCHAR2,
7273     X_Msg_Count                  OUT  NOCOPY NUMBER,
7274     X_Msg_Data                   OUT  NOCOPY VARCHAR2
7275     )
7276 IS
7277    l_api_name              CONSTANT VARCHAR2(30)   := 'ESTIMATE_COUNTER_READING';
7278    l_api_version           CONSTANT NUMBER         := 1.0;
7279    l_msg_data                       VARCHAR2(2000);
7280    l_msg_index                      NUMBER;
7281    l_msg_count                      NUMBER;
7282    l_estimated_rdg_id               NUMBER;
7283    l_process_flag                   BOOLEAN := TRUE;
7284    --
7285    CURSOR CTREST_REC IS
7286    select group_id counter_group_id,estimation_id
7287    from CSI_COUNTERS_B
7288    where counter_id = p_counter_id;
7289    --
7290    l_counter_group_id NUMBER;
7291    l_estimation_id   NUMBER;
7292    --
7293    CURSOR EST_REC(b_estimation_id NUMBER) IS
7294    select name, estimation_type, fixed_value, usage_markup,
7295    default_value, estimation_avg_type
7296    from CSI_CTR_ESTIMATE_METHODS_VL
7297    where estimation_id = b_estimation_id;
7298    --
7299    l_est_rec est_rec%rowtype;
7300    --
7301    CURSOR REF_COUNTER(b_counter_group_id NUMBER,b_counter_id NUMBER) IS
7302    select counter_id
7303    from CSI_COUNTERS_B -- Need to change
7304    where group_id = b_counter_group_id
7305    and created_from_counter_tmpl_id =b_counter_id;
7306    --
7307    l_ref_counter_id NUMBER;
7308    --
7309    l_dummy VARCHAR2(1);
7310    l_estimation_period_start_date DATE;
7311    --
7312    -- cursor to fetch the captured reading of the period end date if exists.
7313    CURSOR EST_DT_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
7314    select b.net_reading "passed_dt_reading", b.value_timestamp "passed_rdg_date"
7315    from CSI_COUNTER_READINGS b
7316    where b.counter_id = b_counter_id
7317    and   nvl(b.disabled_flag,'N') = 'N'
7318    and   trunc(b.value_timestamp) = trunc(b_rdg_date)
7319    order by b.value_timestamp desc;
7320    --
7321    l_est_dt_reading   NUMBER;
7322    l_est_rdg_date     DATE;
7323 
7324    -- cursor to check whether any counter readings exist
7325    CURSOR CTR_RDGS_EXIST(b_counter_id NUMBER) IS
7326    select counter_value_id
7327    FROM CSI_COUNTER_READINGS
7328    WHERE counter_id = b_counter_id
7329    and   nvl(disabled_flag,'N') = 'N';
7330    --
7331    l_ctr_val_id NUMBER;
7332    l_debug_level       NUMBER;    -- 8214848 - dsingire
7333    l_user_id 				  NUMBER := fnd_global.user_id;        -- 8214848 - dsingire
7334    l_conc_login_id		NUMBER := fnd_global.conc_login_id;  -- 8214848 - dsingire
7335    l_date_format       VARCHAR2(50) := nvl(fnd_profile.value('ICX_DATE_FORMAT_MASK'),'DD-MON-YYYY HH24:MI:SS');
7336 BEGIN
7337    SAVEPOINT ESTIMATE_COUNTER_READING;
7338    -- Initialize message list if p_init_msg_list is set to TRUE.
7339    IF FND_API.to_Boolean( p_init_msg_list ) THEN
7340       FND_MSG_PUB.initialize;
7341    END IF;
7342    -- Initialize API return status to SUCCESS
7343    x_return_status := FND_API.G_RET_STS_SUCCESS;
7344    --
7345    -- Read the debug profiles values in to global variable 7197402
7346    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
7347 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
7348 	  END IF;                      -- 8214848 - dsingire
7349 
7350     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
7351 
7352   IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
7353     csi_ctr_gen_utility_pvt.put_line( 'Inside Estimate_Counter_Reading...');
7354   END IF;          -- 8214848 - dsingire
7355    --
7356    -- Standard call to check for call compatibility.
7357    IF NOT FND_API.Compatible_API_Call (l_api_version,
7358                                        p_api_version,
7359                                        l_api_name   ,
7360                                        G_PKG_NAME   ) THEN
7361       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7362    END IF;
7363    --
7364    IF p_counter_id IS NULL or p_estimation_period_end_date IS NULL THEN
7365       csi_ctr_gen_utility_pvt.ExitWithErrMsg
7366            ( p_msg_name    =>  'CSI_API_CTR_CTRID_PRD_ENDDT',
7367              p_token1_name =>  'P_COUNTER_ID',
7368              p_token1_val  =>  to_char(p_counter_id),
7369              p_token2_name =>  'P_ESTIMATION_PERIOD_END_DATE',
7370              p_token2_val  =>  to_char(p_estimation_period_end_date,l_date_format)
7371            );
7372    END IF;
7373    IF p_avg_calculation_start_date IS NOT NULL and p_number_of_readings IS NOT NULL THEN
7374       csi_ctr_gen_utility_pvt.ExitWithErrMsg
7375            ( p_msg_name    =>  'CSI_API_CTR_CAL_STDT_NUM_RDGS',
7376              p_token1_name =>  'P_AVG_CALCULATION_START_DATE',
7377              p_token1_val  =>  to_char(p_avg_calculation_start_date,l_date_format),
7378              p_token2_name =>  'P_NUMBER_OF_READINGS',
7379              p_token2_val  =>  to_char(p_number_of_readings)
7380            );
7381    END IF;
7382 
7383    IF NOT trunc(p_estimation_period_start_date) <= trunc(p_estimation_period_end_date) THEN
7384       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_INV_PRD_ST_END_DT');
7385    END IF;
7386 
7387    IF NOT trunc(p_avg_calculation_start_date) < trunc(p_estimation_period_start_date) THEN
7388       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_CAL_STDT_PRD_STDT');
7389    END IF;
7390 
7391    IF NOT trunc(p_avg_calculation_start_date) < trunc(p_estimation_period_end_date) THEN
7392       csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_CAL_STDT_PRD_ENDDT');
7393    END IF;
7394    --
7395    BEGIN
7396       select 'X' into l_dummy
7397       from CSI_COUNTERS_B
7398       where counter_id = p_Counter_id;
7399    EXCEPTION
7400        when no_data_found then
7401 	  csi_ctr_gen_utility_pvt.ExitWithErrMsg
7402 	     ( p_msg_name    =>  'CSI_API_CTR_INVALID',
7403 	       p_token1_name =>  'MODE',
7404 	       p_token1_val  =>  'Counter'
7405 	     );
7406    END;
7407    --
7408    OPEN CTREST_REC;
7409    FETCH CTREST_REC
7410    INTO l_counter_group_id,l_estimation_id;
7411    CLOSE CTREST_REC;
7412    --
7413    OPEN EST_REC(l_estimation_id);
7414    FETCH EST_REC INTO l_est_rec;
7415    CLOSE EST_REC;
7416    --
7417    IF p_estimation_period_start_date IS NOT NULL THEN
7418      l_estimation_period_start_date := p_estimation_period_start_date -1;
7419    END IF;
7420 
7421    IF l_est_rec.estimation_type in ('FIXED','USAGE') THEN
7422       -- if no counter reading exists then exit the estimation routine
7423       OPEN CTR_RDGS_EXIST(p_counter_id);
7424       FETCH CTR_RDGS_EXIST into l_ctr_val_id;
7425       CLOSE CTR_RDGS_EXIST;
7426       IF l_ctr_val_id IS NULL THEN
7427          csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NO_RDGS_EXIST');
7428       END IF;
7429    END IF;
7430 
7431    IF l_est_rec.estimation_type = 'FIXED' THEN
7432       /********************
7433        Compute Fixed Value Estimation
7434       ********************/
7435       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
7436         csi_ctr_gen_utility_pvt.put_line('Calling Estimate_fixed_values...');
7437       END IF;          -- 8214848 - dsingire
7438       --
7439       Estimate_fixed_values(
7440 	  P_api_version 		 => 1.0,
7441 	  P_Init_Msg_List 		 => P_Init_Msg_List,
7442 	  P_Commit 			 => P_Commit,
7443 	  p_validation_level 		 => p_validation_level,
7444 	  p_counter_id  		 => p_counter_id,
7445 	  p_fixed_value 		 => l_est_rec.fixed_value,
7446 	  p_default_value 		 => l_est_rec.default_value,
7447 	  p_estimation_period_start_date => l_estimation_period_start_date,
7448 	  p_estimation_period_end_date   => p_estimation_period_end_date,
7449 	  x_estimated_meter_reading    	 => x_estimated_meter_reading,
7450 	  x_estimated_usage_qty          => x_estimated_usage_qty,
7451 	  x_estimated_period_start_rdg   => x_estimated_period_start_rdg,
7452 	  X_Return_Status 		 => X_Return_Status,
7453 	  X_Msg_Count 		 	 => X_Msg_Count,
7454 	  X_Msg_Data 		 	 => X_Msg_Data
7455         );
7456       IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7457          csi_ctr_gen_utility_pvt.put_line('ERROR FROM Estimate_fixed_values API ');
7458          l_msg_index := 1;
7459          l_msg_count := x_msg_count;
7460          WHILE l_msg_count > 0 LOOP
7461             x_msg_data := FND_MSG_PUB.GET
7462             (  l_msg_index,
7463                FND_API.G_FALSE
7464             );
7465             csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
7466             l_msg_index := l_msg_index + 1;
7467             l_msg_count := l_msg_count - 1;
7468          END LOOP;
7469          RAISE FND_API.G_EXC_ERROR;
7470       END IF;
7471 
7472    ELSIF l_est_rec.estimation_type = 'USAGE' THEN
7473        /********************
7474 	Compute Usage of direct counter Estimation
7475 	*******************/
7476       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
7477         csi_ctr_gen_utility_pvt.put_line('Calling Estimate_Usage...');
7478       END IF;          -- 8214848 - dsingire
7479       Estimate_Usage(
7480 	   P_api_version                     => 1.0,
7481 	   P_Init_Msg_List                   => P_Init_Msg_List,
7482 	   P_Commit                          => P_Commit,
7483 	   p_validation_level                => p_validation_level,
7484 	   p_counter_id                      => p_counter_id,
7485 	   p_usage_markup		     => l_est_rec.usage_markup,
7486 	   p_default_value                   => l_est_rec.default_value,
7487 	   p_estimation_avg_type             => l_est_rec.estimation_avg_type,
7488 	   p_estimation_period_start_date    => l_estimation_period_start_date,
7489 	   p_estimation_period_end_date      => p_estimation_period_end_date,
7490 	   p_avg_calculation_start_date      => p_avg_calculation_start_date,
7491 	   p_number_of_readings              => p_number_of_readings,
7492 	   x_estimated_usage_qty             => x_estimated_usage_qty,
7493 	   x_estimated_meter_reading         => x_estimated_meter_reading,
7494 	   x_estimated_period_start_rdg      => x_estimated_period_start_rdg,
7495 	   X_Return_Status                   => X_Return_Status,
7496 	   X_Msg_Count                       => X_Msg_Count,
7497 	   X_Msg_Data                        => X_Msg_Data
7498        );
7499       IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7500 	 csi_ctr_gen_utility_pvt.put_line('ERROR FROM Estimate_Usage API ');
7501 	 l_msg_index := 1;
7502 	 l_msg_count := x_msg_count;
7503 	 WHILE l_msg_count > 0 LOOP
7504 	    x_msg_data := FND_MSG_PUB.GET
7505 	    (  l_msg_index,
7506 	       FND_API.G_FALSE
7507 	    );
7508 	    csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
7509 	    l_msg_index := l_msg_index + 1;
7510 	    l_msg_count := l_msg_count - 1;
7511 	 END LOOP;
7512 	 RAISE FND_API.G_EXC_ERROR;
7513       END IF;
7514    ELSIF l_est_rec.estimation_type = 'REFCTR' THEN
7515       /********************
7516        Compute Usage of indirect counter Estimation
7517        *******************/
7518 
7519       OPEN REF_COUNTER(l_counter_group_id,p_counter_id);
7520       FETCH REF_COUNTER INTO l_ref_counter_id;
7521       CLOSE REF_COUNTER;
7522       -- if no counter readings exist for the counter then exit.
7523       OPEN CTR_RDGS_EXIST(l_ref_counter_id);
7524       FETCH CTR_RDGS_EXIST into l_ctr_val_id;
7525       close CTR_RDGS_EXIST;
7526       --
7527       IF l_ctr_val_id IS NULL THEN
7528          csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NO_RDGS_EXIST');
7529       END IF;
7530 
7531       Estimate_Usage(
7532 	   P_api_version                     => 1.0,
7533 	   P_Init_Msg_List                   => P_Init_Msg_List,
7534 	   P_Commit                          => P_Commit,
7535 	   p_validation_level                => p_validation_level,
7536 	   p_counter_id                      => l_ref_counter_id,
7537 	   p_usage_markup                    => l_est_rec.usage_markup,
7538 	   p_default_value                   => l_est_rec.default_value,
7539 	   p_estimation_avg_type             => l_est_rec.estimation_avg_type,
7540 	   p_estimation_period_start_date    => l_estimation_period_start_date,
7541 	   p_estimation_period_end_date      => p_estimation_period_end_date,
7542 	   p_avg_calculation_start_date      => p_avg_calculation_start_date,
7543 	   p_number_of_readings              => p_number_of_readings,
7544 	   x_estimated_usage_qty             => x_estimated_usage_qty,
7545 	   x_estimated_meter_reading         => x_estimated_meter_reading,
7546 	   x_estimated_period_start_rdg      => x_estimated_period_start_rdg,
7547 	   X_Return_Status                   => X_Return_Status,
7548 	   X_Msg_Count                       => X_Msg_Count,
7549 	   X_Msg_Data                        => X_Msg_Data
7550          );
7551       IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7552 	 csi_ctr_gen_utility_pvt.put_line('ERROR FROM Estimate_Usage API ');
7553 	 l_msg_index := 1;
7554 	 l_msg_count := x_msg_count;
7555 	 WHILE l_msg_count > 0 LOOP
7556 	    x_msg_data := FND_MSG_PUB.GET
7557 	    (  l_msg_index,
7558 	       FND_API.G_FALSE
7559 	    );
7560 	    csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
7561 	    l_msg_index := l_msg_index + 1;
7562 	    l_msg_count := l_msg_count - 1;
7563 	 END LOOP;
7564 	 RAISE FND_API.G_EXC_ERROR;
7565       END IF;
7566    END IF;
7567    --
7568    -- Generate the Value_id for insert
7569    l_process_flag := TRUE;
7570    WHILE l_process_flag LOOP
7571       select CSI_CTR_ESTIMATED_READINGS_S.nextval
7572       into l_estimated_rdg_id from dual;
7573       IF NOT Estimated_Rdg_ID_Exists(l_estimated_rdg_id) THEN
7574 	 l_process_flag := FALSE;
7575       END IF;
7576    END LOOP;
7577    --
7578    CSI_CTR_ESTIMATED_READINGS_PKG.Insert_Row
7579 	(
7580 	  px_ESTIMATED_READING_ID      =>  l_estimated_rdg_id
7581 	 ,p_COUNTER_ID                 =>  p_counter_id
7582 	 ,p_ESTIMATION_ID              =>  l_estimation_id
7583 	 ,p_VALUE_TIMESTAMP            =>  SYSDATE
7584 	 ,p_ESTIMATED_METER_READING    =>  x_estimated_meter_reading
7585 	 ,p_NUM_OF_READINGS            =>  p_number_of_readings
7586 	 ,p_PERIOD_START_DATE          =>  p_estimation_period_start_date
7587 	 ,p_PERIOD_END_DATE            =>  p_estimation_period_end_date
7588 	 ,p_AVG_CALCULATION_START_DATE =>  p_avg_calculation_start_date
7589 	 ,p_ESTIMATED_USAGE            =>  x_estimated_usage_qty
7590 	 ,p_ATTRIBUTE1                 =>  NULL
7591 	 ,p_ATTRIBUTE2                 =>  NULL
7592 	 ,p_ATTRIBUTE3                 =>  NULL
7593 	 ,p_ATTRIBUTE4                 =>  NULL
7594 	 ,p_ATTRIBUTE5                 =>  NULL
7595 	 ,p_ATTRIBUTE6                 =>  NULL
7596 	 ,p_ATTRIBUTE7                 =>  NULL
7597 	 ,p_ATTRIBUTE8                 =>  NULL
7598 	 ,p_ATTRIBUTE9                 =>  NULL
7599 	 ,p_ATTRIBUTE10                =>  NULL
7600 	 ,p_ATTRIBUTE11                =>  NULL
7601 	 ,p_ATTRIBUTE12                =>  NULL
7602 	 ,p_ATTRIBUTE13                =>  NULL
7603 	 ,p_ATTRIBUTE14                =>  NULL
7604 	 ,p_ATTRIBUTE15                =>  NULL
7605 	 ,p_ATTRIBUTE_CATEGORY         =>  NULL
7606 	 ,p_LAST_UPDATE_DATE           =>  SYSDATE
7607 	 ,p_LAST_UPDATED_BY            =>  l_user_id
7608 	 ,p_LAST_UPDATE_LOGIN          =>  l_conc_login_id
7609 	 ,p_CREATION_DATE              =>  SYSDATE
7610 	 ,p_CREATED_BY                 =>  l_user_id
7611 	 ,p_OBJECT_VERSION_NUMBER      =>  1
7612 	 ,p_MIGRATED_FLAG              =>  'N'
7613    );
7614    --
7615    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
7616       COMMIT WORK;
7617    END IF;
7618    --
7619    -- Standard call to get message count and IF count is  get message info.
7620    FND_MSG_PUB.Count_And_Get
7621       ( p_count  =>  x_msg_count,
7622         p_data   =>  x_msg_data
7623       );
7624 
7625 EXCEPTION
7626    WHEN FND_API.G_EXC_ERROR THEN
7627       ROLLBACK TO ESTIMATE_COUNTER_READING;
7628       x_return_status := FND_API.G_RET_STS_ERROR ;
7629       FND_MSG_PUB.Count_And_Get
7630       (p_count => x_msg_count,
7631        p_data => x_msg_data
7632       );
7633    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7634       ROLLBACK TO ESTIMATE_COUNTER_READING;
7635       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7636       FND_MSG_PUB.Count_And_Get
7637       (
7638        p_count => x_msg_count,
7639        p_data => x_msg_data
7640            );
7641    WHEN OTHERS THEN
7642       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7643       ROLLBACK TO ESTIMATE_COUNTER_READING;
7644       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7645          FND_MSG_PUB.Add_Exc_Msg
7646             ( G_PKG_NAME,
7647               l_api_name
7648             );
7649       END IF;
7650       FND_MSG_PUB.Count_And_Get
7651          ( p_count  => x_msg_count,
7652            p_data   => x_msg_data
7653          );
7654 END ESTIMATE_COUNTER_READING;
7655 --
7656 PROCEDURE ESTIMATE_FIXED_VALUES(
7657     P_api_version                IN   NUMBER,
7658     P_Init_Msg_List              IN   VARCHAR2,
7659     P_Commit                     IN   VARCHAR2,
7660     p_validation_level           IN   NUMBER,
7661     p_counter_id                 IN   NUMBER,
7662     p_fixed_value                IN   NUMBER,
7663     p_default_value              IN   NUMBER,
7664     p_estimation_period_start_date   IN   DATE,
7665     p_estimation_period_end_date     IN   DATE,
7666     x_estimated_meter_reading    OUT  NOCOPY NUMBER,
7667     x_estimated_usage_qty        OUT  NOCOPY NUMBER,
7668     x_estimated_period_start_rdg OUT  NOCOPY NUMBER,
7669     X_Return_Status              OUT  NOCOPY VARCHAR2,
7670     X_Msg_Count                  OUT  NOCOPY NUMBER,
7671     X_Msg_Data                   OUT  NOCOPY VARCHAR2
7672   )
7673 IS
7674    l_api_name              CONSTANT VARCHAR2(30)   := 'ESTIMATE_FIXED_VALUES';
7675    l_api_version           CONSTANT NUMBER         := 1.0;
7676    l_msg_data                       VARCHAR2(2000);
7677    l_msg_index                      NUMBER;
7678    l_msg_count                      NUMBER;
7679    --
7680    CURSOR PRIOR_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
7681    select b.net_reading "prev_reading",b.value_timestamp "prev_rdg_date"
7682    from CSI_COUNTER_READINGS b
7683    where b.counter_id = b_counter_id
7684    and   b.value_timestamp < b_rdg_date
7685    and   nvl(b.disabled_flag,'N') = 'N'
7686    order by b.value_timestamp desc;
7687    --
7688    CURSOR PASSED_DT_RDG_VALUES(b_counter_id NUMBER, b_rdg_date DATE) IS
7689    select b.net_reading "passed_dt_reading", b.value_timestamp "passed_rdg_date"
7690    from CSI_COUNTER_READINGS b
7691    where b.counter_id = b_counter_id
7692    and   nvl(b.disabled_flag,'N') = 'N'
7693    and   trunc(b.value_timestamp) = trunc(b_rdg_date)
7694    order by b.value_timestamp desc;
7695    --
7696    l_passed_dt_reading                 NUMBER;
7697    l_passed_rdg_date                   DATE;
7698    l_adjustment_usage_amount           NUMBER;
7699    l_estimated_meter_reading           NUMBER;
7700    l_creation_date                     DATE;
7701    l_period_days                       NUMBER;
7702    l_default_value                     NUMBER;
7703    l_captured_date                     DATE;
7704    l_period_start_date_reading         NUMBER;
7705    l_prev_reading                      NUMBER;
7706    l_prev_value_timestamp              DATE;
7707    l_fixed_value                       NUMBER;
7708    l_period_start_reading              NUMBER;
7709    l_estimated_usage                   NUMBER;
7710    l_debug_level       NUMBER;    -- 8214848 - dsingire
7711 BEGIN
7712    SAVEPOINT ESTIMATE_FIXED_VALUES;
7713    -- Initialize message list if p_init_msg_list is set to TRUE.
7714    IF FND_API.to_Boolean( p_init_msg_list ) THEN
7715       FND_MSG_PUB.initialize;
7716    END IF;
7717    -- Initialize API return status to SUCCESS
7718    x_return_status := FND_API.G_RET_STS_SUCCESS;
7719    --
7720    IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
7721     csi_ctr_gen_utility_pvt.put_line( 'Inside Estimate_Fixed_Values...');
7722    END IF;          -- 8214848 - dsingire
7723    --
7724 
7725    -- Read the debug profiles values in to global variable 7197402
7726    IF (CSI_CTR_GEN_UTILITY_PVT.g_debug_level is null) THEN  -- 8214848 - dsingire
7727 	    CSI_CTR_GEN_UTILITY_PVT.read_debug_profiles;
7728 	  END IF;                      -- 8214848 - dsingire
7729 
7730     l_debug_level :=  CSI_CTR_GEN_UTILITY_PVT.g_debug_level; -- 8214848 - dsingire
7731 
7732    -- Standard call to check for call compatibility.
7733    IF NOT FND_API.Compatible_API_Call (l_api_version,
7734                                        p_api_version,
7735                                        l_api_name   ,
7736                                        G_PKG_NAME   ) THEN
7737       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7738    END IF;
7739    --
7740    IF p_estimation_period_start_date IS NOT NULL THEN
7741       IF (l_debug_level > 0) THEN                           -- 8214848 - dsingire
7742         csi_ctr_gen_utility_pvt.put_line('Calling Est_Period_Start_Readings...');
7743       END IF;          -- 8214848 - dsingire
7744       EST_PERIOD_START_READINGS(
7745 	   P_api_version                     => 1.0,
7746 	   P_Init_Msg_List                   => P_Init_Msg_List,
7747 	   P_Commit                          => P_Commit,
7748 	   p_validation_level                => p_validation_level,
7749 	   p_counter_id                      => p_counter_id,
7750 	   p_default_value                   => p_default_value,
7751 	   p_avg_calculation_start_date      => null,
7752 	   p_calculation_start_date          => p_estimation_period_start_date,
7753 	   x_calc_start_reading              => l_period_start_reading,
7754 	   X_Return_Status                   => X_Return_Status,
7755 	   X_Msg_Count                       => X_Msg_Count,
7756 	   X_Msg_Data                        => X_Msg_Data
7757          );
7758       IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7759 	 csi_ctr_gen_utility_pvt.put_line('ERROR FROM Est_Period_Start_Readings API ');
7760 	 l_msg_index := 1;
7761 	 l_msg_count := x_msg_count;
7762 	 WHILE l_msg_count > 0 LOOP
7763 	    x_msg_data := FND_MSG_PUB.GET
7764 	    (  l_msg_index,
7765 	       FND_API.G_FALSE
7766 	    );
7767 	    csi_ctr_gen_utility_pvt.put_line('MESSAGE DATA = '||x_msg_data);
7768 	    l_msg_index := l_msg_index + 1;
7769 	    l_msg_count := l_msg_count - 1;
7770 	 END LOOP;
7771 	 RAISE FND_API.G_EXC_ERROR;
7772       END IF;
7773    END IF;
7774    -- fetch the reading of the passed estimation period end date
7775    OPEN PASSED_DT_RDG_VALUES(p_counter_id, p_estimation_period_end_date);
7776    FETCH PASSED_DT_RDG_VALUES
7777    INTO l_estimated_meter_reading,l_passed_rdg_date;
7778    CLOSE PASSED_DT_RDG_VALUES;
7779    -- if no actual reading on passed estimation period end dt then compute the reading.
7780    IF l_estimated_meter_reading is NULL THEN
7781       open prior_rdg_values(p_counter_id, p_estimation_period_end_date);
7782       fetch prior_rdg_values into l_prev_reading,l_prev_value_timestamp;
7783       close prior_rdg_values;
7784       --
7785       IF l_prev_reading IS NULL THEN
7786 	 -- raise error message - no readings to calculate
7787          csi_ctr_gen_utility_pvt.ExitWithErrMsg('CSI_API_CTR_NO_RDG_PR_PRD_ENDT');
7788       ELSE  --  l_prev_reading IS not null
7789 	 l_period_days := trunc(p_estimation_period_end_date) - trunc(l_prev_value_timestamp) ;
7790 	 l_estimated_meter_reading:=(l_prev_reading +(P_fixed_value*l_period_days)) ;
7791       END IF;
7792    END IF;
7793    --
7794    x_estimated_meter_reading := l_estimated_meter_reading;
7795    IF p_estimation_period_start_date IS NOT NULL THEN
7796       l_estimated_usage := l_estimated_meter_reading - l_period_start_reading;
7797    END If;
7798    --
7799    X_estimated_usage_qty := l_estimated_usage;
7800    x_estimated_period_start_rdg := l_period_start_reading;
7801    --
7802    IF FND_API.to_Boolean(nvl(p_commit,FND_API.G_FALSE)) THEN
7803       COMMIT WORK;
7804    END IF;
7805    --
7806    -- Standard call to get message count and IF count is  get message info.
7807    FND_MSG_PUB.Count_And_Get
7808       ( p_count  =>  x_msg_count,
7809         p_data   =>  x_msg_data
7810       );
7811 
7812 EXCEPTION
7813    WHEN FND_API.G_EXC_ERROR THEN
7814       ROLLBACK TO ESTIMATE_FIXED_VALUES;
7815       x_return_status := FND_API.G_RET_STS_ERROR ;
7816       FND_MSG_PUB.Count_And_Get
7817       (p_count => x_msg_count,
7818        p_data => x_msg_data
7819       );
7820    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7821       ROLLBACK TO ESTIMATE_FIXED_VALUES;
7822       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7823       FND_MSG_PUB.Count_And_Get
7824       (
7825        p_count => x_msg_count,
7826        p_data => x_msg_data
7827            );
7828    WHEN OTHERS THEN
7829       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
7830       ROLLBACK TO ESTIMATE_FIXED_VALUES;
7831       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7832          FND_MSG_PUB.Add_Exc_Msg
7833             ( G_PKG_NAME,
7834               l_api_name
7835             );
7836       END IF;
7837       FND_MSG_PUB.Count_And_Get
7838          ( p_count  => x_msg_count,
7839            p_data   => x_msg_data
7840          );
7841 END ESTIMATE_FIXED_VALUES;
7842 --
7843 END CSI_COUNTER_READINGS_PVT;