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