DBA Data[Home] [Help]

PACKAGE BODY: APPS.EAM_METER_READINGS_JSP

Source


1 package body EAM_METER_READINGS_JSP AS
2 /* $Header: EAMMRRJB.pls 115.8 2002/11/19 23:53:49 aan ship $ */
3 G_PKG_NAME              CONSTANT VARCHAR2(30) := 'EAM_METER_READINGS_JSP';
4 
5 -------------------------------------------------------------------------------
6 -- check if work order has mandatory meter reading
7   FUNCTION has_mandatory_meter_reading( p_wip_entity_id in number) RETURN VARCHAR2
8   IS
9     -- return if job has mandatory meter reading, wrapper function
10     ret BOOLEAN;
11   BEGIN
12     ret := eam_meters_util.has_mandatory_meter_reading(p_wip_entity_id);
13     IF ret THEN
14       return 'Y';
15     ELSE
16       return 'N';
17     END IF;
18   END has_mandatory_meter_reading;
19 
20 -------------------------------------------------------------------------------
21 -- check if meter is mandatory
22   FUNCTION is_meter_reading_mandatory( p_wip_entity_id in number, p_meter_id in number) RETURN VARCHAR2
23   IS
24     -- return if job has mandatory meter reading, wrapper function
25     ret BOOLEAN;
26   BEGIN
27     ret := eam_meters_util.is_meter_reading_mandatory(p_wip_entity_id, p_meter_id);
28     IF ret THEN
29       return 'Y';
30     ELSE
31       return 'N';
32     END IF;
33   END is_meter_reading_mandatory;
34 
35 -------------------------------------------------------------------------------
36 -- get the last reading's meter reading id of a meter
37   FUNCTION get_latest_meter_reading_id( p_meter_id in number) RETURN NUMBER
38   IS
39     -- return if job has mandatory meter reading, wrapper function
40     l_meter_reading_id NUMBER;
41     l_last_reading_date date;
42   BEGIN
43 
44     l_meter_reading_id := null;
45 
46     -- fix for bug 2112310. Adding following two select statements for better performance
47     select max(mr4.current_reading_date) into l_last_reading_date
48     from  eam_meter_readings mr4
49     where mr4.meter_id = p_meter_id;
50 
51     select max(meter_reading_id) as meter_reading_id into l_meter_reading_id
52     from eam_meter_readings
53     where meter_id = p_meter_id and
54     current_reading_date = l_last_reading_date;
55 
56     /* COMMENTING DUE TO BUG 2112310
57     -- first get the greatest reading date
58     SELECT max(mr5.meter_reading_id) as meter_reading_id
59     into l_meter_reading_id
60     FROM
61       eam_meter_readings mr5,
62       (select max(mr4.current_reading_date) as last_reading_date
63         from  eam_meter_readings mr4
64         where mr4.meter_id = p_meter_id
65         group by mr4.meter_id
66       ) mr3
67     WHERE mr5.meter_id = p_meter_id
68       and mr5.current_reading_date = mr3.last_reading_date
69     GROUP BY mr5.meter_id;
70        END COMMENTING DUE TO BUG 2112310
71     */
72 
73     return l_meter_reading_id;
74   END get_latest_meter_reading_id;
75 
76 
77 -------------------------------------------------------------------------
78 --- insert a meter reading row into eam_meter_readings table
79 -------------------------------------------------------------------------
80   procedure insert_row
81   (
82      p_meter_id               IN NUMBER
83     ,p_current_reading        IN NUMBER
84     ,p_current_reading_date   IN DATE
85     ,p_reset_flag             IN VARCHAR2
86     ,p_life_to_date_reading   IN NUMBER
87     ,p_wip_entity_id          IN NUMBER
88     ,p_description            IN VARCHAR2
89   ) IS
90 
91   l_reading_id NUMBER;
92 
93   BEGIN
94 
95     select eam_meter_readings_s.nextval
96     into l_reading_id
97     from dual;
98 
99     insert into eam_meter_readings
100     (
101       meter_reading_id,
102       meter_id,
103       current_reading,
104       current_reading_date,
105       reset_flag,
106       life_to_date_reading,
107       wip_entity_id,
108       description,
109       creation_date,
110       created_by,
111       last_update_date,
112       last_updated_by
113     ) values
114     (
115       l_reading_id,
116       p_meter_id,
117       p_current_reading,
118       p_current_reading_date,
119       p_reset_flag,
120       p_life_to_date_reading,
121       p_wip_entity_id,
122       p_description,
123       sysdate,
124       g_created_by,
125       sysdate,
126       g_last_updated_by
127     );
128 --  EXCEPTION WHEN OTHERS THEN
129 
130   END insert_row;
131 
132 -------------------------------------------------------------------------
133 -- caculate current reading and current life to date reading
134 -------------------------------------------------------------------------
135   procedure get_current_reading_data
136   (
137      p_reading                     IN    NUMBER
138     ,p_reading_change              IN    NUMBER
139     ,p_reset_flag                  IN    VARCHAR2
140     ,p_meter_direction             IN    NUMBER
141     ,p_before_reading              IN    NUMBER
142     ,p_before_ltd_reading          IN    NUMBER
143     ,p_after_reading               IN    NUMBER
144     ,p_after_ltd_reading           IN    NUMBER
145     ,p_reading_date                IN    DATE
146     ,p_meter_name                  IN    VARCHAR2
147     ,x_current_reading             OUT NOCOPY   NUMBER
148     ,x_current_ltd_reading         OUT NOCOPY   NUMBER
149     ,p_mtr_warning_shown           IN OUT NOCOPY VARCHAR2
150 --    ,x_return_status               OUT   VARCHAR2
151 --    ,x_msg_count                   OUT   NUMBER
152 --    ,x_msg_data                    OUT   VARCHAR2
153   ) IS
154 
155   l_current_reading      NUMBER;
156   l_current_ltd_reading  NUMBER;
157   l_change               NUMBER;
158   l_ltd_change_before    NUMBER; -- the amount to the next reading
159   l_ltd_change_after     NUMBER; -- the amount to the next reading
160   l_return_status        VARCHAR2(250);
161   l_range_from           VARCHAR2(250);
162   l_range_to             VARCHAR2(250);
163   l_range_tmp            VARCHAR2(250);
164 
165   BEGIN
166     l_current_reading := null;
167     l_current_ltd_reading := null;
168 
169     l_return_status := FND_API.G_RET_STS_SUCCESS;
170 
171     -- get current reading and life to date reading
172     if(nvl(p_reset_flag, 'N') = 'Y') then
173     -- reset
174       if( p_reading is null or p_reading_change is not null) then
175         -- reset only need reading field
176         eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_RESET_FIELDS'
177           ,p_token1 => 'METER_NAME', p_value1 => p_meter_name);
178         l_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
179         -- can reset to anything
180 /*      elsif( (nvl(p_meter_direction, 0) < 1 or nvl(p_meter_direction, 0) > 2) ) then
181            -- or
182            --  (nvl(p_meter_direction, 0) = 1 and p_reading > nvl(p_before_reading, 0)) or
183            --  (nvl(p_meter_direction, 0) = 2 and p_reading < nvl(p_before_reading, 0)) ) then
184         -- why bother?
185         eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_WRR_RESET_WHY');
186         l_return_status := FND_API.G_RET_STS_UNEXP_ERROR; */
187       else
188         -- done!
189         l_current_reading := p_reading;
190         l_current_ltd_reading := p_before_ltd_reading; -- don't reset ltd
191       end if;
192     else
193     -- not reset
194       if (p_reading is not null) then
195         l_current_reading := p_reading;
196         l_current_ltd_reading := p_reading - nvl(p_before_reading, 0) + nvl(p_before_ltd_reading, 0);
197       else
198         l_current_reading := nvl(p_before_reading, 0) + p_reading_change;
199         l_current_ltd_reading := nvl(p_before_ltd_reading, 0) + p_reading_change;
200       end if;
201       -- if both not null , and not reset , check for confliction
202       if(p_reading is not null and p_reading_change is not null and
203         p_reading - nvl(p_before_reading, 0) <> p_reading_change) then
204         eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_DATA_CONFLICT'
205           ,p_token1 => 'METER_NAME', p_value1 => p_meter_name);
206         l_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
207       end if;
208 
209       -- no problem?
210       if( l_return_status = FND_API.G_RET_STS_SUCCESS) then
211       -- check ltd changes?
212         l_change := l_current_ltd_reading - nvl(p_before_ltd_reading, 0);
213         l_ltd_change_before := 0;
214         if( p_before_ltd_reading is not null) then
215               l_ltd_change_before := l_current_ltd_reading - p_before_ltd_reading;
216         end if;
217         l_ltd_change_after := 0;
218         if(p_after_ltd_reading is not null) then
219           l_ltd_change_after := p_after_ltd_reading - l_current_ltd_reading;
220         end if;
221 
222         if(  (nvl(p_meter_direction, 0)=1 and (l_ltd_change_before<0 or l_ltd_change_after<0))
223           or (nvl(p_meter_direction, 0)=2 and (nvl(l_ltd_change_before, -1)>0 or l_ltd_change_after>0)) ) then
224           -- not correct
225           if( p_reading is not null) then -- inform reading range
226             l_range_from := '';
227             l_range_to := '';
228             if( p_before_ltd_reading is not null) then
229               l_range_from := l_current_reading - l_ltd_change_before;
230             end if;
231             if( p_after_ltd_reading is not null) then
232               l_range_to := l_current_reading + l_ltd_change_after;
233             end if;
234             -- swap if is descending direction
235             if( nvl(p_meter_direction, 0) = 2 ) then
236               l_range_tmp := l_range_from;
237               l_range_from := l_range_to;
238               l_range_to := l_range_tmp;
239             end if;
240             --baroy
241             --If the warning has already been shown, then don't show again
242             if(p_mtr_warning_shown <> 'Y') then
243               eam_execution_jsp.add_message(
244                  p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_READING_RANGE'
245                 ,p_token1 => 'FROM', p_value1 => l_range_from
246                 ,p_token2 => 'TO', p_value2 => l_range_to
247                 ,p_token3 => 'METER_NAME', p_value3 => p_meter_name
248               );
249               p_mtr_warning_shown := 'Y';
250             end if;
251             --baroy
252           else -- inform the change range
253             l_range_from := '0';
254             l_range_to := '';
255             if( p_after_ltd_reading is not null) then
256               --l_range_to := l_ltd_change_before + l_ltd_change_after;
257               l_range_to := p_after_ltd_reading - p_before_ltd_reading;
258             end if;
259             -- swap if is descending direction
260             if( nvl(p_meter_direction, 0) = 2 ) then
261               l_range_tmp := l_range_from;
262               l_range_from := l_range_to;
263               l_range_to := l_range_tmp;
264             end if;
265             eam_execution_jsp.add_message(
266                p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_CHANGE_RANGE'
267               ,p_token1 => 'FROM', p_value1 => l_range_from
268               ,p_token2 => 'TO', p_value2 => l_range_to
269               ,p_token3 => 'METER_NAME', p_value3 => p_meter_name
270             );
271           end if;
272           l_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
273         end if;
274 
275       end if;
276     end if;
277 
278     x_current_reading := l_current_reading;
279     x_current_ltd_reading := l_current_ltd_reading;
280   END get_current_reading_data;
281 
282 -------------------------------------------------------------------------
283 -- check asset and meter associating
284 -------------------------------------------------------------------------
285   procedure check_asset_meter_association
286   (
287     p_meter_id                    IN    NUMBER
288    ,p_wip_entity_id               IN    NUMBER
289    ,p_org_id                      IN    NUMBER        := NULL
290    ,p_asset_number                IN    VARCHAR2      := NULL
291    ,p_asset_group_id              IN    NUMBER        := NULL
292    ,x_return_status               OUT NOCOPY   VARCHAR2
293    ,x_msg_count                   OUT NOCOPY   NUMBER
294    ,x_msg_data                    OUT NOCOPY   VARCHAR2
295   ) IS
296 
297   l_org_id               NUMBER;
298   l_asset_number         VARCHAR2(250);
299   l_asset_group_id       NUMBER;
300 
301   BEGIN
302     eam_debug.init_err_stack('eam_execution_jsp.add_meter_reading');
303 
304     -- not standalone? (can standalone have a wip_entity_id??)
305     if (p_wip_entity_id is not null) then
306       -- get the info for validation, probablly not useful
307       select organization_id, asset_number, asset_group_id
308       into l_org_id, l_asset_number, l_asset_group_id
309       from wip_discrete_jobs
310       where wip_entity_id = p_wip_entity_id;
311 
312       if( SQL%NOTFOUND) then -- wip_entity_id not found, should not happen.
313         eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_WO_NOT_FOUND');
314         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
315       elsif (l_org_id is null or l_asset_number is null or l_asset_group_id is null) then
316         eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_WO_DATA_NULL');
317         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
318       elsif ( nvl(p_org_id, l_org_id) <> l_org_id or
319               nvl(p_asset_number, l_asset_number)<> l_asset_number or
320               nvl(p_asset_group_id, l_asset_group_id) <> l_asset_group_id ) then
321         eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_WO_DATA_NULL');
322         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
323       end if;
324       null;
325     elsif (p_org_id is null or p_asset_number is null or p_asset_group_id is null) then
326         eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_WO_MRR_DATA_MISS');
327         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
328     end if;
329 
330   EXCEPTION WHEN OTHERS THEN
331     FND_MSG_PUB.add_exc_msg( p_pkg_name => 'EAM_EXECUTION_JSP.CHECK_ASSET_METER_ASSOCIATION',
332     p_procedure_name => EAM_DEBUG.G_err_stack);
333     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
334   END check_asset_meter_association;
335 
336 --------------------------------------------------------------------------------------
337 -- get the reading that is just before/after the current reading date
338 -- we need to know the previous reading data and next reading data to do validation
339 --------------------------------------------------------------------------------------
340   procedure get_adjacent_reading
341   (
342      p_before                      IN    VARCHAR2     := FND_API.G_TRUE
343     ,p_meter_id                    IN    NUMBER
344     ,p_reading_date                IN    DATE
345     ,x_reading_id                  OUT NOCOPY   NUMBER
346     ,x_reading_date                OUT NOCOPY   DATE
347     ,x_reading                     OUT NOCOPY   NUMBER
348     ,x_ltd_reading                 OUT NOCOPY   NUMBER
349   ) IS
350 
351   l_reading_date   DATE;
352   l_reading        NUMBER;
353   l_ltd_reading    NUMBER;
354   l_reading_id     NUMBER;
355 
356   BEGIN
357 
358     l_reading_date := null; -- probablly not necessory
359     l_reading_id  := null;
360     l_reading     := null;
361     l_ltd_reading := null;
362 
363     if( FND_API.TO_BOOLEAN(p_before)) then
364         select max(current_reading_date)
365         into l_reading_date
366         from eam_meter_readings
367         where meter_id = p_meter_id and
368               current_reading_date <= p_reading_date  -- use <= here
369         group by meter_id;
370     else
371         select min(current_reading_date)
372         into l_reading_date
373         from eam_meter_readings
374         where meter_id = p_meter_id and
375               current_reading_date > p_reading_date -- interesting, use >
376         group by meter_id;
377     end if;
381       select max(meter_reading_id)
378 
379     if(l_reading_date is not null) then
380       -- should always success, just in case that two reading have the same date
382       into l_reading_id
383       from eam_meter_readings
384       where meter_id = p_meter_id and current_reading_date = l_reading_date
385       group by meter_id;
386 
387       select life_to_date_reading, current_reading
388       into l_ltd_reading, l_reading
389       from eam_meter_readings
390       where meter_reading_id = l_reading_id;
391     end if;
392 
393     x_reading_id   := l_reading_id;
394     x_reading_date := l_reading_date;
395     x_reading      := l_reading;
396     x_ltd_reading  := l_ltd_reading;
397 
398   EXCEPTION WHEN OTHERS THEN
399     x_reading_id   := l_reading_id;
400     x_reading_date := l_reading_date;
401     x_reading      := l_reading;
402     x_ltd_reading  := l_ltd_reading;
403 
404   END get_adjacent_reading;
405 
406 ------------------------------------------------------------------------------------
407 -- record a meter reading data
408 ------------------------------------------------------------------------------------
409   procedure add_meter_reading
410   (  p_api_version                 IN    NUMBER        := 1.0
411     ,p_init_msg_list               IN    VARCHAR2      := FND_API.G_FALSE
412     ,p_commit                      IN    VARCHAR2      := FND_API.G_FALSE
413     ,p_validate_only               IN    VARCHAR2      := FND_API.G_TRUE
414     ,p_record_version_number       IN    NUMBER        := NULL
415     ,x_return_status               OUT NOCOPY   VARCHAR2
416     ,x_msg_count                   OUT NOCOPY   NUMBER
417     ,x_msg_data                    OUT NOCOPY   VARCHAR2
418     ,p_wip_entity_id               IN    NUMBER        -- data
419     ,p_meter_id                    IN    NUMBER
420     ,p_reading_date                IN    DATE
421     ,p_reading                     IN    NUMBER
422     ,p_reading_change              IN    NUMBER
423     ,p_reset_flag                  IN    VARCHAR2
424     ,p_mtr_warning_shown           IN OUT NOCOPY  VARCHAR2
425   ) IS
426 
427   l_api_name           CONSTANT VARCHAR(30) := 'Complete_Workorder';
428   l_api_version        CONSTANT NUMBER      := 1.0;
429   l_return_status            VARCHAR2(250);
430   l_error_msg_code           VARCHAR2(250);
431   l_msg_count                NUMBER;
432   l_msg_data                 VARCHAR2(250);
433   l_err_code                 VARCHAR2(250);
434   l_err_stage                VARCHAR2(250);
435   l_err_stack                VARCHAR2(250);
436   l_data                     VARCHAR2(250);
437   l_msg_index_out            NUMBER;
438 
439   l_meter_name           VARCHAR2(250);
440   l_meter_direction      NUMBER;
441   l_effective_date_from  DATE;
442   l_effective_date_to    DATE;
443   l_reading_date    DATE;   -- the most recent reading date till now
444   l_reading         NUMBER;
445   l_ltd_reading     NUMBER;
446 
447   -- backdate reading validation
448   l_before_reading_id     NUMBER; -- meter reading id
449   l_before_reading_date   DATE;   -- the last reading just before (<=) the p_reading_date
450   l_before_reading        NUMBER;
451   l_before_ltd_reading    NUMBER;
452   l_after_reading_id      NUMBER; -- the next reading just after (>) the p_reading_date
453   l_after_reading_date    DATE;
454   l_after_reading         NUMBER;
455   l_after_ltd_reading     NUMBER;
456 
457   BEGIN
458 
459     IF p_commit = FND_API.G_TRUE THEN
460        SAVEPOINT add_meter_reaing;
461     END IF;
462 
463     eam_debug.init_err_stack('eam_execution_jsp.add_meter_reading');
464 
465     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
466                                        p_api_version,
467                                        l_api_name,
468                                        g_pkg_name)
469     THEN
470        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
471     END IF;
472 
473     IF FND_API.TO_BOOLEAN(p_init_msg_list)
474     THEN
475        FND_MSG_PUB.initialize;
476     END IF;
477 
478     x_return_status := FND_API.G_RET_STS_SUCCESS;
479 
480     -- validation logic goes here (mostly)
481 
482     BEGIN
483       -- get the meter info ...
484       select meter_name, value_change_dir, from_effective_date, to_effective_date
485       into l_meter_name, l_meter_direction, l_effective_date_from, l_effective_date_to
486       from eam_meters
487       where meter_id = p_meter_id;
488 
489     EXCEPTION WHEN OTHERS THEN
490       eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_NOT_FOUND'
491           ,p_token1 => 'METER_ID', p_value1 => l_meter_name);
492       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
493     END;
494 
495     -- value check
496     if(p_reading is null and p_reading_change is null) then
497       eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_FIELD_REQUIRED'
498           ,p_token1 => 'METER_NAME', p_value1 => l_meter_name);
499       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
500     end if;
501 
502     IF(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
503 
504       if (p_reading_date is null) then
505         -- no reading date
506         eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_DATE_NULL'
507           ,p_token1 => 'METER_NAME', p_value1 => l_meter_name);
511         eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_DATE_BEYOND'
508         x_return_status := FND_API.G_RET_STS_ERROR;
509       elsif (p_reading_date > sysdate) then
510         -- futhure reading
512           ,p_token1 => 'METER_NAME', p_value1 => l_meter_name);
513         x_return_status := FND_API.G_RET_STS_ERROR;
514       elsif ( p_reading_date < nvl(l_effective_date_from, p_reading_date -1)
515           or p_reading_date > nvl(l_effective_date_to, sysdate) ) then
516         -- not in the meter's effective date range
517         eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_EXPIRED'
518           ,p_token1 => 'METER_NAME', p_value1 => l_meter_name);
519         x_return_status := FND_API.G_RET_STS_ERROR;
520       else -- check reading
521 
522         get_adjacent_reading(
523             p_before       => FND_API.G_TRUE,
524             p_meter_id     => p_meter_id,
525             p_reading_date => p_reading_date,
526             x_reading_id   => l_before_reading_id,
527             x_reading_date => l_before_reading_date,
528             x_reading      => l_before_reading,
529             x_ltd_reading  => l_before_ltd_reading);
530 
531         get_adjacent_reading(
532             p_before       => FND_API.G_FALSE,
533             p_meter_id     => p_meter_id,
534             p_reading_date => p_reading_date,
535             x_reading_id   => l_after_reading_id,
536             x_reading_date => l_after_reading_date,
537             x_reading      => l_after_reading,
538             x_ltd_reading  => l_after_ltd_reading);
539 
540         if( l_before_reading_date = p_reading_date ) then
541           -- reading at this time already exists
542           eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_DATE_EXIST'
543             ,p_token1 => 'METER_NAME', p_value1 => l_meter_name);
544           x_return_status := FND_API.G_RET_STS_ERROR;
545         else
546           eam_meter_readings_jsp.get_current_reading_data(
547             p_reading             => p_reading,
548             p_reading_change      => p_reading_change,
549             p_reset_flag          => p_reset_flag,
550             p_meter_direction     => l_meter_direction,
551             p_before_reading      => l_before_reading,
552             p_before_ltd_reading  => l_before_ltd_reading,
553             p_after_reading       => l_after_reading,
554             p_after_ltd_reading   => l_after_ltd_reading,
555             p_reading_date        => p_reading_date,
556             p_meter_name          => l_meter_name,
557             x_current_reading     => l_reading,
558             x_current_ltd_reading => l_ltd_reading,
559             p_mtr_warning_shown   => p_mtr_warning_shown);
560         end if;
561       end if;
562     END IF; -- if(x_return_status = fnd_api.g_ret_success)
563 
564     -- if validate not passed then raise error
565     l_msg_count := FND_MSG_PUB.count_msg;
566     IF l_msg_count = 1 THEN
567        eam_execution_jsp.Get_Messages
568          (p_encoded  => FND_API.G_FALSE,
569           p_msg_index => 1,
570           p_msg_count => l_msg_count,
571           p_msg_data  => nvl(l_msg_data,FND_API.g_MISS_CHAR),
572           p_data      => l_data,
573           p_msg_index_out => l_msg_index_out);
574           x_msg_count := l_msg_count;
575           x_msg_data  := l_msg_data;
576     ELSE
577        x_msg_count  := l_msg_count;
578     END IF;
579 
580     IF l_msg_count > 0 THEN
581        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
582        RAISE  FND_API.G_EXC_ERROR;
583     END IF;
584 
585     -- otherwise, ready to make the changes
586     -- Fields: p_meter_id, l_reading, l_ltd_reading, p_reset_flag, l_reading_date,
587     --         p_wip_entity_id
588 
589     insert_row(
590        p_meter_id => p_meter_id
591       ,p_current_reading => l_reading
592       ,p_current_reading_date => p_reading_date
593       ,p_reset_flag => p_reset_flag
594       ,p_life_to_date_reading => l_ltd_reading
595       ,p_wip_entity_id => p_wip_entity_id
596       ,p_description => null
597      );
598 
599     IF FND_API.TO_BOOLEAN(P_COMMIT) THEN
600       COMMIT WORK;
601     END IF;
602 
603   EXCEPTION WHEN FND_API.G_EXC_UNEXPECTED_ERROR  THEN
604     IF p_commit = FND_API.G_TRUE THEN
605        ROLLBACK TO add_meter_reading;
606     END IF;
607 
608     FND_MSG_PUB.add_exc_msg( p_pkg_name => 'EAM_EXECUTION_JSP.ADD_METER_READING',
609     p_procedure_name => EAM_DEBUG.G_err_stack);
610     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
611   WHEN FND_API.G_EXC_ERROR THEN
612     IF p_commit = FND_API.G_TRUE THEN
613        ROLLBACK TO add_meter_reading;
614     END IF;
615 
616     FND_MSG_PUB.add_exc_msg( p_pkg_name => 'EAM_EXECUTION_JSP.ADD_METER_READING',
617     p_procedure_name => EAM_DEBUG.G_err_stack);
618     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
619   WHEN OTHERS THEN
620     IF p_commit = FND_API.G_TRUE THEN
621        ROLLBACK TO add_meter_reading;
622     END IF;
623 
624     FND_MSG_PUB.add_exc_msg( p_pkg_name => 'EAM_EXECUTION_JSP.ADD_METER_READING',
625     p_procedure_name => EAM_DEBUG.G_err_stack);
626 
627     eam_execution_jsp.add_message(p_app_short_name => 'EAM', p_msg_name => 'EAM_MRR_EXCEPTION'
628      ,p_token1 => 'MESSAGE', p_value1 => SQLERRM);
629     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
630 
631   END add_meter_reading;
632 
633 end EAM_METER_READINGS_JSP;