DBA Data[Home] [Help]

PACKAGE BODY: APPS.AMS_ACTMETRIC_PVT

Source


1 PACKAGE BODY AMS_ACTMETRIC_PVT AS
2 /* $Header: amsvamtb.pls 120.14.12010000.2 2010/05/10 08:56:39 amlal ship $ */
3 
4 ------------------------------------------------------------------------------
5 --
6 -- NAME
7 --    AMS_ActMetric_PVT  12.0
8 --
9 -- HISTORY
10 -- 20-Jun-1999 choang@us    Created package.
11 -- 11-Oct-1999 ptendulk@us  Made changes according to new standards.
12 --                          Added some Validations, Seperated from Common
13 --                          Objects
14 -- 01/18/2000  bgeorge      reviewed code, added isseeded function to the body
15 -- 03/10/2000  bgeorge      added code for updating functional actual value
16 --                          for MANUAL metrics
17 -- 04/17/2000  tdonohoe@us  modified all procedures to include columns added
18 --                          for 11.5.2 release to support Heirarchy traversal.
19 -- 05/08/2000  tdonohoe@us  modified API to allow a metric to be associated
20 --                          with a Forecast (FCST).
21 -- 06/28/2000  rchahal@us   modified API to allow a metric to be associated
22 --                          with a Fund (FUND).
23 -- 07/05/2000  khung@us     change metric_category from 701 to 901 (#1331391)
24 -- 07/11/2000  svatsa@us    Created a forward declaration for the API
25 --                          Create_ActMetric so that it can be called
26 --                          recursively from the api Create_ParentActMetric.
27 -- 08/17/2000  sveerave@us  modified Default_func_currency function to return
28 --                          default currency from profile 'AMS_DEFAULT_CURR_CODE'
29 -- 08/24/2000  sveerave@us  modified to include call-out for
30 --                          check_freeze_status in create, update and delete
31 -- 08/28/2000  sveerave@us  Modified to convert/default metric values with
32 --                          currencies and with out currencies in case of
33 --                          manual or non-manual type metrics. in
34 --                          Default_ActMetric procedure
35 -- 10/11/2000  SVEERAVE@US  Modified to include the procedure for flipping
36 --                          the ROLLUP metrics currency to main object's
37 --                          currency.  Included procedure Init_ActMetric_Rec
38 -- 11/07/2000  SVEERAVE@US  Modified to include the call to
39 --                          modify_object_attribute to uncheck when metrics
40 --                          are deleted in delete_metrics api
41 -- 11/15/2000  SVEERAVE@US  Modifed delete api to check for existence of
42 --                          child before deleting the metric.
43 -- 04/03/2001  DMVINCEN@US  Added validation to prevent delete of parent
44 --                          rollup activity metrics.
45 -- 04/17/2001  DMVINCEN@US  Removed modify_object_attribute because it is
46 --                          obsolete.
47 -- 04/17/2001  HUILI@US     Added act_metric_date and description.
48 -- 04/27/2001  DMVINCEN@US  Changed ams_p_actmetrics_v to join of tables.
49 -- 04/27/2001  DMVINCEN@US  Added SUMMARY calculation type #1753241
50 -- 04/30/2001  DMVINCEN@US  Delete metrics need to refresh parents.
51 -- 05/07/2001  huili        Added "depend_act_metric" field
52 -- 05/17/2001  DMVINCEN     Removed depend,trans date,desc for 11.5.4.11
53 -- 06/07/2001  DMVINCEN     Allow ROLLUP and SUMMARY to assign to any object.
54 -- 06/21/2001  DMVINCEN     Change hierarchy for 11.5.6 with Programs.
55 -- 06/21/2001  DMVINCEN     Added depend,trans date,desc for 11.5.6.
56 -- 06/21/2001  DMVINCEN     Removed modify_object_attribute for 11.5.6.
57 -- 08/21/2001  DMVINCEN     Set the transaction currency code on each update.
58 -- 09/10/2001  HUILI        Added the "Have_Published" module.
59 -- 09/21/2001  HUILI        Added the "Get_Object_Info" module.
60 -- 10/15/2001  DMVINCEN     Add function metrics only once.
61 -- 10/16/2001  HUILI        Set the "trans_actual_value" and "func_actual_value"
62 --                          to "NULL" while attaching a function metric to a
63 --                          business object.
64 -- 11/27/2001  DMVINCEN     Added History recording.  Not utilized yet.
65 -- 11/27/2001  DMVINCEN     Added Results cue card support.  Get_Results.
66 -- 11/27/2001  HUILI        Added Get_Date_Buckets for results support.
67 -- 12/05/2001  DMVINCEN     Added Convert_Currency_Vector and
68 --                          Convert_Currency_Object for chart support.
69 -- 12/18/2001  DMVINCEN     Convert_Currency: no round if p_round is false.
70 --                          Bug 1630029.
71 -- 12/18/2001  DMVINCEN     Allow seeded metrics to be removed from objects.
72 -- 12/20/2001  DMVINCEN     Unit testing corrections to GET_RESULTS.
73 -- 12/20/2001  DMVINCEN     Turned on history recording.
74 -- 01/14/2002  HUILI        Bug fix #2159316.
75 -- 02/06/2002  DMVINCEN     BUG2214496: Corrected history delta calculation.
76 -- 03/08/2002  DMVINCEN     Added function_used_by_id, arc_function_used_by.
77 -- 03/11/2002  DMVINCEN     Added dialog components as valid objects.
78 -- 03/18/2002  DMVINCEN     BUG2214486: View history date slice validations.
79 -- 04/04/2002  DMVINCEN     Added recursive delete.
80 -- 04/04/2002  DMVINCEN     Removing rollups removes reference from child.
81 -- 04/04/2002  DMVINCEN     Changed posting costs to transaction currency.
82 -- 07/16/2002  DMVINCEN     BUG2462396: Post costs for events prior to start.
83 -- 07/24/2002  DMVINCEN     BUG2462396: Use specific statuses for post cost.
84 -- 10/10/2002  HUILI        BUG #2610168
85 -- 10/21/2002  YZHAO        11.5.9 Add new fields for budget allocation
86 -- 11/18/2002  DMVINCEN     Fixed problems introduced by adding NOCOPY.
87 -- 01/17/2003  DMVINCEN     NOCOPY problems reoccured in default_actmetric.
88 -- 12/27/2002  DMVINCEN     BUG #2729040: Fixed rollback issues.
89 -- 02/20/2003  DMVINCEN     BUG2813600: Delete history calculated wrong.
90 -- 02/20/2003  DMVINCEN     When Delete history shows zeros.
91 -- 03/05/2003  DMVINCEN     BUG2486379: Show post costs error from budgets.
92 -- 03/11/2003  DMVINCEN     BUG2845365: Removed dialogue support.
93 -- 05/07/2003  sunkumar     overloaded validate_actmetric_record to incorporate
94 --                          p_operation_mode ('CREATE', 'UPDATE', or 'DELETE'
95 -- 17-Sep-2003 sunkumar     Object level locking introduced
96 -- 10/02/2003  dmvincen     Added forecasted_variable_value.
97 -- 10/08/2003  dmvincen     Exclude formulas from posting.
98 -- 11/14/2003  dmvincen     Set formula's dirty flag.
99 -- 12/16/2003  dmvincen     Added ALIST to lock_object.
100 -- 02/09/2004  dmvincen     BUG3430397: Post budget to OZF.
101 -- 02/10/2004  dmvincen     Variable metrics reuse the same multiplier.
102 -- 02/10/2004  dmvincen     Set dirty flags for variable metrics.
103 -- 03/08/2004  dmvincen     BUG3463791: Removed redundant frozen message.
104 -- 04/21/2004  sunkumar     sqlbind fixes
105 -- 04/21/2004  dmvincen     Added Convert_to_trans_value for graph support.
106 -- 11/10/2004  dmvincen     BUG3815334: Limit history results to default rows.
107 -- 11/22/2004  dmvincen     BUG4028377: Prevent duplicate assignment of funcs.
108 -- 04-Jan-2005 choang       bug 4102008: event status was not vaildated in
109 --                          check_freeze_status.
110 -- 19-May-2005 choang       Added call to ams_access_pvt.check_update_access
111 --                          in validate act metric.
112 -- 06/07/2005  dmvincen     BUG4391308: Added locking on update.
113 -- 10/12/2005  dmvincen     BUG4661335: Actual value check for creation.
114 -- 12/06/2005  dmvincen     BUG4747088: Check fore var val on update active.
115 -- 12/16/2005  dmvincen     BUG4868582: Expose Freeze status for UI.
116 -- 01/25/2006  dmvincen     BUG4669529: Show first incremental value.
117 -----------------------------------------------------------------------------
118 
119 --
120 -- Global variables and constants.
121 
122 G_PKG_NAME CONSTANT VARCHAR2(30) := 'AMS_ACTMETRIC_PVT'; -- Name of the current package.
123 G_DEBUG_FLAG                  VARCHAR2(1)  := 'N';
124 G_CREATE CONSTANT VARCHAR2(30) := 'CREATE';
125 G_UPDATE CONSTANT VARCHAR2(30) := 'UPDATE';
126 G_DELETE CONSTANT VARCHAR2(30) := 'DELETE';
127 G_IS_DIRTY CONSTANT VARCHAR2(30) := 'Y';
128 G_METRIC CONSTANT VARCHAR2(30) := 'METRIC';
129 G_CATEGORY CONSTANT VARCHAR2(30) := 'CATEGORY';
130 G_FORMULA CONSTANT VARCHAR2(30) := 'FORMULA';
131 G_CATEGORY_COSTS        CONSTANT NUMBER := 901;
132 G_CATEGORY_REVENUES     CONSTANT NUMBER := 902;
133 G_VARIABLE CONSTANT VARCHAR2(30) := 'VARIABLE';
134 TYPE date_bucket_type IS TABLE OF DATE;
135 TYPE number_table IS TABLE OF NUMBER;
136 
137 -- Forward Declarations Begin
138 AMS_DEBUG_HIGH_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH);
139 AMS_DEBUG_LOW_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW);
140 AMS_DEBUG_MEDIUM_ON boolean := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM);
141 
142 PROCEDURE Record_History(
143    p_actmet_id                  IN NUMBER,
144    p_action                     IN VARCHAR2,
145    x_return_status              OUT NOCOPY VARCHAR2,
146    x_msg_count                  OUT NOCOPY NUMBER,
147    x_msg_data                   OUT NOCOPY VARCHAR2
148 );
149 
150 PROCEDURE Create_ActMetric2 (
151    p_api_version                IN  NUMBER,
152    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
153    p_commit                     IN  VARCHAR2 := Fnd_Api.G_FALSE,
154    p_validation_level           IN  NUMBER   := Fnd_Api.G_Valid_Level_Full,
155 
156    x_return_status              OUT NOCOPY VARCHAR2,
157    x_msg_count                  OUT NOCOPY NUMBER,
158    x_msg_data                   OUT NOCOPY VARCHAR2,
159 
160    p_act_metric_rec             IN  act_metric_rec_type,
161    x_activity_metric_id         OUT NOCOPY NUMBER
162 );
163 
164 
165 PROCEDURE Validate_ActMetric_Record (
166    p_act_metric_rec  IN  act_metric_rec_type,
167    p_complete_rec    IN  act_metric_rec_type,
168    p_operation_mode  IN VARCHAR2,
169    x_return_status   OUT NOCOPY VARCHAR2
170 );
171 
172 
173 /*sunkumar 21-apr-2004 added*/
174 FUNCTION Validate_Object_Exists (
175    p_object_type  IN  varchar2,
176    p_object_id   IN  number
177 )
178 RETURN VARCHAR2;
179 
180 
181 -- Forward Declarations End
182 
183 
184 PROCEDURE Create_ActMetric (
185    p_api_version                IN  NUMBER,
186    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
187    p_commit                     IN  VARCHAR2 := Fnd_Api.G_FALSE,
188    --p_commit                     IN  VARCHAR2 := Fnd_Api.G_TRUE,
189    p_validation_level           IN  NUMBER   := Fnd_Api.G_Valid_Level_Full,
190 
191    x_return_status              OUT NOCOPY VARCHAR2,
192    x_msg_count                  OUT NOCOPY NUMBER,
193    x_msg_data                   OUT NOCOPY VARCHAR2,
194 
195    p_act_metric_rec             IN  act_metric_rec_type,
196    x_activity_metric_id         OUT NOCOPY NUMBER
197 ) IS
198 
199    L_API_NAME        CONSTANT VARCHAR2(30) := 'Create_ActMetric';
200    l_is_locked       varchar2(1);
201 BEGIN
202 
203    SAVEPOINT sp_create_actmetric;
204 
205    x_return_status      := Fnd_Api.G_RET_STS_SUCCESS;
206    x_activity_metric_id := NULL;
207 
208    --LOCK TABLE AMS_ACT_METRICS_ALL IN EXCLUSIVE MODE;
209 
210    l_is_locked := Lock_Object(
211          p_api_version           => p_api_version,
212          p_init_msg_list         => p_init_msg_list,
213          p_arc_act_metric_used_by => p_act_metric_rec.arc_act_metric_used_by,
214          p_act_metric_used_by_id => p_act_metric_rec.act_metric_used_by_id,
215          x_return_status         => x_return_status,
216          x_msg_count             => x_msg_count,
217          x_msg_data              => x_msg_data);
218 
219    IF x_return_status <> Fnd_Api.G_RET_STS_SUCCESS or
220       l_is_locked = FND_API.G_FALSE THEN
221       RAISE Fnd_Api.G_EXC_ERROR;
222    END IF;
223 
224    Create_ActMetric2 (
225          p_api_version           => p_api_version,
226          p_init_msg_list         => p_init_msg_list,
227          p_commit                => p_commit,
228          p_validation_level      => p_validation_level,
229          x_return_status         => x_return_status,
230          x_msg_count             => x_msg_count,
231          x_msg_data              => x_msg_data,
232          p_act_metric_rec        => p_act_metric_rec,
233          x_activity_metric_id    => x_activity_metric_id);
234 
235    -- If any errors happen abort API.
236    IF x_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
237       RAISE Fnd_Api.G_EXC_ERROR;
238    END IF;
239 
240    --COMMIT WORK;
241 
242    IF Fnd_Api.to_boolean(p_commit) THEN
243       COMMIT;
244    END IF;
245 
246    --
247    -- Standard API to get message count, and if 1,
248    -- set the message data OUT NOCOPY variable.
249    --
250    Fnd_Msg_Pub.Count_And_Get (
251       p_count           =>    x_msg_count,
252       p_data            =>    x_msg_data,
253       p_encoded         =>    Fnd_Api.G_FALSE
254    );
255 
256 EXCEPTION
257    WHEN Fnd_Api.G_EXC_ERROR THEN
258       ROLLBACK TO sp_create_actmetric;
259       x_return_status := Fnd_Api.G_RET_STS_ERROR;
260       Fnd_Msg_Pub.Count_And_Get (
261          p_count         =>     x_msg_count,
262          p_data          =>     x_msg_data,
263          p_encoded         =>   FND_API.G_FALSE
264       );
265    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
266       ROLLBACK TO sp_create_actmetric;
267       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
268       Fnd_Msg_Pub.Count_And_Get (
269          p_count         =>     x_msg_count,
270          p_data          =>     x_msg_data,
271          p_encoded         =>   FND_API.G_FALSE
272       );
273    WHEN OTHERS THEN
274       ROLLBACK TO sp_create_actmetric;
275       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
276       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
277          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
278       END IF;
279       Fnd_Msg_Pub.Count_And_Get (
280          p_count         =>     x_msg_count,
281          p_data          =>     x_msg_data,
282          p_encoded       =>   FND_API.G_FALSE
283       );
284 END Create_ActMetric;
285 
286 -- Start of comments
287 -- NAME
288 --    Get_Object_Info
289 --
290 -- PURPOSE
291 --    To get information for a specific business object.
292 --
293 -- NOTES
294 --
295 -- HISTORY
296 -- 09/21/2001   HuiLi         Created.
297 --
298 -- End of comments
299 PROCEDURE Get_Object_Info (
300    p_obj_type     IN  VARCHAR2,
301    p_obj_id       IN NUMBER,
302    x_flag         OUT NOCOPY VARCHAR2,
303    x_currency     OUT NOCOPY VARCHAR2
304 ) IS
305 
306    --campaign and program
307    CURSOR c_check_camp_prog_status (p_camp_id IN NUMBER)
308    IS
309       SELECT NVL (transaction_currency_code, functional_currency_code) AS currency_code, status_code
310       FROM ams_campaigns_all_b
311       WHERE campaign_id = p_camp_id;
312       --AND UPPER(status_code) IN  ('COMPLETED', 'ACTIVE', 'CANCELLED', 'SUBMITTED_BA');
313 
314    --campaign schedule
315    CURSOR c_check_campsch_status (p_schedule_id IN NUMBER)
316    IS
317       SELECT NVL (transaction_currency_code, functional_currency_code) AS currency_code, status_code
318       FROM ams_campaign_schedules_b
319       WHERE schedule_id = p_schedule_id;
320       --AND UPPER(status_code) IN ('ACTIVE', 'CANCELLED', 'COMPLETED');
321 
322    --deliverable
323    CURSOR c_check_deliv_status (p_deliv_id IN NUMBER)
324    IS
325       SELECT NVL (transaction_currency_code, currency_code) AS currency_code, status_code
326       FROM ams_deliverables_all_b
327       WHERE deliverable_id = p_deliv_id;
328       --AND UPPER(status_code) IN ('SUBMITTED_BA', 'CANCELLED', 'AVAILABLE');
329 
330    --event
331    CURSOR c_check_event_status (p_event_id IN NUMBER)
332    IS
333       SELECT currency_code_tc AS currency_code, system_status_code
334           -- active_flag, active_from_date
335       FROM ams_event_headers_all_b
336       WHERE event_header_id = p_event_id;
337       --AND active_flag = 'Y'
338       --AND active_from_date < SYSDATE;
339 
340    --event schedule and one-off event
341    CURSOR c_check_eventsch_status (p_ev_id IN NUMBER)
342    IS
343       SELECT currency_code_tc AS currency_code, system_status_code
344       FROM ams_event_offers_all_b
345       WHERE event_offer_id = p_ev_id;
346       --AND UPPER(system_status_code) IN ('ACTIVE', 'SUBMITTED_BA', 'CLOSED', 'CANCELLED');
347 
348    l_status_code VARCHAR2(2000);
349    -- l_active_flag VARCHAR2(1);
350    -- l_active_date DATE;
351    l_currency_code VARCHAR2(15);
352 
353 BEGIN
354 
355    x_flag := 'N';
356    IF UPPER(p_obj_type) IN ('CAMP', 'RCAM') THEN
357       OPEN c_check_camp_prog_status (p_obj_id);
358       FETCH c_check_camp_prog_status INTO l_currency_code, l_status_code;
359       IF c_check_camp_prog_status%FOUND AND
360          UPPER(l_status_code) IN
361             ('ACTIVE', 'CANCELLED', 'COMPLETED', 'SUBMITTED_BA') THEN
362          x_flag := 'Y';
363       END IF;
364       CLOSE c_check_camp_prog_status;
365    ELSIF UPPER(p_obj_type) = 'CSCH' THEN
366       OPEN c_check_campsch_status(p_obj_id);
367       FETCH c_check_campsch_status INTO l_currency_code, l_status_code;
368       IF c_check_campsch_status%FOUND
369          AND UPPER(l_status_code) IN
370             ('ACTIVE', 'CANCELLED', 'COMPLETED', 'SUBMITTED_BA') THEN
371          x_flag := 'Y';
372       END IF;
373       CLOSE c_check_campsch_status;
374    ELSIF UPPER(p_obj_type) = 'DELV' THEN
375       OPEN c_check_deliv_status(p_obj_id);
376       FETCH c_check_deliv_status INTO l_currency_code, l_status_code;
377       IF c_check_deliv_status%FOUND
378          AND UPPER(l_status_code) IN ('SUBMITTED_BA', 'CANCELLED', 'AVAILABLE')
379       THEN
380          x_flag := 'Y';
381       END IF;
382       CLOSE c_check_deliv_status;
383    ELSIF UPPER(p_obj_type) = 'EVEH' THEN
384       OPEN c_check_event_status(p_obj_id);
385       FETCH c_check_event_status INTO l_currency_code, l_status_code;
386           -- l_active_flag, l_active_date;
387       IF c_check_event_status%FOUND
388          AND UPPER(l_status_code) IN
389             ('ACTIVE', 'CANCELLED', 'COMPLETED', 'SUMBITTED_BA')
390          -- AND UPPER(l_active_flag) = 'Y'
391          -- AND l_active_date < SYSDATE
392       THEN
393          x_flag := 'Y';
394       END IF;
395       CLOSE c_check_event_status;
396    ELSIF UPPER(p_obj_type) IN ('EONE', 'EVEO') THEN
397       OPEN c_check_eventsch_status(p_obj_id);
398       FETCH c_check_eventsch_status INTO l_currency_code, l_status_code;
399       IF c_check_eventsch_status%FOUND
400          AND UPPER(l_status_code) IN
401              ('ACTIVE', 'CANCELLED', 'COMPLETED', 'SUBMITTED_BA') THEN
402          x_flag := 'Y';
403       END IF;
404       CLOSE c_check_eventsch_status;
405    END IF;
406    x_currency := l_currency_code;
407 
408 END Get_Object_Info;
409 
410 
411 -- Start of comments
412 -- NAME
413 --    Have_Published
414 --
415 -- PURPOSE
416 --    To publish the object must be active, canceled or completed.
417 --
418 -- NOTES
419 --
420 -- HISTORY
421 -- 09/11/2001   HuiLi         Created.
422 --
423 -- End of comments
424 PROCEDURE Have_Published (
425    p_obj_type     IN  VARCHAR2,
426    p_obj_id       IN NUMBER,
427    x_flag         OUT NOCOPY VARCHAR2
428 ) IS
429 
430    --campaign and program
431    CURSOR c_check_camp_prog_status (p_camp_id IN NUMBER)
432    IS
433      SELECT 1
434      FROM ams_campaigns_all_b
435      WHERE campaign_id = p_camp_id
436      AND UPPER(status_code) IN ('ACTIVE', 'AVAILABLE', 'CANCELLED', 'PLANNING');
437 
438    --campaign schedule
439    CURSOR c_check_campsch_status (p_schedule_id IN NUMBER)
440    IS
441      SELECT 1
442      FROM ams_campaign_schedules_b
443      WHERE schedule_id = p_schedule_id
444      AND UPPER(status_code) IN ('ACTIVE', 'AVAILABLE', 'CANCELLED', 'PLANNING');
445 
446    --deliverable
447    CURSOR c_check_deliv_status (p_deliv_id IN NUMBER)
448    IS
449       SELECT 1
450       FROM ams_deliverables_all_b
451       WHERE deliverable_id = p_deliv_id
452       AND UPPER(status_code) IN ('CANCELLED', 'AVAILABLE');
453 
454    --event
455    CURSOR c_check_event_status (p_event_id IN NUMBER)
456    IS
457       SELECT 1
458       FROM ams_event_headers_all_b
459       WHERE event_header_id = p_event_id
460       AND UPPER(system_status_code) IN
461          ('ACTIVE', 'AVAILABLE', 'CANCELLED', 'PLANNING')
462       --AND active_flag = 'Y'
463       --AND active_from_date < SYSDATE
464       ;
465 
466    --event schedule and one-off event
467    CURSOR c_check_eventsch_status (p_ev_id IN NUMBER)
468    IS
469       SELECT 1
470       FROM ams_event_offers_all_b
471       WHERE event_offer_id = p_ev_id
472       AND UPPER(system_status_code) IN
473           ('ACTIVE', 'AVAILABLE', 'CANCELLED', 'PLANNING');
474 
475    l_status_code NUMBER := NULL;
476 
477 BEGIN
478 
479    x_flag := 'N';
480    IF UPPER(p_obj_type) IN ('CAMP', 'RCAM') THEN
481       OPEN c_check_camp_prog_status (p_obj_id);
482       FETCH c_check_camp_prog_status INTO l_status_code;
483       IF c_check_camp_prog_status%FOUND THEN
484          x_flag := 'Y';
485       END IF;
486       CLOSE c_check_camp_prog_status;
487    ELSIF UPPER(p_obj_type) = 'CSCH' THEN
488       OPEN c_check_campsch_status(p_obj_id);
489       FETCH c_check_campsch_status INTO l_status_code;
490       IF c_check_campsch_status%FOUND THEN
491          x_flag := 'Y';
492       END IF;
493       CLOSE c_check_campsch_status;
494    ELSIF UPPER(p_obj_type) = 'DELV' THEN
495       OPEN c_check_deliv_status(p_obj_id);
496       FETCH c_check_deliv_status INTO l_status_code;
497       IF c_check_deliv_status%FOUND THEN
498          x_flag := 'Y';
499       END IF;
500       CLOSE c_check_deliv_status;
501    ELSIF UPPER(p_obj_type) = 'EVEH' THEN
502       OPEN c_check_event_status(p_obj_id);
503       FETCH c_check_event_status INTO l_status_code;
504       IF c_check_event_status%FOUND THEN
505          x_flag := 'Y';
506       END IF;
507       CLOSE c_check_event_status;
508    ELSIF UPPER(p_obj_type) IN ('EONE', 'EVEO') THEN
509       OPEN c_check_eventsch_status(p_obj_id);
510       FETCH c_check_eventsch_status INTO l_status_code;
511       IF c_check_eventsch_status%FOUND THEN
512          x_flag := 'Y';
513       END IF;
514       CLOSE c_check_eventsch_status;
515    END IF;
516 END Have_Published;
517 
518 -- Start of comments
519 -- NAME
520 --    Init_ActMetric_Rec
521 --
522 -- PURPOSE
523 --    This Procedure will initialize the Record for Activity Metric.
524 --    It will be called before call to Update Activity Metric
525 --
526 -- NOTES
527 --
528 -- HISTORY
529 -- 10/11/2000   SVEERAVE         Created.
530 -- 05/07/2001   HuiLi            Added the "depend_act_metric" field
531 --
532 -- End of comments
533 
534 PROCEDURE Init_ActMetric_Rec(
535    x_act_metric_rec  IN OUT NOCOPY  Ams_Actmetric_Pvt.Act_metric_rec_type
536 )  IS
537 BEGIN
538   x_act_metric_rec.activity_metric_id                := Fnd_Api.G_MISS_NUM ;
539   x_act_metric_rec.last_update_date                  := Fnd_Api.G_MISS_DATE ;
540   x_act_metric_rec.last_updated_by                   := Fnd_Api.G_MISS_NUM ;
541   x_act_metric_rec.creation_date                     := Fnd_Api.G_MISS_DATE ;
542   x_act_metric_rec.created_by                        := Fnd_Api.G_MISS_NUM ;
543   x_act_metric_rec.last_update_login                 := Fnd_Api.G_MISS_NUM ;
544   x_act_metric_rec.object_version_number             := Fnd_Api.G_MISS_NUM ;
545   x_act_metric_rec.act_metric_used_by_id             := Fnd_Api.G_MISS_NUM ;
546   x_act_metric_rec.arc_act_metric_used_by            := Fnd_Api.G_MISS_CHAR ;
547   x_act_metric_rec.purchase_req_raised_flag          := Fnd_Api.G_MISS_CHAR ;
548   x_act_metric_rec.application_id                    := Fnd_Api.G_MISS_NUM ;
549   x_act_metric_rec.sensitive_data_flag               := Fnd_Api.G_MISS_CHAR ;
550   x_act_metric_rec.budget_id                         := Fnd_Api.G_MISS_NUM ;
551   x_act_metric_rec.metric_id                         := Fnd_Api.G_MISS_NUM ;
552   x_act_metric_rec.transaction_currency_code         := Fnd_Api.G_MISS_CHAR ;
553   x_act_metric_rec.trans_forecasted_value            := Fnd_Api.G_MISS_NUM ;
554   x_act_metric_rec.trans_committed_value             := Fnd_Api.G_MISS_NUM ;
555   x_act_metric_rec.trans_actual_value                := Fnd_Api.G_MISS_NUM ;
556   x_act_metric_rec.functional_currency_code          := Fnd_Api.G_MISS_CHAR ;
557   x_act_metric_rec.func_forecasted_value             := Fnd_Api.G_MISS_NUM ;
558   x_act_metric_rec.dirty_flag                        := Fnd_Api.G_MISS_CHAR ;
559   x_act_metric_rec.func_committed_value              := Fnd_Api.G_MISS_NUM ;
560   x_act_metric_rec.func_actual_value                 := Fnd_Api.G_MISS_NUM ;
561   x_act_metric_rec.last_calculated_date              := Fnd_Api.G_MISS_DATE ;
562   x_act_metric_rec.variable_value                    := Fnd_Api.G_MISS_NUM ;
563   x_act_metric_rec.forecasted_variable_value         := Fnd_Api.G_MISS_NUM;
564   x_act_metric_rec.computed_using_function_value     := Fnd_Api.G_MISS_NUM ;
565   x_act_metric_rec.metric_uom_code                   := Fnd_Api.G_MISS_CHAR ;
566   x_act_metric_rec.org_id                            := Fnd_Api.G_MISS_NUM ;
567   x_act_metric_rec.difference_since_last_calc        := Fnd_Api.G_MISS_NUM ;
568   x_act_metric_rec.activity_metric_origin_id         := Fnd_Api.G_MISS_NUM ;
569   x_act_metric_rec.arc_activity_metric_origin        := Fnd_Api.G_MISS_CHAR ;
570   x_act_metric_rec.days_since_last_refresh           := Fnd_Api.G_MISS_NUM ;
571   x_act_metric_rec.scenario_id                       := Fnd_Api.G_MISS_NUM ;
572   /* yzhao: 09/24/2001 add following lines */
573   x_act_metric_rec.summarize_to_metric               := Fnd_Api.G_MISS_NUM ;
574   x_act_metric_rec.rollup_to_metric                  := Fnd_Api.G_MISS_NUM ;
575   x_act_metric_rec.hierarchy_id                      := Fnd_Api.G_MISS_NUM ;
576   x_act_metric_rec.start_node                        := Fnd_Api.G_MISS_NUM ;
577   x_act_metric_rec.from_level                        := Fnd_Api.G_MISS_NUM ;
578   x_act_metric_rec.to_level                          := Fnd_Api.G_MISS_NUM ;
579   x_act_metric_rec.from_date                         := Fnd_Api.G_MISS_DATE ;
580   x_act_metric_rec.TO_DATE                           := Fnd_Api.G_MISS_DATE ;
581   x_act_metric_rec.amount1                           := Fnd_Api.G_MISS_NUM ;
582   x_act_metric_rec.amount2                           := Fnd_Api.G_MISS_NUM ;
583   x_act_metric_rec.amount3                           := Fnd_Api.G_MISS_NUM ;
584   x_act_metric_rec.percent1                          := Fnd_Api.G_MISS_NUM ;
585   x_act_metric_rec.percent2                          := Fnd_Api.G_MISS_NUM ;
586   x_act_metric_rec.percent3                          := Fnd_Api.G_MISS_NUM ;
587   x_act_metric_rec.published_flag                    := Fnd_Api.G_MISS_CHAR ;
588   x_act_metric_rec.pre_function_name                 := Fnd_Api.G_MISS_CHAR ;
589   x_act_metric_rec.post_function_name                := Fnd_Api.G_MISS_CHAR ;
590   -- x_act_metric_rec.security_group_id                 := Fnd_Api.G_MISS_NUM ;
591   /* yzhao: 09/24/2001 ends */
592   x_act_metric_rec.attribute_category                := Fnd_Api.G_MISS_CHAR ;
593   x_act_metric_rec.attribute1                        := Fnd_Api.G_MISS_CHAR ;
594   x_act_metric_rec.attribute2                        := Fnd_Api.G_MISS_CHAR ;
595   x_act_metric_rec.attribute3                        := Fnd_Api.G_MISS_CHAR ;
596   x_act_metric_rec.attribute4                        := Fnd_Api.G_MISS_CHAR ;
597   x_act_metric_rec.attribute5                        := Fnd_Api.G_MISS_CHAR ;
598   x_act_metric_rec.attribute6                        := Fnd_Api.G_MISS_CHAR ;
599   x_act_metric_rec.attribute7                        := Fnd_Api.G_MISS_CHAR ;
600   x_act_metric_rec.attribute8                        := Fnd_Api.G_MISS_CHAR ;
601   x_act_metric_rec.attribute9                        := Fnd_Api.G_MISS_CHAR ;
602   x_act_metric_rec.attribute10                       := Fnd_Api.G_MISS_CHAR ;
603   x_act_metric_rec.attribute11                       := Fnd_Api.G_MISS_CHAR ;
604   x_act_metric_rec.attribute12                       := Fnd_Api.G_MISS_CHAR ;
605   x_act_metric_rec.attribute13                       := Fnd_Api.G_MISS_CHAR ;
606   x_act_metric_rec.attribute14                       := Fnd_Api.G_MISS_CHAR ;
607   x_act_metric_rec.attribute15                       := Fnd_Api.G_MISS_CHAR ;
608   x_act_metric_rec.description                       := Fnd_Api.G_MISS_CHAR ;
609   x_act_metric_rec.act_metric_date                   := Fnd_Api.G_MISS_DATE ;
610   x_act_metric_rec.depend_act_metric                 := Fnd_Api.G_MISS_NUM ;
611   x_act_metric_rec.function_used_by_id               := Fnd_Api.G_MISS_NUM ;
612   x_act_metric_rec.arc_function_used_by              := Fnd_Api.G_MISS_CHAR ;
613   /* 05/15/2002 yzhao: 11.5.9 add 6 new columns for top-down bottom-up budgeting */
614   x_act_metric_rec.hierarchy_type                    := Fnd_Api.G_MISS_CHAR ;
615   x_act_metric_rec.status_code                       := Fnd_Api.G_MISS_CHAR ;
616   x_act_metric_rec.method_code                       := Fnd_Api.G_MISS_CHAR ;
617   x_act_metric_rec.action_code                       := Fnd_Api.G_MISS_CHAR ;
618   x_act_metric_rec.basis_year                        := Fnd_Api.G_MISS_NUM ;
619   x_act_metric_rec.ex_start_node                     := Fnd_Api.G_MISS_CHAR ;
620   /* 05/15/2002 yzhao: add ends */
621 END Init_ActMetric_Rec;
622 
623 
624 -- Start of comments
625 -- API Name       IsSeeded
626 -- Type           Private
627 -- Pre-reqs       None.
628 -- Function       Returns whether the given ID is that of a seeded record.
629 --
630 -- Parameters
631 --    IN          p_id                                          IN  NUMBER
632 --    OUT NOCOPY         Returns the boolean Value to show
633 --                                hether the metric is seeded or not
634 -- Version        Current version: 1.0
635 --                Previous version: 1.0
636 --                Initial version: 1.0
637 -- End of comments
638 
639 FUNCTION IsSeeded (
640    p_id        IN NUMBER
641 )
642 RETURN BOOLEAN ;
643 
644 -----------------------------------------------------------------------------
645 -- NAME
646 --    Make_ActMetric_Dirty
647 -- PURPOSE
648 --    Given an activity metric id, update the dirty_flag of the activity metric
649 --    and that of all the activity metrics above it in the hierarchy.
650 -- HISTORY
651 -- 13-Oct-2000 choang   Created.
652 ----------------------------------------------------------------------------
653 PROCEDURE Make_ActMetric_Dirty (
654    p_activity_metric_id IN NUMBER
655 )
656 IS
657 BEGIN
658    -- update for summarize_to_metric
659    UPDATE ams_act_metrics_all
660    SET dirty_flag = G_IS_DIRTY
661    WHERE activity_metric_id IN (
662             SELECT activity_metric_id
663             FROM   ams_act_metrics_all
664             START WITH activity_metric_id = p_activity_metric_id
665             CONNECT BY activity_metric_id = PRIOR summarize_to_metric)
666    AND dirty_flag <> G_IS_DIRTY
667    ;
668 
669    -- update for rollup_to_metric
670    UPDATE ams_act_metrics_all
671    SET dirty_flag = G_IS_DIRTY
672    WHERE activity_metric_id IN (
673             SELECT activity_metric_id
674             FROM   ams_act_metrics_all
675             START WITH activity_metric_id = p_activity_metric_id
676             CONNECT BY activity_metric_id = PRIOR rollup_to_metric)
677    AND dirty_flag <> G_IS_DIRTY
678    ;
679 
680    -- update effected formulas
681    update ams_act_metrics_all
682    set dirty_flag = G_IS_DIRTY
683    where activity_metric_id in
684    (select a.activity_metric_id
685    from ams_act_metrics_all a, ams_metrics_all_b m, ams_metric_formulas f,
686         ams_act_metrics_all b, ams_metrics_all_b c
687    where a.metric_id = m.metric_id
688    and m.metric_id = f.metric_id
689    and b.metric_id = c.metric_id
690    and a.arc_act_metric_used_by = b.arc_act_metric_used_by
691    and a.act_metric_used_by_id = b.act_metric_used_by_id
692    and m.metric_calculation_type = G_FORMULA
693    and a.last_update_date > b.last_update_date
694    and ((b.metric_id = f.source_id and f.source_type = G_METRIC)
695       or (c.metric_category = f.source_id and f.source_type = G_CATEGORY))
696    and b.activity_metric_id = p_activity_metric_id)
697    and dirty_flag <> G_IS_DIRTY;
698 
699    -- Update for effected variable metrics.
700    UPDATE ams_act_metrics_all
701      SET dirty_flag = G_IS_DIRTY
702    WHERE activity_metric_id IN
703      (SELECT a.activity_metric_id
704         FROM ams_act_metrics_all a, ams_metrics_all_b b,
705              ams_act_metrics_all c
706        WHERE a.metric_id = b.metric_id
707          AND b.accrual_type = G_VARIABLE
708          AND a.arc_act_metric_used_by = c.arc_act_metric_used_by
709          AND a.act_metric_used_by_id = c.act_metric_used_by_id
710          AND c.activity_metric_id = p_activity_metric_id
711          AND TO_NUMBER(NVL(b.compute_using_function,'-1')) = c.metric_id);
712 
713 END Make_ActMetric_Dirty;
714 
715 
716 
717 /* 07/11/2000 svatsa@us    Create_ParentActMetric */
718 -- Start of comments
719 -- NAME
720 --    Create_ParentActMetric
721 --
722 --
723 -- PURPOSE
724 --    Creates an association of a metric to a business object
725 --    by creating a record in AMS_ACT_METRICS_ALL by calling Create_ActMetric2.
726 --
727 -- NOTES
728 --
729 -- HISTORY
730 -- 07/11/2000   svatsa@us      Created.
731 -- 05/01/2001   dmvincen@us    Added return of the summarize actmetric.
732 --
733 -- End of comments
734 
735 PROCEDURE Create_ParentActMetric
736   (p_api_version                IN      NUMBER
737   ,p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE
738   ,p_commit                     IN  VARCHAR2 := Fnd_Api.G_FALSE
739   ,p_validation_level           IN  NUMBER   := Fnd_Api.G_Valid_Level_Full
740   ,p_act_metric_rec             IN OUT NOCOPY act_metric_rec_type
741   ,x_act_metric_id              OUT NOCOPY NUMBER
742   )
743 IS
744   -- Local variables to accept the out parameters from the api Create_ActMetric2
745   l_return_status      VARCHAR2(1);
746   l_msg_count          NUMBER;
747   l_msg_data           VARCHAR2(2000);
748 
749   -- Cursor to check if the entry for summary metric_id for
750   -- a given act_metric_used_by_id and arc_act_metric_used_by already exists
751   CURSOR c_exist_parent_entry (cv_metric_id NUMBER
752                               ,cv_act_metric_used_by_id  NUMBER
753                               ,cv_arc_act_metric_used_by VARCHAR2) IS
754     SELECT activity_metric_id
755     FROM   ams_act_metrics_all
756     WHERE  metric_id              = cv_metric_id
757     AND    act_metric_used_by_id  = cv_act_metric_used_by_id
758     AND    arc_act_metric_used_by = cv_arc_act_metric_used_by;
759 
760 
761   -- Local variable for storing the activity_metric_id selected by the cursor
762   -- c_exist_parent_entry
763   l_act_metric_id NUMBER;
764 
765 
766 BEGIN
767 
768   -- Check if the entry for summary metric already exists
769   OPEN  c_exist_parent_entry (p_act_metric_rec.metric_id
770                              ,p_act_metric_rec.act_metric_used_by_id
771                              ,p_act_metric_rec.arc_act_metric_used_by);
772   FETCH c_exist_parent_entry INTO l_act_metric_id;
773   CLOSE c_exist_parent_entry;
774 
775   -- Conditionally call the Api Create_ActMetric2 for creating
776   -- the record for summary metric
777   IF l_act_metric_id IS NULL THEN
778      Create_ActMetric2
779       (p_api_version        => p_api_version
780       ,p_init_msg_list      => p_init_msg_list
781       ,p_commit             => p_commit
782       ,p_validation_level   => p_validation_level
783       ,x_return_status      => l_return_status
784       ,x_msg_count          => l_msg_count
785       ,x_msg_data           => l_msg_data
786       ,p_act_metric_rec     => p_act_metric_rec
787       ,x_activity_metric_id => l_act_metric_id
788       );
789   END IF;
790 
791   x_act_metric_id := l_act_metric_id;
792 
793 END Create_ParentActMetric;
794 
795 ---------------------------------------------------------------------
796 -- PROCEDURE
797 --   GET_TRANS_CURR_CODE
798 --
799 -- PURPOSE
800 --    Finds the transaction currency code.
801 --
802 -- PARAMETERS
803 --   p_obj_id                   IN  NUMBER
804 --   p_obj_type                 IN  VARCHAR2
805 --   x_trans_curr_code          OUT NOCOPY VARCHAR2
806 --
807 -- NOTES
808 --
809 -- HISTORY
810 --  06/19/2001  DMVINCEN   Created
811 --
812 -- End of comments
813 ----------------------------------------------------------------------
814 PROCEDURE Get_Trans_curr_code
815   (p_obj_id                     IN  NUMBER
816   ,p_obj_type                   IN  VARCHAR2
817   ,x_trans_curr_code            OUT NOCOPY VARCHAR2
818   )
819 IS
820     -- select transaction_currency_code for campaign
821     CURSOR c_get_camp_trans_curr(l_obj_id       NUMBER) IS
822     SELECT transaction_currency_code
823     FROM ams_campaigns_all_b
824     WHERE campaign_id = l_obj_id;
825 
826     -- select transaction_currency_code for campaign schedule
827     CURSOR c_get_csch_trans_curr(l_obj_id       NUMBER) IS
828     SELECT transaction_currency_code
829     FROM ams_campaign_schedules_b
830     WHERE schedule_id = l_obj_id;
831 
832     -- select transaction_currency_code for event offer
833     CURSOR c_get_eveo_trans_curr(l_obj_id       NUMBER) IS
834     SELECT currency_code_tc
835     FROM ams_event_offers_all_b
836     WHERE event_offer_id = l_obj_id;
837 
838     -- select transaction_currency_code for event header
839     CURSOR c_get_eveh_trans_curr(l_obj_id       NUMBER) IS
840     SELECT currency_code_tc
841     FROM ams_event_headers_all_b
842     WHERE event_header_id = l_obj_id;
843 
844     -- select transaction_currency_code for deliverable
845     CURSOR c_get_delv_trans_curr(l_obj_id       NUMBER) IS
846     SELECT transaction_currency_code
847     FROM ams_deliverables_all_b
848     WHERE deliverable_id = l_obj_id;
849 
850     l_obj_trans_curr    VARCHAR2(15);
851 BEGIN
852    --Get the trans currency code for parent object
853    IF p_obj_type IN ('RCAM', 'CAMP') THEN
854       OPEN c_get_camp_trans_curr(p_obj_id);
855       FETCH c_get_camp_trans_curr INTO l_obj_trans_curr;
856       CLOSE c_get_camp_trans_curr;
857    ELSIF p_obj_type = 'CSCH' THEN
858       OPEN c_get_csch_trans_curr(p_obj_id);
859       FETCH c_get_csch_trans_curr INTO l_obj_trans_curr;
860       CLOSE c_get_csch_trans_curr;
861    ELSIF p_obj_type IN ('EONE', 'EVEO') THEN
862       OPEN c_get_eveo_trans_curr(p_obj_id);
863       FETCH c_get_eveo_trans_curr INTO l_obj_trans_curr;
864       CLOSE c_get_eveo_trans_curr;
865    ELSIF p_obj_type = 'EVEH' THEN
866       OPEN c_get_eveh_trans_curr(p_obj_id);
867       FETCH c_get_eveh_trans_curr INTO l_obj_trans_curr;
868       CLOSE c_get_eveh_trans_curr;
869    ELSIF p_obj_type = 'DELV' THEN
870       OPEN c_get_delv_trans_curr(p_obj_id);
871       FETCH c_get_delv_trans_curr INTO l_obj_trans_curr;
872       CLOSE c_get_delv_trans_curr;
873    END IF;
874         x_trans_curr_code  := l_obj_trans_curr;
875 END Get_Trans_curr_code;
876 
877 /* 10/11/2000 sveerave@us    Sync_rollup_currency */
878 ---------------------------------------------------------------------
879 -- PROCEDURE
880 --   SYNC_ROLLUP_CURRENCY
881 --
882 -- PURPOSE
883 --    Flips the trasaction currency code of rollup metrics to parent object's
884 --    transaction currency code and calls the refresh metrics API.
885 --
886 -- PARAMETERS
887 --   p_obj_id                   IN  NUMBER
888 --   p_obj_type                 IN  VARCHAR2
889 --  x_return_status             OUR VARCHAR2
890 --
891 -- NOTES
892 --    1. Get parent object's transaction currency code
893 --    2. Flip the rollup metrics currency to parent object's transaction
894 --                      currency code
895 --    3. Do the above only for ROLLUP metrics
896 --
897 -- HISTORY
898 -- 10/11/2000   SVEERAVE@us      Created.
899 --
900 -- End of comments
901 ----------------------------------------------------------------------
902 
903 PROCEDURE Sync_rollup_currency
904   (p_obj_id                     IN  NUMBER
905   ,p_obj_type                   IN  VARCHAR2
906   ,x_return_status              OUT NOCOPY VARCHAR2
907   ) IS
908 
909     -- select rollup metrics of currency category
910     CURSOR c_get_rollup_metrics(l_obj_id NUMBER, l_obj_type VARCHAR2) IS
911       SELECT activity_metric_id, transaction_currency_code,
912              trans_actual_value, trans_forecasted_value
913       FROM ams_act_metrics_all actmet, ams_metrics_all_b met
914       WHERE actmet.metric_id = met.metric_id
915       AND metric_calculation_type IN ('ROLLUP', 'SUMMARY')
916       AND arc_act_metric_used_by = l_obj_type
917       AND act_metric_used_by_id = l_obj_id
918       AND transaction_currency_code IS NOT NULL;
919 
920     -- Check the metrics category
921     CURSOR c_check_met_category(l_met_id NUMBER) IS
922     SELECT metric_category
923     FROM  ams_metrics_all_b
924     WHERE metric_id = l_met_id;
925 
926     --Local variables to accept the out parameters from the api Create_ActMetric2
927     l_msg_count          NUMBER;
928     l_msg_data           VARCHAR2(2000);
929     l_act_metric_id     NUMBER;
930     l_act_metric_trans_curr     VARCHAR2(15);
931     l_actual_val        NUMBER;
932     l_forecasted_val    NUMBER;
933     l_act_metric_rec    Ams_Actmetric_Pvt.act_metric_rec_type;
934     l_obj_trans_curr    VARCHAR2(15);
935 
936 BEGIN
937 
938   --Get all the ROLLUP currency type metrics for the passed in obj id, obj type
939    OPEN c_get_rollup_metrics(p_obj_id, p_obj_type);
940    LOOP
941       FETCH c_get_rollup_metrics
942          INTO l_act_metric_id, l_act_metric_trans_curr,
943               l_actual_val, l_forecasted_val ;
944       EXIT WHEN c_get_rollup_metrics%NOTFOUND;
945       --Get the trans currency code for current object
946       Get_Trans_curr_code(p_obj_id, p_obj_type, l_obj_trans_curr);
947 
948       -- Flip the currencies only when they are different.
949       IF l_obj_trans_curr <> l_act_metric_trans_curr THEN
950          -- Initialize ActMetric_Rec for the update
951          Init_ActMetric_Rec(x_act_metric_rec => l_act_metric_rec);
952          l_act_metric_rec.activity_metric_id  := l_act_metric_id;
953          l_act_metric_rec.transaction_currency_code := l_obj_trans_curr;
954          l_act_metric_rec.trans_actual_value := NULL;
955          l_act_metric_rec.trans_forecasted_value := NULL;
956 
957          -- Call the update API
958          Ams_Actmetric_Pvt.update_actmetric (
959                p_api_version                => 1.0,
960                p_act_metric_rec             => l_act_metric_rec,
961                x_return_status              => x_return_status,
962                x_msg_count                  => l_msg_count,
963                x_msg_data                   => l_msg_data);
964 
965          IF x_return_status = Fnd_Api.G_RET_STS_ERROR THEN
966             IF(l_msg_count > 0) THEN
967                FOR i IN 1 .. l_msg_count
968                LOOP
969                   l_msg_data := Fnd_Msg_Pub.get(i, Fnd_Api.g_false);
970                END LOOP;
971             END IF;
972             CLOSE c_get_rollup_metrics;
973             RAISE Fnd_Api.G_EXC_ERROR;
974          ELSIF x_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
975             CLOSE c_get_rollup_metrics;
976             RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
977          END IF; -- for IF l_return_status = FND_API.G_RET_STS_ERROR
978      END IF; --   IF l_obj_trans_curr <> l_act_metric_trans_curr THEN
979   END LOOP;
980   CLOSE c_get_rollup_metrics;
981 
982 END sync_rollup_currency;
983 
984 
985 -- Start of comments
986 -- NAME
987 --    Default_ActMetric
988 --
989 --
990 -- PURPOSE
991 --    Defaults the Activty Metric . also does Currency Conversion to
992 --    keep Transaction and currency Conversion in Sync.
993 --
994 -- NOTES
995 --
996 -- HISTORY
997 -- 10/25/1999   ptendulk   Created
998 -- 08/28/2000   SVEERAVE   Modified to convert/default metric values with
999 --                         currencies and with out currencies in case of manual
1000 --                         or non-manual type metrics.  Replaced API call for
1001 --                         currency conversions with centralized AMS_UTILITY_PVT
1002 --                         api.
1003 -- 10/11/2000   SVEERAVE   Defaulted trans_currency_code to be that of parent
1004 --                         object's
1005 -- End of comments
1006 
1007 PROCEDURE Default_ActMetric(
1008    p_init_msg_list          IN  VARCHAR2 := Fnd_Api.G_FALSE,
1009    --p_act_metric_rec         IN  act_metric_rec_type,
1010    p_validation_mode        IN  VARCHAR2 ,
1011    x_complete_rec           IN OUT NOCOPY act_metric_rec_type,
1012    x_return_status          OUT NOCOPY VARCHAR2,
1013    x_msg_count              OUT NOCOPY NUMBER,
1014    x_msg_data               OUT NOCOPY VARCHAR2
1015 )
1016 IS
1017    --huili@ 05/08/2001 to handle variable metrics
1018    CURSOR c_met_det(l_met_id NUMBER) IS
1019       SELECT sensitive_data_flag,
1020              default_uom_code,
1021              metric_calculation_type,
1022              metric_category, accrual_type,
1023              display_type
1024       FROM   ams_metrics_all_b
1025       WHERE  metric_id = l_met_id ;
1026 
1027    l_met_det_rec c_met_det%ROWTYPE ;
1028    l_obj_trans_curr     VARCHAR2(15);
1029    l_return_status              VARCHAR2(1);
1030    l_curr_return_status VARCHAR2(1) := Fnd_Api.G_RET_STS_SUCCESS;
1031    l_current_date       DATE := SYSDATE;
1032    l_trans_actual_value number;
1033    l_trans_forecasted_value number;
1034 
1035 BEGIN
1036    --
1037    -- Initialize message list if p_init_msg_list is set to TRUE.
1038    --
1039    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
1040       Fnd_Msg_Pub.Initialize;
1041    END IF;
1042 
1043    --
1044    -- Initialize API return status to success.
1045    --
1046    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1047 
1048 --   x_complete_rec := p_act_metric_rec;
1049 
1050 --   OPEN c_met_det(p_act_metric_rec.metric_id);
1051    OPEN c_met_det(x_complete_rec.metric_id);
1052    FETCH c_met_det INTO l_met_det_rec;
1053    CLOSE c_met_det;
1054 
1055    IF p_validation_mode = Jtf_Plsql_Api.g_create THEN
1056    -- Insert Mode
1057 
1058       -- Default Sensitive data Flag and UOM code if not sent to the API
1059       IF (x_complete_rec.sensitive_data_flag IS NULL OR
1060           x_complete_rec.metric_uom_code IS NULL) THEN
1061          IF x_complete_rec.sensitive_data_flag IS NULL  THEN
1062             x_complete_rec.sensitive_data_flag :=
1063                                         l_met_det_rec.sensitive_data_flag ;
1064          END IF;
1065          IF x_complete_rec.metric_uom_code IS NULL  THEN
1066             x_complete_rec.metric_uom_code := l_met_det_rec.default_uom_code;
1067          END IF;
1068       END IF ;
1069       -- DMVINCEN 05/25/2001: Added for posting data.
1070       IF l_met_det_rec.metric_category = 901 then
1071          x_complete_rec.published_flag := 'N';
1072       END IF;
1073    END IF ;
1074 
1075    -- Following code is Common for both Update and Insert Mode
1076 
1077    -- default the currencies.
1078 --   IF (l_met_det_rec.metric_category IN (901,902)) THEN
1079    IF (l_met_det_rec.metric_category IN (901,902) or
1080        l_met_det_rec.display_type = 'CURRENCY') THEN
1081       -- This default functional currency is the overriding currency even
1082       -- when the functional currency is passed.
1083       x_complete_rec.functional_currency_code := Default_Func_Currency;
1084 
1085       -- Default the transaction currency from the parent object's
1086       -- transaction currency.
1087       IF x_complete_rec.transaction_currency_code IS NULL OR
1088          l_met_det_rec.metric_calculation_type IN ('SUMMARY', 'ROLLUP') THEN
1089          Get_Trans_curr_code(x_complete_rec.act_metric_used_by_id,
1090             x_complete_rec.arc_act_metric_used_by, l_obj_trans_curr);
1091          IF l_obj_trans_curr IS NOT NULL THEN
1092             x_complete_rec.transaction_currency_code := l_obj_trans_curr;
1093          ELSE
1094             x_complete_rec.transaction_currency_code := Default_Func_Currency;
1095          END IF;
1096       --ELSE
1097       --   x_complete_rec.transaction_currency_code :=
1098       --      p_act_metric_rec.transaction_currency_code;
1099       END IF;
1100    ELSE -- Non currency metric.
1101       x_complete_rec.functional_currency_code := NULL;
1102       x_complete_rec.transaction_currency_code := NULL;
1103    END IF; -- for IF (l_met_det_rec.metric_category  IN (901,902)) THEN
1104 
1105    -- In case of manual metrics, drive with transaction values
1106    -- if 1) funcional and transaction values are not null or
1107    --    2) transactional is not null and functional is null
1108    -- otherwise, i.e. functional is not null and transaction is null
1109    --              drive with functional value.
1110 
1111    IF l_met_det_rec.metric_calculation_type IN ('MANUAL', 'FUNCTION') THEN
1112       IF x_complete_rec.transaction_currency_code IS NOT NULL AND
1113          x_complete_rec.transaction_currency_code <> Fnd_Api.G_MISS_CHAR THEN
1114 
1115          l_trans_actual_value := x_complete_rec.trans_actual_value;
1116          l_trans_forecasted_value := x_complete_rec.trans_forecasted_value;
1117          -- Round the transaction values to the Minimum Accountable Unit.
1118          Convert_Currency2 (
1119             x_return_status  => l_curr_return_status,
1120             p_from_currency  => x_complete_rec.transaction_currency_code,
1121             p_to_currency    => x_complete_rec.transaction_currency_code,
1122             p_conv_date      => l_current_date,
1123             p_from_amount    => l_trans_actual_value,
1124             x_to_amount      => x_complete_rec.trans_actual_value,
1125             p_from_amount2   => l_trans_forecasted_value,
1126             x_to_amount2     => x_complete_rec.trans_forecasted_value,
1127             p_round          => Fnd_Api.G_TRUE);
1128 
1129          IF (x_complete_rec.func_actual_value IS NOT NULL AND
1130              x_complete_rec.func_actual_value <> Fnd_Api.G_MISS_NUM) AND
1131             (x_complete_rec.trans_actual_value IS NULL
1132             /* OR l_met_det_rec.accrual_type = 'VARIABLE' */) THEN
1133 
1134             -- drive with func value
1135 
1136             Convert_Currency (
1137                x_return_status  => l_curr_return_status,
1138                p_from_currency  => x_complete_rec.functional_currency_code,
1139                p_to_currency    => x_complete_rec.transaction_currency_code,
1140                p_conv_date      => l_current_date,
1141                p_from_amount    => NVL(x_complete_rec.func_actual_value,0),
1142                x_to_amount      => x_complete_rec.trans_actual_value,
1143                p_round          => Fnd_Api.G_TRUE);
1144             IF l_curr_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
1145                RAISE Fnd_Api.G_EXC_ERROR;
1146             END IF;
1147          ELSIF x_complete_rec.trans_actual_value IS NOT NULL AND
1148             x_complete_rec.trans_actual_value <> Fnd_Api.G_MISS_NUM THEN
1149             -- drive with trans value
1150             Convert_Currency (
1151                x_return_status  => l_curr_return_status,
1152                p_from_currency  => x_complete_rec.transaction_currency_code,
1153                p_to_currency    => x_complete_rec.functional_currency_code,
1154                p_conv_date      => l_current_date,
1155                p_from_amount    => NVL(x_complete_rec.trans_actual_value,0),
1156                x_to_amount      => x_complete_rec.func_actual_value,
1157                p_round          => Fnd_Api.G_FALSE);
1158 
1159             IF l_curr_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
1160                RAISE Fnd_Api.G_EXC_ERROR;
1161             END IF;
1162          END IF;
1163 
1164          IF (x_complete_rec.func_forecasted_value IS NOT NULL AND
1165             x_complete_rec.func_forecasted_value <> Fnd_Api.G_MISS_NUM) AND
1166             (x_complete_rec.trans_forecasted_value IS NULL) THEN
1167             -- drive with func value
1168             Convert_Currency (
1169              x_return_status => l_curr_return_status,
1170              p_from_currency => x_complete_rec.functional_currency_code,
1171              p_to_currency   => x_complete_rec.transaction_currency_code,
1172              p_conv_date     => l_current_date,
1173              p_from_amount   => NVL(x_complete_rec.func_forecasted_value,0),
1174              x_to_amount     => x_complete_rec.trans_forecasted_value,
1175              p_round         => Fnd_Api.G_TRUE);
1176             IF l_curr_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
1177                RAISE Fnd_Api.G_EXC_ERROR;
1178             END IF;
1179          ELSIF (x_complete_rec.trans_forecasted_value IS NOT NULL AND
1180             x_complete_rec.trans_forecasted_value <> Fnd_Api.G_MISS_NUM) THEN
1181             --drive with trans value
1182             Convert_Currency (
1183                x_return_status => l_curr_return_status,
1184                p_from_currency => x_complete_rec.transaction_currency_code,
1185                p_to_currency   => x_complete_rec.functional_currency_code,
1186                p_conv_date     => l_current_date,
1187                p_from_amount   =>NVL(x_complete_rec.trans_forecasted_value,0),
1188                x_to_amount     => x_complete_rec.func_forecasted_value,
1189                p_round         => Fnd_Api.G_FALSE);
1190             IF l_curr_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
1191                RAISE Fnd_Api.G_EXC_ERROR;
1192             END IF;
1193 
1194          END IF;
1195 
1196       -- in case of non-currencies handle in the same way as above.
1197       ELSE
1198          IF (x_complete_rec.func_actual_value IS NOT NULL AND
1199             x_complete_rec.func_actual_value <> Fnd_Api.G_MISS_NUM) AND
1200             (x_complete_rec.trans_actual_value IS NULL) THEN
1201             -- drive with func value
1202             x_complete_rec.trans_actual_value :=
1203                                       x_complete_rec.func_actual_value;
1204          ELSE
1205             -- drive with trans value.
1206             x_complete_rec.func_actual_value :=
1207                                       x_complete_rec.trans_actual_value;
1208          END IF;
1209 
1210          IF (x_complete_rec.func_forecasted_value IS NOT NULL AND
1211             x_complete_rec.func_forecasted_value <> Fnd_Api.G_MISS_NUM) AND
1212             (x_complete_rec.trans_forecasted_value IS NULL) THEN
1213             -- drive with func value.
1214             x_complete_rec.trans_forecasted_value :=
1215                                       x_complete_rec.func_forecasted_value;
1216          ELSE
1217             -- drive with trans value.
1218             x_complete_rec.func_forecasted_value :=
1219                                       x_complete_rec.trans_forecasted_value;
1220          END IF;
1221 
1222       END IF; --IF  p_act_metric_rec.transaction_currency_code IS NOT NULL AND
1223 
1224         -- In case of non-manual metrics, drive with functional values
1225         -- if 1. funcional and transaction values are not null or
1226         --         2. functional is not null and transactional is null
1227         -- otherwise, i.e. transaction is not null and functional is null
1228         --    - drive with transactional value.
1229 
1230    ELSE  -- NOT MANUAL (SUMMARY,ROLLUP)
1231 
1232       -- Now do currency conversions if this metric is currency metric and
1233       -- transaction currency code is passed.
1234       IF  (x_complete_rec.transaction_currency_code IS NOT NULL AND
1235          x_complete_rec.transaction_currency_code <> Fnd_Api.G_MISS_CHAR) THEN
1236          -- Convert transaction amount to functional amount when only
1237          -- transaction amount is passed.
1238          IF (x_complete_rec.trans_actual_value IS NOT NULL AND
1239             x_complete_rec.trans_actual_value <> Fnd_Api.G_MISS_NUM) AND
1240             (x_complete_rec.func_actual_value IS NULL) THEN
1241             Convert_Currency (
1242                x_return_status => l_curr_return_status,
1243                p_from_currency => x_complete_rec.transaction_currency_code,
1244                p_to_currency   => x_complete_rec.functional_currency_code,
1245                p_conv_date     => l_current_date,
1246                p_from_amount   => NVL(x_complete_rec.trans_actual_value,0),
1247                x_to_amount     => x_complete_rec.func_actual_value,
1248                p_round         => Fnd_Api.G_FALSE);
1249             IF l_curr_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
1250                RAISE Fnd_Api.G_EXC_ERROR;
1251             END IF;
1252 
1253          -- drive with func values.
1254          ELSIF (x_complete_rec.func_actual_value IS NOT NULL AND
1255               x_complete_rec.func_actual_value <> Fnd_Api.G_MISS_NUM) THEN
1256             Convert_Currency (
1257                    x_return_status => l_curr_return_status,
1258                    p_from_currency => x_complete_rec.functional_currency_code,
1259                    p_to_currency   => x_complete_rec.transaction_currency_code,
1260                    p_conv_date     => l_current_date,
1261                    p_from_amount   => NVL(x_complete_rec.func_actual_value,0),
1262                    x_to_amount     => x_complete_rec.trans_actual_value,
1263                    p_round         => Fnd_Api.G_TRUE);
1264             IF l_curr_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
1265                RAISE Fnd_Api.G_EXC_ERROR;
1266             END IF;
1267 
1268          END IF; -- (p_act_metric_rec.trans_actual_value IS NOT NULL AND
1269 
1270          -- Convert forecasted values
1271          -- If func values are passed drive with them otherwise with
1272          -- trans values
1273 
1274          IF (x_complete_rec.trans_forecasted_value IS NOT NULL AND
1275             x_complete_rec.trans_forecasted_value <> Fnd_Api.G_MISS_NUM) AND
1276             (x_complete_rec.func_forecasted_value IS NULL) THEN
1277              Convert_Currency (
1278                 x_return_status => l_curr_return_status,
1279                 p_from_currency => x_complete_rec.transaction_currency_code,
1280                 p_to_currency   => x_complete_rec.functional_currency_code,
1281                 p_conv_date     => l_current_date,
1282                 p_from_amount => NVL(x_complete_rec.trans_forecasted_value,0),
1283                 x_to_amount     =>  x_complete_rec.func_forecasted_value,
1284                 p_round         => Fnd_Api.G_FALSE);
1285             IF l_curr_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
1286                RAISE Fnd_Api.G_EXC_ERROR;
1287             END IF;
1288 
1289          -- drive with func values.
1290          ELSIF (x_complete_rec.func_forecasted_value IS NOT NULL AND
1291               x_complete_rec.func_forecasted_value <> Fnd_Api.G_MISS_NUM) THEN
1292             Convert_Currency (
1293                 x_return_status => l_curr_return_status,
1294                 p_from_currency => x_complete_rec.functional_currency_code,
1295                 p_to_currency   => x_complete_rec.transaction_currency_code,
1296                 p_conv_date     => l_current_date,
1297                 p_from_amount  => NVL(x_complete_rec.func_forecasted_value,0),
1298                 x_to_amount     => x_complete_rec.trans_forecasted_value,
1299                 p_round         => Fnd_Api.G_TRUE);
1300             IF l_curr_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
1301                RAISE Fnd_Api.G_EXC_ERROR;
1302             END IF;
1303          END IF; --if for p_act_metric_rec.func_forecasted_value IS NOT NULL AND
1304 
1305       ELSE -- Transaction currency code is null
1306          IF (x_complete_rec.trans_actual_value IS NOT NULL AND
1307            x_complete_rec.trans_actual_value <> Fnd_Api.G_MISS_NUM) AND
1308            (x_complete_rec.func_actual_value IS NULL) THEN
1309             x_complete_rec.func_actual_value :=
1310                                          x_complete_rec.trans_actual_value;
1311          ELSE
1312             x_complete_rec.trans_actual_value :=
1313                                          x_complete_rec.func_actual_value;
1314          END IF;
1315          IF (x_complete_rec.trans_forecasted_value IS NOT NULL AND
1316            x_complete_rec.trans_forecasted_value <> Fnd_Api.G_MISS_NUM) AND
1317            (x_complete_rec.func_forecasted_value IS NULL) THEN
1318             x_complete_rec.func_forecasted_value :=
1319                                          x_complete_rec.trans_forecasted_value;
1320          ELSE
1321             x_complete_rec.trans_forecasted_value:=
1322                                          x_complete_rec.func_forecasted_value ;
1323          END IF;
1324       END IF;  --IF  p_act_metric_rec.transaction_currency_code IS NOT NULL
1325 
1326    END IF; -- IF l_met_det_rec.metric_calculation_type = 'MANUAL'
1327 
1328 /*EXCEPTION
1329   WHEN GL_CURRENCY_API.NO_RATE THEN
1330     IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1331       -- No rate exist for for given conversion date and type between
1332       -- transaction currency and functional currency
1333       FND_MESSAGE.Set_Name('AMS', 'AMS_METR_NO_RATE');
1334       FND_MSG_PUB.Add;
1335     END IF;
1336     x_return_status := FND_API.G_RET_STS_ERROR;
1337 
1338     -- If any error happens abort API.
1339     RETURN;
1340   WHEN GL_CURRENCY_API.INVALID_CURRENCY THEN
1341     IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1342       -- Atleast One of the two Currencies specified is invalid
1343       FND_MESSAGE.Set_Name('AMS', 'AMS_METR_INVALID_CURR');
1344       FND_MSG_PUB.Add;
1345     END IF;
1346     x_return_status := FND_API.G_RET_STS_ERROR;
1347 
1348     -- If any error happens abort API.
1349     RETURN;
1350 */
1351 END Default_ActMetric ;
1352 
1353 FUNCTION Check_Freeze_Status (
1354    p_object_type     IN  VARCHAR2,
1355 	p_object_id       IN  NUMBER,
1356    p_operation_mode  IN  VARCHAR2)  -- 'C','U','D' for Create, Update, or Delete
1357 RETURN VARCHAR2
1358 IS
1359    -- Cursors for checking of statuses when the object is active.
1360    -- Relevant in Update.
1361    CURSOR c_camp_active(id NUMBER) IS
1362       SELECT Fnd_Api.G_TRUE
1363       FROM ams_campaigns_all_b
1364       WHERE campaign_id = id
1365       AND status_code IN ('SUBMITTED_BA', 'ACTIVE');
1366 
1367    CURSOR c_csch_active(id NUMBER) IS
1368       SELECT Fnd_Api.G_TRUE
1369       FROM ams_campaign_schedules_b
1370       WHERE schedule_id = id
1371       AND status_code = 'ACTIVE';
1372 
1373    CURSOR c_delv_active(id NUMBER) IS
1374       SELECT Fnd_Api.G_TRUE
1375       FROM ams_deliverables_all_b
1376       WHERE deliverable_id = id
1377       AND status_code IN ('SUBMITTED_BA', 'AVAILABLE');
1378 
1379    CURSOR c_eveh_active(id NUMBER) IS
1380       SELECT Fnd_Api.G_TRUE
1381       FROM ams_event_headers_all_b
1382       WHERE event_header_id = id
1383       AND system_status_code IN ('ACTIVE',  'SUBMITTED_BA');
1384 
1385    CURSOR c_eveo_active(id NUMBER) IS
1386       SELECT Fnd_Api.G_TRUE
1387       FROM ams_event_offers_all_b
1388       WHERE event_offer_id = id
1389       AND system_status_code IN ('SUBMITTED_BA', 'ACTIVE');
1390 
1391    --sunkumar 04/30/2003
1392    -- Added cursors for checking of statuses when the object is active,
1393    -- completed or cancelled. Relevant in delete.
1394    CURSOR c_camp_delete(id NUMBER) IS
1395       SELECT Fnd_Api.G_TRUE
1396       FROM ams_campaigns_all_b
1397       WHERE campaign_id = id
1398       AND status_code IN ('SUBMITTED_BA', 'ACTIVE', 'COMPLETED', 'CANCELLED');
1399 
1400    CURSOR c_csch_delete(id NUMBER) IS
1401       SELECT Fnd_Api.G_TRUE
1402       FROM ams_campaign_schedules_b
1403       WHERE schedule_id = id
1404       AND status_code IN ('SUBMITTED_BA', 'ACTIVE', 'COMPLETED', 'CANCELLED');
1405 
1406    CURSOR c_delv_delete(id NUMBER) IS
1407       SELECT Fnd_Api.G_TRUE
1408       FROM ams_deliverables_all_b
1409       WHERE deliverable_id = id
1410       AND status_code IN ('SUBMITTED_BA', 'AVAILABLE', 'CANCELLED', 'ARCHIVED');
1411 
1412    CURSOR c_eveh_delete(id NUMBER) IS
1413       SELECT Fnd_Api.G_TRUE
1414       FROM ams_event_headers_all_b
1415       WHERE event_header_id = id
1416       AND system_status_code IN ('ACTIVE', 'CANCELLED', 'SUBMITTED_BA','COMPLETED');
1417 
1418    CURSOR c_eveo_delete(id NUMBER) IS
1419       SELECT Fnd_Api.G_TRUE
1420       FROM ams_event_offers_all_b
1421       WHERE event_offer_id = id
1422       AND system_status_code IN ('SUBMITTED_BA', 'ACTIVE', 'CANCELLED', 'COMPLETED');
1423 
1424    l_return_value VARCHAR2(1) := Fnd_Api.G_FALSE;
1425 
1426 BEGIN
1427    IF p_operation_mode =G_UPDATE THEN
1428 
1429       IF p_object_type IN ('RCAM', 'CAMP') THEN
1430          OPEN c_camp_active(p_object_id);
1431          FETCH c_camp_active INTO l_return_value;
1432          CLOSE c_camp_active;
1433 
1434       ELSIF (p_object_type = 'CSCH') THEN
1435          OPEN c_csch_active(p_object_id);
1436          FETCH c_csch_active INTO l_return_value;
1437          CLOSE c_csch_active;
1438 
1439       ELSIF (p_object_type = 'DELV') THEN
1440          OPEN c_delv_active(p_object_id);
1441          FETCH c_delv_active INTO l_return_value;
1442          CLOSE c_delv_active;
1443       -- choang - 04-jan-2005 - bug 4102008
1444       -- uncommented code to perform validation on events freeze status
1445       ELSIF (p_object_type = 'EVEH') THEN
1446          OPEN c_eveh_active(p_object_id);
1447          FETCH c_eveh_active INTO l_return_value;
1448          CLOSE c_eveh_active;
1449 
1450       ELSIF p_object_type IN ('EONE', 'EVEO') THEN
1451          OPEN c_eveo_active(p_object_id);
1452          FETCH c_eveo_active INTO l_return_value;
1453          CLOSE c_eveo_active;
1454      END IF;
1455 
1456    --sunkumar 04/30/2003
1457    --added logic for restriction on delete depending on object status
1458    ELSIF p_operation_mode =G_DELETE THEN
1459 
1460       IF p_object_type IN ('RCAM', 'CAMP') THEN
1461          OPEN c_camp_delete(p_object_id);
1462          FETCH c_camp_delete INTO l_return_value;
1463          CLOSE c_camp_delete;
1464 
1465       ELSIF (p_object_type = 'CSCH') THEN
1466          OPEN c_csch_delete(p_object_id);
1467          FETCH c_csch_delete INTO l_return_value;
1468          CLOSE c_csch_delete;
1469 
1470       ELSIF (p_object_type = 'DELV') THEN
1471          OPEN c_delv_delete(p_object_id);
1472          FETCH c_delv_delete INTO l_return_value;
1473          CLOSE c_delv_delete;
1474 
1475       ELSIF (p_object_type = 'EVEH') THEN
1476          OPEN c_eveh_delete(p_object_id);
1477          FETCH c_eveh_delete INTO l_return_value;
1478          CLOSE c_eveh_delete;
1479 
1480       ELSIF p_object_type IN ('EONE', 'EVEO') THEN
1481          OPEN c_eveo_delete(p_object_id);
1482          FETCH c_eveo_delete INTO l_return_value;
1483          CLOSE c_eveo_delete;
1484 
1485 
1486       END IF;
1487    END IF;
1488 
1489    return l_return_value;
1490 
1491 END;
1492 
1493 -- Start of comments
1494 -- NAME
1495 --    check_freeze_status
1496 --
1497 --
1498 -- PURPOSE
1499 --    Checks whether the budget is frozen by making a call-out for campaign API.
1500 --
1501 -- NOTES
1502 --    This method will be called in update, create, delete APIs
1503 --    to allow or not to allow opertaions intended.
1504 
1505 -- HISTORY
1506 -- 08/24/2000           SVEERAVE   Created.
1507 -- 09/13/2000           BGEORGE    modified
1508 -- 05/jan/2005          choang     bug 4102008(11.5.9) / 4104833(11.5.11)
1509 
1510 
1511 PROCEDURE Check_Freeze_Status (
1512    p_act_metric_rec             IN  act_metric_rec_type,
1513    p_operation_mode             IN  VARCHAR2 ,  -- 'C','U','D' for Create, Update, or Delete
1514    x_freeze_status              OUT NOCOPY VARCHAR2, -- True or False
1515    x_return_status              OUT NOCOPY VARCHAR2)
1516 
1517 IS
1518   l_return_value VARCHAR2(30);
1519 BEGIN
1520 
1521 	 l_return_value := Check_Freeze_Status(
1522 	    p_object_type => p_act_metric_rec.arc_act_metric_used_by,
1523 		 p_object_id => p_act_metric_rec.act_metric_used_by_id,
1524 		 p_operation_mode => p_operation_mode);
1525    --
1526    -- Initialize procedure return status to success.
1527    --
1528    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1529    -- make a call to API that will be provided in future, and based on that
1530    -- return OUT NOCOPY parameters.
1531    -- for time being, return FALSE always
1532    x_freeze_status := l_return_value;
1533 
1534 END;
1535 
1536 
1537 -- Start of comments
1538 -- NAME
1539 --    Create_ActMetric2
1540 --
1541 --
1542 -- PURPOSE
1543 --    Creates an association of a metric to a business
1544 --    object by creating a record in AMS_ACT_METRICS_ALL.
1545 --
1546 -- NOTES
1547 --
1548 -- HISTORY
1549 -- 05/26/1999   choang         Created.
1550 -- 10/9/1999    ptendulk       Modified According to new Standards
1551 -- 14/Apr-2000  tdonohoe@us    Added new columns for 11.5.2 into insert statement.
1552 -- 06-28-2000   rchahal@us     Modified to allow metric creation for Fund.
1553 -- 07/11/2000   svatsa@us      Updated the API to allow for creating Summary ActMetric
1554 --                             for a given metric_id.
1555 -- 08/24/2000    sveerave@us  Included call-out for check_freeze_status at beginning.
1556 -- End of comments
1557 
1558 PROCEDURE Create_ActMetric2 (
1559    p_api_version                IN  NUMBER,
1560    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
1561    p_commit                     IN  VARCHAR2 := Fnd_Api.G_FALSE,
1562    p_validation_level           IN  NUMBER   := Fnd_Api.G_Valid_Level_Full,
1563 
1564    x_return_status              OUT NOCOPY VARCHAR2,
1565    x_msg_count                  OUT NOCOPY NUMBER,
1566    x_msg_data                   OUT NOCOPY VARCHAR2,
1567 
1568    p_act_metric_rec             IN  act_metric_rec_type,
1569    x_activity_metric_id         OUT NOCOPY NUMBER
1570 )
1571 
1572 IS
1573    --
1574    -- Standard API information constants.
1575    --
1576    L_API_VERSION     CONSTANT NUMBER := 1.0;
1577    L_API_NAME        CONSTANT VARCHAR2(30) := 'Create_ActMetric2';
1578    L_FULL_NAME       CONSTANT VARCHAR2(60) := G_PKG_NAME ||'.'|| L_API_NAME;
1579 
1580 
1581    l_return_status   VARCHAR2(1); -- Return value from procedures.
1582    l_act_metrics_rec act_metric_rec_type := p_act_metric_rec;
1583 
1584    -- huili@ added on 05/08/2001
1585    l_dep_act_metric_rec act_metric_rec_type;
1586    l_dep_act_met_id NUMBER;
1587    -- end
1588 
1589    l_act_metr_count     NUMBER ;
1590 
1591 
1592    CURSOR c_act_metr_count(l_act_metric_id IN NUMBER) IS
1593       SELECT COUNT(1)
1594       FROM   ams_act_metrics_all
1595       WHERE  activity_metric_id = l_act_metric_id;
1596 
1597    CURSOR c_act_met_id IS
1598       SELECT ams_act_metrics_all_s.NEXTVAL
1599       FROM   dual;
1600 
1601   -- 05/07/2001 huili for checking the "VARIABLE"
1602   --CURSOR c_dep_info (l_metric_id NUMBER) IS
1603   --  SELECT accrual_type, compute_using_function
1604   --  FROM ams_metrics_all_b
1605   --  WHERE metric_id = l_metric_id;
1606 
1607   -- 06/27/2001 huili changed to check enable flag of a metric
1608   --CURSOR c_met_enflag (l_met_id NUMBER) IS
1609   --  SELECT enabled_flag,
1610   --       FROM ams_metrics_all_b
1611   --       WHERE metric_id = l_met_id;
1612 
1613   CURSOR c_met_info (l_met_id NUMBER) IS
1614     SELECT enabled_flag,  metric_calculation_type,
1615            summary_metric_id, sensitive_data_flag,
1616            accrual_type, compute_using_function
1617     FROM ams_metrics_all_b
1618     WHERE metric_id = l_met_id;
1619   l_met_info c_met_info%ROWTYPE;
1620 
1621   CURSOR c_get_multiplier_metric(l_metric_id INTEGER,
1622         l_object_type VARCHAR2, l_object_id INTEGER)
1623    IS
1624    SELECT activity_metric_id
1625      FROM ams_act_metrics_all
1626     WHERE arc_act_metric_used_by = l_object_type
1627       AND act_metric_used_by_id = l_object_id
1628       AND metric_id = l_metric_id;
1629 
1630   l_depend_act_metric_id INTEGER;
1631   l_accrual_type VARCHAR2(30);
1632   l_compute_using_function VARCHAR2(4000);
1633 
1634   -- Local variables to hold the values returned by the
1635   -- cursor c_get_parent_metric
1636   l_summary_metric_id   NUMBER;
1637   l_sensitive_data_flag VARCHAR2(1);
1638   -- Local record variable for the parent metric
1639   l_parent_act_metrics_rec  act_metric_rec_type; -- := p_act_metric_rec;
1640   l_freeze_status                       VARCHAR2(1):= Fnd_Api.G_FALSE;
1641   l_summarize_to_metric NUMBER;
1642   l_today DATE := SYSDATE;
1643   l_org_id         NUMBER;
1644 
1645 BEGIN
1646    --
1647    -- Initialize savepoint.
1648    --
1649    --SAVEPOINT Create_ActMetric2_pvt;
1650 
1651    IF (AMS_DEBUG_HIGH_ON) THEN
1652       Ams_Utility_Pvt.Debug_Message(l_full_name||': start');
1653    END IF;
1654 
1655 
1656    l_org_id := fnd_profile.value('DEFAULT_ORG_ID');
1657 
1658    --
1659    -- Initialize message list if p_init_msg_list is set to TRUE.
1660    --
1661    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
1662       Fnd_Msg_Pub.Initialize;
1663    END IF;
1664 
1665    --
1666    -- Standard check for API version compatibility.
1667    --
1668    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
1669                                        p_api_version,
1670                                        L_API_NAME,
1671                                        G_PKG_NAME)
1672    THEN
1673       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1674    END IF;
1675 
1676    --
1677    -- Initialize API return status to success.
1678    --
1679    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1680    x_activity_metric_id := NULL;
1681    --
1682    -- Begin API Body.
1683    --
1684 
1685    OPEN c_met_info (p_act_metric_rec.metric_id);
1686    FETCH c_met_info INTO l_met_info;
1687    l_summary_metric_id := l_met_info.summary_metric_id;
1688    l_sensitive_data_flag := l_met_info.sensitive_data_flag;
1689    l_accrual_type := l_met_info.accrual_type;
1690    l_compute_using_function := l_met_info.compute_using_function;
1691    IF UPPER(l_met_info.metric_calculation_type) = 'FUNCTION' THEN
1692       l_act_metrics_rec.trans_actual_value := NULL;
1693       l_act_metrics_rec.func_actual_value := NULL;
1694    END IF;
1695    CLOSE c_met_info;
1696 
1697    IF UPPER(l_met_info.enabled_flag) = 'N'
1698     AND UPPER(l_met_info.metric_calculation_type) IN ('MANUAL', 'FUNCTION') THEN
1699       -- choang - 26-dec-2002 - ignore the metric when create activity metric
1700       --                        requested.
1701       IF (AMS_DEBUG_HIGH_ON) THEN
1702          Ams_Utility_Pvt.Debug_Message(l_full_name||': ignore metric id: ' || p_act_metric_rec.metric_id);
1703       END IF;
1704 
1705       RETURN;
1706 --      l_return_status := Fnd_Api.G_RET_STS_ERROR;
1707 --      RAISE Fnd_Api.G_EXC_ERROR;
1708    END IF;
1709    -- END
1710 
1711    -- Make a call-out to check the frozen status.
1712    -- If it is frozen, disallow the operation.
1713    Check_Freeze_Status (p_act_metric_rec,
1714                         G_CREATE, -- Create is operation mode
1715                         l_freeze_status,
1716                         l_return_status);
1717 
1718    IF (l_freeze_status = Fnd_Api.G_TRUE)  THEN
1719           -- frozen to create the record
1720       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
1721          Fnd_Message.Set_Name('AMS', 'AMS_METR_FROZEN');
1722          Fnd_Msg_Pub.ADD;
1723       END IF;
1724                 l_return_status := Fnd_Api.G_RET_STS_ERROR;
1725         END IF;
1726    -- If it is frozen, or any errors happen abort API.
1727 
1728    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
1729       RAISE Fnd_Api.G_EXC_ERROR;
1730    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
1731       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1732    END IF;
1733 
1734    -- Check for existence of parent metric for this given metric_id
1735    IF l_summary_metric_id IS NOT NULL THEN
1736      -- Initialize the record variable for not null values
1737      l_parent_act_metrics_rec.act_metric_used_by_id  :=
1738                                     l_act_metrics_rec.act_metric_used_by_id;
1739      l_parent_act_metrics_rec.arc_act_metric_used_by :=
1740                                     l_act_metrics_rec.arc_act_metric_used_by;
1741      l_parent_act_metrics_rec.application_id         :=
1742                                     l_act_metrics_rec.application_id;
1743      l_parent_act_metrics_rec.sensitive_data_flag    := l_sensitive_data_flag;
1744      l_parent_act_metrics_rec.metric_id              := l_summary_metric_id;
1745      l_parent_act_metrics_rec.dirty_flag             := G_IS_DIRTY;
1746 
1747      -- Create a conditional entry for the parent metric.
1748      -- Conditional test is in Create_ParentActMetric.
1749      Create_ParentActMetric
1750          (p_api_version      => p_api_version
1751          ,p_init_msg_list    => p_init_msg_list
1752          ,p_commit           => Fnd_Api.g_false
1753          ,p_validation_level => p_validation_level
1754          ,p_act_metric_rec   => l_parent_act_metrics_rec
1755          ,x_act_metric_id    => l_summarize_to_metric
1756          );
1757 
1758    END IF;
1759 
1760    l_act_metrics_rec.summarize_to_metric := l_summarize_to_metric;
1761 
1762    IF l_act_metrics_rec.hierarchy_type = FND_API.G_MISS_CHAR then
1763         l_act_metrics_rec.hierarchy_type := NULL;
1764    END IF;
1765    IF l_act_metrics_rec.status_code = FND_API.G_MISS_CHAR then
1766         l_act_metrics_rec.status_code := NULL;
1767    END IF;
1768    IF l_act_metrics_rec.method_code = FND_API.G_MISS_CHAR then
1769         l_act_metrics_rec.method_code := NULL;
1770    END IF;
1771    IF l_act_metrics_rec.action_code = FND_API.G_MISS_CHAR then
1772         l_act_metrics_rec.action_code := NULL;
1773    END IF;
1774    IF l_act_metrics_rec.basis_year = FND_API.G_MISS_NUM then
1775         l_act_metrics_rec.basis_year := NULL;
1776    END IF;
1777    IF l_act_metrics_rec.ex_start_node = FND_API.G_MISS_CHAR then
1778         l_act_metrics_rec.ex_start_node := NULL;
1779    END IF;
1780 
1781 
1782    -- Default Sensitive data Flag, UOM code if not sent to the API
1783    -- Do Currency Conversion after defaulting functional currency code
1784    Default_ActMetric(
1785             p_init_msg_list       => p_init_msg_list,
1786             --p_act_metric_rec      => l_act_metrics_rec,
1787             p_validation_mode     => Jtf_Plsql_Api.g_create,
1788             x_complete_rec        => l_act_metrics_rec,
1789             x_return_status       => l_return_status,
1790             x_msg_count           => x_msg_count,
1791             x_msg_data            => x_msg_data
1792         );
1793 
1794    -- If any errors happen abort API.
1795    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
1796       RAISE Fnd_Api.G_EXC_ERROR;
1797    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
1798       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1799    END IF;
1800 
1801    --
1802    -- Validate the record before inserting.
1803    --
1804    Validate_ActMetric (
1805       p_api_version               => l_api_version,
1806       p_init_msg_list             => p_init_msg_list,
1807       p_validation_level          => p_validation_level,
1808       x_msg_count                 => x_msg_count,
1809       x_msg_data                  => x_msg_data,
1810       x_return_status             => l_return_status,
1811       p_act_metric_rec            => l_act_metrics_rec
1812    );
1813 
1814    -- If any errors happen abort API.
1815    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
1816       RAISE Fnd_Api.G_EXC_ERROR;
1817    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
1818       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1819    END IF;
1820 
1821    --
1822    -- Debug message.
1823    --
1824    IF (AMS_DEBUG_HIGH_ON) THEN
1825       Ams_Utility_Pvt.debug_message(l_full_name ||': insert');
1826    END IF;
1827 
1828    IF l_act_metrics_rec.activity_metric_id IS NULL THEN
1829       LOOP
1830       --
1831       -- Set the value for the PK.
1832          OPEN c_act_met_id;
1833          FETCH c_act_met_id INTO l_act_metrics_rec.activity_metric_id;
1834          CLOSE c_act_met_id;
1835 
1836          OPEN  c_act_metr_count(l_act_metrics_rec.activity_metric_id);
1837          FETCH c_act_metr_count INTO l_act_metr_count ;
1838          CLOSE c_act_metr_count ;
1839 
1840          EXIT WHEN l_act_metr_count = 0 ;
1841       END LOOP ;
1842    END IF;
1843 
1844 
1845 
1846       IF (AMS_DEBUG_HIGH_ON) THEN
1847          Ams_Utility_Pvt.Debug_Message(l_full_name||': The org id is ' || l_org_id);
1848       END IF;
1849    --
1850    -- Insert into the base table.
1851    --
1852    INSERT INTO ams_act_metrics_all (
1853          activity_metric_id,
1854          creation_date,
1855          created_by,
1856          last_update_date,
1857          last_updated_by,
1858          last_update_login,
1859          object_version_number,
1860          act_metric_used_by_id,
1861          arc_act_metric_used_by,
1862          purchase_req_raised_flag,
1863          application_id,
1864          sensitive_data_flag,
1865          budget_id,
1866          metric_id,
1867          transaction_currency_code,
1868          trans_forecasted_value,
1869          trans_committed_value,
1870          trans_actual_value,
1871          functional_currency_code,
1872          func_forecasted_value,
1873          dirty_flag,
1874          func_committed_value,
1875          func_actual_value,
1876          last_calculated_date,
1877          variable_value,
1878          forecasted_variable_value,
1879          computed_using_function_value,
1880          metric_uom_code,
1881          org_id,
1882          attribute_category,
1883          difference_since_last_calc,
1884          activity_metric_origin_id,
1885          arc_activity_metric_origin,
1886          days_since_last_refresh,
1887          scenario_id,
1888          SUMMARIZE_TO_METRIC,
1889          hierarchy_id,
1890          start_node,
1891          from_level,
1892          to_level,
1893          from_date,
1894          TO_DATE,
1895          amount1,
1896          amount2,
1897          amount3,
1898          percent1,
1899          percent2,
1900          percent3,
1901          published_flag,
1902          pre_function_name,
1903          post_function_name,
1904          attribute1,
1905          attribute2,
1906          attribute3,
1907          attribute4,
1908          attribute5,
1909          attribute6,
1910          attribute7,
1911          attribute8,
1912          attribute9,
1913          attribute10,
1914          attribute11,
1915          attribute12,
1916          attribute13,
1917          attribute14,
1918          attribute15,
1919          description,
1920          act_metric_date,
1921          depend_act_metric,
1922          function_used_by_id,
1923          arc_function_used_by,
1924          /* 05/15/2002 yzhao: 11.5.9 add 6 new columns for top-down bottom-up budgeting */
1925          hierarchy_type,
1926          status_code,
1927          method_code,
1928          action_code,
1929          basis_year,
1930          ex_start_node
1931          /* 05/15/2002 yzhao: add ends */
1932    )
1933    VALUES (
1934         l_act_metrics_rec.activity_metric_id,
1935         l_today,
1936         Fnd_Global.User_ID,
1937         l_today,
1938         Fnd_Global.User_ID,
1939         Fnd_Global.Conc_Login_ID,
1940          1, --Object Version Number
1941          l_act_metrics_rec.act_metric_used_by_id,
1942          l_act_metrics_rec.arc_act_metric_used_by,
1943          NVL(l_act_metrics_rec.purchase_req_raised_flag,'N'),
1944          l_act_metrics_rec.application_id,
1945          l_act_metrics_rec.sensitive_data_flag,
1946          l_act_metrics_rec.budget_id,
1947          l_act_metrics_rec.metric_id,
1948          l_act_metrics_rec.transaction_currency_code,
1949          l_act_metrics_rec.trans_forecasted_value,
1950          l_act_metrics_rec.trans_committed_value,
1951          l_act_metrics_rec.trans_actual_value,
1952          l_act_metrics_rec.functional_currency_code,
1953          l_act_metrics_rec.func_forecasted_value,
1954          NVL(l_act_metrics_rec.dirty_flag,G_IS_DIRTY),
1955          l_act_metrics_rec.func_committed_value,
1956          l_act_metrics_rec.func_actual_value,
1957          l_act_metrics_rec.last_calculated_date,
1958          l_act_metrics_rec.variable_value,
1959         l_act_metrics_rec.forecasted_variable_value,
1960          l_act_metrics_rec.computed_using_function_value,
1961          l_act_metrics_rec.metric_uom_code,
1962          l_org_id, --TO_NUMBER (SUBSTRB (USERENV ('CLIENT_INFO'), 1, 10)) , -- org_id
1963          l_act_metrics_rec.attribute_category,
1964          l_act_metrics_rec.difference_since_last_calc,
1965          l_act_metrics_rec.activity_metric_origin_id,
1966          l_act_metrics_rec.arc_activity_metric_origin,
1967          l_act_metrics_rec.days_since_last_refresh,
1968          l_act_metrics_rec.scenario_id,
1969          l_act_metrics_rec.SUMMARIZE_TO_METRIC,
1970          l_act_metrics_rec.hierarchy_id,
1971         l_act_metrics_rec.start_node,
1972         l_act_metrics_rec.from_level,
1973         l_act_metrics_rec.to_level,
1974         l_act_metrics_rec.from_date,
1975         l_act_metrics_rec.TO_DATE,
1976         l_act_metrics_rec.amount1,
1977         l_act_metrics_rec.amount2,
1978         l_act_metrics_rec.amount3,
1979         l_act_metrics_rec.percent1,
1980         l_act_metrics_rec.percent2,
1981         l_act_metrics_rec.percent3,
1982         l_act_metrics_rec.published_flag,
1983         l_act_metrics_rec.pre_function_name,
1984         l_act_metrics_rec.post_function_name,
1985         l_act_metrics_rec.attribute1,
1986         l_act_metrics_rec.attribute2,
1987         l_act_metrics_rec.attribute3,
1988         l_act_metrics_rec.attribute4,
1989         l_act_metrics_rec.attribute5,
1990         l_act_metrics_rec.attribute6,
1991         l_act_metrics_rec.attribute7,
1992         l_act_metrics_rec.attribute8,
1993         l_act_metrics_rec.attribute9,
1994         l_act_metrics_rec.attribute10,
1995         l_act_metrics_rec.attribute11,
1996         l_act_metrics_rec.attribute12,
1997         l_act_metrics_rec.attribute13,
1998         l_act_metrics_rec.attribute14,
1999         l_act_metrics_rec.attribute15,
2000         l_act_metrics_rec.description,
2001         l_act_metrics_rec.act_metric_date,
2002         l_act_metrics_rec.depend_act_metric,
2003         l_act_metrics_rec.function_used_by_id,
2004         l_act_metrics_rec.arc_function_used_by,
2005         /* 05/15/2002 yzhao: 11.5.9 add 6 new columns for top-down bottom-up budgeting */
2006         l_act_metrics_rec.hierarchy_type,
2007         l_act_metrics_rec.status_code,
2008         l_act_metrics_rec.method_code,
2009         l_act_metrics_rec.action_code,
2010         l_act_metrics_rec.basis_year,
2011         l_act_metrics_rec.ex_start_node
2012         /* 05/15/2002 yzhao: add ends */
2013      );
2014 
2015    -- huili@ 04/19/2001
2016    --OPEN c_dep_info (l_act_metrics_rec.metric_id);
2017    --FETCH c_dep_info INTO l_accrual_type, l_compute_using_function;
2018    --CLOSE c_dep_info;
2019 
2020    IF l_accrual_type IS NOT NULL
2021       AND l_accrual_type = G_VARIABLE
2022       AND l_compute_using_function IS NOT NULL THEN
2023 
2024    IF (AMS_DEBUG_HIGH_ON) THEN
2025       Ams_Utility_Pvt.Debug_Message(l_full_name||': Variable Metric id='||
2026          l_act_metrics_rec.metric_id);
2027       Ams_Utility_Pvt.Debug_Message(l_full_name||': compute_using_function='||
2028          l_compute_using_function||'.');
2029    END IF;
2030 
2031       -- Check for a multiplier metric.
2032       OPEN c_get_multiplier_metric(TO_NUMBER(l_compute_using_function),
2033           l_act_metrics_rec.arc_act_metric_used_by,
2034           l_act_metrics_rec.act_metric_used_by_id);
2035       l_depend_act_metric_id := NULL;
2036       FETCH c_get_multiplier_metric INTO l_depend_act_metric_id;
2037       CLOSE c_get_multiplier_metric;
2038 
2039       -- If a multiplier metric does not exist create one.
2040       IF l_depend_act_metric_id IS NULL THEN
2041 
2042          l_dep_act_metric_rec.depend_act_metric :=
2043             l_act_metrics_rec.activity_metric_id;
2044          l_dep_act_metric_rec.metric_id :=
2045             TO_NUMBER(l_compute_using_function);
2046          l_dep_act_metric_rec.act_metric_used_by_id :=
2047             l_act_metrics_rec.act_metric_used_by_id;
2048          l_dep_act_metric_rec.arc_act_metric_used_by :=
2049             l_act_metrics_rec.arc_act_metric_used_by;
2050          l_dep_act_metric_rec.application_id :=
2051             l_act_metrics_rec.application_id;
2052          l_dep_act_metric_rec.sensitive_data_flag :=
2053             l_act_metrics_rec.sensitive_data_flag;
2054          l_dep_act_metric_rec.budget_id :=
2055             l_act_metrics_rec.budget_id;
2056          l_dep_act_metric_rec.description :=
2057             l_act_metrics_rec.description;
2058          l_dep_act_metric_rec.dirty_flag := G_IS_DIRTY;
2059          Create_ActMetric2 (
2060             p_api_version           => p_api_version,
2061             p_init_msg_list         => p_init_msg_list,
2062             p_commit                => p_commit,
2063             p_validation_level      => p_validation_level,
2064             x_return_status         => l_return_status,
2065             x_msg_count             => x_msg_count,
2066             x_msg_data              => x_msg_data,
2067             p_act_metric_rec        => l_dep_act_metric_rec,
2068             x_activity_metric_id    => l_dep_act_met_id);
2069          -- If any errors happen abort API.
2070          IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2071             RAISE Fnd_Api.G_EXC_ERROR;
2072          ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2073             RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2074          END IF;
2075 
2076 --   dmvincen 02/10/2004: no longer useful.
2077 --      UPDATE ams_act_metrics_all
2078 --      SET depend_act_metric = l_dep_act_met_id
2079 --      WHERE activity_metric_id = l_act_metrics_rec.activity_metric_id;
2080       END IF;
2081    END IF;
2082    -- finish addition
2083 
2084   -- Record this record in history table.
2085   Record_History(l_act_metrics_rec.activity_metric_id, G_CREATE,
2086                  l_return_status, x_msg_count, x_msg_data);
2087 
2088   -- update all the parent object's rollup metrics or this object's summary
2089   -- metrics dirty_flag to 'Y' -- SVEERAVE, 10/13/00
2090   IF NVL(l_act_metrics_rec.dirty_flag,G_IS_DIRTY) = G_IS_DIRTY THEN
2091     Make_ActMetric_Dirty(l_act_metrics_rec.activity_metric_id);
2092   END IF;
2093 
2094 -- finish
2095 
2096    --
2097    -- Set OUT NOCOPY value.
2098    --
2099    x_activity_metric_id := l_act_metrics_rec.activity_metric_id;
2100 
2101    --
2102    -- End API Body.
2103    --
2104 
2105    --
2106    -- Standard check for commit request.
2107    --
2108    --IF Fnd_Api.To_Boolean (p_commit) THEN
2109    --   COMMIT WORK;
2110    --END IF;
2111 
2112    --
2113    -- Standard API to get message count, and if 1,
2114    -- set the message data OUT NOCOPY variable.
2115    --
2116    --Fnd_Msg_Pub.Count_And_Get (
2117    --   p_count           =>    x_msg_count,
2118    --   p_data            =>    x_msg_data,
2119    --   p_encoded         =>    Fnd_Api.G_FALSE
2120    --);
2121 
2122       --
2123    -- Add success message to message list.
2124    --
2125    IF (AMS_DEBUG_HIGH_ON) THEN
2126       Ams_Utility_Pvt.debug_message(l_full_name ||': end Success');
2127    END IF;
2128 
2129 /*
2130 EXCEPTION
2131    WHEN Fnd_Api.G_EXC_ERROR THEN
2132       ROLLBACK TO Create_ActMetric2_pvt;
2133       --ROLLBACK;
2134       x_return_status := Fnd_Api.G_RET_STS_ERROR;
2135       Fnd_Msg_Pub.Count_And_Get (
2136          p_count         =>     x_msg_count,
2137          p_data          =>     x_msg_data,
2138          p_encoded         =>   FND_API.G_FALSE
2139       );
2140    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2141       ROLLBACK TO Create_ActMetric2_pvt;
2142       --ROLLBACK;
2143       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2144       Fnd_Msg_Pub.Count_And_Get (
2145          p_count         =>     x_msg_count,
2146          p_data          =>     x_msg_data,
2147          p_encoded         =>   FND_API.G_FALSE
2148       );
2149    WHEN OTHERS THEN
2150       ROLLBACK TO Create_ActMetric2_pvt;
2151       --ROLLBACK;
2152       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2153       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2154          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
2155       END IF;
2156       Fnd_Msg_Pub.Count_And_Get (
2157          p_count         =>     x_msg_count,
2158          p_data          =>     x_msg_data,
2159          p_encoded       =>   FND_API.G_FALSE
2160       );
2161 */
2162 END Create_ActMetric2;
2163 
2164 -- Start of comments
2165 -- NAME
2166 --    Update_ActMetric
2167 --
2168 -- PURPOSE
2169 --   Updates a metric in AMS_ACT_METRICS_ALL given the
2170 --   record for the metrics.
2171 --
2172 -- NOTES
2173 --
2174 -- HISTORY
2175 -- 05/26/1999   choang         Created.
2176 -- 10/9/1999    ptendulk       Modified According to new Standards
2177 -- 17-Apr-2000  tdonohoe       Added new columns to Update statement to
2178 --                             support 11.5.2 release.
2179 -- 08/24/2000    sveerave@us  Included call-out for check_freeze_status at
2180 --                            beginning.
2181 -- 05/07/2001   huili@        Added invalidating corresponding variable metrics
2182 -- End of comments
2183 
2184 
2185 
2186 
2187 PROCEDURE Update_ActMetric (
2188    p_api_version                IN  NUMBER,
2189    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
2190    p_commit                     IN  VARCHAR2 := Fnd_Api.G_FALSE,
2191    p_validation_level           IN  NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
2192 
2193    x_return_status              OUT NOCOPY VARCHAR2,
2194    x_msg_count                  OUT NOCOPY NUMBER,
2195    x_msg_data                   OUT NOCOPY VARCHAR2,
2196    p_act_metric_rec             IN  act_metric_rec_type
2197 )
2198 IS
2199    L_API_VERSION    CONSTANT NUMBER := 1.0;
2200    L_API_NAME       CONSTANT VARCHAR2(30) := 'UPDATE_ACTMETRIC';
2201    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2202 
2203    l_return_status   VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
2204    l_actmet_rec act_metric_rec_type := p_act_metric_rec;
2205    l_freeze_status   VARCHAR2(1) := Fnd_Api.G_FALSE;
2206    l_reprocess_rec   VARCHAR2(1) := Fnd_Api.G_FALSE;
2207 
2208    -- huili@ added to invalidate corresponding activity variable metrics
2209    l_depend_act_metric NUMBER;
2210    CURSOR c_check_var_met (l_activity_metric_id NUMBER) IS
2211       SELECT depend_act_metric
2212       FROM ams_act_metrics_all a, ams_metrics_all_b b
2213       WHERE activity_metric_id = l_activity_metric_id
2214       AND a.metric_id = b.metric_id
2215       AND b.accrual_type <> G_VARIABLE;
2216    -- end
2217 
2218 --    CURSOR c_get_calc_type (l_metric_id NUMBER) IS
2219 --                 SELECT metric_calculation_type
2220 --                   FROM ams_metrics_all_b
2221 --                  WHERE metric_id = l_metric_id;
2222    l_calc_type VARCHAR2(10);
2223    l_cost_table OZF_Fund_Adjustment_Pvt.cost_tbl_type;
2224    l_cost_rec OZF_Fund_Adjustment_Pvt.cost_rec_type;
2225 
2226 BEGIN
2227 
2228 
2229 
2230    IF (AMS_DEBUG_HIGH_ON) THEN
2231 
2232    Ams_Utility_Pvt.debug_message('Now updating act met id: '||p_act_metric_rec.activity_metric_id);
2233 
2234    END IF;
2235    --
2236    -- Initialize savepoint.
2237    --
2238    SAVEPOINT Update_ActMetric_pvt;
2239    --
2240    -- Output debug message.
2241    --
2242    IF (AMS_DEBUG_HIGH_ON) THEN
2243    Ams_Utility_Pvt.debug_message(l_full_name||': start');
2244    END IF;
2245    --
2246    -- Initialize message list if p_init_msg_list is set to TRUE.
2247    --
2248    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
2249       Fnd_Msg_Pub.Initialize;
2250    END IF;
2251 
2252    --
2253    -- Standard check for API version compatibility.
2254    --
2255    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
2256                                        p_api_version,
2257                                        L_API_NAME,
2258                                        G_PKG_NAME)
2259    THEN
2260       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2261    END IF;
2262 
2263    --
2264    -- Initialize API return status to success.
2265    --
2266    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2267 
2268    --
2269    -- Begin API Body
2270    --
2271    -- Debug Message
2272 
2273    IF (AMS_DEBUG_HIGH_ON) THEN
2274       Ams_Utility_Pvt.debug_message(l_full_name ||': validate');
2275    END IF;
2276 
2277    -- BUG4391308: Added locking to prevent overwriting.
2278    Lock_ActMetric ( 1.0, fnd_api.G_FALSE,
2279              l_return_status, x_msg_count, x_msg_data,
2280              l_actmet_rec.activity_metric_id,
2281              l_actmet_rec.object_version_number);
2282 
2283    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2284       RAISE Fnd_Api.G_EXC_ERROR;
2285    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2286       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2287    END IF;
2288    -- BUG4391308: End
2289 
2290    -- replace g_miss_char/num/date with current column values
2291    Complete_ActMetric_Rec(p_act_metric_rec, l_actmet_rec);
2292 
2293 
2294    IF (AMS_DEBUG_HIGH_ON) THEN
2295       Ams_Utility_Pvt.debug_message(l_full_name ||': select calc type, metric_id ='||l_actmet_rec.metric_id);
2296    END IF;
2297 
2298    SELECT metric_calculation_type
2299      INTO l_calc_type
2300      FROM ams_metrics_all_b
2301     WHERE metric_id = l_actmet_rec.metric_id;
2302 
2303    -- Data entegrity check.
2304    IF l_calc_type IN ('SUMMARY', 'ROLLUP','FORMULA') THEN
2305       l_actmet_rec.published_flag := NULL;
2306    ELSIF l_actmet_rec.published_flag NOT IN ('Y', 'N', 'T') THEN
2307       l_actmet_rec.published_flag := 'N';
2308    END IF;
2309 
2310    -- DMVINCEN 06/05/2001: If value is posted to budget do not update.
2311    IF l_actmet_rec.published_flag = 'Y' THEN
2312       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2313          l_actmet_rec.trans_actual_value := Fnd_Api.G_MISS_NUM;
2314          l_actmet_rec.func_actual_value := Fnd_Api.G_MISS_NUM;
2315          l_reprocess_rec := Fnd_Api.G_TRUE;
2316       END IF;
2317    END IF;
2318 
2319    IF l_reprocess_rec = Fnd_Api.G_TRUE THEN
2320       Complete_ActMetric_Rec(l_actmet_rec, l_actmet_rec);
2321    END IF;
2322 
2323    -- Do Currency Conversion
2324    Default_ActMetric(
2325          p_init_msg_list       => p_init_msg_list,
2326         -- p_act_metric_rec      => l_actmet_rec,
2327          p_validation_mode     => Jtf_Plsql_Api.G_UPDATE,
2328          x_complete_rec        => l_actmet_rec,
2329          x_return_status       => l_return_status,
2330          x_msg_count           => x_msg_count,
2331          x_msg_data            => x_msg_data  ) ;
2332    -- If any errors happen abort API.
2333    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2334       RAISE Fnd_Api.G_EXC_ERROR;
2335    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2336       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2337    END IF;
2338 
2339    IF p_validation_level >= Jtf_Plsql_Api.g_valid_level_item THEN
2340       Validate_ActMetric_items(
2341          p_act_metric_rec  => l_actmet_rec,
2342          p_validation_mode => Jtf_Plsql_Api.g_update,
2343          x_return_status   => l_return_status
2344       );
2345       IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2346          RAISE Fnd_Api.g_exc_unexpected_error;
2347       ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
2348          RAISE Fnd_Api.g_exc_error;
2349       END IF;
2350    END IF;
2351 
2352 
2353    -- replace g_miss_char/num/date with current column values
2354    --Complete_ActMetric_Rec(l_actmet_rec, l_actmet_rec);
2355 
2356    IF p_validation_level >= Jtf_Plsql_Api.g_valid_level_record THEN
2357 
2358      Validate_ActMetric_Record(
2359          p_act_metric_rec  => l_actmet_rec,
2360          p_complete_rec    => l_actmet_rec,
2361          p_operation_mode  => G_UPDATE,
2362          x_return_status   => l_return_status
2363       );
2364       IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2365          RAISE Fnd_Api.g_exc_unexpected_error;
2366       ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
2367          RAISE Fnd_Api.g_exc_error;
2368       END IF;
2369    END IF;
2370 
2371    -- Post a new cost item to the budget.
2372    IF l_actmet_rec.published_flag = 'T' THEN
2373       l_return_status := FND_API.G_RET_STS_SUCCESS;
2374       l_actmet_rec.published_flag := 'Y';
2375       l_cost_rec.cost_id := l_actmet_rec.activity_metric_id;
2376       l_cost_rec.cost_amount := l_actmet_rec.trans_actual_value;
2377       l_cost_rec.cost_desc := '';
2378       l_cost_rec.cost_curr := l_actmet_rec.transaction_currency_code;
2379       l_cost_table(1) := l_cost_rec;
2380       OZF_Fund_Adjustment_Pvt.create_budget_amt_utilized(
2381          p_budget_used_by_id   => l_actmet_rec.act_metric_used_by_id,
2382          p_budget_used_by_type => l_actmet_rec.arc_act_metric_used_by,
2383          p_currency            => l_actmet_rec.transaction_currency_code,
2384          p_cost_tbl            => l_cost_table,
2385          p_api_version         => l_api_version,
2386          x_return_status       => l_return_status,
2387          x_msg_count           => x_msg_count,
2388          x_msg_data            => x_msg_data);
2389       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2390          -- BUG2486379: Display budget utilization errors.
2391          -- Fnd_Msg_Pub.Initialize;
2392          Fnd_Message.set_name('AMS', 'AMS_MET_NO_POST');
2393          Fnd_Msg_Pub.ADD;
2394          --IF (AMS_DEBUG_HIGH_ON) THEN
2395          --   Ams_Utility_Pvt.debug_message('You can not post this cost!');
2396          --END IF;
2397       END IF;
2398       IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2399          RAISE Fnd_Api.g_exc_unexpected_error;
2400       ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
2401          RAISE Fnd_Api.g_exc_error;
2402       END IF;
2403    END IF;
2404 
2405    IF (AMS_DEBUG_HIGH_ON) THEN
2406      Ams_Utility_Pvt.debug_message(l_full_name ||': update Activity Metrics Table');
2407    END IF;
2408 
2409    -- Update AMS_ACT_METRICS_ALL
2410    UPDATE ams_act_metrics_all
2411       SET object_version_number= object_version_number + 1,
2412           act_metric_used_by_id    = l_actmet_rec.act_metric_used_by_id,
2413           arc_act_metric_used_by   = l_actmet_rec.arc_act_metric_used_by,
2414           purchase_req_raised_flag = l_actmet_rec.purchase_req_raised_flag,
2415           application_id           = l_actmet_rec.application_id,
2416           sensitive_data_flag      = l_actmet_rec.sensitive_data_flag,
2417           budget_id                = l_actmet_rec.budget_id ,
2418           metric_id                = l_actmet_rec.metric_id,
2419           transaction_currency_code= l_actmet_rec.transaction_currency_code,
2420           trans_forecasted_value   = l_actmet_rec.trans_forecasted_value,
2421           trans_committed_value    = l_actmet_rec.trans_committed_value,
2422           trans_actual_value       = l_actmet_rec.trans_actual_value,
2423           functional_currency_code = l_actmet_rec.functional_currency_code,
2424           func_forecasted_value    = l_actmet_rec.func_forecasted_value,
2425           func_committed_value     = l_actmet_rec.func_committed_value,
2426           func_actual_value        = l_actmet_rec.func_actual_value,
2427           dirty_flag               = l_actmet_rec.dirty_flag,
2428           last_calculated_date     = l_actmet_rec.last_calculated_date,
2429           variable_value           = l_actmet_rec.variable_value,
2430           forecasted_variable_value= l_actmet_rec.forecasted_variable_value,
2431           computed_using_function_value =
2432                      l_actmet_rec.computed_using_function_value,
2433           metric_uom_code          = l_actmet_rec.metric_uom_code,
2434           difference_since_last_calc = l_actmet_rec.difference_since_last_calc,
2435           activity_metric_origin_id= l_actmet_rec.activity_metric_origin_id,
2436           arc_activity_metric_origin = l_actmet_rec.arc_activity_metric_origin,
2437           hierarchy_id             = l_actmet_rec.hierarchy_id,
2438           start_node               = l_actmet_rec.start_node,
2439           from_level               = l_actmet_rec.from_level,
2440           to_level                 = l_actmet_rec.to_level,
2441           from_date                = l_actmet_rec.from_date,
2442           TO_DATE                  = l_actmet_rec.TO_DATE,
2443           amount1                  = l_actmet_rec.amount1,
2444           amount2                  = l_actmet_rec.amount2,
2445           amount3                  = l_actmet_rec.amount3,
2446           percent1                 = l_actmet_rec.percent1,
2447           percent2                 = l_actmet_rec.percent2,
2448           percent3                 = l_actmet_rec.percent3,
2449           published_flag           = l_actmet_rec.published_flag,
2450           pre_function_name        = l_actmet_rec.pre_function_name,
2451           post_function_name       = l_actmet_rec.post_function_name,
2452           last_update_date         = SYSDATE,
2453           last_updated_by          = Fnd_Global.User_ID,
2454           last_update_login        = Fnd_Global.Conc_Login_ID,
2455           attribute_category       = l_actmet_rec.attribute_category,
2456           attribute1               = l_actmet_rec.attribute1,
2457           attribute2               = l_actmet_rec.attribute2,
2458           attribute3               = l_actmet_rec.attribute3,
2459           attribute4               = l_actmet_rec.attribute4,
2460           attribute5               = l_actmet_rec.attribute5,
2461           attribute6               = l_actmet_rec.attribute6,
2462           attribute7               = l_actmet_rec.attribute7,
2463           attribute8               = l_actmet_rec.attribute8,
2464           attribute9               = l_actmet_rec.attribute9,
2465           attribute10              = l_actmet_rec.attribute10,
2466           attribute11              = l_actmet_rec.attribute11,
2467           attribute12              = l_actmet_rec.attribute12,
2468           attribute13              = l_actmet_rec.attribute13,
2469           attribute14              = l_actmet_rec.attribute14,
2470           attribute15              = l_actmet_rec.attribute15,
2471           description              = l_actmet_rec.description,
2472           act_metric_date          = l_actmet_rec.act_metric_date,
2473           depend_act_metric        = l_actmet_rec.depend_act_metric,
2474           function_used_by_id      = l_actmet_rec.function_used_by_id,
2475           arc_function_used_by     = l_actmet_rec.arc_function_used_by,
2476           /* 05/15/2002 yzhao: 11.5.9 add 6 new columns for top-down bottom-up budgeting */
2477           hierarchy_type           = l_actmet_rec.hierarchy_type,
2478           status_code              = l_actmet_rec.status_code,
2479           method_code              = l_actmet_rec.method_code,
2480           action_code              = l_actmet_rec.action_code,
2481           basis_year               = l_actmet_rec.basis_year,
2482           ex_start_node            = l_actmet_rec.ex_start_node
2483           /* 05/15/2002 yzhao: add ends */
2484       WHERE activity_metric_id = l_actmet_rec.activity_metric_id;
2485 
2486    IF  (SQL%NOTFOUND)
2487    THEN
2488       --
2489       -- Add error message to API message list.
2490       --
2491       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2492          Fnd_Message.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
2493          Fnd_Msg_Pub.ADD;
2494       END IF;
2495       RAISE Fnd_Api.g_exc_error;
2496    END IF;
2497 
2498    -- huili@ added to invalidate the corresponding variable activity metrics
2499    OPEN c_check_var_met (l_actmet_rec.activity_metric_id);
2500    FETCH c_check_var_met INTO l_depend_act_metric;
2501    IF c_check_var_met%FOUND AND l_depend_act_metric IS NOT NULL THEN
2502       UPDATE ams_act_metrics_all
2503       SET dirty_flag = G_IS_DIRTY
2504       WHERE activity_metric_id = l_depend_act_metric;
2505 
2506       IF  (SQL%NOTFOUND) THEN
2507          --
2508          -- Add error message to API message list.
2509          --
2510          IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2511             Fnd_Message.set_name('AMS', 'AMS_API_VARREC_NOT_FOUND');
2512             Fnd_Msg_Pub.ADD;
2513          END IF;
2514          RAISE Fnd_Api.g_exc_error;
2515       END IF;
2516    END IF;
2517    CLOSE c_check_var_met;
2518    --END
2519 
2520    -- Record any change in the history table.
2521    Record_History(l_actmet_rec.activity_metric_id, G_UPDATE,
2522                  x_return_status, x_msg_count, x_msg_data);
2523 
2524   -- update all the parent object's rollup metrics or this object's
2525   -- summary metrics dirty_flag to 'Y' -- SVEERAVE, 10/13/00
2526   IF NVL(l_actmet_rec.dirty_flag,G_IS_DIRTY) = G_IS_DIRTY THEN
2527     Make_ActMetric_Dirty(l_actmet_rec.activity_metric_id);
2528   END IF;
2529    --
2530    -- End API Body
2531    --
2532 
2533    IF Fnd_Api.to_boolean(p_commit) THEN
2534       COMMIT;
2535    END IF;
2536 
2537    --
2538    -- Standard API to get message count, and if 1,
2539    -- set the message data OUT variable.
2540    --
2541    Fnd_Msg_Pub.Count_And_Get (
2542       p_count           =>    x_msg_count,
2543       p_data            =>    x_msg_data,
2544       p_encoded         =>    Fnd_Api.G_FALSE
2545    );
2546 
2547    --
2548    -- Debug message.
2549    --
2550    IF (AMS_DEBUG_HIGH_ON) THEN
2551       Ams_Utility_Pvt.debug_message(l_full_name ||': end');
2552    END IF;
2553 
2554 
2555 EXCEPTION
2556    WHEN Fnd_Api.G_EXC_ERROR THEN
2557       ROLLBACK TO Update_ActMetric_pvt;
2558       x_return_status := Fnd_Api.G_RET_STS_ERROR;
2559       Fnd_Msg_Pub.Count_And_Get (
2560          p_count         =>     x_msg_count,
2561          p_data          =>     x_msg_data,
2562          p_encoded       =>     FND_API.G_FALSE
2563       );
2564    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2565       ROLLBACK TO Update_ActMetric_pvt;
2566       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2567       Fnd_Msg_Pub.Count_And_Get (
2568          p_count         =>     x_msg_count,
2569          p_data          =>     x_msg_data,
2570          p_encoded       =>   FND_API.G_FALSE
2571       );
2572    WHEN OTHERS THEN
2573       ROLLBACK TO Update_ActMetric_pvt;
2574       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2575       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2576          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
2577       END IF;
2578       Fnd_Msg_Pub.Count_And_Get (
2579          p_count         =>     x_msg_count,
2580          p_data          =>     x_msg_data,
2581          p_encoded       =>   FND_API.G_FALSE
2582       );
2583 END Update_ActMetric;
2584 
2585 -- Start of comments
2586 -- NAME
2587 --    Delete_ActMetric
2588 --
2589 -- PURPOSE
2590 --    Deletes the association of a metric to a business
2591 --    object by creating a record in AMS_ACT_METRICS_ALL.
2592 --
2593 -- NOTES
2594 --
2595 -- HISTORY
2596 -- 05/26/1999   choang        Created.
2597 -- 10/9/1999    ptendulk      Modified according to new standards
2598 -- 08/24/2000   sveerave@us   Included call-out for check_freeze_status
2599 --                            at beginning.
2600 -- 12/18/2001   DMVINCEN      Removed seeded data restriction.
2601 -- 04/04/2002   DMVINCEN      When rollup metrics are removed the
2602 --                            subordinate records are nulled.
2603 --
2604 -- End of comments
2605 
2606 PROCEDURE Delete_ActMetric (
2607    p_api_version              IN  NUMBER,
2608    p_init_msg_list            IN  VARCHAR2 := Fnd_Api.G_FALSE,
2609    p_commit                   IN  VARCHAR2 := Fnd_Api.G_FALSE,
2610    x_return_status            OUT NOCOPY VARCHAR2,
2611    x_msg_count                OUT NOCOPY NUMBER,
2612    x_msg_data                 OUT NOCOPY VARCHAR2,
2613    p_activity_metric_id       IN  NUMBER,
2614    p_object_version_number    IN  NUMBER
2615 )
2616 IS
2617    L_API_VERSION         CONSTANT NUMBER := 1.0;
2618    L_API_NAME            CONSTANT VARCHAR2(30) := 'DELETE_ACTMETRIC';
2619    L_FULL_NAME           CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2620 
2621    l_return_status       VARCHAR2(1);
2622    l_freeze_status       VARCHAR2(1) := Fnd_Api.G_FALSE;
2623    l_act_metric_rec      act_metric_rec_type;
2624    l_child_activity_metric_id NUMBER;
2625    l_child_type          VARCHAR2(30);
2626 
2627 
2628    --sunkumar 05/30/2003 added for seting the token in error message AMS_METR_DELETE
2629    l_object_name AMS_LOOKUPS.MEANING%TYPE;
2630    -- DMVINCEN Added check for rollup children.
2631    -- DMVINCEN 04/04/2002: Retrieve the child ids and relation ships.
2632    CURSOR c_check_child_exists(l_act_metric_id NUMBER) IS
2633       SELECT activity_metric_id, 'SUMMARY'
2634       FROM ams_act_metrics_all
2635       WHERE summarize_to_metric = l_act_metric_id
2636       UNION ALL
2637       SELECT activity_metric_id, 'ROLLUP'
2638       FROM ams_act_metrics_all
2639       WHERE rollup_to_metric = l_act_metric_id;
2640 
2641    CURSOR c_actmet_details(l_act_metric_id NUMBER) IS
2642        SELECT  activity_metric_id,
2643                  last_update_date,
2644                  last_updated_by,
2645                  creation_date,
2646                  created_by,
2647                  last_update_login,
2648                  object_version_number,
2649                  act_metric_used_by_id,
2650                  arc_act_metric_used_by,
2651                  purchase_req_raised_flag,
2652                  application_id,
2653                  sensitive_data_flag,
2654                  budget_id,
2655                  metric_id,
2656                  transaction_currency_code,
2657                  trans_forecasted_value,
2658                  trans_committed_value,
2659                  trans_actual_value,
2660                  functional_currency_code,
2661                  func_forecasted_value,
2662                  dirty_flag,
2663                  func_committed_value,
2664                  func_actual_value,
2665                  last_calculated_date,
2666                  variable_value,
2667                  forecasted_variable_value,
2668                  computed_using_function_value,
2669                  metric_uom_code,
2670                  org_id,
2671                  difference_since_last_calc,
2672                  activity_metric_origin_id,
2673                  arc_activity_metric_origin,
2674                  days_since_last_refresh,
2675                  scenario_id,
2676                  SUMMARIZE_TO_METRIC,
2677                  ROLLUP_TO_METRIC,
2678                  hierarchy_id,
2679                  start_node,
2680                  from_level,
2681                  to_level,
2682                  from_date,
2683                  TO_DATE,
2684                  amount1,
2685                  amount2,
2686                  amount3,
2687                  percent1,
2688                  percent2,
2689                  percent3,
2690                  published_flag,
2691                  pre_function_name ,
2692                  post_function_name,
2693                  attribute_category,
2694                  attribute1,
2695                  attribute2,
2696                  attribute3,
2697                  attribute4,
2698                  attribute5,
2699                  attribute6,
2700                  attribute7,
2701                  attribute8,
2702                  attribute9,
2703                  attribute10,
2704                  attribute11,
2705                  attribute12,
2706                  attribute13,
2707                  attribute14,
2708                  attribute15,
2709                  description,
2710                  act_metric_date,
2711                  depend_act_metric,
2712                  function_used_by_id,
2713                  arc_function_used_by,
2714                  /* 05/15/2002 yzhao: 11.5.9 add 6 new columns for top-down bottom-up budgeting */
2715                  hierarchy_type,
2716                  status_code,
2717                  method_code,
2718                  action_code,
2719                  basis_year,
2720                  ex_start_node
2721                  /* 05/15/2002 yzhao: add ends */
2722      FROM ams_act_metrics_all
2723      WHERE activity_metric_id = l_act_metric_id;
2724 
2725   -- huili@ added on 05/07/2001
2726   CURSOR c_depend_met_id (l_act_met_id NUMBER) IS
2727   SELECT depend_act_metric, object_version_number
2728   FROM ams_act_metrics_all
2729   WHERE activity_metric_id = l_act_met_id;
2730 
2731   l_depend_act_met_id NUMBER;
2732   l_depend_version_num NUMBER;
2733 
2734    l_dummy   NUMBER;
2735 
2736 BEGIN
2737    --
2738    -- Initialize savepoint.
2739    --
2740    SAVEPOINT Delete_ActMetric_pvt;
2741 
2742    --
2743    -- Output debug message.
2744    --
2745    IF (AMS_DEBUG_HIGH_ON) THEN
2746       Ams_Utility_Pvt.debug_message(l_full_name||': start');
2747    END IF;
2748 
2749    --
2750    -- Initialize message list if p_init_msg_list is set to TRUE.
2751    --
2752    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
2753       Fnd_Msg_Pub.Initialize;
2754    END IF;
2755 
2756    --
2757    -- Standard check for API version compatibility.
2758    --
2759    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
2760                                        p_api_version,
2761                                        L_API_NAME,
2762                                        G_PKG_NAME)
2763    THEN
2764       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2765    END IF;
2766 
2767 
2768    --
2769    -- Check if record is seeded.
2770    --
2771    -- DMVINCEN: There is no reason for this restriction.
2772 --    IF IsSeeded (p_activity_metric_id) THEN
2773 --       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error)
2774 --       THEN
2775 --          Fnd_Message.set_name('AMS', 'AMS_METR_SEEDED_METR');
2776 --          Fnd_Msg_Pub.ADD;
2777 --       END IF;
2778 --
2779 --       RAISE Fnd_Api.G_EXC_ERROR;
2780 --    END IF;
2781 
2782 
2783    --
2784    -- Initialize API return status to success.
2785    --
2786    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2787 
2788    --
2789    -- Begin API Body.
2790    --
2791    -- Following part is added by sveerave on 11/15/00 for fix of bug 1500023
2792    --
2793    -- Check if childs exist. If exists then prevent deletion
2794    -- DMVINCEN 04/04/2002: Allow rollup metrics to be deleted by removing
2795    -- the reference from the child metric.
2796    --
2797    OPEN c_check_child_exists(p_activity_metric_id);
2798    LOOP
2799       FETCH c_check_child_exists
2800          INTO l_child_activity_metric_id, l_child_type;
2801       EXIT WHEN c_check_child_exists%NOTFOUND;
2802       EXIT WHEN l_child_type = 'SUMMARY';
2803       UPDATE ams_act_metrics_all
2804          SET rollup_to_metric = NULL
2805          WHERE activity_metric_id = l_child_activity_metric_id;
2806    END LOOP;
2807    CLOSE c_check_child_exists;
2808 
2809    IF l_child_type = 'SUMMARY' THEN
2810       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2811          Fnd_Message.set_name('AMS', 'AMS_METR_CANT_DELETE_PARENT');
2812          Fnd_Msg_Pub.ADD;
2813       END IF;
2814       RAISE Fnd_Api.g_exc_error;
2815    END IF;
2816    -- end for the bug fix, sveerave.
2817 
2818    -- Get all the details of the activity metric record for passing to
2819         -- freeze validation.
2820    OPEN  c_actmet_details(p_activity_metric_id);
2821    FETCH c_actmet_details INTO l_act_metric_rec;
2822    IF (c_actmet_details%NOTFOUND) THEN
2823       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2824          Fnd_Message.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
2825          Fnd_Msg_Pub.ADD;
2826       END IF;
2827       RAISE Fnd_Api.g_exc_error;
2828    END IF;
2829 
2830    CLOSE c_actmet_details;
2831 
2832    -- Make a call-out to check the frozen status.
2833         -- If it is frozen, disallow the operation.
2834    Check_Freeze_Status (l_act_metric_rec,
2835                         G_DELETE, -- Delete is operation mode
2836                         l_freeze_status,
2837                         l_return_status);
2838 
2839     IF (l_freeze_status = Fnd_Api.G_TRUE)  THEN
2840              -- frozen to create the record
2841       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2842        -- sunkumar 04/30/2003 added message for delete status of objects depending on status (ACTIVE, CANCELLED, COMPLETED)
2843     l_object_name := ams_utility_pvt.get_lookup_meaning(
2844              'AMS_SYS_ARC_QUALIFIER',l_act_metric_rec.arc_act_metric_used_by);
2845     Fnd_Message.Set_Name('AMS', 'AMS_METR_DELETE');
2846          Fnd_Message.set_token('OBJECT', l_object_name);
2847          Fnd_Msg_Pub.ADD;
2848       END IF;
2849       l_return_status := Fnd_Api.G_RET_STS_ERROR;
2850    END IF;
2851 
2852 
2853    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2854       RAISE Fnd_Api.G_EXC_ERROR;
2855    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2856       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2857    END IF;
2858 
2859 
2860 
2861    IF (l_freeze_status = Fnd_Api.G_TRUE)  THEN
2862           -- frozen to create the record
2863       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2864          Fnd_Message.Set_Name('AMS', 'AMS_METR_FROZEN');
2865          Fnd_Msg_Pub.ADD;
2866       END IF;
2867       l_return_status := Fnd_Api.G_RET_STS_ERROR;
2868    END IF;
2869 
2870    -- If it is frozen, or any errors happen abort API.
2871    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2872       RAISE Fnd_Api.G_EXC_ERROR;
2873    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2874       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2875    END IF;
2876 
2877    -- If the actual value has been posted to the budget do not delete.
2878    IF l_act_metric_rec.published_flag = 'Y' THEN
2879       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2880          Fnd_Message.SET_NAME('AMS', 'AMS_METR_PUBLISHED');
2881          Fnd_Msg_Pub.ADD;
2882       END IF;
2883       RAISE Fnd_Api.g_exc_error;
2884    END IF;
2885 
2886    -- Debug message.
2887    IF (AMS_DEBUG_HIGH_ON) THEN
2888       Ams_Utility_Pvt.debug_message(l_full_name ||': delete with Validation');
2889    END IF;
2890 
2891    -- huili added on 05/07/2001 to check dependent activity metrics
2892         l_depend_act_met_id := NULL;
2893         l_depend_version_num := NULL;
2894    OPEN c_depend_met_id (p_activity_metric_id);
2895    FETCH c_depend_met_id INTO l_depend_act_met_id, l_depend_version_num;
2896    CLOSE c_depend_met_id;
2897 
2898    -- Record any change in the history table.
2899    Record_History(p_activity_metric_id, G_DELETE,
2900                  x_return_status, x_msg_count, x_msg_data);
2901 
2902    DELETE FROM ams_act_metrics_all
2903     WHERE activity_metric_id = p_activity_metric_id
2904       AND object_version_number = p_object_version_number;
2905 
2906    IF SQL%NOTFOUND THEN
2907       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2908          Fnd_Message.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
2909          Fnd_Msg_Pub.ADD;
2910       END IF;
2911       RAISE Fnd_Api.g_exc_error;
2912    END IF;
2913 
2914    -- DMVINCEN 04/30/2001 Parent metrics need to be re-evaluated
2915    Make_ActMetric_Dirty(l_act_metric_rec.rollup_to_metric);
2916    Make_ActMetric_Dirty(l_act_metric_rec.summarize_to_metric);
2917 
2918    IF l_depend_act_met_id IS NOT NULL THEN
2919 
2920       UPDATE ams_act_metrics_all
2921          SET depend_act_metric = NULL
2922          WHERE activity_metric_id = l_depend_act_met_id;
2923 
2924       Delete_ActMetric (
2925          p_api_version              => p_api_version,
2926          p_init_msg_list            => Fnd_Api.G_FALSE,
2927          p_commit                   => Fnd_Api.G_FALSE,
2928          x_return_status            => x_return_status,
2929          x_msg_count                => x_msg_count,
2930          x_msg_data                 => x_msg_data,
2931          p_activity_metric_id       => l_depend_act_met_id,
2932          p_object_version_number    => l_depend_version_num);
2933 
2934       IF x_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2935          RAISE Fnd_Api.G_EXC_ERROR;
2936       ELSIF x_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2937          RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2938       END IF;
2939    END IF;
2940 
2941    -- end
2942 
2943    --
2944    -- End API Body.
2945    --
2946 
2947    IF Fnd_Api.To_Boolean (p_commit) THEN
2948       COMMIT WORK;
2949    END IF;
2950 
2951    --
2952    -- Debug message.
2953    --
2954    IF (AMS_DEBUG_HIGH_ON) THEN
2955       Ams_Utility_Pvt.debug_message(l_full_name ||': End');
2956    END IF;
2957 
2958    --
2959    -- Standard API to get message count, and if 1,
2960    -- set the message data OUT NOCOPY variable.
2961    --
2962    Fnd_Msg_Pub.Count_And_Get (
2963       p_count           =>    x_msg_count,
2964       p_data            =>    x_msg_data,
2965       p_encoded         =>    Fnd_Api.G_FALSE
2966    );
2967 
2968 EXCEPTION
2969    WHEN Fnd_Api.G_EXC_ERROR THEN
2970       ROLLBACK TO Delete_ActMetric_pvt;
2971       x_return_status := Fnd_Api.G_RET_STS_ERROR;
2972       Fnd_Msg_Pub.Count_And_Get (
2973          p_count         =>     x_msg_count,
2974          p_data          =>     x_msg_data,
2975          p_encoded       =>   FND_API.G_FALSE
2976       );
2977    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2978       ROLLBACK TO Delete_ActMetric_pvt;
2979       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2980       Fnd_Msg_Pub.Count_And_Get (
2981          p_count         =>     x_msg_count,
2982          p_data          =>     x_msg_data,
2983          p_encoded       =>   FND_API.G_FALSE
2984       );
2985    WHEN OTHERS THEN
2986       ROLLBACK TO Delete_ActMetric_pvt;
2987       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2988       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2989          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
2990       END IF;
2991       Fnd_Msg_Pub.Count_And_Get (
2992          p_count         =>     x_msg_count,
2993          p_data          =>     x_msg_data,
2994          p_encoded       =>   FND_API.G_FALSE
2995       );
2996 END Delete_ActMetric;
2997 
2998 -- Start of comments
2999 -- NAME
3000 --    Delete_ActMetric
3001 --
3002 -- PURPOSE
3003 --    Recursively delete metrics associated to a business object.
3004 --    If the activity metric id and object version number are null,
3005 --    then all metrics associated with that object are removed.
3006 --    If the activity metric id and object version number are not null,
3007 --    then that activity metric and all subordinate metrics are removed.
3008 --    Only activity metrics at the given object level are removed.
3009 --    The preceding Delete_ActMetric is called for the actual delete.
3010 --
3011 -- NOTES
3012 --
3013 -- HISTORY
3014 -- 04/02/2002   DMVINCEN      Created
3015 --
3016 -- End of comments
3017 
3018 PROCEDURE Delete_ActMetric (
3019    p_api_version              IN  NUMBER,
3020    p_init_msg_list            IN  VARCHAR2 := Fnd_Api.G_FALSE,
3021    p_commit                   IN  VARCHAR2 := Fnd_Api.G_FALSE,
3022 
3023    x_return_status            OUT NOCOPY VARCHAR2,
3024    x_msg_count                OUT NOCOPY NUMBER,
3025    x_msg_data                 OUT NOCOPY VARCHAR2,
3026 
3027    p_arc_act_metric_used_by   IN  VARCHAR2,
3028    p_act_metric_used_by_id    IN  NUMBER,
3029    p_activity_metric_id       IN  NUMBER := NULL,
3030    p_object_version_number    IN  NUMBER := NULL
3031 )
3032 IS
3033    L_API_VERSION         CONSTANT NUMBER := 1.0;
3034    L_API_NAME            CONSTANT VARCHAR2(30) := 'DELETE_ACTMETRIC';
3035    L_FULL_NAME           CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
3036 
3037    l_return_status       VARCHAR2(1);
3038    l_activity_metric_id  NUMBER;
3039    l_object_version_number  NUMBER;
3040    l_activity_metric_ids number_table;
3041    l_object_version_numbers number_table;
3042 
3043    CURSOR c_get_top_level_act_metrics(l_arc_act_metric_used_by VARCHAR2,
3044          l_act_metric_used_by_id NUMBER)
3045      IS
3046      SELECT activity_metric_id, object_version_number
3047      FROM ams_act_metrics_all
3048      WHERE summarize_to_metric is NULL
3049      AND arc_act_metric_used_by = l_arc_act_metric_used_by
3050      AND act_metric_used_by_id = l_act_metric_used_by_id;
3051 
3052    CURSOR c_get_next_level_act_metrics(l_arc_act_metric_used_by VARCHAR2,
3053          l_act_metric_used_by_id NUMBER,
3054          l_activity_metric_id NUMBER)
3055      IS
3056      SELECT activity_metric_id, object_version_number
3057      FROM ams_act_metrics_all
3058      WHERE summarize_to_metric = l_activity_metric_id
3059      AND arc_act_metric_used_by = l_arc_act_metric_used_by
3060      AND act_metric_used_by_id = l_act_metric_used_by_id;
3061 
3062 BEGIN
3063    --
3064    -- Initialize savepoint.
3065    --
3066 --   SAVEPOINT Delete_ActMetric_By_Object_pvt;
3067 
3068    --
3069    -- Output debug message.
3070    --
3071    IF (AMS_DEBUG_HIGH_ON) THEN
3072       Ams_Utility_Pvt.debug_message(l_full_name||': start');
3073    END IF;
3074 
3075    --
3076    -- Initialize message list if p_init_msg_list is set to TRUE.
3077    --
3078    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
3079       Fnd_Msg_Pub.Initialize;
3080    END IF;
3081 
3082    --
3083    -- Standard check for API version compatibility.
3084    --
3085    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
3086                                        p_api_version,
3087                                        L_API_NAME,
3088                                        G_PKG_NAME)
3089    THEN
3090       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3091    END IF;
3092 
3093    --
3094    -- Initialize API return status to success.
3095    --
3096    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3097 
3098    --
3099    -- Begin API Body.
3100    --
3101 
3102    IF p_activity_metric_id IS NULL AND
3103       p_object_version_number IS NULL THEN
3104 
3105       -- Find all activity metrics from the top down.
3106       OPEN c_get_top_level_act_metrics(
3107           p_arc_act_metric_used_by,
3108           p_act_metric_used_by_id);
3109       FETCH c_get_top_level_act_metrics
3110          BULK COLLECT INTO l_activity_metric_ids, l_object_version_numbers;
3111       CLOSE c_get_top_level_act_metrics;
3112 
3113       IF l_activity_metric_ids.COUNT > 0 THEN
3114          FOR l_index IN l_activity_metric_ids.FIRST..l_activity_metric_ids.LAST
3115          LOOP
3116             -- Recursively delete the next level down.
3117             Delete_actmetric(
3118                p_api_version => p_api_version,
3119                p_init_msg_list   => Fnd_Api.G_FALSE,
3120                p_commit          => Fnd_Api.G_FALSE,
3121                x_return_status => l_return_status,
3122                x_msg_count => x_msg_count,
3123                x_msg_data => x_msg_data,
3124                p_arc_act_metric_used_by => p_arc_act_metric_used_by,
3125                p_act_metric_used_by_id => p_act_metric_used_by_id,
3126                p_activity_metric_id => l_activity_metric_ids(l_index),
3127                p_object_version_number => l_object_version_numbers(l_index));
3128 
3129             IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
3130                RAISE Fnd_Api.G_EXC_ERROR;
3131             ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
3132                RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3133             END IF;
3134 
3135          END LOOP;
3136       END IF;
3137 
3138    ELSIF p_object_version_number IS NOT NULL AND
3139          p_activity_metric_id IS NOT NULL THEN
3140 
3141       -- Find all the activity metrics below the current.
3142       OPEN c_get_next_level_act_metrics(p_arc_act_metric_used_by,
3143          p_act_metric_used_by_id, p_activity_metric_id);
3144       FETCH c_get_next_level_act_metrics
3145          BULK COLLECT INTO l_activity_metric_ids, l_object_version_numbers;
3146       CLOSE c_get_next_level_act_metrics;
3147 
3148       IF l_activity_metric_ids.COUNT > 0 THEN
3149          FOR l_index IN l_activity_metric_ids.FIRST..l_activity_metric_ids.LAST
3150          LOOP
3151 
3152             -- Recursively delete the next level down.
3153             Delete_actmetric(
3154                p_api_version => p_api_version,
3155                p_init_msg_list   => Fnd_Api.G_FALSE,
3156                p_commit          => Fnd_Api.G_FALSE,
3157                x_return_status => l_return_status,
3158                x_msg_count => x_msg_count,
3159                x_msg_data => x_msg_data,
3160                p_arc_act_metric_used_by => p_arc_act_metric_used_by,
3161                p_act_metric_used_by_id => p_act_metric_used_by_id,
3162                p_activity_metric_id => l_activity_metric_ids(l_index),
3163                p_object_version_number => l_object_version_numbers(l_index));
3164 
3165             IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
3166                RAISE Fnd_Api.G_EXC_ERROR;
3167             ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
3168                RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3169             END IF;
3170 
3171          END LOOP;
3172       END IF;
3173 
3174       -- Delete the top activity metric passed in.
3175       Delete_actmetric(
3176          p_api_version => p_api_version,
3177          p_init_msg_list   => Fnd_Api.G_FALSE,
3178          p_commit          => Fnd_Api.G_FALSE,
3179          x_return_status => l_return_status,
3180          x_msg_count => x_msg_count,
3181          x_msg_data => x_msg_data,
3182          p_activity_metric_id => p_activity_metric_id,
3183          p_object_version_number => p_object_version_number);
3184 
3185       IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
3186          RAISE Fnd_Api.G_EXC_ERROR;
3187       ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
3188          RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3189       END IF;
3190 
3191    END IF;
3192 
3193    --
3194    -- End API Body.
3195    --
3196 
3197    IF Fnd_Api.To_Boolean (p_commit) THEN
3198       COMMIT WORK;
3199    END IF;
3200 
3201    --
3202    -- Debug message.
3203    --
3204    IF (AMS_DEBUG_HIGH_ON) THEN
3205       Ams_Utility_Pvt.debug_message(l_full_name ||': End');
3206    END IF;
3207 
3208    --
3209    -- Standard API to get message count, and if 1,
3210    -- set the message data OUT NOCOPY variable.
3211    --
3212    Fnd_Msg_Pub.Count_And_Get (
3213       p_count           =>    x_msg_count,
3214       p_data            =>    x_msg_data,
3215       p_encoded         =>    Fnd_Api.G_FALSE
3216    );
3217 
3218 EXCEPTION
3219    WHEN Fnd_Api.G_EXC_ERROR THEN
3220 --      ROLLBACK TO Delete_ActMetric_By_Object_pvt;
3221       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3222       Fnd_Msg_Pub.Count_And_Get (
3223          p_count         =>     x_msg_count,
3224          p_data          =>     x_msg_data,
3225          p_encoded       =>   FND_API.G_FALSE
3226       );
3227    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
3228 --      ROLLBACK TO Delete_ActMetric_By_Object_pvt;
3229       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3230       Fnd_Msg_Pub.Count_And_Get (
3231          p_count         =>     x_msg_count,
3232          p_data          =>     x_msg_data,
3233          p_encoded       =>   FND_API.G_FALSE
3234       );
3235    WHEN OTHERS THEN
3236 --      ROLLBACK TO Delete_ActMetric_By_Object_pvt;
3237       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3238       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
3239          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
3240       END IF;
3241       Fnd_Msg_Pub.Count_And_Get (
3242          p_count         =>     x_msg_count,
3243          p_data          =>     x_msg_data,
3244          p_encoded       =>   FND_API.G_FALSE
3245       );
3246 END Delete_ActMetric;
3247 
3248 
3249 -- Start of comments
3250 -- NAME
3251 --    Lock_ActMetric
3252 --
3253 -- PURPOSE
3254 --    Lock the given row in AMS_ACT_METRICS_ALL.
3255 --
3256 -- NOTES
3257 --
3258 -- HISTORY
3259 -- 05/26/1999   choang         Created.
3260 -- 10/9/1999    ptendulk       Modified according to new standards
3261 --
3262 -- End of comments
3263 
3264 PROCEDURE Lock_ActMetric (
3265    p_api_version           IN  NUMBER,
3266    p_init_msg_list         IN  VARCHAR2 := Fnd_Api.G_FALSE,
3267 
3268    x_return_status         OUT NOCOPY VARCHAR2,
3269    x_msg_count             OUT NOCOPY NUMBER,
3270    x_msg_data              OUT NOCOPY VARCHAR2,
3271 
3272    p_activity_metric_id    IN  NUMBER,
3273    p_object_version_number IN  NUMBER
3274 )
3275 IS
3276    L_API_VERSION      CONSTANT NUMBER := 1.0;
3277    L_API_NAME         CONSTANT VARCHAR2(30) := 'LOCK_ACTMETRIC';
3278    L_FULL_NAME        CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
3279 
3280    l_activity_metric_id    NUMBER;
3281    l_metrics_name          VARCHAR2(240);
3282 
3283    CURSOR c_act_metrics_info IS
3284       SELECT activity_metric_id
3285       FROM ams_act_metrics_all
3286       WHERE activity_metric_id = p_activity_metric_id
3287       AND object_version_number = p_object_version_number
3288       FOR UPDATE OF activity_metric_id NOWAIT;
3289 
3290    CURSOR c_metric_info(p_act_metric_id NUMBER) IS
3291       SELECT metrics_name
3292       FROM ams_metrics_vl m, ams_act_metrics_all a
3293       WHERE m.metric_id = a.metric_id
3294       AND activity_metric_id = p_act_metric_id;
3295 BEGIN
3296    --
3297    -- Output debug message.
3298    --
3299    IF (AMS_DEBUG_HIGH_ON) THEN
3300       Ams_Utility_Pvt.debug_message(l_full_name||': start');
3301    END IF;
3302 
3303    --
3304    -- Initialize message list if p_init_msg_list is set to TRUE.
3305    --
3306    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
3307       Fnd_Msg_Pub.Initialize;
3308    END IF;
3309 
3310    --
3311    -- Standard check for API version compatibility.
3312    --
3313    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
3314                                        p_api_version,
3315                                        L_API_NAME,
3316                                        G_PKG_NAME)
3317    THEN
3318       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3319    END IF;
3320 
3321    --
3322    -- Initialize API return status to success.
3323    --
3324    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3325 
3326    --
3327    -- Begin API Body
3328    --
3329    IF (AMS_DEBUG_HIGH_ON) THEN
3330       Ams_Utility_Pvt.debug_message(l_full_name||': lock');
3331    END IF;
3332 
3333 
3334    OPEN c_act_metrics_info;
3335    FETCH c_act_metrics_info INTO l_activity_metric_id;
3336    IF  (c_act_metrics_info%NOTFOUND)
3337    THEN
3338       CLOSE c_act_metrics_info;
3339           -- Error, check the msg level and added an error message to the
3340           -- API message list
3341       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
3342          l_metrics_name := null;
3343          OPEN c_metric_info(p_activity_metric_id);
3344          FETCH c_metric_info INTO l_metrics_name;
3345          CLOSE c_metric_info;
3346          IF l_metrics_name is not null THEN
3347             Fnd_Message.set_name('AMS', 'AMS_METR_RECORD_NOT_FOUND');
3348             Fnd_Message.set_token('METRIC', l_metrics_name);
3349             Fnd_Msg_Pub.ADD;
3350          ELSE
3351             Fnd_Message.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
3352             Fnd_Msg_Pub.ADD;
3353          END IF;
3354       END IF;
3355       RAISE Fnd_Api.g_exc_error;
3356    END IF;
3357    CLOSE c_act_metrics_info;
3358 
3359 
3360    --
3361    -- Standard API to get message count, and if 1,
3362    -- set the message data OUT NOCOPY variable.
3363    --
3364    Fnd_Msg_Pub.Count_And_Get (
3365       p_count           =>    x_msg_count,
3366       p_data            =>    x_msg_data,
3367       p_encoded         =>    Fnd_Api.G_FALSE
3368    );
3369 
3370    --
3371    -- Debug message.
3372    --
3373    IF (AMS_DEBUG_HIGH_ON) THEN
3374       Ams_Utility_Pvt.debug_message(l_full_name ||': end');
3375    END IF;
3376 
3377 
3378 EXCEPTION
3379    WHEN Fnd_Api.G_EXC_ERROR THEN
3380       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3381       Fnd_Msg_Pub.Count_And_Get (
3382          p_count         =>     x_msg_count,
3383          p_data          =>     x_msg_data,
3384          p_encoded       =>   FND_API.G_FALSE
3385       );
3386    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
3387       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3388       Fnd_Msg_Pub.Count_And_Get (
3389          p_count         =>     x_msg_count,
3390          p_data          =>     x_msg_data,
3391          p_encoded       =>   FND_API.G_FALSE
3392       );
3393    WHEN Ams_Utility_Pvt.RESOURCE_LOCKED THEN
3394       x_return_status := Fnd_Api.G_RET_STS_ERROR ;
3395 
3396           IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
3397                    Fnd_Message.set_name('AMS', 'AMS_API_RESOURCE_LOCKED');
3398                    Fnd_Msg_Pub.ADD;
3399           END IF;
3400 
3401       Fnd_Msg_Pub.Count_And_Get (
3402          p_count         =>      x_msg_count,
3403          p_data          =>      x_msg_data,
3404          p_encoded      =>      Fnd_Api.G_FALSE
3405       );
3406    WHEN OTHERS THEN
3407       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3408       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
3409          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
3410       END IF;
3411       Fnd_Msg_Pub.Count_And_Get (
3412          p_count         =>     x_msg_count,
3413          p_data          =>     x_msg_data,
3414          p_encoded          =>      Fnd_Api.G_FALSE
3415                        );
3416 END Lock_ActMetric;
3417 
3418 -- Start of comments
3419 -- NAME
3420 --    Validate_ActMetric
3421 --
3422 -- PURPOSE
3423 --   Validation API for Activity metrics.
3424 --
3425 
3426 -- NOTES
3427 --
3428 -- HISTORY
3429 -- 05/26/1999   choang         Created.
3430 -- 10/9/1999    ptendulk           Modified according to new standards
3431 --
3432 -- End of comments
3433 
3434 PROCEDURE Validate_ActMetric (
3435    p_api_version                IN  NUMBER,
3436    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
3437    p_validation_level           IN  NUMBER   := Fnd_Api.G_Valid_Level_Full,
3438 
3439    x_return_status              OUT NOCOPY VARCHAR2,
3440    x_msg_count                  OUT NOCOPY NUMBER,
3441    x_msg_data                   OUT NOCOPY VARCHAR2,
3442 
3443    p_act_metric_rec            IN  act_metric_rec_type
3444 )
3445 IS
3446    L_API_VERSION    CONSTANT NUMBER := 1.0;
3447    L_API_NAME       CONSTANT VARCHAR2(30) := 'VALIDATE_ACTMETRIC';
3448    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
3449 
3450    l_return_status  VARCHAR2(1);
3451 
3452 BEGIN
3453    --
3454    -- Output debug message.
3455    --
3456    IF (AMS_DEBUG_HIGH_ON) THEN
3457       Ams_Utility_Pvt.debug_message(l_full_name||': start');
3458    END IF;
3459 
3460    --
3461    -- Initialize message list if p_init_msg_list is set to TRUE.
3462    --
3463    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
3464       Fnd_Msg_Pub.Initialize;
3465    END IF;
3466 
3467    --
3468    -- Standard check for API version compatibility.
3469    --
3470    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
3471                                        p_api_version,
3472                                        L_API_NAME,
3473                                        G_PKG_NAME)
3474    THEN
3475       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3476    END IF;
3477 
3478    --
3479    -- Initialize API return status to success.
3480    --
3481    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3482 
3483    --
3484    -- Begin API Body.
3485    --
3486 
3487    IF (AMS_DEBUG_HIGH_ON) THEN
3488       Ams_Utility_Pvt.debug_message(l_full_name||': Validate items');
3489    END IF;
3490 
3491    -- Validate required items in the record.
3492    IF p_validation_level >= Jtf_Plsql_Api.g_valid_level_item THEN
3493 
3494        Validate_ActMetric_items(
3495          p_act_metric_rec      => p_act_metric_rec,
3496          p_validation_mode         => Jtf_Plsql_Api.g_create,
3497          x_return_status           => l_return_status
3498       );
3499 
3500       -- If any errors happen abort API.
3501       IF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
3502          RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3503       ELSIF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
3504          RAISE Fnd_Api.G_EXC_ERROR;
3505       END IF;
3506    END IF;
3507 
3508    IF (AMS_DEBUG_HIGH_ON) THEN
3509       Ams_Utility_Pvt.debug_message(l_full_name||': check record');
3510    END IF;
3511 
3512    IF p_validation_level >= Jtf_Plsql_Api.g_valid_level_record THEN
3513       Validate_ActMetric_record(
3514          p_act_metric_rec       => p_act_metric_rec,
3515          p_complete_rec         => NULL,
3516          x_return_status        => l_return_status
3517       );
3518 
3519       IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
3520          RAISE Fnd_Api.g_exc_unexpected_error;
3521       ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
3522          RAISE Fnd_Api.g_exc_error;
3523       END IF;
3524    END IF;
3525 
3526    --
3527    -- End API Body.
3528    --
3529 
3530    --
3531    -- Standard API to get message count, and if 1,
3532    -- set the message data OUT NOCOPY variable.
3533    --
3534    Fnd_Msg_Pub.Count_And_Get (
3535       p_count           =>    x_msg_count,
3536       p_data            =>    x_msg_data,
3537       p_encoded         =>    Fnd_Api.G_FALSE
3538    );
3539 
3540    IF (AMS_DEBUG_HIGH_ON) THEN
3541       Ams_Utility_Pvt.debug_message(l_full_name ||': end');
3542    END IF;
3543 
3544 EXCEPTION
3545    WHEN Fnd_Api.G_EXC_ERROR THEN
3546       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3547       Fnd_Msg_Pub.Count_And_Get (
3548          p_count         =>     x_msg_count,
3549          p_data          =>     x_msg_data,
3550          p_encoded       =>   FND_API.G_FALSE
3551       );
3552    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
3553       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3554       Fnd_Msg_Pub.Count_And_Get (
3555          p_count         =>     x_msg_count,
3556          p_data          =>     x_msg_data,
3557          p_encoded       =>   FND_API.G_FALSE
3558       );
3559    WHEN OTHERS THEN
3560       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3561       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
3562          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
3563       END IF;
3564       Fnd_Msg_Pub.Count_And_Get (
3565          p_count         =>     x_msg_count,
3566          p_data          =>     x_msg_data,
3567          p_encoded       =>   FND_API.G_FALSE
3568       );
3569 END Validate_ActMetric;
3570 
3571 
3572 -- Start of comments.
3573 --
3574 -- NAME
3575 --    Check_Req_ActMetrics_Items
3576 --
3577 -- PURPOSE
3578 --    Validate required items metrics associated with business
3579 --    objects.
3580 --
3581 -- NOTES
3582 --
3583 -- HISTORY
3584 -- 05/26/1999     choang    Created.
3585 -- 10/9/1999      ptendulk  Modified According to new standards.
3586 --
3587 -- End of comments.
3588 
3589 PROCEDURE Check_Req_ActMetrics_Items (
3590    p_act_metric_rec                   IN act_metric_rec_type,
3591    x_return_status                     OUT NOCOPY VARCHAR2
3592 )
3593 IS
3594 BEGIN
3595    -- Initialize return status to success.
3596    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3597 
3598    -- APPLICATION_ID
3599 
3600    IF p_act_metric_rec.application_id IS NULL
3601    THEN
3602           -- missing required fields
3603       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3604       THEN -- MMSG
3605          Fnd_Message.Set_Name('AMS', 'AMS_METR_MISSING_APP_ID');
3606          Fnd_Msg_Pub.ADD;
3607       END IF;
3608 
3609       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3610 
3611       -- If any error happens abort API.
3612       RETURN;
3613    END IF;
3614 
3615    -- ARC_METRIC_USED_FOR_OBJECT
3616 
3617    IF  p_act_metric_rec.arc_act_metric_used_by IS NULL
3618    THEN
3619       -- missing required fields
3620       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3621       THEN -- MMSG
3622          Fnd_Message.Set_Name('AMS', 'AMS_METR_MISSING_ARC_USED_FOR');
3623          Fnd_Msg_Pub.ADD;
3624       END IF;
3625 
3626       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3627 
3628       -- If any error happens abort API.
3629       RETURN;
3630    END IF;
3631 
3632 
3633    -- ACT_METRIC_USED_BY_ID
3634 
3635    IF p_act_metric_rec.act_metric_used_by_id IS NULL
3636    THEN
3637       -- missing required fields
3638       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3639       THEN -- MMSG
3640          Fnd_Message.Set_Name('AMS', 'AMS_METR_MISSING_ARC_USED_FOR');
3641          Fnd_Msg_Pub.ADD;
3642       END IF;
3643 
3644       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3645 
3646       -- If any error happens abort API.
3647       RETURN;
3648    END IF;
3649 
3650    -- METRIC_ID
3651 
3652    IF p_act_metric_rec.metric_id IS NULL
3653    THEN
3654       -- missing required fields
3655       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3656       THEN -- MMSG
3657          Fnd_Message.Set_Name('AMS', 'AMS_METR_MISSING_METRIC_ID');
3658          Fnd_Msg_Pub.ADD;
3659       END IF;
3660 
3661       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3662 
3663       -- If any error happens abort API.
3664       RETURN;
3665    END IF;
3666 
3667    /*----------------------------------------------------------------
3668    -- commented by bgeorge om 01/18/2000, removed UOM as a req item
3669    -- METRIC_UOM_CODE
3670 
3671    IF p_act_metric_rec.metric_uom_code IS NULL
3672    THEN
3673       -- missing required fields
3674       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
3675       THEN -- MMSG
3676          FND_MESSAGE.Set_Name('AMS', 'AMS_METR_MISSING_UOM');
3677          FND_MSG_PUB.Add;
3678       END IF;
3679 
3680       x_return_status := FND_API.G_RET_STS_ERROR;
3681 
3682       -- If any error happens abort API.
3683       RETURN;
3684    END IF;
3685    -- end of comment  01/18/2000
3686    ---------------------------------------------------------------*/
3687 
3688 
3689    -- Sensitive Data flag
3690 
3691    IF p_act_metric_rec.sensitive_data_flag IS NULL
3692    THEN
3693       -- missing required fields
3694       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3695       THEN -- MMSG
3696          Fnd_Message.Set_Name('AMS', 'AMS_METR_MISSING_SENSITIVE');
3697          Fnd_Msg_Pub.ADD;
3698       END IF;
3699 
3700       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3701 
3702       -- If any error happens abort API.
3703       RETURN;
3704    END IF;
3705 
3706 
3707 EXCEPTION
3708    WHEN OTHERS THEN
3709       RAISE;
3710 END Check_Req_ActMetrics_Items;
3711 
3712 
3713 --
3714 -- Start of comments.
3715 --
3716 -- NAME
3717 --    Check_ActMetric_UK_Items
3718 --
3719 -- PURPOSE
3720 --    Perform Uniqueness check for Activity metrics.
3721 --
3722 -- NOTES
3723 --
3724 -- HISTORY
3725 -- 10/9/1999      ptendulk                      Created.
3726 -- 11/22/2004     dmvincen  BUG4026377: Prevent duplicate function assignment.
3727 --
3728 -- End of comments.
3729 
3730 
3731 PROCEDURE Check_ActMetric_UK_Items(
3732    p_act_metric_rec      IN  act_metric_rec_type,
3733    p_validation_mode     IN  VARCHAR2 := Jtf_Plsql_Api.g_create,
3734    x_return_status       OUT NOCOPY VARCHAR2
3735 )
3736 IS
3737    l_where_clause VARCHAR2(2000); -- Used By Check_Uniqueness
3738    l_test VARCHAR2(1) := NULL;
3739    CURSOR c_check_function(l_metric_id NUMBER,
3740          l_arc_act_metric_used_by VARCHAR2,
3741          l_act_metric_used_by_id NUMBER,
3742          l_arc_function_used_by VARCHAR2,
3743          l_function_used_by_id NUMBER) IS
3744       SELECT 'x'
3745       FROM ams_metrics_all_b b
3746       WHERE metric_id = l_metric_id
3747       AND ((metric_calculation_type = 'FUNCTION'
3748       AND NOT EXISTS (SELECT 'x' FROM ams_act_metrics_all a
3749           WHERE a.metric_id = b.metric_id
3750           AND a.arc_act_metric_used_by = l_arc_act_metric_used_by
3751           AND a.act_metric_used_by_id = l_act_metric_used_by_id
3752           AND NVL(a.arc_function_used_by,'IS NULL') =
3753               NVL(l_arc_function_used_by,'IS NULL')
3754           AND NVL(a.function_used_by_id,-1) = NVL(l_function_used_by_id,-1)
3755           ))
3756       OR metric_calculation_type <> 'FUNCTION');
3757 
3758 BEGIN
3759 
3760    x_return_status := Fnd_Api.g_ret_sts_success;
3761 
3762    -- For Create_ActMetric2, when activity_metric_id is passed in, we need to
3763    -- check if this activity_metric_id is unique.
3764    IF p_validation_mode = Jtf_Plsql_Api.g_create
3765       AND p_act_metric_rec.activity_metric_id IS NOT NULL
3766    THEN
3767           l_where_clause := ' activity_metric_id = '||p_act_metric_rec.activity_metric_id ;
3768 
3769       IF Ams_Utility_Pvt.Check_Uniqueness(
3770                         p_table_name      => 'ams_act_metrics_all',
3771                         p_where_clause    => l_where_clause
3772                         ) = Fnd_Api.g_false
3773                 THEN
3774          IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error)
3775                         THEN
3776             Fnd_Message.set_name('AMS', 'AMS_METR_ACT_DUP_ID');
3777             Fnd_Msg_Pub.ADD;
3778          END IF;
3779          x_return_status := Fnd_Api.g_ret_sts_error;
3780          RETURN;
3781       END IF;
3782    END IF;
3783 
3784    -- check other unique items
3785 
3786    -- Function metrics may only be added once.
3787    IF p_validation_mode = Jtf_Plsql_Api.g_create THEN
3788       l_test := NULL;
3789       OPEN c_check_function(p_act_metric_rec.metric_id,
3790          p_act_metric_rec.arc_act_metric_used_by,
3791          p_act_metric_rec.act_metric_used_by_id,
3792          p_act_metric_rec.arc_function_used_by,
3793          p_act_metric_rec.function_used_by_id);
3794       FETCH c_check_function INTO l_test;
3795       CLOSE c_check_function;
3796 
3797       IF l_test IS NULL THEN
3798          IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
3799             Fnd_Message.set_name('AMS', 'AMS_ACT_MET_DUP_FUNCTION');
3800             Fnd_Msg_Pub.ADD;
3801          END IF;
3802          x_return_status := Fnd_Api.g_ret_sts_error;
3803       END IF;
3804 
3805    END IF;
3806 
3807 END Check_ActMetric_Uk_Items;
3808 
3809 
3810 --
3811 -- Start of comments.
3812 --
3813 -- NAME
3814 --    Check_ActMetric_Items
3815 --
3816 -- PURPOSE
3817 --    Perform item level validation for Activity metrics.
3818 --
3819 -- NOTES
3820 --
3821 -- HISTORY
3822 -- 05/26/1999     choang   Created.
3823 -- 10/9/1999      ptendulk Modified According to new Standards
3824 -- 05/08/2000     tdonohoe Modified, do not perform Metric_Id Check if the Activity Metric
3825 --                         is associated with a Forecast.
3826 -- 06-28-2000     rchahal@us     Modified to allow metric creation for Fund.
3827 -- 30-oct-2003    choang   enh 3141834: changed validation for arc_metric_used_for_object
3828 --                         and metric_origin.
3829 --
3830 -- End of comments.
3831 
3832 PROCEDURE Check_ActMetric_Items (
3833    p_act_metric_rec        IN  act_metric_rec_type,
3834    x_return_status         OUT NOCOPY VARCHAR2
3835 )
3836 IS
3837    l_item_name             VARCHAR2(30);  -- Used to standardize error messages.
3838    l_act_metrics_rec       act_metric_rec_type := p_act_metric_rec;
3839    l_return_status         VARCHAR2(1);
3840 
3841    l_table_name            VARCHAR2(30);
3842    l_pk_name               VARCHAR2(30);
3843    l_pk_value              VARCHAR2(30);
3844    l_pk_data_type          VARCHAR2(30);
3845    l_additional_where_clause VARCHAR2(4000);  -- Used by Check_FK_Exists.
3846    l_lookup_type           VARCHAR2(30);
3847 
3848    CURSOR c_arc_metric_usage (p_object_type IN VARCHAR2) IS
3849       SELECT 1
3850       FROM   ams_lookups
3851       WHERE  lookup_type IN ('AMS_METRIC_OBJECT_TYPE', 'AMS_METRIC_ROLLUP_TYPE', 'AMS_METRIC_ALLOCATION_TYPE')
3852       AND    lookup_code = p_object_type
3853       ;
3854    l_dummy                 NUMBER;
3855 
3856 
3857   /*sunkumar april-20-2004*/
3858   CURSOR c_check_metric_id(p_metric_id number) IS
3859     SELECT 1 from ams_metrics_all_b
3860     WHERE METRIC_ID = p_metric_id;
3861 
3862   CURSOR c_check_currency(p_CURRENCY_CODE varchar2, p_enabled_flag varchar2)  IS
3863    SELECT 1 from FND_CURRENCIES
3864    WHERE CURRENCY_CODE = p_CURRENCY_CODE
3865    and enabled_flag = p_enabled_flag;
3866 
3867 BEGIN
3868    -- Initialize return status to success.
3869    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3870 
3871    --
3872    -- Begin Validate Referential
3873    --
3874 
3875    -- METRIC_ID
3876    -- Do not validate FK if NULL
3877    -- Do not validate if Activity Metric is associated with a Forecast.
3878 
3879 
3880    OPEN c_check_metric_id(l_act_metrics_rec.metric_id);
3881     IF c_check_metric_id%NOTFOUND
3882     THEN
3883             IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
3884             THEN
3885                FND_MESSAGE.Set_Name('AMS', 'AMS_METR_INVALID_MET');
3886                FND_MSG_PUB.ADD;
3887             END IF;
3888 
3889             x_return_status := FND_API.G_RET_STS_ERROR;
3890             CLOSE c_check_metric_id;
3891             RETURN;
3892         END IF;
3893    CLOSE c_check_metric_id;
3894 
3895    -- TRANSACTION_CURRENCY_CODE
3896    -- Do not validate FK if NULL
3897    IF l_act_metrics_rec.transaction_currency_code <> Fnd_Api.G_MISS_CHAR THEN
3898 
3899       OPEN c_check_currency(l_act_metrics_rec.transaction_currency_code,'Y');
3900       IF c_check_currency%NOTFOUND
3901       THEN
3902             IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
3903             THEN
3904                FND_MESSAGE.Set_Name('AMS', 'AMS_METR_INVALID_TRANS_CUR');
3905                FND_MSG_PUB.ADD;
3906             END IF;
3907 
3908             x_return_status := FND_API.G_RET_STS_ERROR;
3909             CLOSE c_check_currency;
3910             RETURN;
3911       END IF;
3912       CLOSE c_check_currency;
3913 
3914    END IF;
3915 
3916 
3917       -- FUNCTIONAL_CURRENCY_CODE
3918    -- Do not validate FK if NULL
3919    IF l_act_metrics_rec.functional_currency_code <> Fnd_Api.G_MISS_CHAR THEN
3920 
3921       OPEN c_check_currency(l_act_metrics_rec.functional_currency_code,'Y');
3922     IF c_check_currency%NOTFOUND
3923     THEN
3924             IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
3925             THEN
3926                FND_MESSAGE.Set_Name('AMS', 'AMS_METR_INVALID_FUNC_CUR');
3927                FND_MSG_PUB.ADD;
3928             END IF;
3929 
3930             x_return_status := FND_API.G_RET_STS_ERROR;
3931             RETURN;
3932         END IF;
3933    CLOSE c_check_currency;
3934 
3935      END IF;
3936 
3937 
3938       /*
3939       l_table_name               := 'FND_CURRENCIES';
3940       l_pk_name                  := 'CURRENCY_CODE';
3941       l_pk_value                 := l_act_metrics_rec.transaction_currency_code;
3942       l_pk_data_type             := Ams_Utility_Pvt.G_VARCHAR2;
3943       l_additional_where_clause  := ' enabled_flag = ''Y''';
3944       IF Ams_Utility_Pvt.Check_FK_Exists (
3945              p_table_name                       => l_table_name
3946             ,p_pk_name                      => l_pk_name
3947             ,p_pk_value                     => l_pk_value
3948             ,p_pk_data_type                 => l_pk_data_type
3949             ,p_additional_where_clause  => l_additional_where_clause
3950          ) = Fnd_Api.G_FALSE
3951       THEN
3952          IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3953          THEN
3954                  Fnd_Message.Set_Name('AMS', 'AMS_METR_INVALID_TRANS_CUR');
3955                  Fnd_Msg_Pub.ADD;
3956                  END IF;
3957 
3958                  x_return_status := Fnd_Api.G_RET_STS_ERROR;
3959               RETURN;
3960       END IF;  -- Check_FK_Exists*/
3961 
3962 
3963 
3964       /*l_table_name               := 'FND_CURRENCIES';
3965       l_pk_name                  := 'CURRENCY_CODE';
3966       l_pk_value                 := l_act_metrics_rec.functional_currency_code;
3967       l_pk_data_type             := Ams_Utility_Pvt.G_VARCHAR2;
3968       l_additional_where_clause  := ' enabled_flag = ''Y''';
3969 
3970       IF Ams_Utility_Pvt.Check_FK_Exists (
3971              p_table_name                       => l_table_name
3972             ,p_pk_name                      => l_pk_name
3973             ,p_pk_value                     => l_pk_value
3974             ,p_pk_data_type                 => l_pk_data_type
3975             ,p_additional_where_clause  => l_additional_where_clause
3976          ) = Fnd_Api.G_FALSE
3977       THEN
3978          IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3979          THEN
3980             Fnd_Message.Set_Name('AMS', 'AMS_METR_INVALID_FUNC_CUR');
3981             Fnd_Msg_Pub.ADD;
3982          END IF;
3983 
3984          x_return_status := Fnd_Api.G_RET_STS_ERROR;
3985          RETURN;
3986       END IF;  -- Check_FK_Exists*/
3987 
3988 
3989 
3990    --
3991    -- End Validate Referential
3992    --
3993 
3994    --
3995    -- Begin Validate Flags
3996    --
3997 
3998       -- SENSITIVE_DATA_FLAG
3999    IF l_act_metrics_rec.sensitive_data_flag <> Fnd_Api.G_MISS_CHAR THEN
4000       IF Ams_Utility_Pvt.Is_Y_Or_N (l_act_metrics_rec.sensitive_data_flag)
4001                                                           = Fnd_Api.G_FALSE
4002       THEN
4003          IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
4004          THEN
4005             Fnd_Message.Set_Name('AMS', 'AMS_METR_INVALID_SENS_FLAG');
4006             Fnd_Msg_Pub.ADD;
4007          END IF;
4008 
4009          x_return_status := Fnd_Api.G_RET_STS_ERROR;
4010          RETURN;
4011       END IF; -- Is_Y_Or_N
4012    END IF;
4013 
4014    --
4015    -- End Validate Flags
4016    --
4017 
4018    --
4019    -- Begin Validate LOOKUPS
4020    --
4021    -- choang - 30-oct-2003 - enh 3141834: use lookup AMS_METRIC_OBJECT_TYPE,
4022    --                        AMS_METRIC_ALLOCATION_TYPE, AMS_METRIC_ROLLUP_TYPE
4023    -- ARC_METRIC_USED_FOR_OBJECT
4024    IF l_act_metrics_rec.arc_act_metric_used_by <> FND_API.g_miss_char THEN
4025       l_dummy := NULL;
4026       OPEN c_arc_metric_usage(l_act_metrics_rec.arc_act_metric_used_by);
4027       FETCH c_arc_metric_usage INTO l_dummy;
4028       CLOSE c_arc_metric_usage;
4029       IF l_dummy IS NULL THEN
4030          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
4031             Fnd_Message.Set_Name ('AMS', 'AMS_METR_INVALID_USED_BY');
4032             FND_MSG_PUB.add;
4033          END IF;
4034          x_return_status := FND_API.g_ret_sts_error;
4035       END IF;
4036    END IF;
4037 
4038    -- ARC_ACTIVITY_METRIC_ORIGIN
4039    -- DMVINCEN 03/11/2002: Added Dialog Components.
4040    -- DMVINCEN 03/11/2003: Removed Dialogue Components.
4041    IF l_act_metrics_rec.arc_activity_metric_origin <> Fnd_Api.G_MISS_CHAR THEN
4042       l_dummy := NULL;
4043       OPEN c_arc_metric_usage(l_act_metrics_rec.arc_activity_metric_origin);
4044       FETCH c_arc_metric_usage INTO l_dummy;
4045       CLOSE c_arc_metric_usage;
4046       IF l_dummy IS NULL THEN
4047          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
4048             Fnd_Message.Set_Name ('AMS', 'AMS_METR_INVALID_ORIGIN');
4049             FND_MSG_PUB.add;
4050          END IF;
4051          x_return_status := FND_API.g_ret_sts_error;
4052       END IF;
4053    END IF;
4054 
4055    --
4056    -- End Validate LOOKUPS
4057    --
4058 
4059    --
4060    -- End Other Business Rule Validations
4061    --
4062 
4063 EXCEPTION
4064    WHEN OTHERS THEN
4065       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4066 END Check_ActMetric_Items;
4067 
4068 --
4069 -- Start of comments.
4070 --
4071 -- NAME
4072 --    Validate_ActMetric_Record
4073 --
4074 -- PURPOSE
4075 --    Perform Record Level and Other business validations for metrics.
4076 --
4077 -- NOTES
4078 --
4079 -- HISTORY
4080 -- 10/11/1999     ptendulk  Created.
4081 -- 05/08/2000     tdonohoe  Modified, do not perform FK check on Metric_Id
4082 --                          if Activity Metric is associated with a Forecast.
4083 -- 06/28/2000     rchahal   Modified, do not perform FK check on Metric_Id
4084 --                          if Activity Metric is associated with a Fund.
4085 -- 05/01/2003     choang    bug 2931351 - restrict update of costs and revenues
4086 -- 05/19/2005     choang    Added edit metric access check.
4087 -- End of comments.
4088 
4089 PROCEDURE Validate_ActMetric_record(
4090    p_act_metric_rec   IN  act_metric_rec_type,
4091    p_complete_rec     IN  act_metric_rec_type,
4092    x_return_status    OUT NOCOPY VARCHAR2
4093 )
4094 IS
4095 BEGIN
4096    Validate_ActMetric_Record (
4097       p_act_metric_rec  => p_act_metric_rec,
4098       p_complete_rec    => p_complete_rec,
4099       p_operation_mode  => G_CREATE,
4100       x_return_status   => x_return_status
4101    );
4102 END;
4103 
4104 
4105 --
4106 -- Start of comments.
4107 --
4108 -- NAME
4109 --    Validate_ActMetric_Record
4110 --
4111 -- PURPOSE
4112 --    Perform Record Level and Other business validations for metrics.  Allow for
4113 --    different types of validation based on the type of database operation.
4114 --
4115 -- NOTES
4116 --
4117 -- HISTORY
4118 -- 06-May-2003    choang   bug 2931351 - restrict update of costs and revenues
4119 -- End of comments.
4120 
4121 PROCEDURE Validate_ActMetric_record(
4122    p_act_metric_rec  IN  act_metric_rec_type,
4123    p_complete_rec    IN  act_metric_rec_type,
4124    p_operation_mode  IN VARCHAR2,
4125    x_return_status   OUT NOCOPY VARCHAR2
4126 )
4127 IS
4128    L_ALLOW_ACTUAL_UPDATE_METR  CONSTANT VARCHAR2(30) := 'AMS_ALLOW_ACTUAL_UPDATE';
4129 
4130    l_act_metrics_rec              act_metric_rec_type := p_act_metric_rec ;
4131 
4132    l_table_name                  VARCHAR2(30);
4133    l_pk_name                     VARCHAR2(30);
4134    l_pk_value                    VARCHAR2(30);
4135    l_pk_data_type                VARCHAR2(30);
4136    l_additional_where_clause     VARCHAR2(4000);  -- Used by Check_FK_Exists.
4137 
4138    l_allow_actual_update         VARCHAR2(1);
4139    l_freeze_status               VARCHAR2(1);
4140 
4141    l_return_status                               VARCHAR2(1);
4142 
4143    CURSOR c_metric_details (p_metric_id IN NUMBER) IS
4144       SELECT uom_type,
4145              metric_calculation_type,
4146              arc_metric_used_for_object,
4147              metric_category
4148       FROM   ams_metrics_all_b
4149       WHERE metric_id = p_metric_id;
4150    l_metric_details_rec    c_metric_details%ROWTYPE;
4151 
4152    l_object_name AMS_LOOKUPS.MEANING%TYPE;
4153 
4154    CURSOR c_ref_metric (p_act_metric_id NUMBER) IS
4155       SELECT func_actual_value,
4156              trans_forecasted_value,
4157              forecasted_variable_value
4158       FROM   ams_act_metrics_all
4159       WHERE  activity_metric_id = p_act_metric_id;
4160 
4161 
4162 
4163   CURSOR c_check_uom(p_uom_code varchar2,p_uom_class varchar2 ) IS
4164     SELECT 1 from MTL_UNITS_OF_MEASURE
4165     WHERE UOM_CODE = p_uom_code
4166     AND   uom_class = p_uom_class;
4167 
4168    l_ref_metric_rec     c_ref_metric%ROWTYPE;
4169 BEGIN
4170 
4171    x_return_status := Fnd_Api.g_ret_sts_success;
4172 
4173    -- Initialize any values that are needed from
4174    -- the database to do comparisons in the validation.
4175    OPEN c_metric_details (l_act_metrics_rec.metric_id);
4176    FETCH c_metric_details INTO l_metric_details_rec;
4177    CLOSE c_metric_details;
4178 
4179    OPEN c_ref_metric (l_act_metrics_rec.activity_metric_id);
4180    FETCH c_ref_metric INTO l_ref_metric_rec;
4181    CLOSE c_ref_metric;
4182 
4183    -- Used for validation of forecast and actual value
4184    -- updates.
4185    Check_Freeze_Status (l_act_metrics_rec,
4186                         G_UPDATE, -- Update is operation mode
4187                         l_freeze_status,
4188                         l_return_status);
4189 
4190    -- Validate Update Mode --
4191    IF p_operation_mode = G_UPDATE THEN
4192       --
4193       -- choang - 11-may-2005 - validate edit metric access
4194       IF AMS_Access_PVT.check_update_access (
4195             p_object_id           => l_act_metrics_rec.act_metric_used_by_id,
4196             p_object_type         => l_act_metrics_rec.arc_act_metric_used_by,
4197             p_user_or_role_id     => AMS_Utility_PVT.get_resource_id (FND_GLOBAL.user_id),
4198             p_user_or_role_type   => 'USER') <> 'F' THEN
4199          x_return_status := Fnd_Api.G_RET_STS_ERROR;
4200          FND_MESSAGE.set_name ('AMS', 'AMS_NO_METRIC_UPDATE_ACCESS');
4201          FND_MESSAGE.set_token('OBJECT',
4202                                AMS_Utility_PVT.get_object_name(l_act_metrics_rec.arc_act_metric_used_by,
4203                                                                l_act_metrics_rec.act_metric_used_by_id)
4204                               );
4205          FND_MSG_PUB.add;
4206          -- exit the program immediately after this
4207          -- validation fails because it defines the
4208          -- entry requirement for executing any other
4209          -- logic for activity metrics; this is as if
4210          -- the validation is done at a "higher" level
4211          -- before the act metric API is invoked.
4212          RETURN;
4213       END IF;
4214 
4215       --
4216       -- choang - 01-may-2003 - validate forecast value update
4217       -- moved from the main update api
4218       --
4219       IF (l_freeze_status = Fnd_Api.G_TRUE)
4220          AND ((nvl(l_act_metrics_rec.trans_forecasted_value,0) <> FND_API.g_miss_num
4221             AND NVL (l_act_metrics_rec.trans_forecasted_value, 0) <>
4222                 NVL (l_ref_metric_rec.trans_forecasted_value, 0) )
4223            OR ( nvl(l_act_metrics_rec.forecasted_variable_value,0) <> FND_API.g_miss_num
4224          AND NVL (l_act_metrics_rec.forecasted_variable_value, 0) <>
4225              NVL (l_ref_metric_rec.forecasted_variable_value, 0) ) )
4226          AND l_metric_details_rec.metric_category IN
4227               (G_CATEGORY_COSTS, G_CATEGORY_REVENUES)
4228          AND l_metric_details_rec.metric_calculation_type IN
4229               ('MANUAL', 'FUNCTION') THEN
4230          -- frozen to update the forecast COST.
4231          -- this portion calls the Complete_ActMetric_Rec
4232          -- to set trans_forecasted_value back to
4233          -- its original value
4234 
4235          IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
4236               l_object_name := ams_utility_pvt.get_lookup_meaning(
4237                      'AMS_SYS_ARC_QUALIFIER',
4238                      l_act_metrics_rec.arc_act_metric_used_by);
4239               Fnd_Message.set_name('AMS', 'AMS_UPDATE_FORECAST');
4240               Fnd_Message.set_token('OBJECT', l_object_name);
4241               Fnd_Msg_Pub.ADD;
4242          END IF;  --msg_pub if
4243          x_return_status := Fnd_Api.G_RET_STS_ERROR;
4244       END IF;
4245 
4246       --
4247       -- bug 2931351 - disallow update of actuals before active
4248       --
4249       -- Make a call-out to check the frozen status.
4250       -- If it is frozen, disallow the operation.
4251       -- Use NVL for comparison of NULLs to 0 because
4252       -- refresh engine updates NULL metrics to 0.
4253       IF l_act_metrics_rec.trans_actual_value <> FND_API.g_miss_num
4254          AND NVL (l_act_metrics_rec.trans_actual_value, 0) <>
4255                 NVL (l_ref_metric_rec.func_actual_value, 0)
4256          AND l_metric_details_rec.metric_category IN
4257                 (G_CATEGORY_COSTS, G_CATEGORY_REVENUES)
4258          AND l_metric_details_rec.metric_calculation_type IN
4259                 ('MANUAL', 'FUNCTION') THEN
4260          l_allow_actual_update :=
4261                 NVL(Fnd_Profile.Value (L_ALLOW_ACTUAL_UPDATE_METR),'N');
4262 
4263           --sunkumar 04/30/2003
4264           --added profile option to restrict updation of actuals
4265          IF (l_allow_actual_update = 'N') THEN
4266             --object is not active and profile is N hence do not allow update
4267             IF (l_freeze_status = Fnd_Api.G_FALSE) THEN
4268                IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
4269                   Fnd_Message.set_name('AMS', 'AMS_METR_UPDATE_ACTUAL');
4270                   Fnd_Msg_Pub.ADD;
4271                END IF;  --msg_pub if
4272 
4273                x_return_status := Fnd_Api.G_RET_STS_ERROR;
4274             END IF;  --freeze status if
4275          END IF;  --profile if
4276       END IF;  -- check if func_actual_value changed
4277    -- Validate Create Mode --
4278    ELSIF p_operation_mode = G_CREATE THEN
4279       --
4280       -- bug 4661335 - disallow create of actuals before active
4281       --
4282       -- Make a call-out to check the frozen status.
4283       -- If it is frozen, disallow the operation.
4284       -- Use NVL for comparison of NULLs to 0 because
4285       -- refresh engine updates NULL metrics to 0.
4286       IF l_act_metrics_rec.trans_actual_value <> FND_API.g_miss_num
4287          AND NVL (l_act_metrics_rec.trans_actual_value, 0) <> 0
4288          AND l_metric_details_rec.metric_category IN
4289                 (G_CATEGORY_COSTS, G_CATEGORY_REVENUES)
4290          AND l_metric_details_rec.metric_calculation_type IN
4291                 ('MANUAL', 'FUNCTION') THEN
4292          l_allow_actual_update :=
4293                 NVL(Fnd_Profile.Value (L_ALLOW_ACTUAL_UPDATE_METR),'N');
4294 
4295           -- Profile option to restrict updation of actuals.
4296          IF (l_allow_actual_update = 'N') THEN
4297             --object is not active and profile is N hence do not allow update
4298             IF (l_freeze_status = Fnd_Api.G_FALSE) THEN
4299                IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
4300                   Fnd_Message.set_name('AMS', 'AMS_METR_UPDATE_ACTUAL');
4301                   Fnd_Msg_Pub.ADD;
4302                END IF;  --msg_pub if
4303 
4304                x_return_status := Fnd_Api.G_RET_STS_ERROR;
4305             END IF;  --freeze status if
4306          END IF;  --profile if
4307       END IF;  -- check if func_actual_value changed
4308 
4309 
4310       NULL; -- nothing here yet
4311    -- Validate Delete Mode --
4312    ELSIF p_operation_mode = G_DELETE THEN
4313       NULL; -- nothing here yet
4314    END IF;
4315 
4316    -- Validate All Modes --
4317     IF l_act_metrics_rec.arc_act_metric_used_by <> Fnd_Api.G_MISS_CHAR THEN
4318 
4319        IF l_act_metrics_rec.act_metric_used_by_id = Fnd_Api.G_MISS_NUM THEN
4320           l_act_metrics_rec.act_metric_used_by_id  :=
4321                                       p_complete_rec.act_metric_used_by_id;
4322        END IF;
4323 
4324        IF l_act_metrics_rec.metric_id = Fnd_Api.G_MISS_NUM THEN
4325           l_act_metrics_rec.metric_id  := p_complete_rec.metric_id;
4326        END IF;
4327 
4328           -- DMVINCEN 06/07/2001
4329           -- The object type must match between the metric and the object
4330           -- being assigned only if the calculation type is MANUAL or FUNCTION.
4331           -- SUMMARY or ROLLUP metrics can be assigned to any object.
4332           IF l_metric_details_rec.metric_calculation_type IS NULL OR
4333              (l_metric_details_rec.metric_calculation_type IN ('MANUAL', 'FUNCTION') AND
4334               l_metric_details_rec.arc_metric_used_for_object <> l_act_metrics_rec.arc_act_metric_used_by)
4335           THEN
4336 
4337             IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
4338             THEN
4339                Fnd_Message.Set_Name('AMS', 'AMS_METR_INVALID_ACT_USAGE');
4340                Fnd_Msg_Pub.ADD;
4341             END IF;
4342 
4343             x_return_status := Fnd_Api.G_RET_STS_ERROR;
4344          END IF;  -- Check_FK_Exists
4345 
4346       -- Get table_name and pk_name for the ARC qualifier.
4347    /*sunkumar 21-apr-2004 added*/
4348     IF Validate_Object_Exists(
4349                 p_object_type => l_act_metrics_rec.arc_act_metric_used_by
4350                  ,p_object_id     => l_act_metrics_rec.act_metric_used_by_id
4351     ) = Fnd_Api.G_FALSE
4352       THEN
4353             IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
4354             l_object_name := ams_utility_pvt.get_lookup_meaning(
4355              'AMS_SYS_ARC_QUALIFIER',l_act_metrics_rec.arc_act_metric_used_by);
4356             Fnd_Message.Set_Name ('AMS', 'AMS_METR_INVALID_OBJECT');
4357             Fnd_Message.Set_Token('OBJTYPE',l_object_name);
4358             Fnd_Message.Set_Token('OBJID',l_pk_value);
4359             Fnd_Msg_Pub.ADD;
4360             END IF;
4361 
4362             x_return_status := Fnd_Api.G_RET_STS_ERROR;
4363       END IF;
4364 
4365    END IF;
4366 
4367    -- METRIC_UOM_CODE
4368    IF l_act_metrics_rec.metric_uom_code <> Fnd_Api.G_MISS_CHAR THEN
4369       IF l_act_metrics_rec.metric_id = Fnd_Api.G_MISS_NUM THEN
4370          l_act_metrics_rec.metric_id  := p_complete_rec.metric_id ;
4371       END IF;
4372 
4373     OPEN c_check_uom(l_act_metrics_rec.metric_uom_code,l_metric_details_rec.uom_type);
4374     IF c_check_uom%NOTFOUND
4375     THEN
4376             IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
4377             THEN
4378                FND_MESSAGE.Set_Name('AMS', 'AMS_METR_INVALID_UOM');
4379                FND_MSG_PUB.ADD;
4380             END IF;
4381 
4382             x_return_status := FND_API.G_RET_STS_ERROR;
4383             CLOSE c_check_uom;
4384             RETURN;
4385         END IF;
4386      CLOSE c_check_uom;
4387    END IF;
4388 
4389    IF l_act_metrics_rec.arc_activity_metric_origin <> Fnd_Api.G_MISS_CHAR THEN
4390       IF l_act_metrics_rec.activity_metric_origin_id = Fnd_Api.G_MISS_NUM THEN
4391          l_act_metrics_rec.activity_metric_origin_id :=
4392                                      p_complete_rec.activity_metric_origin_id;
4393       END IF;
4394 
4395           -- Get table_name and pk_name for the ARC qualifier.
4396    /*sunkumar 21-apr-2004 added*/
4397     IF Validate_Object_Exists(
4398                 p_object_type => l_act_metrics_rec.arc_act_metric_used_by
4399                  ,p_object_id     => l_act_metrics_rec.act_metric_used_by_id
4400     ) = Fnd_Api.G_FALSE
4401       THEN
4402          IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
4403          Fnd_Message.Set_Name ('AMS', 'AMS_METR_INVALID_ORIGIN');
4404          Fnd_Msg_Pub.ADD;
4405          END IF;
4406 
4407          x_return_status := Fnd_Api.G_RET_STS_ERROR;
4408       END IF;
4409    END IF;
4410 
4411    --
4412    -- Other Business Rule Validations
4413    --
4414 END Validate_ActMetric_record;
4415 
4416 
4417 
4418 --
4419 -- Start of comments.
4420 --
4421 -- NAME
4422 --    Validate_ActMetric_Items
4423 --
4424 -- PURPOSE
4425 --    Perform All Item level validation for Activity metrics.
4426 --
4427 -- NOTES
4428 --
4429 -- HISTORY
4430 -- 10/11/1999     ptendulk            Created.
4431 --
4432 -- End of comments.
4433 
4434 PROCEDURE Validate_ActMetric_items(
4435    p_act_metric_rec    IN  act_metric_rec_type,
4436    p_validation_mode   IN  VARCHAR2 := Jtf_Plsql_Api.g_create,
4437    x_return_status     OUT NOCOPY VARCHAR2
4438 )
4439 IS
4440 BEGIN
4441 
4442    Check_Req_ActMetrics_Items(
4443       p_act_metric_rec  => p_act_metric_rec,
4444       x_return_status    => x_return_status
4445    );
4446    IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
4447       RETURN;
4448    END IF;
4449 
4450    Check_ActMetric_Uk_Items(
4451       p_act_metric_rec    => p_act_metric_rec,
4452       p_validation_mode   => p_validation_mode,
4453       x_return_status     => x_return_status
4454    );
4455 
4456    IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
4457       RETURN;
4458    END IF;
4459 
4460    Check_ActMetric_Items(
4461       p_act_metric_rec   => p_act_metric_rec,
4462       x_return_status     => x_return_status
4463    );
4464 
4465    IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
4466       RETURN;
4467    END IF;
4468 
4469 
4470 
4471 END Validate_ActMetric_items;
4472 
4473 --
4474 -- Begin of section added by ptendulk - 10/11/1999
4475 --
4476 -- NAME
4477 --    Complete_Metric_Rec
4478 --
4479 -- PURPOSE
4480 --   Returns the Initialized Activity Metric Record
4481 --
4482 -- NOTES
4483 --
4484 -- HISTORY
4485 -- 07/19/1999   choang         Created.
4486 --
4487 PROCEDURE Complete_ActMetric_Rec(
4488    p_act_metric_rec      IN  act_metric_rec_type,
4489    x_complete_rec        IN OUT NOCOPY act_metric_rec_type
4490 )
4491 IS
4492    CURSOR c_act_metric IS
4493    SELECT *
4494      FROM ams_act_metrics_all
4495     WHERE activity_metric_id = p_act_metric_rec.activity_metric_id;
4496 
4497    l_act_metric_rec  c_act_metric%ROWTYPE;
4498 BEGIN
4499 
4500    x_complete_rec := p_act_metric_rec;
4501 
4502    OPEN c_act_metric;
4503    FETCH c_act_metric INTO l_act_metric_rec;
4504    IF c_act_metric%NOTFOUND THEN
4505       CLOSE c_act_metric;
4506       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
4507          Fnd_Message.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
4508          Fnd_Msg_Pub.ADD;
4509       END IF;
4510       RAISE Fnd_Api.g_exc_error;
4511    END IF;
4512    CLOSE c_act_metric;
4513 
4514 
4515    IF p_act_metric_rec.act_metric_used_by_id = Fnd_Api.G_MISS_NUM THEN
4516       x_complete_rec.act_metric_used_by_id := l_act_metric_rec.act_metric_used_by_id;
4517    END IF;
4518 
4519    IF p_act_metric_rec.arc_act_metric_used_by = Fnd_Api.G_MISS_CHAR THEN
4520       x_complete_rec.arc_act_metric_used_by := l_act_metric_rec.arc_act_metric_used_by;
4521    END IF;
4522 
4523    IF p_act_metric_rec.purchase_req_raised_flag = Fnd_Api.G_MISS_CHAR THEN
4524       x_complete_rec.purchase_req_raised_flag := l_act_metric_rec.purchase_req_raised_flag;
4525    END IF;
4526 
4527    IF p_act_metric_rec.application_id = Fnd_Api.G_MISS_NUM THEN
4528       x_complete_rec.application_id := l_act_metric_rec.application_id;
4529    END IF;
4530 
4531    IF p_act_metric_rec.sensitive_data_flag = Fnd_Api.G_MISS_CHAR THEN
4532       x_complete_rec.sensitive_data_flag := l_act_metric_rec.sensitive_data_flag;
4533    END IF;
4534 
4535    IF p_act_metric_rec.budget_id = Fnd_Api.G_MISS_NUM THEN
4536       x_complete_rec.budget_id := l_act_metric_rec.budget_id;
4537    END IF;
4538 
4539    IF p_act_metric_rec.metric_id = Fnd_Api.G_MISS_NUM THEN
4540       x_complete_rec.metric_id := l_act_metric_rec.metric_id;
4541    END IF;
4542 
4543    IF p_act_metric_rec.transaction_currency_code = Fnd_Api.G_MISS_CHAR THEN
4544       x_complete_rec.transaction_currency_code := l_act_metric_rec.transaction_currency_code;
4545    END IF;
4546 
4547    IF NVL(p_act_metric_rec.trans_forecasted_value,-1) = Fnd_Api.G_MISS_NUM THEN
4548       x_complete_rec.trans_forecasted_value := l_act_metric_rec.trans_forecasted_value;
4549    END IF;
4550 
4551    IF p_act_metric_rec.trans_committed_value = Fnd_Api.G_MISS_NUM THEN
4552       x_complete_rec.trans_committed_value := l_act_metric_rec.trans_committed_value;
4553    END IF;
4554 
4555    IF p_act_metric_rec.trans_actual_value = Fnd_Api.G_MISS_NUM THEN
4556       x_complete_rec.trans_actual_value := l_act_metric_rec.trans_actual_value;
4557    END IF;
4558 
4559    IF p_act_metric_rec.functional_currency_code = Fnd_Api.G_MISS_CHAR THEN
4560       x_complete_rec.functional_currency_code := l_act_metric_rec.functional_currency_code;
4561    END IF;
4562 
4563    IF p_act_metric_rec.func_forecasted_value = Fnd_Api.G_MISS_NUM THEN
4564       x_complete_rec.func_forecasted_value := l_act_metric_rec.func_forecasted_value;
4565    END IF;
4566 
4567    IF p_act_metric_rec.func_committed_value = Fnd_Api.G_MISS_NUM THEN
4568       x_complete_rec.func_committed_value := l_act_metric_rec.func_committed_value;
4569    END IF;
4570 
4571    IF p_act_metric_rec.func_actual_value = Fnd_Api.G_MISS_NUM THEN
4572       x_complete_rec.func_actual_value := l_act_metric_rec.func_actual_value;
4573    END IF;
4574 
4575    IF p_act_metric_rec.dirty_flag = Fnd_Api.G_MISS_CHAR THEN
4576      IF (l_act_metric_rec.trans_actual_value <>
4577                                         x_complete_rec.trans_actual_value) OR
4578        (l_act_metric_rec.transaction_currency_code <>
4579                                         x_complete_rec.transaction_currency_code) OR
4580        (l_act_metric_rec.trans_forecasted_value <>
4581                                         x_complete_rec.trans_forecasted_value) OR
4582        (l_act_metric_rec.variable_value <>
4583                                         x_complete_rec.variable_value) or
4584        (l_act_metric_rec.forecasted_variable_value <>
4585                                         x_complete_rec.forecasted_variable_value) THEN
4586                 --SVEERAVE, 10/16/00 to default dirty_flag to Y incase of changes in
4587                 -- actual/forecasted values.
4588           x_complete_rec.dirty_flag := G_IS_DIRTY;
4589 --      x_complete_rec.dirty_flag := l_act_metric_rec.dirty_flag;
4590      ELSE
4591           x_complete_rec.dirty_flag := NVL(l_act_metric_rec.dirty_flag,G_IS_DIRTY);
4592      END IF;
4593    END IF;
4594 
4595    IF p_act_metric_rec.last_calculated_date = Fnd_Api.G_MISS_DATE THEN
4596       x_complete_rec.last_calculated_date := l_act_metric_rec.last_calculated_date;
4597    END IF;
4598 
4599    IF p_act_metric_rec.variable_value = Fnd_Api.G_MISS_NUM THEN
4600       x_complete_rec.variable_value := l_act_metric_rec.variable_value;
4601    END IF;
4602 
4603    IF p_act_metric_rec.forecasted_variable_value = Fnd_Api.G_MISS_NUM THEN
4604       x_complete_rec.forecasted_variable_value := l_act_metric_rec.forecasted_variable_value;
4605    END IF;
4606 
4607    IF p_act_metric_rec.computed_using_function_value = Fnd_Api.G_MISS_NUM THEN
4608       x_complete_rec.computed_using_function_value := l_act_metric_rec.computed_using_function_value;
4609    END IF;
4610 
4611    IF p_act_metric_rec.metric_uom_code = Fnd_Api.G_MISS_CHAR THEN
4612       x_complete_rec.metric_uom_code := l_act_metric_rec.metric_uom_code;
4613    END IF;
4614 
4615    IF p_act_metric_rec.attribute_category = Fnd_Api.G_MISS_CHAR THEN
4616       x_complete_rec.attribute_category := l_act_metric_rec.attribute_category;
4617    END IF;
4618 
4619    IF p_act_metric_rec.difference_since_last_calc = Fnd_Api.G_MISS_NUM THEN
4620       x_complete_rec.difference_since_last_calc := l_act_metric_rec.difference_since_last_calc;
4621    END IF;
4622 
4623    IF p_act_metric_rec.activity_metric_origin_id = Fnd_Api.G_MISS_NUM THEN
4624       x_complete_rec.activity_metric_origin_id := l_act_metric_rec.activity_metric_origin_id;
4625    END IF;
4626 
4627    IF p_act_metric_rec.arc_activity_metric_origin = Fnd_Api.G_MISS_CHAR THEN
4628       x_complete_rec.arc_activity_metric_origin := l_act_metric_rec.arc_activity_metric_origin;
4629    END IF;
4630 
4631    IF p_act_metric_rec.days_since_last_refresh = Fnd_Api.G_MISS_NUM THEN
4632       x_complete_rec.days_since_last_refresh := l_act_metric_rec.days_since_last_refresh;
4633    END IF;
4634 
4635    IF p_act_metric_rec.scenario_id = Fnd_Api.G_MISS_NUM THEN
4636       x_complete_rec.scenario_id := l_act_metric_rec.scenario_id;
4637    END IF;
4638 
4639    /***************************************************************/
4640    /*added 17-Apr-2000 tdonohoe@us support 11.5.2 columns         */
4641    /***************************************************************/
4642 
4643    IF p_act_metric_rec.hierarchy_id = Fnd_Api.G_MISS_NUM THEN
4644       x_complete_rec.hierarchy_id := l_act_metric_rec.hierarchy_id;
4645    END IF;
4646 
4647    IF p_act_metric_rec.start_node  = Fnd_Api.G_MISS_NUM THEN
4648       x_complete_rec.start_node   := l_act_metric_rec.start_node;
4649    END IF;
4650 
4651    IF p_act_metric_rec.from_level  = Fnd_Api.G_MISS_NUM THEN
4652       x_complete_rec.from_level   := l_act_metric_rec.from_level;
4653    END IF;
4654 
4655    IF p_act_metric_rec.to_level  = Fnd_Api.G_MISS_NUM THEN
4656       x_complete_rec.to_level   := l_act_metric_rec.to_level;
4657    END IF;
4658 
4659    IF p_act_metric_rec.from_date  = Fnd_Api.G_MISS_DATE THEN
4660       x_complete_rec.from_date   := l_act_metric_rec.from_date;
4661    END IF;
4662 
4663    IF p_act_metric_rec.TO_DATE  = Fnd_Api.G_MISS_DATE THEN
4664       x_complete_rec.TO_DATE   := l_act_metric_rec.TO_DATE;
4665    END IF;
4666 
4667    IF p_act_metric_rec.amount1  = Fnd_Api.G_MISS_NUM THEN
4668       x_complete_rec.amount1   := l_act_metric_rec.amount1;
4669    END IF;
4670 
4671    IF p_act_metric_rec.amount2  = Fnd_Api.G_MISS_NUM THEN
4672       x_complete_rec.amount2   := l_act_metric_rec.amount2;
4673    END IF;
4674 
4675    IF p_act_metric_rec.amount3  = Fnd_Api.G_MISS_NUM THEN
4676       x_complete_rec.amount3   := l_act_metric_rec.amount3;
4677    END IF;
4678 
4679    IF p_act_metric_rec.percent1  = Fnd_Api.G_MISS_NUM THEN
4680       x_complete_rec.percent1   := l_act_metric_rec.percent1;
4681    END IF;
4682 
4683    IF p_act_metric_rec.percent2  = Fnd_Api.G_MISS_NUM THEN
4684       x_complete_rec.percent2   := l_act_metric_rec.percent2;
4685    END IF;
4686 
4687    IF p_act_metric_rec.percent3  = Fnd_Api.G_MISS_NUM THEN
4688       x_complete_rec.percent3   := l_act_metric_rec.percent3;
4689    END IF;
4690 
4691    IF p_act_metric_rec.published_flag  = Fnd_Api.G_MISS_CHAR THEN
4692       x_complete_rec.published_flag   := l_act_metric_rec.published_flag;
4693    END IF;
4694 
4695    IF p_act_metric_rec.pre_function_name  = Fnd_Api.G_MISS_CHAR THEN
4696       x_complete_rec.pre_function_name   := l_act_metric_rec.pre_function_name;
4697    END IF;
4698 
4699    IF p_act_metric_rec.post_function_name  = Fnd_Api.G_MISS_CHAR THEN
4700       x_complete_rec.post_function_name   := l_act_metric_rec.post_function_name;
4701    END IF;
4702 
4703    IF p_act_metric_rec.attribute1 = Fnd_Api.G_MISS_CHAR THEN
4704       x_complete_rec.attribute1 := l_act_metric_rec.attribute1;
4705    END IF;
4706 
4707    IF p_act_metric_rec.attribute2 = Fnd_Api.G_MISS_CHAR THEN
4708       x_complete_rec.attribute2 := l_act_metric_rec.attribute2;
4709    END IF;
4710 
4711    IF p_act_metric_rec.attribute3 = Fnd_Api.G_MISS_CHAR THEN
4712       x_complete_rec.attribute3 := l_act_metric_rec.attribute3;
4713    END IF;
4714 
4715    IF p_act_metric_rec.attribute4 = Fnd_Api.G_MISS_CHAR THEN
4716       x_complete_rec.attribute4 := l_act_metric_rec.attribute4;
4717    END IF;
4718 
4719    IF p_act_metric_rec.attribute5 = Fnd_Api.G_MISS_CHAR THEN
4720       x_complete_rec.attribute5 := l_act_metric_rec.attribute5;
4721    END IF;
4722 
4723    IF p_act_metric_rec.attribute6 = Fnd_Api.G_MISS_CHAR THEN
4724       x_complete_rec.attribute6 := l_act_metric_rec.attribute6;
4725    END IF;
4726 
4727    IF p_act_metric_rec.attribute7 = Fnd_Api.G_MISS_CHAR THEN
4728       x_complete_rec.attribute7 := l_act_metric_rec.attribute7;
4729    END IF;
4730 
4731    IF p_act_metric_rec.attribute8 = Fnd_Api.G_MISS_CHAR THEN
4732       x_complete_rec.attribute8 := l_act_metric_rec.attribute8;
4733    END IF;
4734 
4735    IF p_act_metric_rec.attribute9 = Fnd_Api.G_MISS_CHAR THEN
4736       x_complete_rec.attribute9 := l_act_metric_rec.attribute9;
4737    END IF;
4738 
4739    IF p_act_metric_rec.attribute10 = Fnd_Api.G_MISS_CHAR THEN
4740       x_complete_rec.attribute10 := l_act_metric_rec.attribute10;
4741    END IF;
4742 
4743    IF p_act_metric_rec.attribute11 = Fnd_Api.G_MISS_CHAR THEN
4744       x_complete_rec.attribute11 := l_act_metric_rec.attribute11;
4745    END IF;
4746 
4747    IF p_act_metric_rec.attribute12 = Fnd_Api.G_MISS_CHAR THEN
4748       x_complete_rec.attribute12 := l_act_metric_rec.attribute12;
4749    END IF;
4750 
4751    IF p_act_metric_rec.attribute13 = Fnd_Api.G_MISS_CHAR THEN
4752       x_complete_rec.attribute13 := l_act_metric_rec.attribute13;
4753    END IF;
4754 
4755    IF p_act_metric_rec.attribute14 = Fnd_Api.G_MISS_CHAR THEN
4756       x_complete_rec.attribute14 := l_act_metric_rec.attribute14;
4757    END IF;
4758 
4759    IF p_act_metric_rec.attribute15 = Fnd_Api.G_MISS_CHAR THEN
4760       x_complete_rec.attribute15 := l_act_metric_rec.attribute15;
4761    END IF;
4762 
4763 -- DMVINCEN 05/01/2001: New columns.
4764    IF p_act_metric_rec.act_metric_date = Fnd_Api.G_MISS_DATE THEN
4765       x_complete_rec.act_metric_date := l_act_metric_rec.act_metric_date;
4766    END IF;
4767 
4768    IF p_act_metric_rec.description = Fnd_Api.G_MISS_CHAR THEN
4769       x_complete_rec.description := l_act_metric_rec.description;
4770    END IF;
4771 
4772 -- DMVINCEN 05/01/2001: End new columns.
4773 
4774    IF p_act_metric_rec.depend_act_metric = Fnd_Api.G_MISS_NUM THEN
4775       x_complete_rec.depend_act_metric := l_act_metric_rec.depend_act_metric;
4776    END IF;
4777 
4778 -- DMVINCEN 03/08/2002:
4779 
4780    IF p_act_metric_rec.function_used_by_id = Fnd_Api.G_MISS_NUM THEN
4781       x_complete_rec.function_used_by_id := l_act_metric_rec.function_used_by_id;
4782    END IF;
4783 
4784    IF p_act_metric_rec.arc_function_used_by = Fnd_Api.G_MISS_CHAR THEN
4785       x_complete_rec.arc_function_used_by := l_act_metric_rec.arc_function_used_by;
4786    END IF;
4787 
4788    /* 05/15/2002 yzhao: add 6 new columns for top-down bottom-up budgeting */
4789    IF p_act_metric_rec.hierarchy_type = Fnd_Api.G_MISS_CHAR THEN
4790       x_complete_rec.hierarchy_type := l_act_metric_rec.hierarchy_type;
4791    END IF;
4792 
4793    IF p_act_metric_rec.status_code = Fnd_Api.G_MISS_CHAR THEN
4794       x_complete_rec.status_code := l_act_metric_rec.status_code;
4795    END IF;
4796 
4797    IF p_act_metric_rec.method_code = Fnd_Api.G_MISS_CHAR THEN
4798       x_complete_rec.method_code := l_act_metric_rec.method_code;
4799    END IF;
4800 
4801    IF p_act_metric_rec.action_code = Fnd_Api.G_MISS_CHAR THEN
4802       x_complete_rec.action_code := l_act_metric_rec.action_code;
4803    END IF;
4804 
4805    IF p_act_metric_rec.basis_year = Fnd_Api.G_MISS_NUM THEN
4806       x_complete_rec.basis_year := l_act_metric_rec.basis_year;
4807    END IF;
4808 
4809    IF p_act_metric_rec.ex_start_node = Fnd_Api.G_MISS_CHAR THEN
4810       x_complete_rec.ex_start_node := l_act_metric_rec.ex_start_node;
4811    END IF;
4812    /* 05/15/2002 yzhao: add ends */
4813 
4814 END Complete_ActMetric_Rec ;
4815 
4816 --
4817 -- End of section added by choang.
4818 --
4819 -- NAME
4820 --    SetCommittedVal
4821 --
4822 -- PURPOSE
4823 --   Updates the functional committed value of a specific
4824 --   metric that is associated with the given business
4825 --   entity.
4826 --
4827 -- NOTES
4828 --
4829 -- HISTORY
4830 -- 07/19/1999   choang         Created.
4831 -- 10/13/1999   ptendulk           Modified According to new standards
4832 --
4833 
4834 PROCEDURE SetCommittedVal (
4835    p_api_version                 IN NUMBER,
4836    p_init_msg_list               IN VARCHAR2 := Fnd_Api.G_FALSE,
4837    p_commit                      IN VARCHAR2 := Fnd_Api.G_FALSE,
4838    p_validation_level            IN NUMBER   := Fnd_Api.G_VALID_LEVEL_FULL,
4839 
4840    x_return_status               OUT NOCOPY VARCHAR2,
4841    x_msg_count                   OUT NOCOPY NUMBER,
4842    x_msg_data                    OUT NOCOPY VARCHAR2,
4843 
4844    p_arc_act_metric_used_by      IN VARCHAR2,
4845    p_act_metric_used_by_id       IN NUMBER,
4846    p_metric_id                   IN NUMBER,
4847    p_func_committed_value        IN NUMBER
4848 )
4849 IS
4850    L_API_VERSION         CONSTANT NUMBER := 1.0;
4851    L_API_NAME            CONSTANT VARCHAR2(30) := 'SETCOMMITTEDVAL';
4852    L_FULL_NAME           CONSTANT VARCHAR2(60) := G_PKG_NAME ||'.'|| L_API_NAME;
4853 
4854    l_return_status       VARCHAR2(1);
4855 
4856 BEGIN
4857    --
4858    -- Initialize savepoint.
4859    --
4860    SAVEPOINT SetCommittedVal_SavePoint;
4861 
4862    --
4863    -- Output debug message.
4864    --
4865    IF (AMS_DEBUG_HIGH_ON) THEN
4866       Ams_Utility_Pvt.debug_message(l_full_name||': start');
4867    END IF;
4868 
4869    --
4870    -- Initialize message list if p_init_msg_list is set to TRUE.
4871    --
4872    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
4873       Fnd_Msg_Pub.Initialize;
4874    END IF;
4875 
4876    --
4877    -- Standard check for API version compatibility.
4878    --
4879    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
4880                                        p_api_version,
4881                                        L_API_NAME,
4882                                        G_PKG_NAME)
4883    THEN
4884       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4885    END IF;
4886 
4887    --
4888    -- Initialize API return status to success.
4889    --
4890    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4891 
4892    --
4893    -- Begin API Body.
4894    --
4895 
4896    --
4897    -- Output debug message.
4898    --
4899    IF (AMS_DEBUG_HIGH_ON) THEN
4900       Ams_Utility_Pvt.debug_message(l_full_name||': Update');
4901    END IF;
4902 
4903    UPDATE ams_act_metrics_all
4904       SET   func_committed_value = p_func_committed_value
4905       WHERE arc_act_metric_used_by = p_arc_act_metric_used_by
4906       AND   act_metric_used_by_id = p_act_metric_used_by_id
4907       AND   metric_id = p_metric_id ;
4908    IF SQL%NOTFOUND THEN
4909       --
4910       -- The metric for the given business entity does not
4911       -- exist.  Add the proper message and raise an error.
4912       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4913    END IF;
4914 
4915    --
4916    -- End API Body.
4917    --
4918 
4919    --
4920    -- Standard check for commit request.
4921    --
4922    IF Fnd_Api.To_Boolean (p_commit) THEN
4923       COMMIT WORK;
4924    END IF;
4925 
4926 
4927    --
4928    -- Standard API to get message count, and if 1,
4929    -- set the message data OUT NOCOPY variable.
4930    --
4931    Fnd_Msg_Pub.Count_And_Get (
4932       p_count           =>    x_msg_count,
4933       p_data            =>    x_msg_data,
4934       p_encoded         =>    Fnd_Api.G_FALSE
4935    );
4936 
4937    --
4938    -- Output debug message.
4939    --
4940    IF (AMS_DEBUG_HIGH_ON) THEN
4941       Ams_Utility_Pvt.debug_message(l_full_name||': End');
4942    END IF;
4943 
4944 
4945 EXCEPTION
4946    WHEN Fnd_Api.G_EXC_ERROR THEN
4947       ROLLBACK TO SetCommittedVal_SavePoint;
4948       x_return_status := Fnd_Api.G_RET_STS_ERROR;
4949       Fnd_Msg_Pub.Count_And_Get (
4950          p_count         =>     x_msg_count,
4951          p_data          =>     x_msg_data,
4952          p_encoded       =>   FND_API.G_FALSE
4953       );
4954    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
4955       ROLLBACK TO SetCommittedVal_SavePoint;
4956       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4957       Fnd_Msg_Pub.Count_And_Get (
4958          p_count         =>     x_msg_count,
4959          p_data          =>     x_msg_data,
4960          p_encoded       =>   FND_API.G_FALSE
4961       );
4962    WHEN OTHERS THEN
4963       ROLLBACK TO SetCommittedVal_SavePoint;
4964       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4965       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
4966          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
4967       END IF;
4968       Fnd_Msg_Pub.Count_And_Get (
4969          p_count         =>     x_msg_count,
4970          p_data          =>     x_msg_data,
4971          p_encoded       =>   FND_API.G_FALSE
4972       );
4973 END SetCommittedVal;
4974 
4975 --
4976 -- End of section added by choang - 07/19/1999.
4977 --
4978 --
4979 -- NAME
4980 --    IsSeeded
4981 --
4982 -- PURPOSE
4983 --    Returns whether the given ID is that of a seeded record.
4984 --
4985 -- NOTES
4986 --    As of creation of the function, a seeded record has an ID
4987 --    less than 30,000.
4988 --
4989 -- HISTORY
4990 -- 10/15/1999   ptendulk         Created.
4991 -- 01/18/200    bgeorge         modified to check for IDs below 10000
4992 --
4993 FUNCTION IsSeeded (
4994    p_id        IN NUMBER
4995 )
4996 RETURN BOOLEAN
4997 IS
4998    CURSOR c_met_id(l_act_met_id NUMBER) IS
4999       SELECT metric_id
5000       FROM   ams_act_metrics_all
5001       WHERE activity_metric_id =l_act_met_id;
5002    l_met_rec NUMBER;
5003 BEGIN
5004 
5005   OPEN c_met_id(p_id);
5006   FETCH c_met_id INTO l_met_rec ;
5007   CLOSE c_met_id ;
5008   IF l_met_rec < 10000 THEN
5009      RETURN TRUE;
5010   END IF;
5011 
5012   RETURN FALSE;
5013 END IsSeeded;
5014 
5015 --
5016 -- NAME
5017 --    Default_Func_Currency
5018 --
5019 -- PURPOSE
5020 --    Returns the functional currency for the transaction, Will only be called
5021 --    if the Metric is Currency Metric
5022 --
5023 -- NOTES
5024 --    This function is not complete as of 10/19/1999 , Pending Issue
5025 
5026 --
5027 -- HISTORY
5028 -- 10/15/1999   ptendulk         Created.
5029 -- 08/17/2000   sveerave         modified to get the value from profile.
5030 FUNCTION Default_Func_Currency
5031 RETURN VARCHAR2
5032 IS
5033 BEGIN
5034    RETURN Fnd_Profile.Value('AMS_DEFAULT_CURR_CODE');
5035 --   RETURN 'USD';
5036 END Default_Func_Currency;
5037 
5038 ---------------------------------------------------------------------
5039 -- PROCEDURE
5040 --   check_forecasted_cost
5041 --
5042 -- PURPOSE
5043 --    Checks forecasted amount against object's budget amount, and passes out message in case it is exceeded.
5044 --
5045 -- PARAMETERS
5046         --p_obj_type    IN      VARCHAR2,
5047         --p_obj_id      IN      NUMBER,
5048         --p_category_id IN      NUMBER,
5049         --p_exceeded    OUT NOCOPY     VARCHAR2,
5050         --p_message     OUT NOCOPY     VARCHAR2)--
5051 -- NOTES
5052 --    1. Does only for cost type metrics
5053 --    2. budget will always have transaction amount. metrics will always have functional amount. So, comparisons are made
5054 --       after conversion to common currency, default func currency.
5055 ----------------------------------------------------------------------
5056 
5057 PROCEDURE check_forecasted_cost(p_obj_type      IN      VARCHAR2,
5058                                 p_obj_id        IN      NUMBER,
5059                                 p_category_id   IN      NUMBER,
5060                                 x_exceeded      OUT NOCOPY     VARCHAR2,
5061                                 x_message       OUT NOCOPY     VARCHAR2) IS
5062 
5063      -- select budget amounts for campaign
5064      CURSOR c_get_camp_budget_amounts(l_obj_id       NUMBER) IS
5065          SELECT budget_amount_tc, transaction_currency_code,
5066                budget_amount_fc, functional_currency_code
5067          FROM ams_campaigns_all_b
5068          WHERE campaign_id = l_obj_id;
5069 
5070      -- select budget amounts for campaign
5071      CURSOR c_get_csch_budget_amounts(l_obj_id       NUMBER) IS
5072          SELECT budget_amount_tc, transaction_currency_code,
5073                budget_amount_fc, functional_currency_code
5074          FROM ams_campaign_schedules_b
5075          WHERE schedule_id = l_obj_id;
5076 
5077      -- select budget amounts for event offer
5078      CURSOR c_get_eveof_budget_amounts(l_obj_id      NUMBER) IS
5079          SELECT fund_amount_tc, currency_code_tc,
5080                fund_amount_fc, currency_code_fc
5081          FROM ams_event_offers_all_b
5082          WHERE event_offer_id = l_obj_id;
5083 
5084      -- select budget amounts for event header
5085      CURSOR c_get_evehd_budget_amounts(l_obj_id      NUMBER) IS
5086          SELECT fund_amount_tc, currency_code_tc,
5087                fund_amount_fc, currency_code_fc
5088          FROM ams_event_headers_all_b
5089          WHERE event_header_id = l_obj_id;
5090 
5091      -- select budget amounts for deliverable
5092      CURSOR c_get_deliv_budget_amounts(l_obj_id      NUMBER) IS
5093          SELECT budget_amount_tc, transaction_currency_code,
5094                budget_amount_fc, functional_currency_code
5095          FROM ams_deliverables_all_b
5096          WHERE deliverable_id = l_obj_id;
5097 
5098      -- select forecasted amounts for actmetric
5099      CURSOR c_get_actmet_fore_amounts(l_obj_type     VARCHAR2,
5100                                       l_obj_id      NUMBER,
5101                                       l_category_id NUMBER) IS
5102          SELECT trans_forecasted_value,
5103                transaction_currency_code,
5104                func_forecasted_value,
5105                functional_currency_code
5106          FROM ams_act_metrics_all actmet, ams_metrics_all_b met
5107          WHERE actmet.metric_id = met.metric_id
5108           AND arc_act_metric_used_by = l_obj_type
5109           AND act_metric_used_by_id  = l_obj_id
5110           AND metric_category = l_category_id
5111           AND summarize_to_metric IS NULL
5112           AND metric_calculation_type <> 'FORMULA';
5113 
5114      l_trans_budget_curr_code        VARCHAR2(15);
5115      l_func_budget_curr_code         VARCHAR2(15);
5116      l_trans_budget_amount           NUMBER;
5117      l_func_budget_amount            NUMBER;
5118      l_actmet_trans_curr_code        VARCHAR2(15);
5119      l_actmet_func_curr_code         VARCHAR2(15);
5120      l_actmet_trans_fore_amount      NUMBER;
5121      l_actmet_func_fore_amount       NUMBER;
5122      l_sum_func_fore_amount          NUMBER := 0;
5123      l_default_func_curr_code        VARCHAR2(15);
5124      l_return_status                 VARCHAR2(1);
5125      l_top_level_exists              VARCHAR2(1) := 'F';
5126      l_current_date                  DATE := SYSDATE;
5127      l_sum_tran_fore_amount          NUMBER := 0;
5128 
5129 
5130 BEGIN
5131    -- do only for costs
5132    IF p_category_id = 901 THEN
5133       -- default x_exceeded flag
5134       x_exceeded := 'N';
5135       -- get default functional currency code
5136       l_default_func_curr_code := Default_Func_Currency;
5137 
5138       -- Get forecasted costs for the top level activity metric and sum them.
5139       OPEN c_get_actmet_fore_amounts(p_obj_type, p_obj_id, p_category_id);
5140       LOOP
5141          FETCH c_get_actmet_fore_amounts
5142             INTO l_actmet_trans_fore_amount,
5143                  l_actmet_trans_curr_code,
5144                  l_actmet_func_fore_amount,
5145                  l_actmet_func_curr_code;
5146          EXIT WHEN c_get_actmet_fore_amounts%NOTFOUND;
5147          -- convert act met currency into default currency.
5148          IF l_default_func_curr_code <> l_actmet_func_curr_code THEN
5149             Convert_Currency (
5150                       x_return_status      => l_return_status,
5151                       p_from_currency      => l_actmet_func_curr_code,
5152                       p_to_currency        => l_default_func_curr_code,
5153                       p_conv_date          => l_current_date,
5154                       p_from_amount        => NVL(l_actmet_func_fore_amount,0),
5155                       x_to_amount          => l_actmet_func_fore_amount,
5156                       p_round         => Fnd_Api.G_FALSE);
5157                  IF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
5158                          RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5159                  ELSIF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
5160                          RAISE Fnd_Api.G_EXC_ERROR;
5161                  END IF;
5162          END IF;
5163          l_sum_func_fore_amount := l_sum_func_fore_amount
5164                                     + NVL(l_actmet_func_fore_amount,0);
5165          IF (l_top_level_exists = 'F') THEN
5166             l_top_level_exists := 'T';
5167          END IF;
5168       END LOOP;
5169       CLOSE c_get_actmet_fore_amounts;
5170 
5171       -- Get the budget amounts for the passed in object
5172       -- if top level actmet record exists.
5173       IF (l_top_level_exists = 'T') THEN
5174          -- for campaigns
5175          IF p_obj_type IN ('RCAM', 'CAMP') THEN
5176               OPEN c_get_camp_budget_amounts(p_obj_id);
5177               FETCH c_get_camp_budget_amounts
5178                INTO l_trans_budget_amount,
5179                      l_trans_budget_curr_code,
5180                      l_func_budget_amount,
5181                      l_func_budget_curr_code;
5182             IF c_get_camp_budget_amounts%NOTFOUND THEN
5183                CLOSE c_get_camp_budget_amounts;
5184                RAISE Fnd_Api.G_EXC_ERROR;
5185             END IF;
5186             CLOSE c_get_camp_budget_amounts;
5187          -- for campaign schedules
5188          ELSIF p_obj_type = 'CSCH' THEN
5189               OPEN c_get_csch_budget_amounts(p_obj_id);
5190               FETCH c_get_csch_budget_amounts
5191                INTO l_trans_budget_amount,
5192                      l_trans_budget_curr_code,
5193                      l_func_budget_amount,
5194                      l_func_budget_curr_code;
5195             IF c_get_csch_budget_amounts%NOTFOUND THEN
5196                CLOSE c_get_csch_budget_amounts;
5197                RAISE Fnd_Api.G_EXC_ERROR;
5198             END IF;
5199             CLOSE c_get_csch_budget_amounts;
5200          -- for event offers
5201          ELSIF p_obj_type IN ('EONE', 'EVEO') THEN
5202             OPEN c_get_eveof_budget_amounts(p_obj_id);
5203             FETCH c_get_eveof_budget_amounts
5204                INTO l_trans_budget_amount,
5205                    l_trans_budget_curr_code,
5206                    l_func_budget_amount,
5207                    l_func_budget_curr_code;
5208             IF c_get_eveof_budget_amounts%NOTFOUND THEN
5209                CLOSE c_get_eveof_budget_amounts;
5210                RAISE Fnd_Api.G_EXC_ERROR;
5211             END IF;
5212             CLOSE c_get_eveof_budget_amounts;
5213          -- for event headers
5214          ELSIF p_obj_type = 'EVEH' THEN
5215             OPEN c_get_evehd_budget_amounts(p_obj_id);
5216             FETCH c_get_evehd_budget_amounts
5217                INTO l_trans_budget_amount,
5218                      l_trans_budget_curr_code,
5219                      l_func_budget_amount,
5220                      l_func_budget_curr_code;
5221             IF c_get_evehd_budget_amounts%NOTFOUND THEN
5222                CLOSE c_get_evehd_budget_amounts;
5223                RAISE Fnd_Api.G_EXC_ERROR;
5224             END IF;
5225             CLOSE c_get_evehd_budget_amounts;
5226          -- for deliverables
5227          ELSIF p_obj_type = 'DELV' THEN
5228             OPEN c_get_deliv_budget_amounts(p_obj_id);
5229             FETCH c_get_deliv_budget_amounts
5230              INTO l_trans_budget_amount,
5231                   l_trans_budget_curr_code,
5232                   l_func_budget_amount,
5233                   l_func_budget_curr_code;
5234             IF c_get_deliv_budget_amounts%NOTFOUND THEN
5235                CLOSE c_get_deliv_budget_amounts;
5236                RAISE Fnd_Api.G_EXC_ERROR;
5237             END IF;
5238             CLOSE c_get_deliv_budget_amounts;
5239 
5240          END IF; -- IF p_obj_type = 'CAMP'
5241 
5242          -- convert func budget currency into default currency.
5243          IF l_default_func_curr_code <> l_trans_budget_curr_code THEN
5244             Convert_Currency (
5245                    x_return_status      => l_return_status,
5246                    p_from_currency      => l_default_func_curr_code,
5247                    p_to_currency        => l_trans_budget_curr_code,
5248                    p_conv_date          => l_current_date,
5249                    p_from_amount        => NVL(l_sum_func_fore_amount,0),
5250                    x_to_amount          => l_sum_tran_fore_amount,
5251                    p_round         => Fnd_Api.G_TRUE);
5252             IF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
5253                RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5254             ELSIF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
5255                RAISE Fnd_Api.G_EXC_ERROR;
5256             END IF;
5257          END IF;
5258 
5259          -- compare values in the same defualt functional currency
5260          IF (NVL(l_sum_tran_fore_amount,0) > NVL(l_trans_budget_amount,0)) THEN
5261             x_exceeded := 'Y';
5262          END IF;
5263       END IF;
5264 
5265       IF x_exceeded = 'Y' THEN
5266          x_message := 'AMS_METR_EXCEED_FORECAST';
5267       END IF; --      IF x_exceeded = FND_API.G_TRUE
5268 
5269    END IF; -- IF p_category_id = 901
5270 
5271 END check_forecasted_cost;
5272 
5273 ---------------------------------------------------------------------
5274 -- PROCEDURE
5275 --   Invalidate_Rollup
5276 --
5277 -- PURPOSE
5278 --    Sets the rollup_to_metric to null when the parent object is changed.
5279 --
5280 -- PARAMETERS
5281 --    p_used_by_type
5282 --    p_used_by_id
5283 -- NOTES
5284 --    1. Set the dirty flags for all the rollup metrics so the refresh engine
5285 --       will recalculate.
5286 --    2. Set the rollup_to_metric field to NULL because the associations have
5287 --       changed.  This will make the refresh engine recalculate the
5288 --       rollup associations.
5289 --    3. When the hierarchy of business objects gets changed including deletion
5290 --       and modification, this stored procedure needs to be called for the
5291 --       child business object. For example, when a user modifies the parent
5292 --       of a campaign, call this procedure against the child campaign.
5293 --       Another example, when a user changes an event associated with a
5294 --       campaign, call this stored procedure for old event object. One more
5295 --       example, when a user delete a deliverable from a campaign, call this
5296 --       stored procedure for the deliverable being deleted. You do not need
5297 --       to call this module when you add parent or child
5298 --       to a businness object.
5299 ----------------------------------------------------------------------
5300 PROCEDURE Invalidate_Rollup(
5301    p_api_version       IN  NUMBER,
5302    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
5303    p_commit            IN  VARCHAR2 := Fnd_Api.G_FALSE,
5304 
5305    x_return_status     OUT NOCOPY VARCHAR2,
5306    x_msg_count         OUT NOCOPY NUMBER,
5307    x_msg_data          OUT NOCOPY VARCHAR2,
5308 
5309    p_used_by_type      IN VARCHAR2,
5310    p_used_by_id        IN NUMBER
5311 )
5312 IS
5313 
5314    L_API_VERSION    CONSTANT NUMBER := 1.0;
5315    L_API_NAME       CONSTANT VARCHAR2(30) := 'INVALIDATE_ROLLUP';
5316    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5317 
5318    l_return_status  VARCHAR2(1);
5319 
5320    CURSOR c_find_rollups(l_used_by_type VARCHAR2, l_used_by_id NUMBER) IS
5321        SELECT activity_metric_id
5322          FROM ams_act_metrics_all
5323         WHERE arc_act_metric_used_by = l_used_by_type
5324          AND act_metric_used_by_id = l_used_by_id
5325          AND rollup_to_metric IS NOT NULL;
5326    l_act_metrics_rec c_find_rollups%ROWTYPE;
5327 
5328    l_used_by_type VARCHAR2(100) := p_used_by_type;
5329 BEGIN
5330    IF (AMS_DEBUG_HIGH_ON) THEN
5331 
5332    Ams_Utility_Pvt.debug_message('Invalidating object: '||p_used_by_type||
5333                         ', '||p_used_by_id);
5334    END IF;
5335 
5336    --
5337    -- Initialize savepoint.
5338    --
5339    SAVEPOINT invalidate_rollup_pvt;
5340    --
5341    -- Output debug message.
5342    --
5343    IF (AMS_DEBUG_HIGH_ON) THEN
5344 
5345    Ams_Utility_Pvt.debug_message(l_full_name||': START');
5346    END IF;
5347 
5348    --
5349    -- Initialize message list if p_init_msg_list is set to TRUE.
5350    --
5351    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
5352       Fnd_Msg_Pub.Initialize;
5353    END IF;
5354 
5355    --
5356    -- Standard check for API version compatibility.
5357    --
5358    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
5359                                        p_api_version,
5360                                        L_API_NAME,
5361                                        G_PKG_NAME)
5362    THEN
5363       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5364    END IF;
5365 
5366    --
5367    -- Initialize API return status to success.
5368    --
5369    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5370 
5371    --
5372    -- Begin API Body
5373    --
5374 
5375    FOR l_act_metrics_rec IN c_find_rollups(l_used_by_type, p_used_by_id)
5376    LOOP
5377       Make_Actmetric_Dirty(l_act_metrics_rec.activity_metric_id);
5378    END LOOP;
5379 
5380    UPDATE ams_act_metrics_all
5381       SET rollup_to_metric = NULL
5382     WHERE arc_act_metric_used_by = l_used_by_type
5383       AND act_metric_used_by_id = p_used_by_id
5384       AND rollup_to_metric IS NOT NULL;
5385 
5386    IF Fnd_Api.to_boolean(p_commit) THEN
5387       COMMIT;
5388    END IF;
5389 
5390    --
5391    -- Standard API to get message count, and if 1,
5392    -- set the message data OUT NOCOPY variable.
5393    --
5394    Fnd_Msg_Pub.Count_And_Get (
5395       p_count           =>    x_msg_count,
5396       p_data            =>    x_msg_data,
5397       p_encoded         =>    Fnd_Api.G_FALSE
5398    );
5399 
5400    --
5401    -- Debug message.
5402    --
5403    IF (AMS_DEBUG_HIGH_ON) THEN
5404 
5405    Ams_Utility_Pvt.debug_message(l_full_name ||': END');
5406    END IF;
5407 
5408 EXCEPTION
5409    WHEN Fnd_Api.G_EXC_ERROR THEN
5410       ROLLBACK TO Invalidate_Rollup_pvt;
5411       x_return_status := Fnd_Api.G_RET_STS_ERROR;
5412       Fnd_Msg_Pub.Count_And_Get (
5413          p_count         =>     x_msg_count,
5414          p_data          =>     x_msg_data,
5415          p_encoded       =>   FND_API.G_FALSE
5416       );
5417    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
5418       ROLLBACK TO Invalidate_Rollup_pvt;
5419       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5420       Fnd_Msg_Pub.Count_And_Get (
5421          p_count         =>     x_msg_count,
5422          p_data          =>     x_msg_data,
5423          p_encoded       =>   FND_API.G_FALSE
5424       );
5425    WHEN OTHERS THEN
5426       ROLLBACK TO Invalidate_Rollup_pvt;
5427       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5428       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
5429          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
5430       END IF;
5431       Fnd_Msg_Pub.Count_And_Get (
5432          p_count         =>     x_msg_count,
5433          p_data          =>     x_msg_data,
5434          p_encoded       =>   FND_API.G_FALSE
5435       );
5436 END Invalidate_Rollup;
5437 
5438 -- Start of comments
5439 -- NAME
5440 --    Post_Costs
5441 --
5442 -- PURPOSE
5443 --   Post costs to the budget.
5444 --
5445 -- NOTES
5446 --
5447 -- HISTORY
5448 --   06/01/2001  DMVINCEN Created
5449 
5450 -- End of comments
5451 
5452 PROCEDURE Post_Costs (
5453    p_api_version                IN  NUMBER,
5454    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
5455    p_commit                     IN  VARCHAR2 := Fnd_Api.G_FALSE,
5456    p_validation_level           IN  NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
5457 
5458    x_return_status              OUT NOCOPY VARCHAR2,
5459    x_msg_count                  OUT NOCOPY NUMBER,
5460    x_msg_data                   OUT NOCOPY VARCHAR2,
5461 
5462    p_obj_type                   IN  VARCHAR2,
5463    p_obj_id                     IN  NUMBER
5464 )
5465 IS
5466    L_API_VERSION    CONSTANT NUMBER := 1.0;
5467    L_API_NAME       CONSTANT VARCHAR2(30) := 'POST_COSTS';
5468    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5469 
5470    CURSOR c_get_post_metrics(l_obj_type VARCHAR2, l_obj_id NUMBER) IS
5471       SELECT activity_metric_id,
5472              func_actual_value,
5473              '' description,
5474              functional_currency_code
5475         FROM ams_act_metrics_all amet
5476        WHERE arc_act_metric_used_by = l_obj_type
5477          AND act_metric_used_by_id = l_obj_id
5478          AND (published_flag IS NULL OR published_flag = 'N')
5479          AND EXISTS
5480              (SELECT 'x' FROM ams_metrics_all_b met
5481                WHERE met.metric_id = amet.metric_id
5482                  AND metric_calculation_type IN
5483                   ('FUNCTION', 'MANUAL')
5484                  AND metric_category = 901) -- Costs only
5485       FOR UPDATE OF published_flag NOWAIT;
5486 
5487    l_cost_table OZF_Fund_Adjustment_Pvt.cost_tbl_type;
5488    l_cost_rec OZF_Fund_Adjustment_Pvt.cost_rec_type;
5489    l_func_currency VARCHAR2(30);
5490 
5491 BEGIN
5492    IF (AMS_DEBUG_HIGH_ON) THEN
5493       Ams_Utility_Pvt.debug_message('Now posting costs FOR object: '||p_obj_type||':'||p_obj_id);
5494    END IF;
5495 
5496    --
5497    -- Initialize savepoint.
5498    --
5499    SAVEPOINT Post_ActMetric_pvt;
5500    --
5501    -- Output debug message.
5502    --
5503    IF (AMS_DEBUG_HIGH_ON) THEN
5504       Ams_Utility_Pvt.debug_message(l_full_name||': START');
5505    END IF;
5506 
5507    --
5508    -- Initialize message list if p_init_msg_list is set to TRUE.
5509    --
5510    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
5511       Fnd_Msg_Pub.Initialize;
5512    END IF;
5513 
5514    --
5515    -- Standard check for API version compatibility.
5516    --
5517    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
5518                                        p_api_version,
5519                                        L_API_NAME,
5520                                        G_PKG_NAME)
5521    THEN
5522       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5523    END IF;
5524 
5525    --
5526    -- Initialize API return status to success.
5527    --
5528    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5529 
5530    --
5531    -- Begin API Body
5532    --
5533 
5534    OPEN c_get_post_metrics(p_obj_type, p_obj_id);
5535    LOOP
5536       FETCH c_get_post_metrics INTO l_cost_rec;
5537       EXIT WHEN c_get_post_metrics%NOTFOUND;
5538 
5539       l_func_currency := l_cost_rec.cost_curr;
5540       l_cost_table(c_get_post_metrics%ROWCOUNT) := l_cost_rec;
5541 
5542       UPDATE ams_act_metrics_all
5543          SET published_flag = 'Y'
5544        WHERE CURRENT OF c_get_post_metrics;
5545 
5546    END LOOP;
5547    CLOSE c_get_post_metrics;
5548 
5549    IF l_cost_table.COUNT > 0 THEN
5550       OZF_Fund_Adjustment_Pvt.create_budget_amt_utilized(
5551          p_budget_used_by_id   => p_obj_id,
5552          p_budget_used_by_type => p_obj_type,
5553          p_currency            => l_func_currency,
5554          p_cost_tbl            => l_cost_table,
5555          p_api_version         => l_api_version,
5556          x_return_status       => x_return_status,
5557          x_msg_count           => x_msg_count,
5558          x_msg_data            => x_msg_data);
5559    END IF;
5560 
5561    --
5562    -- End API Body
5563    --
5564 
5565    IF Fnd_Api.to_boolean(p_commit) THEN
5566       COMMIT;
5567    END IF;
5568 
5569    --
5570    -- Standard API to get message count, and if 1,
5571    -- set the message data OUT NOCOPY variable.
5572    --
5573    Fnd_Msg_Pub.Count_And_Get (
5574       p_count           =>    x_msg_count,
5575       p_data            =>    x_msg_data,
5576       p_encoded         =>    Fnd_Api.G_FALSE
5577    );
5578 
5579    --
5580    -- Debug message.
5581    --
5582    IF (AMS_DEBUG_HIGH_ON) THEN
5583       Ams_Utility_Pvt.debug_message(l_full_name ||': END');
5584    END IF;
5585 
5586 
5587 EXCEPTION
5588    WHEN Fnd_Api.G_EXC_ERROR THEN
5589       ROLLBACK TO Post_ActMetric_pvt;
5590       x_return_status := Fnd_Api.G_RET_STS_ERROR;
5591       Fnd_Msg_Pub.Count_And_Get (
5592          p_count         =>     x_msg_count,
5593          p_data          =>     x_msg_data,
5594          p_encoded       =>   FND_API.G_FALSE
5595       );
5596    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
5597       ROLLBACK TO Post_ActMetric_pvt;
5598       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5599       Fnd_Msg_Pub.Count_And_Get (
5600          p_count         =>     x_msg_count,
5601          p_data          =>     x_msg_data,
5602          p_encoded       =>   FND_API.G_FALSE
5603       );
5604    WHEN OTHERS THEN
5605       ROLLBACK TO Post_ActMetric_pvt;
5606       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5607       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
5608          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
5609       END IF;
5610       Fnd_Msg_Pub.Count_And_Get (
5611          p_count         =>     x_msg_count,
5612          p_data          =>     x_msg_data,
5613          p_encoded       =>   FND_API.G_FALSE
5614       );
5615 END Post_Costs;
5616 
5617 --
5618 -- Procedure
5619 --   get_info
5620 --
5621 -- Purpose
5622 --  Gets the currency type information about given currency.
5623 --    Also set the x_invalid_currency flag if the given currency is invalid.
5624 --
5625 -- History
5626 --   15-JUL-97  W Wong   Created
5627 --   10-JUL-01  dmvincen Transfered here from GL_CURRENCY_API
5628 --
5629 -- Arguments
5630 --   x_currency    Currency to be checked
5631 --   x_eff_date    Effecitve date
5632 --   x_conversion_rate   Fixed rate for conversion
5633 --   x_mau                    Minimum accountable unit
5634 --   x_currency_type     Type of currency specified in x_currency
5635 --
5636 PROCEDURE get_info(
5637    x_currency        VARCHAR2,
5638    x_mau       IN OUT NOCOPY   NUMBER,
5639    x_xau       IN OUT NOCOPY   NUMBER ) IS
5640 
5641 BEGIN
5642    -- Get currency information from FND_CURRENCIES table
5643    SELECT NVL( minimum_accountable_unit, POWER( 10, (-1 * PRECISION))),
5644       POWER( 10, (-1 * EXTENDED_PRECISION))
5645    INTO   x_mau, x_xau
5646    FROM   FND_CURRENCIES
5647    WHERE  currency_code = x_currency;
5648 
5649 EXCEPTION
5650    WHEN NO_DATA_FOUND THEN
5651       RAISE Gl_Currency_Api.INVALID_CURRENCY;
5652 
5653 END get_info;
5654 
5655 ---------------------------------------------------------------------
5656 -- PROCEDURE
5657 --    Convert_Currency
5658 -- DESCRIPTION
5659 --    This procedure is copied from GL_CURRENCY_API so that rounding can be
5660 --    controlled.  The functional currency need not be rounded because
5661 --    precision will be lost when converting to other currencies.
5662 --    The displayed currencies must be rounded.
5663 -- NOTE
5664 --    Modified from code done by ptendulk, and choang.
5665 -- HISTORY
5666 -- 09-Aug-2001 dmvincen      Created.
5667 ---------------------------------------------------------------------
5668 PROCEDURE Convert_Currency (
5669    x_return_status      OUT NOCOPY VARCHAR2,
5670    p_from_currency      IN  VARCHAR2,
5671    p_to_currency        IN  VARCHAR2,
5672    p_conv_date          IN  DATE,
5673    p_from_amount        IN  NUMBER,
5674    x_to_amount          OUT NOCOPY NUMBER,
5675    p_round              IN VARCHAR2
5676 )
5677 IS
5678    l_from_dummy  NUMBER := NULL;
5679    l_to_dummy    NUMBER;
5680 BEGIN
5681    Convert_Currency2(
5682       x_return_status => x_return_status,
5683       p_from_currency => p_from_currency,
5684       p_to_currency   => p_to_currency,
5685       p_conv_date     => p_conv_date,
5686       p_from_amount   => p_from_amount,
5687       x_to_amount     => x_to_amount,
5688       p_from_amount2  => l_from_dummy,
5689       x_to_amount2    => l_to_dummy,
5690       p_round         => p_round);
5691 END Convert_Currency;
5692 
5693 ---------------------------------------------------------------------
5694 -- PROCEDURE
5695 --    Convert_Currency2
5696 -- DESCRIPTION
5697 --    This procedure is copied from GL_CURRENCY_API so that rounding can be
5698 --    controlled.  The functional currency need not be rounded because
5699 --    precision will be lost when converting to other currencies.
5700 --    The displayed currencies must be rounded.
5701 -- NOTE
5702 --    Modified from code done by ptendulk, and choang.
5703 -- HISTORY
5704 -- 09-Aug-2001 dmvincen      Created.
5705 -- 18-Dec-2001 dmvincen      Removed rounding when p_round is false.
5706 ---------------------------------------------------------------------
5707 PROCEDURE Convert_Currency2 (
5708    x_return_status      OUT NOCOPY VARCHAR2,
5709    p_from_currency      IN  VARCHAR2,
5710    p_to_currency        IN  VARCHAR2,
5711    p_conv_date          IN  DATE,
5712    p_from_amount        IN  NUMBER,
5713    x_to_amount          OUT NOCOPY NUMBER,
5714    p_from_amount2       IN  NUMBER,
5715    x_to_amount2         OUT NOCOPY NUMBER,
5716    p_round              IN VARCHAR2
5717 )
5718 IS
5719    L_CONVERSION_TYPE_PROFILE  CONSTANT VARCHAR2(30) := 'AMS_CURR_CONVERSION_TYPE';
5720    L_MAX_ROLL_DAYS         CONSTANT NUMBER := -1;  -- Negative so API rolls back to find the last conversion rate.
5721    l_denominator           NUMBER;  -- Not used in Marketing.
5722    l_numerator             NUMBER;  -- Not used in Marketing.
5723    l_rate                  NUMBER;  -- Not used in Marketing.
5724    to_rate                 NUMBER;
5725    to_mau                  NUMBER;
5726    to_xau                  NUMBER;
5727    to_type                 VARCHAR2(8);
5728    l_conversion_type       VARCHAR2(30);  -- Currency conversion type; see API documention for details.
5729 BEGIN
5730    -- Initialize return status.
5731    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5732 
5733    -- Get the currency conversion type from profile option
5734    l_conversion_type := Fnd_Profile.Value (L_CONVERSION_TYPE_PROFILE);
5735 
5736    -- Check if both currencies are identical
5737    IF ( p_from_currency = p_to_currency ) THEN
5738 --       l_denominator      := 1;
5739 --       l_numerator        := 1;
5740 --       l_rate             := 1;
5741       IF p_round = Fnd_Api.G_TRUE THEN
5742          get_info( p_to_currency, to_mau, to_xau );
5743          IF p_from_amount IS NOT NULL THEN
5744             x_to_amount := ROUND( p_from_amount / to_mau ) * to_mau;
5745          END IF;
5746          IF p_from_amount2 IS NOT NULL THEN
5747             x_to_amount2 := ROUND( p_from_amount2 / to_mau ) * to_mau;
5748          END IF;
5749       ELSE
5750           x_to_amount := p_from_amount;
5751           x_to_amount2 := p_from_amount2;
5752       END IF;
5753       RETURN;
5754    END IF;
5755 
5756    -- Get currency information from the to_currency ( for use in rounding )
5757    get_info ( p_to_currency, to_mau, to_xau );
5758 
5759    --
5760    -- Find out the conversion rate using the given conversion type
5761    -- and conversion date.
5762    --
5763    Gl_Currency_Api.get_closest_triangulation_rate(
5764                      p_from_currency,
5765                      p_to_currency,
5766                      p_conv_date,
5767                      l_conversion_type,
5768                      L_MAX_ROLL_DAYS,
5769                      l_denominator,
5770                      l_numerator,
5771                      l_rate );
5772 
5773    -- Calculate the converted amount using triangulation method
5774    x_to_amount := ( p_from_amount / l_denominator ) * l_numerator;
5775    x_to_amount2 := ( p_from_amount2 / l_denominator ) * l_numerator;
5776 
5777    IF p_round = Fnd_Api.G_TRUE THEN
5778       -- Rounding to the correct precision and minumum accountable units
5779       x_to_amount := ROUND( x_to_amount / to_mau ) * to_mau;
5780       x_to_amount2 := ROUND( x_to_amount2 / to_mau ) * to_mau;
5781    END IF;
5782 
5783 EXCEPTION
5784    WHEN Gl_Currency_Api.NO_RATE THEN
5785       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
5786          Fnd_Message.Set_Name ('AMS', 'AMS_NO_RATE');
5787          Fnd_Message.Set_Token ('CURRENCY_FROM', p_from_currency);
5788          Fnd_Message.Set_Token ('CURRENCY_TO', p_to_currency);
5789          Fnd_Msg_Pub.ADD;
5790       END IF;
5791       x_return_status := Fnd_Api.G_RET_STS_ERROR;
5792    WHEN Gl_Currency_Api.INVALID_CURRENCY THEN
5793       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
5794          Fnd_Message.Set_Name ('AMS', 'AMS_INVALID_CURR');
5795          Fnd_Message.Set_Token ('CURRENCY_FROM', p_from_currency);
5796          Fnd_Message.Set_Token ('CURRENCY_TO', p_to_currency);
5797          Fnd_Msg_Pub.ADD;
5798       END IF;
5799       x_return_status := Fnd_Api.G_RET_STS_ERROR;
5800 END Convert_Currency2;
5801 
5802 ---------------------------------------------------------------------
5803 -- PROCEDURE
5804 --    Convert_Currency_Vector
5805 -- DESCRIPTION
5806 --    This procedure is copied from GL_CURRENCY_API so that rounding can be
5807 --    controlled.  The functional currency need not be rounded because
5808 --    precision will be lost when converting to other currencies.
5809 --    The displayed currencies must be rounded.
5810 --    Supports converting a vector of currency amount.
5811 -- NOTE
5812 --    Modified from code done by ptendulk, and choang.
5813 -- HISTORY
5814 -- 05-Dec-2001 dmvincen      Created.
5815 -- 18-Dec-2001 dmvincen      Removed unnecessary rounding.
5816 ---------------------------------------------------------------------
5817 PROCEDURE Convert_Currency_Vector (
5818    x_return_status      OUT NOCOPY VARCHAR2,
5819    p_from_currency      IN  VARCHAR2,
5820    p_to_currency        IN  VARCHAR2,
5821    p_conv_date          IN  DATE,
5822    p_amounts            IN OUT NOCOPY CURRENCY_TABLE,
5823    p_round              IN VARCHAR2
5824 )
5825 IS
5826    L_CONVERSION_TYPE_PROFILE  CONSTANT VARCHAR2(30) := 'AMS_CURR_CONVERSION_TYPE';
5827    L_MAX_ROLL_DAYS         CONSTANT NUMBER := -1;  -- Negative so API rolls back to find the last conversion rate.
5828    l_denominator           NUMBER := 1;
5829    l_numerator             NUMBER := 1;
5830    l_rate                  NUMBER := 1;
5831    to_rate                 NUMBER;
5832    to_mau                  NUMBER;
5833    to_xau                  NUMBER;
5834    to_type                 VARCHAR2(8);
5835    l_conversion_type       VARCHAR2(30);  -- Currency conversion type; see API documention for details.
5836    l_index                 NUMBER;
5837 BEGIN
5838    -- Initialize return status.
5839    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5840 
5841    -- Get the currency conversion type from profile option
5842    l_conversion_type := Fnd_Profile.Value (L_CONVERSION_TYPE_PROFILE);
5843 
5844    -- Check if both currencies are identical
5845    IF ( p_from_currency <> p_to_currency ) THEN
5846       --
5847       -- Find out the conversion rate using the given conversion type
5848       -- and conversion date.
5849       --
5850       Gl_Currency_Api.get_closest_triangulation_rate(
5851                         p_from_currency,
5852                         p_to_currency,
5853                         p_conv_date,
5854                         l_conversion_type,
5855                         L_MAX_ROLL_DAYS,
5856                         l_denominator,
5857                         l_numerator,
5858                         l_rate );
5859    END IF;
5860 
5861    get_info( p_to_currency, to_mau, to_xau );
5862 
5863    l_index := p_amounts.first;
5864    LOOP
5865       EXIT WHEN l_index IS NULL;
5866       IF p_amounts.EXISTS(l_index) AND p_amounts(l_index) IS NOT NULL THEN
5867          p_amounts(l_index) := ( p_amounts(l_index) / l_denominator ) * l_numerator;
5868          IF p_round = Fnd_Api.G_TRUE THEN
5869             p_amounts(l_index) := ROUND( p_amounts(l_index) / to_mau ) * to_mau;
5870          END IF;
5871       END IF;
5872       l_index := p_amounts.NEXT(l_index);
5873    END LOOP;
5874 
5875 EXCEPTION
5876    WHEN Gl_Currency_Api.NO_RATE THEN
5877       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
5878          Fnd_Message.Set_Name ('AMS', 'AMS_NO_RATE');
5879          Fnd_Message.Set_Token ('CURRENCY_FROM', p_from_currency);
5880          Fnd_Message.Set_Token ('CURRENCY_TO', p_to_currency);
5881          Fnd_Msg_Pub.ADD;
5882       END IF;
5883       x_return_status := Fnd_Api.G_RET_STS_ERROR;
5884    WHEN Gl_Currency_Api.INVALID_CURRENCY THEN
5885       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
5886          Fnd_Message.Set_Name ('AMS', 'AMS_INVALID_CURR');
5887          Fnd_Message.Set_Token ('CURRENCY_FROM', p_from_currency);
5888          Fnd_Message.Set_Token ('CURRENCY_TO', p_to_currency);
5889          Fnd_Msg_Pub.ADD;
5890       END IF;
5891       x_return_status := Fnd_Api.G_RET_STS_ERROR;
5892 END Convert_Currency_Vector;
5893 
5894 ---------------------------------------------------------------------
5895 -- PROCEDURE
5896 --    Convert_Currency_Object
5897 -- DESCRIPTION
5898 --    This procedure is copied from GL_CURRENCY_API so that rounding can be
5899 --    controlled.  The functional currency need not be rounded because
5900 --    precision will be lost when converting to other currencies.
5901 --    The displayed currencies must be rounded.
5902 --    Supports converting amount to transaction currency of object.
5903 -- NOTE
5904 --    Modified from code done by ptendulk, and choang.
5905 -- HISTORY
5906 -- 05-Dec-2001 dmvincen      Created.
5907 ---------------------------------------------------------------------
5908 PROCEDURE Convert_Currency_Object (
5909    x_return_status      OUT NOCOPY VARCHAR2,
5910    p_object_id          IN  NUMBER,
5911    p_object_type        IN  VARCHAR2,
5912    p_conv_date          IN  DATE,
5913    p_amounts            IN OUT NOCOPY CURRENCY_TABLE,
5914    p_round              IN VARCHAR2
5915 )
5916 IS
5917    l_func_currency VARCHAR2(15);
5918    l_trans_currency VARCHAR2(15);
5919 BEGIN
5920    l_func_currency := Default_Func_Currency;
5921    Get_Trans_curr_code(p_object_id, p_object_type, l_trans_currency);
5922    Convert_Currency_Vector (
5923       x_return_status      => x_return_status,
5924       p_from_currency      => l_func_currency,
5925       p_to_currency        => l_trans_currency,
5926       p_conv_date          => p_conv_date,
5927       p_amounts            => p_amounts,
5928       p_round              => p_round);
5929 END Convert_Currency_Object;
5930 
5931 ---------------------------------------------------------------------
5932 -- PROCEDURE
5933 --    Convert_to_trans_value
5934 -- DESCRIPTION
5935 --    For chart support to convert to transaction value within a query.
5936 -- NOTE
5937 -- HISTORY
5938 -- 19-APR-2004 dmvincen      Created.
5939 ---------------------------------------------------------------------
5940 FUNCTION convert_to_trans_value(
5941    p_func_value in NUMBER,
5942    p_object_type in VARCHAR2,
5943    p_object_id in NUMBER,
5944    p_display_type in VARCHAR2
5945    )
5946 RETURN NUMBER
5947 IS
5948   l_trans_curr_code VARCHAR2(15);
5949   l_func_curr_code VARCHAR2(15);
5950   l_return_value NUMBER;
5951   l_return_status VARCHAR2(1);
5952 BEGIN
5953  IF (p_display_type = 'CURRENCY')
5954  THEN
5955     get_trans_curr_code(p_object_id,p_object_type,l_trans_curr_code);
5956     l_func_curr_code := default_func_currency;
5957     IF (NVL(l_trans_curr_code,'NULL') <> NVL(l_func_curr_code,'NULL'))
5958     THEN
5959        convert_currency(
5960                   x_return_status   => l_return_status,
5961                   p_from_currency   => l_func_curr_code,
5962                   p_to_currency     => l_trans_curr_code,
5963                   p_from_amount     => NVL(p_func_value,0),
5964                   x_to_amount       => l_return_value,
5965                   p_round           => Fnd_Api.G_TRUE
5966        );
5967     ELSE
5968        l_return_value := p_func_value;
5969     END IF;
5970  ELSIF (p_display_type = 'PERCENT')
5971  THEN
5972     l_return_value := p_func_value * 100;
5973  ELSE -- INTEGER
5974     l_return_value := p_func_value;
5975  END IF;
5976  return l_return_value;
5977 END;
5978 
5979 ---------------------------------------------------------------------
5980 -- PROCEDURE
5981 --    Record_History
5982 -- DESCRIPTION
5983 --    Record changes in the activity metrics for a historical record.
5984 --    Functional values are the only significant items.
5985 --    Historical records are record once per day.  The last value of the
5986 --    day is stored.
5987 --    p_action is in G_CREATE, G_UPDATE, G_DELETE
5988 -- NOTE
5989 -- HISTORY
5990 -- 20-NOV-2001 dmvincen      Created.
5991 -- 06-FEB-2002 dmvincen      BUG2214496: Corrected history delta calculation.
5992 ---------------------------------------------------------------------
5993 PROCEDURE Record_History(
5994    p_actmet_id                  IN NUMBER,
5995    p_action                     IN VARCHAR2,
5996    x_return_status              OUT NOCOPY VARCHAR2,
5997    x_msg_count                  OUT NOCOPY NUMBER,
5998    x_msg_data                   OUT NOCOPY VARCHAR2
5999 )
6000 IS
6001    L_API_VERSION    CONSTANT NUMBER := 1.0;
6002    L_API_NAME       CONSTANT VARCHAR2(30) := 'Record_History';
6003    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6004 
6005    -- find the most recent fact record for the activity metric id.
6006    CURSOR c_get_history_by_id(l_act_metric_id NUMBER) IS
6007       SELECT func_forecasted_value, func_actual_value, functional_currency_code,
6008              last_update_date, act_met_hst_id, object_version_number,
6009              func_forecasted_delta, func_actual_delta
6010       FROM ams_act_metric_hst
6011       WHERE activity_metric_id = l_act_metric_id
6012       AND last_update_date =
6013           (SELECT MAX(last_update_date)
6014             FROM ams_act_metric_hst
6015             WHERE activity_metric_id = l_act_metric_id);
6016 
6017    CURSOR c_actmet_details(l_act_metric_id NUMBER) IS
6018        SELECT  activity_metric_id,
6019                  last_update_date,
6020                  last_updated_by,
6021                  creation_date,
6022                  created_by,
6023                  last_update_login,
6024                  object_version_number,
6025                  act_metric_used_by_id,
6026                  arc_act_metric_used_by,
6027                  purchase_req_raised_flag,
6028                  application_id,
6029                  sensitive_data_flag,
6030                  budget_id,
6031                  metric_id,
6032                  transaction_currency_code,
6033                  trans_forecasted_value,
6034                  trans_committed_value,
6035                  trans_actual_value,
6036                  functional_currency_code,
6037                  func_forecasted_value,
6038                  dirty_flag,
6039                  func_committed_value,
6040                  func_actual_value,
6041                  last_update_date,
6042                  variable_value,
6043                  forecasted_variable_value,
6044                  computed_using_function_value,
6045                  metric_uom_code,
6046                  org_id,
6047                  difference_since_last_calc,
6048                  activity_metric_origin_id,
6049                  arc_activity_metric_origin,
6050                  days_since_last_refresh,
6051                  scenario_id,
6052                  SUMMARIZE_TO_METRIC,
6053                  ROLLUP_TO_METRIC,
6054                  hierarchy_id,
6055                  start_node,
6056                  from_level,
6057                  to_level,
6058                  from_date,
6059                  TO_DATE,
6060                  amount1,
6061                  amount2,
6062                  amount3,
6063                  percent1,
6064                  percent2,
6065                  percent3,
6066                  published_flag,
6067                  pre_function_name ,
6068                  post_function_name,
6069                  attribute_category,
6070                  attribute1,
6071                  attribute2,
6072                  attribute3,
6073                  attribute4,
6074                  attribute5,
6075                  attribute6,
6076                  attribute7,
6077                  attribute8,
6078                  attribute9,
6079                  attribute10,
6080                  attribute11,
6081                  attribute12,
6082                  attribute13,
6083                  attribute14,
6084                  attribute15,
6085                  description,
6086                  act_metric_date,
6087                  depend_act_metric,
6088                  function_used_by_id,
6089                  arc_function_used_by,
6090                  /* 05/15/2002 yzhao: add 6 new columns for top-down bottom-up budgeting */
6091                  hierarchy_type,
6092                  status_code,
6093                  method_code,
6094                  action_code,
6095                  basis_year,
6096                  ex_start_node
6097                  /* 05/15/2002 yzhao: add ends */
6098      FROM ams_act_metrics_all
6099      WHERE activity_metric_id = l_act_metric_id;
6100 
6101    CURSOR c_get_new_history_id IS
6102       SELECT ams_act_metric_hst_s.NEXTVAL
6103       FROM dual;
6104 
6105    CURSOR c_check_history_id(l_test_id NUMBER) IS
6106       SELECT COUNT(*)
6107       FROM ams_act_metric_hst
6108       WHERE act_met_hst_id = l_test_id;
6109 
6110    l_func_forecasted_value NUMBER;
6111    l_func_actual_value NUMBER;
6112    l_functional_currency_code VARCHAR2(15);
6113    l_last_update_date DATE;
6114    l_new_record CHAR(1) := FND_API.G_FALSE;
6115    l_act_met_hst_id NUMBER;
6116    l_history_id_count NUMBER;
6117    l_object_version_number NUMBER;
6118    l_func_forecasted_delta NUMBER;
6119    l_func_actual_delta NUMBER;
6120    l_today DATE;
6121    l_actmet_rec act_metric_rec_type;
6122    error_message VARCHAR2(2000);
6123 BEGIN
6124 
6125    --
6126    -- Initialize API return status to success.
6127    --
6128    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6129 
6130    OPEN c_actmet_details(p_actmet_id);
6131    FETCH c_actmet_details INTO l_actmet_rec;
6132    IF c_actmet_details%NOTFOUND THEN
6133       CLOSE c_actmet_details;
6134       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
6135    END IF;
6136    CLOSE c_actmet_details;
6137 
6138    -- BUG2813600: Delete history, set to current date and zero.
6139    IF p_action = G_DELETE THEN
6140       l_actmet_rec.last_update_date := SYSDATE;
6141       l_actmet_rec.func_forecasted_value := 0;
6142       l_actmet_rec.trans_forecasted_value := 0;
6143       l_actmet_rec.func_actual_value := 0;
6144       l_actmet_rec.trans_actual_value := 0;
6145       l_actmet_rec.func_committed_value := 0;
6146       l_actmet_rec.trans_committed_value := 0;
6147       l_actmet_rec.VARIABLE_VALUE := 0;
6148       l_actmet_rec.FORECASTED_VARIABLE_VALUE := 0;
6149       l_actmet_rec.COMPUTED_USING_FUNCTION_VALUE := 0;
6150    END IF;
6151    -- BUG2813600: end.
6152 
6153    IF p_action = G_CREATE THEN
6154       l_new_record := FND_API.G_TRUE;
6155       l_func_forecasted_delta := NVL(l_actmet_rec.func_forecasted_value,0);
6156       l_func_actual_delta := NVL(l_actmet_rec.func_actual_value,0);
6157    ELSE
6158       OPEN c_get_history_by_id(p_actmet_id);
6159       FETCH c_get_history_by_id
6160          INTO l_func_forecasted_value,
6161               l_func_actual_value,
6162               l_functional_currency_code,
6163               l_last_update_date,
6164               l_act_met_hst_id,
6165               l_object_version_number,
6166               l_func_forecasted_delta,
6167               l_func_actual_delta;
6168       IF c_get_history_by_id%NOTFOUND THEN
6169          l_new_record := FND_API.G_TRUE;
6170       END IF;
6171       CLOSE c_get_history_by_id;
6172    END IF;
6173 
6174    -- Validate a change since the last fact.
6175    IF l_new_record = FND_API.G_FALSE AND
6176       (p_action = G_DELETE OR
6177        NVL(l_func_forecasted_value,0) <>
6178             NVL(l_actmet_rec.func_forecasted_value,0) OR
6179        NVL(l_func_actual_value,0) <> NVL(l_actmet_rec.func_actual_value,0) OR
6180        NVL(l_functional_currency_code,'NULL') <>
6181             NVL(l_actmet_rec.functional_currency_code,'NULL'))
6182    THEN
6183       -- If change occurs within the same day as last, update.
6184       IF TRUNC(l_last_update_date) = TRUNC(l_actmet_rec.last_update_date)
6185       THEN
6186          -- update the current history record.
6187          -- l_actmet_rec := p_actmet_rec;
6188          -- BUG2214496: Wrap values with nvl.
6189          l_func_forecasted_delta := NVL(l_func_forecasted_delta,0) +
6190                                     NVL(l_actmet_rec.func_forecasted_value,0) -
6191                                     NVL(l_func_forecasted_value,0);
6192          l_func_actual_delta := NVL(l_func_actual_delta,0) +
6193                                 NVL(l_actmet_rec.func_actual_value,0) -
6194                                 NVL(l_func_actual_value,0);
6195          UPDATE ams_act_metric_hst
6196          SET LAST_UPDATE_DATE = l_actmet_rec.LAST_UPDATE_DATE,
6197             LAST_UPDATED_BY = l_actmet_rec.LAST_UPDATED_BY,
6198             CREATION_DATE = l_actmet_rec.CREATION_DATE,
6199             CREATED_BY = l_actmet_rec.CREATED_BY,
6200             LAST_UPDATE_LOGIN = l_actmet_rec.LAST_UPDATE_LOGIN,
6201             OBJECT_VERSION_NUMBER = l_actmet_rec.OBJECT_VERSION_NUMBER,
6202             ACT_METRIC_USED_BY_ID = l_actmet_rec.ACT_METRIC_USED_BY_ID,
6203             ARC_ACT_METRIC_USED_BY = l_actmet_rec.ARC_ACT_METRIC_USED_BY,
6204             APPLICATION_ID = l_actmet_rec.APPLICATION_ID,
6205             METRIC_ID = l_actmet_rec.METRIC_ID,
6206             TRANSACTION_CURRENCY_CODE = l_actmet_rec.TRANSACTION_CURRENCY_CODE,
6207             TRANS_FORECASTED_VALUE = l_actmet_rec.TRANS_FORECASTED_VALUE,
6208             TRANS_COMMITTED_VALUE = l_actmet_rec.TRANS_COMMITTED_VALUE,
6209             TRANS_ACTUAL_VALUE = l_actmet_rec.TRANS_ACTUAL_VALUE,
6210             FUNCTIONAL_CURRENCY_CODE = l_actmet_rec.FUNCTIONAL_CURRENCY_CODE,
6211             FUNC_FORECASTED_VALUE = l_actmet_rec.FUNC_FORECASTED_VALUE,
6212             FUNC_COMMITTED_VALUE = l_actmet_rec.FUNC_COMMITTED_VALUE,
6213             DIRTY_FLAG = l_actmet_rec.DIRTY_FLAG,
6214             FUNC_ACTUAL_VALUE = l_actmet_rec.FUNC_ACTUAL_VALUE,
6215             LAST_CALCULATED_DATE = l_actmet_rec.LAST_CALCULATED_DATE,
6216             VARIABLE_VALUE = l_actmet_rec.VARIABLE_VALUE,
6217             COMPUTED_USING_FUNCTION_VALUE = l_actmet_rec.COMPUTED_USING_FUNCTION_VALUE,
6218             METRIC_UOM_CODE = l_actmet_rec.METRIC_UOM_CODE,
6219             ORG_ID = l_actmet_rec.ORG_ID,
6220             DIFFERENCE_SINCE_LAST_CALC = l_actmet_rec.DIFFERENCE_SINCE_LAST_CALC,
6221             ACTIVITY_METRIC_ORIGIN_ID = l_actmet_rec.ACTIVITY_METRIC_ORIGIN_ID,
6222             ARC_ACTIVITY_METRIC_ORIGIN = l_actmet_rec.ARC_ACTIVITY_METRIC_ORIGIN,
6223             DAYS_SINCE_LAST_REFRESH = l_actmet_rec.DAYS_SINCE_LAST_REFRESH,
6224             SUMMARIZE_TO_METRIC = l_actmet_rec.SUMMARIZE_TO_METRIC,
6225             ROLLUP_TO_METRIC = l_actmet_rec.ROLLUP_TO_METRIC,
6226             SCENARIO_ID = l_actmet_rec.SCENARIO_ID,
6227             ATTRIBUTE_CATEGORY = l_actmet_rec.ATTRIBUTE_CATEGORY,
6228             ATTRIBUTE1 = l_actmet_rec.ATTRIBUTE1,
6229             ATTRIBUTE2 = l_actmet_rec.ATTRIBUTE2,
6230             ATTRIBUTE3 = l_actmet_rec.ATTRIBUTE3,
6231             ATTRIBUTE4 = l_actmet_rec.ATTRIBUTE4,
6232             ATTRIBUTE5 = l_actmet_rec.ATTRIBUTE5,
6233             ATTRIBUTE6 = l_actmet_rec.ATTRIBUTE6,
6234             ATTRIBUTE7 = l_actmet_rec.ATTRIBUTE7,
6235             ATTRIBUTE8 = l_actmet_rec.ATTRIBUTE8,
6236             ATTRIBUTE9 = l_actmet_rec.ATTRIBUTE9,
6237             ATTRIBUTE10 = l_actmet_rec.ATTRIBUTE10,
6238             ATTRIBUTE11 = l_actmet_rec.ATTRIBUTE11,
6239             ATTRIBUTE12 = l_actmet_rec.ATTRIBUTE12,
6240             ATTRIBUTE13 = l_actmet_rec.ATTRIBUTE13,
6241             ATTRIBUTE14 = l_actmet_rec.ATTRIBUTE14,
6242             ATTRIBUTE15 = l_actmet_rec.ATTRIBUTE15,
6243             DESCRIPTION = l_actmet_rec.DESCRIPTION,
6244             ACT_METRIC_DATE = l_actmet_rec.ACT_METRIC_DATE,
6245             ARC_FUNCTION_USED_BY = l_actmet_rec.ARC_FUNCTION_USED_BY,
6246             FUNCTION_USED_BY_ID = l_actmet_rec.FUNCTION_USED_BY_ID,
6247             PURCHASE_REQ_RAISED_FLAG = l_actmet_rec.PURCHASE_REQ_RAISED_FLAG,
6248             SENSITIVE_DATA_FLAG = l_actmet_rec.SENSITIVE_DATA_FLAG,
6249             BUDGET_ID = l_actmet_rec.BUDGET_ID,
6250             FORECASTED_VARIABLE_VALUE = l_actmet_rec.FORECASTED_VARIABLE_VALUE,
6251             HIERARCHY_ID = l_actmet_rec.HIERARCHY_ID,
6252             PUBLISHED_FLAG = l_actmet_rec.PUBLISHED_FLAG,
6253             PRE_FUNCTION_NAME = l_actmet_rec.PRE_FUNCTION_NAME,
6254             POST_FUNCTION_NAME = l_actmet_rec.POST_FUNCTION_NAME,
6255             START_NODE = l_actmet_rec.START_NODE,
6256             FROM_LEVEL = l_actmet_rec.FROM_LEVEL,
6257             TO_LEVEL = l_actmet_rec.TO_LEVEL,
6258             FROM_DATE = l_actmet_rec.FROM_DATE,
6259             TO_DATE = l_actmet_rec.TO_DATE,
6260             AMOUNT1 = l_actmet_rec.AMOUNT1,
6261             AMOUNT2 = l_actmet_rec.AMOUNT2,
6262             AMOUNT3 = l_actmet_rec.AMOUNT3,
6263             PERCENT1 = l_actmet_rec.PERCENT1,
6264             PERCENT2 = l_actmet_rec.PERCENT2,
6265             PERCENT3 = l_actmet_rec.PERCENT3,
6266             STATUS_CODE = l_actmet_rec.STATUS_CODE,
6267             ACTION_CODE = l_actmet_rec.ACTION_CODE,
6268             METHOD_CODE = l_actmet_rec.METHOD_CODE,
6269             BASIS_YEAR = l_actmet_rec.BASIS_YEAR,
6270             EX_START_NODE = l_actmet_rec.EX_START_NODE,
6271             HIERARCHY_TYPE = l_actmet_rec.HIERARCHY_TYPE,
6272             DEPEND_ACT_METRIC = l_actmet_rec.DEPEND_ACT_METRIC,
6273             FUNC_FORECASTED_DELTA = l_func_forecasted_delta,
6274             FUNC_ACTUAL_DELTA = l_func_actual_delta
6275          WHERE act_met_hst_id = l_act_met_hst_id
6276          AND object_version_number = l_object_version_number;
6277       ELSE
6278          -- Values have not changed since yesterday, insert for today.
6279          l_new_record := FND_API.G_TRUE;
6280       END IF;
6281    END IF;
6282 
6283    IF l_new_record = FND_API.G_TRUE THEN
6284       -- Generate a new fact id.
6285       LOOP
6286           OPEN c_get_new_history_id;
6287           FETCH c_get_new_history_id INTO l_act_met_hst_id;
6288           CLOSE c_get_new_history_id;
6289 
6290           -- Validate uniqueness.
6291           OPEN c_check_history_id(l_act_met_hst_id);
6292           FETCH c_check_history_id INTO l_history_id_count;
6293           CLOSE c_check_history_id;
6294 
6295           EXIT WHEN l_history_id_count = 0;
6296       END LOOP;
6297 
6298       -- BUG2214496: Wrap values with nvl.
6299       l_func_forecasted_delta := NVL(l_actmet_rec.func_forecasted_value,0) -
6300                                  NVL(l_func_forecasted_value,0);
6301       l_func_actual_delta := NVL(l_actmet_rec.func_actual_value,0) -
6302                              NVL(l_func_actual_value,0);
6303 
6304       -- Insert a new fact record.
6305       INSERT INTO ams_act_metric_hst
6306          (ACT_MET_HST_ID,
6307          ACTIVITY_METRIC_ID,
6308          LAST_UPDATE_DATE,
6309          LAST_UPDATED_BY,
6310          CREATION_DATE,
6311          CREATED_BY,
6312          LAST_UPDATE_LOGIN,
6313          OBJECT_VERSION_NUMBER,
6314          ACT_METRIC_USED_BY_ID,
6315          ARC_ACT_METRIC_USED_BY,
6316          APPLICATION_ID,
6317          METRIC_ID,
6318          TRANSACTION_CURRENCY_CODE,
6319          TRANS_FORECASTED_VALUE,
6320          TRANS_COMMITTED_VALUE,
6321          TRANS_ACTUAL_VALUE,
6322          FUNCTIONAL_CURRENCY_CODE,
6323          FUNC_FORECASTED_VALUE,
6324          FUNC_COMMITTED_VALUE,
6325          DIRTY_FLAG,
6326          FUNC_ACTUAL_VALUE,
6327          LAST_CALCULATED_DATE,
6328          VARIABLE_VALUE,
6329          COMPUTED_USING_FUNCTION_VALUE,
6330          METRIC_UOM_CODE,
6331          ORG_ID,
6332          DIFFERENCE_SINCE_LAST_CALC,
6333          ACTIVITY_METRIC_ORIGIN_ID,
6334          ARC_ACTIVITY_METRIC_ORIGIN,
6335          DAYS_SINCE_LAST_REFRESH,
6336          SUMMARIZE_TO_METRIC,
6337          ROLLUP_TO_METRIC,
6338          SCENARIO_ID,
6339          ATTRIBUTE_CATEGORY,
6340          ATTRIBUTE1,
6341          ATTRIBUTE2,
6342          ATTRIBUTE3,
6343          ATTRIBUTE4,
6344          ATTRIBUTE5,
6345          ATTRIBUTE6,
6346          ATTRIBUTE7,
6347          ATTRIBUTE8,
6348          ATTRIBUTE9,
6349          ATTRIBUTE10,
6350          ATTRIBUTE11,
6351          ATTRIBUTE12,
6352          ATTRIBUTE13,
6353          ATTRIBUTE14,
6354          ATTRIBUTE15,
6355          DESCRIPTION,
6356          ACT_METRIC_DATE,
6357          ARC_FUNCTION_USED_BY,
6358          FUNCTION_USED_BY_ID,
6359          PURCHASE_REQ_RAISED_FLAG,
6360          SENSITIVE_DATA_FLAG,
6361          BUDGET_ID,
6362          FORECASTED_VARIABLE_VALUE,
6363          HIERARCHY_ID,
6364          PUBLISHED_FLAG,
6365          PRE_FUNCTION_NAME,
6366          POST_FUNCTION_NAME,
6367          START_NODE,
6368          FROM_LEVEL,
6369          TO_LEVEL,
6370          FROM_DATE,
6371          TO_DATE,
6372          AMOUNT1,
6373          AMOUNT2,
6374          AMOUNT3,
6375          PERCENT1,
6376          PERCENT2,
6377          PERCENT3,
6378          STATUS_CODE,
6379          ACTION_CODE,
6380          METHOD_CODE,
6381          BASIS_YEAR,
6382          EX_START_NODE,
6383          HIERARCHY_TYPE,
6384          DEPEND_ACT_METRIC,
6385          FUNC_FORECASTED_DELTA,
6386          FUNC_ACTUAL_DELTA)
6387       VALUES
6388          (L_ACT_MET_HST_ID,
6389          l_actmet_rec.ACTIVITY_METRIC_ID,
6390          l_actmet_rec.LAST_UPDATE_DATE,
6391          l_actmet_rec.LAST_UPDATED_BY,
6392          l_actmet_rec.CREATION_DATE,
6393          l_actmet_rec.CREATED_BY,
6394          l_actmet_rec.LAST_UPDATE_LOGIN,
6395          l_actmet_rec.OBJECT_VERSION_NUMBER,
6396          l_actmet_rec.ACT_METRIC_USED_BY_ID,
6397          l_actmet_rec.ARC_ACT_METRIC_USED_BY,
6398          l_actmet_rec.APPLICATION_ID,
6399          l_actmet_rec.METRIC_ID,
6400          l_actmet_rec.TRANSACTION_CURRENCY_CODE,
6401          l_actmet_rec.TRANS_FORECASTED_VALUE,
6402          l_actmet_rec.TRANS_COMMITTED_VALUE,
6403          l_actmet_rec.TRANS_ACTUAL_VALUE,
6404          l_actmet_rec.FUNCTIONAL_CURRENCY_CODE,
6405          l_actmet_rec.FUNC_FORECASTED_VALUE,
6406          l_actmet_rec.FUNC_COMMITTED_VALUE,
6407          l_actmet_rec.DIRTY_FLAG,
6408          l_actmet_rec.FUNC_ACTUAL_VALUE,
6409          l_actmet_rec.LAST_CALCULATED_DATE,
6410          l_actmet_rec.VARIABLE_VALUE,
6411          l_actmet_rec.COMPUTED_USING_FUNCTION_VALUE,
6412          l_actmet_rec.METRIC_UOM_CODE,
6413          l_actmet_rec.ORG_ID,
6414          l_actmet_rec.DIFFERENCE_SINCE_LAST_CALC,
6415          l_actmet_rec.ACTIVITY_METRIC_ORIGIN_ID,
6416          l_actmet_rec.ARC_ACTIVITY_METRIC_ORIGIN,
6417          l_actmet_rec.DAYS_SINCE_LAST_REFRESH,
6418          l_actmet_rec.SUMMARIZE_TO_METRIC,
6419          l_actmet_rec.ROLLUP_TO_METRIC,
6420          l_actmet_rec.SCENARIO_ID,
6421          l_actmet_rec.ATTRIBUTE_CATEGORY,
6422          l_actmet_rec.ATTRIBUTE1,
6423          l_actmet_rec.ATTRIBUTE2,
6424          l_actmet_rec.ATTRIBUTE3,
6425          l_actmet_rec.ATTRIBUTE4,
6426          l_actmet_rec.ATTRIBUTE5,
6427          l_actmet_rec.ATTRIBUTE6,
6428          l_actmet_rec.ATTRIBUTE7,
6429          l_actmet_rec.ATTRIBUTE8,
6430          l_actmet_rec.ATTRIBUTE9,
6431          l_actmet_rec.ATTRIBUTE10,
6432          l_actmet_rec.ATTRIBUTE11,
6433          l_actmet_rec.ATTRIBUTE12,
6434          l_actmet_rec.ATTRIBUTE13,
6435          l_actmet_rec.ATTRIBUTE14,
6436          l_actmet_rec.ATTRIBUTE15,
6437          l_actmet_rec.DESCRIPTION,
6438          l_actmet_rec.ACT_METRIC_DATE,
6439          l_actmet_rec.ARC_FUNCTION_USED_BY,
6440          l_actmet_rec.FUNCTION_USED_BY_ID,
6441          l_actmet_rec.PURCHASE_REQ_RAISED_FLAG,
6442          l_actmet_rec.SENSITIVE_DATA_FLAG,
6443          l_actmet_rec.BUDGET_ID,
6444          l_actmet_rec.FORECASTED_VARIABLE_VALUE,
6445          l_actmet_rec.HIERARCHY_ID,
6446          l_actmet_rec.PUBLISHED_FLAG,
6447          l_actmet_rec.PRE_FUNCTION_NAME,
6448          l_actmet_rec.POST_FUNCTION_NAME,
6449          l_actmet_rec.START_NODE,
6450          l_actmet_rec.FROM_LEVEL,
6451          l_actmet_rec.TO_LEVEL,
6452          l_actmet_rec.FROM_DATE,
6453          l_actmet_rec.TO_DATE,
6454          l_actmet_rec.AMOUNT1,
6455          l_actmet_rec.AMOUNT2,
6456          l_actmet_rec.AMOUNT3,
6457          l_actmet_rec.PERCENT1,
6458          l_actmet_rec.PERCENT2,
6459          l_actmet_rec.PERCENT3,
6460          l_actmet_rec.STATUS_CODE,
6461          l_actmet_rec.ACTION_CODE,
6462          l_actmet_rec.METHOD_CODE,
6463          l_actmet_rec.BASIS_YEAR,
6464          l_actmet_rec.EX_START_NODE,
6465          l_actmet_rec.HIERARCHY_TYPE,
6466          l_actmet_rec.DEPEND_ACT_METRIC,
6467          l_func_forecasted_delta,
6468          l_func_actual_delta
6469          );
6470    END IF;
6471 
6472 EXCEPTION
6473    WHEN Fnd_Api.G_EXC_ERROR THEN
6474       x_return_status := Fnd_Api.G_RET_STS_ERROR;
6475       Fnd_Msg_Pub.Count_And_Get (
6476          p_count         =>     x_msg_count,
6477          p_data          =>     x_msg_data,
6478          p_encoded       =>   FND_API.G_FALSE
6479       );
6480    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6481       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6482       Fnd_Msg_Pub.Count_And_Get (
6483          p_count         =>     x_msg_count,
6484          p_data          =>     x_msg_data,
6485          p_encoded       =>   FND_API.G_FALSE
6486       );
6487    WHEN OTHERS THEN
6488       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6489       error_message := SQLERRM;
6490       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
6491          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
6492       END IF;
6493       Fnd_Msg_Pub.Count_And_Get (
6494          p_count         =>     x_msg_count,
6495          p_data          =>     x_msg_data,
6496          p_encoded       =>   FND_API.G_FALSE
6497       );
6498 END Record_History;
6499 
6500 -- API Name       Get_Date_Buckets
6501 -- Type           Public
6502 -- Pre-reqs       None.
6503 -- Function       Generate date buckets according to the start date, end date
6504 --                and time interval.
6505 -- Parameters
6506 --    IN          p_start_date                  IN DATE       Required
6507 --                p_end_date                    IN DATE       Required
6508 --                p_interval_amount             IN NUMBER     Required
6509 --                p_interval_unit               IN VARCHAR2   Required
6510 --    OUT NOCOPY         x_date_buckets                OUT NOCOPY date_bucket_type
6511 -- Version        Current version: 1.0
6512 --                Previous version: 1.0
6513 --                Initial version: 1.0
6514 -- HISTORY
6515 -- 11/21/2001     huili         Created.
6516 -- 01/25/2006     dmvincen   BUG4669529: Include prior date bucket.
6517 -- End of comments
6518 PROCEDURE Get_Date_Buckets (
6519    p_start_date       IN  DATE,
6520    p_end_date         IN  DATE,
6521    p_interval_amount  IN  NUMBER,
6522    p_interval_unit    IN  VARCHAR2, -- 'DAY', 'WK', 'MTH', 'YR'
6523    x_date_buckets     OUT NOCOPY date_bucket_type,
6524    x_return_status    OUT NOCOPY VARCHAR2
6525 ) IS
6526  l_date_bucket  DATE := null;
6527  l_date_buckets  date_bucket_type := date_bucket_type();
6528  l_bucket_count NUMBER := 1;
6529  l_last_bucket number := null;
6530  l_max_bucket_count number;
6531  L_NUM_DAYS_WEEK CONSTANT NUMBER := 7;
6532  L_NUM_MONTHS_YEAR CONSTANT NUMBER := 12;
6533 
6534 BEGIN
6535  --
6536    -- Initialize API return status to success.
6537    --
6538    x_return_status := FND_API.G_RET_STS_SUCCESS;
6539 
6540  -- BUG 3815334: Use profile for max buckets.
6541  -- This is the same profile that DCF uses for report page length.
6542  l_max_bucket_count :=
6543               nvl(fnd_profile.value('JTF_PROFILE_DEFAULT_NUM_ROWS'),10);
6544  IF p_start_date IS NULL
6545   OR p_end_date IS NULL
6546   OR TRUNC(p_start_date) > TRUNC(p_end_date)
6547   OR p_interval_amount IS NULL
6548   OR p_interval_amount < 0
6549   OR p_interval_unit IS NULL
6550   OR p_interval_unit NOT IN ('DAY', 'WEEK', 'MONTH', 'YEAR') THEN
6551   x_return_status := FND_API.G_RET_STS_ERROR;
6552   RETURN;
6553  END IF;
6554 
6555   -- Initialize first date bucket to the prior period for incrementals.
6556    IF p_interval_unit = 'DAY' THEN
6557      l_date_bucket := p_start_date - p_interval_amount;
6558    ELSIF p_interval_unit = 'WEEK' THEN
6559      l_date_bucket := p_start_date - p_interval_amount * L_NUM_DAYS_WEEK;
6560    ELSIF p_interval_unit = 'MONTH' THEN
6561      l_date_bucket := ADD_MONTHS (p_start_date, - p_interval_amount);
6562    ELSIF p_interval_unit = 'YEAR' THEN
6563      l_date_bucket := ADD_MONTHS (p_start_date, - p_interval_amount *
6564                                   L_NUM_MONTHS_YEAR);
6565    END IF;
6566 
6567  l_date_buckets.DELETE;
6568  --l_bucket_count := l_date_buckets.COUNT + 1;
6569  l_date_buckets.extend(L_MAX_BUCKET_COUNT+1);
6570  FOR l_bucket_count in 1..L_MAX_BUCKET_COUNT+1
6571  LOOP
6572    l_last_bucket := l_bucket_count;
6573    l_date_buckets(l_bucket_count) := l_date_bucket;
6574    IF p_interval_unit = 'DAY' THEN
6575      l_date_bucket := l_date_bucket + p_interval_amount;
6576    ELSIF p_interval_unit = 'WEEK' THEN
6577      l_date_bucket := l_date_bucket + p_interval_amount * L_NUM_DAYS_WEEK;
6578    ELSIF p_interval_unit = 'MONTH' THEN
6579      l_date_bucket := ADD_MONTHS (l_date_bucket, p_interval_amount);
6580    ELSIF p_interval_unit = 'YEAR' THEN
6581      l_date_bucket := ADD_MONTHS (l_date_bucket, p_interval_amount *
6582                                   L_NUM_MONTHS_YEAR);
6583    ELSE
6584      EXIT;
6585    END IF;
6586    EXIT WHEN TRUNC(l_date_bucket) > TRUNC(p_end_date);
6587  END LOOP;
6588  l_date_buckets.delete(l_last_bucket+1,l_date_buckets.last);
6589  x_date_buckets := l_date_buckets;
6590 END;
6591 
6592 ---------------------------------------------------------------------
6593 -- PROCEDURE
6594 --    Get_Results
6595 -- DESCRIPTION
6596 --    Return the results for results cue card.
6597 --    Output only.  No updates.
6598 -- NOTE
6599 -- HISTORY
6600 -- 27-NOV-2001 dmvincen      Created.
6601 -- 20-DEC-2003 dmvincen  Fixed Deleted metrics show zero for all history.
6602 -- 01-JAN-2006 dmvincen  BUG4669529: Calculate first incremental value.
6603 ---------------------------------------------------------------------
6604 PROCEDURE GET_RESULTS(
6605    p_api_version                IN  NUMBER,
6606    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
6607    x_return_status              OUT NOCOPY VARCHAR2,
6608    x_msg_count                  OUT NOCOPY NUMBER,
6609    x_msg_data                   OUT NOCOPY VARCHAR2,
6610 
6611    p_metric_id IN NUMBER,
6612    p_object_type IN VARCHAR2,
6613    p_object_id IN NUMBER,
6614    p_value_type IN VARCHAR2,
6615    p_from_date IN DATE,
6616    p_to_date IN DATE,
6617    p_increment IN NUMBER,
6618    p_interval_unit IN VARCHAR2,
6619    x_result_table OUT NOCOPY result_table
6620 )
6621 IS
6622    L_API_VERSION    CONSTANT NUMBER := 1.0;
6623    L_API_NAME       CONSTANT VARCHAR2(30) := 'GET_RESULTS';
6624    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6625 
6626   CURSOR c_get_hist_details(l_metric_id NUMBER,
6627                      l_object_type VARCHAR2,
6628                      l_object_id NUMBER) IS
6629       SELECT min(last_update_date)
6630       FROM ams_act_metric_hst
6631       WHERE metric_id = l_metric_id
6632       AND arc_act_metric_used_by = l_object_type
6633       AND act_metric_used_by_id = l_object_id;
6634 
6635   CURSOR c_metric_details(l_metric_id NUMBER) IS
6636      SELECT metric_calculation_type, metric_category, display_type
6637      FROM ams_metrics_all_b
6638      WHERE metric_id = l_metric_id;
6639   l_metric_details c_metric_details%ROWTYPE;
6640 
6641   CURSOR c_get_slice_manual(l_metric_id NUMBER,
6642                      l_object_type VARCHAR2,
6643                      l_object_id NUMBER,
6644                      l_slice_date DATE) IS
6645   -- Fixed so deleted activity metrics show correct values.
6646      SELECT a.last_update_date slice_date,
6647             a.functional_currency_code currency_code,
6648             NVL(SUM(a.func_forecasted_value),0) forecasted_value,
6649             NVL(SUM(a.func_actual_value),0) actual_value
6650      FROM ams_act_metric_hst a
6651      WHERE (a.act_met_hst_id, a.activity_metric_id) IN
6652            (SELECT MAX(b.act_met_hst_id), b.activity_metric_id
6653             FROM ams_act_metric_hst b
6654             WHERE b.metric_id = l_metric_id
6655               AND b.arc_act_metric_used_by = l_object_type
6656               AND b.act_metric_used_by_id = l_object_id
6657             AND TRUNC(b.last_update_date) <= TRUNC(l_slice_date)
6658             GROUP BY b.activity_metric_id)
6659      GROUP BY a.last_update_date, a.functional_currency_code;
6660 
6661   CURSOR c_get_slice_other(l_metric_id NUMBER,
6662                      l_object_type VARCHAR2,
6663                      l_object_id NUMBER,
6664                      l_slice_date DATE) IS
6665      SELECT a.last_update_date slice_date,
6666             a.functional_currency_code currency_code,
6667             NVL(a.func_forecasted_value,0) forecasted_value,
6668             NVL(a.func_actual_value,0) actual_value
6669      FROM ams_act_metric_hst a
6670      WHERE a.last_update_date =
6671            (SELECT MAX(b.last_update_date)
6672             FROM ams_act_metric_hst b
6673             WHERE b.metric_id = l_metric_id
6674             AND b.arc_act_metric_used_by = l_object_type
6675             AND b.act_metric_used_by_id = l_object_id
6676             AND TRUNC(b.last_update_date) <= TRUNC(l_slice_date))
6677      AND a.metric_id = l_metric_id
6678      AND a.arc_act_metric_used_by = l_object_type
6679      AND a.act_metric_used_by_id = l_object_id;
6680 
6681    l_date_buckets date_bucket_type;
6682    l_result_table result_table;
6683    l_result_record result_record;
6684    l_trans_currency_code VARCHAR2(15);
6685    l_date_index NUMBER;
6686    l_result_index NUMBER;
6687    l_last_forecasted_value NUMBER;
6688    l_last_actual_value NUMBER;
6689    l_start_date DATE := NULL;
6690    l_end_date DATE := NULL;
6691 BEGIN
6692    --
6693    -- Output debug message.
6694    --
6695    IF (AMS_DEBUG_HIGH_ON) THEN
6696       Ams_Utility_Pvt.debug_message(l_full_name||': START');
6697       Ams_Utility_Pvt.debug_message('Generating results FOR object: '||
6698           p_object_type||':'||p_object_id||', metric id'||p_metric_id);
6699       Ams_Utility_Pvt.debug_message('FROM/TO/interval/unit: '||
6700           p_from_date||'/'||p_to_date||'/'||p_increment||'/'||p_interval_unit);
6701    END IF;
6702 
6703    --
6704    -- Initialize message list if p_init_msg_list is set to TRUE.
6705    --
6706    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
6707       Fnd_Msg_Pub.Initialize;
6708    END IF;
6709 
6710    --
6711    -- Standard check for API version compatibility.
6712    --
6713    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
6714                                        p_api_version,
6715                                        L_API_NAME,
6716                                        G_PKG_NAME)
6717    THEN
6718       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
6719    END IF;
6720 
6721    --
6722    -- Initialize API return status to success.
6723    --
6724    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6725 
6726    --
6727    -- Begin API Body
6728    --
6729    Get_Trans_curr_code
6730      (p_obj_id            => p_object_id,
6731       p_obj_type          => p_object_type,
6732       x_trans_curr_code   => l_trans_currency_code
6733      );
6734 
6735    OPEN c_metric_details(p_metric_id);
6736    FETCH c_metric_details INTO l_metric_details;
6737    IF c_metric_details%NOTFOUND THEN
6738       CLOSE c_metric_details;
6739       x_return_status := Fnd_Api.G_RET_STS_ERROR;
6740       RAISE Fnd_Api.G_EXC_ERROR;
6741    END IF;
6742    CLOSE c_metric_details;
6743 
6744    OPEN c_get_hist_details(p_metric_id, p_object_type, p_object_id);
6745    FETCH c_get_hist_details INTO l_start_date;
6746    IF c_get_hist_details%NOTFOUND OR l_start_date IS NULL THEN
6747       CLOSE c_get_hist_details;
6748       x_return_status := Fnd_Api.G_RET_STS_ERROR;
6749       RAISE Fnd_Api.G_EXC_ERROR;
6750    END IF;
6751    CLOSE c_get_hist_details;
6752 
6753    IF TRUNC(p_from_date) > TRUNC(l_start_date) THEN
6754       l_start_date := p_from_date;
6755    END IF;
6756 
6757    IF TRUNC(l_start_date) > TRUNC(p_to_date) THEN
6758       l_end_date := l_start_date;
6759    ELSE
6760       l_end_date := p_to_date;
6761    END IF;
6762 
6763    IF TRUNC(l_start_date) >= TRUNC(SYSDATE) THEN
6764       l_start_date := TRUNC(SYSDATE);
6765    END IF;
6766 
6767    IF TRUNC(l_end_date) >= TRUNC(SYSDATE) THEN
6768       l_end_date := TRUNC(SYSDATE);
6769    END IF;
6770 
6771    Get_Date_Buckets (
6772       p_start_date       => l_start_date,
6773       p_end_date         => l_end_date,
6774       p_interval_amount  => p_increment,
6775       p_interval_unit    => p_interval_unit, -- 'DAY', 'WK', 'MTH', 'YR'
6776       x_date_buckets     => l_date_buckets,
6777       x_return_status    => x_return_status
6778    );
6779    IF x_return_status = Fnd_Api.G_RET_STS_ERROR THEN
6780       RETURN;
6781    END IF;
6782 
6783    l_result_table := result_table();
6784    l_result_table.extend(l_date_buckets.COUNT);
6785 
6786    l_date_index := l_date_buckets.first;
6787    l_result_index := l_result_table.first;
6788 
6789    LOOP
6790       EXIT WHEN l_date_index IS NULL;
6791       EXIT WHEN l_result_index IS NULL;
6792       EXIT WHEN NOT l_date_buckets.EXISTS(l_date_index);
6793       EXIT WHEN NOT l_result_table.EXISTS(l_result_index);
6794       IF l_metric_details.display_type = 'CURRENCY' THEN
6795          l_result_record.currency_code := l_trans_currency_code;
6796       ELSE
6797          l_result_record.currency_code := NULL;
6798       END IF;
6799       l_result_record.forecasted_value := 0;
6800       l_result_record.actual_value := 0;
6801       l_result_record.slice_date := l_date_buckets(l_date_index);
6802       l_result_table(l_result_index) := l_result_record;
6803       IF l_metric_details.metric_calculation_type = 'MANUAL' THEN
6804          OPEN c_get_slice_manual(p_metric_id, p_object_type,
6805                                  p_object_id, l_date_buckets(l_date_index));
6806          LOOP
6807             FETCH c_get_slice_manual INTO l_result_record;
6808             EXIT WHEN c_get_slice_manual%NOTFOUND;
6809             -- Multiple rows are returned if multiple currencies.
6810             -- Convert all currencies to the transactional.
6811             IF l_metric_details.display_type = 'CURRENCY' AND
6812                l_result_record.currency_code <> l_trans_currency_code
6813             THEN
6814                Convert_Currency2 (
6815                   x_return_status   => x_return_status,
6816                   p_from_currency   => l_result_record.currency_code,
6817                   p_to_currency     => l_trans_currency_code,
6818                   p_from_amount     => NVL(l_result_record.forecasted_value,0),
6819                   x_to_amount       => l_result_record.forecasted_value,
6820                   p_from_amount2    => NVL(l_result_record.actual_value,0),
6821                   x_to_amount2      => l_result_record.actual_value,
6822                   p_round           => Fnd_Api.G_TRUE
6823                );
6824                l_result_record.currency_code := l_trans_currency_code;
6825             END IF;
6826             l_result_table(l_result_index).forecasted_value :=
6827                     l_result_table(l_result_index).forecasted_value +
6828                     l_result_record.forecasted_value;
6829             l_result_table(l_result_index).actual_value :=
6830                     l_result_table(l_result_index).actual_value +
6831                     l_result_record.actual_value;
6832          END LOOP;
6833          CLOSE c_get_slice_manual;
6834       ELSE -- Other than manual.
6835          OPEN c_get_slice_other(p_metric_id, p_object_type,
6836                                 p_object_id, l_date_buckets(l_date_index));
6837          -- Only one row is expected for each date.
6838          FETCH c_get_slice_other INTO l_result_record;
6839          IF c_get_slice_other%FOUND THEN
6840             -- Synchronize the currency to transactional;
6841             IF l_metric_details.display_type = 'CURRENCY' AND
6842                l_result_record.currency_code <> l_trans_currency_code
6843             THEN
6844                Convert_Currency2 (
6845                   x_return_status   => x_return_status,
6846                   p_from_currency   => l_result_record.currency_code,
6847                   p_to_currency     => l_trans_currency_code,
6848                   p_from_amount     => NVL(l_result_record.forecasted_value,0),
6849                   x_to_amount       => l_result_record.forecasted_value,
6850                   p_from_amount2    => NVL(l_result_record.actual_value,0),
6851                   x_to_amount2      => l_result_record.actual_value,
6852                   p_round           => Fnd_Api.G_TRUE
6853                );
6854                l_result_record.currency_code := l_trans_currency_code;
6855             END IF;
6856             l_result_table(l_result_index) := l_result_record;
6857          END IF;
6858          CLOSE c_get_slice_other;
6859       END IF;
6860       IF p_value_type = 'INCREMENTAL' THEN
6861          IF l_date_index = l_date_buckets.first THEN
6862             l_last_forecasted_value := l_result_table(l_result_index).forecasted_value;
6863             l_last_actual_value := l_result_table(l_result_index).actual_value;
6864             l_result_table(l_result_index).forecasted_value := 0;
6865             l_result_table(l_result_index).actual_value := 0;
6866          ELSE
6867             l_result_record := l_result_table(l_result_index);
6868             l_result_table(l_result_index).forecasted_value :=
6869                l_result_table(l_result_index).forecasted_value -
6870                l_last_forecasted_value;
6871             l_result_table(l_result_index).actual_value :=
6872                l_result_table(l_result_index).actual_value -
6873                l_last_actual_value;
6874             l_last_forecasted_value := l_result_record.forecasted_value;
6875             l_last_actual_value := l_result_record.actual_value;
6876          END IF;
6877       END IF;
6878       l_result_table(l_result_index).slice_date := l_date_buckets(l_date_index);
6879       l_date_index := l_date_buckets.NEXT(l_date_index);
6880       l_result_index := l_result_table.NEXT(l_result_index);
6881    END LOOP;
6882    -- Removed the first element because it is the period before the selection.
6883    l_result_table.delete(l_result_table.first);
6884 
6885    x_result_table := l_result_table;
6886 
6887    IF (AMS_DEBUG_HIGH_ON) THEN
6888       Ams_Utility_Pvt.debug_message('Generated: '||x_result_table.COUNT||' results');
6889    END IF;
6890 
6891    --
6892    -- End API Body
6893    --
6894 
6895    --
6896    -- Standard API to get message count, and if 1,
6897    -- set the message data OUT NOCOPY variable.
6898    --
6899    Fnd_Msg_Pub.Count_And_Get (
6900       p_count           =>    x_msg_count,
6901       p_data            =>    x_msg_data,
6902       p_encoded         =>    Fnd_Api.G_FALSE
6903    );
6904 
6905    --
6906    -- Debug message.
6907    --
6908    IF (AMS_DEBUG_HIGH_ON) THEN
6909       Ams_Utility_Pvt.debug_message(l_full_name ||': END');
6910    END IF;
6911 
6912 EXCEPTION
6913    WHEN Fnd_Api.G_EXC_ERROR THEN
6914       x_return_status := Fnd_Api.G_RET_STS_ERROR;
6915       Fnd_Msg_Pub.Count_And_Get (
6916          p_count         =>     x_msg_count,
6917          p_data          =>     x_msg_data,
6918          p_encoded       =>   FND_API.G_FALSE
6919       );
6920    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6921       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6922       Fnd_Msg_Pub.Count_And_Get (
6923          p_count         =>     x_msg_count,
6924          p_data          =>     x_msg_data,
6925          p_encoded       =>   FND_API.G_FALSE
6926       );
6927    WHEN OTHERS THEN
6928       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6929       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
6930          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
6931       END IF;
6932       Fnd_Msg_Pub.Count_And_Get (
6933          p_count         =>     x_msg_count,
6934          p_data          =>     x_msg_data,
6935          p_encoded       =>   FND_API.G_FALSE
6936       );
6937 END get_results;
6938 
6939 --======================================================================
6940 -- procedure
6941 --    copy_act_metrics
6942 --
6943 -- PURPOSE
6944 --    Created to copy activity metrics
6945 --
6946 -- HISTORY
6947 --    13-may-2003 sunkumar created
6948 --======================================================================
6949    procedure copy_act_metrics (
6950    p_api_version            IN   NUMBER,
6951    p_init_msg_list          IN   VARCHAR2 := FND_API.G_FALSE,
6952    p_commit                 IN  VARCHAR2 := Fnd_Api.G_FALSE,
6953    p_validation_level       IN  NUMBER   := Fnd_Api.G_Valid_Level_Full,
6954    p_source_object_type     IN   VARCHAR2,
6955    p_source_object_id       IN   NUMBER,
6956    p_target_object_id       IN   NUMBER,
6957    x_return_status          OUT NOCOPY  VARCHAR2,
6958    x_msg_count              OUT NOCOPY  NUMBER,
6959    x_msg_data               OUT NOCOPY  VARCHAR2
6960    )
6961    IS
6962 
6963     L_API_VERSION          CONSTANT NUMBER := 1.0;
6964     L_API_NAME             CONSTANT VARCHAR2(30) := 'COPY_ACT_METRICS';
6965     L_FULL_NAME            CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6966 
6967     l_return_status        VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
6968 
6969     l_source_object_type   VARCHAR2(30) := p_source_object_type;
6970     l_source_object_id     NUMBER := p_source_object_id;
6971     l_target_object_id     NUMBER := p_target_object_id;
6972 
6973     l_activity_metric_id   NUMBER;
6974     l_metric_id            NUMBER;
6975     l_accrual_type         VARCHAR2(30);
6976     metrics_rec AMS_ACTMETRIC_PVT.act_metric_rec_type;
6977     x_activity_metric_id   NUMBER;
6978 
6979     --select the details from the source object
6980      CURSOR c_act_met_details(c_source_object_type varchar2, c_source_object_id NUMBER) IS
6981        SELECT  activity_metric_id,
6982                  last_update_date,
6983                  last_updated_by,
6984                  creation_date,
6985                  created_by,
6986                  last_update_login,
6987                  object_version_number,
6988                  act_metric_used_by_id,
6989                  arc_act_metric_used_by,
6990                  purchase_req_raised_flag,
6991                  application_id,
6992                  sensitive_data_flag,
6993                  budget_id,
6994                  metric_id,
6995                  transaction_currency_code,
6996                  trans_forecasted_value,
6997                  trans_committed_value,
6998                  trans_actual_value,
6999                  functional_currency_code,
7000                  func_forecasted_value,
7001                  dirty_flag,
7002                  func_committed_value,
7003                  func_actual_value,
7004                  last_calculated_date,
7005                  variable_value,
7006                  forecasted_variable_value,
7007                  computed_using_function_value,
7008                  metric_uom_code,
7009                  org_id,
7010                  difference_since_last_calc,
7011                  activity_metric_origin_id,
7012                  arc_activity_metric_origin,
7013                  days_since_last_refresh,
7014                  scenario_id,
7015                  SUMMARIZE_TO_METRIC,
7016                  ROLLUP_TO_METRIC,
7017                  hierarchy_id,
7018                  start_node,
7019                  from_level,
7020                  to_level,
7021                  from_date,
7022                  TO_DATE,
7023                  amount1,
7024                  amount2,
7025                  amount3,
7026                  percent1,
7027                  percent2,
7028                  percent3,
7029                  published_flag,
7030                  pre_function_name ,
7031                  post_function_name,
7032                  attribute_category,
7033                  attribute1,
7034                  attribute2,
7035                  attribute3,
7036                  attribute4,
7037                  attribute5,
7038                  attribute6,
7039                  attribute7,
7040                  attribute8,
7041                  attribute9,
7042                  attribute10,
7043                  attribute11,
7044                  attribute12,
7045                  attribute13,
7046                  attribute14,
7047                  attribute15,
7048                  description,
7049                  act_metric_date,
7050                  depend_act_metric,
7051                  function_used_by_id,
7052                  arc_function_used_by,
7053                  hierarchy_type,
7054                  status_code,
7055                  method_code,
7056                  action_code,
7057                  basis_year,
7058                  ex_start_node
7059      FROM ams_act_metrics_all
7060      WHERE arc_act_metric_used_by = c_source_object_type
7061        and act_metric_used_by_id = c_source_object_id;
7062 
7063     -- metrics_rec c_act_met_details%ROWTYPE;
7064     --check for existance of activity metrics in the target object
7065     CURSOR c_exist_metric_target (cv_metric_id NUMBER
7066                                  ,cv_act_metric_used_by_id  NUMBER
7067                                  ,cv_arc_act_metric_used_by VARCHAR2)    IS
7068 
7069    SELECT activity_metric_id
7070    FROM   ams_act_metrics_all
7071    WHERE  metric_id              = cv_metric_id
7072    AND    act_metric_used_by_id  = cv_act_metric_used_by_id
7073    AND    arc_act_metric_used_by = cv_arc_act_metric_used_by;
7074 
7075    --check for the accrual type for the metric id (in case activity metric exists for the target object
7076    cursor c_check_accrual_type( ca_metric_id number) IS
7077        select accrual_type
7078        from ams_metrics_all_b
7079        where   metric_id = ca_metric_id;
7080 
7081 BEGIN --begin copy_act_metrics
7082 
7083    -- Initialize savepoint.
7084    SAVEPOINT Copy_Metric_pvt;
7085 
7086    IF (AMS_DEBUG_HIGH_ON) THEN
7087    Ams_Utility_Pvt.Debug_Message(l_full_name||': start');
7088    END IF;
7089 
7090    -- Initialize message list if p_init_msg_list is set to TRUE.
7091    IF FND_API.To_Boolean (p_init_msg_list) THEN
7092       FND_MSG_PUB.Initialize;
7093    END IF;
7094 
7095    -- Standard check for API version compatibility.
7096    IF NOT FND_API.Compatible_API_Call (L_API_VERSION,
7097                                        p_api_version,
7098                                        L_API_NAME,
7099                                        G_PKG_NAME)
7100    THEN
7101       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7102    END IF;
7103 
7104    -- Initialize API return status to success.
7105    x_return_status := FND_API.G_RET_STS_SUCCESS;
7106 
7107      validate_objects(
7108       p_api_version           => p_api_version,
7109       p_init_msg_list         => p_init_msg_list,
7110       --p_commit                => p_commit,
7111       p_validation_level      => p_validation_level,
7112       p_source_object_type    => l_source_object_type,
7113       p_source_object_id      => l_source_object_id,
7114       p_target_object_id      => l_target_object_id,
7115       x_return_status         => x_return_status,
7116       x_msg_count             => x_msg_count,
7117       x_msg_data              => x_msg_data
7118       );
7119 
7120    IF x_return_status = Fnd_Api.G_RET_STS_ERROR THEN
7121       RAISE Fnd_Api.G_EXC_ERROR;
7122 
7123    ELSIF x_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
7124       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7125         END IF;
7126 
7127      open c_act_met_details(l_source_object_type,l_source_object_id);
7128      LOOP
7129         FETCH c_act_met_details INTO metrics_rec;
7130         EXIT WHEN c_act_met_details%NOTFOUND;
7131 
7132         l_activity_metric_id := 0;
7133 
7134          OPEN c_exist_metric_target(metrics_rec.metric_id,l_target_object_id,l_source_object_type);
7135             FETCH c_exist_metric_target INTO l_activity_metric_id;
7136          CLOSE c_exist_metric_target;
7137 
7138          -- metric from source object  exist in the target
7139          IF  l_activity_metric_id <> 0 THEN
7140              --initialize the accrual type value
7141              l_accrual_type := NULL;
7142              OPEN c_check_accrual_type(metrics_rec.metric_id);
7143              FETCH c_check_accrual_type INTO l_accrual_type;
7144              CLOSE c_check_accrual_type;
7145 
7146              --if accrual type is variable update the variable value.
7147              IF l_accrual_type=G_VARIABLE
7148              THEN
7149                UPDATE ams_act_metrics_all
7150                SET
7151                   object_version_number     = object_version_number + 1,
7152                   last_update_date          = SYSDATE,
7153                   last_updated_by           = Fnd_Global.User_ID,
7154                   last_update_login         = Fnd_Global.Conc_Login_ID,
7155                   variable_value            = metrics_rec.variable_value,
7156                   forecasted_variable_value = metrics_rec.forecasted_variable_value
7157                WHERE activity_metric_id     = l_activity_metric_id
7158                and   metric_id              = metrics_rec.metric_id
7159                and   arc_act_metric_used_by = l_source_object_type
7160                and   act_metric_used_by_id  = l_target_object_id;
7161              END IF;  --accrual type variable
7162 
7163         --metric from source object do not exist in the target call create to insert record.
7164         ELSE
7165             metrics_rec.trans_forecasted_value := NULL;
7166             metrics_rec.trans_actual_value     := NULL;
7167             metrics_rec.func_forecasted_value  := NULL;
7168             metrics_rec.func_actual_value      := NULL;
7169             metrics_rec.activity_metric_id     := NULL;
7170             metrics_rec.act_metric_used_by_id  := l_target_object_id;
7171             metrics_rec.application_id := 530;
7172             x_activity_metric_id := NULL;
7173 
7174             --call create_actmetric to get the entries in the table
7175 
7176           Create_ActMetric (
7177              p_api_version           => p_api_version,
7178                   p_init_msg_list         => p_init_msg_list,
7179                   --p_commit                => p_commit,
7180                   p_validation_level      => p_validation_level,
7181                   x_return_status         => x_return_status,
7182                   x_msg_count             => x_msg_count,
7183                   x_msg_data              => x_msg_data,
7184                   p_act_metric_rec        => metrics_rec,
7185                   x_activity_metric_id    => x_activity_metric_id);
7186 
7187             -- If any errors happen abort API.
7188           IF x_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
7189              RAISE Fnd_Api.G_EXC_ERROR;
7190           END IF;
7191        END IF; --if activity metric exist for target.
7192 
7193     END LOOP;
7194     CLOSE c_act_met_details;
7195 
7196    -- End API Body.
7197 
7198    -- Standard check for commit request.
7199    IF FND_API.To_Boolean (p_commit) THEN
7200       COMMIT;
7201    END IF;
7202 
7203     Fnd_Msg_Pub.Count_And_Get (
7204       p_count           =>    x_msg_count,
7205       p_data            =>    x_msg_data,
7206       p_encoded         =>    Fnd_Api.G_FALSE
7207    );
7208 
7209    --
7210    -- Debug message.
7211    --
7212    IF (AMS_DEBUG_HIGH_ON) THEN
7213       Ams_Utility_Pvt.debug_message(l_full_name ||': END');
7214    END IF;
7215 
7216    EXCEPTION
7217    WHEN FND_API.G_EXC_ERROR THEN
7218       ROLLBACK TO Copy_Metric_pvt;
7219       x_return_status := FND_API.G_RET_STS_ERROR;
7220       FND_MSG_PUB.Count_And_Get (
7221           p_encoded => FND_API.g_false,
7222           p_count   => x_msg_count,
7223                p_data    => x_msg_data
7224          );
7225 
7226    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7227       ROLLBACK TO Copy_Metric_pvt;
7228       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7229       FND_MSG_PUB.Count_And_Get (
7230          p_encoded => FND_API.g_false,
7231               p_count   => x_msg_count,
7232                         p_data    => x_msg_data
7233             );
7234 
7235    WHEN OTHERS THEN
7236       ROLLBACK TO Copy_Metric_pvt;
7237       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7238       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7239       THEN
7240          FND_MSG_PUB.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
7241       END IF;
7242 
7243       FND_MSG_PUB.Count_And_Get (
7244          p_encoded => FND_API.g_false,
7245               p_count   => x_msg_count,
7246               p_data    => x_msg_data
7247       );
7248 
7249    End copy_act_metrics;
7250 
7251 --======================================================================
7252 -- procedure
7253 --    validate_objects
7254 --
7255 -- PURPOSE
7256 --    Created to validate the values while copying activity metrics
7257 --
7258 -- HISTORY
7259 --    13-may-2003 sunkumar created
7260 --======================================================================
7261 
7262 PROCEDURE validate_objects(
7263 p_api_version                IN   NUMBER,
7264 p_init_msg_list              IN   VARCHAR2     := FND_API.G_FALSE,
7265 p_validation_level           IN  NUMBER   := Fnd_Api.G_Valid_Level_Full,
7266 p_source_object_type         IN   VARCHAR2,
7267 p_source_object_id           IN   NUMBER,
7268 p_target_object_id           IN   NUMBER,
7269 x_return_status              OUT NOCOPY  VARCHAR2,
7270 x_msg_count                  OUT NOCOPY  NUMBER,
7271 x_msg_data                   OUT NOCOPY  VARCHAR2
7272 )
7273 
7274 IS
7275    L_API_VERSION    CONSTANT NUMBER := 1.0;
7276    L_API_NAME       CONSTANT VARCHAR2(30) := 'VALIDATE_OBJECTS';
7277    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
7278 
7279    l_return_status      VARCHAR2(1):=FND_API.G_RET_STS_SUCCESS;
7280    l_source_object_type VARCHAR2(30) := p_source_object_type;
7281    l_source_object_id    NUMBER := p_source_object_id;
7282    l_target_object_id   NUMBER := p_target_object_id;
7283 
7284    l_source_object_exists VARCHAR2(1) := Fnd_Api.G_FALSE;
7285    l_target_object_exists VARCHAR2(1) := Fnd_Api.G_FALSE;
7286    l_valid_object         VARCHAR2(1) := Fnd_Api.G_FALSE;
7287 
7288    l_object_name  AMS_LOOKUPS.MEANING%TYPE;
7289    --cursors to check for existance of various objects.
7290    CURSOR c_check_camp(id NUMBER) IS
7291       SELECT Fnd_Api.G_TRUE
7292       FROM ams_campaigns_all_b
7293       WHERE campaign_id = id;
7294 
7295    CURSOR c_check_csch(id NUMBER) IS
7296       SELECT Fnd_Api.G_TRUE
7297       FROM ams_campaign_schedules_b
7298       WHERE schedule_id = id;
7299 
7300    CURSOR c_check_delv(id NUMBER) IS
7301       SELECT Fnd_Api.G_TRUE
7302       FROM ams_deliverables_all_b
7303       WHERE deliverable_id = id;
7304 
7305    CURSOR c_check_eveh(id NUMBER) IS
7306       SELECT Fnd_Api.G_TRUE
7307       FROM ams_event_headers_all_b
7308       WHERE event_header_id = id;
7309 
7310    CURSOR c_check_eveo(id NUMBER) IS
7311       SELECT Fnd_Api.G_TRUE
7312       FROM ams_event_offers_all_b
7313       WHERE event_offer_id = id;
7314 
7315 BEGIN
7316 
7317    -- Output debug message.
7318    IF (AMS_DEBUG_HIGH_ON) THEN
7319       Ams_Utility_Pvt.debug_message(l_full_name||': start');
7320    END IF;
7321 
7322    -- Initialize message list if p_init_msg_list is set to TRUE.
7323    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
7324       Fnd_Msg_Pub.Initialize;
7325    END IF;
7326 
7327    -- Standard check for API version compatibility.
7328    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
7329                                        p_api_version,
7330                                        L_API_NAME,
7331                                        G_PKG_NAME)
7332    THEN
7333       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7334    END IF;
7335 
7336    -- Initialize API return status to success.
7337    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
7338 
7339    -- Begin API Body.
7340    IF (AMS_DEBUG_HIGH_ON) THEN
7341     Ams_Utility_Pvt.debug_message(l_full_name||': Validate items');
7342   END IF;
7343 
7344   --check source object exists
7345   IF (l_source_object_type IN ('RCAM', 'CAMP')) THEN
7346          OPEN c_check_camp(l_source_object_id);
7347          FETCH c_check_camp INTO l_source_object_exists;
7348          CLOSE c_check_camp;
7349     l_valid_object :=  Fnd_Api.G_TRUE;
7350 
7351   ELSIF (l_source_object_type = 'CSCH') THEN
7352     OPEN c_check_csch(l_source_object_id);
7353     FETCH c_check_csch INTO l_source_object_exists;
7354     CLOSE c_check_csch;
7355     l_valid_object :=  Fnd_Api.G_TRUE;
7356 
7357   ELSIF (l_source_object_type = 'DELV') THEN
7358     OPEN c_check_delv(l_source_object_id);
7359     FETCH c_check_delv INTO l_source_object_exists;
7360     CLOSE c_check_delv;
7361     l_valid_object :=  Fnd_Api.G_TRUE;
7362 
7363   ELSIF (l_source_object_type = 'EVEH') THEN
7364     OPEN c_check_eveh(l_source_object_id);
7365     FETCH c_check_eveh INTO l_source_object_exists;
7366     CLOSE c_check_eveh;
7367     l_valid_object :=  Fnd_Api.G_TRUE;
7368 
7369   ELSIF (l_source_object_type IN ('EONE' , 'EVEO')) THEN
7370     OPEN c_check_eveo(l_source_object_id);
7371     FETCH c_check_eveo INTO l_source_object_exists;
7372     CLOSE c_check_eveo;
7373       l_valid_object :=  Fnd_Api.G_TRUE;
7374 
7375   END IF;
7376 
7377   l_object_name := ams_utility_pvt.get_lookup_meaning('AMS_SYS_ARC_QUALIFIER', l_source_object_type);
7378 
7379   --the object type passed is not a valid one for metrics.
7380   IF (l_valid_object = Fnd_Api.G_FALSE) THEN
7381       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
7382          Fnd_Message.Set_Name('AMS', 'AMS_COPY_INVALID_OBJECTS');
7383          Fnd_Msg_Pub.ADD;
7384       END IF;
7385       l_return_status := Fnd_Api.G_RET_STS_ERROR;
7386 
7387   END IF;
7388 
7389   --check if source object was not found
7390   IF (l_source_object_exists = Fnd_Api.G_FALSE)  THEN
7391       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
7392           Fnd_Message.Set_Name('AMS', 'AMS_COPY_INVALID_SOURCE');
7393          Fnd_Message.set_token('OBJECT', l_object_name);
7394     Fnd_Msg_Pub.ADD;
7395       END IF;
7396          l_return_status := Fnd_Api.G_RET_STS_ERROR;
7397   END IF;
7398 
7399   --check target object exists
7400   IF (l_source_object_type IN ('RCAM', 'CAMP')) THEN
7401          OPEN c_check_camp(l_target_object_id);
7402          FETCH c_check_camp INTO l_target_object_exists;
7403          CLOSE c_check_camp;
7404 
7405   ELSIF (l_source_object_type = 'CSCH') THEN
7406     OPEN c_check_csch(l_target_object_id);
7407     FETCH c_check_csch INTO l_target_object_exists;
7408     CLOSE c_check_csch;
7409 
7410   ELSIF (l_source_object_type = 'DELV') THEN
7411     OPEN c_check_delv(l_target_object_id);
7412     FETCH c_check_delv INTO l_target_object_exists;
7413     CLOSE c_check_delv;
7414 
7415   ELSIF (l_source_object_type = 'EVEH') THEN
7416     OPEN c_check_eveh(l_target_object_id);
7417     FETCH c_check_eveh INTO l_target_object_exists;
7418     CLOSE c_check_eveh;
7419 
7420   ELSIF (l_source_object_type IN ('EONE' , 'EVEO')) THEN
7421     OPEN c_check_eveo(l_target_object_id);
7422     FETCH c_check_eveo INTO l_target_object_exists;
7423     CLOSE c_check_eveo;
7424 
7425   END IF;
7426 
7427   --check if target object was not found
7428   IF (l_target_object_exists = Fnd_Api.G_FALSE)  THEN
7429       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
7430          Fnd_Message.Set_Name('AMS', 'AMS_COPY_INVALID_TARGET');
7431          Fnd_Message.set_token('OBJECT', l_object_name);
7432     Fnd_Msg_Pub.ADD;
7433       END IF;
7434       l_return_status := Fnd_Api.G_RET_STS_ERROR;
7435 
7436   END IF;
7437 
7438    -- End API Body.
7439 
7440    -- Standard API to get message count, and if 1,
7441    -- set the message data OUT variable.
7442    FND_MSG_PUB.Count_And_Get (
7443       p_count           =>    x_msg_count,
7444       p_data            =>    x_msg_data,
7445       p_encoded         =>    FND_API.G_FALSE
7446    );
7447 
7448    -- Add success message to message list.
7449    IF (AMS_DEBUG_HIGH_ON) THEN
7450    Ams_Utility_Pvt.debug_message(l_full_name ||': end Success');
7451    END IF;
7452 
7453    x_return_status := l_return_status;
7454 
7455 END validate_objects;
7456 
7457 --======================================================================
7458 -- FUNCTION
7459 --    Lock_Object
7460 --
7461 -- PURPOSE
7462 --    Locks object to prevent duplicates.
7463 --
7464 -- HISTORY
7465 --
7466 --======================================================================
7467 FUNCTION Lock_Object(
7468    p_api_version                IN  NUMBER,
7469    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
7470    p_arc_act_metric_used_by     IN VARCHAR2,
7471    p_act_metric_used_by_id      IN NUMBER,
7472    x_return_status              OUT NOCOPY VARCHAR2,
7473    x_msg_count                  OUT NOCOPY NUMBER,
7474    x_msg_data                   OUT NOCOPY VARCHAR2)
7475 return varchar2
7476 IS
7477    L_API_VERSION    CONSTANT NUMBER := 1.0;
7478    L_API_NAME       CONSTANT VARCHAR2(30) := 'LOCK_OBJECT';
7479    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
7480 
7481    l_sql   VARCHAR2(4000);
7482    l_count NUMBER;
7483    l_return_status VARCHAR2(1);
7484    l_table_name VARCHAR2(30);
7485    l_pk_name VARCHAR2(30);
7486 
7487 BEGIN
7488    --
7489    -- Initialize message list if p_init_msg_list is set to TRUE.
7490    --
7491    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
7492       Fnd_Msg_Pub.Initialize;
7493    END IF;
7494 
7495    --
7496    -- Standard check for API version compatibility.
7497    --
7498    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
7499                                        p_api_version,
7500                                        L_API_NAME,
7501                                        G_PKG_NAME)
7502    THEN
7503       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7504    END IF;
7505 
7506    --
7507    -- Initialize API return status to success.
7508    --
7509    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
7510    IF (p_arc_act_metric_used_by ='CSCH') THEN
7511       l_table_name    := 'AMS_CAMPAIGN_SCHEDULES_B';
7512       l_pk_name       := 'SCHEDULE_ID';
7513    ELSIF (p_arc_act_metric_used_by ='CAMP') THEN
7514       l_table_name    := 'AMS_CAMPAIGNS_ALL_B';
7515       l_pk_name       := 'CAMPAIGN_ID';
7516    ELSIF (p_arc_act_metric_used_by ='EVEO') THEN
7517       l_table_name    := 'AMS_EVENT_OFFERS_ALL_B';
7518       l_pk_name       := 'EVENT_OFFER_ID';
7519    ELSIF (p_arc_act_metric_used_by ='EONE') THEN
7520       l_table_name    := 'AMS_EVENT_OFFERS_ALL_B';
7521       l_pk_name       := 'EVENT_OFFER_ID';
7522    ELSIF (p_arc_act_metric_used_by ='EVEH') THEN
7523       l_table_name    := 'AMS_EVENT_HEADERS_ALL_B';
7524       l_pk_name       := 'EVENT_HEADER_ID';
7525    ELSIF (p_arc_act_metric_used_by ='DELV') THEN
7526       l_table_name    := 'AMS_DELIVERABLES_ALL_B';
7527       l_pk_name       := 'DELIVERABLE_ID';
7528    ELSIF (p_arc_act_metric_used_by = 'RCAM') THEN
7529       l_table_name    := 'AMS_CAMPAIGNS_ALL_B';
7530       l_pk_name       := 'CAMPAIGN_ID';
7531    ELSIF (p_arc_act_metric_used_by = 'ALIST') THEN
7532       l_table_name    := 'AMS_ACT_LISTS';
7533       l_pk_name       := 'ACT_LIST_HEADER_ID';
7534    ELSE
7535       AMS_Utility_PVT.error_message ('AMS_INVALID_SYS_QUAL', 'SYS_QUALIFIER', p_arc_act_metric_used_by);
7536       x_return_status := FND_API.g_ret_sts_unexp_error;
7537       l_table_name    := NULL;
7538       l_pk_name       := NULL;
7539    END IF;
7540 
7541    l_count := 0;
7542    if x_return_status = Fnd_Api.G_RET_STS_SUCCESS then
7543       l_sql := 'UPDATE ' || UPPER(l_table_name) ||
7544          ' SET object_version_number = object_version_number '||
7545          ' WHERE ' || UPPER(l_pk_name) || ' = :b1 ';
7546 
7547    IF (AMS_DEBUG_HIGH_ON) THEN
7548       ams_utility_pvt.debug_message('SQL statement: '||l_sql);
7549    END IF;
7550 
7551       BEGIN
7552          EXECUTE IMMEDIATE l_sql
7553          USING p_act_metric_used_by_id;
7554          l_count := 1;
7555       EXCEPTION
7556          WHEN NO_DATA_FOUND THEN
7557             l_count := 0;
7558       END;
7559 
7560    end if;
7561 
7562    BEGIN
7563       EXECUTE IMMEDIATE l_sql
7564       USING p_act_metric_used_by_id;
7565    EXCEPTION
7566       WHEN NO_DATA_FOUND THEN
7567          l_count := 0;
7568    END;
7569 
7570    IF l_count = 0 THEN
7571       RETURN FND_API.g_false;
7572    ELSE
7573       RETURN FND_API.g_true;
7574    END IF;
7575 
7576 END Lock_Object;
7577 
7578 --
7579 -- PROCEDURE
7580 --    delete_actmetrics_assoc
7581 --
7582 -- DESCRIPTION
7583 --    Delete all activity metrics associated to the given object.
7584 --
7585 -- REQUIREMENT
7586 --    bug 3410962: ALIST integration for deleting lists from target group
7587 --
7588 -- HISTORY
7589 -- 30-Jan-2004 choang   Created.
7590 --
7591 PROCEDURE delete_actmetrics_assoc (
7592    p_api_version     IN NUMBER,
7593    p_init_msg_list   IN VARCHAR2 := FND_API.G_FALSE,
7594    p_commit          IN VARCHAR2 := FND_API.G_FALSE,
7595    p_object_type     IN VARCHAR2,
7596    p_object_id       IN NUMBER,
7597    x_return_status   OUT NOCOPY VARCHAR2,
7598    x_msg_count       OUT NOCOPY NUMBER,
7599    x_msg_data        OUT NOCOPY VARCHAR2
7600 )
7601 IS
7602    L_API_NAME     CONSTANT VARCHAR2(60) := 'Delete ActMetric Associations';
7603    L_API_VERSION  CONSTANT NUMBER := 1.0;
7604 BEGIN
7605    SAVEPOINT delete_actmetrics_assoc;
7606 
7607    --
7608    -- Initialize message list if p_init_msg_list is set to TRUE.
7609    --
7610    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
7611       Fnd_Msg_Pub.Initialize;
7612    END IF;
7613 
7614    --
7615    -- Standard check for API version compatibility.
7616    --
7617    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
7618                                        p_api_version,
7619                                        L_API_NAME,
7620                                        G_PKG_NAME)
7621    THEN
7622       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7623    END IF;
7624 
7625    --
7626    -- Initialize API return status to success.
7627    --
7628    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
7629 
7630    DELETE FROM ams_act_metrics_all
7631    WHERE arc_act_metric_used_by = p_object_type
7632    AND   act_metric_used_by_id = p_object_id;
7633 
7634    IF p_commit = FND_API.G_TRUE THEN
7635       COMMIT;
7636    END IF;
7637 EXCEPTION
7638    WHEN OTHERS THEN
7639       ROLLBACK TO delete_actmetrics_assoc;
7640       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7641       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7642       THEN
7643          FND_MSG_PUB.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
7644       END IF;
7645 
7646       FND_MSG_PUB.Count_And_Get (
7647          p_encoded => FND_API.g_false,
7648          p_count   => x_msg_count,
7649          p_data    => x_msg_data
7650       );
7651 END delete_actmetrics_assoc;
7652 
7653 --
7654 -- PROCEDURE
7655 --    Validate_Object_Exists
7656 --
7657 -- DESCRIPTION
7658 --    Check for object existance.
7659 --
7660 -- HISTORY
7661 -- 21-Apr-2004 sunkumar Created
7662 --
7663 FUNCTION Validate_Object_Exists (
7664    p_object_type  IN  varchar2,
7665    p_object_id   IN  number
7666 )
7667 RETURN VARCHAR2
7668 IS
7669 
7670    CURSOR c_campaign_metric(p_campaign_id number) IS
7671    SELECT 1 FROM AMS_CAMPAIGNS_ALL_B
7672    WHERE CAMPAIGN_ID = p_campaign_id;
7673 
7674 
7675    CURSOR c_campaign_schedule_metric(p_campaign_schedule_id number) IS
7676    SELECT 1 FROM AMS_CAMPAIGN_SCHEDULES_B
7677    WHERE schedule_ID = p_campaign_schedule_id;
7678 
7679    CURSOR c_deliverable_metric(p_deliverable_id number) IS
7680    SELECT 1 FROM AMS_DELIVERABLES_ALL_B
7681    WHERE deliverable_ID = p_deliverable_id;
7682 
7683    CURSOR c_event_schedule_metric(p_event_schedule_id number) IS
7684    SELECT 1 FROM AMS_EVENT_OFFERS_ALL_B
7685    WHERE EVENT_OFFER_ID = p_event_schedule_id
7686    and event_object_type = 'EVEO';
7687 
7688    CURSOR c_one_off_metric(p_one_off_id number) IS
7689    SELECT 1 FROM AMS_EVENT_OFFERS_ALL_B
7690    WHERE EVENT_OFFER_ID = p_one_off_id
7691    and event_object_type = 'EONE';
7692 
7693 
7694    CURSOR c_event_metric(p_event_id number) IS
7695    SELECT 1 FROM AMS_EVENT_HEADERS_ALL_B
7696    WHERE EVENT_HEADER_ID = p_event_id;
7697 
7698 
7699    CURSOR c_act_list_metric(p_act_list_id number) IS
7700    SELECT 1 FROM AMS_ACT_LISTS
7701    WHERE ACT_LIST_HEADER_ID = p_act_list_id;
7702 
7703    l_count NUMBER;
7704 BEGIN
7705 
7706 
7707    IF (p_object_type ='CSCH') THEN
7708 
7709       OPEN c_campaign_schedule_metric(p_object_id);
7710       IF c_campaign_schedule_metric%NOTFOUND
7711           THEN l_count := 0;
7712           ELSE l_count := 1;
7713       END IF;
7714       CLOSE c_campaign_schedule_metric;
7715 
7716 
7717    ELSIF (p_object_type ='CAMP' OR p_object_type = 'RCAM') THEN
7718 
7719       OPEN c_campaign_metric(p_object_id);
7720       IF c_campaign_metric%NOTFOUND
7721            THEN l_count := 0;
7722            ELSE l_count := 1;
7723       END IF;
7724       CLOSE c_campaign_metric;
7725 
7726 
7727    ELSIF (p_object_type ='EVEO') THEN
7728 
7729       OPEN c_event_schedule_metric(p_object_id);
7730 
7731       IF c_event_schedule_metric%NOTFOUND
7732       THEN l_count := 0;
7733         ELSE l_count := 1;
7734       END IF;
7735 
7736       CLOSE c_event_schedule_metric;
7737 
7738    ELSIF (p_object_type ='EONE') THEN
7739 
7740       OPEN c_one_off_metric(p_object_id);
7741 
7742       IF c_one_off_metric%NOTFOUND
7743         THEN l_count := 0;
7744         ELSE l_count := 1;
7745       END IF;
7746 
7747       CLOSE c_one_off_metric;
7748 
7749    ELSIF (p_object_type ='EVEH') THEN
7750 
7751       OPEN c_event_metric(p_object_id);
7752 
7753       IF c_event_metric%NOTFOUND
7754         THEN l_count := 0;
7755         ELSE l_count := 1;
7756       END IF;
7757 
7758       CLOSE c_event_metric;
7759 
7760    ELSIF (p_object_type ='DELV') THEN
7761 
7762       OPEN c_deliverable_metric(p_object_id);
7763 
7764       IF c_deliverable_metric%NOTFOUND
7765         THEN l_count := 0;
7766         ELSE l_count := 1;
7767       END IF;
7768 
7769       CLOSE c_deliverable_metric;
7770 
7771    ELSIF (p_object_type = 'ALIST') THEN
7772 
7773       OPEN c_act_list_metric(p_object_id);
7774       IF c_act_list_metric%NOTFOUND
7775         THEN l_count := 0;
7776         ELSE l_count := 1;
7777       END IF;
7778 
7779       CLOSE c_act_list_metric;
7780 
7781    ELSE
7782       l_count := 0;
7783 
7784    END IF;
7785 
7786    IF l_count = 0 THEN
7787       RETURN FND_API.g_false;
7788    ELSE
7789       RETURN FND_API.g_true;
7790    END IF;
7791 
7792 
7793 END Validate_Object_Exists;
7794 
7795 --
7796 -- FUNCTION
7797 --   CAN_POST_TO_BUDGET
7798 --
7799 -- DESCRIPTION
7800 --   Determine if the object has an approved budget and the correct status
7801 --   for posting costs to budgets.
7802 --
7803 -- RETURN
7804 --   VARCHAR2 - TRUE, FALSE
7805 --
7806 --  REQUIREMENT
7807 --   BUG 4868582: Post to budget only with actual values entered.
7808 --
7809 -- HISTORY
7810 --   15-Dec-2005 dmvincen  Created.
7811 FUNCTION CAN_POST_TO_BUDGET(p_object_type IN VARCHAR2, p_object_id IN NUMBER)
7812 RETURN VARCHAR2
7813 IS
7814   CURSOR c_has_approved_budget(l_object_type VARCHAR2,l_object_id NUMBER)
7815   IS
7816        select count(1) budget_count
7817        from ozf_act_budgets
7818 		 where transfer_type = 'REQUEST'
7819 		 and  arc_act_budget_used_by = l_object_type
7820 		 and  act_budget_used_by_id = l_object_id
7821 		 and  budget_source_type = 'FUND'
7822 		 and  status_code = 'APPROVED';
7823 
7824   l_return_val VARCHAR2(30) := FND_API.G_FALSE;
7825   l_budget_count NUMBER;
7826   l_status VARCHAR2(30);
7827   l_currency VARCHAR2(30);
7828 BEGIN
7829 	 open c_has_approved_budget(p_object_type, p_object_id);
7830 	 fetch c_has_approved_budget INTO l_budget_count;
7831 	 CLOSE c_has_approved_budget;
7832 
7833 	 Get_Object_Info (
7834 		 p_obj_type     => p_object_type,
7835 		 p_obj_id       => p_object_id,
7836        x_flag         => l_status,
7837        x_currency     => l_currency
7838 		);
7839 
7840 	IF l_budget_count > 0 AND l_status = 'Y' THEN
7841 	   l_return_val := FND_API.G_TRUE;
7842 	END IF;
7843 
7844 	return l_return_val;
7845 
7846 END can_post_to_budget;
7847 
7848 END Ams_Actmetric_Pvt;