DBA Data[Home] [Help]

PACKAGE BODY: APPS.AMS_UTILITY_PVT

Source


1 PACKAGE BODY AMS_Utility_PVT AS
2 /* $Header: amsvutlb.pls 120.5 2006/06/14 17:52:16 dbiswas noship $ */
3 
4 -- HISTORY
5 --
6 -- 15-Jun-2000    HOLIU       Added procedures to get qp details
7 -- 15-Jun-2000    PTENDULK    Commented the function is_in_my_area
8 --                            as it will be released in R2
9 -- 28-Jun-2000    RCHAHAL     Added Qualifier in get_qual_table_name_and_pk.
10 -- 13-Jul-2000    choang      Added get_resource_id
11 -- 07-Aug-2000    ptendulk    Added procedure Write_Conc_Log
12 -- 08-Aug-2000    ptendulk    Modified procedure Write_Conc_Log
13 -- 30-Jan-2001    MPande    Modified procedure  get_object_name
14 -- 30-Jan-2001    ptendulk    Modified Qualifier in get_qual_table_name_and_pk proc.
15 -- 13-Mar-2001    choang      Removed extra close cursor code in create_log.
16 --   03/27/2001    MPANDE    MOved 4 Procedures from OZF to AMS
17 --   03/29/2001    gjoby      Added LIST and SQL condtions
18 --                             in get_qual_table_name_and_pk
19 -- 29-Mar-2001    ptendulk    Modified get_system_status_type proc.
20 ---13-Apr-2001    feliu       Modified create_log proc.
21 -- 23-Apr-2001    feliu      Modified create_log proc.
22   -- skarumur - 25-apr-2000
23 -- 07-May-2001    choang      Added RCAM to get_qual_table_name_and_pk
24 -- 20-May-2001    ptendulk    Modified get_system_status_type procedure for Programs
25 -- 24-May-2001    feliu       Modified create_log proc.
26 -- 13-Jun-2001    ptendulk    Added code for MUKUMAR to add validation for EONE
27 -- 15-Jun-2001    choang      changed OFFR in get_qual_table_name_and_pk, and PRTN (to PTNR)
28 --                            in get_object_name
29 -- 16-Jun-2001    ptendulk    Added check_new_status_change procedure to obsolute
30 --                            the old check_status_change api
31 -- 19-Jun-2001    ptendulk    Modified Approval_Required_Flag function
32 -- 09-Jul-2001    ptendulk    Added new function Check_Status_Change
33 -- 13-Sep-2001    slkrishn    Added new function for amount rounding based on currency
34 -- 14-Jan-2001    sveerave    Added send_wf_standalone_message procedure, and
35 --                            Get_Resource_Role procedures for sending standalone mesages.
36 -- 18-Mar-2002    choang      Added checkfile to dbdrv
37 -- 27-Mar-2002    dmvincen    Added dialog and component validiation.
38 -- 17-May-2002    choang      bug 2224836: changed get_sytem_timezone and get_user_timezone
39 --                            to use HZ timezone profiles.
40 -- 06-Jun-2002    sveerave    Added overloaded check_lookup_exists
41 --                            which accepts view_application_id, query from fnd_lookups
42 -- 06-Jun-2002    sveerave    Modified previous check_lookup_exists to call
43 --                            newly created procedure.
44 -- 17-Jun-2002    sveerave    Modified cursor in check_lookup_exists to have p_view_app_id
45 --                            as NUMBER
46 -- 10-Jul-2002    musman      Modified the procedure check_new_status_change, checking for
47 --                            CAPL instead of TAPL if the object type is 'DELV'
48 -- 19-Dec-2002    mayjain     Added get_install_info
49 -- 16-Dec-2003    dmvince     Added ALIST to get_qual_table_name_and_pk.
50 -- 15-Oct-2004    anchaudh    Fixed bug#3935312.
51 -- 05-Oct-2005    mkothari    chged unit_of_measure to unit_of_measure_tl
52 --                            in get_uom_name method.
53 -- 14-Jun-2006    dbiswas     updated validate_locking_rules to return if admin user
54 ---------------------------------------------------------------------
55   -- Added for use by bind_parse.
56   TYPE col_val_rec IS RECORD (
57       col_name    VARCHAR2(2000),
58       col_op      VARCHAR2(10),
59       col_value   VARCHAR2(2000) );
60 
61   TYPE col_val_tbl IS TABLE OF col_val_rec INDEX BY BINARY_INTEGER;
62 
63 ---------------------------------------------------------------------
64 -- FUNCTION
65 --    bind_parse
66 --
67 -- DESCRIPTION
68 --    Given a string containing the WHERE conditions in a WHERE
69 --    clause, return a tuple of column name and column value.
70 -- HISTORY
71 -- 25-Apr-2000 skarumur Created.
72 -- 26-Apr-2000 choang   Modified to handle <> conditions.
73 ---------------------------------------------------------------------
74   AMS_DEBUG_HIGH_ON CONSTANT BOOLEAN := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH);
75 AMS_DEBUG_LOW_ON CONSTANT BOOLEAN := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW);
76 AMS_DEBUG_MEDIUM_ON CONSTANT BOOLEAN := FND_MSG_PUB.CHECK_MSG_LEVEL(FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM);
77 
78 PROCEDURE bind_parse (
79      p_string IN VARCHAR2,
80      x_col_val_tbl OUT NOCOPY col_val_tbl
81   );
82 
83 
84 --======================================================================
85 -- PROCEDURE
86 --    debug_message
87 --
88 -- PURPOSE
89 --    Writes the message to the log file for the spec'd level and module
90 --    if logging is enabled for this level and module
91 --
92 -- HISTORY
93 --    01-Oct-2003  huili  Create.
94 --======================================================================
95 PROCEDURE debug_message (p_log_level IN NUMBER,
96                        p_module_name    IN VARCHAR2,
97                        p_text   IN VARCHAR2)
98 IS
99    l_pLog BOOLEAN;
100 
101 BEGIN
102   --IF( p_log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
103 
104   l_pLog := (p_log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL);
105   IF (p_log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
106     FND_LOG.STRING(p_log_level, p_module_name, p_text);
107   END IF;
108 END debug_message;
109 
110 
111 --======================================================================
112 -- PROCEDURE
113 --    log_message
114 --
115 -- PURPOSE
116 --    Writes a message to the log file if this level and module is enabled
117 --    The message gets set previously with FND_MESSAGE.SET_NAME,
118 --    SET_TOKEN, etc.
119 --    The message is popped off the message dictionary stack, if POP_MESSAGE
120 --    is TRUE.  Pass FALSE for POP_MESSAGE if the message will also be
121 --    displayed to the user later.
122 --    Example usage:
123 --    FND_MESSAGE.SET_NAME(...);    -- Set message
124 --    FND_MESSAGE.SET_TOKEN(...);   -- Set token in message
125 --    FND_LOG.MESSAGE(..., FALSE);  -- Log message
126 --    FND_MESSAGE.ERROR;            -- Display message
127 --
128 -- HISTORY
129 --    01-Oct-2003  huili  Create.
130 --======================================================================
131 
132 PROCEDURE log_message(p_log_level   IN NUMBER,
133                          p_module_name IN VARCHAR2,
134                          p_RCS_ID      IN VARCHAR2 := NULL,
135                          p_pop_message IN BOOLEAN DEFAULT NULL)
136 IS
137 
138 l_pLog BOOLEAN;
139 
140 BEGIN
141   --IF ( p_log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
142 
143   l_pLog := (p_log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL);
144 
145   IF (p_log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
146     IF p_RCS_ID IS NOT NULL THEN
147       FND_MESSAGE.SET_TOKEN(G_RCS_ID, p_RCS_ID);
148     END IF;
149     FND_LOG.MESSAGE(p_log_level, p_module_name, p_pop_message);
150   END IF;
151 END log_message;
152 
153 --======================================================================
154 -- FUNCTION
155 --    logging_enabled
156 --
157 -- PURPOSE
158 --    Return whether logging is enabled for a particular level
159 --
160 -- HISTORY
161 --    03-Oct-2003  huili  Create.
162 --======================================================================
163 FUNCTION logging_enabled (p_log_level IN NUMBER)
164   RETURN BOOLEAN
165 IS
166 BEGIN
167   RETURN (p_log_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL);
168 END;
169 
170 
171 
172 ---------------------------------------------------------------------
173 -- FUNCTION
174 --    check_fk_exists
175 --
176 -- HISTORY
177 --    05/14/99  cklee  Created.
178 -- 25-Apr-2000 choang   modified to use bind variables.
179 ---------------------------------------------------------------------
180 FUNCTION check_fk_exists(
181    p_table_name   IN VARCHAR2,
182    p_pk_name      IN VARCHAR2,
183    p_pk_value     IN VARCHAR2,
184    p_pk_data_type IN NUMBER := g_number,
185    p_additional_where_clause  IN VARCHAR2 := NULL
186 )
187 RETURN VARCHAR2
188 IS
189 
190    l_sql   VARCHAR2(4000);
191    l_count NUMBER;
192 
193 BEGIN
194    l_sql := 'SELECT 1 FROM DUAL WHERE EXISTS (SELECT 1 FROM ' || UPPER(p_table_name);
195    l_sql := l_sql || ' WHERE ' || UPPER(p_pk_name) || ' = :b1';
196 
197    IF p_additional_where_clause IS NOT NULL THEN
198       -- given time, incorporate bind_parse
199       l_sql := l_sql || ' AND ' || p_additional_where_clause;
200    END IF;
201 
202    l_sql := l_sql || ')';
203 
204    IF (AMS_DEBUG_HIGH_ON) THEN
205       debug_message('SQL statement: '||l_sql);
206    END IF;
207 
208    BEGIN
209       EXECUTE IMMEDIATE l_sql INTO l_count
210       USING p_pk_value;
211    EXCEPTION
212       WHEN NO_DATA_FOUND THEN
213          l_count := 0;
214    END;
215 
216    IF l_count = 0 THEN
217       RETURN FND_API.g_false;
218    ELSE
219       RETURN FND_API.g_true;
220    END IF;
221 
222 END check_fk_exists;
223 
224 
225 ---------------------------------------------------------------------
226 -- FUNCTION
227 --    check_lookup_exists
228 --
229 -- HISTORY
230 --    05/14/99  cklee  Created.
231 -- 25-Apr-2000 choang   Use bind variables.
232 -- 07-jun-2002  sveerave  if table name is specifically not passed, changes
233 --                        are made to call overloaded procedure.
234 ---------------------------------------------------------------------
235 FUNCTION check_lookup_exists(
236    p_lookup_table_name  IN VARCHAR2 := g_ams_lookups,
237    p_lookup_type        IN VARCHAR2,
238    p_lookup_code        IN VARCHAR2
239 )
240 Return VARCHAR2
241 IS
242 
243    l_sql   VARCHAR2(4000);
244    l_count NUMBER;
245 
246 BEGIN
247 
248   IF p_lookup_table_name = g_ams_lookups THEN
249     return check_lookup_exists (
250           p_lookup_type =>  p_lookup_type
251         , p_lookup_code =>  p_lookup_code
252         , p_view_application_id => 530
253         );
254   ELSE
255     l_sql := 'SELECT 1 FROM DUAL WHERE EXISTS (SELECT 1 FROM ' || p_lookup_table_name;
256     l_sql := l_sql || ' WHERE LOOKUP_TYPE = :b1';
257     l_sql := l_sql || ' AND LOOKUP_CODE = :b2';
258     l_sql := l_sql || ' AND ENABLED_FLAG = ''Y'')';
259 
260     IF (AMS_DEBUG_HIGH_ON) THEN
261        debug_message('SQL statement: '||l_sql);
262     END IF;
263 
264     BEGIN
265       EXECUTE IMMEDIATE l_sql INTO l_count
266       USING p_lookup_type, p_lookup_code;
267     EXCEPTION
268       WHEN NO_DATA_FOUND THEN
269          l_count := 0;
270     END;
271     IF l_count = 0 THEN
272       RETURN FND_API.g_false;
273     ELSE
274       RETURN FND_API.g_true;
275     END IF;
276   END IF;
277 
278 END check_lookup_exists;
279 
280 
281 
282 ---------------------------------------------------------------------
283 -- FUNCTION
284 --    overloaded check_lookup_exists
285 -- PURPOSE
286 --    This function checks if a lookup_code is valid from fnd_lookups when
287 --    view_application_id is passed in.
288 -- HISTORY
289 --   07-jun-2002  sveerave created.
290 --   17-Jun-2002  sveerave Modified cursor to have p_view_app_id as NUMBER
291 ---------------------------------------------------------------------
292 FUNCTION check_lookup_exists(
293    p_lookup_type        IN VARCHAR2,
294    p_lookup_code        IN VARCHAR2,
295    p_view_application_id  IN  NUMBER
296 )
297 Return VARCHAR2
298 IS
299   CURSOR cur_check_lookup_exists(  p_lookup_type VARCHAR2
300                                  , p_lookup_code VARCHAR2
301                                  , p_view_app_id NUMBER)  IS
302       SELECT 1 FROM fnd_lookup_values lkup
303         WHERE lkup.LOOKUP_TYPE = p_lookup_type
304           AND lkup.LOOKUP_CODE = p_lookup_code
305           AND lkup.view_application_id = p_view_app_id
306           AND lkup.ENABLED_FLAG = 'Y'
307           AND lkup.language = USERENV('LANG')
308           AND lkup.security_group_id = to_number(decode(substrb(userenv('CLIENT_INFO'),55,1
309                                                                ), ' ', '0'
310                                                                  , NULL, '0'
311                                                                  , substrb(userenv('CLIENT_INFO'),55,10
312                                                                           )
313                                                         )
314                                                  );
315     l_count NUMBER := 0;
316 
317 BEGIN
318 
319   OPEN cur_check_lookup_exists(  p_lookup_type
320                                , p_lookup_code
321                                , p_view_application_id);
322   FETCH cur_check_lookup_exists INTO l_count;
323   CLOSE cur_check_lookup_exists;
324 
325    IF l_count = 0 THEN
326       RETURN FND_API.g_false;
327    ELSE
328       RETURN FND_API.g_true;
329    END IF;
330 
331 END check_lookup_exists;
332 
333 
334 ---------------------------------------------------------------------
335 -- FUNCTION
336 --    check_uniqueness
337 --
338 -- HISTORY
339 --   05/19/99  cklee  Created.
340 -- 25-Apr-2000 choang   Use bind_parse to enable use of bind variables.
341 ---------------------------------------------------------------------
342 FUNCTION check_uniqueness(
343    p_table_name    IN VARCHAR2,
344    p_where_clause  IN VARCHAR2
345 )
346 RETURN VARCHAR2
347 IS
348 
349    l_sql   VARCHAR2(4000);
350    l_count NUMBER;
351 
352    l_bind_tbl  col_val_tbl;
353 
354 BEGIN
355 
356    l_sql := 'SELECT 1 FROM DUAL WHERE EXISTS (SELECT 1 FROM ' || UPPER(p_table_name);
357 --   l_sql := l_sql || ' WHERE ' || p_where_clause;
358 
359    bind_parse (p_where_clause, l_bind_tbl);
360 
361    --
362    -- choang - 25-Apr-2000
363    -- Support up to 4 WHERE conditions for uniqueness.  If
364    -- the number of conditions changes, then must also revise
365    -- the execute portion of the code.
366    IF l_bind_tbl.COUNT <= 4 THEN
367       l_sql := l_sql || ' WHERE ' || l_bind_tbl(1).col_name || ' ' || l_bind_tbl(1).col_op || ' :b1';
368       FOR i IN 2..l_bind_tbl.COUNT LOOP
369          l_sql := l_sql || ' AND ' || l_bind_tbl(i).col_name || ' ' || l_bind_tbl(i).col_op || ' :b' || i;
370       END LOOP;
371    ELSE
372       -- Exceeded the number of conditions supported
373       -- for bind variables.
374       l_sql := l_sql || ' WHERE ' || p_where_clause;
375    END IF;
376 
377    l_sql := l_sql || ')';
378 
379    IF (AMS_DEBUG_HIGH_ON) THEN
380       debug_message('SQL statement: '||l_sql);
381    END IF;
382 
383    --
384    -- choang - 25-Apr-2000
385    -- Modify here if number of WHERE conditions
386    -- supported changes.
387    BEGIN
388       IF l_bind_tbl.COUNT = 1 THEN
389          EXECUTE IMMEDIATE l_sql INTO l_count
390          USING l_bind_tbl(1).col_value;
391       ELSIF l_bind_tbl.COUNT = 2 THEN
392          EXECUTE IMMEDIATE l_sql INTO l_count
393          USING l_bind_tbl(1).col_value, l_bind_tbl(2).col_value;
394       ELSIF l_bind_tbl.COUNT = 3 THEN
395          EXECUTE IMMEDIATE l_sql INTO l_count
396          USING l_bind_tbl(1).col_value, l_bind_tbl(2).col_value, l_bind_tbl(3).col_value;
397       ELSIF l_bind_tbl.COUNT = 4 THEN
398          EXECUTE IMMEDIATE l_sql INTO l_count
399          USING l_bind_tbl(1).col_value, l_bind_tbl(2).col_value, l_bind_tbl(3).col_value, l_bind_tbl(4).col_value;
400       ELSE
401          EXECUTE IMMEDIATE l_sql INTO l_count;
402       END IF;
403    EXCEPTION
404       WHEN NO_DATA_FOUND THEN
405          l_count := 0;
406    END;
407 
408    IF l_count = 0 THEN
409       RETURN FND_API.g_true;
410    ELSE
411       RETURN FND_API.g_false;
412    END IF;
413 
414 END check_uniqueness;
415 
416 
417 ---------------------------------------------------------------------
418 -- FUNCTION
419 --    is_Y_or_N
420 --
421 -- HISTORY
422 --   05/19/99  cklee  Created.
423 ---------------------------------------------------------------------
424 FUNCTION is_Y_or_N(
425    p_value IN VARCHAR2
426 )
427 RETURN VARCHAR2
428 IS
429 BEGIN
430    IF p_value = 'Y' or p_value = 'N' THEN
431       RETURN FND_API.g_true;
432    ELSE
433       RETURN FND_API.g_false;
434    END IF;
435 END is_Y_or_N;
436 
437 
438 ---------------------------------------------------------------------
439 -- PROCEDURE
440 --    debug_message
441 --
442 -- HISTORY
443 -- 10/10/99    holiu    Created.
444 -- 13-mar-2002 choang   bug 2262529 - g_miss_char is a nil char which
445 --                      caused some problems in the java layer; removed
446 --                      g_miss_char from the error message.
447 -- 14-mar-2002 choang   added text G_MISS_CHAR to be displayed in place
448 --                      of nil char for debugging purposes.
449 -- 09-Dec-2002 choang   All calls to debug should check for msg level
450 --                      before calling; removing the check in the debug
451 --                      procedure to avoid reduncy.
452 ---------------------------------------------------------------------
453 PROCEDURE debug_message(
454    p_message_text   IN  VARCHAR2,
455    p_message_level  IN  NUMBER := NULL
456 )
457 IS
458 BEGIN
459    FND_MESSAGE.set_name('AMS', 'AMS_API_DEBUG_MESSAGE');
460    FND_MESSAGE.set_token('TEXT', REPLACE (p_message_text, FND_API.G_MISS_CHAR, 'G_MISS_CHAR'));
461    FND_MSG_PUB.add;
462 END debug_message;
463 
464 
465 ---------------------------------------------------------------------
466 -- PROCEDURE
467 --    error_message
468 --
469 -- HISTORY
470 --    11/01/99  holiu  Created.
471 ---------------------------------------------------------------------
472 PROCEDURE error_message(
473    p_message_name VARCHAR2,
474    p_token_name   VARCHAR2 := NULL,
475    P_token_value  VARCHAR2 := NULL
476 )
477 IS
478 BEGIN
479    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
480       FND_MESSAGE.set_name('AMS', p_message_name);
481       IF p_token_name IS NOT NULL THEN
482          FND_MESSAGE.set_token(p_token_name, p_token_value);
483       END IF;
484       FND_MSG_PUB.add;
485    END IF;
486 END error_message;
487 
488 
489 ---------------------------------------------------------------------
490 -- PROCEDURE
491 --    display_messages
492 --
493 -- HISTORY
494 --    10/26/99  holiu  Created.
495 ---------------------------------------------------------------------
496 PROCEDURE display_messages
497 IS
498    l_count  NUMBER;
499    l_msg    VARCHAR2(2000);
500 BEGIN
501    l_count := FND_MSG_PUB.count_msg;
502    FOR i IN 1 .. l_count LOOP
503       l_msg := FND_MSG_PUB.get(i, FND_API.g_false);
504       -- holiu: remove since adchkdrv does not like it
505 --      DBMS_OUTPUT.put_line('(' || i || ') ' || l_msg);
506    END LOOP;
507 END display_messages;
508 
509 
510 ---------------------------------------------------------------------
511 -- NAME
512 --    create_log
513 --
514 -- HISTORY
515 --   09/21/99  ptendulk  Created.
516 -- 12-Jan-2000 choang    Added autonomous transaction.
517 ---------------------------------------------------------------------
518 PROCEDURE create_log(
519    x_return_status    OUT NOCOPY VARCHAR2,
520    p_arc_log_used_by  IN  VARCHAR2,
521    p_log_used_by_id   IN  VARCHAR2,
522    p_msg_data         IN  VARCHAR2,
523    p_msg_level        IN  NUMBER    DEFAULT NULL,
524    p_msg_type         IN  VARCHAR2  DEFAULT NULL,
525    p_desc             IN  VARCHAR2  DEFAULT NULL,
526    p_budget_id        IN  NUMBER    DEFAULT NULL,
527    p_threshold_id     IN  NUMBER    DEFAULT NULL,
528    p_transaction_id   IN  NUMBER    DEFAULT NULL,
529    p_notification_creat_date    IN DATE DEFAULT NULL,
530    p_activity_log_id   IN  NUMBER   DEFAULT NULL
531 )
532 IS
533    PRAGMA AUTONOMOUS_TRANSACTION;
534    x_rowid         VARCHAR2(30);
535    l_act_log_id    ams_act_logs.activity_log_id%TYPE;
536    l_log_tran_id   ams_act_logs.log_transaction_id%TYPE;
537 
538    CURSOR c_log_seq IS
539    SELECT ams_act_logs_s.NEXTVAL,
540           ams_act_logs_transaction_id_s.NEXTVAL
541      FROM DUAL;
542 
543    CURSOR c_log(l_my_log_id VARCHAR2) IS
544    SELECT rowid
545      FROM ams_act_logs
546     WHERE activity_log_id = l_my_log_id;
547 
548 BEGIN
549 
550    -- Standard Start of API savepoint
551    SAVEPOINT Create_act_log;
552 
553    --  Initialize API return status to success
554    x_return_status := FND_API.G_RET_STS_SUCCESS;
555 
556    --
557    -- API body
558    --
559 
560    -- open cursor AND fetch into local variable
561    OPEN c_log_seq;
562    FETCH c_log_seq INTO l_act_log_id,l_log_tran_id ;
563    CLOSE c_log_seq;
564 
565 
566    INSERT INTO ams_act_logs (
567       activity_log_id
568       -- standard who columns
569       ,last_update_date
570       ,last_updated_by
571       ,creation_date
572       ,created_by
573       ,last_update_login
574       ,object_version_number
575       ,act_log_used_by_id
576       ,arc_act_log_used_by
577       ,log_transaction_id
578       ,log_message_text
579       ,log_message_level
580       ,log_message_type
581       ,description
582       ,budget_id
583       ,threshold_id
584       ,notification_creation_date
585    )
586    VALUES (
587        NVL(p_activity_log_id,l_act_log_id)
588       -- standard who columns
589       ,SYSDATE
590       ,FND_GLOBAL.User_Id
591       ,SYSDATE
592       ,FND_GLOBAL.User_Id
593       ,FND_GLOBAL.Conc_Login_Id
594       ,1                 -- Object Version Number
595       ,p_log_used_by_id
596       ,p_arc_log_used_by
597       ,NVL(p_transaction_id,l_log_tran_id)
598       ,p_msg_data
599       ,p_msg_level
600       ,p_msg_type
601       ,p_desc
602       ,p_budget_id
603       ,p_threshold_id
604       ,p_notification_creat_date
605    ) ;
606 
607 
608    OPEN c_log(l_act_log_id);
609    FETCH c_log INTO x_rowid;
610    IF (c_log%NOTFOUND) THEN
611       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
612    END IF;
613    CLOSE c_log;
614 
615    --
616    -- END of API body.
617    --
618 
619    COMMIT;
620 EXCEPTION
621 
622    WHEN OTHERS THEN
623       ROLLBACK TO create_act_log;
624       x_return_status := FND_API.g_ret_sts_unexp_error;
625 
626 END create_log;
627 
628 
629 ---------------------------------------------------------------------
630 -- PROCEDURE
631 --    get_qual_table_name_and_pk
632 --
633 -- HISTORY
634 --    05/20/99    tdonohoe Created.
635 --    10/13/99    ptendulk Removed Parameter p_qual_id;
636 --       Added qualifiers DELI, EVEH;
637 --       Changed the name from Event Offerings to Event Offers
638 --       Changed the name from Event Offerings to Event Offers
639 --    01/06/99    ptendulk Changed the return Statuses to Standard
640 --    return statuses
641 --    04/24/00    tdonohoe Added Qualifier 'FCST' Forecast.
642 --    06/14/00    ptendulk Added qualifier 'OFFR' Offers
643 --    06/28/00    rchahal  Added Qualifier 'FUND' Fund.
644 -- 30-Jan-2001    ptendulk Modified Qualifier table for Schedules.
645 -- 06-Apr-2001    choang   Added DIWB, MODL and SCOR in get_qual_table_name_and_pk
646 --                         added error message if no valid sys_qual mapped.
647 -- 09-Apr-2001    choang   added CELL
648 -- 13-Jun-2001    ptendulk Added EONE
649 -- 15-Jun-2001    choang   Changed OFFR to return ams_offers and qp_list_header_id.
650 ---------------------------------------------------------------------
651 PROCEDURE get_qual_table_name_and_pk(
652    p_sys_qual      IN    VARCHAR2,
653    x_return_status OUT NOCOPY   VARCHAR2,
654    x_table_name    OUT NOCOPY   VARCHAR2,
655    x_pk_name       OUT NOCOPY   VARCHAR2
656 )
657 IS
658 BEGIN
659    -- initialize return status
660    x_return_status := FND_API.G_RET_STS_SUCCESS;
661 
662    IF (p_sys_qual ='CSCH') THEN
663       -- Start of code modified by ptendulk on 30-Jan-2001
664       --x_table_name    := 'AMS_CAMPAIGN_SCHEDULES';
665       --x_pk_name       := 'CAMPAIGN_SCHEDULE_ID';
666       -- End of code modified by ptendulk on 30-Jan-2001
667       x_table_name    := 'AMS_CAMPAIGN_SCHEDULES_B';
668       x_pk_name       := 'SCHEDULE_ID';
669    ELSIF (p_sys_qual ='CAMP') THEN
670       -- Start of code modified by ptendulk on 30-Jan-2001
671       --x_table_name    := 'AMS_CAMPAIGNS_VL';
672       -- End of code modified by ptendulk on 30-Jan-2001
673       x_table_name    := 'AMS_CAMPAIGNS_ALL_B';
674       x_pk_name       := 'CAMPAIGN_ID';
675    ELSIF (p_sys_qual ='EVEO') THEN
676       x_table_name    := 'AMS_EVENT_OFFERS_VL';
677       x_pk_name       := 'EVENT_OFFER_ID';
678    ELSIF (p_sys_qual ='EONE') THEN
679       x_table_name    := 'AMS_EVENT_OFFERS_VL';
680       x_pk_name       := 'EVENT_OFFER_ID';
681    ELSIF (p_sys_qual ='EVEH') THEN
682       x_table_name    := 'AMS_EVENT_HEADERS_VL';
683       x_pk_name       := 'EVENT_HEADER_ID';
684    ELSIF (p_sys_qual ='DELV') THEN
685       x_table_name    := 'AMS_DELIVERABLES_VL';
686       x_pk_name       := 'DELIVERABLE_ID';
687    ELSIF (p_sys_qual ='AMET') THEN
688       x_table_name    := 'AMS_ACT_METRICS_ALL';
689       x_pk_name       := 'ACTIVITY_METRIC_ID';
690    --=========================================================
691    -- Following line of code is added by ptendulk on 14Jun2000
692    --=========================================================
693    ELSIF (p_sys_qual ='OFFR') THEN --added tdonohoe 04/24/2000
694       x_table_name    := 'OZF_OFFERS';   -- anchaudh changed ams_offers to ozf_offers to fix bug#3935312.
695       x_pk_name       := 'QP_LIST_HEADER_ID';
696    ELSIF (p_sys_qual ='FCST') THEN --added tdonohoe 04/24/2000
697       x_table_name    := 'OZF_ACT_FORECASTS_ALL';
698       x_pk_name       := 'FORECAST_ID';
699    ELSIF (p_sys_qual ='FUND') THEN --added rchahal 06/28/2000
700       x_table_name    := 'OZF_FUND_DETAILS_V';
701       x_pk_name       := 'FUND_ID';
702     ELSIF (p_sys_qual ='PRIC') THEN --added skarumur 12/17/2000
703        x_table_name    := 'AMS_PRICE_LIST_ATTRIBUTES';
704        x_pk_name       := 'QP_LIST_HEADER_ID';
705     ELSIF (p_sys_qual ='LIST') THEN --added gjoby 03/26/2001
706        x_table_name    := 'AMS_LIST_HEADERS_VL';
707        x_pk_name       := 'LIST_HEADER_ID';
708     ELSIF (p_sys_qual ='IMPH') THEN --added gjoby 03/26/2001
709        x_table_name    := 'AMS_IMP_LIST_HEADERS_VL';
710        x_pk_name       := 'IMPORT_LIST_HEADER_ID';
711     ELSIF (p_sys_qual ='SQL') THEN --added gjoby 03/26/2001
712        x_table_name    := 'AMS_LIST_QUERIES_ALL';
713        x_pk_name       := 'LIST_QUERY_ID';
714    ELSIF p_sys_qual = 'DIWB' THEN
715       x_table_name := 'AMS_DISCOVERER_SQL';
716       x_pk_name := 'DISCOVERER_SQL_ID';
717    ELSIF p_sys_qual = 'MODL' THEN
718       x_table_name := 'AMS_DM_MODELS_ALL_B';
719       x_pk_name := 'MODEL_ID';
720    ELSIF p_sys_qual = 'SCOR' THEN
721       x_table_name := 'AMS_DM_SCORES_ALL_B';
722       x_pk_name := 'SCORE_ID';
723    ELSIF p_sys_qual = 'CELL' THEN
724       x_table_name := 'AMS_CELLS_ALL_B';
725       x_pk_name := 'CELL_ID';
726    ELSIF (p_sys_qual = 'RCAM') THEN
727       x_table_name    := 'AMS_CAMPAIGNS_ALL_B';
728       x_pk_name       := 'CAMPAIGN_ID';
729    ELSIF p_sys_qual = 'DILG' THEN  -- Added dmvincen 03/27/2002
730       x_table_name    := 'AMS_DIALOGS_ALL_B';
731       x_pk_name       := 'DIALOG_ID';
732    ELSIF p_sys_qual in  -- Added dmvincen 03/27/2002
733          ('AMS_COMP_START', 'AMS_COMP_SHOW_WEB_PAGE', 'AMS_COMP_END') THEN
734       x_table_name    := 'AMS_DLG_FLOW_COMPS_B';
735       x_pk_name       := 'FLOW_COMPONENT_ID';
736 	ELSIF p_sys_qual = 'ALIST' THEN
737 		x_table_name    := 'AMS_ACT_LISTS';
738 		x_pk_name       := 'ACT_LIST_HEADER_ID';
739    ELSE
740       AMS_Utility_PVT.error_message ('AMS_INVALID_SYS_QUAL', 'SYS_QUALIFIER', p_sys_qual);
741       x_return_status := FND_API.g_ret_sts_unexp_error;
742       x_table_name    := NULL;
743       x_pk_name       := NULL;
744    END IF;
745 
746 END get_qual_table_name_and_pk;
747 
748 
749 --------------------------------------------------------------------
750 -- NAME
751 --    get_source_code
752 --
753 -- HISTORY
754 --   08/18/99  tdonohoe  Created.
755 --------------------------------------------------------------------
756 PROCEDURE get_source_code(
757    p_activity_type IN    VARCHAR2,
758    p_activity_id   IN    NUMBER,
759    x_return_status OUT NOCOPY   VARCHAR2,
760    x_source_code   OUT NOCOPY   VARCHAR2 ,
761    x_source_id     OUT NOCOPY   NUMBER
762 )
763 IS
764 BEGIN
765 
766    SELECT source_code,source_code_for_id INTO x_source_code,x_source_id
767      FROM ams_source_codes
768     WHERE arc_source_code_for = UPPER(p_activity_type)
769       AND source_code_for_id  = UPPER(p_activity_id);
770 
771 
772 
773    IF SQL%NOTFOUND THEN
774       x_return_status := FND_API.G_FALSE;
775    ELSE
776        x_return_status := FND_API.G_TRUE;
777    END IF;
778 
779 
780 EXCEPTION
781 
782    WHEN OTHERS THEN
783       x_source_code := NULL;
784       x_source_id := NULL;
785       x_return_status := FND_API.G_FALSE;
786 
787 End;
788 
789 
790 ---------------------------------------------------------------------
791 -- FUNCTION
792 --   get_object_name
793 --
794 -- HISTORY
795 --   10/15/99  holiu    Created.
796 --   11/03/99  mpande   inserted deliverable,event
797 --   11/16/99  tdonohoe inserted campaign schedule.
798 -- 09-Dec-1999 choang   Changed references of ams_event_offers_all_vl to
799 --                      ams_event_offers_vl and ams_event_headers_all_vl
800 --                      to ams_event_headers_vl.
801 -- 24-Aug-2000 choang   Added FUND
802 -- 28-Sep-2000 choang   Added PRTN
803 -- 13-Jun-2001    ptendulk Added EONE
804 -- 15-Jun-2001 choang   changed PRNT to PTNR
805 --------------------------------------------------------------------
806 FUNCTION get_object_name(
807    p_sys_arc_qualifier IN VARCHAR2,
808    p_object_id         IN NUMBER
809 )
810 RETURN VARCHAR2
811 IS
812 
813    l_object_name  VARCHAR2(1000);
814 
815    CURSOR c_campaign(p_object_id IN NUMBER) IS
816    SELECT campaign_name
817      FROM ams_campaigns_vl
818     WHERE campaign_id = p_object_id;
819 
820   --added 11/16/99 tdonohoe
821   CURSOR c_campaign_sched(p_object_id IN NUMBER) IS
822   SELECT c.campaign_name
823   FROM   ams_campaigns_vl c,
824          ams_campaign_schedules s
825   WHERE s.campaign_schedule_id = p_object_id
826   AND   s.campaign_id          = c.campaign_id;
827 
828   CURSOR c_deliv(p_object_id IN NUMBER) IS
829    SELECT deliverable_name
830      FROM ams_deliverables_vl
831     WHERE deliverable_id = p_object_id;
832 
833    CURSOR c_event_header(p_object_id IN NUMBER) IS
834    SELECT event_header_name
835      FROM ams_event_headers_vl
836     WHERE event_header_id = p_object_id;
837 
838   CURSOR c_event_offer(p_object_id IN NUMBER) IS
839    SELECT event_offer_name
840      FROM ams_event_offers_vl
841     WHERE event_offer_id = p_object_id;
842 --- updated by mpande 01/30/2001 to look into ozf_funds_all_vl not ozf_funds_vl
843    CURSOR c_fund (p_object_id IN NUMBER) IS
844       SELECT short_name
845       FROM   ozf_funds_all_vl
846       WHERE  fund_id = p_object_id;
847 
848    CURSOR c_partner (p_object_id IN NUMBER) IS
849       SELECT party_name
850       FROM   hz_parties
851       WHERE  party_id = p_object_id;
852 BEGIN
853 
854    l_object_name := NULL;
855 
856    IF p_sys_arc_qualifier IS NULL OR p_object_id IS NULL THEN
857       RETURN l_object_name;
858    END IF;
859 
860    IF p_sys_arc_qualifier = 'CAMP' THEN
861       OPEN c_campaign(p_object_id);
862       FETCH c_campaign INTO l_object_name;
863       CLOSE c_campaign;
864    ELSIF p_sys_arc_qualifier = 'CSCH' THEN
865       OPEN c_campaign_sched(p_object_id);
866       FETCH c_campaign_sched INTO l_object_name;
867       CLOSE c_campaign_sched;
868    ELSIF p_sys_arc_qualifier = 'DELI' THEN
869       OPEN c_deliv(p_object_id);
870       FETCH c_deliv INTO l_object_name;
871       CLOSE c_deliv;
872    ELSIF p_sys_arc_qualifier = 'EVEH' THEN
873       OPEN c_event_header(p_object_id);
874       FETCH c_event_header INTO l_object_name;
875       CLOSE c_event_header;
876    ELSIF p_sys_arc_qualifier = 'EVEO' THEN
877       OPEN c_event_offer(p_object_id);
878       FETCH c_event_offer INTO l_object_name;
879       CLOSE c_event_offer;
880    ELSIF p_sys_arc_qualifier = 'EONE' THEN
881       OPEN c_event_offer(p_object_id);
882       FETCH c_event_offer INTO l_object_name;
883       CLOSE c_event_offer;
884    ELSIF p_sys_arc_qualifier = 'FUND' THEN
885       OPEN c_fund (p_object_id);
886       FETCH c_fund INTO l_object_name;
887       CLOSE c_fund;
888    ELSIF p_sys_arc_qualifier = 'PTNR' THEN
889       OPEN c_partner (p_object_id);
890       FETCH c_partner INTO l_object_name;
891       CLOSE c_partner;
892    END IF;
893 
894    RETURN l_object_name;
895 
896 END get_object_name;
897 
898 
899 ---------------------------------------------------------------------
900 -- PROCEDURE
901 --    Convert_Currency
902 -- NOTE
903 --    Modified from code done by ptendulk.
904 -- HISTORY
905 -- 08-Dec-1999 choang        Created.
906 -- 31-Aug-2000 ptendulk      Added x_conversion_type parameter to the
907 --                           Convert_Closest_Amount procedure
908 -- 09-Oct-2000 choang        Modified error message handling for no rate
909 --                           and invalid currency.
910 ---------------------------------------------------------------------
911 PROCEDURE Convert_Currency (
912    x_return_status      OUT NOCOPY VARCHAR2,
913    p_from_currency      IN  VARCHAR2,
914    p_to_currency        IN  VARCHAR2,
915    p_conv_date          IN  DATE DEFAULT SYSDATE,
916    p_from_amount        IN  NUMBER,
917    x_to_amount          OUT NOCOPY NUMBER
918 )
919 IS
920    L_CONVERSION_TYPE_PROFILE  CONSTANT VARCHAR2(30) := 'AMS_CURR_CONVERSION_TYPE';
921    L_USER_RATE             CONSTANT NUMBER := 1;   -- Currenty not used.
922    L_MAX_ROLL_DAYS         CONSTANT NUMBER := -1;  -- Negative so API rolls back to find the last conversion rate.
923    l_denominator           NUMBER;  -- Not used in Marketing.
924    l_numerator             NUMBER;  -- Not used in Marketing.
925    l_rate                  NUMBER;  -- Not used in Marketing.
926    l_conversion_type       VARCHAR2(30);  -- Currency conversion type; see API documention for details.
927 BEGIN
928    -- Initialize return status.
929    x_return_status := FND_API.G_RET_STS_SUCCESS;
930 
931    -- Get the currency conversion type from profile option
932    l_conversion_type := FND_PROFILE.Value (L_CONVERSION_TYPE_PROFILE);
933 
934    -- Call the proper GL API to convert the amount.
935    GL_Currency_API.Convert_Closest_Amount (
936       x_from_currency         => p_from_currency,
937       x_to_currency           => p_to_currency,
938       x_conversion_date       => p_conv_date,
939       x_conversion_type       => l_conversion_type,
940       x_user_rate             => L_USER_RATE,
941       x_amount                => p_from_amount,
942       x_max_roll_days         => L_MAX_ROLL_DAYS,
943       x_converted_amount      => x_to_amount,
944       x_denominator           => l_denominator,
945       x_numerator             => l_numerator,
946       x_rate                  => l_rate
947    );
948 EXCEPTION
949    WHEN GL_Currency_API.NO_RATE THEN
950       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
951          FND_MESSAGE.Set_Name ('AMS', 'AMS_NO_RATE');
952          FND_MESSAGE.Set_Token ('CURRENCY_FROM', p_from_currency);
953          FND_MESSAGE.Set_Token ('CURRENCY_TO', p_to_currency);
954          FND_MSG_PUB.Add;
955       END IF;
956       x_return_status := FND_API.G_RET_STS_ERROR;
957    WHEN GL_Currency_API.INVALID_CURRENCY THEN
958       IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
959          FND_MESSAGE.Set_Name ('AMS', 'AMS_INVALID_CURR');
960          FND_MESSAGE.Set_Token ('CURRENCY_FROM', p_from_currency);
961          FND_MESSAGE.Set_Token ('CURRENCY_TO', p_to_currency);
962          FND_MSG_PUB.Add;
963       END IF;
964       x_return_status := FND_API.G_RET_STS_ERROR;
965 END Convert_Currency;
966 
967 ---------------------------------------------------------------------
968 -- PROCEDURE
969 --    get_lookup_meaning
970 -- created by mpande 01/11/00
971 -- PURPOSE
972 --    This procedure will return the meaning from ams_lookups if
973 --  you pass the right lookup_type and lookup_code
974 -- HISTORY
975 -- 28-Apr-2000 choang   Modified to use explicit cursor.
976 -- 07-Aug-2000 choang   Added close cursor for success conditions
977 --                      in the fetch.
978 ---------------------------------------------------------------------
979 
980 PROCEDURE get_lookup_meaning (
981    p_lookup_type      IN    VARCHAR2,
982    p_lookup_code      IN   VARCHAR2,
983    x_return_status OUT NOCOPY   VARCHAR2,
984    x_meaning       OUT NOCOPY   VARCHAR2
985 )
986 IS
987    CURSOR c_meaning IS
988       SELECT meaning
989       FROM   ams_lookups
990       WHERE  lookup_type = UPPER (p_lookup_type)
991       AND    lookup_code = UPPER (p_lookup_code);
992 BEGIN
993    OPEN c_meaning;
994    FETCH c_meaning INTO x_meaning;
995    IF c_meaning%NOTFOUND THEN
996       CLOSE c_meaning;
997       x_return_status := FND_API.G_RET_STS_ERROR;
998       x_meaning:=  NULL;
999    ELSE
1000       CLOSE c_meaning;
1001       x_return_status := FND_API.G_RET_STS_SUCCESS;
1002    END IF;
1003 EXCEPTION
1004    WHEN OTHERS THEN
1005       IF c_meaning%ISOPEN THEN
1006          CLOSE c_meaning;
1007       END IF;
1008       x_return_status := FND_API.G_RET_STS_ERROR;
1009       x_meaning :=  NULL;
1010 END get_lookup_meaning;
1011 
1012 
1013 ---------------------------------------------------------------------
1014 -- PROCEDURE
1015 --    get_System_Timezone
1016 --
1017 -- PURPOSE
1018 --    This procedure will return the timezone from the System Timezone profile option
1019 -- HISTORY   created    04/24/2000 sugupta
1020 -- 17-May-2002 choang   bug 2224836: changed to use SERVER_TIMEZONE_ID
1021 -- 16-Dec-2005 prageorg Bug 4761850: Changed HZ_TIMEZONES_VL to FND_TIMEZONES_VL
1022 ---------------------------------------------------------------------
1023 PROCEDURE get_System_Timezone(
1024 
1025 x_return_status   OUT NOCOPY   VARCHAR2,
1026 x_sys_time_id     OUT NOCOPY   NUMBER,
1027 x_sys_time_name     OUT NOCOPY VARCHAR2
1028 ) IS
1029 
1030 l_sys_time_id  NUMBER;
1031 l_sys_name   VARCHAR2(80);
1032 
1033 cursor c_get_name(l_time_id IN NUMBER) is
1034 select NAME
1035  from  FND_TIMEZONES_VL
1036  where UPGRADE_TZ_ID = l_time_id;
1037 
1038 BEGIN
1039    --  Initialize API return status to success
1040    x_return_status := FND_API.G_RET_STS_SUCCESS;
1041    l_sys_time_id := FND_PROFILE.VALUE('SERVER_TIMEZONE_ID');
1042    OPEN c_get_name(l_sys_time_id);
1043    FETCH c_get_name into l_sys_name;
1044    IF (c_get_name%NOTFOUND) THEN
1045       CLOSE c_get_name;
1046       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1047      return;
1048     END IF;
1049    CLOSE c_get_name;
1050 
1051    x_sys_time_id := l_sys_time_id;
1052    x_sys_time_name := l_sys_name;
1053 EXCEPTION
1054    WHEN NO_DATA_FOUND THEN
1055       IF (c_get_name%ISOPEN) THEN
1056          CLOSE c_get_name;
1057       END IF;
1058       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1059 END get_System_Timezone;
1060 
1061 ---------------------------------------------------------------------
1062 -- PROCEDURE
1063 --    get_User_Timezone
1064 --
1065 -- PURPOSE
1066 --    This procedure will return the timezone from the User Timezone profile option
1067 -- HISTORY   created    04/24/2000 sugupta
1068 -- 17-May-2002 choang   bug 2224836: changed to use CLIENT_TIMEZONE_ID
1069 -- 16-Dec-2005 prageorg Bug 4761850: Changed HZ_TIMEZONES_VL to FND_TIMEZONES_VL
1070 ---------------------------------------------------------------------
1071 PROCEDURE get_User_Timezone(
1072 
1073 x_return_status   OUT NOCOPY   VARCHAR2,
1074 x_user_time_id    OUT NOCOPY   NUMBER,
1075 x_user_time_name  OUT NOCOPY   VARCHAR2
1076 ) IS
1077 
1078 l_user_time_id  NUMBER;
1079 l_user_time_name   VARCHAR2(80);
1080 
1081 cursor get_name(l_time_id IN NUMBER) is
1082 select NAME
1083  from  FND_TIMEZONES_VL
1084  where UPGRADE_TZ_ID = l_time_id;
1085 
1086 BEGIN
1087    --  Initialize API return status to success
1088    x_return_status := FND_API.G_RET_STS_SUCCESS;
1089    l_user_time_id := FND_PROFILE.VALUE('CLIENT_TIMEZONE_ID');
1090    OPEN get_name(l_user_time_id);
1091    FETCH get_name into l_user_time_name;
1092    IF (get_name%NOTFOUND) THEN
1093       CLOSE get_name;
1094       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1095      return;
1096     END IF;
1097    CLOSE get_name;
1098 
1099    x_user_time_id := l_user_time_id;
1100    x_user_time_name := l_user_time_name;
1101 EXCEPTION
1102    WHEN NO_DATA_FOUND THEN
1103       IF (get_name%ISOPEN) THEN
1104          CLOSE get_name;
1105       END IF;
1106       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1107 END get_User_Timezone;
1108 
1109 -------------------------------------------------------------------------------------------------
1110 -- PROCEDURE
1111 --    Convert_Timezone
1112 --
1113 -- PURPOSE
1114 --    This procedure will take the user timezone and the input time, depending on the parameter
1115 --    p_convert_type it will convert the input time to System timezone or sent Usertimezone
1116 -- HISTORY
1117 --     04/24/2000    sugupta    created
1118 --     04/26/2000    ptendulk   Modified Added a parameter which will tell
1119 --                              which timezone to convert time into.
1120 --                              If the convert type is 'SYS' then input time will be
1121 --                              converted into system timezone else it will be
1122 --                              converted to user timezone .
1123 ---------------------------------------------------------------------------------------------------
1124 PROCEDURE Convert_Timezone(
1125   p_init_msg_list       IN     VARCHAR2   := FND_API.G_FALSE,
1126   x_return_status       OUT NOCOPY    VARCHAR2,
1127   x_msg_count           OUT NOCOPY    NUMBER,
1128   x_msg_data            OUT NOCOPY    VARCHAR2,
1129 
1130   p_user_tz_id          IN     NUMBER   := null,
1131   p_in_time             IN     DATE  ,  -- required
1132   p_convert_type        IN     VARCHAR2 := 'SYS' , --  (SYS/USER)
1133 
1134   x_out_time            OUT NOCOPY    DATE
1135 ) IS
1136 
1137    l_sys_time_id     NUMBER;
1138    l_user_tz_id      NUMBER := p_user_tz_id ;
1139    l_sys_time_name      VARCHAR2(80);
1140    l_user_time_name     VARCHAR2(80);
1141    l_return_status      VARCHAR2(1);  -- Return value from procedures
1142 
1143         l_from_timezone_id      NUMBER ;
1144         l_to_timezone_id        NUMBEr ;
1145 BEGIN
1146 
1147    --  Initialize API return status to success
1148    x_return_status := FND_API.G_RET_STS_SUCCESS;
1149 
1150    get_System_Timezone(
1151       l_return_status,
1152       l_sys_time_id,
1153       l_sys_time_name);
1154 
1155    IF (l_return_status = FND_API.G_RET_STS_ERROR OR
1156       l_return_status = FND_API.G_RET_STS_UNEXP_ERROR )
1157    THEN
1158       x_return_status := l_return_status;
1159       RETURN;
1160    END IF;
1161 
1162         -- If the user timezone is not sent
1163         -- get it from profiles
1164         IF l_user_tz_id IS NULL THEN
1165               Get_User_Timezone(
1166                     x_return_status    => l_return_status,
1167                     x_user_time_id     => l_user_tz_id ,
1168                     x_user_time_name   => l_user_time_name
1169                     ) ;
1170         END IF;
1171 
1172         IF (l_return_status = FND_API.G_RET_STS_ERROR OR
1173       l_return_status = FND_API.G_RET_STS_UNEXP_ERROR )
1174    THEN
1175       x_return_status := l_return_status;
1176       RETURN;
1177    END IF;
1178 
1179         IF p_convert_type = 'SYS' THEN
1180             l_from_timezone_id := l_user_tz_id ;
1181             l_to_timezone_id   := l_sys_time_id ;
1182         ELSIF p_convert_type = 'USER' THEN
1183             l_from_timezone_id := l_sys_time_id ;
1184             l_to_timezone_id   :=  l_user_tz_id ;
1185         END IF;
1186 
1187    HZ_TIMEZONE_PUB.get_time(
1188          p_api_version       => 1.0,
1189          p_init_msg_list     => p_init_msg_list,
1190          p_source_tz_id      => l_from_timezone_id ,
1191          p_dest_tz_id        => l_to_timezone_id ,
1192          p_source_day_time   => p_in_time,
1193          x_dest_day_time     => x_out_time,
1194          x_return_status     => x_return_status,
1195          x_msg_count         => x_msg_count,
1196          x_msg_data          => x_msg_data
1197                              );
1198 
1199 END Convert_Timezone ;
1200 
1201 
1202 ---------------------------------------------------------------------
1203 -- PROCEDURE
1204 --    bind_parse
1205 -- USAGE
1206 --    bind_parse (varchar2, col_val_tbl);
1207 --    The input string must have a space between the AND and operator clause
1208 --    and it must exclude the initial WHERE/AND statement.
1209 --    Example: source_code = 'xyz' and campaign_id <> 1
1210 ---------------------------------------------------------------------
1211 PROCEDURE bind_parse (
1212    p_string IN VARCHAR2,
1213    x_col_val_tbl OUT NOCOPY col_val_tbl)
1214 IS
1215    l_new_str   VARCHAR2(4000);
1216    l_str       VARCHAR2(4000) := p_string;
1217    l_curr_pos  NUMBER;  -- the position index of the operator string
1218    l_eq_pos    NUMBER;
1219    l_not_pos   NUMBER;
1220    l_and_pos   NUMBER;
1221    i         NUMBER := 1;
1222 BEGIN
1223    LOOP
1224       l_and_pos := INSTR (UPPER (l_str), ' AND ');
1225       -- handle condition where no more AND's are
1226       -- left -- usually if only one condition or
1227       -- the last condition in the WHERE clause.
1228       IF l_and_pos = 0 THEN
1229          l_new_str := l_str;
1230       ELSE
1231          l_new_str := SUBSTR (l_str, 1, l_and_pos - 1);
1232       END IF;
1233 
1234       --
1235       -- The operator should also be passed
1236       -- back to the calling program.
1237       l_eq_pos := INSTR (l_new_str, '=');
1238       l_not_pos := INSTR (l_new_str, '<>');
1239       --
1240       -----------------------------------
1241       -- operator    equal    not equal
1242       -- error       0        0
1243       -- =           1        0
1244       -- <>          0        1
1245       -- =           1        2
1246       -- <>          2        1
1247       -----------------------------------
1248       IF l_eq_pos = 0 AND l_not_pos = 0 THEN
1249          -- Could not find either an = or an <>
1250          -- operator.
1251          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
1252             FND_MESSAGE.set_name('AMS', 'AMS_UTIL_NO_WHERE_OPERATOR');
1253             FND_MSG_PUB.add;
1254             RAISE FND_API.g_exc_unexpected_error;
1255          END IF;
1256       ELSIF l_eq_pos > 0 AND l_not_pos = 0 THEN
1257          l_curr_pos := l_eq_pos;
1258          x_col_val_tbl(i).col_op := '=';
1259       ELSIF l_not_pos > 0 AND l_eq_pos = 0 THEN
1260          l_curr_pos := l_not_pos;
1261          x_col_val_tbl(i).col_op := '<>';
1262       ELSIF l_eq_pos < l_not_pos THEN
1263          l_curr_pos := l_eq_pos;
1264          x_col_val_tbl(i).col_op := '=';
1265       ELSE
1266          l_curr_pos := l_not_pos;
1267          x_col_val_tbl(i).col_op := '<>';
1268       END IF;
1269 
1270       x_col_val_tbl(i).col_name := UPPER (LTRIM (RTRIM (SUBSTR (l_new_str, 1, l_curr_pos - 1))));
1271       -- Add 2 to the current position for '<>'.
1272       x_col_val_tbl(i).col_value := LTRIM (RTRIM (SUBSTR (l_new_str, l_curr_pos + 2)));
1273       --
1274       -- Remove the single quotes from the begin and end of the string value;
1275       -- no action if a numeric value.
1276       IF INSTR (x_col_val_tbl(i).col_value, '''', 1) = 1 THEN
1277          x_col_val_tbl(i).col_value := SUBSTR (x_col_val_tbl(i).col_value,2);
1278          x_col_val_tbl(i).col_value := SUBSTR (x_col_val_tbl(i).col_value, 1, LENGTH(x_col_val_tbl(i).col_value) - 1);
1279       END IF;
1280 
1281       IF l_and_pos = 0 THEN
1282          EXIT; -- no more to parse
1283       END IF;
1284 
1285       l_str := SUBSTR (l_str, l_and_pos + 4);
1286       i := i + 1;
1287    END LOOP;
1288 END bind_parse;
1289 
1290 
1291 ---------------------------------------------------------------------
1292 -- FUNCTION
1293 --    get_lookup_meaning
1294 -- USAGE
1295 --    Example:
1296 --       SELECT AMS_Utility_PVT.get_lookup_meaning ('AMS_CAMPAIGN_STATUS', status_code)
1297 --       FROM   ams_campaigns_vl;
1298 -- HISTORY
1299 -- 28-Apr-2000 choang   Created.
1300 ---------------------------------------------------------------------
1301 FUNCTION get_lookup_meaning (
1302    p_lookup_type IN VARCHAR2,
1303    p_lookup_code IN VARCHAR2
1304 )
1305 RETURN VARCHAR2
1306 IS
1307    l_meaning   VARCHAR2(80);
1308 
1309    CURSOR c_meaning IS
1310       SELECT meaning
1311       FROM   ams_lookups
1312       WHERE  lookup_type = UPPER (p_lookup_type)
1313       AND    lookup_code = UPPER (p_lookup_code);
1314 BEGIN
1315    OPEN c_meaning;
1316    FETCH c_meaning INTO l_meaning;
1317    CLOSE c_meaning;
1318 
1319    RETURN l_meaning;
1320 END get_lookup_meaning;
1321 
1322 
1323 ---------------------------------------------------------------------
1324 -- FUNCTION
1325 --    get_resource_name
1326 -- USAGE
1327 --    Example:
1328 --       SELECT AMS_Utility_PVT.get_resource_name (owner_user_id)
1329 --       FROM   ams_campaigns_vl
1330 -- HISTORY
1331 -- 28-Apr-2000 choang   Created.
1332 ---------------------------------------------------------------------
1333 FUNCTION get_resource_name (
1334    p_resource_id IN VARCHAR2
1335 )
1336 RETURN VARCHAR2
1337 IS
1338    l_resource_name   VARCHAR2(240);
1339 
1340    CURSOR c_resource_name IS
1341       SELECT full_name
1342       FROM   ams_jtf_rs_emp_v
1343       WHERE  resource_id = p_resource_id;
1344 BEGIN
1345    IF p_resource_id IS NULL THEN
1346       RETURN NULL;
1347    END IF;
1348 
1349    OPEN c_resource_name;
1350    FETCH c_resource_name INTO l_resource_name;
1351    CLOSE c_resource_name;
1352 
1353    RETURN l_resource_name;
1354 END get_resource_name;
1355 
1356 
1357 -----------------------------------------------------------------------
1358 -- FUNCTION
1359 --    is_in_my_division
1360 --
1361 -- HISTORY
1362 --    07/28/2000  holiu  Created.
1363 -----------------------------------------------------------------------
1364 FUNCTION is_in_my_division(
1365    p_object_type   IN  VARCHAR2,
1366    p_object_id     IN  NUMBER,
1367    p_country_id    IN  NUMBER
1368 )
1369 RETURN VARCHAR2
1370 IS
1371 
1372    l_area2          VARCHAR2(30);
1373    l_obj_area2     VARCHAR2(30);
1374 
1375    CURSOR c_area2 IS
1376    SELECT area2_code
1377    FROM   jtf_loc_hierarchies_vl
1378    WHERE  location_hierarchy_id = p_country_id;
1379 
1380    CURSOR c_camp_area2 IS
1381    SELECT B.area2_code
1382    FROM   ams_campaigns_vl A, jtf_loc_hierarchies_vl B
1383    WHERE  A.campaign_id = p_object_id
1384    AND    A.city_id = B.location_hierarchy_id;
1385 
1386 BEGIN
1387 
1388    OPEN c_area2;
1389    FETCH c_area2 INTO l_area2;
1390    CLOSE c_area2;
1391 
1392    IF l_area2 IS NULL THEN
1393       RETURN 'N';
1394    END IF;
1395 
1396    IF p_object_type = 'CAMP' THEN
1397       OPEN c_camp_area2;
1398       FETCH c_camp_area2 INTO l_obj_area2;
1399       CLOSE c_camp_area2;
1400    END IF;
1401 
1402    IF l_area2 = l_obj_area2 THEN
1403       RETURN 'Y';
1404    ELSE
1405       RETURN 'N';
1406    END IF;
1407 
1408 END is_in_my_division;
1409 
1410 
1411 ---------------------------------------------------------------------
1412 -- FUNCTION
1413 --    get_product_name
1414 -- HISTORY
1415 -- 14-JUN-2000 holiu    Create.
1416 -- 10-Apr-2002 choang   applied changes requested by skarumur: removed
1417 --                      l_product_name because it was declared as a
1418 --                      varchar2(76) - too small for product name.
1419 ---------------------------------------------------------------------
1420 FUNCTION get_product_name(
1421    p_prod_level IN  VARCHAR2,
1422    p_prod_id    IN  NUMBER,
1423    p_org_id     IN  NUMBER := NULL
1424 )
1425 RETURN VARCHAR2
1426 IS
1427    CURSOR c_product_name IS
1428       SELECT padded_concatenated_segments
1429       FROM   mtl_system_items_kfv
1430       WHERE  inventory_item_id = p_prod_id
1431       AND    organization_id = p_org_id;
1432 
1433    CURSOR c_category_name IS
1434       SELECT category_concat_segs
1435       FROM   mtl_categories_v
1436       WHERE  category_id = p_prod_id;
1437 
1438    l_product_name    c_product_name%ROWTYPE;
1439    l_category_name   c_category_name%ROWTYPE;
1440 BEGIN
1441    IF p_prod_id IS NULL THEN
1442       RETURN NULL;
1443    END IF;
1444 
1445    IF p_prod_level IN ('PRICING_ATTRIBUTE1', 'PRODUCT') THEN
1446       OPEN c_product_name;
1447       FETCH c_product_name INTO l_product_name;
1448       CLOSE c_product_name;
1449 
1450       RETURN l_product_name.padded_concatenated_segments;
1451    ELSIF p_prod_level IN ('PRICING_ATTRIBUTE2', 'CATEGORY') THEN
1452       OPEN c_category_name;
1453       FETCH c_category_name INTO l_category_name;
1454       CLOSE c_category_name;
1455 
1456       RETURN l_category_name.category_concat_segs;
1457    END IF;
1458 END get_product_name;
1459 
1460 
1461 ---------------------------------------------------------------------
1462 -- FUNCTION
1463 --    get_price_list_name
1464 -- HISTORY
1465 --    14-JUN-2000  holiu  Create.
1466 ---------------------------------------------------------------------
1467 FUNCTION get_price_list_name(
1468    p_price_list_line_id   IN  NUMBER
1469 )
1470 RETURN VARCHAR2
1471 IS
1472    l_name  VARCHAR2(240);
1473 
1474    CURSOR c_price_list_name IS
1475    SELECT qlh.name
1476    FROM   qp_list_headers_vl qlh, qp_list_lines qll
1477    WHERE  qll.list_header_id = qlh.list_header_id
1478    AND    qll.list_line_id = p_price_list_line_id;
1479 BEGIN
1480    IF p_price_list_line_id IS NULL THEN
1481       RETURN NULL;
1482    END IF;
1483 
1484    OPEN c_price_list_name;
1485    FETCH c_price_list_name INTO l_name;
1486    CLOSE c_price_list_name;
1487 
1488    RETURN l_name;
1489 END get_price_list_name;
1490 
1491 
1492 ---------------------------------------------------------------------
1493 -- FUNCTION
1494 --    get_uom_name
1495 -- HISTORY
1496 --    14-JUN-2000  holiu  Create.
1497 ---------------------------------------------------------------------
1498 FUNCTION get_uom_name(
1499    p_uom_code  IN  VARCHAR2
1500 )
1501 RETURN VARCHAR2
1502 IS
1503    l_name  VARCHAR2(25);
1504 
1505    CURSOR c_uom IS
1506    SELECT unit_of_measure_tl
1507    FROM   mtl_units_of_measure
1508    WHERE  uom_code = p_uom_code;
1509 BEGIN
1510    IF p_uom_code IS NULL THEN
1511       RETURN NULL;
1512    END IF;
1513 
1514    OPEN c_uom;
1515    FETCH c_uom INTO l_name;
1516    CLOSE c_uom;
1517 
1518    RETURN l_name;
1519 END get_uom_name;
1520 
1521 
1522 ---------------------------------------------------------------------
1523 -- FUNCTION
1524 --    get_qp_lookup_meaning
1525 -- DESCRIPTION
1526 --    Get the meaning of the given lookup code in qp_lookups.
1527 ---------------------------------------------------------------------
1528 FUNCTION get_qp_lookup_meaning(
1529    p_lookup_type  IN  VARCHAR2,
1530    p_lookup_code  IN  VARCHAR2
1531 )
1532 RETURN VARCHAR2
1533 IS
1534    l_meaning  VARCHAR2(80);
1535 
1536    CURSOR c_meaning IS
1537    SELECT meaning
1538    FROM   qp_lookups
1539    WHERE  lookup_type = UPPER(p_lookup_type)
1540    AND    lookup_code = UPPER(p_lookup_code);
1541 BEGIN
1542    IF p_lookup_type IS NULL OR p_lookup_code IS NULL THEN
1543       RETURN NULL;
1544    END IF;
1545 
1546    OPEN c_meaning;
1547    FETCH c_meaning INTO l_meaning;
1548    CLOSE c_meaning;
1549 
1550    RETURN l_meaning;
1551 END get_qp_lookup_meaning;
1552 
1553 ---------------------------------------------------------------------
1554 -- FUNCTION
1555 --   get_resource_id
1556 -- DESCRIPTION
1557 --   Returns resource_id from the JTF Resource module given
1558 --   an AOL user_id.
1559 ---------------------------------------------------------------------
1560 FUNCTION get_resource_id (
1561    p_user_id IN NUMBER
1562 )
1563 RETURN NUMBER
1564 IS
1565    l_resource_id     NUMBER;
1566 
1567    CURSOR c_resource IS
1568       SELECT resource_id
1569       FROM   ams_jtf_rs_emp_v
1570       WHERE  user_id = p_user_id;
1571 BEGIN
1572    OPEN c_resource;
1573    FETCH c_resource INTO l_resource_id;
1574    IF c_resource%NOTFOUND THEN
1575       l_resource_id := -1;
1576       -- Adding an error message will cause the function
1577     -- to violate the WNDS pragma, preventing it from
1578     -- being able to be called from a SQL statement.
1579    END IF;
1580    CLOSE c_resource;
1581 
1582    RETURN l_resource_id;
1583 END get_resource_id;
1584 
1585 ---------------------------------------------------------------------
1586 -- FUNCTION
1587 --   Write_Conc_Log
1588 -- DESCRIPTION
1589 --   Writes the log for Concurrent programs
1590 -- History
1591 --   07-Aug-2000   PTENDULK    Created
1592 --   08-Aug-2000   PTENDULK    Write the output in to log instead of output
1593 -- NOTE
1594 --   If the parameter p_text is passed then the value sent will be printed
1595 --   as log else the messages in the stack are printed.
1596 ---------------------------------------------------------------------
1597 PROCEDURE Write_Conc_Log
1598 (   p_text            IN     VARCHAR2 := NULL)
1599 IS
1600     l_count NUMBER;
1601     l_msg   VARCHAR2(2000);
1602     l_cnt   NUMBER ;
1603 BEGIN
1604    IF p_text IS NULL THEN
1605        l_count := FND_MSG_PUB.count_msg;
1606        FOR l_cnt IN 1 .. l_count
1607        LOOP
1608            l_msg := FND_MSG_PUB.get(l_cnt, FND_API.g_false);
1609            FND_FILE.PUT_LINE(FND_FILE.LOG, '(' || l_cnt || ') ' || l_msg);
1610        END LOOP;
1611    ELSE
1612        FND_FILE.PUT_LINE(FND_FILE.LOG, p_text );
1613    END IF;
1614 
1615 END Write_Conc_Log ;
1616 
1617 
1618 -----------------------------------------------------------------------
1619 -- FUNCTION
1620 --    get_system_status_type
1621 --
1622 -- HISTORY
1623 --    14-SEP-2000  holiu      Create.
1624 --    29-May-2001  ptendulk   Added system status for Schedule
1625 --    20-May-2001  ptendulk   Added system status for programs.
1626 --    13-Jun-2001  ptendulk   Added EONE
1627 -----------------------------------------------------------------------
1628 FUNCTION get_system_status_type(
1629    p_object  IN  VARCHAR2
1630 )
1631 RETURN VARCHAR2
1632 IS
1633 BEGIN
1634 
1635    IF p_object = 'CAMP' THEN
1636       RETURN 'AMS_CAMPAIGN_STATUS';
1637    ELSIF p_object IN ('EVEH', 'EVEO','EONE', 'EVET') THEN
1638       RETURN 'AMS_EVENT_STATUS';
1639    ELSIF p_object = 'DELV' THEN
1640       RETURN 'AMS_DELIV_STATUS';
1641    ELSIF p_object = 'CSCH' THEN
1642       RETURN 'AMS_CAMPAIGN_SCHEDULE_STATUS' ;
1643    ELSIF p_object = 'RCAM' THEN
1644       RETURN 'AMS_PROGRAM_STATUS' ;
1645    ELSIF p_object = 'OFFR' THEN
1646       RETURN 'AMS_OFFER_STATUS' ;
1647    ELSIF p_object = 'PRIC' THEN
1648       RETURN 'AMS_PRICELIST_STATUS' ;
1649    ELSE
1650       RETURN NULL;
1651    END IF;
1652 
1653 END get_system_status_type;
1654 
1655 
1656 -----------------------------------------------------------------------
1657 -- FUNCTION
1658 --    get_system_status_code
1659 --
1660 -- HISTORY
1661 --    14-SEP-2000  holiu  Create.
1662 -----------------------------------------------------------------------
1663 FUNCTION get_system_status_code(
1664    p_user_status_id   IN  NUMBER
1665 )
1666 RETURN VARCHAR2
1667 IS
1668 
1669    l_status_code   VARCHAR2(30);
1670 
1671    CURSOR c_status_code IS
1672    SELECT system_status_code
1673    FROM   ams_user_statuses_vl
1674    WHERE  user_status_id = p_user_status_id
1675    AND    enabled_flag = 'Y';
1676 
1677 BEGIN
1678 
1679    OPEN c_status_code;
1680    FETCH c_status_code INTO l_status_code;
1681    CLOSE c_status_code;
1682 
1683    RETURN l_status_code;
1684 
1685 END get_system_status_code;
1686 
1687 
1688 -----------------------------------------------------------------------
1689 -- FUNCTION
1690 --    get_default_user_status
1691 --
1692 -- HISTORY
1693 --    14-SEP-2000  holiu  Create.
1694 -----------------------------------------------------------------------
1695 FUNCTION get_default_user_status(
1696    p_status_type  IN  VARCHAR2,
1697    p_status_code  IN  VARCHAR2
1698 )
1699 RETURN VARCHAR2
1700 IS
1701 
1702    l_status_id  NUMBER;
1703 
1704    CURSOR c_status_id IS
1705    SELECT user_status_id
1706    FROM   ams_user_statuses_vl
1707    WHERE  system_status_type = p_status_type
1708    AND    system_status_code = p_status_code
1709    AND    default_flag = 'Y'
1710    AND    enabled_flag = 'Y';
1711 
1712 BEGIN
1713 
1714    OPEN c_status_id;
1715    FETCH c_status_id INTO l_status_id;
1716    CLOSE c_status_id;
1717 
1718    RETURN l_status_id;
1719 
1720 END get_default_user_status;
1721 
1722 
1723 -----------------------------------------------------------------------
1724 -- PROCEDURE
1725 --    check_status_change
1726 --
1727 -- HISTORY
1728 --    14-SEP-2000  holiu  Create.
1729 -----------------------------------------------------------------------
1730 PROCEDURE check_status_change(
1731    p_object_type      IN  VARCHAR2,
1732    p_object_id        IN  NUMBER,
1733    p_old_status_id    IN  NUMBER,
1734    p_new_status_id    IN  NUMBER,
1735    x_approval_type    OUT NOCOPY VARCHAR2,
1736    x_return_status    OUT NOCOPY VARCHAR2
1737 )
1738 IS
1739 
1740    l_theme_flag       VARCHAR2(1);
1741    l_budget_flag      VARCHAR2(1);
1742    l_status_type      VARCHAR2(30);
1743    l_old_status_code  VARCHAR2(30);
1744    l_new_status_code  VARCHAR2(30);
1745 
1746    CURSOR c_approval_flag IS
1747    SELECT theme_approval_flag, budget_approval_flag
1748    FROM   ams_status_order_rules
1749    WHERE  system_status_type = l_status_type
1750    AND    current_status_code = l_old_status_code
1751    AND    next_status_code = l_new_status_code;
1752 
1753 BEGIN
1754 
1755    x_return_status := FND_API.g_ret_sts_success;
1756    x_approval_type := NULL;
1757 
1758    l_status_type := get_system_status_type(p_object_type);
1759    l_old_status_code := get_system_status_code(p_old_status_id);
1760    l_new_status_code := get_system_status_code(p_new_status_id);
1761 
1762    IF l_old_status_code = l_new_status_code THEN
1763       RETURN;
1764    END IF;
1765 
1766    OPEN c_approval_flag;
1767    FETCH c_approval_flag INTO l_theme_flag, l_budget_flag;
1768    IF c_approval_flag%NOTFOUND THEN
1769       x_return_status := FND_API.g_ret_sts_error;
1770       AMS_Utility_PVT.error_message('AMS_CAMP_BAD_STATUS_CHANGE');
1771    END IF;
1772    CLOSE c_approval_flag;
1773 
1774    IF l_budget_flag = 'Y' THEN
1775       IF AMS_ObjectAttribute_PVT.check_object_attribute(
1776             p_object_type, p_object_id, 'BAPL') = FND_API.g_true
1777       THEN
1778          x_approval_type := 'BUDGET';
1779       END IF;
1780    ELSIF l_theme_flag = 'Y' THEN
1781       IF AMS_ObjectAttribute_PVT.check_object_attribute(
1782             p_object_type, p_object_id, 'TAPL') = FND_API.g_true
1783       THEN
1784          x_approval_type := 'THEME';
1785       END IF;
1786    END IF;
1787 
1788 END check_status_change;
1789 
1790 
1791 --========================================================================
1792 -- Function
1793 --    Approval_required_flag
1794 -- Purpose
1795 --    This function will return the approval required flag for the
1796 --    given custom setup.
1797 --
1798 -- History
1799 --   16-Jun-2001    ptendulk    Created
1800 --   19-Jun-2001    ptendulk    Check specific attribute (bug in last code)
1801 --========================================================================
1802 FUNCTION Approval_Required_Flag( p_custom_setup_id    IN   NUMBER ,
1803                                  p_approval_type      IN   VARCHAR2)
1804 RETURN VARCHAR2 IS
1805    CURSOR c_custom_attr IS
1806    SELECT attr_available_flag
1807    FROM   ams_custom_setup_attr
1808    WHERE  custom_setup_id = p_custom_setup_id
1809    -- Following line is added by ptendulk on 19-Jun-2001
1810    AND    object_attribute = p_approval_type ;
1811 
1812    l_flag VARCHAR2(1) ;
1813 BEGIN
1814 
1815    OPEN c_custom_attr;
1816    FETCH c_custom_attr INTO l_flag ;
1817    CLOSE c_custom_attr ;
1818    RETURN l_flag ;
1819 
1820 END Approval_Required_Flag;
1821 
1822 -----------------------------------------------------------------------
1823 -- PROCEDURE
1824 --    check_status_change
1825 --
1826 -- PURPOSE
1827 --    This procedure is created to override the obsoleted check_status_change
1828 --    procedure as object_attribute table is obsoleted now.
1829 --
1830 -- HISTORY
1831 --    16-Jun-2001   ptendulk    Created
1832 --    02-Jul-2002   musman      Added changes for deliverable approvals
1833 -----------------------------------------------------------------------
1834 PROCEDURE check_new_status_change(
1835    p_object_type      IN  VARCHAR2,
1836    p_object_id        IN  NUMBER,
1837    p_old_status_id    IN  NUMBER,
1838    p_new_status_id    IN  NUMBER,
1839    p_custom_setup_id  IN  NUMBER,
1840    x_approval_type    OUT NOCOPY VARCHAR2,
1841    x_return_status    OUT NOCOPY VARCHAR2
1842 )
1843 IS
1844 
1845    l_theme_flag       VARCHAR2(1);
1846    l_budget_flag      VARCHAR2(1);
1847    l_status_type      VARCHAR2(30);
1848    l_old_status_code  VARCHAR2(30);
1849    l_new_status_code  VARCHAR2(30);
1850 
1851    l_custom_setup_attr   VARCHAR2(4) := 'TAPL';
1852 
1853    CURSOR c_approval_flag IS
1854    SELECT theme_approval_flag, budget_approval_flag
1855    FROM   ams_status_order_rules
1856    WHERE  system_status_type = l_status_type
1857    AND    current_status_code = l_old_status_code
1858    AND    next_status_code = l_new_status_code;
1859 
1860 BEGIN
1861 
1862    x_return_status := FND_API.g_ret_sts_success;
1863    x_approval_type := NULL;
1864 
1865    l_status_type := get_system_status_type(p_object_type);
1866    l_old_status_code := get_system_status_code(p_old_status_id);
1867    l_new_status_code := get_system_status_code(p_new_status_id);
1868 
1869    IF l_old_status_code = l_new_status_code THEN
1870       RETURN;
1871    END IF;
1872 
1873    OPEN c_approval_flag;
1874    FETCH c_approval_flag INTO l_theme_flag, l_budget_flag;
1875    IF c_approval_flag%NOTFOUND THEN
1876       x_return_status := FND_API.g_ret_sts_error;
1877       AMS_Utility_PVT.error_message('AMS_CAMP_BAD_STATUS_CHANGE');
1878    END IF;
1879    CLOSE c_approval_flag;
1880 
1881    IF l_budget_flag = 'Y' THEN
1882       IF Approval_Required_Flag(p_custom_setup_id, 'BAPL') = 'Y'
1883       THEN
1884          x_approval_type := 'BUDGET';
1885       END IF;
1886    ELSIF l_theme_flag = 'Y' THEN
1887 
1888       /* since Deliv has only concept approval  */
1889       IF  p_object_type = 'DELV'
1890       THEN
1891          l_custom_setup_attr := 'CAPL';
1892       END IF;
1893       IF Approval_Required_Flag(p_custom_setup_id, l_custom_setup_attr) = 'Y'
1894       THEN
1895          x_approval_type := 'THEME';
1896       END IF;
1897    END IF;
1898 
1899 END check_new_status_change;
1900 
1901 ---------------------------------------------------------------------
1902 -- PROCEDURE
1903 --    Convert_Currency
1904 -- NOTE
1905 -- HISTORY
1906 -- 01-Sep-2000 slkrishn        Created.
1907 -- 12-SEP-2000    mpande    Updated
1908 -- 02/23/2001    mpande     Updated for getting org id query
1909 -- 03/27/2001    MPANDE    MOved from OZF to AMS
1910 ---------------------------------------------------------------------
1911 PROCEDURE convert_currency(
1912    p_set_of_books_id   IN       NUMBER
1913   ,p_from_currency     IN       VARCHAR2
1914   ,p_conversion_date   IN       DATE
1915   ,p_conversion_type   IN       VARCHAR2
1916   ,p_conversion_rate   IN       NUMBER
1917   ,p_amount            IN       NUMBER
1918   ,x_return_status     OUT NOCOPY      VARCHAR2
1919   ,x_acc_amount        OUT NOCOPY      NUMBER
1920   ,x_rate              OUT NOCOPY      NUMBER)
1921 IS
1922    l_api_name         VARCHAR2(30) := 'Convert Currency';
1923    l_to_currenvy      VARCHAR2(30);
1924    l_max_roll_days    NUMBER       := -1;
1925    l_user_rate        NUMBER       := NVL(p_conversion_rate, 1);
1926    l_numerator        NUMBER;
1927    l_denominator      NUMBER;
1928    l_org_id           NUMBER;
1929    l_sob              NUMBER;
1930    l_to_currency      VARCHAR2(30);
1931 
1932    --
1933    -- get functional currency
1934    --       gs.mrc_sob_type_code,
1935 
1936    /*   CURSOR c_get_gl_info(
1937       p_org_id   IN   NUMBER)
1938    IS
1939       SELECT   gs.set_of_books_id
1940               ,gs.currency_code
1941       FROM     gl_sets_of_books gs
1942               ,org_organization_definitions org
1943       WHERE  gs.mrc_sob_type_code = 'P'
1944          AND org.set_of_books_id = gs.set_of_books_id
1945          AND org.operating_unit = p_org_id;
1946    */
1947    --02/23/2001 mpande changed as per Hornet requirements
1948    CURSOR c_get_gl_info( p_org_id   IN   NUMBER)
1949    IS
1950       SELECT gs.set_of_books_id
1951       ,      gs.currency_code
1952       FROM   gl_sets_of_books gs
1953       ,      ozf_sys_parameters_all org
1954       WHERE  org.set_of_books_id = gs.set_of_books_id
1955       AND    org.org_id = p_org_id;
1956 
1957    -- org_id cursor
1958    CURSOR c_org_cur
1959    IS
1960       SELECT   (TO_NUMBER(SUBSTRB(USERENV('CLIENT_INFO'), 1, 10)))
1961       FROM     dual;
1962 --
1963 BEGIN
1964    OPEN c_org_cur;
1965    FETCH c_org_cur INTO l_org_id;
1966 
1967    IF c_org_cur%NOTFOUND THEN
1968       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
1969          fnd_message.set_name('AMS', 'AMS_ORG_ID_NOTFOUND');
1970          fnd_msg_pub.add;
1971       END IF;
1972       RAISE fnd_api.g_exc_error;
1973      END IF;
1974    CLOSE c_org_cur;
1975 
1976    OPEN c_get_gl_info(l_org_id);
1977      FETCH c_get_gl_info INTO l_sob, l_to_currency;
1978 
1979      IF c_get_gl_info%NOTFOUND THEN
1980        IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
1981          fnd_message.set_name('AMS', 'AMS_GL_SOB_NOTFOUND');
1982          fnd_msg_pub.add;
1983        END IF;
1984 
1985        RAISE fnd_api.g_exc_error;
1986      END IF;
1987    CLOSE c_get_gl_info;
1988 
1989    --
1990    gl_currency_api.convert_closest_amount(
1991       x_from_currency => p_from_currency
1992      ,x_to_currency => l_to_currency
1993      ,x_conversion_date => p_conversion_date
1994      ,x_conversion_type => p_conversion_type
1995      ,x_user_rate => l_user_rate
1996      ,x_amount => p_amount
1997      ,x_max_roll_days => l_max_roll_days
1998      ,x_converted_amount => x_acc_amount
1999      ,x_denominator => l_denominator
2000      ,x_numerator => l_numerator
2001      ,x_rate => x_rate);
2002    --
2003 
2004 EXCEPTION
2005    WHEN fnd_api.g_exc_error THEN
2006       x_return_status := fnd_api.g_ret_sts_error;
2007    WHEN gl_currency_api.no_rate THEN
2008       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2009          fnd_message.set_name('AMS', 'AMS_NO_RATE');
2010          fnd_msg_pub.add;
2011       END IF;
2012 
2013       x_return_status := fnd_api.g_ret_sts_error;
2014    WHEN gl_currency_api.invalid_currency THEN
2015       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2016          fnd_message.set_name('AMS', 'AMS_INVALID_CURR');
2017          fnd_msg_pub.add;
2018       END IF;
2019 
2020       x_return_status := fnd_api.g_ret_sts_error;
2021    WHEN OTHERS THEN
2022       RAISE;
2023       x_return_status := fnd_api.g_ret_sts_unexp_error;
2024 END convert_currency;
2025 
2026 ---------------------------------------------------------------------
2027 -- PROCEDURE
2028 --    get_code_combinations
2029 --
2030 -- PURPOSE
2031 --      get code_combination concacnenated segments and ids
2032 -- 20-Sep-2000    slkrishn       Created
2033 --   03/27/2001    MPANDE    MOved from OZF to AMS
2034 ---------------------------------------------------------------------
2035 FUNCTION get_code_combinations(
2036    p_code_combination_id    IN   NUMBER
2037   ,p_chart_of_accounts_id   IN   NUMBER)
2038    RETURN VARCHAR2
2039 IS
2040    l_api_name     VARCHAR2(30) := 'Get_Code_Combinations';
2041    l_result       BOOLEAN;
2042    l_app_name     VARCHAR2(30) := 'SQLGL';
2043    l_flex_code    VARCHAR2(30) := 'GL#';
2044 BEGIN
2045    l_result := fnd_flex_keyval.validate_ccid(
2046                   appl_short_name => l_app_name
2047                  ,key_flex_code => l_flex_code
2048                  ,structure_number => p_chart_of_accounts_id
2049                  ,combination_id => p_code_combination_id);
2050 
2051    IF l_result THEN
2052       RETURN fnd_flex_keyval.concatenated_descriptions;
2053    ELSE
2054       RETURN '';
2055    END IF;
2056 EXCEPTION
2057    WHEN OTHERS THEN
2058    RAISE;
2059 END get_code_combinations;
2060 ---------------------------------------------------------------------
2061 -- PROCEDURE
2062 --    Convert_functional_Curr
2063 -- NOTE
2064 -- This procedures takes in amount and converts it to the functional currency
2065 --  and returns the converted amount,exchange_rate,set_of_book_id,
2066 --  f-nctional_currency_code,exchange_rate_date
2067 
2068 -- HISTORY
2069 -- 20-Jul-2000 mpande        Created.
2070 -- 02/23/2001    MPAnde     Updated for getting org id query
2071 -- 03/27/2001    MPANDE    MOved from OZF to AMS
2072 -- 01/13/2003    yzhao      fix bug BUG 2750841(same as 2741039) - pass in org_id, default to null
2073 --parameter x_Amount1 IN OUT NUMBER -- reqd Parameter -- amount to be converted
2074 --   x_TC_CURRENCY_CODE IN OUT VARCHAR2,
2075 --   x_Set_of_books_id OUT NUMBER,
2076 --   x_MRC_SOB_TYPE_CODE OUT NUMBER, 'P' and 'R'
2077 --     We only do it for primary ('P' because we donot supprot MRC)
2078 --   x_FC_CURRENCY_CODE OUT VARCHAR2,
2079 --   x_EXCHANGE_RATE_TYPE OUT VARCHAR2,
2080 --     comes from a AMS profile  or what ever is passed
2081 --   x_EXCHANGE_RATE_DATE  OUT DATE,
2082 --     could come from a AMS profile but right now is sysdate
2083 --   x_EXCHANGE_RATE       OUT VARCHAR2,
2084 --   x_return_status      OUT VARCHAR2
2085 -- The following is the rule in the GL API
2086 --    If x_conversion_type = 'User', and the relationship between the
2087 --    two currencies is not fixed, x_user_rate will be used as the
2088 --    conversion rate to convert the amount
2089 --    else no_user_rate is required
2090 
2091 ---------------------------------------------------------------------
2092 
2093 
2094 PROCEDURE calculate_functional_curr(
2095    p_from_amount          IN       NUMBER
2096   ,p_conv_date            IN       DATE DEFAULT SYSDATE
2097   ,p_tc_currency_code     IN       VARCHAR2
2098   ,p_org_id               IN       NUMBER DEFAULT NULL
2099   ,x_to_amount            OUT NOCOPY      NUMBER
2100   ,x_set_of_books_id      OUT NOCOPY      NUMBER
2101   ,x_mrc_sob_type_code    OUT NOCOPY      VARCHAR2
2102   ,x_fc_currency_code     OUT NOCOPY      VARCHAR2
2103   ,x_exchange_rate_type   IN OUT NOCOPY   VARCHAR2
2104   ,x_exchange_rate        IN OUT NOCOPY   NUMBER
2105   ,x_return_status        OUT NOCOPY      VARCHAR2)
2106 IS
2107    l_conversion_type_profile    CONSTANT VARCHAR2(30) := 'AMS_CURR_CONVERSION_TYPE';
2108    l_user_rate                  CONSTANT NUMBER       := 1;
2109    -- Currenty not used. --  this should be a profile
2110    l_max_roll_days              CONSTANT NUMBER       := -1;
2111    -- Negative so API rolls back to find the last conversion rate.
2112    -- this should be a profile
2113    l_denominator                         NUMBER;   -- Not used in Marketing.
2114    l_numerator                           NUMBER;   -- Not used in Marketing.
2115    l_conversion_type                     VARCHAR2(30);
2116    l_org_id                              NUMBER;
2117 
2118    -- Cursor to get the primary set_of_books_id ,functional_currency_code
2119    -- changed the above query to look into operating unit and not organization_id
2120    --SEP12 mpande
2121    /*
2122    CURSOR c_get_gl_info(
2123       p_org_id   IN   NUMBER)
2124    IS
2125       SELECT   gs.set_of_books_id
2126               ,gs.currency_code
2127       FROM     gl_sets_of_books gs
2128               ,org_organization_definitions org
2129       WHERE  org.set_of_books_id = gs.set_of_books_id
2130          AND org.operating_unit = p_org_id;
2131    */
2132    --02/23/2001 mpande changed as per Hornet requirements
2133    CURSOR c_get_gl_info(p_org_id   IN   NUMBER)
2134    IS
2135       SELECT  gs.set_of_books_id
2136       ,       gs.currency_code
2137       FROM   gl_sets_of_books gs
2138       ,      ozf_sys_parameters_all org
2139       WHERE  org.set_of_books_id = gs.set_of_books_id
2140       AND    org.org_id = p_org_id;
2141 
2142    -- org_id cursor
2143    CURSOR c_org_cur
2144    IS
2145       SELECT   (TO_NUMBER(SUBSTRB(USERENV('CLIENT_INFO'), 1, 10)))
2146       FROM     dual;
2147 BEGIN
2148    -- Initialize return status.
2149    x_return_status := fnd_api.g_ret_sts_success;
2150 
2151    --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
2152    --    Mumu Pande        09/20/2000        Updated the following
2153    --    Get the currency conversion type from profile option
2154    IF x_exchange_rate_type IS NULL THEN
2155       l_conversion_type := fnd_profile.VALUE(l_conversion_type_profile);
2156    ELSE
2157       l_conversion_type := x_exchange_rate_type;
2158    END IF;
2159 
2160    IF l_conversion_type IS NULL THEN
2161       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2162          fnd_message.set_name('AMS', 'AMS_NO_EXCHANGE_TYPE');
2163          fnd_msg_pub.add;
2164       END IF;
2165 
2166       x_return_status := fnd_api.g_ret_sts_error;
2167       RETURN;
2168    ELSE
2169       IF ams_utility_pvt.check_fk_exists('GL_DAILY_CONVERSION_TYPES',
2170                                        'CONVERSION_TYPE'
2171                          ,l_conversion_type) = fnd_api.g_false
2172     THEN
2173          IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2174             fnd_message.set_name('AMS', 'AMS_WRONG_CONVERSION_TYPE');
2175             fnd_msg_pub.add;
2176          END IF;
2177          x_return_status := fnd_api.g_ret_sts_error;
2178          RETURN;
2179       END IF;
2180    END IF;
2181 
2182    --++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
2183    /* yzhao: 01/13/2003 fix bug BUG 2750841(same as 2741039) - use org_id if it is passed,
2184       otherwise get from login session */
2185    IF (p_org_id IS NOT NULL) THEN
2186        l_org_id := p_org_id;
2187    ELSE
2188        OPEN c_org_cur;
2189        FETCH c_org_cur INTO l_org_id;
2190 
2191        IF c_org_cur%NOTFOUND THEN
2192           IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2193              fnd_message.set_name('AMS', 'AMS_ORG_ID_NOTFOUND');
2194              fnd_msg_pub.add;
2195           END IF;
2196 
2197           RAISE fnd_api.g_exc_error;
2198        END IF;
2199 
2200        CLOSE c_org_cur;
2201    END IF;
2202 
2203    IF (AMS_DEBUG_HIGH_ON) THEN
2204       ams_utility_pvt.debug_message('debug: start ' || l_org_id);
2205    END IF;
2206 
2207    x_mrc_sob_type_code := 'P';
2208    OPEN c_get_gl_info(l_org_id);
2209    FETCH c_get_gl_info INTO x_set_of_books_id, x_fc_currency_code;
2210 
2211    IF c_get_gl_info%NOTFOUND THEN
2212       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2213          fnd_message.set_name('AMS', 'AMS_GL_SOB_NOTFOUND');
2214          fnd_msg_pub.add;
2215       END IF;
2216 
2217       RAISE fnd_api.g_exc_error;
2218    END IF;
2219 
2220    CLOSE c_get_gl_info;
2221    -- Call the proper GL API to convert the amount.
2222    gl_currency_api.convert_closest_amount(
2223       x_from_currency => p_tc_currency_code
2224      ,x_to_currency => x_fc_currency_code
2225      ,x_conversion_date => p_conv_date
2226      ,x_conversion_type => l_conversion_type
2227      ,x_user_rate => x_exchange_rate
2228      ,x_amount => p_from_amount
2229      ,x_max_roll_days => l_max_roll_days
2230      ,x_converted_amount => x_to_amount
2231      ,x_denominator => l_denominator
2232      ,x_numerator => l_numerator
2233      ,x_rate => x_exchange_rate);
2234 
2235    x_exchange_rate_type := l_conversion_type;
2236    --
2237 
2238 EXCEPTION
2239    WHEN fnd_api.g_exc_error THEN
2240       x_return_status := fnd_api.g_ret_sts_error;
2241    WHEN gl_currency_api.no_rate THEN
2242       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2243          fnd_message.set_name('AMS', 'AMS_NO_RATE');
2244          fnd_msg_pub.add;
2245       END IF;
2246 
2247       x_return_status := fnd_api.g_ret_sts_error;
2248    WHEN gl_currency_api.invalid_currency THEN
2249       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2250          fnd_message.set_name('AMS', 'AMS_INVALID_CURR');
2251          fnd_msg_pub.add;
2252       END IF;
2253 
2254       x_return_status := fnd_api.g_ret_sts_error;
2255    WHEN OTHERS THEN
2256       x_return_status := fnd_api.g_ret_sts_unexp_error;
2257 
2258       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
2259          fnd_msg_pub.add_exc_msg('AMS_UTLITY_PVT', 'Convert_functional_curency');
2260       END IF;
2261 END calculate_functional_curr;
2262 
2263 ---------------------------------------------------------------------
2264 -- PROCEDURE
2265 --    Convert_Currency
2266 -- NOTE
2267 
2268 -- HISTORY
2269 -- 20-Jul-2000 mpande        Created.
2270 --parameter p_from_currency      IN  VARCHAR2,
2271 --   p_to_currency        IN  VARCHAR2,
2272 --   p_conv_date          IN  DATE DEFAULT SYSDATE,
2273 --   p_from_amount        IN  NUMBER,
2274 --   x_to_amount          OUT NUMBER
2275 --    If x_conversion_type = 'User', and the relationship between the
2276 --    two currencies is not fixed, x_user_rate will be used as the
2277 --    conversion rate to convert the amount
2278 --    else no_user_rate is required
2279 -- 02/23/2001    MPAnde     Updated for getting org id query
2280 -- 03/27/2001    MPANDE    MOved from OZF to AMS
2281 -- 04/07/2001    slkrishn   Added p_conv_type and p_conv_rate with defaults
2282 ---------------------------------------------------------------------
2283 
2284 PROCEDURE convert_currency(
2285    p_from_currency   IN       VARCHAR2
2286   ,p_to_currency     IN       VARCHAR2
2287   ,p_conv_type       IN       VARCHAR2 DEFAULT FND_API.G_MISS_CHAR
2288   ,p_conv_rate       IN       NUMBER   DEFAULT FND_API.G_MISS_NUM
2289   ,p_conv_date       IN       DATE     DEFAULT SYSDATE
2290   ,p_from_amount     IN       NUMBER
2291   ,x_return_status   OUT NOCOPY      VARCHAR2
2292   ,x_to_amount       OUT NOCOPY      NUMBER
2293   ,x_rate            OUT NOCOPY      NUMBER)
2294 IS
2295    l_conversion_type_profile    CONSTANT VARCHAR2(30) := 'AMS_CURR_CONVERSION_TYPE';
2296    l_user_rate                  CONSTANT NUMBER       := 1;
2297    -- Currenty not used.
2298    -- this should be a profile
2299    l_max_roll_days              CONSTANT NUMBER       := -1;
2300    -- Negative so API rolls back to find the last conversion rate.
2301    -- this should be a profile
2302    l_denominator      NUMBER;   -- Not used in Marketing.
2303    l_numerator        NUMBER;   -- Not used in Marketing.
2304    l_conversion_type  VARCHAR2(30); -- Curr conversion type; see API doc for details.
2305 BEGIN
2306    -- Initialize return status.
2307    x_return_status := fnd_api.g_ret_sts_success;
2308 
2309    -- condition added to pass conversion types
2310    IF p_conv_type = FND_API.G_MISS_CHAR THEN
2311      -- Get the currency conversion type from profile option
2312      l_conversion_type := fnd_profile.VALUE(l_conversion_type_profile);
2313      -- Conversion type cannot be null in profile
2314      IF l_conversion_type IS NULL THEN
2315        IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2316          fnd_message.set_name('OZF', 'OZF_NO_EXCHANGE_TYPE');
2317          fnd_msg_pub.add;
2318        END IF;
2319        x_return_status := fnd_api.g_ret_sts_error;
2320        RETURN;
2321      END IF;
2322    ELSE
2323      l_conversion_type := p_conv_type;
2324    END IF;
2325 
2326    -- Call the proper GL API to convert the amount.
2327    gl_currency_api.convert_closest_amount(
2328       x_from_currency => p_from_currency
2329      ,x_to_currency => p_to_currency
2330      ,x_conversion_date => p_conv_date
2331      ,x_conversion_type => l_conversion_type
2332      ,x_user_rate => l_user_rate
2333      ,x_amount => p_from_amount
2334      ,x_max_roll_days => l_max_roll_days
2335      ,x_converted_amount => x_to_amount
2336      ,x_denominator => l_denominator
2337      ,x_numerator => l_numerator
2338      ,x_rate => x_rate);
2339    --
2340 
2341 EXCEPTION
2342    WHEN gl_currency_api.no_rate THEN
2343       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2344          fnd_message.set_name('OZF', 'OZF_NO_RATE');
2345          fnd_msg_pub.add;
2346       END IF;
2347 
2348       x_return_status := fnd_api.g_ret_sts_error;
2349    WHEN gl_currency_api.invalid_currency THEN
2350       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_error) THEN
2351          fnd_message.set_name('OZF', 'OZF_INVALID_CURR');
2352          fnd_msg_pub.add;
2353       END IF;
2354 
2355       x_return_status := fnd_api.g_ret_sts_error;
2356    WHEN OTHERS THEN
2357       x_return_status := fnd_api.g_ret_sts_unexp_error;
2358 
2359       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
2360          fnd_msg_pub.add_exc_msg('OZF_UTLITY_PVT', 'Convert_curency');
2361       END IF;
2362 END convert_currency;
2363 
2364 /*============================================================================*/
2365 -- Start of Comments
2366 -- NAME
2367 --   Get_Resource_Role
2368 --
2369 -- PURPOSE
2370 --   This Procedure will be return the workflow user role for
2371 --   the resourceid sent
2372 -- Called By
2373 -- NOTES
2374 -- End of Comments
2375 
2376 /*============================================================================*/
2377 
2378 PROCEDURE Get_Resource_Role
2379 (  p_resource_id            IN     NUMBER,
2380    x_role_name          OUT NOCOPY    VARCHAR2,
2381    x_role_display_name  OUT NOCOPY    VARCHAR2 ,
2382    x_return_status      OUT NOCOPY    VARCHAR2
2383 )
2384 IS
2385    l_msg_count              NUMBER;
2386    l_msg_data               VARCHAR2(4000);
2387    l_error_msg              VARCHAR2(4000);
2388 
2389    CURSOR c_resource IS
2390    SELECT employee_id , user_id, category
2391    FROM ams_jtf_rs_emp_v
2392    WHERE resource_id = p_resource_id ;
2393 
2394    l_person_id number;
2395    l_user_id number;
2396    l_category  varchar2(30);
2397 BEGIN
2398    x_return_status := FND_API.G_RET_STS_SUCCESS;
2399    OPEN c_resource ;
2400    FETCH c_resource INTO l_person_id , l_user_id, l_category;
2401    IF c_resource%NOTFOUND THEN
2402       CLOSE c_resource ;
2403       x_return_status := FND_API.G_RET_STS_ERROR;
2404       AMS_Utility_PVT.error_message ('AMS_APPR_INVALID_RESOURCE_ID');
2405       return;
2406    END IF;
2407    CLOSE c_resource ;
2408       -- Pass the Employee ID to get the Role
2409    IF l_category = 'PARTY' THEN
2410       WF_DIRECTORY.getrolename
2411       (  p_orig_system     => 'FND_USR',
2412          p_orig_system_id    => l_user_id ,
2413          p_name              => x_role_name,
2414          p_display_name      => x_role_display_name
2415       );
2416       IF x_role_name is null  then
2417          x_return_status := FND_API.G_RET_STS_ERROR;
2418          AMS_Utility_PVT.error_message ('AMS_APPR_INVALID_ROLE');
2419          return;
2420       END IF;
2421    ELSE
2422       WF_DIRECTORY.getrolename
2423       (  p_orig_system     => 'PER',
2424          p_orig_system_id    => l_person_id ,
2425          p_name              => x_role_name,
2426          p_display_name      => x_role_display_name
2427       );
2428       IF x_role_name is null  then
2429          x_return_status := FND_API.G_RET_STS_ERROR;
2430          AMS_Utility_PVT.error_message ('AMS_APPR_INVALID_ROLE');
2431          return;
2432       END IF;
2433    END IF;
2434 EXCEPTION
2435    WHEN OTHERS THEN
2436       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2437       IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
2438          fnd_msg_pub.add_exc_msg('AMS_UTLITY_PVT', 'Get_Resource_Role');
2439       END IF;
2440       RAISE;
2441 END Get_Resource_Role;
2442 
2443 --======================================================================
2444 -- Procedure Name: send_wf_standalone_message
2445 -- Type          : Generic utility
2446 -- Pre-Req :
2447 -- Notes:
2448 --    Common utility to send standalone message without initiating
2449 --    process using workflow.
2450 -- Parameters:
2451 --    IN:
2452 --    p_item_type          IN  VARCHAR2   Required   Default =  "MAPGUTIL"
2453 --                               item type for the workflow utility.
2454 --    p_message_name       IN  VARCHAR2   Required   Default =  "GEN_STDLN_MESG"
2455 --                               Internal name for standalone message name
2456 --    p_subject            IN  VARCHAR2   Required
2457 --                             Subject for the message
2458 --    p_body               IN  VARCHAR2   Optional
2459 --                             Body for the message
2460 --    p_send_to_role_name  IN  VARCHAR2   Optional
2461 --                             Role name to whom message is to be sent.
2462 --                             Instead of this, one can send even p_send_to_res_id
2463 --    p_send_to_res_id     IN   NUMBER   Optional
2464 --                             Resource Id that will be used to get role name from WF_DIRECTORY.
2465 --                             This is required if role name is not passed.
2466 
2467 --   OUT:
2468 --    x_notif_id           OUT  NUMBER
2469 --                             Notification Id created that is being sent to recipient.
2470 --    x_return_status      OUT   VARCHAR2
2471 --                             Return status. If it is error, messages will be put in mesg pub.
2472 -- History:
2473 -- 11-Jan-2002 sveerave        Created.
2474 --======================================================================
2475 
2476 PROCEDURE send_wf_standalone_message(
2477    p_item_type          IN       VARCHAR2 := 'MAPGUTIL'
2478   ,p_message_name       IN       VARCHAR2 := 'GEN_STDLN_MESG'
2479   ,p_subject            IN       VARCHAR2
2480   ,p_body               IN       VARCHAR2 := NULL
2481   ,p_send_to_role_name  IN       VARCHAR2  := NULL
2482   ,p_send_to_res_id     IN       NUMBER := NULL
2483   ,x_notif_id           OUT NOCOPY      NUMBER
2484   ,x_return_status      OUT NOCOPY      VARCHAR2
2485   )
2486 IS
2487   l_role_name           VARCHAR2(100) := p_send_to_role_name;
2488   l_display_role_name   VARCHAR2(240);
2489   l_notif_id            NUMBER;
2490 
2491 BEGIN
2492    x_return_status := FND_API.G_RET_STS_SUCCESS;
2493    IF p_send_to_role_name IS NULL THEN
2494       AMS_UTILITY_PVT.get_resource_role
2495       (  p_resource_id   =>    p_send_to_res_id,
2496          x_role_name     =>    l_role_name,
2497          x_role_display_name  => l_display_role_name,
2498          x_return_status   => x_return_status
2499       );
2500       IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2501          return;
2502       END IF;
2503    END IF;
2504    l_notif_id := WF_NOTIFICATION.Send
2505                            (  role => l_role_name
2506                             , msg_type => p_item_type
2507                             , msg_name => p_message_name
2508                            );
2509    WF_NOTIFICATION.SetAttrText(  l_notif_id
2510                                , 'GEN_MSG_SUBJECT'
2511                                , p_subject
2512                               );
2513    WF_NOTIFICATION.SetAttrText(  l_notif_id
2514                                , 'GEN_MSG_BODY'
2515                                , p_body
2516                               );
2517    WF_NOTIFICATION.SetAttrText(  l_notif_id
2518                                , 'GEN_MSG_SEND_TO'
2519                                , l_role_name
2520                               );
2521    WF_NOTIFICATION.Denormalize_Notification(l_notif_id);
2522    x_notif_id := l_notif_id;
2523 END send_wf_standalone_message;
2524 
2525 --======================================================================
2526 -- FUNCTION
2527 --    Check_Status_Change
2528 --
2529 -- PURPOSE
2530 --    Created to check if the status change is valid or not.
2531 --    Returns FND_API.G_TRUE if it is valid status change
2532 --          or will return FND_API.G_FALSE
2533 --
2534 -- HISTORY
2535 --    09-Jul-2001  ptendulk  Create.
2536 --======================================================================
2537 FUNCTION Check_Status_Change(
2538    p_status_type      IN  VARCHAR2,
2539    p_current_status   IN  VARCHAR2,
2540    p_next_status      IN  VARCHAR2
2541 )
2542 RETURN VARCHAR2
2543 IS
2544    CURSOR c_stat_det IS
2545    SELECT 1 FROM DUAL
2546    WHERE EXISTS (SELECT * FROM ams_status_order_rules
2547                  WHERE current_status_code = p_current_status
2548                  AND   next_status_code = p_next_status
2549                  AND   system_status_type = p_status_type ) ;
2550    l_dummy NUMBER ;
2551 BEGIN
2552 
2553    OPEN c_stat_det ;
2554    FETCH c_stat_det INTO l_dummy ;
2555    CLOSE c_stat_det;
2556 
2557    IF l_dummy IS NULL THEN
2558       RETURN FND_API.G_FALSE ;
2559    ELSE
2560       RETURN FND_API.G_TRUE ;
2561    END IF ;
2562 END Check_Status_Change;
2563 --======================================================================
2564 -- FUNCTION
2565 --    CurrRound
2566 --
2567 -- PURPOSE
2568 --    Returns the round value for an amount based on the currency
2569 --
2570 -- HISTORY
2571 --    13-Sep-2001  slkrishn  Create.
2572 --======================================================================
2573 FUNCTION CurrRound(
2574     p_amount IN NUMBER,
2575     p_currency_code IN VARCHAR2
2576 )
2577 RETURN NUMBER
2578 IS
2579 BEGIN
2580  RETURN gl_mc_currency_pkg.CurrRound(p_amount, p_currency_code);
2581 END CurrRound;
2582 
2583 --======================================================================
2584 -- PROCEDURE
2585 --    get_install_info
2586 --
2587 -- PURPOSE
2588 --    Gets the installation information for an application
2589 --    with application_id p_dep_appl_id
2590 --
2591 -- HISTORY
2592 --    19-Dec-2002  mayjain  Create.
2593 --======================================================================
2594 procedure get_install_info(p_appl_id     in  number,
2595 			   p_dep_appl_id in  number,
2596 			   x_status	 out nocopy varchar2,
2597 			   x_industry	 out nocopy varchar2,
2598 			   x_installed   out nocopy number)
2599 	IS
2600 	  l_installed BOOLEAN;
2601 
2602 	BEGIN
2603 	   l_installed := fnd_installation.get(	appl_id     => p_appl_id,
2604                                     		dep_appl_id => p_dep_appl_id,
2605                                     		status      => x_status,
2606                                     		industry    => x_industry );
2607 	  IF (l_installed) THEN
2608 	     x_installed := 1;
2609 	  ELSE
2610 	     x_installed := 0;
2611           END IF;
2612 
2613 	END get_install_info;
2614 
2615 --======================================================================
2616 -- PROCEDURE
2617 --    Get_Object_Name
2618 --
2619 -- PURPOSE
2620 --    Callback method for IBC to get the Associated Object name for an
2621 --    Electronic Deliverable Attachment.
2622 --
2623 -- HISTORY
2624 --    3/7/2003  mayjain  Create.
2625 --======================================================================
2626 PROCEDURE Get_Object_Name(
2627 	  p_association_type_code 	IN		VARCHAR2
2628 	,p_associated_object_val1 	IN 		VARCHAR2
2629 	,p_associated_object_val2  	IN 		VARCHAR2
2630 	,p_associated_object_val3  	IN 		VARCHAR2 DEFAULT NULL
2631 	,p_associated_object_val4  	IN 		VARCHAR2 DEFAULT NULL
2632 	,p_associated_object_val5  	IN 		VARCHAR2 DEFAULT NULL
2633 	,x_object_name 	  		OUT NOCOPY	VARCHAR2
2634 	,x_object_code 	  		OUT NOCOPY	VARCHAR2
2635 	,x_return_status		OUT NOCOPY	VARCHAR2
2636 	,x_msg_count			OUT NOCOPY	NUMBER
2637 	,x_msg_data			OUT NOCOPY	VARCHAR2
2638 )
2639 IS
2640 
2641 
2642 CURSOR Cur_Delv(p_delv_id IN NUMBER)
2643 IS
2644 SELECT 	deliverable_name
2645 FROM 	ams_deliverables_vl
2646 WHERE 	deliverable_id = p_delv_id;
2647 
2648 CURSOR Cur_Camp(p_camp_id IN NUMBER)
2649 IS
2650 SELECT  campaign_name
2651 FROM    ams_campaigns_vl
2652 WHERE   campaign_id = p_camp_id;
2653 
2654 CURSOR Cur_Csch(p_csch_id IN NUMBER)
2655 IS
2656 SELECT  schedule_name
2657 FROM    ams_campaign_schedules_vl
2658 WHERE   schedule_id = p_csch_id;
2659 
2660 l_api_name  CONSTANT VARCHAR2(30)   := 'GET_OBJECT_NAME';
2661 G_PKG_NAME  CONSTANT VARCHAR2(30)   := 'AMS_UTILITY_PVT';
2662 
2663 BEGIN
2664 
2665 	If p_association_type_code = 'AMS_DELV' then
2666                 x_return_status := FND_API.G_RET_STS_SUCCESS;
2667 
2668 		OPEN Cur_Delv(p_associated_object_val1);
2669 		FETCH Cur_Delv INTO x_object_name;
2670 		CLOSE Cur_Delv;
2671         ELSIF p_association_type_code = 'AMS_CSCH'
2672              OR p_association_type_code = 'AMS_COLLAT'
2673              OR p_association_type_code = 'AMS_PLCE'
2674         THEN
2675                 x_return_status := FND_API.G_RET_STS_SUCCESS;
2676 
2677                 OPEN Cur_Csch(p_associated_object_val1);
2678                 FETCH Cur_Csch INTO x_object_name;
2679                 CLOSE Cur_Csch;
2680         ELSIF p_association_type_code = 'AMS_COLB' then
2681                 IF p_associated_object_val2 = 'CSCH' THEN
2682                         x_return_status := FND_API.G_RET_STS_SUCCESS;
2683 
2684                         OPEN Cur_Csch(p_associated_object_val1);
2685                         FETCH Cur_Csch INTO x_object_name;
2686                         CLOSE Cur_Csch;
2687                 ELSIF p_associated_object_val2 = 'CAMP' THEN
2688                         x_return_status := FND_API.G_RET_STS_SUCCESS;
2689 
2690                         OPEN Cur_Camp(p_associated_object_val1);
2691                         FETCH Cur_Camp INTO x_object_name;
2692                         CLOSE Cur_Camp;
2693                 END IF;
2694 
2695 	END IF;
2696 	-- here you can add processing for other association type as the else part
2697 
2698 	EXCEPTION
2699 	   WHEN FND_API.G_EXC_ERROR THEN
2700 	       x_return_status := FND_API.G_RET_STS_ERROR;
2701 	       FND_MSG_PUB.Count_And_Get (	p_count => x_msg_count,
2702 						p_data  => x_msg_data);
2703 	   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2704 	       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2705 	       FND_MSG_PUB.Count_And_Get (	p_count => x_msg_count,
2706 						p_data  => x_msg_data);
2707 	   WHEN OTHERS THEN
2708 	       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2709 	       IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2710 	       THEN
2711 		   FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
2712 	       END IF;
2713 	       FND_MSG_PUB.Count_And_Get (	p_count => x_msg_count,
2714 						p_data  => x_msg_data);
2715 
2716 	END Get_Object_Name;
2717 
2718 
2719 
2720      --========================================================================
2721      -- PROCEDURE
2722      --    get_user_id
2723      --
2724      -- PURPOSE
2725      --    This api will take a resource id and give the corresponding user_id
2726      --
2727      -- NOTE
2728      --
2729      -- HISTORY
2730      --  19-mar-2002    soagrawa    Created
2731      --========================================================================
2732 
2733 
2734      FUNCTION get_user_id (
2735         p_resource_id IN NUMBER
2736      )
2737      RETURN NUMBER
2738      IS
2739         l_user_id     NUMBER;
2740 
2741         CURSOR c_user IS
2742            SELECT user_id
2743            FROM   ams_jtf_rs_emp_v
2744            WHERE  resource_id = p_resource_id;
2745      BEGIN
2746         OPEN c_user;
2747         FETCH c_user INTO l_user_id;
2748         IF c_user%NOTFOUND THEN
2749            l_user_id := -1;
2750         END IF;
2751         CLOSE c_user;
2752 
2753         RETURN l_user_id;
2754      END get_user_id;
2755 
2756 
2757 --======================================================================
2758 ---------------------------------------------------------------------
2759 -- FUNCTION
2760 --    validate_locking_rules
2761 --
2762 -- PURPOSE
2763 --    This function to validate locking rules
2764 --
2765 -- HISTORY
2766 --    27-May-2005  aranka  Create.
2767 --======================================================================
2768     PROCEDURE validate_locking_rules(
2769        p_app_short_name             IN VARCHAR2,
2770        p_obj_type                   IN VARCHAR2,
2771        p_obj_attribute              IN VARCHAR2,
2772        p_obj_status                 IN VARCHAR2,
2773        p_fileld_ak_name_array       IN JTF_VARCHAR2_TABLE_100,
2774        p_change_indicator_array     IN JTF_VARCHAR2_TABLE_100,
2775        x_return_status              OUT NOCOPY VARCHAR2
2776     )
2777     IS
2778 
2779         l_app_id  NUMBER;
2780         l_region_code VARCHAR2(100);
2781         l_type VARCHAR2(4);
2782         l_ak_attribute  VARCHAR2(100);
2783         l_ak_attribute_value  VARCHAR2(80);
2784         l_attribute_token VARCHAR2(1000);
2785         l_comma_char VARCHAR2(1);
2786         l_found_error  BOOLEAN;
2787         l_context_resource_id      NUMBER;
2788 
2789         CURSOR c_get_app_id(p_app_short_name IN VARCHAR2) IS
2790         SELECT APPLICATION_ID
2791         FROM FND_APPLICATION_VL
2792         WHERE APPLICATION_SHORT_NAME = p_app_short_name;
2793 
2794         CURSOR c_get_ak_region_items(p_app_id IN NUMBER, p_region_code IN VARCHAR2, p_type IN VARCHAR2, p_obj_status IN VARCHAR2, p_obj_attribute IN VARCHAR2) IS
2795         SELECT ATTRIBUTE_LABEL_LONG FROM AK_REGION_ITEMS_VL
2796         WHERE REGION_APPLICATION_ID = p_app_id
2797         AND REGION_CODE = p_region_code
2798         AND ATTRIBUTE_CODE LIKE 'AMS%RULE%'
2799         AND REGION_VALIDATION_API_PKG = p_type
2800         AND SORTBY_VIEW_ATTRIBUTE_NAME = p_obj_status
2801         AND DEFAULT_VALUE_VARCHAR2 = p_obj_attribute;
2802 
2803         CURSOR c_get_ak_attribute(p_app_short_name IN VARCHAR2, p_attribute_code IN VARCHAR2 ) IS
2804         SELECT ATTRIBUTE_LABEL_LONG FROM AK_ATTRIBUTES_VL
2805         WHERE APPLICATION_SHORT_NAME = p_app_short_name
2806         AND ATTRIBUTE_CODE = p_attribute_code;
2807 
2808     BEGIN
2809 
2810         l_app_id := NULL;
2811         l_type := 'LOCK';
2812         l_attribute_token := null;
2813         l_region_code := 'AMS_' ||  p_obj_type || '_METADATA_0';
2814         l_comma_char := ',';
2815         l_found_error := false;
2816 	l_context_resource_id := AMS_Utility_PVT.get_resource_id(FND_GLOBAL.user_id);
2817 
2818         x_return_status := FND_API.G_RET_STS_SUCCESS;
2819         IF p_obj_type IS NULL or p_obj_attribute IS NULL or p_obj_status IS NULL or p_fileld_ak_name_array IS NULL or p_change_indicator_array IS NULL THEN
2820             x_return_status := FND_API.G_RET_STS_ERROR;
2821 --            DBMS_OUTPUT.put_line('Sam incorrect Data or null data');
2822             return;
2823         END IF;
2824 
2825         IF (p_fileld_ak_name_array.count <> p_change_indicator_array.count ) THEN
2826             x_return_status := FND_API.G_RET_STS_ERROR;
2827 --            DBMS_OUTPUT.put_line('Sam incorrect Data or null data');
2828             return;
2829         END IF;
2830 
2831         /* LAM rules will not apply to Admin user.  Bug  5306637*/
2832         IF AMS_Access_PVT.Check_Admin_Access(l_context_resource_id) THEN
2833 	    x_return_status := FND_API.g_ret_sts_success;
2834         return;
2835 	END IF;
2836 
2837         OPEN c_get_app_id(p_app_short_name);
2838         FETCH c_get_app_id INTO l_app_id;
2839         CLOSE c_get_app_id;
2840 
2841 
2842 --        DBMS_OUTPUT.put_line('Sam l_app_id ' || l_app_id);
2843 --        DBMS_OUTPUT.put_line('Sam l_region_code ' || l_region_code);
2844 --        DBMS_OUTPUT.put_line('Sam l_type ' || l_type);
2845 --        DBMS_OUTPUT.put_line('Sam p_obj_status ' || p_obj_status);
2846 --        DBMS_OUTPUT.put_line('Sam p_obj_attribute ' || p_obj_attribute);
2847 
2848 
2849         OPEN c_get_ak_region_items(l_app_id, l_region_code, l_type, p_obj_status, p_obj_attribute);
2850         LOOP
2851             FETCH c_get_ak_region_items INTO l_ak_attribute;
2852             EXIT WHEN c_get_ak_region_items%notfound;
2853 --                DBMS_OUTPUT.put_line('Sam inside outer loop ' || l_ak_attribute);
2854                 FOR i IN 1 .. p_fileld_ak_name_array.count
2855                 LOOP
2856                     if (l_ak_attribute = p_fileld_ak_name_array(i)) then
2857                         if (p_change_indicator_array(i) = 'Y') then
2858                             x_return_status := FND_API.G_RET_STS_ERROR;
2859 
2860                             OPEN c_get_ak_attribute(p_app_short_name, l_ak_attribute);
2861                             FETCH c_get_ak_attribute INTO l_ak_attribute_value;
2862                             CLOSE c_get_ak_attribute;
2863 
2864                             l_found_error := true;
2865                             if ( l_attribute_token is null ) then
2866                                 l_attribute_token := l_ak_attribute_value;
2867                             else
2868                                 l_attribute_token := l_attribute_token || l_comma_char || ' ' || l_ak_attribute_value;
2869                             end if;
2870                         end if;
2871                     end if;
2872                 END LOOP;
2873         END LOOP;
2874 
2875         if ( l_found_error ) then
2876             FND_MESSAGE.Set_Name ('AMS', 'AMS_VALIDATE_LOCKING_RULES');
2877             FND_MESSAGE.Set_Token ('ATTRIBUTES', l_attribute_token);
2878             FND_MSG_PUB.Add;
2879 --            DBMS_OUTPUT.put_line('Sam Error 3 ' || l_ak_attribute_value);
2880         end if;
2881 
2882         CLOSE c_get_ak_region_items;
2883 --        DBMS_OUTPUT.put_line('Sam Success');
2884         return;
2885     END validate_locking_rules;
2886 
2887 
2888 END AMS_Utility_PVT;