DBA Data[Home] [Help]

PACKAGE BODY: APPS.AMS_ACTMETRIC_PVT

Source


1 PACKAGE BODY AMS_ACTMETRIC_PVT AS
2 /* $Header: amsvamtb.pls 120.14 2006/01/25 13:45:40 dmvincen noship $ */
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
336       WHERE event_header_id = p_event_id;
333       SELECT currency_code_tc AS currency_code, system_status_code
334           -- active_flag, active_from_date
335       FROM ams_event_headers_all_b
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 
478 
475    l_status_code NUMBER := NULL;
476 
477 BEGIN
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 ;
583   x_act_metric_rec.amount3                           := Fnd_Api.G_MISS_NUM ;
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 ;
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
688    and m.metric_id = f.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
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
824     WHERE campaign_id = l_obj_id;
821     CURSOR c_get_camp_trans_curr(l_obj_id       NUMBER) IS
822     SELECT transaction_currency_code
823     FROM ams_campaigns_all_b
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.
952          l_act_metric_rec.activity_metric_id  := l_act_metric_id;
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);
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
1082       -- when the functional currency is passed.
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
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;
1182             Convert_Currency (
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
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,
1285             IF l_curr_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
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);
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
1407       SELECT Fnd_Api.G_TRUE
1404       AND status_code IN ('SUBMITTED_BA', 'ACTIVE', 'COMPLETED', 'CANCELLED');
1405 
1406    CURSOR c_delv_delete(id NUMBER) IS
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
1554 --                             for a given metric_id.
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
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 
1644 BEGIN
1645    --
1646    -- Initialize savepoint.
1647    --
1648    --SAVEPOINT Create_ActMetric2_pvt;
1649 
1650    IF (AMS_DEBUG_HIGH_ON) THEN
1651       Ams_Utility_Pvt.Debug_Message(l_full_name||': start');
1652    END IF;
1653 
1654    --
1655    -- Initialize message list if p_init_msg_list is set to TRUE.
1656    --
1657    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
1658       Fnd_Msg_Pub.Initialize;
1659    END IF;
1660 
1661    --
1662    -- Standard check for API version compatibility.
1663    --
1664    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
1665                                        p_api_version,
1666                                        L_API_NAME,
1667                                        G_PKG_NAME)
1668    THEN
1669       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1670    END IF;
1671 
1672    --
1673    -- Initialize API return status to success.
1674    --
1675    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1676    x_activity_metric_id := NULL;
1677    --
1678    -- Begin API Body.
1679    --
1680 
1681    OPEN c_met_info (p_act_metric_rec.metric_id);
1682    FETCH c_met_info INTO l_met_info;
1683    l_summary_metric_id := l_met_info.summary_metric_id;
1684    l_sensitive_data_flag := l_met_info.sensitive_data_flag;
1685    l_accrual_type := l_met_info.accrual_type;
1686    l_compute_using_function := l_met_info.compute_using_function;
1687    IF UPPER(l_met_info.metric_calculation_type) = 'FUNCTION' THEN
1688       l_act_metrics_rec.trans_actual_value := NULL;
1689       l_act_metrics_rec.func_actual_value := NULL;
1690    END IF;
1691    CLOSE c_met_info;
1692 
1696       --                        requested.
1693    IF UPPER(l_met_info.enabled_flag) = 'N'
1694     AND UPPER(l_met_info.metric_calculation_type) IN ('MANUAL', 'FUNCTION') THEN
1695       -- choang - 26-dec-2002 - ignore the metric when create activity metric
1697       IF (AMS_DEBUG_HIGH_ON) THEN
1698          Ams_Utility_Pvt.Debug_Message(l_full_name||': ignore metric id: ' || p_act_metric_rec.metric_id);
1699       END IF;
1700 
1701       RETURN;
1702 --      l_return_status := Fnd_Api.G_RET_STS_ERROR;
1703 --      RAISE Fnd_Api.G_EXC_ERROR;
1704    END IF;
1705    -- END
1706 
1707    -- Make a call-out to check the frozen status.
1708    -- If it is frozen, disallow the operation.
1709    Check_Freeze_Status (p_act_metric_rec,
1710                         G_CREATE, -- Create is operation mode
1711                         l_freeze_status,
1712                         l_return_status);
1713 
1714    IF (l_freeze_status = Fnd_Api.G_TRUE)  THEN
1715           -- frozen to create the record
1716       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
1717          Fnd_Message.Set_Name('AMS', 'AMS_METR_FROZEN');
1718          Fnd_Msg_Pub.ADD;
1719       END IF;
1720                 l_return_status := Fnd_Api.G_RET_STS_ERROR;
1721         END IF;
1722    -- If it is frozen, or any errors happen abort API.
1723 
1724    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
1725       RAISE Fnd_Api.G_EXC_ERROR;
1726    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
1727       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1728    END IF;
1729 
1730    -- Check for existence of parent metric for this given metric_id
1731    IF l_summary_metric_id IS NOT NULL THEN
1732      -- Initialize the record variable for not null values
1733      l_parent_act_metrics_rec.act_metric_used_by_id  :=
1734                                     l_act_metrics_rec.act_metric_used_by_id;
1735      l_parent_act_metrics_rec.arc_act_metric_used_by :=
1736                                     l_act_metrics_rec.arc_act_metric_used_by;
1737      l_parent_act_metrics_rec.application_id         :=
1738                                     l_act_metrics_rec.application_id;
1739      l_parent_act_metrics_rec.sensitive_data_flag    := l_sensitive_data_flag;
1740      l_parent_act_metrics_rec.metric_id              := l_summary_metric_id;
1741      l_parent_act_metrics_rec.dirty_flag             := G_IS_DIRTY;
1742 
1743      -- Create a conditional entry for the parent metric.
1744      -- Conditional test is in Create_ParentActMetric.
1745      Create_ParentActMetric
1746          (p_api_version      => p_api_version
1747          ,p_init_msg_list    => p_init_msg_list
1748          ,p_commit           => Fnd_Api.g_false
1749          ,p_validation_level => p_validation_level
1750          ,p_act_metric_rec   => l_parent_act_metrics_rec
1751          ,x_act_metric_id    => l_summarize_to_metric
1752          );
1753 
1754    END IF;
1755 
1756    l_act_metrics_rec.summarize_to_metric := l_summarize_to_metric;
1757 
1758    IF l_act_metrics_rec.hierarchy_type = FND_API.G_MISS_CHAR then
1759         l_act_metrics_rec.hierarchy_type := NULL;
1760    END IF;
1761    IF l_act_metrics_rec.status_code = FND_API.G_MISS_CHAR then
1762         l_act_metrics_rec.status_code := NULL;
1763    END IF;
1764    IF l_act_metrics_rec.method_code = FND_API.G_MISS_CHAR then
1765         l_act_metrics_rec.method_code := NULL;
1766    END IF;
1767    IF l_act_metrics_rec.action_code = FND_API.G_MISS_CHAR then
1768         l_act_metrics_rec.action_code := NULL;
1769    END IF;
1770    IF l_act_metrics_rec.basis_year = FND_API.G_MISS_NUM then
1771         l_act_metrics_rec.basis_year := NULL;
1772    END IF;
1773    IF l_act_metrics_rec.ex_start_node = FND_API.G_MISS_CHAR then
1774         l_act_metrics_rec.ex_start_node := NULL;
1775    END IF;
1776 
1777 
1778    -- Default Sensitive data Flag, UOM code if not sent to the API
1779    -- Do Currency Conversion after defaulting functional currency code
1780    Default_ActMetric(
1781             p_init_msg_list       => p_init_msg_list,
1782             --p_act_metric_rec      => l_act_metrics_rec,
1783             p_validation_mode     => Jtf_Plsql_Api.g_create,
1784             x_complete_rec        => l_act_metrics_rec,
1785             x_return_status       => l_return_status,
1786             x_msg_count           => x_msg_count,
1787             x_msg_data            => x_msg_data
1788         );
1789 
1790    -- If any errors happen abort API.
1791    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
1792       RAISE Fnd_Api.G_EXC_ERROR;
1793    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
1794       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1795    END IF;
1796 
1797    --
1798    -- Validate the record before inserting.
1799    --
1800    Validate_ActMetric (
1801       p_api_version               => l_api_version,
1802       p_init_msg_list             => p_init_msg_list,
1803       p_validation_level          => p_validation_level,
1804       x_msg_count                 => x_msg_count,
1805       x_msg_data                  => x_msg_data,
1806       x_return_status             => l_return_status,
1807       p_act_metric_rec            => l_act_metrics_rec
1808    );
1809 
1810    -- If any errors happen abort API.
1811    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
1812       RAISE Fnd_Api.G_EXC_ERROR;
1813    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
1814       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1815    END IF;
1819    --
1816 
1817    --
1818    -- Debug message.
1820    IF (AMS_DEBUG_HIGH_ON) THEN
1821       Ams_Utility_Pvt.debug_message(l_full_name ||': insert');
1822    END IF;
1823 
1824    IF l_act_metrics_rec.activity_metric_id IS NULL THEN
1825       LOOP
1826       --
1827       -- Set the value for the PK.
1828          OPEN c_act_met_id;
1829          FETCH c_act_met_id INTO l_act_metrics_rec.activity_metric_id;
1830          CLOSE c_act_met_id;
1831 
1832          OPEN  c_act_metr_count(l_act_metrics_rec.activity_metric_id);
1833          FETCH c_act_metr_count INTO l_act_metr_count ;
1834          CLOSE c_act_metr_count ;
1835 
1836          EXIT WHEN l_act_metr_count = 0 ;
1837       END LOOP ;
1838    END IF;
1839 
1840    --
1841    -- Insert into the base table.
1842    --
1843    INSERT INTO ams_act_metrics_all (
1844          activity_metric_id,
1845 
1846          creation_date,
1847          created_by,
1848          last_update_date,
1849          last_updated_by,
1850          last_update_login,
1851          object_version_number,
1852          act_metric_used_by_id,
1853          arc_act_metric_used_by,
1854          purchase_req_raised_flag,
1855          application_id,
1856          sensitive_data_flag,
1857          budget_id,
1858          metric_id,
1859          transaction_currency_code,
1860          trans_forecasted_value,
1861          trans_committed_value,
1862          trans_actual_value,
1863          functional_currency_code,
1864          func_forecasted_value,
1865          dirty_flag,
1866          func_committed_value,
1867          func_actual_value,
1868          last_calculated_date,
1869          variable_value,
1870          forecasted_variable_value,
1871          computed_using_function_value,
1872          metric_uom_code,
1873          org_id,
1874          attribute_category,
1875          difference_since_last_calc,
1876          activity_metric_origin_id,
1877          arc_activity_metric_origin,
1878          days_since_last_refresh,
1879          scenario_id,
1880          SUMMARIZE_TO_METRIC,
1881          hierarchy_id,
1882          start_node,
1883          from_level,
1884          to_level,
1885          from_date,
1886          TO_DATE,
1887          amount1,
1888          amount2,
1889          amount3,
1890          percent1,
1891          percent2,
1892          percent3,
1893          published_flag,
1894          pre_function_name,
1895          post_function_name,
1896          attribute1,
1897          attribute2,
1898          attribute3,
1899          attribute4,
1900          attribute5,
1901          attribute6,
1902          attribute7,
1903          attribute8,
1904          attribute9,
1905          attribute10,
1906          attribute11,
1907          attribute12,
1908          attribute13,
1909          attribute14,
1910          attribute15,
1911          description,
1912          act_metric_date,
1913          depend_act_metric,
1914          function_used_by_id,
1915          arc_function_used_by,
1916          /* 05/15/2002 yzhao: 11.5.9 add 6 new columns for top-down bottom-up budgeting */
1917          hierarchy_type,
1918          status_code,
1919          method_code,
1920          action_code,
1921          basis_year,
1922          ex_start_node
1923          /* 05/15/2002 yzhao: add ends */
1924    )
1925    VALUES (
1926         l_act_metrics_rec.activity_metric_id,
1927         l_today,
1928         Fnd_Global.User_ID,
1929         l_today,
1930         Fnd_Global.User_ID,
1931         Fnd_Global.Conc_Login_ID,
1932          1, --Object Version Number
1933          l_act_metrics_rec.act_metric_used_by_id,
1934          l_act_metrics_rec.arc_act_metric_used_by,
1935          NVL(l_act_metrics_rec.purchase_req_raised_flag,'N'),
1936          l_act_metrics_rec.application_id,
1937          l_act_metrics_rec.sensitive_data_flag,
1938          l_act_metrics_rec.budget_id,
1939          l_act_metrics_rec.metric_id,
1940          l_act_metrics_rec.transaction_currency_code,
1941          l_act_metrics_rec.trans_forecasted_value,
1942          l_act_metrics_rec.trans_committed_value,
1943          l_act_metrics_rec.trans_actual_value,
1944          l_act_metrics_rec.functional_currency_code,
1945          l_act_metrics_rec.func_forecasted_value,
1946          NVL(l_act_metrics_rec.dirty_flag,G_IS_DIRTY),
1947          l_act_metrics_rec.func_committed_value,
1948          l_act_metrics_rec.func_actual_value,
1949          l_act_metrics_rec.last_calculated_date,
1950          l_act_metrics_rec.variable_value,
1951         l_act_metrics_rec.forecasted_variable_value,
1952          l_act_metrics_rec.computed_using_function_value,
1953          l_act_metrics_rec.metric_uom_code,
1954          TO_NUMBER (SUBSTRB (USERENV ('CLIENT_INFO'), 1, 10)) , -- org_id
1955          l_act_metrics_rec.attribute_category,
1956          l_act_metrics_rec.difference_since_last_calc,
1957          l_act_metrics_rec.activity_metric_origin_id,
1958          l_act_metrics_rec.arc_activity_metric_origin,
1959          l_act_metrics_rec.days_since_last_refresh,
1960          l_act_metrics_rec.scenario_id,
1961          l_act_metrics_rec.SUMMARIZE_TO_METRIC,
1965         l_act_metrics_rec.to_level,
1962          l_act_metrics_rec.hierarchy_id,
1963         l_act_metrics_rec.start_node,
1964         l_act_metrics_rec.from_level,
1966         l_act_metrics_rec.from_date,
1967         l_act_metrics_rec.TO_DATE,
1968         l_act_metrics_rec.amount1,
1969         l_act_metrics_rec.amount2,
1970         l_act_metrics_rec.amount3,
1971         l_act_metrics_rec.percent1,
1972         l_act_metrics_rec.percent2,
1973         l_act_metrics_rec.percent3,
1974         l_act_metrics_rec.published_flag,
1975         l_act_metrics_rec.pre_function_name,
1976         l_act_metrics_rec.post_function_name,
1977         l_act_metrics_rec.attribute1,
1978         l_act_metrics_rec.attribute2,
1979         l_act_metrics_rec.attribute3,
1980         l_act_metrics_rec.attribute4,
1981         l_act_metrics_rec.attribute5,
1982         l_act_metrics_rec.attribute6,
1983         l_act_metrics_rec.attribute7,
1984         l_act_metrics_rec.attribute8,
1985         l_act_metrics_rec.attribute9,
1986         l_act_metrics_rec.attribute10,
1987         l_act_metrics_rec.attribute11,
1988         l_act_metrics_rec.attribute12,
1989         l_act_metrics_rec.attribute13,
1990         l_act_metrics_rec.attribute14,
1991         l_act_metrics_rec.attribute15,
1992         l_act_metrics_rec.description,
1993         l_act_metrics_rec.act_metric_date,
1994         l_act_metrics_rec.depend_act_metric,
1995         l_act_metrics_rec.function_used_by_id,
1996         l_act_metrics_rec.arc_function_used_by,
1997         /* 05/15/2002 yzhao: 11.5.9 add 6 new columns for top-down bottom-up budgeting */
1998         l_act_metrics_rec.hierarchy_type,
1999         l_act_metrics_rec.status_code,
2000         l_act_metrics_rec.method_code,
2001         l_act_metrics_rec.action_code,
2002         l_act_metrics_rec.basis_year,
2003         l_act_metrics_rec.ex_start_node
2004         /* 05/15/2002 yzhao: add ends */
2005      );
2006 
2007    -- huili@ 04/19/2001
2008    --OPEN c_dep_info (l_act_metrics_rec.metric_id);
2009    --FETCH c_dep_info INTO l_accrual_type, l_compute_using_function;
2010    --CLOSE c_dep_info;
2011 
2012    IF l_accrual_type IS NOT NULL
2013       AND l_accrual_type = G_VARIABLE
2014       AND l_compute_using_function IS NOT NULL THEN
2015 
2016    IF (AMS_DEBUG_HIGH_ON) THEN
2017       Ams_Utility_Pvt.Debug_Message(l_full_name||': Variable Metric id='||
2018          l_act_metrics_rec.metric_id);
2019       Ams_Utility_Pvt.Debug_Message(l_full_name||': compute_using_function='||
2020          l_compute_using_function||'.');
2021    END IF;
2022 
2023       -- Check for a multiplier metric.
2024       OPEN c_get_multiplier_metric(TO_NUMBER(l_compute_using_function),
2025           l_act_metrics_rec.arc_act_metric_used_by,
2026           l_act_metrics_rec.act_metric_used_by_id);
2027       l_depend_act_metric_id := NULL;
2028       FETCH c_get_multiplier_metric INTO l_depend_act_metric_id;
2029       CLOSE c_get_multiplier_metric;
2030 
2031       -- If a multiplier metric does not exist create one.
2032       IF l_depend_act_metric_id IS NULL THEN
2033 
2034          l_dep_act_metric_rec.depend_act_metric :=
2035             l_act_metrics_rec.activity_metric_id;
2036          l_dep_act_metric_rec.metric_id :=
2037             TO_NUMBER(l_compute_using_function);
2038          l_dep_act_metric_rec.act_metric_used_by_id :=
2039             l_act_metrics_rec.act_metric_used_by_id;
2040          l_dep_act_metric_rec.arc_act_metric_used_by :=
2041             l_act_metrics_rec.arc_act_metric_used_by;
2042          l_dep_act_metric_rec.application_id :=
2043             l_act_metrics_rec.application_id;
2044          l_dep_act_metric_rec.sensitive_data_flag :=
2045             l_act_metrics_rec.sensitive_data_flag;
2046          l_dep_act_metric_rec.budget_id :=
2047             l_act_metrics_rec.budget_id;
2048          l_dep_act_metric_rec.description :=
2049             l_act_metrics_rec.description;
2050          l_dep_act_metric_rec.dirty_flag := G_IS_DIRTY;
2051          Create_ActMetric2 (
2052             p_api_version           => p_api_version,
2053             p_init_msg_list         => p_init_msg_list,
2054             p_commit                => p_commit,
2055             p_validation_level      => p_validation_level,
2056             x_return_status         => l_return_status,
2057             x_msg_count             => x_msg_count,
2058             x_msg_data              => x_msg_data,
2059             p_act_metric_rec        => l_dep_act_metric_rec,
2060             x_activity_metric_id    => l_dep_act_met_id);
2061          -- If any errors happen abort API.
2062          IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2063             RAISE Fnd_Api.G_EXC_ERROR;
2064          ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2065             RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2066          END IF;
2067 
2068 --   dmvincen 02/10/2004: no longer useful.
2069 --      UPDATE ams_act_metrics_all
2070 --      SET depend_act_metric = l_dep_act_met_id
2071 --      WHERE activity_metric_id = l_act_metrics_rec.activity_metric_id;
2072       END IF;
2073    END IF;
2074    -- finish addition
2075 
2076   -- Record this record in history table.
2077   Record_History(l_act_metrics_rec.activity_metric_id, G_CREATE,
2078                  l_return_status, x_msg_count, x_msg_data);
2079 
2083     Make_ActMetric_Dirty(l_act_metrics_rec.activity_metric_id);
2080   -- update all the parent object's rollup metrics or this object's summary
2081   -- metrics dirty_flag to 'Y' -- SVEERAVE, 10/13/00
2082   IF NVL(l_act_metrics_rec.dirty_flag,G_IS_DIRTY) = G_IS_DIRTY THEN
2084   END IF;
2085 
2086 -- finish
2087 
2088    --
2089    -- Set OUT NOCOPY value.
2090    --
2091    x_activity_metric_id := l_act_metrics_rec.activity_metric_id;
2092 
2093    --
2094    -- End API Body.
2095    --
2096 
2097    --
2098    -- Standard check for commit request.
2099    --
2100    --IF Fnd_Api.To_Boolean (p_commit) THEN
2101    --   COMMIT WORK;
2102    --END IF;
2103 
2104    --
2105    -- Standard API to get message count, and if 1,
2106    -- set the message data OUT NOCOPY variable.
2107    --
2108    --Fnd_Msg_Pub.Count_And_Get (
2109    --   p_count           =>    x_msg_count,
2110    --   p_data            =>    x_msg_data,
2111    --   p_encoded         =>    Fnd_Api.G_FALSE
2112    --);
2113 
2114       --
2115    -- Add success message to message list.
2116    --
2117    IF (AMS_DEBUG_HIGH_ON) THEN
2118       Ams_Utility_Pvt.debug_message(l_full_name ||': end Success');
2119    END IF;
2120 
2121 /*
2122 EXCEPTION
2123    WHEN Fnd_Api.G_EXC_ERROR THEN
2124       ROLLBACK TO Create_ActMetric2_pvt;
2125       --ROLLBACK;
2126       x_return_status := Fnd_Api.G_RET_STS_ERROR;
2127       Fnd_Msg_Pub.Count_And_Get (
2128          p_count         =>     x_msg_count,
2129          p_data          =>     x_msg_data,
2130          p_encoded         =>   FND_API.G_FALSE
2131       );
2132    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2133       ROLLBACK TO Create_ActMetric2_pvt;
2134       --ROLLBACK;
2135       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2136       Fnd_Msg_Pub.Count_And_Get (
2137          p_count         =>     x_msg_count,
2138          p_data          =>     x_msg_data,
2139          p_encoded         =>   FND_API.G_FALSE
2140       );
2141    WHEN OTHERS THEN
2142       ROLLBACK TO Create_ActMetric2_pvt;
2143       --ROLLBACK;
2144       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2145       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2146          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
2147       END IF;
2148       Fnd_Msg_Pub.Count_And_Get (
2149          p_count         =>     x_msg_count,
2150          p_data          =>     x_msg_data,
2151          p_encoded       =>   FND_API.G_FALSE
2152       );
2153 */
2154 END Create_ActMetric2;
2155 
2156 -- Start of comments
2157 -- NAME
2158 --    Update_ActMetric
2159 --
2160 -- PURPOSE
2161 --   Updates a metric in AMS_ACT_METRICS_ALL given the
2162 --   record for the metrics.
2163 --
2164 -- NOTES
2165 --
2166 -- HISTORY
2167 -- 05/26/1999   choang         Created.
2168 -- 10/9/1999    ptendulk       Modified According to new Standards
2169 -- 17-Apr-2000  tdonohoe       Added new columns to Update statement to
2170 --                             support 11.5.2 release.
2171 -- 08/24/2000    sveerave@us  Included call-out for check_freeze_status at
2172 --                            beginning.
2173 -- 05/07/2001   huili@        Added invalidating corresponding variable metrics
2174 -- End of comments
2175 
2176 
2177 
2178 
2179 PROCEDURE Update_ActMetric (
2180    p_api_version                IN  NUMBER,
2181    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
2182    p_commit                     IN  VARCHAR2 := Fnd_Api.G_FALSE,
2183    p_validation_level           IN  NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
2184 
2185    x_return_status              OUT NOCOPY VARCHAR2,
2186    x_msg_count                  OUT NOCOPY NUMBER,
2187    x_msg_data                   OUT NOCOPY VARCHAR2,
2188    p_act_metric_rec             IN  act_metric_rec_type
2189 )
2190 IS
2191    L_API_VERSION    CONSTANT NUMBER := 1.0;
2192    L_API_NAME       CONSTANT VARCHAR2(30) := 'UPDATE_ACTMETRIC';
2193    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2194 
2195    l_return_status   VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
2196    l_actmet_rec act_metric_rec_type := p_act_metric_rec;
2197    l_freeze_status   VARCHAR2(1) := Fnd_Api.G_FALSE;
2198    l_reprocess_rec   VARCHAR2(1) := Fnd_Api.G_FALSE;
2199 
2200    -- huili@ added to invalidate corresponding activity variable metrics
2201    l_depend_act_metric NUMBER;
2202    CURSOR c_check_var_met (l_activity_metric_id NUMBER) IS
2203       SELECT depend_act_metric
2204       FROM ams_act_metrics_all a, ams_metrics_all_b b
2205       WHERE activity_metric_id = l_activity_metric_id
2206       AND a.metric_id = b.metric_id
2207       AND b.accrual_type <> G_VARIABLE;
2208    -- end
2209 
2210 --    CURSOR c_get_calc_type (l_metric_id NUMBER) IS
2211 --                 SELECT metric_calculation_type
2212 --                   FROM ams_metrics_all_b
2213 --                  WHERE metric_id = l_metric_id;
2214    l_calc_type VARCHAR2(10);
2215    l_cost_table OZF_Fund_Adjustment_Pvt.cost_tbl_type;
2216    l_cost_rec OZF_Fund_Adjustment_Pvt.cost_rec_type;
2217 
2218 BEGIN
2219 
2220 
2221 
2222    IF (AMS_DEBUG_HIGH_ON) THEN
2223 
2227    --
2224    Ams_Utility_Pvt.debug_message('Now updating act met id: '||p_act_metric_rec.activity_metric_id);
2225 
2226    END IF;
2228    -- Initialize savepoint.
2229    --
2230    SAVEPOINT Update_ActMetric_pvt;
2231    --
2232    -- Output debug message.
2233    --
2234    IF (AMS_DEBUG_HIGH_ON) THEN
2235    Ams_Utility_Pvt.debug_message(l_full_name||': start');
2236    END IF;
2237    --
2238    -- Initialize message list if p_init_msg_list is set to TRUE.
2239    --
2240    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
2241       Fnd_Msg_Pub.Initialize;
2242    END IF;
2243 
2244    --
2245    -- Standard check for API version compatibility.
2246    --
2247    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
2248                                        p_api_version,
2249                                        L_API_NAME,
2250                                        G_PKG_NAME)
2251    THEN
2252       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2253    END IF;
2254 
2255    --
2256    -- Initialize API return status to success.
2257    --
2258    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2259 
2260    --
2261    -- Begin API Body
2262    --
2263    -- Debug Message
2264 
2265    IF (AMS_DEBUG_HIGH_ON) THEN
2266       Ams_Utility_Pvt.debug_message(l_full_name ||': validate');
2267    END IF;
2268 
2269    -- BUG4391308: Added locking to prevent overwriting.
2270    Lock_ActMetric ( 1.0, fnd_api.G_FALSE,
2271              l_return_status, x_msg_count, x_msg_data,
2272              l_actmet_rec.activity_metric_id,
2273              l_actmet_rec.object_version_number);
2274 
2275    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2276       RAISE Fnd_Api.G_EXC_ERROR;
2277    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2278       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2279    END IF;
2280    -- BUG4391308: End
2281 
2282    -- replace g_miss_char/num/date with current column values
2283    Complete_ActMetric_Rec(p_act_metric_rec, l_actmet_rec);
2284 
2285 
2286    IF (AMS_DEBUG_HIGH_ON) THEN
2287       Ams_Utility_Pvt.debug_message(l_full_name ||': select calc type, metric_id ='||l_actmet_rec.metric_id);
2288    END IF;
2289 
2290    SELECT metric_calculation_type
2291      INTO l_calc_type
2292      FROM ams_metrics_all_b
2293     WHERE metric_id = l_actmet_rec.metric_id;
2294 
2295    -- Data entegrity check.
2296    IF l_calc_type IN ('SUMMARY', 'ROLLUP','FORMULA') THEN
2297       l_actmet_rec.published_flag := NULL;
2298    ELSIF l_actmet_rec.published_flag NOT IN ('Y', 'N', 'T') THEN
2299       l_actmet_rec.published_flag := 'N';
2300    END IF;
2301 
2302    -- DMVINCEN 06/05/2001: If value is posted to budget do not update.
2303    IF l_actmet_rec.published_flag = 'Y' THEN
2304       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2305          l_actmet_rec.trans_actual_value := Fnd_Api.G_MISS_NUM;
2306          l_actmet_rec.func_actual_value := Fnd_Api.G_MISS_NUM;
2307          l_reprocess_rec := Fnd_Api.G_TRUE;
2308       END IF;
2309    END IF;
2310 
2311    IF l_reprocess_rec = Fnd_Api.G_TRUE THEN
2312       Complete_ActMetric_Rec(l_actmet_rec, l_actmet_rec);
2313    END IF;
2314 
2315    -- Do Currency Conversion
2316    Default_ActMetric(
2317          p_init_msg_list       => p_init_msg_list,
2318         -- p_act_metric_rec      => l_actmet_rec,
2319          p_validation_mode     => Jtf_Plsql_Api.G_UPDATE,
2320          x_complete_rec        => l_actmet_rec,
2321          x_return_status       => l_return_status,
2322          x_msg_count           => x_msg_count,
2323          x_msg_data            => x_msg_data  ) ;
2324    -- If any errors happen abort API.
2325    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2326       RAISE Fnd_Api.G_EXC_ERROR;
2327    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2328       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2329    END IF;
2330 
2331    IF p_validation_level >= Jtf_Plsql_Api.g_valid_level_item THEN
2332       Validate_ActMetric_items(
2333          p_act_metric_rec  => l_actmet_rec,
2334          p_validation_mode => Jtf_Plsql_Api.g_update,
2335          x_return_status   => l_return_status
2336       );
2337       IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2338          RAISE Fnd_Api.g_exc_unexpected_error;
2339       ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
2340          RAISE Fnd_Api.g_exc_error;
2341       END IF;
2342    END IF;
2343 
2344 
2345    -- replace g_miss_char/num/date with current column values
2346    --Complete_ActMetric_Rec(l_actmet_rec, l_actmet_rec);
2347 
2348    IF p_validation_level >= Jtf_Plsql_Api.g_valid_level_record THEN
2349 
2350      Validate_ActMetric_Record(
2351          p_act_metric_rec  => l_actmet_rec,
2352          p_complete_rec    => l_actmet_rec,
2353          p_operation_mode  => G_UPDATE,
2354          x_return_status   => l_return_status
2355       );
2356       IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2357          RAISE Fnd_Api.g_exc_unexpected_error;
2358       ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
2359          RAISE Fnd_Api.g_exc_error;
2360       END IF;
2361    END IF;
2362 
2363    -- Post a new cost item to the budget.
2364    IF l_actmet_rec.published_flag = 'T' THEN
2365       l_return_status := FND_API.G_RET_STS_SUCCESS;
2366       l_actmet_rec.published_flag := 'Y';
2370       l_cost_rec.cost_curr := l_actmet_rec.transaction_currency_code;
2367       l_cost_rec.cost_id := l_actmet_rec.activity_metric_id;
2368       l_cost_rec.cost_amount := l_actmet_rec.trans_actual_value;
2369       l_cost_rec.cost_desc := '';
2371       l_cost_table(1) := l_cost_rec;
2372       OZF_Fund_Adjustment_Pvt.create_budget_amt_utilized(
2373          p_budget_used_by_id   => l_actmet_rec.act_metric_used_by_id,
2374          p_budget_used_by_type => l_actmet_rec.arc_act_metric_used_by,
2375          p_currency            => l_actmet_rec.transaction_currency_code,
2376          p_cost_tbl            => l_cost_table,
2377          p_api_version         => l_api_version,
2378          x_return_status       => l_return_status,
2379          x_msg_count           => x_msg_count,
2380          x_msg_data            => x_msg_data);
2381       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2382          -- BUG2486379: Display budget utilization errors.
2383          -- Fnd_Msg_Pub.Initialize;
2384          Fnd_Message.set_name('AMS', 'AMS_MET_NO_POST');
2385          Fnd_Msg_Pub.ADD;
2386          --IF (AMS_DEBUG_HIGH_ON) THEN
2387          --   Ams_Utility_Pvt.debug_message('You can not post this cost!');
2388          --END IF;
2389       END IF;
2390       IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2391          RAISE Fnd_Api.g_exc_unexpected_error;
2392       ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
2393          RAISE Fnd_Api.g_exc_error;
2394       END IF;
2395    END IF;
2396 
2397    IF (AMS_DEBUG_HIGH_ON) THEN
2398      Ams_Utility_Pvt.debug_message(l_full_name ||': update Activity Metrics Table');
2399    END IF;
2400 
2401    -- Update AMS_ACT_METRICS_ALL
2402    UPDATE ams_act_metrics_all
2403       SET object_version_number= object_version_number + 1,
2404           act_metric_used_by_id    = l_actmet_rec.act_metric_used_by_id,
2405           arc_act_metric_used_by   = l_actmet_rec.arc_act_metric_used_by,
2406           purchase_req_raised_flag = l_actmet_rec.purchase_req_raised_flag,
2407           application_id           = l_actmet_rec.application_id,
2408           sensitive_data_flag      = l_actmet_rec.sensitive_data_flag,
2409           budget_id                = l_actmet_rec.budget_id ,
2410           metric_id                = l_actmet_rec.metric_id,
2411           transaction_currency_code= l_actmet_rec.transaction_currency_code,
2412           trans_forecasted_value   = l_actmet_rec.trans_forecasted_value,
2413           trans_committed_value    = l_actmet_rec.trans_committed_value,
2414           trans_actual_value       = l_actmet_rec.trans_actual_value,
2415           functional_currency_code = l_actmet_rec.functional_currency_code,
2416           func_forecasted_value    = l_actmet_rec.func_forecasted_value,
2417           func_committed_value     = l_actmet_rec.func_committed_value,
2418           func_actual_value        = l_actmet_rec.func_actual_value,
2419           dirty_flag               = l_actmet_rec.dirty_flag,
2420           last_calculated_date     = l_actmet_rec.last_calculated_date,
2421           variable_value           = l_actmet_rec.variable_value,
2422           forecasted_variable_value= l_actmet_rec.forecasted_variable_value,
2423           computed_using_function_value =
2424                      l_actmet_rec.computed_using_function_value,
2425           metric_uom_code          = l_actmet_rec.metric_uom_code,
2426           difference_since_last_calc = l_actmet_rec.difference_since_last_calc,
2427           activity_metric_origin_id= l_actmet_rec.activity_metric_origin_id,
2428           arc_activity_metric_origin = l_actmet_rec.arc_activity_metric_origin,
2429           hierarchy_id             = l_actmet_rec.hierarchy_id,
2430           start_node               = l_actmet_rec.start_node,
2431           from_level               = l_actmet_rec.from_level,
2432           to_level                 = l_actmet_rec.to_level,
2433           from_date                = l_actmet_rec.from_date,
2434           TO_DATE                  = l_actmet_rec.TO_DATE,
2435           amount1                  = l_actmet_rec.amount1,
2436           amount2                  = l_actmet_rec.amount2,
2437           amount3                  = l_actmet_rec.amount3,
2438           percent1                 = l_actmet_rec.percent1,
2439           percent2                 = l_actmet_rec.percent2,
2440           percent3                 = l_actmet_rec.percent3,
2441           published_flag           = l_actmet_rec.published_flag,
2442           pre_function_name        = l_actmet_rec.pre_function_name,
2443           post_function_name       = l_actmet_rec.post_function_name,
2444           last_update_date         = SYSDATE,
2445           last_updated_by          = Fnd_Global.User_ID,
2446           last_update_login        = Fnd_Global.Conc_Login_ID,
2447           attribute_category       = l_actmet_rec.attribute_category,
2448           attribute1               = l_actmet_rec.attribute1,
2449           attribute2               = l_actmet_rec.attribute2,
2450           attribute3               = l_actmet_rec.attribute3,
2451           attribute4               = l_actmet_rec.attribute4,
2452           attribute5               = l_actmet_rec.attribute5,
2453           attribute6               = l_actmet_rec.attribute6,
2454           attribute7               = l_actmet_rec.attribute7,
2455           attribute8               = l_actmet_rec.attribute8,
2456           attribute9               = l_actmet_rec.attribute9,
2457           attribute10              = l_actmet_rec.attribute10,
2458           attribute11              = l_actmet_rec.attribute11,
2459           attribute12              = l_actmet_rec.attribute12,
2460           attribute13              = l_actmet_rec.attribute13,
2464           act_metric_date          = l_actmet_rec.act_metric_date,
2461           attribute14              = l_actmet_rec.attribute14,
2462           attribute15              = l_actmet_rec.attribute15,
2463           description              = l_actmet_rec.description,
2465           depend_act_metric        = l_actmet_rec.depend_act_metric,
2466           function_used_by_id      = l_actmet_rec.function_used_by_id,
2467           arc_function_used_by     = l_actmet_rec.arc_function_used_by,
2468           /* 05/15/2002 yzhao: 11.5.9 add 6 new columns for top-down bottom-up budgeting */
2469           hierarchy_type           = l_actmet_rec.hierarchy_type,
2470           status_code              = l_actmet_rec.status_code,
2471           method_code              = l_actmet_rec.method_code,
2472           action_code              = l_actmet_rec.action_code,
2473           basis_year               = l_actmet_rec.basis_year,
2474           ex_start_node            = l_actmet_rec.ex_start_node
2475           /* 05/15/2002 yzhao: add ends */
2476       WHERE activity_metric_id = l_actmet_rec.activity_metric_id;
2477 
2478    IF  (SQL%NOTFOUND)
2479    THEN
2480       --
2481       -- Add error message to API message list.
2482       --
2483       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2484          Fnd_Message.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
2485          Fnd_Msg_Pub.ADD;
2486       END IF;
2487       RAISE Fnd_Api.g_exc_error;
2488    END IF;
2489 
2490    -- huili@ added to invalidate the corresponding variable activity metrics
2491    OPEN c_check_var_met (l_actmet_rec.activity_metric_id);
2492    FETCH c_check_var_met INTO l_depend_act_metric;
2493    IF c_check_var_met%FOUND AND l_depend_act_metric IS NOT NULL THEN
2494       UPDATE ams_act_metrics_all
2495       SET dirty_flag = G_IS_DIRTY
2496       WHERE activity_metric_id = l_depend_act_metric;
2497 
2498       IF  (SQL%NOTFOUND) THEN
2499          --
2500          -- Add error message to API message list.
2501          --
2502          IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2503             Fnd_Message.set_name('AMS', 'AMS_API_VARREC_NOT_FOUND');
2504             Fnd_Msg_Pub.ADD;
2505          END IF;
2506          RAISE Fnd_Api.g_exc_error;
2507       END IF;
2508    END IF;
2509    CLOSE c_check_var_met;
2510    --END
2511 
2512    -- Record any change in the history table.
2513    Record_History(l_actmet_rec.activity_metric_id, G_UPDATE,
2514                  x_return_status, x_msg_count, x_msg_data);
2515 
2516   -- update all the parent object's rollup metrics or this object's
2517   -- summary metrics dirty_flag to 'Y' -- SVEERAVE, 10/13/00
2518   IF NVL(l_actmet_rec.dirty_flag,G_IS_DIRTY) = G_IS_DIRTY THEN
2519     Make_ActMetric_Dirty(l_actmet_rec.activity_metric_id);
2520   END IF;
2521    --
2522    -- End API Body
2523    --
2524 
2525    IF Fnd_Api.to_boolean(p_commit) THEN
2526       COMMIT;
2527    END IF;
2528 
2529    --
2530    -- Standard API to get message count, and if 1,
2531    -- set the message data OUT variable.
2532    --
2533    Fnd_Msg_Pub.Count_And_Get (
2534       p_count           =>    x_msg_count,
2535       p_data            =>    x_msg_data,
2536       p_encoded         =>    Fnd_Api.G_FALSE
2537    );
2538 
2539    --
2540    -- Debug message.
2541    --
2542    IF (AMS_DEBUG_HIGH_ON) THEN
2543       Ams_Utility_Pvt.debug_message(l_full_name ||': end');
2544    END IF;
2545 
2546 
2547 EXCEPTION
2548    WHEN Fnd_Api.G_EXC_ERROR THEN
2549       ROLLBACK TO Update_ActMetric_pvt;
2550       x_return_status := Fnd_Api.G_RET_STS_ERROR;
2551       Fnd_Msg_Pub.Count_And_Get (
2552          p_count         =>     x_msg_count,
2553          p_data          =>     x_msg_data,
2554          p_encoded       =>     FND_API.G_FALSE
2555       );
2556    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2557       ROLLBACK TO Update_ActMetric_pvt;
2558       x_return_status := Fnd_Api.G_RET_STS_UNEXP_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 OTHERS THEN
2565       ROLLBACK TO Update_ActMetric_pvt;
2566       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2567       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2568          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
2569       END IF;
2570       Fnd_Msg_Pub.Count_And_Get (
2571          p_count         =>     x_msg_count,
2572          p_data          =>     x_msg_data,
2573          p_encoded       =>   FND_API.G_FALSE
2574       );
2575 END Update_ActMetric;
2576 
2577 -- Start of comments
2578 -- NAME
2579 --    Delete_ActMetric
2580 --
2581 -- PURPOSE
2582 --    Deletes the association of a metric to a business
2583 --    object by creating a record in AMS_ACT_METRICS_ALL.
2584 --
2585 -- NOTES
2586 --
2587 -- HISTORY
2588 -- 05/26/1999   choang        Created.
2589 -- 10/9/1999    ptendulk      Modified according to new standards
2590 -- 08/24/2000   sveerave@us   Included call-out for check_freeze_status
2594 --                            subordinate records are nulled.
2591 --                            at beginning.
2592 -- 12/18/2001   DMVINCEN      Removed seeded data restriction.
2593 -- 04/04/2002   DMVINCEN      When rollup metrics are removed the
2595 --
2596 -- End of comments
2597 
2598 PROCEDURE Delete_ActMetric (
2599    p_api_version              IN  NUMBER,
2600    p_init_msg_list            IN  VARCHAR2 := Fnd_Api.G_FALSE,
2601    p_commit                   IN  VARCHAR2 := Fnd_Api.G_FALSE,
2602    x_return_status            OUT NOCOPY VARCHAR2,
2603    x_msg_count                OUT NOCOPY NUMBER,
2604    x_msg_data                 OUT NOCOPY VARCHAR2,
2605    p_activity_metric_id       IN  NUMBER,
2606    p_object_version_number    IN  NUMBER
2607 )
2608 IS
2609    L_API_VERSION         CONSTANT NUMBER := 1.0;
2610    L_API_NAME            CONSTANT VARCHAR2(30) := 'DELETE_ACTMETRIC';
2611    L_FULL_NAME           CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2612 
2613    l_return_status       VARCHAR2(1);
2614    l_freeze_status       VARCHAR2(1) := Fnd_Api.G_FALSE;
2615    l_act_metric_rec      act_metric_rec_type;
2616    l_child_activity_metric_id NUMBER;
2617    l_child_type          VARCHAR2(30);
2618 
2619 
2620    --sunkumar 05/30/2003 added for seting the token in error message AMS_METR_DELETE
2621    l_object_name AMS_LOOKUPS.MEANING%TYPE;
2622    -- DMVINCEN Added check for rollup children.
2623    -- DMVINCEN 04/04/2002: Retrieve the child ids and relation ships.
2624    CURSOR c_check_child_exists(l_act_metric_id NUMBER) IS
2625       SELECT activity_metric_id, 'SUMMARY'
2626       FROM ams_act_metrics_all
2627       WHERE summarize_to_metric = l_act_metric_id
2628       UNION ALL
2629       SELECT activity_metric_id, 'ROLLUP'
2630       FROM ams_act_metrics_all
2631       WHERE rollup_to_metric = l_act_metric_id;
2632 
2633    CURSOR c_actmet_details(l_act_metric_id NUMBER) IS
2634        SELECT  activity_metric_id,
2635                  last_update_date,
2636                  last_updated_by,
2637                  creation_date,
2638                  created_by,
2639                  last_update_login,
2640                  object_version_number,
2641                  act_metric_used_by_id,
2642                  arc_act_metric_used_by,
2643                  purchase_req_raised_flag,
2644                  application_id,
2645                  sensitive_data_flag,
2646                  budget_id,
2647                  metric_id,
2648                  transaction_currency_code,
2649                  trans_forecasted_value,
2650                  trans_committed_value,
2651                  trans_actual_value,
2652                  functional_currency_code,
2653                  func_forecasted_value,
2654                  dirty_flag,
2655                  func_committed_value,
2656                  func_actual_value,
2657                  last_calculated_date,
2658                  variable_value,
2659                  forecasted_variable_value,
2660                  computed_using_function_value,
2661                  metric_uom_code,
2662                  org_id,
2663                  difference_since_last_calc,
2664                  activity_metric_origin_id,
2665                  arc_activity_metric_origin,
2666                  days_since_last_refresh,
2667                  scenario_id,
2668                  SUMMARIZE_TO_METRIC,
2669                  ROLLUP_TO_METRIC,
2670                  hierarchy_id,
2671                  start_node,
2672                  from_level,
2673                  to_level,
2674                  from_date,
2675                  TO_DATE,
2676                  amount1,
2677                  amount2,
2678                  amount3,
2679                  percent1,
2680                  percent2,
2681                  percent3,
2682                  published_flag,
2683                  pre_function_name ,
2684                  post_function_name,
2685                  attribute_category,
2686                  attribute1,
2687                  attribute2,
2688                  attribute3,
2689                  attribute4,
2690                  attribute5,
2691                  attribute6,
2692                  attribute7,
2693                  attribute8,
2694                  attribute9,
2695                  attribute10,
2696                  attribute11,
2697                  attribute12,
2698                  attribute13,
2699                  attribute14,
2700                  attribute15,
2701                  description,
2702                  act_metric_date,
2703                  depend_act_metric,
2704                  function_used_by_id,
2705                  arc_function_used_by,
2706                  /* 05/15/2002 yzhao: 11.5.9 add 6 new columns for top-down bottom-up budgeting */
2707                  hierarchy_type,
2708                  status_code,
2709                  method_code,
2710                  action_code,
2711                  basis_year,
2712                  ex_start_node
2713                  /* 05/15/2002 yzhao: add ends */
2714      FROM ams_act_metrics_all
2715      WHERE activity_metric_id = l_act_metric_id;
2716 
2717   -- huili@ added on 05/07/2001
2718   CURSOR c_depend_met_id (l_act_met_id NUMBER) IS
2719   SELECT depend_act_metric, object_version_number
2723   l_depend_act_met_id NUMBER;
2720   FROM ams_act_metrics_all
2721   WHERE activity_metric_id = l_act_met_id;
2722 
2724   l_depend_version_num NUMBER;
2725 
2726    l_dummy   NUMBER;
2727 
2728 BEGIN
2729    --
2730    -- Initialize savepoint.
2731    --
2732    SAVEPOINT Delete_ActMetric_pvt;
2733 
2734    --
2735    -- Output debug message.
2736    --
2737    IF (AMS_DEBUG_HIGH_ON) THEN
2738       Ams_Utility_Pvt.debug_message(l_full_name||': start');
2739    END IF;
2740 
2741    --
2742    -- Initialize message list if p_init_msg_list is set to TRUE.
2743    --
2744    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
2745       Fnd_Msg_Pub.Initialize;
2746    END IF;
2747 
2748    --
2749    -- Standard check for API version compatibility.
2750    --
2751    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
2752                                        p_api_version,
2753                                        L_API_NAME,
2754                                        G_PKG_NAME)
2755    THEN
2756       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2757    END IF;
2758 
2759 
2760    --
2761    -- Check if record is seeded.
2762    --
2763    -- DMVINCEN: There is no reason for this restriction.
2764 --    IF IsSeeded (p_activity_metric_id) THEN
2765 --       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error)
2766 --       THEN
2767 --          Fnd_Message.set_name('AMS', 'AMS_METR_SEEDED_METR');
2768 --          Fnd_Msg_Pub.ADD;
2769 --       END IF;
2770 --
2771 --       RAISE Fnd_Api.G_EXC_ERROR;
2772 --    END IF;
2773 
2774 
2775    --
2776    -- Initialize API return status to success.
2777    --
2778    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2779 
2780    --
2781    -- Begin API Body.
2782    --
2783    -- Following part is added by sveerave on 11/15/00 for fix of bug 1500023
2784    --
2785    -- Check if childs exist. If exists then prevent deletion
2786    -- DMVINCEN 04/04/2002: Allow rollup metrics to be deleted by removing
2787    -- the reference from the child metric.
2788    --
2789    OPEN c_check_child_exists(p_activity_metric_id);
2790    LOOP
2791       FETCH c_check_child_exists
2792          INTO l_child_activity_metric_id, l_child_type;
2793       EXIT WHEN c_check_child_exists%NOTFOUND;
2794       EXIT WHEN l_child_type = 'SUMMARY';
2795       UPDATE ams_act_metrics_all
2796          SET rollup_to_metric = NULL
2797          WHERE activity_metric_id = l_child_activity_metric_id;
2798    END LOOP;
2799    CLOSE c_check_child_exists;
2800 
2801    IF l_child_type = 'SUMMARY' THEN
2802       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2803          Fnd_Message.set_name('AMS', 'AMS_METR_CANT_DELETE_PARENT');
2804          Fnd_Msg_Pub.ADD;
2805       END IF;
2806       RAISE Fnd_Api.g_exc_error;
2807    END IF;
2808    -- end for the bug fix, sveerave.
2809 
2810    -- Get all the details of the activity metric record for passing to
2811         -- freeze validation.
2812    OPEN  c_actmet_details(p_activity_metric_id);
2813    FETCH c_actmet_details INTO l_act_metric_rec;
2814    IF (c_actmet_details%NOTFOUND) THEN
2815       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2816          Fnd_Message.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
2817          Fnd_Msg_Pub.ADD;
2818       END IF;
2819       RAISE Fnd_Api.g_exc_error;
2820    END IF;
2821 
2822    CLOSE c_actmet_details;
2823 
2824    -- Make a call-out to check the frozen status.
2825         -- If it is frozen, disallow the operation.
2826    Check_Freeze_Status (l_act_metric_rec,
2827                         G_DELETE, -- Delete is operation mode
2828                         l_freeze_status,
2829                         l_return_status);
2830 
2831     IF (l_freeze_status = Fnd_Api.G_TRUE)  THEN
2832              -- frozen to create the record
2833       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2834        -- sunkumar 04/30/2003 added message for delete status of objects depending on status (ACTIVE, CANCELLED, COMPLETED)
2835     l_object_name := ams_utility_pvt.get_lookup_meaning(
2836              'AMS_SYS_ARC_QUALIFIER',l_act_metric_rec.arc_act_metric_used_by);
2837     Fnd_Message.Set_Name('AMS', 'AMS_METR_DELETE');
2838          Fnd_Message.set_token('OBJECT', l_object_name);
2839          Fnd_Msg_Pub.ADD;
2840       END IF;
2841       l_return_status := Fnd_Api.G_RET_STS_ERROR;
2842    END IF;
2843 
2844 
2845    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2846       RAISE Fnd_Api.G_EXC_ERROR;
2847    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2848       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2849    END IF;
2850 
2851 
2852 
2853    IF (l_freeze_status = Fnd_Api.G_TRUE)  THEN
2854           -- frozen to create the record
2855       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
2856          Fnd_Message.Set_Name('AMS', 'AMS_METR_FROZEN');
2857          Fnd_Msg_Pub.ADD;
2858       END IF;
2859       l_return_status := Fnd_Api.G_RET_STS_ERROR;
2860    END IF;
2861 
2862    -- If it is frozen, or any errors happen abort API.
2863    IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2864       RAISE Fnd_Api.G_EXC_ERROR;
2865    ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2869    -- If the actual value has been posted to the budget do not delete.
2866       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2867    END IF;
2868 
2870    IF l_act_metric_rec.published_flag = 'Y' THEN
2871       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2872          Fnd_Message.SET_NAME('AMS', 'AMS_METR_PUBLISHED');
2873          Fnd_Msg_Pub.ADD;
2874       END IF;
2875       RAISE Fnd_Api.g_exc_error;
2876    END IF;
2877 
2878    -- Debug message.
2879    IF (AMS_DEBUG_HIGH_ON) THEN
2880       Ams_Utility_Pvt.debug_message(l_full_name ||': delete with Validation');
2881    END IF;
2882 
2883    -- huili added on 05/07/2001 to check dependent activity metrics
2884         l_depend_act_met_id := NULL;
2885         l_depend_version_num := NULL;
2886    OPEN c_depend_met_id (p_activity_metric_id);
2887    FETCH c_depend_met_id INTO l_depend_act_met_id, l_depend_version_num;
2888    CLOSE c_depend_met_id;
2889 
2890    -- Record any change in the history table.
2891    Record_History(p_activity_metric_id, G_DELETE,
2892                  x_return_status, x_msg_count, x_msg_data);
2893 
2894    DELETE FROM ams_act_metrics_all
2895     WHERE activity_metric_id = p_activity_metric_id
2896       AND object_version_number = p_object_version_number;
2897 
2898    IF SQL%NOTFOUND THEN
2899       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2900          Fnd_Message.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
2901          Fnd_Msg_Pub.ADD;
2902       END IF;
2903       RAISE Fnd_Api.g_exc_error;
2904    END IF;
2905 
2906    -- DMVINCEN 04/30/2001 Parent metrics need to be re-evaluated
2907    Make_ActMetric_Dirty(l_act_metric_rec.rollup_to_metric);
2908    Make_ActMetric_Dirty(l_act_metric_rec.summarize_to_metric);
2909 
2910    IF l_depend_act_met_id IS NOT NULL THEN
2911 
2912       UPDATE ams_act_metrics_all
2913          SET depend_act_metric = NULL
2914          WHERE activity_metric_id = l_depend_act_met_id;
2915 
2916       Delete_ActMetric (
2917          p_api_version              => p_api_version,
2918          p_init_msg_list            => Fnd_Api.G_FALSE,
2919          p_commit                   => Fnd_Api.G_FALSE,
2920          x_return_status            => x_return_status,
2921          x_msg_count                => x_msg_count,
2922          x_msg_data                 => x_msg_data,
2923          p_activity_metric_id       => l_depend_act_met_id,
2924          p_object_version_number    => l_depend_version_num);
2925 
2926       IF x_return_status = Fnd_Api.G_RET_STS_ERROR THEN
2927          RAISE Fnd_Api.G_EXC_ERROR;
2928       ELSIF x_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
2929          RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2930       END IF;
2931    END IF;
2932 
2933    -- end
2934 
2935    --
2936    -- End API Body.
2937    --
2938 
2939    IF Fnd_Api.To_Boolean (p_commit) THEN
2940       COMMIT WORK;
2941    END IF;
2942 
2943    --
2944    -- Debug message.
2945    --
2946    IF (AMS_DEBUG_HIGH_ON) THEN
2947       Ams_Utility_Pvt.debug_message(l_full_name ||': End');
2948    END IF;
2949 
2950    --
2951    -- Standard API to get message count, and if 1,
2952    -- set the message data OUT NOCOPY variable.
2953    --
2954    Fnd_Msg_Pub.Count_And_Get (
2955       p_count           =>    x_msg_count,
2956       p_data            =>    x_msg_data,
2957       p_encoded         =>    Fnd_Api.G_FALSE
2958    );
2959 
2960 EXCEPTION
2961    WHEN Fnd_Api.G_EXC_ERROR THEN
2962       ROLLBACK TO Delete_ActMetric_pvt;
2963       x_return_status := Fnd_Api.G_RET_STS_ERROR;
2964       Fnd_Msg_Pub.Count_And_Get (
2965          p_count         =>     x_msg_count,
2966          p_data          =>     x_msg_data,
2967          p_encoded       =>   FND_API.G_FALSE
2968       );
2969    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
2970       ROLLBACK TO Delete_ActMetric_pvt;
2971       x_return_status := Fnd_Api.G_RET_STS_UNEXP_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 OTHERS THEN
2978       ROLLBACK TO Delete_ActMetric_pvt;
2979       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2980       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2981          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
2982       END IF;
2983       Fnd_Msg_Pub.Count_And_Get (
2984          p_count         =>     x_msg_count,
2985          p_data          =>     x_msg_data,
2986          p_encoded       =>   FND_API.G_FALSE
2987       );
2988 END Delete_ActMetric;
2989 
2990 -- Start of comments
2991 -- NAME
2992 --    Delete_ActMetric
2993 --
2994 -- PURPOSE
2995 --    Recursively delete metrics associated to a business object.
2996 --    If the activity metric id and object version number are null,
2997 --    then all metrics associated with that object are removed.
2998 --    If the activity metric id and object version number are not null,
2999 --    then that activity metric and all subordinate metrics are removed.
3000 --    Only activity metrics at the given object level are removed.
3001 --    The preceding Delete_ActMetric is called for the actual delete.
3002 --
3003 -- NOTES
3004 --
3008 -- End of comments
3005 -- HISTORY
3006 -- 04/02/2002   DMVINCEN      Created
3007 --
3009 
3010 PROCEDURE Delete_ActMetric (
3011    p_api_version              IN  NUMBER,
3012    p_init_msg_list            IN  VARCHAR2 := Fnd_Api.G_FALSE,
3013    p_commit                   IN  VARCHAR2 := Fnd_Api.G_FALSE,
3014 
3015    x_return_status            OUT NOCOPY VARCHAR2,
3016    x_msg_count                OUT NOCOPY NUMBER,
3017    x_msg_data                 OUT NOCOPY VARCHAR2,
3018 
3019    p_arc_act_metric_used_by   IN  VARCHAR2,
3020    p_act_metric_used_by_id    IN  NUMBER,
3021    p_activity_metric_id       IN  NUMBER := NULL,
3022    p_object_version_number    IN  NUMBER := NULL
3023 )
3024 IS
3025    L_API_VERSION         CONSTANT NUMBER := 1.0;
3026    L_API_NAME            CONSTANT VARCHAR2(30) := 'DELETE_ACTMETRIC';
3027    L_FULL_NAME           CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
3028 
3029    l_return_status       VARCHAR2(1);
3030    l_activity_metric_id  NUMBER;
3031    l_object_version_number  NUMBER;
3032    l_activity_metric_ids number_table;
3033    l_object_version_numbers number_table;
3034 
3035    CURSOR c_get_top_level_act_metrics(l_arc_act_metric_used_by VARCHAR2,
3036          l_act_metric_used_by_id NUMBER)
3037      IS
3038      SELECT activity_metric_id, object_version_number
3039      FROM ams_act_metrics_all
3040      WHERE summarize_to_metric is NULL
3041      AND arc_act_metric_used_by = l_arc_act_metric_used_by
3042      AND act_metric_used_by_id = l_act_metric_used_by_id;
3043 
3044    CURSOR c_get_next_level_act_metrics(l_arc_act_metric_used_by VARCHAR2,
3045          l_act_metric_used_by_id NUMBER,
3046          l_activity_metric_id NUMBER)
3047      IS
3048      SELECT activity_metric_id, object_version_number
3049      FROM ams_act_metrics_all
3050      WHERE summarize_to_metric = l_activity_metric_id
3051      AND arc_act_metric_used_by = l_arc_act_metric_used_by
3052      AND act_metric_used_by_id = l_act_metric_used_by_id;
3053 
3054 BEGIN
3055    --
3056    -- Initialize savepoint.
3057    --
3058 --   SAVEPOINT Delete_ActMetric_By_Object_pvt;
3059 
3060    --
3061    -- Output debug message.
3062    --
3063    IF (AMS_DEBUG_HIGH_ON) THEN
3064       Ams_Utility_Pvt.debug_message(l_full_name||': start');
3065    END IF;
3066 
3067    --
3068    -- Initialize message list if p_init_msg_list is set to TRUE.
3069    --
3070    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
3071       Fnd_Msg_Pub.Initialize;
3072    END IF;
3073 
3074    --
3075    -- Standard check for API version compatibility.
3076    --
3077    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
3078                                        p_api_version,
3079                                        L_API_NAME,
3080                                        G_PKG_NAME)
3081    THEN
3082       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3083    END IF;
3084 
3085    --
3086    -- Initialize API return status to success.
3087    --
3088    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3089 
3090    --
3091    -- Begin API Body.
3092    --
3093 
3094    IF p_activity_metric_id IS NULL AND
3095       p_object_version_number IS NULL THEN
3096 
3097       -- Find all activity metrics from the top down.
3098       OPEN c_get_top_level_act_metrics(
3099           p_arc_act_metric_used_by,
3100           p_act_metric_used_by_id);
3101       FETCH c_get_top_level_act_metrics
3102          BULK COLLECT INTO l_activity_metric_ids, l_object_version_numbers;
3103       CLOSE c_get_top_level_act_metrics;
3104 
3105       IF l_activity_metric_ids.COUNT > 0 THEN
3106          FOR l_index IN l_activity_metric_ids.FIRST..l_activity_metric_ids.LAST
3107          LOOP
3108             -- Recursively delete the next level down.
3109             Delete_actmetric(
3110                p_api_version => p_api_version,
3111                p_init_msg_list   => Fnd_Api.G_FALSE,
3112                p_commit          => Fnd_Api.G_FALSE,
3113                x_return_status => l_return_status,
3114                x_msg_count => x_msg_count,
3115                x_msg_data => x_msg_data,
3116                p_arc_act_metric_used_by => p_arc_act_metric_used_by,
3117                p_act_metric_used_by_id => p_act_metric_used_by_id,
3118                p_activity_metric_id => l_activity_metric_ids(l_index),
3119                p_object_version_number => l_object_version_numbers(l_index));
3120 
3121             IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
3122                RAISE Fnd_Api.G_EXC_ERROR;
3123             ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
3124                RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3125             END IF;
3126 
3127          END LOOP;
3128       END IF;
3129 
3130    ELSIF p_object_version_number IS NOT NULL AND
3131          p_activity_metric_id IS NOT NULL THEN
3132 
3133       -- Find all the activity metrics below the current.
3134       OPEN c_get_next_level_act_metrics(p_arc_act_metric_used_by,
3135          p_act_metric_used_by_id, p_activity_metric_id);
3136       FETCH c_get_next_level_act_metrics
3137          BULK COLLECT INTO l_activity_metric_ids, l_object_version_numbers;
3138       CLOSE c_get_next_level_act_metrics;
3139 
3143 
3140       IF l_activity_metric_ids.COUNT > 0 THEN
3141          FOR l_index IN l_activity_metric_ids.FIRST..l_activity_metric_ids.LAST
3142          LOOP
3144             -- Recursively delete the next level down.
3145             Delete_actmetric(
3146                p_api_version => p_api_version,
3147                p_init_msg_list   => Fnd_Api.G_FALSE,
3148                p_commit          => Fnd_Api.G_FALSE,
3149                x_return_status => l_return_status,
3150                x_msg_count => x_msg_count,
3151                x_msg_data => x_msg_data,
3152                p_arc_act_metric_used_by => p_arc_act_metric_used_by,
3153                p_act_metric_used_by_id => p_act_metric_used_by_id,
3154                p_activity_metric_id => l_activity_metric_ids(l_index),
3155                p_object_version_number => l_object_version_numbers(l_index));
3156 
3157             IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
3158                RAISE Fnd_Api.G_EXC_ERROR;
3159             ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
3160                RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3161             END IF;
3162 
3163          END LOOP;
3164       END IF;
3165 
3166       -- Delete the top activity metric passed in.
3167       Delete_actmetric(
3168          p_api_version => p_api_version,
3169          p_init_msg_list   => Fnd_Api.G_FALSE,
3170          p_commit          => Fnd_Api.G_FALSE,
3171          x_return_status => l_return_status,
3172          x_msg_count => x_msg_count,
3173          x_msg_data => x_msg_data,
3174          p_activity_metric_id => p_activity_metric_id,
3175          p_object_version_number => p_object_version_number);
3176 
3177       IF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
3178          RAISE Fnd_Api.G_EXC_ERROR;
3179       ELSIF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
3180          RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3181       END IF;
3182 
3183    END IF;
3184 
3185    --
3186    -- End API Body.
3187    --
3188 
3189    IF Fnd_Api.To_Boolean (p_commit) THEN
3190       COMMIT WORK;
3191    END IF;
3192 
3193    --
3194    -- Debug message.
3195    --
3196    IF (AMS_DEBUG_HIGH_ON) THEN
3197       Ams_Utility_Pvt.debug_message(l_full_name ||': End');
3198    END IF;
3199 
3200    --
3201    -- Standard API to get message count, and if 1,
3202    -- set the message data OUT NOCOPY variable.
3203    --
3204    Fnd_Msg_Pub.Count_And_Get (
3205       p_count           =>    x_msg_count,
3206       p_data            =>    x_msg_data,
3207       p_encoded         =>    Fnd_Api.G_FALSE
3208    );
3209 
3210 EXCEPTION
3211    WHEN Fnd_Api.G_EXC_ERROR THEN
3212 --      ROLLBACK TO Delete_ActMetric_By_Object_pvt;
3213       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3214       Fnd_Msg_Pub.Count_And_Get (
3215          p_count         =>     x_msg_count,
3216          p_data          =>     x_msg_data,
3217          p_encoded       =>   FND_API.G_FALSE
3218       );
3219    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
3220 --      ROLLBACK TO Delete_ActMetric_By_Object_pvt;
3221       x_return_status := Fnd_Api.G_RET_STS_UNEXP_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 OTHERS THEN
3228 --      ROLLBACK TO Delete_ActMetric_By_Object_pvt;
3229       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3230       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
3231          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
3232       END IF;
3233       Fnd_Msg_Pub.Count_And_Get (
3234          p_count         =>     x_msg_count,
3235          p_data          =>     x_msg_data,
3236          p_encoded       =>   FND_API.G_FALSE
3237       );
3238 END Delete_ActMetric;
3239 
3240 
3241 -- Start of comments
3242 -- NAME
3243 --    Lock_ActMetric
3244 --
3245 -- PURPOSE
3246 --    Lock the given row in AMS_ACT_METRICS_ALL.
3247 --
3248 -- NOTES
3249 --
3250 -- HISTORY
3251 -- 05/26/1999   choang         Created.
3252 -- 10/9/1999    ptendulk       Modified according to new standards
3253 --
3254 -- End of comments
3255 
3256 PROCEDURE Lock_ActMetric (
3257    p_api_version           IN  NUMBER,
3258    p_init_msg_list         IN  VARCHAR2 := Fnd_Api.G_FALSE,
3259 
3260    x_return_status         OUT NOCOPY VARCHAR2,
3261    x_msg_count             OUT NOCOPY NUMBER,
3262    x_msg_data              OUT NOCOPY VARCHAR2,
3263 
3264    p_activity_metric_id    IN  NUMBER,
3265    p_object_version_number IN  NUMBER
3266 )
3267 IS
3268    L_API_VERSION      CONSTANT NUMBER := 1.0;
3269    L_API_NAME         CONSTANT VARCHAR2(30) := 'LOCK_ACTMETRIC';
3270    L_FULL_NAME        CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
3271 
3272    l_activity_metric_id    NUMBER;
3273    l_metrics_name          VARCHAR2(240);
3274 
3275    CURSOR c_act_metrics_info IS
3276       SELECT activity_metric_id
3277       FROM ams_act_metrics_all
3278       WHERE activity_metric_id = p_activity_metric_id
3279       AND object_version_number = p_object_version_number
3280       FOR UPDATE OF activity_metric_id NOWAIT;
3281 
3282    CURSOR c_metric_info(p_act_metric_id NUMBER) IS
3286       AND activity_metric_id = p_act_metric_id;
3283       SELECT metrics_name
3284       FROM ams_metrics_vl m, ams_act_metrics_all a
3285       WHERE m.metric_id = a.metric_id
3287 BEGIN
3288    --
3289    -- Output debug message.
3290    --
3291    IF (AMS_DEBUG_HIGH_ON) THEN
3292       Ams_Utility_Pvt.debug_message(l_full_name||': start');
3293    END IF;
3294 
3295    --
3296    -- Initialize message list if p_init_msg_list is set to TRUE.
3297    --
3298    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
3299       Fnd_Msg_Pub.Initialize;
3300    END IF;
3301 
3302    --
3303    -- Standard check for API version compatibility.
3304    --
3305    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
3306                                        p_api_version,
3307                                        L_API_NAME,
3308                                        G_PKG_NAME)
3309    THEN
3310       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3311    END IF;
3312 
3313    --
3314    -- Initialize API return status to success.
3315    --
3316    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3317 
3318    --
3319    -- Begin API Body
3320    --
3321    IF (AMS_DEBUG_HIGH_ON) THEN
3322       Ams_Utility_Pvt.debug_message(l_full_name||': lock');
3323    END IF;
3324 
3325 
3326    OPEN c_act_metrics_info;
3327    FETCH c_act_metrics_info INTO l_activity_metric_id;
3328    IF  (c_act_metrics_info%NOTFOUND)
3329    THEN
3330       CLOSE c_act_metrics_info;
3331           -- Error, check the msg level and added an error message to the
3332           -- API message list
3333       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
3334          l_metrics_name := null;
3335          OPEN c_metric_info(p_activity_metric_id);
3336          FETCH c_metric_info INTO l_metrics_name;
3337          CLOSE c_metric_info;
3338          IF l_metrics_name is not null THEN
3339             Fnd_Message.set_name('AMS', 'AMS_METR_RECORD_NOT_FOUND');
3340             Fnd_Message.set_token('METRIC', l_metrics_name);
3341             Fnd_Msg_Pub.ADD;
3342          ELSE
3343             Fnd_Message.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
3344             Fnd_Msg_Pub.ADD;
3345          END IF;
3346       END IF;
3347       RAISE Fnd_Api.g_exc_error;
3348    END IF;
3349    CLOSE c_act_metrics_info;
3350 
3351 
3352    --
3353    -- Standard API to get message count, and if 1,
3354    -- set the message data OUT NOCOPY variable.
3355    --
3356    Fnd_Msg_Pub.Count_And_Get (
3357       p_count           =>    x_msg_count,
3358       p_data            =>    x_msg_data,
3359       p_encoded         =>    Fnd_Api.G_FALSE
3360    );
3361 
3362    --
3363    -- Debug message.
3364    --
3365    IF (AMS_DEBUG_HIGH_ON) THEN
3366       Ams_Utility_Pvt.debug_message(l_full_name ||': end');
3367    END IF;
3368 
3369 
3370 EXCEPTION
3371    WHEN Fnd_Api.G_EXC_ERROR THEN
3372       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3373       Fnd_Msg_Pub.Count_And_Get (
3374          p_count         =>     x_msg_count,
3375          p_data          =>     x_msg_data,
3376          p_encoded       =>   FND_API.G_FALSE
3377       );
3378    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
3379       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3380       Fnd_Msg_Pub.Count_And_Get (
3381          p_count         =>     x_msg_count,
3382          p_data          =>     x_msg_data,
3383          p_encoded       =>   FND_API.G_FALSE
3384       );
3385    WHEN Ams_Utility_Pvt.RESOURCE_LOCKED THEN
3386       x_return_status := Fnd_Api.G_RET_STS_ERROR ;
3387 
3388           IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
3389                    Fnd_Message.set_name('AMS', 'AMS_API_RESOURCE_LOCKED');
3390                    Fnd_Msg_Pub.ADD;
3391           END IF;
3392 
3393       Fnd_Msg_Pub.Count_And_Get (
3394          p_count         =>      x_msg_count,
3395          p_data          =>      x_msg_data,
3396          p_encoded      =>      Fnd_Api.G_FALSE
3397       );
3398    WHEN OTHERS THEN
3399       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3400       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
3401          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
3402       END IF;
3403       Fnd_Msg_Pub.Count_And_Get (
3404          p_count         =>     x_msg_count,
3405          p_data          =>     x_msg_data,
3406          p_encoded          =>      Fnd_Api.G_FALSE
3407                        );
3408 END Lock_ActMetric;
3409 
3410 -- Start of comments
3411 -- NAME
3412 --    Validate_ActMetric
3413 --
3414 -- PURPOSE
3415 --   Validation API for Activity metrics.
3416 --
3417 
3418 -- NOTES
3419 --
3420 -- HISTORY
3421 -- 05/26/1999   choang         Created.
3422 -- 10/9/1999    ptendulk           Modified according to new standards
3423 --
3424 -- End of comments
3425 
3426 PROCEDURE Validate_ActMetric (
3427    p_api_version                IN  NUMBER,
3428    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
3429    p_validation_level           IN  NUMBER   := Fnd_Api.G_Valid_Level_Full,
3430 
3431    x_return_status              OUT NOCOPY VARCHAR2,
3432    x_msg_count                  OUT NOCOPY NUMBER,
3433    x_msg_data                   OUT NOCOPY VARCHAR2,
3434 
3438    L_API_VERSION    CONSTANT NUMBER := 1.0;
3435    p_act_metric_rec            IN  act_metric_rec_type
3436 )
3437 IS
3439    L_API_NAME       CONSTANT VARCHAR2(30) := 'VALIDATE_ACTMETRIC';
3440    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
3441 
3442    l_return_status  VARCHAR2(1);
3443 
3444 BEGIN
3445    --
3446    -- Output debug message.
3447    --
3448    IF (AMS_DEBUG_HIGH_ON) THEN
3449       Ams_Utility_Pvt.debug_message(l_full_name||': start');
3450    END IF;
3451 
3452    --
3453    -- Initialize message list if p_init_msg_list is set to TRUE.
3454    --
3455    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
3456       Fnd_Msg_Pub.Initialize;
3457    END IF;
3458 
3459    --
3460    -- Standard check for API version compatibility.
3461    --
3462    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
3463                                        p_api_version,
3464                                        L_API_NAME,
3465                                        G_PKG_NAME)
3466    THEN
3467       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3468    END IF;
3469 
3470    --
3471    -- Initialize API return status to success.
3472    --
3473    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3474 
3475    --
3476    -- Begin API Body.
3477    --
3478 
3479    IF (AMS_DEBUG_HIGH_ON) THEN
3480       Ams_Utility_Pvt.debug_message(l_full_name||': Validate items');
3481    END IF;
3482 
3483    -- Validate required items in the record.
3484    IF p_validation_level >= Jtf_Plsql_Api.g_valid_level_item THEN
3485 
3486        Validate_ActMetric_items(
3487          p_act_metric_rec      => p_act_metric_rec,
3488          p_validation_mode         => Jtf_Plsql_Api.g_create,
3489          x_return_status           => l_return_status
3490       );
3491 
3492       -- If any errors happen abort API.
3493       IF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
3494          RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3495       ELSIF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
3496          RAISE Fnd_Api.G_EXC_ERROR;
3497       END IF;
3498    END IF;
3499 
3500    IF (AMS_DEBUG_HIGH_ON) THEN
3501       Ams_Utility_Pvt.debug_message(l_full_name||': check record');
3502    END IF;
3503 
3504    IF p_validation_level >= Jtf_Plsql_Api.g_valid_level_record THEN
3505       Validate_ActMetric_record(
3506          p_act_metric_rec       => p_act_metric_rec,
3507          p_complete_rec         => NULL,
3508          x_return_status        => l_return_status
3509       );
3510 
3511       IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
3512          RAISE Fnd_Api.g_exc_unexpected_error;
3513       ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
3514          RAISE Fnd_Api.g_exc_error;
3515       END IF;
3516    END IF;
3517 
3518    --
3519    -- End API Body.
3520    --
3521 
3522    --
3523    -- Standard API to get message count, and if 1,
3524    -- set the message data OUT NOCOPY variable.
3525    --
3526    Fnd_Msg_Pub.Count_And_Get (
3527       p_count           =>    x_msg_count,
3528       p_data            =>    x_msg_data,
3529       p_encoded         =>    Fnd_Api.G_FALSE
3530    );
3531 
3532    IF (AMS_DEBUG_HIGH_ON) THEN
3533       Ams_Utility_Pvt.debug_message(l_full_name ||': end');
3534    END IF;
3535 
3536 EXCEPTION
3537    WHEN Fnd_Api.G_EXC_ERROR THEN
3538       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3539       Fnd_Msg_Pub.Count_And_Get (
3540          p_count         =>     x_msg_count,
3541          p_data          =>     x_msg_data,
3542          p_encoded       =>   FND_API.G_FALSE
3543       );
3544    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
3545       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3546       Fnd_Msg_Pub.Count_And_Get (
3547          p_count         =>     x_msg_count,
3548          p_data          =>     x_msg_data,
3549          p_encoded       =>   FND_API.G_FALSE
3550       );
3551    WHEN OTHERS THEN
3552       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3553       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
3554          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
3555       END IF;
3556       Fnd_Msg_Pub.Count_And_Get (
3557          p_count         =>     x_msg_count,
3558          p_data          =>     x_msg_data,
3559          p_encoded       =>   FND_API.G_FALSE
3560       );
3561 END Validate_ActMetric;
3562 
3563 
3564 -- Start of comments.
3565 --
3566 -- NAME
3567 --    Check_Req_ActMetrics_Items
3568 --
3569 -- PURPOSE
3570 --    Validate required items metrics associated with business
3571 --    objects.
3572 --
3573 -- NOTES
3574 --
3575 -- HISTORY
3576 -- 05/26/1999     choang    Created.
3577 -- 10/9/1999      ptendulk  Modified According to new standards.
3578 --
3579 -- End of comments.
3580 
3581 PROCEDURE Check_Req_ActMetrics_Items (
3582    p_act_metric_rec                   IN act_metric_rec_type,
3583    x_return_status                     OUT NOCOPY VARCHAR2
3584 )
3585 IS
3586 BEGIN
3587    -- Initialize return status to success.
3588    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3589 
3590    -- APPLICATION_ID
3591 
3595       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3592    IF p_act_metric_rec.application_id IS NULL
3593    THEN
3594           -- missing required fields
3596       THEN -- MMSG
3597          Fnd_Message.Set_Name('AMS', 'AMS_METR_MISSING_APP_ID');
3598          Fnd_Msg_Pub.ADD;
3599       END IF;
3600 
3601       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3602 
3603       -- If any error happens abort API.
3604       RETURN;
3605    END IF;
3606 
3607    -- ARC_METRIC_USED_FOR_OBJECT
3608 
3609    IF  p_act_metric_rec.arc_act_metric_used_by IS NULL
3610    THEN
3611       -- missing required fields
3612       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3613       THEN -- MMSG
3614          Fnd_Message.Set_Name('AMS', 'AMS_METR_MISSING_ARC_USED_FOR');
3615          Fnd_Msg_Pub.ADD;
3616       END IF;
3617 
3618       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3619 
3620       -- If any error happens abort API.
3621       RETURN;
3622    END IF;
3623 
3624 
3625    -- ACT_METRIC_USED_BY_ID
3626 
3627    IF p_act_metric_rec.act_metric_used_by_id IS NULL
3628    THEN
3629       -- missing required fields
3630       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3631       THEN -- MMSG
3632          Fnd_Message.Set_Name('AMS', 'AMS_METR_MISSING_ARC_USED_FOR');
3633          Fnd_Msg_Pub.ADD;
3634       END IF;
3635 
3636       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3637 
3638       -- If any error happens abort API.
3639       RETURN;
3640    END IF;
3641 
3642    -- METRIC_ID
3643 
3644    IF p_act_metric_rec.metric_id IS NULL
3645    THEN
3646       -- missing required fields
3647       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3648       THEN -- MMSG
3649          Fnd_Message.Set_Name('AMS', 'AMS_METR_MISSING_METRIC_ID');
3650          Fnd_Msg_Pub.ADD;
3651       END IF;
3652 
3653       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3654 
3655       -- If any error happens abort API.
3656       RETURN;
3657    END IF;
3658 
3659    /*----------------------------------------------------------------
3660    -- commented by bgeorge om 01/18/2000, removed UOM as a req item
3661    -- METRIC_UOM_CODE
3662 
3663    IF p_act_metric_rec.metric_uom_code IS NULL
3664    THEN
3665       -- missing required fields
3666       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
3667       THEN -- MMSG
3668          FND_MESSAGE.Set_Name('AMS', 'AMS_METR_MISSING_UOM');
3669          FND_MSG_PUB.Add;
3670       END IF;
3671 
3672       x_return_status := FND_API.G_RET_STS_ERROR;
3673 
3674       -- If any error happens abort API.
3675       RETURN;
3676    END IF;
3677    -- end of comment  01/18/2000
3678    ---------------------------------------------------------------*/
3679 
3680 
3681    -- Sensitive Data flag
3682 
3683    IF p_act_metric_rec.sensitive_data_flag IS NULL
3684    THEN
3685       -- missing required fields
3686       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3687       THEN -- MMSG
3688          Fnd_Message.Set_Name('AMS', 'AMS_METR_MISSING_SENSITIVE');
3689          Fnd_Msg_Pub.ADD;
3690       END IF;
3691 
3692       x_return_status := Fnd_Api.G_RET_STS_ERROR;
3693 
3694       -- If any error happens abort API.
3695       RETURN;
3696    END IF;
3697 
3698 
3699 EXCEPTION
3700    WHEN OTHERS THEN
3701       RAISE;
3702 END Check_Req_ActMetrics_Items;
3703 
3704 
3705 --
3706 -- Start of comments.
3707 --
3708 -- NAME
3709 --    Check_ActMetric_UK_Items
3710 --
3711 -- PURPOSE
3712 --    Perform Uniqueness check for Activity metrics.
3713 --
3714 -- NOTES
3715 --
3716 -- HISTORY
3717 -- 10/9/1999      ptendulk                      Created.
3718 -- 11/22/2004     dmvincen  BUG4026377: Prevent duplicate function assignment.
3719 --
3720 -- End of comments.
3721 
3722 
3723 PROCEDURE Check_ActMetric_UK_Items(
3724    p_act_metric_rec      IN  act_metric_rec_type,
3725    p_validation_mode     IN  VARCHAR2 := Jtf_Plsql_Api.g_create,
3726    x_return_status       OUT NOCOPY VARCHAR2
3727 )
3728 IS
3729    l_where_clause VARCHAR2(2000); -- Used By Check_Uniqueness
3730    l_test VARCHAR2(1) := NULL;
3731    CURSOR c_check_function(l_metric_id NUMBER,
3732          l_arc_act_metric_used_by VARCHAR2,
3733          l_act_metric_used_by_id NUMBER,
3734          l_arc_function_used_by VARCHAR2,
3735          l_function_used_by_id NUMBER) IS
3736       SELECT 'x'
3737       FROM ams_metrics_all_b b
3738       WHERE metric_id = l_metric_id
3739       AND ((metric_calculation_type = 'FUNCTION'
3740       AND NOT EXISTS (SELECT 'x' FROM ams_act_metrics_all a
3741           WHERE a.metric_id = b.metric_id
3742           AND a.arc_act_metric_used_by = l_arc_act_metric_used_by
3743           AND a.act_metric_used_by_id = l_act_metric_used_by_id
3744           AND NVL(a.arc_function_used_by,'IS NULL') =
3745               NVL(l_arc_function_used_by,'IS NULL')
3746           AND NVL(a.function_used_by_id,-1) = NVL(l_function_used_by_id,-1)
3747           ))
3748       OR metric_calculation_type <> 'FUNCTION');
3749 
3750 BEGIN
3751 
3755    -- check if this activity_metric_id is unique.
3752    x_return_status := Fnd_Api.g_ret_sts_success;
3753 
3754    -- For Create_ActMetric2, when activity_metric_id is passed in, we need to
3756    IF p_validation_mode = Jtf_Plsql_Api.g_create
3757       AND p_act_metric_rec.activity_metric_id IS NOT NULL
3758    THEN
3759           l_where_clause := ' activity_metric_id = '||p_act_metric_rec.activity_metric_id ;
3760 
3761       IF Ams_Utility_Pvt.Check_Uniqueness(
3762                         p_table_name      => 'ams_act_metrics_all',
3763                         p_where_clause    => l_where_clause
3764                         ) = Fnd_Api.g_false
3765                 THEN
3766          IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error)
3767                         THEN
3768             Fnd_Message.set_name('AMS', 'AMS_METR_ACT_DUP_ID');
3769             Fnd_Msg_Pub.ADD;
3770          END IF;
3771          x_return_status := Fnd_Api.g_ret_sts_error;
3772          RETURN;
3773       END IF;
3774    END IF;
3775 
3776    -- check other unique items
3777 
3778    -- Function metrics may only be added once.
3779    IF p_validation_mode = Jtf_Plsql_Api.g_create THEN
3780       l_test := NULL;
3781       OPEN c_check_function(p_act_metric_rec.metric_id,
3782          p_act_metric_rec.arc_act_metric_used_by,
3783          p_act_metric_rec.act_metric_used_by_id,
3784          p_act_metric_rec.arc_function_used_by,
3785          p_act_metric_rec.function_used_by_id);
3786       FETCH c_check_function INTO l_test;
3787       CLOSE c_check_function;
3788 
3789       IF l_test IS NULL THEN
3790          IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
3791             Fnd_Message.set_name('AMS', 'AMS_ACT_MET_DUP_FUNCTION');
3792             Fnd_Msg_Pub.ADD;
3793          END IF;
3794          x_return_status := Fnd_Api.g_ret_sts_error;
3795       END IF;
3796 
3797    END IF;
3798 
3799 END Check_ActMetric_Uk_Items;
3800 
3801 
3802 --
3803 -- Start of comments.
3804 --
3805 -- NAME
3806 --    Check_ActMetric_Items
3807 --
3808 -- PURPOSE
3809 --    Perform item level validation for Activity metrics.
3810 --
3811 -- NOTES
3812 --
3813 -- HISTORY
3814 -- 05/26/1999     choang   Created.
3815 -- 10/9/1999      ptendulk Modified According to new Standards
3816 -- 05/08/2000     tdonohoe Modified, do not perform Metric_Id Check if the Activity Metric
3817 --                         is associated with a Forecast.
3818 -- 06-28-2000     rchahal@us     Modified to allow metric creation for Fund.
3819 -- 30-oct-2003    choang   enh 3141834: changed validation for arc_metric_used_for_object
3820 --                         and metric_origin.
3821 --
3822 -- End of comments.
3823 
3824 PROCEDURE Check_ActMetric_Items (
3825    p_act_metric_rec        IN  act_metric_rec_type,
3826    x_return_status         OUT NOCOPY VARCHAR2
3827 )
3828 IS
3829    l_item_name             VARCHAR2(30);  -- Used to standardize error messages.
3830    l_act_metrics_rec       act_metric_rec_type := p_act_metric_rec;
3831    l_return_status         VARCHAR2(1);
3832 
3833    l_table_name            VARCHAR2(30);
3834    l_pk_name               VARCHAR2(30);
3835    l_pk_value              VARCHAR2(30);
3836    l_pk_data_type          VARCHAR2(30);
3837    l_additional_where_clause VARCHAR2(4000);  -- Used by Check_FK_Exists.
3838    l_lookup_type           VARCHAR2(30);
3839 
3840    CURSOR c_arc_metric_usage (p_object_type IN VARCHAR2) IS
3841       SELECT 1
3842       FROM   ams_lookups
3843       WHERE  lookup_type IN ('AMS_METRIC_OBJECT_TYPE', 'AMS_METRIC_ROLLUP_TYPE', 'AMS_METRIC_ALLOCATION_TYPE')
3844       AND    lookup_code = p_object_type
3845       ;
3846    l_dummy                 NUMBER;
3847 
3848 
3849   /*sunkumar april-20-2004*/
3850   CURSOR c_check_metric_id(p_metric_id number) IS
3851     SELECT 1 from ams_metrics_all_b
3852     WHERE METRIC_ID = p_metric_id;
3853 
3854   CURSOR c_check_currency(p_CURRENCY_CODE varchar2, p_enabled_flag varchar2)  IS
3855    SELECT 1 from FND_CURRENCIES
3856    WHERE CURRENCY_CODE = p_CURRENCY_CODE
3857    and enabled_flag = p_enabled_flag;
3858 
3859 BEGIN
3860    -- Initialize return status to success.
3861    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3862 
3863    --
3864    -- Begin Validate Referential
3865    --
3866 
3867    -- METRIC_ID
3868    -- Do not validate FK if NULL
3869    -- Do not validate if Activity Metric is associated with a Forecast.
3870 
3871 
3872    OPEN c_check_metric_id(l_act_metrics_rec.metric_id);
3873     IF c_check_metric_id%NOTFOUND
3874     THEN
3875             IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
3876             THEN
3877                FND_MESSAGE.Set_Name('AMS', 'AMS_METR_INVALID_MET');
3878                FND_MSG_PUB.ADD;
3879             END IF;
3880 
3881             x_return_status := FND_API.G_RET_STS_ERROR;
3882             CLOSE c_check_metric_id;
3883             RETURN;
3884         END IF;
3885    CLOSE c_check_metric_id;
3886 
3887    -- TRANSACTION_CURRENCY_CODE
3888    -- Do not validate FK if NULL
3889    IF l_act_metrics_rec.transaction_currency_code <> Fnd_Api.G_MISS_CHAR THEN
3890 
3891       OPEN c_check_currency(l_act_metrics_rec.transaction_currency_code,'Y');
3895             THEN
3892       IF c_check_currency%NOTFOUND
3893       THEN
3894             IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
3896                FND_MESSAGE.Set_Name('AMS', 'AMS_METR_INVALID_TRANS_CUR');
3897                FND_MSG_PUB.ADD;
3898             END IF;
3899 
3900             x_return_status := FND_API.G_RET_STS_ERROR;
3901             CLOSE c_check_currency;
3902             RETURN;
3903       END IF;
3904       CLOSE c_check_currency;
3905 
3906    END IF;
3907 
3908 
3909       -- FUNCTIONAL_CURRENCY_CODE
3910    -- Do not validate FK if NULL
3911    IF l_act_metrics_rec.functional_currency_code <> Fnd_Api.G_MISS_CHAR THEN
3912 
3913       OPEN c_check_currency(l_act_metrics_rec.functional_currency_code,'Y');
3914     IF c_check_currency%NOTFOUND
3915     THEN
3916             IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
3917             THEN
3918                FND_MESSAGE.Set_Name('AMS', 'AMS_METR_INVALID_FUNC_CUR');
3919                FND_MSG_PUB.ADD;
3920             END IF;
3921 
3922             x_return_status := FND_API.G_RET_STS_ERROR;
3923             RETURN;
3924         END IF;
3925    CLOSE c_check_currency;
3926 
3927      END IF;
3928 
3929 
3930       /*
3931       l_table_name               := 'FND_CURRENCIES';
3932       l_pk_name                  := 'CURRENCY_CODE';
3933       l_pk_value                 := l_act_metrics_rec.transaction_currency_code;
3934       l_pk_data_type             := Ams_Utility_Pvt.G_VARCHAR2;
3935       l_additional_where_clause  := ' enabled_flag = ''Y''';
3936       IF Ams_Utility_Pvt.Check_FK_Exists (
3937              p_table_name                       => l_table_name
3938             ,p_pk_name                      => l_pk_name
3939             ,p_pk_value                     => l_pk_value
3940             ,p_pk_data_type                 => l_pk_data_type
3941             ,p_additional_where_clause  => l_additional_where_clause
3942          ) = Fnd_Api.G_FALSE
3943       THEN
3944          IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3945          THEN
3946                  Fnd_Message.Set_Name('AMS', 'AMS_METR_INVALID_TRANS_CUR');
3947                  Fnd_Msg_Pub.ADD;
3948                  END IF;
3949 
3950                  x_return_status := Fnd_Api.G_RET_STS_ERROR;
3951               RETURN;
3952       END IF;  -- Check_FK_Exists*/
3953 
3954 
3955 
3956       /*l_table_name               := 'FND_CURRENCIES';
3957       l_pk_name                  := 'CURRENCY_CODE';
3958       l_pk_value                 := l_act_metrics_rec.functional_currency_code;
3959       l_pk_data_type             := Ams_Utility_Pvt.G_VARCHAR2;
3960       l_additional_where_clause  := ' enabled_flag = ''Y''';
3961 
3962       IF Ams_Utility_Pvt.Check_FK_Exists (
3963              p_table_name                       => l_table_name
3964             ,p_pk_name                      => l_pk_name
3965             ,p_pk_value                     => l_pk_value
3966             ,p_pk_data_type                 => l_pk_data_type
3967             ,p_additional_where_clause  => l_additional_where_clause
3968          ) = Fnd_Api.G_FALSE
3969       THEN
3970          IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3971          THEN
3972             Fnd_Message.Set_Name('AMS', 'AMS_METR_INVALID_FUNC_CUR');
3973             Fnd_Msg_Pub.ADD;
3974          END IF;
3975 
3976          x_return_status := Fnd_Api.G_RET_STS_ERROR;
3977          RETURN;
3978       END IF;  -- Check_FK_Exists*/
3979 
3980 
3981 
3982    --
3983    -- End Validate Referential
3984    --
3985 
3986    --
3987    -- Begin Validate Flags
3988    --
3989 
3990       -- SENSITIVE_DATA_FLAG
3991    IF l_act_metrics_rec.sensitive_data_flag <> Fnd_Api.G_MISS_CHAR THEN
3992       IF Ams_Utility_Pvt.Is_Y_Or_N (l_act_metrics_rec.sensitive_data_flag)
3993                                                           = Fnd_Api.G_FALSE
3994       THEN
3995          IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
3996          THEN
3997             Fnd_Message.Set_Name('AMS', 'AMS_METR_INVALID_SENS_FLAG');
3998             Fnd_Msg_Pub.ADD;
3999          END IF;
4000 
4001          x_return_status := Fnd_Api.G_RET_STS_ERROR;
4002          RETURN;
4003       END IF; -- Is_Y_Or_N
4004    END IF;
4005 
4006    --
4007    -- End Validate Flags
4008    --
4009 
4010    --
4011    -- Begin Validate LOOKUPS
4012    --
4013    -- choang - 30-oct-2003 - enh 3141834: use lookup AMS_METRIC_OBJECT_TYPE,
4014    --                        AMS_METRIC_ALLOCATION_TYPE, AMS_METRIC_ROLLUP_TYPE
4015    -- ARC_METRIC_USED_FOR_OBJECT
4016    IF l_act_metrics_rec.arc_act_metric_used_by <> FND_API.g_miss_char THEN
4017       l_dummy := NULL;
4018       OPEN c_arc_metric_usage(l_act_metrics_rec.arc_act_metric_used_by);
4019       FETCH c_arc_metric_usage INTO l_dummy;
4020       CLOSE c_arc_metric_usage;
4021       IF l_dummy IS NULL THEN
4022          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
4023             Fnd_Message.Set_Name ('AMS', 'AMS_METR_INVALID_USED_BY');
4024             FND_MSG_PUB.add;
4025          END IF;
4026          x_return_status := FND_API.g_ret_sts_error;
4027       END IF;
4028    END IF;
4029 
4030    -- ARC_ACTIVITY_METRIC_ORIGIN
4034       l_dummy := NULL;
4031    -- DMVINCEN 03/11/2002: Added Dialog Components.
4032    -- DMVINCEN 03/11/2003: Removed Dialogue Components.
4033    IF l_act_metrics_rec.arc_activity_metric_origin <> Fnd_Api.G_MISS_CHAR THEN
4035       OPEN c_arc_metric_usage(l_act_metrics_rec.arc_activity_metric_origin);
4036       FETCH c_arc_metric_usage INTO l_dummy;
4037       CLOSE c_arc_metric_usage;
4038       IF l_dummy IS NULL THEN
4039          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
4040             Fnd_Message.Set_Name ('AMS', 'AMS_METR_INVALID_ORIGIN');
4041             FND_MSG_PUB.add;
4042          END IF;
4043          x_return_status := FND_API.g_ret_sts_error;
4044       END IF;
4045    END IF;
4046 
4047    --
4048    -- End Validate LOOKUPS
4049    --
4050 
4051    --
4052    -- End Other Business Rule Validations
4053    --
4054 
4055 EXCEPTION
4056    WHEN OTHERS THEN
4057       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4058 END Check_ActMetric_Items;
4059 
4060 --
4061 -- Start of comments.
4062 --
4063 -- NAME
4064 --    Validate_ActMetric_Record
4065 --
4066 -- PURPOSE
4067 --    Perform Record Level and Other business validations for metrics.
4068 --
4069 -- NOTES
4070 --
4071 -- HISTORY
4072 -- 10/11/1999     ptendulk  Created.
4073 -- 05/08/2000     tdonohoe  Modified, do not perform FK check on Metric_Id
4074 --                          if Activity Metric is associated with a Forecast.
4075 -- 06/28/2000     rchahal   Modified, do not perform FK check on Metric_Id
4076 --                          if Activity Metric is associated with a Fund.
4077 -- 05/01/2003     choang    bug 2931351 - restrict update of costs and revenues
4078 -- 05/19/2005     choang    Added edit metric access check.
4079 -- End of comments.
4080 
4081 PROCEDURE Validate_ActMetric_record(
4082    p_act_metric_rec   IN  act_metric_rec_type,
4083    p_complete_rec     IN  act_metric_rec_type,
4084    x_return_status    OUT NOCOPY VARCHAR2
4085 )
4086 IS
4087 BEGIN
4088    Validate_ActMetric_Record (
4089       p_act_metric_rec  => p_act_metric_rec,
4090       p_complete_rec    => p_complete_rec,
4091       p_operation_mode  => G_CREATE,
4092       x_return_status   => x_return_status
4093    );
4094 END;
4095 
4096 
4097 --
4098 -- Start of comments.
4099 --
4100 -- NAME
4101 --    Validate_ActMetric_Record
4102 --
4103 -- PURPOSE
4104 --    Perform Record Level and Other business validations for metrics.  Allow for
4105 --    different types of validation based on the type of database operation.
4106 --
4107 -- NOTES
4108 --
4109 -- HISTORY
4110 -- 06-May-2003    choang   bug 2931351 - restrict update of costs and revenues
4111 -- End of comments.
4112 
4113 PROCEDURE Validate_ActMetric_record(
4114    p_act_metric_rec  IN  act_metric_rec_type,
4115    p_complete_rec    IN  act_metric_rec_type,
4116    p_operation_mode  IN VARCHAR2,
4117    x_return_status   OUT NOCOPY VARCHAR2
4118 )
4119 IS
4120    L_ALLOW_ACTUAL_UPDATE_METR  CONSTANT VARCHAR2(30) := 'AMS_ALLOW_ACTUAL_UPDATE';
4121 
4122    l_act_metrics_rec              act_metric_rec_type := p_act_metric_rec ;
4123 
4124    l_table_name                  VARCHAR2(30);
4125    l_pk_name                     VARCHAR2(30);
4126    l_pk_value                    VARCHAR2(30);
4127    l_pk_data_type                VARCHAR2(30);
4128    l_additional_where_clause     VARCHAR2(4000);  -- Used by Check_FK_Exists.
4129 
4130    l_allow_actual_update         VARCHAR2(1);
4131    l_freeze_status               VARCHAR2(1);
4132 
4133    l_return_status                               VARCHAR2(1);
4134 
4135    CURSOR c_metric_details (p_metric_id IN NUMBER) IS
4136       SELECT uom_type,
4137              metric_calculation_type,
4138              arc_metric_used_for_object,
4139              metric_category
4140       FROM   ams_metrics_all_b
4141       WHERE metric_id = p_metric_id;
4142    l_metric_details_rec    c_metric_details%ROWTYPE;
4143 
4144    l_object_name AMS_LOOKUPS.MEANING%TYPE;
4145 
4146    CURSOR c_ref_metric (p_act_metric_id NUMBER) IS
4147       SELECT func_actual_value,
4148              trans_forecasted_value,
4149              forecasted_variable_value
4150       FROM   ams_act_metrics_all
4151       WHERE  activity_metric_id = p_act_metric_id;
4152 
4153 
4154 
4155   CURSOR c_check_uom(p_uom_code varchar2,p_uom_class varchar2 ) IS
4156     SELECT 1 from MTL_UNITS_OF_MEASURE
4157     WHERE UOM_CODE = p_uom_code
4158     AND   uom_class = p_uom_class;
4159 
4160    l_ref_metric_rec     c_ref_metric%ROWTYPE;
4161 BEGIN
4162 
4163    x_return_status := Fnd_Api.g_ret_sts_success;
4164 
4165    -- Initialize any values that are needed from
4166    -- the database to do comparisons in the validation.
4167    OPEN c_metric_details (l_act_metrics_rec.metric_id);
4168    FETCH c_metric_details INTO l_metric_details_rec;
4169    CLOSE c_metric_details;
4170 
4171    OPEN c_ref_metric (l_act_metrics_rec.activity_metric_id);
4172    FETCH c_ref_metric INTO l_ref_metric_rec;
4173    CLOSE c_ref_metric;
4174 
4175    -- Used for validation of forecast and actual value
4176    -- updates.
4177    Check_Freeze_Status (l_act_metrics_rec,
4181 
4178                         G_UPDATE, -- Update is operation mode
4179                         l_freeze_status,
4180                         l_return_status);
4182    -- Validate Update Mode --
4183    IF p_operation_mode = G_UPDATE THEN
4184       --
4185       -- choang - 11-may-2005 - validate edit metric access
4186       IF AMS_Access_PVT.check_update_access (
4187             p_object_id           => l_act_metrics_rec.act_metric_used_by_id,
4188             p_object_type         => l_act_metrics_rec.arc_act_metric_used_by,
4189             p_user_or_role_id     => AMS_Utility_PVT.get_resource_id (FND_GLOBAL.user_id),
4190             p_user_or_role_type   => 'USER') <> 'F' THEN
4191          x_return_status := Fnd_Api.G_RET_STS_ERROR;
4192          FND_MESSAGE.set_name ('AMS', 'AMS_NO_METRIC_UPDATE_ACCESS');
4193          FND_MESSAGE.set_token('OBJECT',
4194                                AMS_Utility_PVT.get_object_name(l_act_metrics_rec.arc_act_metric_used_by,
4195                                                                l_act_metrics_rec.act_metric_used_by_id)
4196                               );
4197          FND_MSG_PUB.add;
4198          -- exit the program immediately after this
4199          -- validation fails because it defines the
4200          -- entry requirement for executing any other
4201          -- logic for activity metrics; this is as if
4202          -- the validation is done at a "higher" level
4203          -- before the act metric API is invoked.
4204          RETURN;
4205       END IF;
4206 
4207       --
4208       -- choang - 01-may-2003 - validate forecast value update
4209       -- moved from the main update api
4210       --
4211       IF (l_freeze_status = Fnd_Api.G_TRUE)
4212          AND ((nvl(l_act_metrics_rec.trans_forecasted_value,0) <> FND_API.g_miss_num
4213             AND NVL (l_act_metrics_rec.trans_forecasted_value, 0) <>
4214                 NVL (l_ref_metric_rec.trans_forecasted_value, 0) )
4215            OR ( nvl(l_act_metrics_rec.forecasted_variable_value,0) <> FND_API.g_miss_num
4216          AND NVL (l_act_metrics_rec.forecasted_variable_value, 0) <>
4217              NVL (l_ref_metric_rec.forecasted_variable_value, 0) ) )
4218          AND l_metric_details_rec.metric_category IN
4219               (G_CATEGORY_COSTS, G_CATEGORY_REVENUES)
4220          AND l_metric_details_rec.metric_calculation_type IN
4221               ('MANUAL', 'FUNCTION') THEN
4222          -- frozen to update the forecast COST.
4223          -- this portion calls the Complete_ActMetric_Rec
4224          -- to set trans_forecasted_value back to
4225          -- its original value
4226 
4227          IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
4228               l_object_name := ams_utility_pvt.get_lookup_meaning(
4229                      'AMS_SYS_ARC_QUALIFIER',
4230                      l_act_metrics_rec.arc_act_metric_used_by);
4231               Fnd_Message.set_name('AMS', 'AMS_UPDATE_FORECAST');
4232               Fnd_Message.set_token('OBJECT', l_object_name);
4233               Fnd_Msg_Pub.ADD;
4234          END IF;  --msg_pub if
4235          x_return_status := Fnd_Api.G_RET_STS_ERROR;
4236       END IF;
4237 
4238       --
4239       -- bug 2931351 - disallow update of actuals before active
4240       --
4241       -- Make a call-out to check the frozen status.
4242       -- If it is frozen, disallow the operation.
4243       -- Use NVL for comparison of NULLs to 0 because
4244       -- refresh engine updates NULL metrics to 0.
4245       IF l_act_metrics_rec.trans_actual_value <> FND_API.g_miss_num
4246          AND NVL (l_act_metrics_rec.trans_actual_value, 0) <>
4247                 NVL (l_ref_metric_rec.func_actual_value, 0)
4248          AND l_metric_details_rec.metric_category IN
4249                 (G_CATEGORY_COSTS, G_CATEGORY_REVENUES)
4250          AND l_metric_details_rec.metric_calculation_type IN
4251                 ('MANUAL', 'FUNCTION') THEN
4252          l_allow_actual_update :=
4253                 NVL(Fnd_Profile.Value (L_ALLOW_ACTUAL_UPDATE_METR),'N');
4254 
4255           --sunkumar 04/30/2003
4256           --added profile option to restrict updation of actuals
4257          IF (l_allow_actual_update = 'N') THEN
4258             --object is not active and profile is N hence do not allow update
4259             IF (l_freeze_status = Fnd_Api.G_FALSE) THEN
4260                IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
4261                   Fnd_Message.set_name('AMS', 'AMS_METR_UPDATE_ACTUAL');
4262                   Fnd_Msg_Pub.ADD;
4263                END IF;  --msg_pub if
4264 
4265                x_return_status := Fnd_Api.G_RET_STS_ERROR;
4266             END IF;  --freeze status if
4267          END IF;  --profile if
4268       END IF;  -- check if func_actual_value changed
4269    -- Validate Create Mode --
4270    ELSIF p_operation_mode = G_CREATE THEN
4271       --
4272       -- bug 4661335 - disallow create of actuals before active
4273       --
4274       -- Make a call-out to check the frozen status.
4275       -- If it is frozen, disallow the operation.
4276       -- Use NVL for comparison of NULLs to 0 because
4277       -- refresh engine updates NULL metrics to 0.
4278       IF l_act_metrics_rec.trans_actual_value <> FND_API.g_miss_num
4279          AND NVL (l_act_metrics_rec.trans_actual_value, 0) <> 0
4280          AND l_metric_details_rec.metric_category IN
4281                 (G_CATEGORY_COSTS, G_CATEGORY_REVENUES)
4285                 NVL(Fnd_Profile.Value (L_ALLOW_ACTUAL_UPDATE_METR),'N');
4282          AND l_metric_details_rec.metric_calculation_type IN
4283                 ('MANUAL', 'FUNCTION') THEN
4284          l_allow_actual_update :=
4286 
4287           -- Profile option to restrict updation of actuals.
4288          IF (l_allow_actual_update = 'N') THEN
4289             --object is not active and profile is N hence do not allow update
4290             IF (l_freeze_status = Fnd_Api.G_FALSE) THEN
4291                IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
4292                   Fnd_Message.set_name('AMS', 'AMS_METR_UPDATE_ACTUAL');
4293                   Fnd_Msg_Pub.ADD;
4294                END IF;  --msg_pub if
4295 
4296                x_return_status := Fnd_Api.G_RET_STS_ERROR;
4297             END IF;  --freeze status if
4298          END IF;  --profile if
4299       END IF;  -- check if func_actual_value changed
4300 
4301 
4302       NULL; -- nothing here yet
4303    -- Validate Delete Mode --
4304    ELSIF p_operation_mode = G_DELETE THEN
4305       NULL; -- nothing here yet
4306    END IF;
4307 
4308    -- Validate All Modes --
4309     IF l_act_metrics_rec.arc_act_metric_used_by <> Fnd_Api.G_MISS_CHAR THEN
4310 
4311        IF l_act_metrics_rec.act_metric_used_by_id = Fnd_Api.G_MISS_NUM THEN
4312           l_act_metrics_rec.act_metric_used_by_id  :=
4313                                       p_complete_rec.act_metric_used_by_id;
4314        END IF;
4315 
4316        IF l_act_metrics_rec.metric_id = Fnd_Api.G_MISS_NUM THEN
4317           l_act_metrics_rec.metric_id  := p_complete_rec.metric_id;
4318        END IF;
4319 
4320           -- DMVINCEN 06/07/2001
4321           -- The object type must match between the metric and the object
4322           -- being assigned only if the calculation type is MANUAL or FUNCTION.
4323           -- SUMMARY or ROLLUP metrics can be assigned to any object.
4324           IF l_metric_details_rec.metric_calculation_type IS NULL OR
4325              (l_metric_details_rec.metric_calculation_type IN ('MANUAL', 'FUNCTION') AND
4326               l_metric_details_rec.arc_metric_used_for_object <> l_act_metrics_rec.arc_act_metric_used_by)
4327           THEN
4328 
4329             IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR)
4330             THEN
4331                Fnd_Message.Set_Name('AMS', 'AMS_METR_INVALID_ACT_USAGE');
4332                Fnd_Msg_Pub.ADD;
4333             END IF;
4334 
4335             x_return_status := Fnd_Api.G_RET_STS_ERROR;
4336          END IF;  -- Check_FK_Exists
4337 
4338       -- Get table_name and pk_name for the ARC qualifier.
4339    /*sunkumar 21-apr-2004 added*/
4340     IF Validate_Object_Exists(
4341                 p_object_type => l_act_metrics_rec.arc_act_metric_used_by
4342                  ,p_object_id     => l_act_metrics_rec.act_metric_used_by_id
4343     ) = Fnd_Api.G_FALSE
4344       THEN
4345             IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
4346             l_object_name := ams_utility_pvt.get_lookup_meaning(
4347              'AMS_SYS_ARC_QUALIFIER',l_act_metrics_rec.arc_act_metric_used_by);
4348             Fnd_Message.Set_Name ('AMS', 'AMS_METR_INVALID_OBJECT');
4349             Fnd_Message.Set_Token('OBJTYPE',l_object_name);
4350             Fnd_Message.Set_Token('OBJID',l_pk_value);
4351             Fnd_Msg_Pub.ADD;
4352             END IF;
4353 
4354             x_return_status := Fnd_Api.G_RET_STS_ERROR;
4355       END IF;
4356 
4357    END IF;
4358 
4359    -- METRIC_UOM_CODE
4360    IF l_act_metrics_rec.metric_uom_code <> Fnd_Api.G_MISS_CHAR THEN
4361       IF l_act_metrics_rec.metric_id = Fnd_Api.G_MISS_NUM THEN
4362          l_act_metrics_rec.metric_id  := p_complete_rec.metric_id ;
4363       END IF;
4364 
4365     OPEN c_check_uom(l_act_metrics_rec.metric_uom_code,l_metric_details_rec.uom_type);
4366     IF c_check_uom%NOTFOUND
4367     THEN
4368             IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR)
4369             THEN
4370                FND_MESSAGE.Set_Name('AMS', 'AMS_METR_INVALID_UOM');
4371                FND_MSG_PUB.ADD;
4372             END IF;
4373 
4374             x_return_status := FND_API.G_RET_STS_ERROR;
4375             CLOSE c_check_uom;
4376             RETURN;
4377         END IF;
4378      CLOSE c_check_uom;
4379    END IF;
4380 
4381    IF l_act_metrics_rec.arc_activity_metric_origin <> Fnd_Api.G_MISS_CHAR THEN
4382       IF l_act_metrics_rec.activity_metric_origin_id = Fnd_Api.G_MISS_NUM THEN
4383          l_act_metrics_rec.activity_metric_origin_id :=
4384                                      p_complete_rec.activity_metric_origin_id;
4385       END IF;
4386 
4387           -- Get table_name and pk_name for the ARC qualifier.
4388    /*sunkumar 21-apr-2004 added*/
4389     IF Validate_Object_Exists(
4390                 p_object_type => l_act_metrics_rec.arc_act_metric_used_by
4391                  ,p_object_id     => l_act_metrics_rec.act_metric_used_by_id
4392     ) = Fnd_Api.G_FALSE
4393       THEN
4394          IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
4395          Fnd_Message.Set_Name ('AMS', 'AMS_METR_INVALID_ORIGIN');
4396          Fnd_Msg_Pub.ADD;
4397          END IF;
4398 
4399          x_return_status := Fnd_Api.G_RET_STS_ERROR;
4400       END IF;
4401    END IF;
4402 
4403    --
4407 
4404    -- Other Business Rule Validations
4405    --
4406 END Validate_ActMetric_record;
4408 
4409 
4410 --
4411 -- Start of comments.
4412 --
4413 -- NAME
4414 --    Validate_ActMetric_Items
4415 --
4416 -- PURPOSE
4417 --    Perform All Item level validation for Activity metrics.
4418 --
4419 -- NOTES
4420 --
4421 -- HISTORY
4422 -- 10/11/1999     ptendulk            Created.
4423 --
4424 -- End of comments.
4425 
4426 PROCEDURE Validate_ActMetric_items(
4427    p_act_metric_rec    IN  act_metric_rec_type,
4428    p_validation_mode   IN  VARCHAR2 := Jtf_Plsql_Api.g_create,
4429    x_return_status     OUT NOCOPY VARCHAR2
4430 )
4431 IS
4432 BEGIN
4433 
4434    Check_Req_ActMetrics_Items(
4435       p_act_metric_rec  => p_act_metric_rec,
4436       x_return_status    => x_return_status
4437    );
4438    IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
4439       RETURN;
4440    END IF;
4441 
4442    Check_ActMetric_Uk_Items(
4443       p_act_metric_rec    => p_act_metric_rec,
4444       p_validation_mode   => p_validation_mode,
4445       x_return_status     => x_return_status
4446    );
4447 
4448    IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
4449       RETURN;
4450    END IF;
4451 
4452    Check_ActMetric_Items(
4453       p_act_metric_rec   => p_act_metric_rec,
4454       x_return_status     => x_return_status
4455    );
4456 
4457    IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
4458       RETURN;
4459    END IF;
4460 
4461 
4462 
4463 END Validate_ActMetric_items;
4464 
4465 --
4466 -- Begin of section added by ptendulk - 10/11/1999
4467 --
4468 -- NAME
4469 --    Complete_Metric_Rec
4470 --
4471 -- PURPOSE
4472 --   Returns the Initialized Activity Metric Record
4473 --
4474 -- NOTES
4475 --
4476 -- HISTORY
4477 -- 07/19/1999   choang         Created.
4478 --
4479 PROCEDURE Complete_ActMetric_Rec(
4480    p_act_metric_rec      IN  act_metric_rec_type,
4481    x_complete_rec        IN OUT NOCOPY act_metric_rec_type
4482 )
4483 IS
4484    CURSOR c_act_metric IS
4485    SELECT *
4486      FROM ams_act_metrics_all
4487     WHERE activity_metric_id = p_act_metric_rec.activity_metric_id;
4488 
4489    l_act_metric_rec  c_act_metric%ROWTYPE;
4490 BEGIN
4491 
4492    x_complete_rec := p_act_metric_rec;
4493 
4494    OPEN c_act_metric;
4495    FETCH c_act_metric INTO l_act_metric_rec;
4496    IF c_act_metric%NOTFOUND THEN
4497       CLOSE c_act_metric;
4498       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
4499          Fnd_Message.set_name('AMS', 'AMS_API_RECORD_NOT_FOUND');
4500          Fnd_Msg_Pub.ADD;
4501       END IF;
4502       RAISE Fnd_Api.g_exc_error;
4503    END IF;
4504    CLOSE c_act_metric;
4505 
4506 
4507    IF p_act_metric_rec.act_metric_used_by_id = Fnd_Api.G_MISS_NUM THEN
4508       x_complete_rec.act_metric_used_by_id := l_act_metric_rec.act_metric_used_by_id;
4509    END IF;
4510 
4511    IF p_act_metric_rec.arc_act_metric_used_by = Fnd_Api.G_MISS_CHAR THEN
4512       x_complete_rec.arc_act_metric_used_by := l_act_metric_rec.arc_act_metric_used_by;
4513    END IF;
4514 
4515    IF p_act_metric_rec.purchase_req_raised_flag = Fnd_Api.G_MISS_CHAR THEN
4516       x_complete_rec.purchase_req_raised_flag := l_act_metric_rec.purchase_req_raised_flag;
4517    END IF;
4518 
4519    IF p_act_metric_rec.application_id = Fnd_Api.G_MISS_NUM THEN
4520       x_complete_rec.application_id := l_act_metric_rec.application_id;
4521    END IF;
4522 
4523    IF p_act_metric_rec.sensitive_data_flag = Fnd_Api.G_MISS_CHAR THEN
4524       x_complete_rec.sensitive_data_flag := l_act_metric_rec.sensitive_data_flag;
4525    END IF;
4526 
4527    IF p_act_metric_rec.budget_id = Fnd_Api.G_MISS_NUM THEN
4528       x_complete_rec.budget_id := l_act_metric_rec.budget_id;
4529    END IF;
4530 
4531    IF p_act_metric_rec.metric_id = Fnd_Api.G_MISS_NUM THEN
4532       x_complete_rec.metric_id := l_act_metric_rec.metric_id;
4533    END IF;
4534 
4535    IF p_act_metric_rec.transaction_currency_code = Fnd_Api.G_MISS_CHAR THEN
4536       x_complete_rec.transaction_currency_code := l_act_metric_rec.transaction_currency_code;
4537    END IF;
4538 
4539    IF NVL(p_act_metric_rec.trans_forecasted_value,-1) = Fnd_Api.G_MISS_NUM THEN
4540       x_complete_rec.trans_forecasted_value := l_act_metric_rec.trans_forecasted_value;
4541    END IF;
4542 
4543    IF p_act_metric_rec.trans_committed_value = Fnd_Api.G_MISS_NUM THEN
4544       x_complete_rec.trans_committed_value := l_act_metric_rec.trans_committed_value;
4545    END IF;
4546 
4547    IF p_act_metric_rec.trans_actual_value = Fnd_Api.G_MISS_NUM THEN
4548       x_complete_rec.trans_actual_value := l_act_metric_rec.trans_actual_value;
4549    END IF;
4550 
4551    IF p_act_metric_rec.functional_currency_code = Fnd_Api.G_MISS_CHAR THEN
4552       x_complete_rec.functional_currency_code := l_act_metric_rec.functional_currency_code;
4553    END IF;
4554 
4555    IF p_act_metric_rec.func_forecasted_value = Fnd_Api.G_MISS_NUM THEN
4556       x_complete_rec.func_forecasted_value := l_act_metric_rec.func_forecasted_value;
4557    END IF;
4558 
4562 
4559    IF p_act_metric_rec.func_committed_value = Fnd_Api.G_MISS_NUM THEN
4560       x_complete_rec.func_committed_value := l_act_metric_rec.func_committed_value;
4561    END IF;
4563    IF p_act_metric_rec.func_actual_value = Fnd_Api.G_MISS_NUM THEN
4564       x_complete_rec.func_actual_value := l_act_metric_rec.func_actual_value;
4565    END IF;
4566 
4567    IF p_act_metric_rec.dirty_flag = Fnd_Api.G_MISS_CHAR THEN
4568      IF (l_act_metric_rec.trans_actual_value <>
4569                                         x_complete_rec.trans_actual_value) OR
4570        (l_act_metric_rec.transaction_currency_code <>
4571                                         x_complete_rec.transaction_currency_code) OR
4572        (l_act_metric_rec.trans_forecasted_value <>
4573                                         x_complete_rec.trans_forecasted_value) OR
4574        (l_act_metric_rec.variable_value <>
4575                                         x_complete_rec.variable_value) or
4576        (l_act_metric_rec.forecasted_variable_value <>
4577                                         x_complete_rec.forecasted_variable_value) THEN
4578                 --SVEERAVE, 10/16/00 to default dirty_flag to Y incase of changes in
4579                 -- actual/forecasted values.
4580           x_complete_rec.dirty_flag := G_IS_DIRTY;
4581 --      x_complete_rec.dirty_flag := l_act_metric_rec.dirty_flag;
4582      ELSE
4583           x_complete_rec.dirty_flag := NVL(l_act_metric_rec.dirty_flag,G_IS_DIRTY);
4584      END IF;
4585    END IF;
4586 
4587    IF p_act_metric_rec.last_calculated_date = Fnd_Api.G_MISS_DATE THEN
4588       x_complete_rec.last_calculated_date := l_act_metric_rec.last_calculated_date;
4589    END IF;
4590 
4591    IF p_act_metric_rec.variable_value = Fnd_Api.G_MISS_NUM THEN
4592       x_complete_rec.variable_value := l_act_metric_rec.variable_value;
4593    END IF;
4594 
4595    IF p_act_metric_rec.forecasted_variable_value = Fnd_Api.G_MISS_NUM THEN
4596       x_complete_rec.forecasted_variable_value := l_act_metric_rec.forecasted_variable_value;
4597    END IF;
4598 
4599    IF p_act_metric_rec.computed_using_function_value = Fnd_Api.G_MISS_NUM THEN
4600       x_complete_rec.computed_using_function_value := l_act_metric_rec.computed_using_function_value;
4601    END IF;
4602 
4603    IF p_act_metric_rec.metric_uom_code = Fnd_Api.G_MISS_CHAR THEN
4604       x_complete_rec.metric_uom_code := l_act_metric_rec.metric_uom_code;
4605    END IF;
4606 
4607    IF p_act_metric_rec.attribute_category = Fnd_Api.G_MISS_CHAR THEN
4608       x_complete_rec.attribute_category := l_act_metric_rec.attribute_category;
4609    END IF;
4610 
4611    IF p_act_metric_rec.difference_since_last_calc = Fnd_Api.G_MISS_NUM THEN
4612       x_complete_rec.difference_since_last_calc := l_act_metric_rec.difference_since_last_calc;
4613    END IF;
4614 
4615    IF p_act_metric_rec.activity_metric_origin_id = Fnd_Api.G_MISS_NUM THEN
4616       x_complete_rec.activity_metric_origin_id := l_act_metric_rec.activity_metric_origin_id;
4617    END IF;
4618 
4619    IF p_act_metric_rec.arc_activity_metric_origin = Fnd_Api.G_MISS_CHAR THEN
4620       x_complete_rec.arc_activity_metric_origin := l_act_metric_rec.arc_activity_metric_origin;
4621    END IF;
4622 
4623    IF p_act_metric_rec.days_since_last_refresh = Fnd_Api.G_MISS_NUM THEN
4624       x_complete_rec.days_since_last_refresh := l_act_metric_rec.days_since_last_refresh;
4625    END IF;
4626 
4627    IF p_act_metric_rec.scenario_id = Fnd_Api.G_MISS_NUM THEN
4628       x_complete_rec.scenario_id := l_act_metric_rec.scenario_id;
4629    END IF;
4630 
4631    /***************************************************************/
4632    /*added 17-Apr-2000 tdonohoe@us support 11.5.2 columns         */
4633    /***************************************************************/
4634 
4635    IF p_act_metric_rec.hierarchy_id = Fnd_Api.G_MISS_NUM THEN
4636       x_complete_rec.hierarchy_id := l_act_metric_rec.hierarchy_id;
4637    END IF;
4638 
4639    IF p_act_metric_rec.start_node  = Fnd_Api.G_MISS_NUM THEN
4640       x_complete_rec.start_node   := l_act_metric_rec.start_node;
4641    END IF;
4642 
4643    IF p_act_metric_rec.from_level  = Fnd_Api.G_MISS_NUM THEN
4644       x_complete_rec.from_level   := l_act_metric_rec.from_level;
4645    END IF;
4646 
4647    IF p_act_metric_rec.to_level  = Fnd_Api.G_MISS_NUM THEN
4648       x_complete_rec.to_level   := l_act_metric_rec.to_level;
4649    END IF;
4650 
4651    IF p_act_metric_rec.from_date  = Fnd_Api.G_MISS_DATE THEN
4652       x_complete_rec.from_date   := l_act_metric_rec.from_date;
4653    END IF;
4654 
4655    IF p_act_metric_rec.TO_DATE  = Fnd_Api.G_MISS_DATE THEN
4656       x_complete_rec.TO_DATE   := l_act_metric_rec.TO_DATE;
4657    END IF;
4658 
4659    IF p_act_metric_rec.amount1  = Fnd_Api.G_MISS_NUM THEN
4660       x_complete_rec.amount1   := l_act_metric_rec.amount1;
4661    END IF;
4662 
4663    IF p_act_metric_rec.amount2  = Fnd_Api.G_MISS_NUM THEN
4664       x_complete_rec.amount2   := l_act_metric_rec.amount2;
4665    END IF;
4666 
4667    IF p_act_metric_rec.amount3  = Fnd_Api.G_MISS_NUM THEN
4668       x_complete_rec.amount3   := l_act_metric_rec.amount3;
4669    END IF;
4670 
4671    IF p_act_metric_rec.percent1  = Fnd_Api.G_MISS_NUM THEN
4672       x_complete_rec.percent1   := l_act_metric_rec.percent1;
4673    END IF;
4674 
4675    IF p_act_metric_rec.percent2  = Fnd_Api.G_MISS_NUM THEN
4676       x_complete_rec.percent2   := l_act_metric_rec.percent2;
4677    END IF;
4678 
4682 
4679    IF p_act_metric_rec.percent3  = Fnd_Api.G_MISS_NUM THEN
4680       x_complete_rec.percent3   := l_act_metric_rec.percent3;
4681    END IF;
4683    IF p_act_metric_rec.published_flag  = Fnd_Api.G_MISS_CHAR THEN
4684       x_complete_rec.published_flag   := l_act_metric_rec.published_flag;
4685    END IF;
4686 
4687    IF p_act_metric_rec.pre_function_name  = Fnd_Api.G_MISS_CHAR THEN
4688       x_complete_rec.pre_function_name   := l_act_metric_rec.pre_function_name;
4689    END IF;
4690 
4691    IF p_act_metric_rec.post_function_name  = Fnd_Api.G_MISS_CHAR THEN
4692       x_complete_rec.post_function_name   := l_act_metric_rec.post_function_name;
4693    END IF;
4694 
4695    IF p_act_metric_rec.attribute1 = Fnd_Api.G_MISS_CHAR THEN
4696       x_complete_rec.attribute1 := l_act_metric_rec.attribute1;
4697    END IF;
4698 
4699    IF p_act_metric_rec.attribute2 = Fnd_Api.G_MISS_CHAR THEN
4700       x_complete_rec.attribute2 := l_act_metric_rec.attribute2;
4701    END IF;
4702 
4703    IF p_act_metric_rec.attribute3 = Fnd_Api.G_MISS_CHAR THEN
4704       x_complete_rec.attribute3 := l_act_metric_rec.attribute3;
4705    END IF;
4706 
4707    IF p_act_metric_rec.attribute4 = Fnd_Api.G_MISS_CHAR THEN
4708       x_complete_rec.attribute4 := l_act_metric_rec.attribute4;
4709    END IF;
4710 
4711    IF p_act_metric_rec.attribute5 = Fnd_Api.G_MISS_CHAR THEN
4712       x_complete_rec.attribute5 := l_act_metric_rec.attribute5;
4713    END IF;
4714 
4715    IF p_act_metric_rec.attribute6 = Fnd_Api.G_MISS_CHAR THEN
4716       x_complete_rec.attribute6 := l_act_metric_rec.attribute6;
4717    END IF;
4718 
4719    IF p_act_metric_rec.attribute7 = Fnd_Api.G_MISS_CHAR THEN
4720       x_complete_rec.attribute7 := l_act_metric_rec.attribute7;
4721    END IF;
4722 
4723    IF p_act_metric_rec.attribute8 = Fnd_Api.G_MISS_CHAR THEN
4724       x_complete_rec.attribute8 := l_act_metric_rec.attribute8;
4725    END IF;
4726 
4727    IF p_act_metric_rec.attribute9 = Fnd_Api.G_MISS_CHAR THEN
4728       x_complete_rec.attribute9 := l_act_metric_rec.attribute9;
4729    END IF;
4730 
4731    IF p_act_metric_rec.attribute10 = Fnd_Api.G_MISS_CHAR THEN
4732       x_complete_rec.attribute10 := l_act_metric_rec.attribute10;
4733    END IF;
4734 
4735    IF p_act_metric_rec.attribute11 = Fnd_Api.G_MISS_CHAR THEN
4736       x_complete_rec.attribute11 := l_act_metric_rec.attribute11;
4737    END IF;
4738 
4739    IF p_act_metric_rec.attribute12 = Fnd_Api.G_MISS_CHAR THEN
4740       x_complete_rec.attribute12 := l_act_metric_rec.attribute12;
4741    END IF;
4742 
4743    IF p_act_metric_rec.attribute13 = Fnd_Api.G_MISS_CHAR THEN
4744       x_complete_rec.attribute13 := l_act_metric_rec.attribute13;
4745    END IF;
4746 
4747    IF p_act_metric_rec.attribute14 = Fnd_Api.G_MISS_CHAR THEN
4748       x_complete_rec.attribute14 := l_act_metric_rec.attribute14;
4749    END IF;
4750 
4751    IF p_act_metric_rec.attribute15 = Fnd_Api.G_MISS_CHAR THEN
4752       x_complete_rec.attribute15 := l_act_metric_rec.attribute15;
4753    END IF;
4754 
4755 -- DMVINCEN 05/01/2001: New columns.
4756    IF p_act_metric_rec.act_metric_date = Fnd_Api.G_MISS_DATE THEN
4757       x_complete_rec.act_metric_date := l_act_metric_rec.act_metric_date;
4758    END IF;
4759 
4760    IF p_act_metric_rec.description = Fnd_Api.G_MISS_CHAR THEN
4761       x_complete_rec.description := l_act_metric_rec.description;
4762    END IF;
4763 
4764 -- DMVINCEN 05/01/2001: End new columns.
4765 
4766    IF p_act_metric_rec.depend_act_metric = Fnd_Api.G_MISS_NUM THEN
4767       x_complete_rec.depend_act_metric := l_act_metric_rec.depend_act_metric;
4768    END IF;
4769 
4770 -- DMVINCEN 03/08/2002:
4771 
4772    IF p_act_metric_rec.function_used_by_id = Fnd_Api.G_MISS_NUM THEN
4773       x_complete_rec.function_used_by_id := l_act_metric_rec.function_used_by_id;
4774    END IF;
4775 
4776    IF p_act_metric_rec.arc_function_used_by = Fnd_Api.G_MISS_CHAR THEN
4777       x_complete_rec.arc_function_used_by := l_act_metric_rec.arc_function_used_by;
4778    END IF;
4779 
4780    /* 05/15/2002 yzhao: add 6 new columns for top-down bottom-up budgeting */
4781    IF p_act_metric_rec.hierarchy_type = Fnd_Api.G_MISS_CHAR THEN
4782       x_complete_rec.hierarchy_type := l_act_metric_rec.hierarchy_type;
4783    END IF;
4784 
4785    IF p_act_metric_rec.status_code = Fnd_Api.G_MISS_CHAR THEN
4786       x_complete_rec.status_code := l_act_metric_rec.status_code;
4787    END IF;
4788 
4789    IF p_act_metric_rec.method_code = Fnd_Api.G_MISS_CHAR THEN
4790       x_complete_rec.method_code := l_act_metric_rec.method_code;
4791    END IF;
4792 
4793    IF p_act_metric_rec.action_code = Fnd_Api.G_MISS_CHAR THEN
4794       x_complete_rec.action_code := l_act_metric_rec.action_code;
4795    END IF;
4796 
4797    IF p_act_metric_rec.basis_year = Fnd_Api.G_MISS_NUM THEN
4798       x_complete_rec.basis_year := l_act_metric_rec.basis_year;
4799    END IF;
4800 
4801    IF p_act_metric_rec.ex_start_node = Fnd_Api.G_MISS_CHAR THEN
4802       x_complete_rec.ex_start_node := l_act_metric_rec.ex_start_node;
4803    END IF;
4804    /* 05/15/2002 yzhao: add ends */
4805 
4806 END Complete_ActMetric_Rec ;
4807 
4808 --
4809 -- End of section added by choang.
4810 --
4811 -- NAME
4812 --    SetCommittedVal
4813 --
4814 -- PURPOSE
4818 --
4815 --   Updates the functional committed value of a specific
4816 --   metric that is associated with the given business
4817 --   entity.
4819 -- NOTES
4820 --
4821 -- HISTORY
4822 -- 07/19/1999   choang         Created.
4823 -- 10/13/1999   ptendulk           Modified According to new standards
4824 --
4825 
4826 PROCEDURE SetCommittedVal (
4827    p_api_version                 IN NUMBER,
4828    p_init_msg_list               IN VARCHAR2 := Fnd_Api.G_FALSE,
4829    p_commit                      IN VARCHAR2 := Fnd_Api.G_FALSE,
4830    p_validation_level            IN NUMBER   := Fnd_Api.G_VALID_LEVEL_FULL,
4831 
4832    x_return_status               OUT NOCOPY VARCHAR2,
4833    x_msg_count                   OUT NOCOPY NUMBER,
4834    x_msg_data                    OUT NOCOPY VARCHAR2,
4835 
4836    p_arc_act_metric_used_by      IN VARCHAR2,
4837    p_act_metric_used_by_id       IN NUMBER,
4838    p_metric_id                   IN NUMBER,
4839    p_func_committed_value        IN NUMBER
4840 )
4841 IS
4842    L_API_VERSION         CONSTANT NUMBER := 1.0;
4843    L_API_NAME            CONSTANT VARCHAR2(30) := 'SETCOMMITTEDVAL';
4844    L_FULL_NAME           CONSTANT VARCHAR2(60) := G_PKG_NAME ||'.'|| L_API_NAME;
4845 
4846    l_return_status       VARCHAR2(1);
4847 
4848 BEGIN
4849    --
4850    -- Initialize savepoint.
4851    --
4852    SAVEPOINT SetCommittedVal_SavePoint;
4853 
4854    --
4855    -- Output debug message.
4856    --
4857    IF (AMS_DEBUG_HIGH_ON) THEN
4858       Ams_Utility_Pvt.debug_message(l_full_name||': start');
4859    END IF;
4860 
4861    --
4862    -- Initialize message list if p_init_msg_list is set to TRUE.
4863    --
4864    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
4865       Fnd_Msg_Pub.Initialize;
4866    END IF;
4867 
4868    --
4869    -- Standard check for API version compatibility.
4870    --
4871    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
4872                                        p_api_version,
4873                                        L_API_NAME,
4874                                        G_PKG_NAME)
4875    THEN
4876       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4877    END IF;
4878 
4879    --
4880    -- Initialize API return status to success.
4881    --
4882    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4883 
4884    --
4885    -- Begin API Body.
4886    --
4887 
4888    --
4889    -- Output debug message.
4890    --
4891    IF (AMS_DEBUG_HIGH_ON) THEN
4892       Ams_Utility_Pvt.debug_message(l_full_name||': Update');
4893    END IF;
4894 
4895    UPDATE ams_act_metrics_all
4896       SET   func_committed_value = p_func_committed_value
4897       WHERE arc_act_metric_used_by = p_arc_act_metric_used_by
4898       AND   act_metric_used_by_id = p_act_metric_used_by_id
4899       AND   metric_id = p_metric_id ;
4900    IF SQL%NOTFOUND THEN
4901       --
4902       -- The metric for the given business entity does not
4903       -- exist.  Add the proper message and raise an error.
4904       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4905    END IF;
4906 
4907    --
4908    -- End API Body.
4909    --
4910 
4911    --
4912    -- Standard check for commit request.
4913    --
4914    IF Fnd_Api.To_Boolean (p_commit) THEN
4915       COMMIT WORK;
4916    END IF;
4917 
4918 
4919    --
4920    -- Standard API to get message count, and if 1,
4921    -- set the message data OUT NOCOPY variable.
4922    --
4923    Fnd_Msg_Pub.Count_And_Get (
4924       p_count           =>    x_msg_count,
4925       p_data            =>    x_msg_data,
4926       p_encoded         =>    Fnd_Api.G_FALSE
4927    );
4928 
4929    --
4930    -- Output debug message.
4931    --
4932    IF (AMS_DEBUG_HIGH_ON) THEN
4933       Ams_Utility_Pvt.debug_message(l_full_name||': End');
4934    END IF;
4935 
4936 
4937 EXCEPTION
4938    WHEN Fnd_Api.G_EXC_ERROR THEN
4939       ROLLBACK TO SetCommittedVal_SavePoint;
4940       x_return_status := Fnd_Api.G_RET_STS_ERROR;
4941       Fnd_Msg_Pub.Count_And_Get (
4942          p_count         =>     x_msg_count,
4943          p_data          =>     x_msg_data,
4944          p_encoded       =>   FND_API.G_FALSE
4945       );
4946    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
4947       ROLLBACK TO SetCommittedVal_SavePoint;
4948       x_return_status := Fnd_Api.G_RET_STS_UNEXP_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 OTHERS THEN
4955       ROLLBACK TO SetCommittedVal_SavePoint;
4956       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4957       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
4958          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
4959       END IF;
4960       Fnd_Msg_Pub.Count_And_Get (
4961          p_count         =>     x_msg_count,
4962          p_data          =>     x_msg_data,
4963          p_encoded       =>   FND_API.G_FALSE
4964       );
4965 END SetCommittedVal;
4966 
4967 --
4968 -- End of section added by choang - 07/19/1999.
4969 --
4970 --
4971 -- NAME
4975 --    Returns whether the given ID is that of a seeded record.
4972 --    IsSeeded
4973 --
4974 -- PURPOSE
4976 --
4977 -- NOTES
4978 --    As of creation of the function, a seeded record has an ID
4979 --    less than 30,000.
4980 --
4981 -- HISTORY
4982 -- 10/15/1999   ptendulk         Created.
4983 -- 01/18/200    bgeorge         modified to check for IDs below 10000
4984 --
4985 FUNCTION IsSeeded (
4986    p_id        IN NUMBER
4987 )
4988 RETURN BOOLEAN
4989 IS
4990    CURSOR c_met_id(l_act_met_id NUMBER) IS
4991       SELECT metric_id
4992       FROM   ams_act_metrics_all
4993       WHERE activity_metric_id =l_act_met_id;
4994    l_met_rec NUMBER;
4995 BEGIN
4996 
4997   OPEN c_met_id(p_id);
4998   FETCH c_met_id INTO l_met_rec ;
4999   CLOSE c_met_id ;
5000   IF l_met_rec < 10000 THEN
5001      RETURN TRUE;
5002   END IF;
5003 
5004   RETURN FALSE;
5005 END IsSeeded;
5006 
5007 --
5008 -- NAME
5009 --    Default_Func_Currency
5010 --
5011 -- PURPOSE
5012 --    Returns the functional currency for the transaction, Will only be called
5013 --    if the Metric is Currency Metric
5014 --
5015 -- NOTES
5016 --    This function is not complete as of 10/19/1999 , Pending Issue
5017 
5018 --
5019 -- HISTORY
5020 -- 10/15/1999   ptendulk         Created.
5021 -- 08/17/2000   sveerave         modified to get the value from profile.
5022 FUNCTION Default_Func_Currency
5023 RETURN VARCHAR2
5024 IS
5025 BEGIN
5026    RETURN Fnd_Profile.Value('AMS_DEFAULT_CURR_CODE');
5027 --   RETURN 'USD';
5028 END Default_Func_Currency;
5029 
5030 ---------------------------------------------------------------------
5031 -- PROCEDURE
5032 --   check_forecasted_cost
5033 --
5034 -- PURPOSE
5035 --    Checks forecasted amount against object's budget amount, and passes out message in case it is exceeded.
5036 --
5037 -- PARAMETERS
5038         --p_obj_type    IN      VARCHAR2,
5039         --p_obj_id      IN      NUMBER,
5040         --p_category_id IN      NUMBER,
5041         --p_exceeded    OUT NOCOPY     VARCHAR2,
5042         --p_message     OUT NOCOPY     VARCHAR2)--
5043 -- NOTES
5044 --    1. Does only for cost type metrics
5045 --    2. budget will always have transaction amount. metrics will always have functional amount. So, comparisons are made
5046 --       after conversion to common currency, default func currency.
5047 ----------------------------------------------------------------------
5048 
5049 PROCEDURE check_forecasted_cost(p_obj_type      IN      VARCHAR2,
5050                                 p_obj_id        IN      NUMBER,
5051                                 p_category_id   IN      NUMBER,
5052                                 x_exceeded      OUT NOCOPY     VARCHAR2,
5053                                 x_message       OUT NOCOPY     VARCHAR2) IS
5054 
5055      -- select budget amounts for campaign
5056      CURSOR c_get_camp_budget_amounts(l_obj_id       NUMBER) IS
5057          SELECT budget_amount_tc, transaction_currency_code,
5058                budget_amount_fc, functional_currency_code
5059          FROM ams_campaigns_all_b
5060          WHERE campaign_id = l_obj_id;
5061 
5062      -- select budget amounts for campaign
5063      CURSOR c_get_csch_budget_amounts(l_obj_id       NUMBER) IS
5064          SELECT budget_amount_tc, transaction_currency_code,
5065                budget_amount_fc, functional_currency_code
5066          FROM ams_campaign_schedules_b
5067          WHERE schedule_id = l_obj_id;
5068 
5069      -- select budget amounts for event offer
5070      CURSOR c_get_eveof_budget_amounts(l_obj_id      NUMBER) IS
5071          SELECT fund_amount_tc, currency_code_tc,
5072                fund_amount_fc, currency_code_fc
5073          FROM ams_event_offers_all_b
5074          WHERE event_offer_id = l_obj_id;
5075 
5076      -- select budget amounts for event header
5077      CURSOR c_get_evehd_budget_amounts(l_obj_id      NUMBER) IS
5078          SELECT fund_amount_tc, currency_code_tc,
5079                fund_amount_fc, currency_code_fc
5080          FROM ams_event_headers_all_b
5081          WHERE event_header_id = l_obj_id;
5082 
5083      -- select budget amounts for deliverable
5084      CURSOR c_get_deliv_budget_amounts(l_obj_id      NUMBER) IS
5085          SELECT budget_amount_tc, transaction_currency_code,
5086                budget_amount_fc, functional_currency_code
5087          FROM ams_deliverables_all_b
5088          WHERE deliverable_id = l_obj_id;
5089 
5090      -- select forecasted amounts for actmetric
5091      CURSOR c_get_actmet_fore_amounts(l_obj_type     VARCHAR2,
5092                                       l_obj_id      NUMBER,
5093                                       l_category_id NUMBER) IS
5094          SELECT trans_forecasted_value,
5095                transaction_currency_code,
5096                func_forecasted_value,
5097                functional_currency_code
5098          FROM ams_act_metrics_all actmet, ams_metrics_all_b met
5099          WHERE actmet.metric_id = met.metric_id
5100           AND arc_act_metric_used_by = l_obj_type
5101           AND act_metric_used_by_id  = l_obj_id
5102           AND metric_category = l_category_id
5103           AND summarize_to_metric IS NULL
5104           AND metric_calculation_type <> 'FORMULA';
5105 
5106      l_trans_budget_curr_code        VARCHAR2(15);
5110      l_actmet_trans_curr_code        VARCHAR2(15);
5107      l_func_budget_curr_code         VARCHAR2(15);
5108      l_trans_budget_amount           NUMBER;
5109      l_func_budget_amount            NUMBER;
5111      l_actmet_func_curr_code         VARCHAR2(15);
5112      l_actmet_trans_fore_amount      NUMBER;
5113      l_actmet_func_fore_amount       NUMBER;
5114      l_sum_func_fore_amount          NUMBER := 0;
5115      l_default_func_curr_code        VARCHAR2(15);
5116      l_return_status                 VARCHAR2(1);
5117      l_top_level_exists              VARCHAR2(1) := 'F';
5118      l_current_date                  DATE := SYSDATE;
5119      l_sum_tran_fore_amount          NUMBER := 0;
5120 
5121 
5122 BEGIN
5123    -- do only for costs
5124    IF p_category_id = 901 THEN
5125       -- default x_exceeded flag
5126       x_exceeded := 'N';
5127       -- get default functional currency code
5128       l_default_func_curr_code := Default_Func_Currency;
5129 
5130       -- Get forecasted costs for the top level activity metric and sum them.
5131       OPEN c_get_actmet_fore_amounts(p_obj_type, p_obj_id, p_category_id);
5132       LOOP
5133          FETCH c_get_actmet_fore_amounts
5134             INTO l_actmet_trans_fore_amount,
5135                  l_actmet_trans_curr_code,
5136                  l_actmet_func_fore_amount,
5137                  l_actmet_func_curr_code;
5138          EXIT WHEN c_get_actmet_fore_amounts%NOTFOUND;
5139          -- convert act met currency into default currency.
5140          IF l_default_func_curr_code <> l_actmet_func_curr_code THEN
5141             Convert_Currency (
5142                       x_return_status      => l_return_status,
5143                       p_from_currency      => l_actmet_func_curr_code,
5144                       p_to_currency        => l_default_func_curr_code,
5145                       p_conv_date          => l_current_date,
5146                       p_from_amount        => NVL(l_actmet_func_fore_amount,0),
5147                       x_to_amount          => l_actmet_func_fore_amount,
5148                       p_round         => Fnd_Api.G_FALSE);
5149                  IF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
5150                          RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5151                  ELSIF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
5152                          RAISE Fnd_Api.G_EXC_ERROR;
5153                  END IF;
5154          END IF;
5155          l_sum_func_fore_amount := l_sum_func_fore_amount
5156                                     + NVL(l_actmet_func_fore_amount,0);
5157          IF (l_top_level_exists = 'F') THEN
5158             l_top_level_exists := 'T';
5159          END IF;
5160       END LOOP;
5161       CLOSE c_get_actmet_fore_amounts;
5162 
5163       -- Get the budget amounts for the passed in object
5164       -- if top level actmet record exists.
5165       IF (l_top_level_exists = 'T') THEN
5166          -- for campaigns
5167          IF p_obj_type IN ('RCAM', 'CAMP') THEN
5168               OPEN c_get_camp_budget_amounts(p_obj_id);
5169               FETCH c_get_camp_budget_amounts
5170                INTO l_trans_budget_amount,
5171                      l_trans_budget_curr_code,
5172                      l_func_budget_amount,
5173                      l_func_budget_curr_code;
5174             IF c_get_camp_budget_amounts%NOTFOUND THEN
5175                CLOSE c_get_camp_budget_amounts;
5176                RAISE Fnd_Api.G_EXC_ERROR;
5177             END IF;
5178             CLOSE c_get_camp_budget_amounts;
5179          -- for campaign schedules
5180          ELSIF p_obj_type = 'CSCH' THEN
5181               OPEN c_get_csch_budget_amounts(p_obj_id);
5182               FETCH c_get_csch_budget_amounts
5183                INTO l_trans_budget_amount,
5184                      l_trans_budget_curr_code,
5185                      l_func_budget_amount,
5186                      l_func_budget_curr_code;
5187             IF c_get_csch_budget_amounts%NOTFOUND THEN
5188                CLOSE c_get_csch_budget_amounts;
5189                RAISE Fnd_Api.G_EXC_ERROR;
5190             END IF;
5191             CLOSE c_get_csch_budget_amounts;
5192          -- for event offers
5193          ELSIF p_obj_type IN ('EONE', 'EVEO') THEN
5194             OPEN c_get_eveof_budget_amounts(p_obj_id);
5195             FETCH c_get_eveof_budget_amounts
5196                INTO l_trans_budget_amount,
5197                    l_trans_budget_curr_code,
5198                    l_func_budget_amount,
5199                    l_func_budget_curr_code;
5200             IF c_get_eveof_budget_amounts%NOTFOUND THEN
5201                CLOSE c_get_eveof_budget_amounts;
5202                RAISE Fnd_Api.G_EXC_ERROR;
5203             END IF;
5204             CLOSE c_get_eveof_budget_amounts;
5205          -- for event headers
5206          ELSIF p_obj_type = 'EVEH' THEN
5207             OPEN c_get_evehd_budget_amounts(p_obj_id);
5208             FETCH c_get_evehd_budget_amounts
5209                INTO l_trans_budget_amount,
5210                      l_trans_budget_curr_code,
5211                      l_func_budget_amount,
5212                      l_func_budget_curr_code;
5213             IF c_get_evehd_budget_amounts%NOTFOUND THEN
5214                CLOSE c_get_evehd_budget_amounts;
5215                RAISE Fnd_Api.G_EXC_ERROR;
5216             END IF;
5217             CLOSE c_get_evehd_budget_amounts;
5218          -- for deliverables
5222              INTO l_trans_budget_amount,
5219          ELSIF p_obj_type = 'DELV' THEN
5220             OPEN c_get_deliv_budget_amounts(p_obj_id);
5221             FETCH c_get_deliv_budget_amounts
5223                   l_trans_budget_curr_code,
5224                   l_func_budget_amount,
5225                   l_func_budget_curr_code;
5226             IF c_get_deliv_budget_amounts%NOTFOUND THEN
5227                CLOSE c_get_deliv_budget_amounts;
5228                RAISE Fnd_Api.G_EXC_ERROR;
5229             END IF;
5230             CLOSE c_get_deliv_budget_amounts;
5231 
5232          END IF; -- IF p_obj_type = 'CAMP'
5233 
5234          -- convert func budget currency into default currency.
5235          IF l_default_func_curr_code <> l_trans_budget_curr_code THEN
5236             Convert_Currency (
5237                    x_return_status      => l_return_status,
5238                    p_from_currency      => l_default_func_curr_code,
5239                    p_to_currency        => l_trans_budget_curr_code,
5240                    p_conv_date          => l_current_date,
5241                    p_from_amount        => NVL(l_sum_func_fore_amount,0),
5242                    x_to_amount          => l_sum_tran_fore_amount,
5243                    p_round         => Fnd_Api.G_TRUE);
5244             IF l_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
5245                RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5246             ELSIF l_return_status = Fnd_Api.G_RET_STS_ERROR THEN
5247                RAISE Fnd_Api.G_EXC_ERROR;
5248             END IF;
5249          END IF;
5250 
5251          -- compare values in the same defualt functional currency
5252          IF (NVL(l_sum_tran_fore_amount,0) > NVL(l_trans_budget_amount,0)) THEN
5253             x_exceeded := 'Y';
5254          END IF;
5255       END IF;
5256 
5257       IF x_exceeded = 'Y' THEN
5258          x_message := 'AMS_METR_EXCEED_FORECAST';
5259       END IF; --      IF x_exceeded = FND_API.G_TRUE
5260 
5261    END IF; -- IF p_category_id = 901
5262 
5263 END check_forecasted_cost;
5264 
5265 ---------------------------------------------------------------------
5266 -- PROCEDURE
5267 --   Invalidate_Rollup
5268 --
5269 -- PURPOSE
5270 --    Sets the rollup_to_metric to null when the parent object is changed.
5271 --
5272 -- PARAMETERS
5273 --    p_used_by_type
5274 --    p_used_by_id
5275 -- NOTES
5276 --    1. Set the dirty flags for all the rollup metrics so the refresh engine
5277 --       will recalculate.
5278 --    2. Set the rollup_to_metric field to NULL because the associations have
5279 --       changed.  This will make the refresh engine recalculate the
5280 --       rollup associations.
5281 --    3. When the hierarchy of business objects gets changed including deletion
5282 --       and modification, this stored procedure needs to be called for the
5283 --       child business object. For example, when a user modifies the parent
5284 --       of a campaign, call this procedure against the child campaign.
5285 --       Another example, when a user changes an event associated with a
5286 --       campaign, call this stored procedure for old event object. One more
5287 --       example, when a user delete a deliverable from a campaign, call this
5288 --       stored procedure for the deliverable being deleted. You do not need
5289 --       to call this module when you add parent or child
5290 --       to a businness object.
5291 ----------------------------------------------------------------------
5292 PROCEDURE Invalidate_Rollup(
5293    p_api_version       IN  NUMBER,
5294    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
5295    p_commit            IN  VARCHAR2 := Fnd_Api.G_FALSE,
5296 
5297    x_return_status     OUT NOCOPY VARCHAR2,
5298    x_msg_count         OUT NOCOPY NUMBER,
5299    x_msg_data          OUT NOCOPY VARCHAR2,
5300 
5301    p_used_by_type      IN VARCHAR2,
5302    p_used_by_id        IN NUMBER
5303 )
5304 IS
5305 
5306    L_API_VERSION    CONSTANT NUMBER := 1.0;
5307    L_API_NAME       CONSTANT VARCHAR2(30) := 'INVALIDATE_ROLLUP';
5308    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5309 
5310    l_return_status  VARCHAR2(1);
5311 
5312    CURSOR c_find_rollups(l_used_by_type VARCHAR2, l_used_by_id NUMBER) IS
5313        SELECT activity_metric_id
5314          FROM ams_act_metrics_all
5315         WHERE arc_act_metric_used_by = l_used_by_type
5316          AND act_metric_used_by_id = l_used_by_id
5317          AND rollup_to_metric IS NOT NULL;
5318    l_act_metrics_rec c_find_rollups%ROWTYPE;
5319 
5320    l_used_by_type VARCHAR2(100) := p_used_by_type;
5321 BEGIN
5322    IF (AMS_DEBUG_HIGH_ON) THEN
5323 
5324    Ams_Utility_Pvt.debug_message('Invalidating object: '||p_used_by_type||
5325                         ', '||p_used_by_id);
5326    END IF;
5327 
5328    --
5329    -- Initialize savepoint.
5330    --
5331    SAVEPOINT invalidate_rollup_pvt;
5332    --
5333    -- Output debug message.
5334    --
5335    IF (AMS_DEBUG_HIGH_ON) THEN
5336 
5337    Ams_Utility_Pvt.debug_message(l_full_name||': START');
5338    END IF;
5339 
5340    --
5341    -- Initialize message list if p_init_msg_list is set to TRUE.
5342    --
5343    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
5344       Fnd_Msg_Pub.Initialize;
5345    END IF;
5346 
5347    --
5348    -- Standard check for API version compatibility.
5349    --
5350    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
5351                                        p_api_version,
5355       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5352                                        L_API_NAME,
5353                                        G_PKG_NAME)
5354    THEN
5356    END IF;
5357 
5358    --
5359    -- Initialize API return status to success.
5360    --
5361    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5362 
5363    --
5364    -- Begin API Body
5365    --
5366 
5367    FOR l_act_metrics_rec IN c_find_rollups(l_used_by_type, p_used_by_id)
5368    LOOP
5369       Make_Actmetric_Dirty(l_act_metrics_rec.activity_metric_id);
5370    END LOOP;
5371 
5372    UPDATE ams_act_metrics_all
5373       SET rollup_to_metric = NULL
5374     WHERE arc_act_metric_used_by = l_used_by_type
5375       AND act_metric_used_by_id = p_used_by_id
5376       AND rollup_to_metric IS NOT NULL;
5377 
5378    IF Fnd_Api.to_boolean(p_commit) THEN
5379       COMMIT;
5380    END IF;
5381 
5382    --
5383    -- Standard API to get message count, and if 1,
5384    -- set the message data OUT NOCOPY variable.
5385    --
5386    Fnd_Msg_Pub.Count_And_Get (
5387       p_count           =>    x_msg_count,
5388       p_data            =>    x_msg_data,
5389       p_encoded         =>    Fnd_Api.G_FALSE
5390    );
5391 
5392    --
5393    -- Debug message.
5394    --
5395    IF (AMS_DEBUG_HIGH_ON) THEN
5396 
5397    Ams_Utility_Pvt.debug_message(l_full_name ||': END');
5398    END IF;
5399 
5400 EXCEPTION
5401    WHEN Fnd_Api.G_EXC_ERROR THEN
5402       ROLLBACK TO Invalidate_Rollup_pvt;
5403       x_return_status := Fnd_Api.G_RET_STS_ERROR;
5404       Fnd_Msg_Pub.Count_And_Get (
5405          p_count         =>     x_msg_count,
5406          p_data          =>     x_msg_data,
5407          p_encoded       =>   FND_API.G_FALSE
5408       );
5409    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
5410       ROLLBACK TO Invalidate_Rollup_pvt;
5411       x_return_status := Fnd_Api.G_RET_STS_UNEXP_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 OTHERS THEN
5418       ROLLBACK TO Invalidate_Rollup_pvt;
5419       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5420       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
5421          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
5422       END IF;
5423       Fnd_Msg_Pub.Count_And_Get (
5424          p_count         =>     x_msg_count,
5425          p_data          =>     x_msg_data,
5426          p_encoded       =>   FND_API.G_FALSE
5427       );
5428 END Invalidate_Rollup;
5429 
5430 -- Start of comments
5431 -- NAME
5432 --    Post_Costs
5433 --
5434 -- PURPOSE
5435 --   Post costs to the budget.
5436 --
5437 -- NOTES
5438 --
5439 -- HISTORY
5440 --   06/01/2001  DMVINCEN Created
5441 
5442 -- End of comments
5443 
5444 PROCEDURE Post_Costs (
5445    p_api_version                IN  NUMBER,
5446    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
5447    p_commit                     IN  VARCHAR2 := Fnd_Api.G_FALSE,
5448    p_validation_level           IN  NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
5449 
5450    x_return_status              OUT NOCOPY VARCHAR2,
5451    x_msg_count                  OUT NOCOPY NUMBER,
5452    x_msg_data                   OUT NOCOPY VARCHAR2,
5453 
5454    p_obj_type                   IN  VARCHAR2,
5455    p_obj_id                     IN  NUMBER
5456 )
5457 IS
5458    L_API_VERSION    CONSTANT NUMBER := 1.0;
5459    L_API_NAME       CONSTANT VARCHAR2(30) := 'POST_COSTS';
5460    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5461 
5462    CURSOR c_get_post_metrics(l_obj_type VARCHAR2, l_obj_id NUMBER) IS
5463       SELECT activity_metric_id,
5464              func_actual_value,
5465              '' description,
5466              functional_currency_code
5467         FROM ams_act_metrics_all amet
5468        WHERE arc_act_metric_used_by = l_obj_type
5469          AND act_metric_used_by_id = l_obj_id
5470          AND (published_flag IS NULL OR published_flag = 'N')
5471          AND EXISTS
5472              (SELECT 'x' FROM ams_metrics_all_b met
5473                WHERE met.metric_id = amet.metric_id
5474                  AND metric_calculation_type IN
5475                   ('FUNCTION', 'MANUAL')
5476                  AND metric_category = 901) -- Costs only
5477       FOR UPDATE OF published_flag NOWAIT;
5478 
5479    l_cost_table OZF_Fund_Adjustment_Pvt.cost_tbl_type;
5480    l_cost_rec OZF_Fund_Adjustment_Pvt.cost_rec_type;
5481    l_func_currency VARCHAR2(30);
5482 
5483 BEGIN
5484    IF (AMS_DEBUG_HIGH_ON) THEN
5485       Ams_Utility_Pvt.debug_message('Now posting costs FOR object: '||p_obj_type||':'||p_obj_id);
5486    END IF;
5487 
5488    --
5489    -- Initialize savepoint.
5490    --
5491    SAVEPOINT Post_ActMetric_pvt;
5492    --
5493    -- Output debug message.
5494    --
5495    IF (AMS_DEBUG_HIGH_ON) THEN
5496       Ams_Utility_Pvt.debug_message(l_full_name||': START');
5497    END IF;
5498 
5499    --
5500    -- Initialize message list if p_init_msg_list is set to TRUE.
5501    --
5505 
5502    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
5503       Fnd_Msg_Pub.Initialize;
5504    END IF;
5506    --
5507    -- Standard check for API version compatibility.
5508    --
5509    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
5510                                        p_api_version,
5511                                        L_API_NAME,
5512                                        G_PKG_NAME)
5513    THEN
5514       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5515    END IF;
5516 
5517    --
5518    -- Initialize API return status to success.
5519    --
5520    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5521 
5522    --
5523    -- Begin API Body
5524    --
5525 
5526    OPEN c_get_post_metrics(p_obj_type, p_obj_id);
5527    LOOP
5528       FETCH c_get_post_metrics INTO l_cost_rec;
5529       EXIT WHEN c_get_post_metrics%NOTFOUND;
5530 
5531       l_func_currency := l_cost_rec.cost_curr;
5532       l_cost_table(c_get_post_metrics%ROWCOUNT) := l_cost_rec;
5533 
5534       UPDATE ams_act_metrics_all
5535          SET published_flag = 'Y'
5536        WHERE CURRENT OF c_get_post_metrics;
5537 
5538    END LOOP;
5539    CLOSE c_get_post_metrics;
5540 
5541    IF l_cost_table.COUNT > 0 THEN
5542       OZF_Fund_Adjustment_Pvt.create_budget_amt_utilized(
5543          p_budget_used_by_id   => p_obj_id,
5544          p_budget_used_by_type => p_obj_type,
5545          p_currency            => l_func_currency,
5546          p_cost_tbl            => l_cost_table,
5547          p_api_version         => l_api_version,
5548          x_return_status       => x_return_status,
5549          x_msg_count           => x_msg_count,
5550          x_msg_data            => x_msg_data);
5551    END IF;
5552 
5553    --
5554    -- End API Body
5555    --
5556 
5557    IF Fnd_Api.to_boolean(p_commit) THEN
5558       COMMIT;
5559    END IF;
5560 
5561    --
5562    -- Standard API to get message count, and if 1,
5563    -- set the message data OUT NOCOPY variable.
5564    --
5565    Fnd_Msg_Pub.Count_And_Get (
5566       p_count           =>    x_msg_count,
5567       p_data            =>    x_msg_data,
5568       p_encoded         =>    Fnd_Api.G_FALSE
5569    );
5570 
5571    --
5572    -- Debug message.
5573    --
5574    IF (AMS_DEBUG_HIGH_ON) THEN
5575       Ams_Utility_Pvt.debug_message(l_full_name ||': END');
5576    END IF;
5577 
5578 
5579 EXCEPTION
5580    WHEN Fnd_Api.G_EXC_ERROR THEN
5581       ROLLBACK TO Post_ActMetric_pvt;
5582       x_return_status := Fnd_Api.G_RET_STS_ERROR;
5583       Fnd_Msg_Pub.Count_And_Get (
5584          p_count         =>     x_msg_count,
5585          p_data          =>     x_msg_data,
5586          p_encoded       =>   FND_API.G_FALSE
5587       );
5588    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
5589       ROLLBACK TO Post_ActMetric_pvt;
5590       x_return_status := Fnd_Api.G_RET_STS_UNEXP_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 OTHERS THEN
5597       ROLLBACK TO Post_ActMetric_pvt;
5598       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5599       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
5600          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
5601       END IF;
5602       Fnd_Msg_Pub.Count_And_Get (
5603          p_count         =>     x_msg_count,
5604          p_data          =>     x_msg_data,
5605          p_encoded       =>   FND_API.G_FALSE
5606       );
5607 END Post_Costs;
5608 
5609 --
5610 -- Procedure
5611 --   get_info
5612 --
5613 -- Purpose
5614 --  Gets the currency type information about given currency.
5615 --    Also set the x_invalid_currency flag if the given currency is invalid.
5616 --
5617 -- History
5618 --   15-JUL-97  W Wong   Created
5619 --   10-JUL-01  dmvincen Transfered here from GL_CURRENCY_API
5620 --
5621 -- Arguments
5622 --   x_currency    Currency to be checked
5623 --   x_eff_date    Effecitve date
5624 --   x_conversion_rate   Fixed rate for conversion
5625 --   x_mau                    Minimum accountable unit
5626 --   x_currency_type     Type of currency specified in x_currency
5627 --
5628 PROCEDURE get_info(
5629    x_currency        VARCHAR2,
5630    x_mau       IN OUT NOCOPY   NUMBER,
5631    x_xau       IN OUT NOCOPY   NUMBER ) IS
5632 
5633 BEGIN
5634    -- Get currency information from FND_CURRENCIES table
5635    SELECT NVL( minimum_accountable_unit, POWER( 10, (-1 * PRECISION))),
5636       POWER( 10, (-1 * EXTENDED_PRECISION))
5637    INTO   x_mau, x_xau
5638    FROM   FND_CURRENCIES
5639    WHERE  currency_code = x_currency;
5640 
5641 EXCEPTION
5642    WHEN NO_DATA_FOUND THEN
5643       RAISE Gl_Currency_Api.INVALID_CURRENCY;
5644 
5645 END get_info;
5646 
5647 ---------------------------------------------------------------------
5648 -- PROCEDURE
5649 --    Convert_Currency
5650 -- DESCRIPTION
5651 --    This procedure is copied from GL_CURRENCY_API so that rounding can be
5652 --    controlled.  The functional currency need not be rounded because
5656 --    Modified from code done by ptendulk, and choang.
5653 --    precision will be lost when converting to other currencies.
5654 --    The displayed currencies must be rounded.
5655 -- NOTE
5657 -- HISTORY
5658 -- 09-Aug-2001 dmvincen      Created.
5659 ---------------------------------------------------------------------
5660 PROCEDURE Convert_Currency (
5661    x_return_status      OUT NOCOPY VARCHAR2,
5662    p_from_currency      IN  VARCHAR2,
5663    p_to_currency        IN  VARCHAR2,
5664    p_conv_date          IN  DATE,
5665    p_from_amount        IN  NUMBER,
5666    x_to_amount          OUT NOCOPY NUMBER,
5667    p_round              IN VARCHAR2
5668 )
5669 IS
5670    l_from_dummy  NUMBER := NULL;
5671    l_to_dummy    NUMBER;
5672 BEGIN
5673    Convert_Currency2(
5674       x_return_status => x_return_status,
5675       p_from_currency => p_from_currency,
5676       p_to_currency   => p_to_currency,
5677       p_conv_date     => p_conv_date,
5678       p_from_amount   => p_from_amount,
5679       x_to_amount     => x_to_amount,
5680       p_from_amount2  => l_from_dummy,
5681       x_to_amount2    => l_to_dummy,
5682       p_round         => p_round);
5683 END Convert_Currency;
5684 
5685 ---------------------------------------------------------------------
5686 -- PROCEDURE
5687 --    Convert_Currency2
5688 -- DESCRIPTION
5689 --    This procedure is copied from GL_CURRENCY_API so that rounding can be
5690 --    controlled.  The functional currency need not be rounded because
5691 --    precision will be lost when converting to other currencies.
5692 --    The displayed currencies must be rounded.
5693 -- NOTE
5694 --    Modified from code done by ptendulk, and choang.
5695 -- HISTORY
5696 -- 09-Aug-2001 dmvincen      Created.
5697 -- 18-Dec-2001 dmvincen      Removed rounding when p_round is false.
5698 ---------------------------------------------------------------------
5699 PROCEDURE Convert_Currency2 (
5700    x_return_status      OUT NOCOPY VARCHAR2,
5701    p_from_currency      IN  VARCHAR2,
5702    p_to_currency        IN  VARCHAR2,
5703    p_conv_date          IN  DATE,
5704    p_from_amount        IN  NUMBER,
5705    x_to_amount          OUT NOCOPY NUMBER,
5706    p_from_amount2       IN  NUMBER,
5707    x_to_amount2         OUT NOCOPY NUMBER,
5708    p_round              IN VARCHAR2
5709 )
5710 IS
5711    L_CONVERSION_TYPE_PROFILE  CONSTANT VARCHAR2(30) := 'AMS_CURR_CONVERSION_TYPE';
5712    L_MAX_ROLL_DAYS         CONSTANT NUMBER := -1;  -- Negative so API rolls back to find the last conversion rate.
5713    l_denominator           NUMBER;  -- Not used in Marketing.
5714    l_numerator             NUMBER;  -- Not used in Marketing.
5715    l_rate                  NUMBER;  -- Not used in Marketing.
5716    to_rate                 NUMBER;
5717    to_mau                  NUMBER;
5718    to_xau                  NUMBER;
5719    to_type                 VARCHAR2(8);
5720    l_conversion_type       VARCHAR2(30);  -- Currency conversion type; see API documention for details.
5721 BEGIN
5722    -- Initialize return status.
5723    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5724 
5725    -- Get the currency conversion type from profile option
5726    l_conversion_type := Fnd_Profile.Value (L_CONVERSION_TYPE_PROFILE);
5727 
5728    -- Check if both currencies are identical
5729    IF ( p_from_currency = p_to_currency ) THEN
5730 --       l_denominator      := 1;
5731 --       l_numerator        := 1;
5732 --       l_rate             := 1;
5733       IF p_round = Fnd_Api.G_TRUE THEN
5734          get_info( p_to_currency, to_mau, to_xau );
5735          IF p_from_amount IS NOT NULL THEN
5736             x_to_amount := ROUND( p_from_amount / to_mau ) * to_mau;
5737          END IF;
5738          IF p_from_amount2 IS NOT NULL THEN
5739             x_to_amount2 := ROUND( p_from_amount2 / to_mau ) * to_mau;
5740          END IF;
5741       ELSE
5742           x_to_amount := p_from_amount;
5743           x_to_amount2 := p_from_amount2;
5744       END IF;
5745       RETURN;
5746    END IF;
5747 
5748    -- Get currency information from the to_currency ( for use in rounding )
5749    get_info ( p_to_currency, to_mau, to_xau );
5750 
5751    --
5752    -- Find out the conversion rate using the given conversion type
5753    -- and conversion date.
5754    --
5755    Gl_Currency_Api.get_closest_triangulation_rate(
5756                      p_from_currency,
5757                      p_to_currency,
5758                      p_conv_date,
5759                      l_conversion_type,
5760                      L_MAX_ROLL_DAYS,
5761                      l_denominator,
5762                      l_numerator,
5763                      l_rate );
5764 
5765    -- Calculate the converted amount using triangulation method
5766    x_to_amount := ( p_from_amount / l_denominator ) * l_numerator;
5767    x_to_amount2 := ( p_from_amount2 / l_denominator ) * l_numerator;
5768 
5769    IF p_round = Fnd_Api.G_TRUE THEN
5770       -- Rounding to the correct precision and minumum accountable units
5771       x_to_amount := ROUND( x_to_amount / to_mau ) * to_mau;
5772       x_to_amount2 := ROUND( x_to_amount2 / to_mau ) * to_mau;
5773    END IF;
5774 
5775 EXCEPTION
5776    WHEN Gl_Currency_Api.NO_RATE THEN
5777       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
5778          Fnd_Message.Set_Name ('AMS', 'AMS_NO_RATE');
5779          Fnd_Message.Set_Token ('CURRENCY_FROM', p_from_currency);
5783       x_return_status := Fnd_Api.G_RET_STS_ERROR;
5780          Fnd_Message.Set_Token ('CURRENCY_TO', p_to_currency);
5781          Fnd_Msg_Pub.ADD;
5782       END IF;
5784    WHEN Gl_Currency_Api.INVALID_CURRENCY THEN
5785       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
5786          Fnd_Message.Set_Name ('AMS', 'AMS_INVALID_CURR');
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 END Convert_Currency2;
5793 
5794 ---------------------------------------------------------------------
5795 -- PROCEDURE
5796 --    Convert_Currency_Vector
5797 -- DESCRIPTION
5798 --    This procedure is copied from GL_CURRENCY_API so that rounding can be
5799 --    controlled.  The functional currency need not be rounded because
5800 --    precision will be lost when converting to other currencies.
5801 --    The displayed currencies must be rounded.
5802 --    Supports converting a vector of currency amount.
5803 -- NOTE
5804 --    Modified from code done by ptendulk, and choang.
5805 -- HISTORY
5806 -- 05-Dec-2001 dmvincen      Created.
5807 -- 18-Dec-2001 dmvincen      Removed unnecessary rounding.
5808 ---------------------------------------------------------------------
5809 PROCEDURE Convert_Currency_Vector (
5810    x_return_status      OUT NOCOPY VARCHAR2,
5811    p_from_currency      IN  VARCHAR2,
5812    p_to_currency        IN  VARCHAR2,
5813    p_conv_date          IN  DATE,
5814    p_amounts            IN OUT NOCOPY CURRENCY_TABLE,
5815    p_round              IN VARCHAR2
5816 )
5817 IS
5818    L_CONVERSION_TYPE_PROFILE  CONSTANT VARCHAR2(30) := 'AMS_CURR_CONVERSION_TYPE';
5819    L_MAX_ROLL_DAYS         CONSTANT NUMBER := -1;  -- Negative so API rolls back to find the last conversion rate.
5820    l_denominator           NUMBER := 1;
5821    l_numerator             NUMBER := 1;
5822    l_rate                  NUMBER := 1;
5823    to_rate                 NUMBER;
5824    to_mau                  NUMBER;
5825    to_xau                  NUMBER;
5826    to_type                 VARCHAR2(8);
5827    l_conversion_type       VARCHAR2(30);  -- Currency conversion type; see API documention for details.
5828    l_index                 NUMBER;
5829 BEGIN
5830    -- Initialize return status.
5831    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5832 
5833    -- Get the currency conversion type from profile option
5834    l_conversion_type := Fnd_Profile.Value (L_CONVERSION_TYPE_PROFILE);
5835 
5836    -- Check if both currencies are identical
5837    IF ( p_from_currency <> p_to_currency ) THEN
5838       --
5839       -- Find out the conversion rate using the given conversion type
5840       -- and conversion date.
5841       --
5842       Gl_Currency_Api.get_closest_triangulation_rate(
5843                         p_from_currency,
5844                         p_to_currency,
5845                         p_conv_date,
5846                         l_conversion_type,
5847                         L_MAX_ROLL_DAYS,
5848                         l_denominator,
5849                         l_numerator,
5850                         l_rate );
5851    END IF;
5852 
5853    get_info( p_to_currency, to_mau, to_xau );
5854 
5855    l_index := p_amounts.first;
5856    LOOP
5857       EXIT WHEN l_index IS NULL;
5858       IF p_amounts.EXISTS(l_index) AND p_amounts(l_index) IS NOT NULL THEN
5859          p_amounts(l_index) := ( p_amounts(l_index) / l_denominator ) * l_numerator;
5860          IF p_round = Fnd_Api.G_TRUE THEN
5861             p_amounts(l_index) := ROUND( p_amounts(l_index) / to_mau ) * to_mau;
5862          END IF;
5863       END IF;
5864       l_index := p_amounts.NEXT(l_index);
5865    END LOOP;
5866 
5867 EXCEPTION
5868    WHEN Gl_Currency_Api.NO_RATE THEN
5869       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
5870          Fnd_Message.Set_Name ('AMS', 'AMS_NO_RATE');
5871          Fnd_Message.Set_Token ('CURRENCY_FROM', p_from_currency);
5872          Fnd_Message.Set_Token ('CURRENCY_TO', p_to_currency);
5873          Fnd_Msg_Pub.ADD;
5874       END IF;
5875       x_return_status := Fnd_Api.G_RET_STS_ERROR;
5876    WHEN Gl_Currency_Api.INVALID_CURRENCY THEN
5877       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
5878          Fnd_Message.Set_Name ('AMS', 'AMS_INVALID_CURR');
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 END Convert_Currency_Vector;
5885 
5886 ---------------------------------------------------------------------
5887 -- PROCEDURE
5888 --    Convert_Currency_Object
5889 -- DESCRIPTION
5890 --    This procedure is copied from GL_CURRENCY_API so that rounding can be
5891 --    controlled.  The functional currency need not be rounded because
5892 --    precision will be lost when converting to other currencies.
5893 --    The displayed currencies must be rounded.
5894 --    Supports converting amount to transaction currency of object.
5895 -- NOTE
5896 --    Modified from code done by ptendulk, and choang.
5897 -- HISTORY
5898 -- 05-Dec-2001 dmvincen      Created.
5902    p_object_id          IN  NUMBER,
5899 ---------------------------------------------------------------------
5900 PROCEDURE Convert_Currency_Object (
5901    x_return_status      OUT NOCOPY VARCHAR2,
5903    p_object_type        IN  VARCHAR2,
5904    p_conv_date          IN  DATE,
5905    p_amounts            IN OUT NOCOPY CURRENCY_TABLE,
5906    p_round              IN VARCHAR2
5907 )
5908 IS
5909    l_func_currency VARCHAR2(15);
5910    l_trans_currency VARCHAR2(15);
5911 BEGIN
5912    l_func_currency := Default_Func_Currency;
5913    Get_Trans_curr_code(p_object_id, p_object_type, l_trans_currency);
5914    Convert_Currency_Vector (
5915       x_return_status      => x_return_status,
5916       p_from_currency      => l_func_currency,
5917       p_to_currency        => l_trans_currency,
5918       p_conv_date          => p_conv_date,
5919       p_amounts            => p_amounts,
5920       p_round              => p_round);
5921 END Convert_Currency_Object;
5922 
5923 ---------------------------------------------------------------------
5924 -- PROCEDURE
5925 --    Convert_to_trans_value
5926 -- DESCRIPTION
5927 --    For chart support to convert to transaction value within a query.
5928 -- NOTE
5929 -- HISTORY
5930 -- 19-APR-2004 dmvincen      Created.
5931 ---------------------------------------------------------------------
5932 FUNCTION convert_to_trans_value(
5933    p_func_value in NUMBER,
5934    p_object_type in VARCHAR2,
5935    p_object_id in NUMBER,
5936    p_display_type in VARCHAR2
5937    )
5938 RETURN NUMBER
5939 IS
5940   l_trans_curr_code VARCHAR2(15);
5941   l_func_curr_code VARCHAR2(15);
5942   l_return_value NUMBER;
5943   l_return_status VARCHAR2(1);
5944 BEGIN
5945  IF (p_display_type = 'CURRENCY')
5946  THEN
5947     get_trans_curr_code(p_object_id,p_object_type,l_trans_curr_code);
5948     l_func_curr_code := default_func_currency;
5949     IF (NVL(l_trans_curr_code,'NULL') <> NVL(l_func_curr_code,'NULL'))
5950     THEN
5951        convert_currency(
5952                   x_return_status   => l_return_status,
5953                   p_from_currency   => l_func_curr_code,
5954                   p_to_currency     => l_trans_curr_code,
5955                   p_from_amount     => NVL(p_func_value,0),
5956                   x_to_amount       => l_return_value,
5957                   p_round           => Fnd_Api.G_TRUE
5958        );
5959     ELSE
5960        l_return_value := p_func_value;
5961     END IF;
5962  ELSIF (p_display_type = 'PERCENT')
5963  THEN
5964     l_return_value := p_func_value * 100;
5965  ELSE -- INTEGER
5966     l_return_value := p_func_value;
5967  END IF;
5968  return l_return_value;
5969 END;
5970 
5971 ---------------------------------------------------------------------
5972 -- PROCEDURE
5973 --    Record_History
5974 -- DESCRIPTION
5975 --    Record changes in the activity metrics for a historical record.
5976 --    Functional values are the only significant items.
5977 --    Historical records are record once per day.  The last value of the
5978 --    day is stored.
5979 --    p_action is in G_CREATE, G_UPDATE, G_DELETE
5980 -- NOTE
5981 -- HISTORY
5982 -- 20-NOV-2001 dmvincen      Created.
5983 -- 06-FEB-2002 dmvincen      BUG2214496: Corrected history delta calculation.
5984 ---------------------------------------------------------------------
5985 PROCEDURE Record_History(
5986    p_actmet_id                  IN NUMBER,
5987    p_action                     IN VARCHAR2,
5988    x_return_status              OUT NOCOPY VARCHAR2,
5989    x_msg_count                  OUT NOCOPY NUMBER,
5990    x_msg_data                   OUT NOCOPY VARCHAR2
5991 )
5992 IS
5993    L_API_VERSION    CONSTANT NUMBER := 1.0;
5994    L_API_NAME       CONSTANT VARCHAR2(30) := 'Record_History';
5995    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5996 
5997    -- find the most recent fact record for the activity metric id.
5998    CURSOR c_get_history_by_id(l_act_metric_id NUMBER) IS
5999       SELECT func_forecasted_value, func_actual_value, functional_currency_code,
6000              last_update_date, act_met_hst_id, object_version_number,
6001              func_forecasted_delta, func_actual_delta
6002       FROM ams_act_metric_hst
6003       WHERE activity_metric_id = l_act_metric_id
6004       AND last_update_date =
6005           (SELECT MAX(last_update_date)
6006             FROM ams_act_metric_hst
6007             WHERE activity_metric_id = l_act_metric_id);
6008 
6009    CURSOR c_actmet_details(l_act_metric_id NUMBER) IS
6010        SELECT  activity_metric_id,
6011                  last_update_date,
6012                  last_updated_by,
6013                  creation_date,
6014                  created_by,
6015                  last_update_login,
6016                  object_version_number,
6017                  act_metric_used_by_id,
6018                  arc_act_metric_used_by,
6019                  purchase_req_raised_flag,
6020                  application_id,
6021                  sensitive_data_flag,
6022                  budget_id,
6023                  metric_id,
6024                  transaction_currency_code,
6025                  trans_forecasted_value,
6026                  trans_committed_value,
6027                  trans_actual_value,
6028                  functional_currency_code,
6029                  func_forecasted_value,
6030                  dirty_flag,
6034                  variable_value,
6031                  func_committed_value,
6032                  func_actual_value,
6033                  last_update_date,
6035                  forecasted_variable_value,
6036                  computed_using_function_value,
6037                  metric_uom_code,
6038                  org_id,
6039                  difference_since_last_calc,
6040                  activity_metric_origin_id,
6041                  arc_activity_metric_origin,
6042                  days_since_last_refresh,
6043                  scenario_id,
6044                  SUMMARIZE_TO_METRIC,
6045                  ROLLUP_TO_METRIC,
6046                  hierarchy_id,
6047                  start_node,
6048                  from_level,
6049                  to_level,
6050                  from_date,
6051                  TO_DATE,
6052                  amount1,
6053                  amount2,
6054                  amount3,
6055                  percent1,
6056                  percent2,
6057                  percent3,
6058                  published_flag,
6059                  pre_function_name ,
6060                  post_function_name,
6061                  attribute_category,
6062                  attribute1,
6063                  attribute2,
6064                  attribute3,
6065                  attribute4,
6066                  attribute5,
6067                  attribute6,
6068                  attribute7,
6069                  attribute8,
6070                  attribute9,
6071                  attribute10,
6072                  attribute11,
6073                  attribute12,
6074                  attribute13,
6075                  attribute14,
6076                  attribute15,
6077                  description,
6078                  act_metric_date,
6079                  depend_act_metric,
6080                  function_used_by_id,
6081                  arc_function_used_by,
6082                  /* 05/15/2002 yzhao: add 6 new columns for top-down bottom-up budgeting */
6083                  hierarchy_type,
6084                  status_code,
6085                  method_code,
6086                  action_code,
6087                  basis_year,
6088                  ex_start_node
6089                  /* 05/15/2002 yzhao: add ends */
6090      FROM ams_act_metrics_all
6091      WHERE activity_metric_id = l_act_metric_id;
6092 
6093    CURSOR c_get_new_history_id IS
6094       SELECT ams_act_metric_hst_s.NEXTVAL
6095       FROM dual;
6096 
6097    CURSOR c_check_history_id(l_test_id NUMBER) IS
6098       SELECT COUNT(*)
6099       FROM ams_act_metric_hst
6100       WHERE act_met_hst_id = l_test_id;
6101 
6102    l_func_forecasted_value NUMBER;
6103    l_func_actual_value NUMBER;
6104    l_functional_currency_code VARCHAR2(15);
6105    l_last_update_date DATE;
6106    l_new_record CHAR(1) := FND_API.G_FALSE;
6107    l_act_met_hst_id NUMBER;
6108    l_history_id_count NUMBER;
6109    l_object_version_number NUMBER;
6110    l_func_forecasted_delta NUMBER;
6111    l_func_actual_delta NUMBER;
6112    l_today DATE;
6113    l_actmet_rec act_metric_rec_type;
6114    error_message VARCHAR2(2000);
6115 BEGIN
6116 
6117    --
6118    -- Initialize API return status to success.
6119    --
6120    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6121 
6122    OPEN c_actmet_details(p_actmet_id);
6123    FETCH c_actmet_details INTO l_actmet_rec;
6124    IF c_actmet_details%NOTFOUND THEN
6125       CLOSE c_actmet_details;
6126       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
6127    END IF;
6128    CLOSE c_actmet_details;
6129 
6130    -- BUG2813600: Delete history, set to current date and zero.
6131    IF p_action = G_DELETE THEN
6132       l_actmet_rec.last_update_date := SYSDATE;
6133       l_actmet_rec.func_forecasted_value := 0;
6134       l_actmet_rec.trans_forecasted_value := 0;
6135       l_actmet_rec.func_actual_value := 0;
6136       l_actmet_rec.trans_actual_value := 0;
6137       l_actmet_rec.func_committed_value := 0;
6138       l_actmet_rec.trans_committed_value := 0;
6139       l_actmet_rec.VARIABLE_VALUE := 0;
6140       l_actmet_rec.FORECASTED_VARIABLE_VALUE := 0;
6141       l_actmet_rec.COMPUTED_USING_FUNCTION_VALUE := 0;
6142    END IF;
6143    -- BUG2813600: end.
6144 
6145    IF p_action = G_CREATE THEN
6146       l_new_record := FND_API.G_TRUE;
6147       l_func_forecasted_delta := NVL(l_actmet_rec.func_forecasted_value,0);
6148       l_func_actual_delta := NVL(l_actmet_rec.func_actual_value,0);
6149    ELSE
6150       OPEN c_get_history_by_id(p_actmet_id);
6151       FETCH c_get_history_by_id
6152          INTO l_func_forecasted_value,
6153               l_func_actual_value,
6154               l_functional_currency_code,
6155               l_last_update_date,
6156               l_act_met_hst_id,
6157               l_object_version_number,
6158               l_func_forecasted_delta,
6159               l_func_actual_delta;
6160       IF c_get_history_by_id%NOTFOUND THEN
6161          l_new_record := FND_API.G_TRUE;
6162       END IF;
6163       CLOSE c_get_history_by_id;
6164    END IF;
6165 
6166    -- Validate a change since the last fact.
6167    IF l_new_record = FND_API.G_FALSE AND
6168       (p_action = G_DELETE OR
6169        NVL(l_func_forecasted_value,0) <>
6173             NVL(l_actmet_rec.functional_currency_code,'NULL'))
6170             NVL(l_actmet_rec.func_forecasted_value,0) OR
6171        NVL(l_func_actual_value,0) <> NVL(l_actmet_rec.func_actual_value,0) OR
6172        NVL(l_functional_currency_code,'NULL') <>
6174    THEN
6175       -- If change occurs within the same day as last, update.
6176       IF TRUNC(l_last_update_date) = TRUNC(l_actmet_rec.last_update_date)
6177       THEN
6178          -- update the current history record.
6179          -- l_actmet_rec := p_actmet_rec;
6180          -- BUG2214496: Wrap values with nvl.
6181          l_func_forecasted_delta := NVL(l_func_forecasted_delta,0) +
6182                                     NVL(l_actmet_rec.func_forecasted_value,0) -
6183                                     NVL(l_func_forecasted_value,0);
6184          l_func_actual_delta := NVL(l_func_actual_delta,0) +
6185                                 NVL(l_actmet_rec.func_actual_value,0) -
6186                                 NVL(l_func_actual_value,0);
6187          UPDATE ams_act_metric_hst
6188          SET LAST_UPDATE_DATE = l_actmet_rec.LAST_UPDATE_DATE,
6189             LAST_UPDATED_BY = l_actmet_rec.LAST_UPDATED_BY,
6190             CREATION_DATE = l_actmet_rec.CREATION_DATE,
6191             CREATED_BY = l_actmet_rec.CREATED_BY,
6192             LAST_UPDATE_LOGIN = l_actmet_rec.LAST_UPDATE_LOGIN,
6193             OBJECT_VERSION_NUMBER = l_actmet_rec.OBJECT_VERSION_NUMBER,
6194             ACT_METRIC_USED_BY_ID = l_actmet_rec.ACT_METRIC_USED_BY_ID,
6195             ARC_ACT_METRIC_USED_BY = l_actmet_rec.ARC_ACT_METRIC_USED_BY,
6196             APPLICATION_ID = l_actmet_rec.APPLICATION_ID,
6197             METRIC_ID = l_actmet_rec.METRIC_ID,
6198             TRANSACTION_CURRENCY_CODE = l_actmet_rec.TRANSACTION_CURRENCY_CODE,
6199             TRANS_FORECASTED_VALUE = l_actmet_rec.TRANS_FORECASTED_VALUE,
6200             TRANS_COMMITTED_VALUE = l_actmet_rec.TRANS_COMMITTED_VALUE,
6201             TRANS_ACTUAL_VALUE = l_actmet_rec.TRANS_ACTUAL_VALUE,
6202             FUNCTIONAL_CURRENCY_CODE = l_actmet_rec.FUNCTIONAL_CURRENCY_CODE,
6203             FUNC_FORECASTED_VALUE = l_actmet_rec.FUNC_FORECASTED_VALUE,
6204             FUNC_COMMITTED_VALUE = l_actmet_rec.FUNC_COMMITTED_VALUE,
6205             DIRTY_FLAG = l_actmet_rec.DIRTY_FLAG,
6206             FUNC_ACTUAL_VALUE = l_actmet_rec.FUNC_ACTUAL_VALUE,
6207             LAST_CALCULATED_DATE = l_actmet_rec.LAST_CALCULATED_DATE,
6208             VARIABLE_VALUE = l_actmet_rec.VARIABLE_VALUE,
6209             COMPUTED_USING_FUNCTION_VALUE = l_actmet_rec.COMPUTED_USING_FUNCTION_VALUE,
6210             METRIC_UOM_CODE = l_actmet_rec.METRIC_UOM_CODE,
6211             ORG_ID = l_actmet_rec.ORG_ID,
6212             DIFFERENCE_SINCE_LAST_CALC = l_actmet_rec.DIFFERENCE_SINCE_LAST_CALC,
6213             ACTIVITY_METRIC_ORIGIN_ID = l_actmet_rec.ACTIVITY_METRIC_ORIGIN_ID,
6214             ARC_ACTIVITY_METRIC_ORIGIN = l_actmet_rec.ARC_ACTIVITY_METRIC_ORIGIN,
6215             DAYS_SINCE_LAST_REFRESH = l_actmet_rec.DAYS_SINCE_LAST_REFRESH,
6216             SUMMARIZE_TO_METRIC = l_actmet_rec.SUMMARIZE_TO_METRIC,
6217             ROLLUP_TO_METRIC = l_actmet_rec.ROLLUP_TO_METRIC,
6218             SCENARIO_ID = l_actmet_rec.SCENARIO_ID,
6219             ATTRIBUTE_CATEGORY = l_actmet_rec.ATTRIBUTE_CATEGORY,
6220             ATTRIBUTE1 = l_actmet_rec.ATTRIBUTE1,
6221             ATTRIBUTE2 = l_actmet_rec.ATTRIBUTE2,
6222             ATTRIBUTE3 = l_actmet_rec.ATTRIBUTE3,
6223             ATTRIBUTE4 = l_actmet_rec.ATTRIBUTE4,
6224             ATTRIBUTE5 = l_actmet_rec.ATTRIBUTE5,
6225             ATTRIBUTE6 = l_actmet_rec.ATTRIBUTE6,
6226             ATTRIBUTE7 = l_actmet_rec.ATTRIBUTE7,
6227             ATTRIBUTE8 = l_actmet_rec.ATTRIBUTE8,
6228             ATTRIBUTE9 = l_actmet_rec.ATTRIBUTE9,
6229             ATTRIBUTE10 = l_actmet_rec.ATTRIBUTE10,
6230             ATTRIBUTE11 = l_actmet_rec.ATTRIBUTE11,
6231             ATTRIBUTE12 = l_actmet_rec.ATTRIBUTE12,
6232             ATTRIBUTE13 = l_actmet_rec.ATTRIBUTE13,
6233             ATTRIBUTE14 = l_actmet_rec.ATTRIBUTE14,
6234             ATTRIBUTE15 = l_actmet_rec.ATTRIBUTE15,
6235             DESCRIPTION = l_actmet_rec.DESCRIPTION,
6236             ACT_METRIC_DATE = l_actmet_rec.ACT_METRIC_DATE,
6237             ARC_FUNCTION_USED_BY = l_actmet_rec.ARC_FUNCTION_USED_BY,
6238             FUNCTION_USED_BY_ID = l_actmet_rec.FUNCTION_USED_BY_ID,
6239             PURCHASE_REQ_RAISED_FLAG = l_actmet_rec.PURCHASE_REQ_RAISED_FLAG,
6240             SENSITIVE_DATA_FLAG = l_actmet_rec.SENSITIVE_DATA_FLAG,
6241             BUDGET_ID = l_actmet_rec.BUDGET_ID,
6242             FORECASTED_VARIABLE_VALUE = l_actmet_rec.FORECASTED_VARIABLE_VALUE,
6243             HIERARCHY_ID = l_actmet_rec.HIERARCHY_ID,
6244             PUBLISHED_FLAG = l_actmet_rec.PUBLISHED_FLAG,
6245             PRE_FUNCTION_NAME = l_actmet_rec.PRE_FUNCTION_NAME,
6246             POST_FUNCTION_NAME = l_actmet_rec.POST_FUNCTION_NAME,
6247             START_NODE = l_actmet_rec.START_NODE,
6248             FROM_LEVEL = l_actmet_rec.FROM_LEVEL,
6249             TO_LEVEL = l_actmet_rec.TO_LEVEL,
6250             FROM_DATE = l_actmet_rec.FROM_DATE,
6251             TO_DATE = l_actmet_rec.TO_DATE,
6252             AMOUNT1 = l_actmet_rec.AMOUNT1,
6253             AMOUNT2 = l_actmet_rec.AMOUNT2,
6254             AMOUNT3 = l_actmet_rec.AMOUNT3,
6255             PERCENT1 = l_actmet_rec.PERCENT1,
6256             PERCENT2 = l_actmet_rec.PERCENT2,
6257             PERCENT3 = l_actmet_rec.PERCENT3,
6258             STATUS_CODE = l_actmet_rec.STATUS_CODE,
6259             ACTION_CODE = l_actmet_rec.ACTION_CODE,
6263             HIERARCHY_TYPE = l_actmet_rec.HIERARCHY_TYPE,
6260             METHOD_CODE = l_actmet_rec.METHOD_CODE,
6261             BASIS_YEAR = l_actmet_rec.BASIS_YEAR,
6262             EX_START_NODE = l_actmet_rec.EX_START_NODE,
6264             DEPEND_ACT_METRIC = l_actmet_rec.DEPEND_ACT_METRIC,
6265             FUNC_FORECASTED_DELTA = l_func_forecasted_delta,
6266             FUNC_ACTUAL_DELTA = l_func_actual_delta
6267          WHERE act_met_hst_id = l_act_met_hst_id
6268          AND object_version_number = l_object_version_number;
6269       ELSE
6270          -- Values have not changed since yesterday, insert for today.
6271          l_new_record := FND_API.G_TRUE;
6272       END IF;
6273    END IF;
6274 
6275    IF l_new_record = FND_API.G_TRUE THEN
6276       -- Generate a new fact id.
6277       LOOP
6278           OPEN c_get_new_history_id;
6279           FETCH c_get_new_history_id INTO l_act_met_hst_id;
6280           CLOSE c_get_new_history_id;
6281 
6282           -- Validate uniqueness.
6283           OPEN c_check_history_id(l_act_met_hst_id);
6284           FETCH c_check_history_id INTO l_history_id_count;
6285           CLOSE c_check_history_id;
6286 
6287           EXIT WHEN l_history_id_count = 0;
6288       END LOOP;
6289 
6290       -- BUG2214496: Wrap values with nvl.
6291       l_func_forecasted_delta := NVL(l_actmet_rec.func_forecasted_value,0) -
6292                                  NVL(l_func_forecasted_value,0);
6293       l_func_actual_delta := NVL(l_actmet_rec.func_actual_value,0) -
6294                              NVL(l_func_actual_value,0);
6295 
6296       -- Insert a new fact record.
6297       INSERT INTO ams_act_metric_hst
6298          (ACT_MET_HST_ID,
6299          ACTIVITY_METRIC_ID,
6300          LAST_UPDATE_DATE,
6301          LAST_UPDATED_BY,
6302          CREATION_DATE,
6303          CREATED_BY,
6304          LAST_UPDATE_LOGIN,
6305          OBJECT_VERSION_NUMBER,
6306          ACT_METRIC_USED_BY_ID,
6307          ARC_ACT_METRIC_USED_BY,
6308          APPLICATION_ID,
6309          METRIC_ID,
6310          TRANSACTION_CURRENCY_CODE,
6311          TRANS_FORECASTED_VALUE,
6312          TRANS_COMMITTED_VALUE,
6313          TRANS_ACTUAL_VALUE,
6314          FUNCTIONAL_CURRENCY_CODE,
6315          FUNC_FORECASTED_VALUE,
6316          FUNC_COMMITTED_VALUE,
6317          DIRTY_FLAG,
6318          FUNC_ACTUAL_VALUE,
6319          LAST_CALCULATED_DATE,
6320          VARIABLE_VALUE,
6321          COMPUTED_USING_FUNCTION_VALUE,
6322          METRIC_UOM_CODE,
6323          ORG_ID,
6324          DIFFERENCE_SINCE_LAST_CALC,
6325          ACTIVITY_METRIC_ORIGIN_ID,
6326          ARC_ACTIVITY_METRIC_ORIGIN,
6327          DAYS_SINCE_LAST_REFRESH,
6328          SUMMARIZE_TO_METRIC,
6329          ROLLUP_TO_METRIC,
6330          SCENARIO_ID,
6331          ATTRIBUTE_CATEGORY,
6332          ATTRIBUTE1,
6333          ATTRIBUTE2,
6334          ATTRIBUTE3,
6335          ATTRIBUTE4,
6336          ATTRIBUTE5,
6337          ATTRIBUTE6,
6338          ATTRIBUTE7,
6339          ATTRIBUTE8,
6340          ATTRIBUTE9,
6341          ATTRIBUTE10,
6342          ATTRIBUTE11,
6343          ATTRIBUTE12,
6344          ATTRIBUTE13,
6345          ATTRIBUTE14,
6346          ATTRIBUTE15,
6347          DESCRIPTION,
6348          ACT_METRIC_DATE,
6349          ARC_FUNCTION_USED_BY,
6350          FUNCTION_USED_BY_ID,
6351          PURCHASE_REQ_RAISED_FLAG,
6352          SENSITIVE_DATA_FLAG,
6353          BUDGET_ID,
6354          FORECASTED_VARIABLE_VALUE,
6355          HIERARCHY_ID,
6356          PUBLISHED_FLAG,
6357          PRE_FUNCTION_NAME,
6358          POST_FUNCTION_NAME,
6359          START_NODE,
6360          FROM_LEVEL,
6361          TO_LEVEL,
6362          FROM_DATE,
6363          TO_DATE,
6364          AMOUNT1,
6365          AMOUNT2,
6366          AMOUNT3,
6367          PERCENT1,
6368          PERCENT2,
6369          PERCENT3,
6370          STATUS_CODE,
6371          ACTION_CODE,
6372          METHOD_CODE,
6373          BASIS_YEAR,
6374          EX_START_NODE,
6375          HIERARCHY_TYPE,
6376          DEPEND_ACT_METRIC,
6377          FUNC_FORECASTED_DELTA,
6378          FUNC_ACTUAL_DELTA)
6379       VALUES
6380          (L_ACT_MET_HST_ID,
6381          l_actmet_rec.ACTIVITY_METRIC_ID,
6382          l_actmet_rec.LAST_UPDATE_DATE,
6383          l_actmet_rec.LAST_UPDATED_BY,
6384          l_actmet_rec.CREATION_DATE,
6385          l_actmet_rec.CREATED_BY,
6386          l_actmet_rec.LAST_UPDATE_LOGIN,
6387          l_actmet_rec.OBJECT_VERSION_NUMBER,
6388          l_actmet_rec.ACT_METRIC_USED_BY_ID,
6389          l_actmet_rec.ARC_ACT_METRIC_USED_BY,
6390          l_actmet_rec.APPLICATION_ID,
6391          l_actmet_rec.METRIC_ID,
6392          l_actmet_rec.TRANSACTION_CURRENCY_CODE,
6393          l_actmet_rec.TRANS_FORECASTED_VALUE,
6394          l_actmet_rec.TRANS_COMMITTED_VALUE,
6395          l_actmet_rec.TRANS_ACTUAL_VALUE,
6396          l_actmet_rec.FUNCTIONAL_CURRENCY_CODE,
6397          l_actmet_rec.FUNC_FORECASTED_VALUE,
6398          l_actmet_rec.FUNC_COMMITTED_VALUE,
6399          l_actmet_rec.DIRTY_FLAG,
6400          l_actmet_rec.FUNC_ACTUAL_VALUE,
6401          l_actmet_rec.LAST_CALCULATED_DATE,
6402          l_actmet_rec.VARIABLE_VALUE,
6403          l_actmet_rec.COMPUTED_USING_FUNCTION_VALUE,
6407          l_actmet_rec.ACTIVITY_METRIC_ORIGIN_ID,
6404          l_actmet_rec.METRIC_UOM_CODE,
6405          l_actmet_rec.ORG_ID,
6406          l_actmet_rec.DIFFERENCE_SINCE_LAST_CALC,
6408          l_actmet_rec.ARC_ACTIVITY_METRIC_ORIGIN,
6409          l_actmet_rec.DAYS_SINCE_LAST_REFRESH,
6410          l_actmet_rec.SUMMARIZE_TO_METRIC,
6411          l_actmet_rec.ROLLUP_TO_METRIC,
6412          l_actmet_rec.SCENARIO_ID,
6413          l_actmet_rec.ATTRIBUTE_CATEGORY,
6414          l_actmet_rec.ATTRIBUTE1,
6415          l_actmet_rec.ATTRIBUTE2,
6416          l_actmet_rec.ATTRIBUTE3,
6417          l_actmet_rec.ATTRIBUTE4,
6418          l_actmet_rec.ATTRIBUTE5,
6419          l_actmet_rec.ATTRIBUTE6,
6420          l_actmet_rec.ATTRIBUTE7,
6421          l_actmet_rec.ATTRIBUTE8,
6422          l_actmet_rec.ATTRIBUTE9,
6423          l_actmet_rec.ATTRIBUTE10,
6424          l_actmet_rec.ATTRIBUTE11,
6425          l_actmet_rec.ATTRIBUTE12,
6426          l_actmet_rec.ATTRIBUTE13,
6427          l_actmet_rec.ATTRIBUTE14,
6428          l_actmet_rec.ATTRIBUTE15,
6429          l_actmet_rec.DESCRIPTION,
6430          l_actmet_rec.ACT_METRIC_DATE,
6431          l_actmet_rec.ARC_FUNCTION_USED_BY,
6432          l_actmet_rec.FUNCTION_USED_BY_ID,
6433          l_actmet_rec.PURCHASE_REQ_RAISED_FLAG,
6434          l_actmet_rec.SENSITIVE_DATA_FLAG,
6435          l_actmet_rec.BUDGET_ID,
6436          l_actmet_rec.FORECASTED_VARIABLE_VALUE,
6437          l_actmet_rec.HIERARCHY_ID,
6438          l_actmet_rec.PUBLISHED_FLAG,
6439          l_actmet_rec.PRE_FUNCTION_NAME,
6440          l_actmet_rec.POST_FUNCTION_NAME,
6441          l_actmet_rec.START_NODE,
6442          l_actmet_rec.FROM_LEVEL,
6443          l_actmet_rec.TO_LEVEL,
6444          l_actmet_rec.FROM_DATE,
6445          l_actmet_rec.TO_DATE,
6446          l_actmet_rec.AMOUNT1,
6447          l_actmet_rec.AMOUNT2,
6448          l_actmet_rec.AMOUNT3,
6449          l_actmet_rec.PERCENT1,
6450          l_actmet_rec.PERCENT2,
6451          l_actmet_rec.PERCENT3,
6452          l_actmet_rec.STATUS_CODE,
6453          l_actmet_rec.ACTION_CODE,
6454          l_actmet_rec.METHOD_CODE,
6455          l_actmet_rec.BASIS_YEAR,
6456          l_actmet_rec.EX_START_NODE,
6457          l_actmet_rec.HIERARCHY_TYPE,
6458          l_actmet_rec.DEPEND_ACT_METRIC,
6459          l_func_forecasted_delta,
6460          l_func_actual_delta
6461          );
6462    END IF;
6463 
6464 EXCEPTION
6465    WHEN Fnd_Api.G_EXC_ERROR THEN
6466       x_return_status := Fnd_Api.G_RET_STS_ERROR;
6467       Fnd_Msg_Pub.Count_And_Get (
6468          p_count         =>     x_msg_count,
6469          p_data          =>     x_msg_data,
6470          p_encoded       =>   FND_API.G_FALSE
6471       );
6472    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6473       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6474       Fnd_Msg_Pub.Count_And_Get (
6475          p_count         =>     x_msg_count,
6476          p_data          =>     x_msg_data,
6477          p_encoded       =>   FND_API.G_FALSE
6478       );
6479    WHEN OTHERS THEN
6480       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6481       error_message := SQLERRM;
6482       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
6483          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
6484       END IF;
6485       Fnd_Msg_Pub.Count_And_Get (
6486          p_count         =>     x_msg_count,
6487          p_data          =>     x_msg_data,
6488          p_encoded       =>   FND_API.G_FALSE
6489       );
6490 END Record_History;
6491 
6492 -- API Name       Get_Date_Buckets
6493 -- Type           Public
6494 -- Pre-reqs       None.
6495 -- Function       Generate date buckets according to the start date, end date
6496 --                and time interval.
6497 -- Parameters
6498 --    IN          p_start_date                  IN DATE       Required
6499 --                p_end_date                    IN DATE       Required
6500 --                p_interval_amount             IN NUMBER     Required
6501 --                p_interval_unit               IN VARCHAR2   Required
6502 --    OUT NOCOPY         x_date_buckets                OUT NOCOPY date_bucket_type
6503 -- Version        Current version: 1.0
6504 --                Previous version: 1.0
6505 --                Initial version: 1.0
6506 -- HISTORY
6507 -- 11/21/2001     huili         Created.
6508 -- 01/25/2006     dmvincen   BUG4669529: Include prior date bucket.
6509 -- End of comments
6510 PROCEDURE Get_Date_Buckets (
6511    p_start_date       IN  DATE,
6512    p_end_date         IN  DATE,
6513    p_interval_amount  IN  NUMBER,
6514    p_interval_unit    IN  VARCHAR2, -- 'DAY', 'WK', 'MTH', 'YR'
6515    x_date_buckets     OUT NOCOPY date_bucket_type,
6516    x_return_status    OUT NOCOPY VARCHAR2
6517 ) IS
6518  l_date_bucket  DATE := null;
6519  l_date_buckets  date_bucket_type := date_bucket_type();
6520  l_bucket_count NUMBER := 1;
6521  l_last_bucket number := null;
6522  l_max_bucket_count number;
6523  L_NUM_DAYS_WEEK CONSTANT NUMBER := 7;
6524  L_NUM_MONTHS_YEAR CONSTANT NUMBER := 12;
6525 
6526 BEGIN
6527  --
6528    -- Initialize API return status to success.
6529    --
6530    x_return_status := FND_API.G_RET_STS_SUCCESS;
6531 
6532  -- BUG 3815334: Use profile for max buckets.
6533  -- This is the same profile that DCF uses for report page length.
6534  l_max_bucket_count :=
6535               nvl(fnd_profile.value('JTF_PROFILE_DEFAULT_NUM_ROWS'),10);
6539   OR p_interval_amount IS NULL
6536  IF p_start_date IS NULL
6537   OR p_end_date IS NULL
6538   OR TRUNC(p_start_date) > TRUNC(p_end_date)
6540   OR p_interval_amount < 0
6541   OR p_interval_unit IS NULL
6542   OR p_interval_unit NOT IN ('DAY', 'WEEK', 'MONTH', 'YEAR') THEN
6543   x_return_status := FND_API.G_RET_STS_ERROR;
6544   RETURN;
6545  END IF;
6546 
6547   -- Initialize first date bucket to the prior period for incrementals.
6548    IF p_interval_unit = 'DAY' THEN
6549      l_date_bucket := p_start_date - p_interval_amount;
6550    ELSIF p_interval_unit = 'WEEK' THEN
6551      l_date_bucket := p_start_date - p_interval_amount * L_NUM_DAYS_WEEK;
6552    ELSIF p_interval_unit = 'MONTH' THEN
6553      l_date_bucket := ADD_MONTHS (p_start_date, - p_interval_amount);
6554    ELSIF p_interval_unit = 'YEAR' THEN
6555      l_date_bucket := ADD_MONTHS (p_start_date, - p_interval_amount *
6556                                   L_NUM_MONTHS_YEAR);
6557    END IF;
6558 
6559  l_date_buckets.DELETE;
6560  --l_bucket_count := l_date_buckets.COUNT + 1;
6561  l_date_buckets.extend(L_MAX_BUCKET_COUNT+1);
6562  FOR l_bucket_count in 1..L_MAX_BUCKET_COUNT+1
6563  LOOP
6564    l_last_bucket := l_bucket_count;
6565    l_date_buckets(l_bucket_count) := l_date_bucket;
6566    IF p_interval_unit = 'DAY' THEN
6567      l_date_bucket := l_date_bucket + p_interval_amount;
6568    ELSIF p_interval_unit = 'WEEK' THEN
6569      l_date_bucket := l_date_bucket + p_interval_amount * L_NUM_DAYS_WEEK;
6570    ELSIF p_interval_unit = 'MONTH' THEN
6571      l_date_bucket := ADD_MONTHS (l_date_bucket, p_interval_amount);
6572    ELSIF p_interval_unit = 'YEAR' THEN
6573      l_date_bucket := ADD_MONTHS (l_date_bucket, p_interval_amount *
6574                                   L_NUM_MONTHS_YEAR);
6575    ELSE
6576      EXIT;
6577    END IF;
6578    EXIT WHEN TRUNC(l_date_bucket) > TRUNC(p_end_date);
6579  END LOOP;
6580  l_date_buckets.delete(l_last_bucket+1,l_date_buckets.last);
6581  x_date_buckets := l_date_buckets;
6582 END;
6583 
6584 ---------------------------------------------------------------------
6585 -- PROCEDURE
6586 --    Get_Results
6587 -- DESCRIPTION
6588 --    Return the results for results cue card.
6589 --    Output only.  No updates.
6590 -- NOTE
6591 -- HISTORY
6592 -- 27-NOV-2001 dmvincen      Created.
6593 -- 20-DEC-2003 dmvincen  Fixed Deleted metrics show zero for all history.
6594 -- 01-JAN-2006 dmvincen  BUG4669529: Calculate first incremental value.
6595 ---------------------------------------------------------------------
6596 PROCEDURE GET_RESULTS(
6597    p_api_version                IN  NUMBER,
6598    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
6599    x_return_status              OUT NOCOPY VARCHAR2,
6600    x_msg_count                  OUT NOCOPY NUMBER,
6601    x_msg_data                   OUT NOCOPY VARCHAR2,
6602 
6603    p_metric_id IN NUMBER,
6604    p_object_type IN VARCHAR2,
6605    p_object_id IN NUMBER,
6606    p_value_type IN VARCHAR2,
6607    p_from_date IN DATE,
6608    p_to_date IN DATE,
6609    p_increment IN NUMBER,
6610    p_interval_unit IN VARCHAR2,
6611    x_result_table OUT NOCOPY result_table
6612 )
6613 IS
6614    L_API_VERSION    CONSTANT NUMBER := 1.0;
6615    L_API_NAME       CONSTANT VARCHAR2(30) := 'GET_RESULTS';
6616    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6617 
6618   CURSOR c_get_hist_details(l_metric_id NUMBER,
6619                      l_object_type VARCHAR2,
6620                      l_object_id NUMBER) IS
6621       SELECT min(last_update_date)
6622       FROM ams_act_metric_hst
6623       WHERE metric_id = l_metric_id
6624       AND arc_act_metric_used_by = l_object_type
6625       AND act_metric_used_by_id = l_object_id;
6626 
6627   CURSOR c_metric_details(l_metric_id NUMBER) IS
6628      SELECT metric_calculation_type, metric_category, display_type
6629      FROM ams_metrics_all_b
6630      WHERE metric_id = l_metric_id;
6631   l_metric_details c_metric_details%ROWTYPE;
6632 
6633   CURSOR c_get_slice_manual(l_metric_id NUMBER,
6634                      l_object_type VARCHAR2,
6635                      l_object_id NUMBER,
6636                      l_slice_date DATE) IS
6637   -- Fixed so deleted activity metrics show correct values.
6638      SELECT a.last_update_date slice_date,
6639             a.functional_currency_code currency_code,
6640             NVL(SUM(a.func_forecasted_value),0) forecasted_value,
6641             NVL(SUM(a.func_actual_value),0) actual_value
6642      FROM ams_act_metric_hst a
6643      WHERE (a.act_met_hst_id, a.activity_metric_id) IN
6644            (SELECT MAX(b.act_met_hst_id), b.activity_metric_id
6645             FROM ams_act_metric_hst b
6646             WHERE b.metric_id = l_metric_id
6647               AND b.arc_act_metric_used_by = l_object_type
6648               AND b.act_metric_used_by_id = l_object_id
6649             AND TRUNC(b.last_update_date) <= TRUNC(l_slice_date)
6650             GROUP BY b.activity_metric_id)
6651      GROUP BY a.last_update_date, a.functional_currency_code;
6652 
6653   CURSOR c_get_slice_other(l_metric_id NUMBER,
6654                      l_object_type VARCHAR2,
6655                      l_object_id NUMBER,
6656                      l_slice_date DATE) IS
6657      SELECT a.last_update_date slice_date,
6658             a.functional_currency_code currency_code,
6659             NVL(a.func_forecasted_value,0) forecasted_value,
6660             NVL(a.func_actual_value,0) actual_value
6664             FROM ams_act_metric_hst b
6661      FROM ams_act_metric_hst a
6662      WHERE a.last_update_date =
6663            (SELECT MAX(b.last_update_date)
6665             WHERE b.metric_id = l_metric_id
6666             AND b.arc_act_metric_used_by = l_object_type
6667             AND b.act_metric_used_by_id = l_object_id
6668             AND TRUNC(b.last_update_date) <= TRUNC(l_slice_date))
6669      AND a.metric_id = l_metric_id
6670      AND a.arc_act_metric_used_by = l_object_type
6671      AND a.act_metric_used_by_id = l_object_id;
6672 
6673    l_date_buckets date_bucket_type;
6674    l_result_table result_table;
6675    l_result_record result_record;
6676    l_trans_currency_code VARCHAR2(15);
6677    l_date_index NUMBER;
6678    l_result_index NUMBER;
6679    l_last_forecasted_value NUMBER;
6680    l_last_actual_value NUMBER;
6681    l_start_date DATE := NULL;
6682    l_end_date DATE := NULL;
6683 BEGIN
6684    --
6685    -- Output debug message.
6686    --
6687    IF (AMS_DEBUG_HIGH_ON) THEN
6688       Ams_Utility_Pvt.debug_message(l_full_name||': START');
6689       Ams_Utility_Pvt.debug_message('Generating results FOR object: '||
6690           p_object_type||':'||p_object_id||', metric id'||p_metric_id);
6691       Ams_Utility_Pvt.debug_message('FROM/TO/interval/unit: '||
6692           p_from_date||'/'||p_to_date||'/'||p_increment||'/'||p_interval_unit);
6693    END IF;
6694 
6695    --
6696    -- Initialize message list if p_init_msg_list is set to TRUE.
6697    --
6698    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
6699       Fnd_Msg_Pub.Initialize;
6700    END IF;
6701 
6702    --
6703    -- Standard check for API version compatibility.
6704    --
6705    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
6706                                        p_api_version,
6707                                        L_API_NAME,
6708                                        G_PKG_NAME)
6709    THEN
6710       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
6711    END IF;
6712 
6713    --
6714    -- Initialize API return status to success.
6715    --
6716    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6717 
6718    --
6719    -- Begin API Body
6720    --
6721    Get_Trans_curr_code
6722      (p_obj_id            => p_object_id,
6723       p_obj_type          => p_object_type,
6724       x_trans_curr_code   => l_trans_currency_code
6725      );
6726 
6727    OPEN c_metric_details(p_metric_id);
6728    FETCH c_metric_details INTO l_metric_details;
6729    IF c_metric_details%NOTFOUND THEN
6730       CLOSE c_metric_details;
6731       x_return_status := Fnd_Api.G_RET_STS_ERROR;
6732       RAISE Fnd_Api.G_EXC_ERROR;
6733    END IF;
6734    CLOSE c_metric_details;
6735 
6736    OPEN c_get_hist_details(p_metric_id, p_object_type, p_object_id);
6737    FETCH c_get_hist_details INTO l_start_date;
6738    IF c_get_hist_details%NOTFOUND OR l_start_date IS NULL THEN
6739       CLOSE c_get_hist_details;
6740       x_return_status := Fnd_Api.G_RET_STS_ERROR;
6741       RAISE Fnd_Api.G_EXC_ERROR;
6742    END IF;
6743    CLOSE c_get_hist_details;
6744 
6745    IF TRUNC(p_from_date) > TRUNC(l_start_date) THEN
6746       l_start_date := p_from_date;
6747    END IF;
6748 
6749    IF TRUNC(l_start_date) > TRUNC(p_to_date) THEN
6750       l_end_date := l_start_date;
6751    ELSE
6752       l_end_date := p_to_date;
6753    END IF;
6754 
6755    IF TRUNC(l_start_date) >= TRUNC(SYSDATE) THEN
6756       l_start_date := TRUNC(SYSDATE);
6757    END IF;
6758 
6759    IF TRUNC(l_end_date) >= TRUNC(SYSDATE) THEN
6760       l_end_date := TRUNC(SYSDATE);
6761    END IF;
6762 
6763    Get_Date_Buckets (
6764       p_start_date       => l_start_date,
6765       p_end_date         => l_end_date,
6766       p_interval_amount  => p_increment,
6767       p_interval_unit    => p_interval_unit, -- 'DAY', 'WK', 'MTH', 'YR'
6768       x_date_buckets     => l_date_buckets,
6769       x_return_status    => x_return_status
6770    );
6771    IF x_return_status = Fnd_Api.G_RET_STS_ERROR THEN
6772       RETURN;
6773    END IF;
6774 
6775    l_result_table := result_table();
6776    l_result_table.extend(l_date_buckets.COUNT);
6777 
6778    l_date_index := l_date_buckets.first;
6779    l_result_index := l_result_table.first;
6780 
6781    LOOP
6782       EXIT WHEN l_date_index IS NULL;
6783       EXIT WHEN l_result_index IS NULL;
6784       EXIT WHEN NOT l_date_buckets.EXISTS(l_date_index);
6785       EXIT WHEN NOT l_result_table.EXISTS(l_result_index);
6786       IF l_metric_details.display_type = 'CURRENCY' THEN
6787          l_result_record.currency_code := l_trans_currency_code;
6788       ELSE
6789          l_result_record.currency_code := NULL;
6790       END IF;
6791       l_result_record.forecasted_value := 0;
6792       l_result_record.actual_value := 0;
6793       l_result_record.slice_date := l_date_buckets(l_date_index);
6794       l_result_table(l_result_index) := l_result_record;
6795       IF l_metric_details.metric_calculation_type = 'MANUAL' THEN
6796          OPEN c_get_slice_manual(p_metric_id, p_object_type,
6797                                  p_object_id, l_date_buckets(l_date_index));
6798          LOOP
6799             FETCH c_get_slice_manual INTO l_result_record;
6800             EXIT WHEN c_get_slice_manual%NOTFOUND;
6804                l_result_record.currency_code <> l_trans_currency_code
6801             -- Multiple rows are returned if multiple currencies.
6802             -- Convert all currencies to the transactional.
6803             IF l_metric_details.display_type = 'CURRENCY' AND
6805             THEN
6806                Convert_Currency2 (
6807                   x_return_status   => x_return_status,
6808                   p_from_currency   => l_result_record.currency_code,
6809                   p_to_currency     => l_trans_currency_code,
6810                   p_from_amount     => NVL(l_result_record.forecasted_value,0),
6811                   x_to_amount       => l_result_record.forecasted_value,
6812                   p_from_amount2    => NVL(l_result_record.actual_value,0),
6813                   x_to_amount2      => l_result_record.actual_value,
6814                   p_round           => Fnd_Api.G_TRUE
6815                );
6816                l_result_record.currency_code := l_trans_currency_code;
6817             END IF;
6818             l_result_table(l_result_index).forecasted_value :=
6819                     l_result_table(l_result_index).forecasted_value +
6820                     l_result_record.forecasted_value;
6821             l_result_table(l_result_index).actual_value :=
6822                     l_result_table(l_result_index).actual_value +
6823                     l_result_record.actual_value;
6824          END LOOP;
6825          CLOSE c_get_slice_manual;
6826       ELSE -- Other than manual.
6827          OPEN c_get_slice_other(p_metric_id, p_object_type,
6828                                 p_object_id, l_date_buckets(l_date_index));
6829          -- Only one row is expected for each date.
6830          FETCH c_get_slice_other INTO l_result_record;
6831          IF c_get_slice_other%FOUND THEN
6832             -- Synchronize the currency to transactional;
6833             IF l_metric_details.display_type = 'CURRENCY' AND
6834                l_result_record.currency_code <> l_trans_currency_code
6835             THEN
6836                Convert_Currency2 (
6837                   x_return_status   => x_return_status,
6838                   p_from_currency   => l_result_record.currency_code,
6839                   p_to_currency     => l_trans_currency_code,
6840                   p_from_amount     => NVL(l_result_record.forecasted_value,0),
6841                   x_to_amount       => l_result_record.forecasted_value,
6842                   p_from_amount2    => NVL(l_result_record.actual_value,0),
6843                   x_to_amount2      => l_result_record.actual_value,
6844                   p_round           => Fnd_Api.G_TRUE
6845                );
6846                l_result_record.currency_code := l_trans_currency_code;
6847             END IF;
6848             l_result_table(l_result_index) := l_result_record;
6849          END IF;
6850          CLOSE c_get_slice_other;
6851       END IF;
6852       IF p_value_type = 'INCREMENTAL' THEN
6853          IF l_date_index = l_date_buckets.first THEN
6854             l_last_forecasted_value := l_result_table(l_result_index).forecasted_value;
6855             l_last_actual_value := l_result_table(l_result_index).actual_value;
6856             l_result_table(l_result_index).forecasted_value := 0;
6857             l_result_table(l_result_index).actual_value := 0;
6858          ELSE
6859             l_result_record := l_result_table(l_result_index);
6860             l_result_table(l_result_index).forecasted_value :=
6861                l_result_table(l_result_index).forecasted_value -
6862                l_last_forecasted_value;
6863             l_result_table(l_result_index).actual_value :=
6864                l_result_table(l_result_index).actual_value -
6865                l_last_actual_value;
6866             l_last_forecasted_value := l_result_record.forecasted_value;
6867             l_last_actual_value := l_result_record.actual_value;
6868          END IF;
6869       END IF;
6870       l_result_table(l_result_index).slice_date := l_date_buckets(l_date_index);
6871       l_date_index := l_date_buckets.NEXT(l_date_index);
6872       l_result_index := l_result_table.NEXT(l_result_index);
6873    END LOOP;
6874    -- Removed the first element because it is the period before the selection.
6875    l_result_table.delete(l_result_table.first);
6876 
6877    x_result_table := l_result_table;
6878 
6879    IF (AMS_DEBUG_HIGH_ON) THEN
6880       Ams_Utility_Pvt.debug_message('Generated: '||x_result_table.COUNT||' results');
6881    END IF;
6882 
6883    --
6884    -- End API Body
6885    --
6886 
6887    --
6888    -- Standard API to get message count, and if 1,
6889    -- set the message data OUT NOCOPY variable.
6890    --
6891    Fnd_Msg_Pub.Count_And_Get (
6892       p_count           =>    x_msg_count,
6893       p_data            =>    x_msg_data,
6894       p_encoded         =>    Fnd_Api.G_FALSE
6895    );
6896 
6897    --
6898    -- Debug message.
6899    --
6900    IF (AMS_DEBUG_HIGH_ON) THEN
6901       Ams_Utility_Pvt.debug_message(l_full_name ||': END');
6902    END IF;
6903 
6904 EXCEPTION
6905    WHEN Fnd_Api.G_EXC_ERROR THEN
6906       x_return_status := Fnd_Api.G_RET_STS_ERROR;
6907       Fnd_Msg_Pub.Count_And_Get (
6908          p_count         =>     x_msg_count,
6909          p_data          =>     x_msg_data,
6910          p_encoded       =>   FND_API.G_FALSE
6911       );
6912    WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6913       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6914       Fnd_Msg_Pub.Count_And_Get (
6918       );
6915          p_count         =>     x_msg_count,
6916          p_data          =>     x_msg_data,
6917          p_encoded       =>   FND_API.G_FALSE
6919    WHEN OTHERS THEN
6920       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6921       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
6922          Fnd_Msg_Pub.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
6923       END IF;
6924       Fnd_Msg_Pub.Count_And_Get (
6925          p_count         =>     x_msg_count,
6926          p_data          =>     x_msg_data,
6927          p_encoded       =>   FND_API.G_FALSE
6928       );
6929 END get_results;
6930 
6931 --======================================================================
6932 -- procedure
6933 --    copy_act_metrics
6934 --
6935 -- PURPOSE
6936 --    Created to copy activity metrics
6937 --
6938 -- HISTORY
6939 --    13-may-2003 sunkumar created
6940 --======================================================================
6941    procedure copy_act_metrics (
6942    p_api_version            IN   NUMBER,
6943    p_init_msg_list          IN   VARCHAR2 := FND_API.G_FALSE,
6944    p_commit                 IN  VARCHAR2 := Fnd_Api.G_FALSE,
6945    p_validation_level       IN  NUMBER   := Fnd_Api.G_Valid_Level_Full,
6946    p_source_object_type     IN   VARCHAR2,
6947    p_source_object_id       IN   NUMBER,
6948    p_target_object_id       IN   NUMBER,
6949    x_return_status          OUT NOCOPY  VARCHAR2,
6950    x_msg_count              OUT NOCOPY  NUMBER,
6951    x_msg_data               OUT NOCOPY  VARCHAR2
6952    )
6953    IS
6954 
6955     L_API_VERSION          CONSTANT NUMBER := 1.0;
6956     L_API_NAME             CONSTANT VARCHAR2(30) := 'COPY_ACT_METRICS';
6957     L_FULL_NAME            CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6958 
6959     l_return_status        VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
6960 
6961     l_source_object_type   VARCHAR2(30) := p_source_object_type;
6962     l_source_object_id     NUMBER := p_source_object_id;
6963     l_target_object_id     NUMBER := p_target_object_id;
6964 
6965     l_activity_metric_id   NUMBER;
6966     l_metric_id            NUMBER;
6967     l_accrual_type         VARCHAR2(30);
6968     metrics_rec AMS_ACTMETRIC_PVT.act_metric_rec_type;
6969     x_activity_metric_id   NUMBER;
6970 
6971     --select the details from the source object
6972      CURSOR c_act_met_details(c_source_object_type varchar2, c_source_object_id NUMBER) IS
6973        SELECT  activity_metric_id,
6974                  last_update_date,
6975                  last_updated_by,
6976                  creation_date,
6977                  created_by,
6978                  last_update_login,
6979                  object_version_number,
6980                  act_metric_used_by_id,
6981                  arc_act_metric_used_by,
6982                  purchase_req_raised_flag,
6983                  application_id,
6984                  sensitive_data_flag,
6985                  budget_id,
6986                  metric_id,
6987                  transaction_currency_code,
6988                  trans_forecasted_value,
6989                  trans_committed_value,
6990                  trans_actual_value,
6991                  functional_currency_code,
6992                  func_forecasted_value,
6993                  dirty_flag,
6994                  func_committed_value,
6995                  func_actual_value,
6996                  last_calculated_date,
6997                  variable_value,
6998                  forecasted_variable_value,
6999                  computed_using_function_value,
7000                  metric_uom_code,
7001                  org_id,
7002                  difference_since_last_calc,
7003                  activity_metric_origin_id,
7004                  arc_activity_metric_origin,
7005                  days_since_last_refresh,
7006                  scenario_id,
7007                  SUMMARIZE_TO_METRIC,
7008                  ROLLUP_TO_METRIC,
7009                  hierarchy_id,
7010                  start_node,
7011                  from_level,
7012                  to_level,
7013                  from_date,
7014                  TO_DATE,
7015                  amount1,
7016                  amount2,
7017                  amount3,
7018                  percent1,
7019                  percent2,
7020                  percent3,
7021                  published_flag,
7022                  pre_function_name ,
7023                  post_function_name,
7024                  attribute_category,
7025                  attribute1,
7026                  attribute2,
7027                  attribute3,
7028                  attribute4,
7029                  attribute5,
7030                  attribute6,
7031                  attribute7,
7032                  attribute8,
7033                  attribute9,
7034                  attribute10,
7035                  attribute11,
7036                  attribute12,
7037                  attribute13,
7038                  attribute14,
7039                  attribute15,
7040                  description,
7041                  act_metric_date,
7042                  depend_act_metric,
7043                  function_used_by_id,
7044                  arc_function_used_by,
7045                  hierarchy_type,
7046                  status_code,
7050                  ex_start_node
7047                  method_code,
7048                  action_code,
7049                  basis_year,
7051      FROM ams_act_metrics_all
7052      WHERE arc_act_metric_used_by = c_source_object_type
7053        and act_metric_used_by_id = c_source_object_id;
7054 
7055     -- metrics_rec c_act_met_details%ROWTYPE;
7056     --check for existance of activity metrics in the target object
7057     CURSOR c_exist_metric_target (cv_metric_id NUMBER
7058                                  ,cv_act_metric_used_by_id  NUMBER
7059                                  ,cv_arc_act_metric_used_by VARCHAR2)    IS
7060 
7061    SELECT activity_metric_id
7062    FROM   ams_act_metrics_all
7063    WHERE  metric_id              = cv_metric_id
7064    AND    act_metric_used_by_id  = cv_act_metric_used_by_id
7065    AND    arc_act_metric_used_by = cv_arc_act_metric_used_by;
7066 
7067    --check for the accrual type for the metric id (in case activity metric exists for the target object
7068    cursor c_check_accrual_type( ca_metric_id number) IS
7069        select accrual_type
7070        from ams_metrics_all_b
7071        where   metric_id = ca_metric_id;
7072 
7073 BEGIN --begin copy_act_metrics
7074 
7075    -- Initialize savepoint.
7076    SAVEPOINT Copy_Metric_pvt;
7077 
7078    IF (AMS_DEBUG_HIGH_ON) THEN
7079    Ams_Utility_Pvt.Debug_Message(l_full_name||': start');
7080    END IF;
7081 
7082    -- Initialize message list if p_init_msg_list is set to TRUE.
7083    IF FND_API.To_Boolean (p_init_msg_list) THEN
7084       FND_MSG_PUB.Initialize;
7085    END IF;
7086 
7087    -- Standard check for API version compatibility.
7088    IF NOT FND_API.Compatible_API_Call (L_API_VERSION,
7089                                        p_api_version,
7090                                        L_API_NAME,
7091                                        G_PKG_NAME)
7092    THEN
7093       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7094    END IF;
7095 
7096    -- Initialize API return status to success.
7097    x_return_status := FND_API.G_RET_STS_SUCCESS;
7098 
7099      validate_objects(
7100       p_api_version           => p_api_version,
7101       p_init_msg_list         => p_init_msg_list,
7102       --p_commit                => p_commit,
7103       p_validation_level      => p_validation_level,
7104       p_source_object_type    => l_source_object_type,
7105       p_source_object_id      => l_source_object_id,
7106       p_target_object_id      => l_target_object_id,
7107       x_return_status         => x_return_status,
7108       x_msg_count             => x_msg_count,
7109       x_msg_data              => x_msg_data
7110       );
7111 
7112    IF x_return_status = Fnd_Api.G_RET_STS_ERROR THEN
7113       RAISE Fnd_Api.G_EXC_ERROR;
7114 
7115    ELSIF x_return_status = Fnd_Api.G_RET_STS_UNEXP_ERROR THEN
7116       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7117         END IF;
7118 
7119      open c_act_met_details(l_source_object_type,l_source_object_id);
7120      LOOP
7121         FETCH c_act_met_details INTO metrics_rec;
7122         EXIT WHEN c_act_met_details%NOTFOUND;
7123 
7124         l_activity_metric_id := 0;
7125 
7126          OPEN c_exist_metric_target(metrics_rec.metric_id,l_target_object_id,l_source_object_type);
7127             FETCH c_exist_metric_target INTO l_activity_metric_id;
7128          CLOSE c_exist_metric_target;
7129 
7130          -- metric from source object  exist in the target
7131          IF  l_activity_metric_id <> 0 THEN
7132              --initialize the accrual type value
7133              l_accrual_type := NULL;
7134              OPEN c_check_accrual_type(metrics_rec.metric_id);
7135              FETCH c_check_accrual_type INTO l_accrual_type;
7136              CLOSE c_check_accrual_type;
7137 
7138              --if accrual type is variable update the variable value.
7139              IF l_accrual_type=G_VARIABLE
7140              THEN
7141                UPDATE ams_act_metrics_all
7142                SET
7143                   object_version_number     = object_version_number + 1,
7144                   last_update_date          = SYSDATE,
7145                   last_updated_by           = Fnd_Global.User_ID,
7146                   last_update_login         = Fnd_Global.Conc_Login_ID,
7147                   variable_value            = metrics_rec.variable_value,
7148                   forecasted_variable_value = metrics_rec.forecasted_variable_value
7149                WHERE activity_metric_id     = l_activity_metric_id
7150                and   metric_id              = metrics_rec.metric_id
7151                and   arc_act_metric_used_by = l_source_object_type
7152                and   act_metric_used_by_id  = l_target_object_id;
7153              END IF;  --accrual type variable
7154 
7155         --metric from source object do not exist in the target call create to insert record.
7156         ELSE
7157             metrics_rec.trans_forecasted_value := NULL;
7158             metrics_rec.trans_actual_value     := NULL;
7159             metrics_rec.func_forecasted_value  := NULL;
7160             metrics_rec.func_actual_value      := NULL;
7161             metrics_rec.activity_metric_id     := NULL;
7162             metrics_rec.act_metric_used_by_id  := l_target_object_id;
7163             metrics_rec.application_id := 530;
7164             x_activity_metric_id := NULL;
7165 
7166             --call create_actmetric to get the entries in the table
7167 
7168           Create_ActMetric (
7172                   p_validation_level      => p_validation_level,
7169              p_api_version           => p_api_version,
7170                   p_init_msg_list         => p_init_msg_list,
7171                   --p_commit                => p_commit,
7173                   x_return_status         => x_return_status,
7174                   x_msg_count             => x_msg_count,
7175                   x_msg_data              => x_msg_data,
7176                   p_act_metric_rec        => metrics_rec,
7177                   x_activity_metric_id    => x_activity_metric_id);
7178 
7179             -- If any errors happen abort API.
7180           IF x_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
7181              RAISE Fnd_Api.G_EXC_ERROR;
7182           END IF;
7183        END IF; --if activity metric exist for target.
7184 
7185     END LOOP;
7186     CLOSE c_act_met_details;
7187 
7188    -- End API Body.
7189 
7190    -- Standard check for commit request.
7191    IF FND_API.To_Boolean (p_commit) THEN
7192       COMMIT;
7193    END IF;
7194 
7195     Fnd_Msg_Pub.Count_And_Get (
7196       p_count           =>    x_msg_count,
7197       p_data            =>    x_msg_data,
7198       p_encoded         =>    Fnd_Api.G_FALSE
7199    );
7200 
7201    --
7202    -- Debug message.
7203    --
7204    IF (AMS_DEBUG_HIGH_ON) THEN
7205       Ams_Utility_Pvt.debug_message(l_full_name ||': END');
7206    END IF;
7207 
7208    EXCEPTION
7209    WHEN FND_API.G_EXC_ERROR THEN
7210       ROLLBACK TO Copy_Metric_pvt;
7211       x_return_status := FND_API.G_RET_STS_ERROR;
7212       FND_MSG_PUB.Count_And_Get (
7213           p_encoded => FND_API.g_false,
7214           p_count   => x_msg_count,
7215                p_data    => x_msg_data
7216          );
7217 
7218    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7219       ROLLBACK TO Copy_Metric_pvt;
7220       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7221       FND_MSG_PUB.Count_And_Get (
7222          p_encoded => FND_API.g_false,
7223               p_count   => x_msg_count,
7224                         p_data    => x_msg_data
7225             );
7226 
7227    WHEN OTHERS THEN
7228       ROLLBACK TO Copy_Metric_pvt;
7229       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7230       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7231       THEN
7232          FND_MSG_PUB.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
7233       END IF;
7234 
7235       FND_MSG_PUB.Count_And_Get (
7236          p_encoded => FND_API.g_false,
7237               p_count   => x_msg_count,
7238               p_data    => x_msg_data
7239       );
7240 
7241    End copy_act_metrics;
7242 
7243 --======================================================================
7244 -- procedure
7245 --    validate_objects
7246 --
7247 -- PURPOSE
7248 --    Created to validate the values while copying activity metrics
7249 --
7250 -- HISTORY
7251 --    13-may-2003 sunkumar created
7252 --======================================================================
7253 
7254 PROCEDURE validate_objects(
7255 p_api_version                IN   NUMBER,
7256 p_init_msg_list              IN   VARCHAR2     := FND_API.G_FALSE,
7257 p_validation_level           IN  NUMBER   := Fnd_Api.G_Valid_Level_Full,
7258 p_source_object_type         IN   VARCHAR2,
7259 p_source_object_id           IN   NUMBER,
7260 p_target_object_id           IN   NUMBER,
7261 x_return_status              OUT NOCOPY  VARCHAR2,
7262 x_msg_count                  OUT NOCOPY  NUMBER,
7263 x_msg_data                   OUT NOCOPY  VARCHAR2
7264 )
7265 
7266 IS
7267    L_API_VERSION    CONSTANT NUMBER := 1.0;
7268    L_API_NAME       CONSTANT VARCHAR2(30) := 'VALIDATE_OBJECTS';
7269    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
7270 
7271    l_return_status      VARCHAR2(1):=FND_API.G_RET_STS_SUCCESS;
7272    l_source_object_type VARCHAR2(30) := p_source_object_type;
7273    l_source_object_id    NUMBER := p_source_object_id;
7274    l_target_object_id   NUMBER := p_target_object_id;
7275 
7276    l_source_object_exists VARCHAR2(1) := Fnd_Api.G_FALSE;
7277    l_target_object_exists VARCHAR2(1) := Fnd_Api.G_FALSE;
7278    l_valid_object         VARCHAR2(1) := Fnd_Api.G_FALSE;
7279 
7280    l_object_name  AMS_LOOKUPS.MEANING%TYPE;
7281    --cursors to check for existance of various objects.
7282    CURSOR c_check_camp(id NUMBER) IS
7283       SELECT Fnd_Api.G_TRUE
7284       FROM ams_campaigns_all_b
7285       WHERE campaign_id = id;
7286 
7287    CURSOR c_check_csch(id NUMBER) IS
7288       SELECT Fnd_Api.G_TRUE
7289       FROM ams_campaign_schedules_b
7290       WHERE schedule_id = id;
7291 
7292    CURSOR c_check_delv(id NUMBER) IS
7293       SELECT Fnd_Api.G_TRUE
7294       FROM ams_deliverables_all_b
7295       WHERE deliverable_id = id;
7296 
7297    CURSOR c_check_eveh(id NUMBER) IS
7298       SELECT Fnd_Api.G_TRUE
7299       FROM ams_event_headers_all_b
7300       WHERE event_header_id = id;
7301 
7302    CURSOR c_check_eveo(id NUMBER) IS
7303       SELECT Fnd_Api.G_TRUE
7304       FROM ams_event_offers_all_b
7305       WHERE event_offer_id = id;
7306 
7307 BEGIN
7308 
7309    -- Output debug message.
7310    IF (AMS_DEBUG_HIGH_ON) THEN
7311       Ams_Utility_Pvt.debug_message(l_full_name||': start');
7312    END IF;
7313 
7314    -- Initialize message list if p_init_msg_list is set to TRUE.
7318 
7315    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
7316       Fnd_Msg_Pub.Initialize;
7317    END IF;
7319    -- Standard check for API version compatibility.
7320    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
7321                                        p_api_version,
7322                                        L_API_NAME,
7323                                        G_PKG_NAME)
7324    THEN
7325       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7326    END IF;
7327 
7328    -- Initialize API return status to success.
7329    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
7330 
7331    -- Begin API Body.
7332    IF (AMS_DEBUG_HIGH_ON) THEN
7333     Ams_Utility_Pvt.debug_message(l_full_name||': Validate items');
7334   END IF;
7335 
7336   --check source object exists
7337   IF (l_source_object_type IN ('RCAM', 'CAMP')) THEN
7338          OPEN c_check_camp(l_source_object_id);
7339          FETCH c_check_camp INTO l_source_object_exists;
7340          CLOSE c_check_camp;
7341     l_valid_object :=  Fnd_Api.G_TRUE;
7342 
7343   ELSIF (l_source_object_type = 'CSCH') THEN
7344     OPEN c_check_csch(l_source_object_id);
7345     FETCH c_check_csch INTO l_source_object_exists;
7346     CLOSE c_check_csch;
7347     l_valid_object :=  Fnd_Api.G_TRUE;
7348 
7349   ELSIF (l_source_object_type = 'DELV') THEN
7350     OPEN c_check_delv(l_source_object_id);
7351     FETCH c_check_delv INTO l_source_object_exists;
7352     CLOSE c_check_delv;
7353     l_valid_object :=  Fnd_Api.G_TRUE;
7354 
7355   ELSIF (l_source_object_type = 'EVEH') THEN
7356     OPEN c_check_eveh(l_source_object_id);
7357     FETCH c_check_eveh INTO l_source_object_exists;
7358     CLOSE c_check_eveh;
7359     l_valid_object :=  Fnd_Api.G_TRUE;
7360 
7361   ELSIF (l_source_object_type IN ('EONE' , 'EVEO')) THEN
7362     OPEN c_check_eveo(l_source_object_id);
7363     FETCH c_check_eveo INTO l_source_object_exists;
7364     CLOSE c_check_eveo;
7365       l_valid_object :=  Fnd_Api.G_TRUE;
7366 
7367   END IF;
7368 
7369   l_object_name := ams_utility_pvt.get_lookup_meaning('AMS_SYS_ARC_QUALIFIER', l_source_object_type);
7370 
7371   --the object type passed is not a valid one for metrics.
7372   IF (l_valid_object = Fnd_Api.G_FALSE) THEN
7373       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
7374          Fnd_Message.Set_Name('AMS', 'AMS_COPY_INVALID_OBJECTS');
7375          Fnd_Msg_Pub.ADD;
7376       END IF;
7377       l_return_status := Fnd_Api.G_RET_STS_ERROR;
7378 
7379   END IF;
7380 
7381   --check if source object was not found
7382   IF (l_source_object_exists = Fnd_Api.G_FALSE)  THEN
7383       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
7384           Fnd_Message.Set_Name('AMS', 'AMS_COPY_INVALID_SOURCE');
7385          Fnd_Message.set_token('OBJECT', l_object_name);
7386     Fnd_Msg_Pub.ADD;
7387       END IF;
7388          l_return_status := Fnd_Api.G_RET_STS_ERROR;
7389   END IF;
7390 
7391   --check target object exists
7392   IF (l_source_object_type IN ('RCAM', 'CAMP')) THEN
7393          OPEN c_check_camp(l_target_object_id);
7394          FETCH c_check_camp INTO l_target_object_exists;
7395          CLOSE c_check_camp;
7396 
7397   ELSIF (l_source_object_type = 'CSCH') THEN
7398     OPEN c_check_csch(l_target_object_id);
7399     FETCH c_check_csch INTO l_target_object_exists;
7400     CLOSE c_check_csch;
7401 
7402   ELSIF (l_source_object_type = 'DELV') THEN
7403     OPEN c_check_delv(l_target_object_id);
7404     FETCH c_check_delv INTO l_target_object_exists;
7405     CLOSE c_check_delv;
7406 
7407   ELSIF (l_source_object_type = 'EVEH') THEN
7408     OPEN c_check_eveh(l_target_object_id);
7409     FETCH c_check_eveh INTO l_target_object_exists;
7410     CLOSE c_check_eveh;
7411 
7412   ELSIF (l_source_object_type IN ('EONE' , 'EVEO')) THEN
7413     OPEN c_check_eveo(l_target_object_id);
7414     FETCH c_check_eveo INTO l_target_object_exists;
7415     CLOSE c_check_eveo;
7416 
7417   END IF;
7418 
7419   --check if target object was not found
7420   IF (l_target_object_exists = Fnd_Api.G_FALSE)  THEN
7421       IF Fnd_Msg_Pub.Check_Msg_Level (Fnd_Msg_Pub.G_MSG_LVL_ERROR) THEN
7422          Fnd_Message.Set_Name('AMS', 'AMS_COPY_INVALID_TARGET');
7423          Fnd_Message.set_token('OBJECT', l_object_name);
7424     Fnd_Msg_Pub.ADD;
7425       END IF;
7426       l_return_status := Fnd_Api.G_RET_STS_ERROR;
7427 
7428   END IF;
7429 
7430    -- End API Body.
7431 
7432    -- Standard API to get message count, and if 1,
7433    -- set the message data OUT variable.
7434    FND_MSG_PUB.Count_And_Get (
7435       p_count           =>    x_msg_count,
7436       p_data            =>    x_msg_data,
7437       p_encoded         =>    FND_API.G_FALSE
7438    );
7439 
7440    -- Add success message to message list.
7441    IF (AMS_DEBUG_HIGH_ON) THEN
7442    Ams_Utility_Pvt.debug_message(l_full_name ||': end Success');
7443    END IF;
7444 
7445    x_return_status := l_return_status;
7446 
7447 END validate_objects;
7448 
7449 --======================================================================
7450 -- FUNCTION
7451 --    Lock_Object
7452 --
7453 -- PURPOSE
7454 --    Locks object to prevent duplicates.
7455 --
7456 -- HISTORY
7457 --
7461    p_init_msg_list              IN  VARCHAR2 := Fnd_Api.G_FALSE,
7458 --======================================================================
7459 FUNCTION Lock_Object(
7460    p_api_version                IN  NUMBER,
7462    p_arc_act_metric_used_by     IN VARCHAR2,
7463    p_act_metric_used_by_id      IN NUMBER,
7464    x_return_status              OUT NOCOPY VARCHAR2,
7465    x_msg_count                  OUT NOCOPY NUMBER,
7466    x_msg_data                   OUT NOCOPY VARCHAR2)
7467 return varchar2
7468 IS
7469    L_API_VERSION    CONSTANT NUMBER := 1.0;
7470    L_API_NAME       CONSTANT VARCHAR2(30) := 'LOCK_OBJECT';
7471    L_FULL_NAME      CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
7472 
7473    l_sql   VARCHAR2(4000);
7474    l_count NUMBER;
7475    l_return_status VARCHAR2(1);
7476    l_table_name VARCHAR2(30);
7477    l_pk_name VARCHAR2(30);
7478 
7479 BEGIN
7480    --
7481    -- Initialize message list if p_init_msg_list is set to TRUE.
7482    --
7483    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
7484       Fnd_Msg_Pub.Initialize;
7485    END IF;
7486 
7487    --
7488    -- Standard check for API version compatibility.
7489    --
7490    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
7491                                        p_api_version,
7492                                        L_API_NAME,
7493                                        G_PKG_NAME)
7494    THEN
7495       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7496    END IF;
7497 
7498    --
7499    -- Initialize API return status to success.
7500    --
7501    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
7502    IF (p_arc_act_metric_used_by ='CSCH') THEN
7503       l_table_name    := 'AMS_CAMPAIGN_SCHEDULES_B';
7504       l_pk_name       := 'SCHEDULE_ID';
7505    ELSIF (p_arc_act_metric_used_by ='CAMP') THEN
7506       l_table_name    := 'AMS_CAMPAIGNS_ALL_B';
7507       l_pk_name       := 'CAMPAIGN_ID';
7508    ELSIF (p_arc_act_metric_used_by ='EVEO') THEN
7509       l_table_name    := 'AMS_EVENT_OFFERS_ALL_B';
7510       l_pk_name       := 'EVENT_OFFER_ID';
7511    ELSIF (p_arc_act_metric_used_by ='EONE') THEN
7512       l_table_name    := 'AMS_EVENT_OFFERS_ALL_B';
7513       l_pk_name       := 'EVENT_OFFER_ID';
7514    ELSIF (p_arc_act_metric_used_by ='EVEH') THEN
7515       l_table_name    := 'AMS_EVENT_HEADERS_ALL_B';
7516       l_pk_name       := 'EVENT_HEADER_ID';
7517    ELSIF (p_arc_act_metric_used_by ='DELV') THEN
7518       l_table_name    := 'AMS_DELIVERABLES_ALL_B';
7519       l_pk_name       := 'DELIVERABLE_ID';
7520    ELSIF (p_arc_act_metric_used_by = 'RCAM') THEN
7521       l_table_name    := 'AMS_CAMPAIGNS_ALL_B';
7522       l_pk_name       := 'CAMPAIGN_ID';
7523    ELSIF (p_arc_act_metric_used_by = 'ALIST') THEN
7524       l_table_name    := 'AMS_ACT_LISTS';
7525       l_pk_name       := 'ACT_LIST_HEADER_ID';
7526    ELSE
7527       AMS_Utility_PVT.error_message ('AMS_INVALID_SYS_QUAL', 'SYS_QUALIFIER', p_arc_act_metric_used_by);
7528       x_return_status := FND_API.g_ret_sts_unexp_error;
7529       l_table_name    := NULL;
7530       l_pk_name       := NULL;
7531    END IF;
7532 
7533    l_count := 0;
7534    if x_return_status = Fnd_Api.G_RET_STS_SUCCESS then
7535       l_sql := 'UPDATE ' || UPPER(l_table_name) ||
7536          ' SET object_version_number = object_version_number '||
7537          ' WHERE ' || UPPER(l_pk_name) || ' = :b1 ';
7538 
7539    IF (AMS_DEBUG_HIGH_ON) THEN
7540       ams_utility_pvt.debug_message('SQL statement: '||l_sql);
7541    END IF;
7542 
7543       BEGIN
7544          EXECUTE IMMEDIATE l_sql
7545          USING p_act_metric_used_by_id;
7546          l_count := 1;
7547       EXCEPTION
7548          WHEN NO_DATA_FOUND THEN
7549             l_count := 0;
7550       END;
7551 
7552    end if;
7553 
7554    BEGIN
7555       EXECUTE IMMEDIATE l_sql
7556       USING p_act_metric_used_by_id;
7557    EXCEPTION
7558       WHEN NO_DATA_FOUND THEN
7559          l_count := 0;
7560    END;
7561 
7562    IF l_count = 0 THEN
7563       RETURN FND_API.g_false;
7564    ELSE
7565       RETURN FND_API.g_true;
7566    END IF;
7567 
7568 END Lock_Object;
7569 
7570 --
7571 -- PROCEDURE
7572 --    delete_actmetrics_assoc
7573 --
7574 -- DESCRIPTION
7575 --    Delete all activity metrics associated to the given object.
7576 --
7577 -- REQUIREMENT
7578 --    bug 3410962: ALIST integration for deleting lists from target group
7579 --
7580 -- HISTORY
7581 -- 30-Jan-2004 choang   Created.
7582 --
7583 PROCEDURE delete_actmetrics_assoc (
7584    p_api_version     IN NUMBER,
7585    p_init_msg_list   IN VARCHAR2 := FND_API.G_FALSE,
7586    p_commit          IN VARCHAR2 := FND_API.G_FALSE,
7587    p_object_type     IN VARCHAR2,
7588    p_object_id       IN NUMBER,
7589    x_return_status   OUT NOCOPY VARCHAR2,
7590    x_msg_count       OUT NOCOPY NUMBER,
7591    x_msg_data        OUT NOCOPY VARCHAR2
7592 )
7593 IS
7594    L_API_NAME     CONSTANT VARCHAR2(60) := 'Delete ActMetric Associations';
7595    L_API_VERSION  CONSTANT NUMBER := 1.0;
7596 BEGIN
7597    SAVEPOINT delete_actmetrics_assoc;
7598 
7599    --
7600    -- Initialize message list if p_init_msg_list is set to TRUE.
7601    --
7602    IF Fnd_Api.To_Boolean (p_init_msg_list) THEN
7606    --
7603       Fnd_Msg_Pub.Initialize;
7604    END IF;
7605 
7607    -- Standard check for API version compatibility.
7608    --
7609    IF NOT Fnd_Api.Compatible_API_Call (L_API_VERSION,
7610                                        p_api_version,
7611                                        L_API_NAME,
7612                                        G_PKG_NAME)
7613    THEN
7614       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7615    END IF;
7616 
7617    --
7618    -- Initialize API return status to success.
7619    --
7620    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
7621 
7622    DELETE FROM ams_act_metrics_all
7623    WHERE arc_act_metric_used_by = p_object_type
7624    AND   act_metric_used_by_id = p_object_id;
7625 
7626    IF p_commit = FND_API.G_TRUE THEN
7627       COMMIT;
7628    END IF;
7629 EXCEPTION
7630    WHEN OTHERS THEN
7631       ROLLBACK TO delete_actmetrics_assoc;
7632       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7633       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
7634       THEN
7635          FND_MSG_PUB.Add_Exc_Msg (G_PKG_NAME, L_API_NAME);
7636       END IF;
7637 
7638       FND_MSG_PUB.Count_And_Get (
7639          p_encoded => FND_API.g_false,
7640          p_count   => x_msg_count,
7641          p_data    => x_msg_data
7642       );
7643 END delete_actmetrics_assoc;
7644 
7645 --
7646 -- PROCEDURE
7647 --    Validate_Object_Exists
7648 --
7649 -- DESCRIPTION
7650 --    Check for object existance.
7651 --
7652 -- HISTORY
7653 -- 21-Apr-2004 sunkumar Created
7654 --
7655 FUNCTION Validate_Object_Exists (
7656    p_object_type  IN  varchar2,
7657    p_object_id   IN  number
7658 )
7659 RETURN VARCHAR2
7660 IS
7661 
7662    CURSOR c_campaign_metric(p_campaign_id number) IS
7663    SELECT 1 FROM AMS_CAMPAIGNS_ALL_B
7664    WHERE CAMPAIGN_ID = p_campaign_id;
7665 
7666 
7667    CURSOR c_campaign_schedule_metric(p_campaign_schedule_id number) IS
7668    SELECT 1 FROM AMS_CAMPAIGN_SCHEDULES_B
7669    WHERE schedule_ID = p_campaign_schedule_id;
7670 
7671    CURSOR c_deliverable_metric(p_deliverable_id number) IS
7672    SELECT 1 FROM AMS_DELIVERABLES_ALL_B
7673    WHERE deliverable_ID = p_deliverable_id;
7674 
7675    CURSOR c_event_schedule_metric(p_event_schedule_id number) IS
7676    SELECT 1 FROM AMS_EVENT_OFFERS_ALL_B
7677    WHERE EVENT_OFFER_ID = p_event_schedule_id
7678    and event_object_type = 'EVEO';
7679 
7680    CURSOR c_one_off_metric(p_one_off_id number) IS
7681    SELECT 1 FROM AMS_EVENT_OFFERS_ALL_B
7682    WHERE EVENT_OFFER_ID = p_one_off_id
7683    and event_object_type = 'EONE';
7684 
7685 
7686    CURSOR c_event_metric(p_event_id number) IS
7687    SELECT 1 FROM AMS_EVENT_HEADERS_ALL_B
7688    WHERE EVENT_HEADER_ID = p_event_id;
7689 
7690 
7691    CURSOR c_act_list_metric(p_act_list_id number) IS
7692    SELECT 1 FROM AMS_ACT_LISTS
7693    WHERE ACT_LIST_HEADER_ID = p_act_list_id;
7694 
7695    l_count NUMBER;
7696 BEGIN
7697 
7698 
7699    IF (p_object_type ='CSCH') THEN
7700 
7701       OPEN c_campaign_schedule_metric(p_object_id);
7702       IF c_campaign_schedule_metric%NOTFOUND
7703           THEN l_count := 0;
7704           ELSE l_count := 1;
7705       END IF;
7706       CLOSE c_campaign_schedule_metric;
7707 
7708 
7709    ELSIF (p_object_type ='CAMP' OR p_object_type = 'RCAM') THEN
7710 
7711       OPEN c_campaign_metric(p_object_id);
7712       IF c_campaign_metric%NOTFOUND
7713            THEN l_count := 0;
7714            ELSE l_count := 1;
7715       END IF;
7716       CLOSE c_campaign_metric;
7717 
7718 
7719    ELSIF (p_object_type ='EVEO') THEN
7720 
7721       OPEN c_event_schedule_metric(p_object_id);
7722 
7723       IF c_event_schedule_metric%NOTFOUND
7724       THEN l_count := 0;
7725         ELSE l_count := 1;
7726       END IF;
7727 
7728       CLOSE c_event_schedule_metric;
7729 
7730    ELSIF (p_object_type ='EONE') THEN
7731 
7732       OPEN c_one_off_metric(p_object_id);
7733 
7734       IF c_one_off_metric%NOTFOUND
7735         THEN l_count := 0;
7736         ELSE l_count := 1;
7737       END IF;
7738 
7739       CLOSE c_one_off_metric;
7740 
7741    ELSIF (p_object_type ='EVEH') THEN
7742 
7743       OPEN c_event_metric(p_object_id);
7744 
7745       IF c_event_metric%NOTFOUND
7746         THEN l_count := 0;
7747         ELSE l_count := 1;
7748       END IF;
7749 
7750       CLOSE c_event_metric;
7751 
7752    ELSIF (p_object_type ='DELV') THEN
7753 
7754       OPEN c_deliverable_metric(p_object_id);
7755 
7756       IF c_deliverable_metric%NOTFOUND
7757         THEN l_count := 0;
7758         ELSE l_count := 1;
7759       END IF;
7760 
7761       CLOSE c_deliverable_metric;
7762 
7763    ELSIF (p_object_type = 'ALIST') THEN
7764 
7765       OPEN c_act_list_metric(p_object_id);
7766       IF c_act_list_metric%NOTFOUND
7767         THEN l_count := 0;
7768         ELSE l_count := 1;
7769       END IF;
7770 
7771       CLOSE c_act_list_metric;
7772 
7773    ELSE
7774       l_count := 0;
7775 
7776    END IF;
7777 
7778    IF l_count = 0 THEN
7782    END IF;
7779       RETURN FND_API.g_false;
7780    ELSE
7781       RETURN FND_API.g_true;
7783 
7784 
7785 END Validate_Object_Exists;
7786 
7787 --
7788 -- FUNCTION
7789 --   CAN_POST_TO_BUDGET
7790 --
7791 -- DESCRIPTION
7792 --   Determine if the object has an approved budget and the correct status
7793 --   for posting costs to budgets.
7794 --
7795 -- RETURN
7796 --   VARCHAR2 - TRUE, FALSE
7797 --
7798 --  REQUIREMENT
7799 --   BUG 4868582: Post to budget only with actual values entered.
7800 --
7801 -- HISTORY
7802 --   15-Dec-2005 dmvincen  Created.
7803 FUNCTION CAN_POST_TO_BUDGET(p_object_type IN VARCHAR2, p_object_id IN NUMBER)
7804 RETURN VARCHAR2
7805 IS
7806   CURSOR c_has_approved_budget(l_object_type VARCHAR2,l_object_id NUMBER)
7807   IS
7808        select count(1) budget_count
7809        from ozf_act_budgets
7810 		 where transfer_type = 'REQUEST'
7811 		 and  arc_act_budget_used_by = l_object_type
7812 		 and  act_budget_used_by_id = l_object_id
7813 		 and  budget_source_type = 'FUND'
7814 		 and  status_code = 'APPROVED';
7815 
7816   l_return_val VARCHAR2(30) := FND_API.G_FALSE;
7817   l_budget_count NUMBER;
7818   l_status VARCHAR2(30);
7819   l_currency VARCHAR2(30);
7820 BEGIN
7821 	 open c_has_approved_budget(p_object_type, p_object_id);
7822 	 fetch c_has_approved_budget INTO l_budget_count;
7823 	 CLOSE c_has_approved_budget;
7824 
7825 	 Get_Object_Info (
7826 		 p_obj_type     => p_object_type,
7827 		 p_obj_id       => p_object_id,
7828        x_flag         => l_status,
7829        x_currency     => l_currency
7830 		);
7831 
7832 	IF l_budget_count > 0 AND l_status = 'Y' THEN
7833 	   l_return_val := FND_API.G_TRUE;
7834 	END IF;
7835 
7836 	return l_return_val;
7837 
7838 END can_post_to_budget;
7839 
7840 END Ams_Actmetric_Pvt;