[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;