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