DBA Data[Home] [Help]

PACKAGE BODY: APPS.EGO_EXT_FWK_PUB

Source


1 PACKAGE BODY EGO_EXT_FWK_PUB AS
2 /* $Header: EGOPEFMB.pls 120.61 2008/04/21 08:45:53 sandpand ship $ */
3 
4                 ------------------------------------
5                 -- Global Variables and Constants --
6                 ------------------------------------
7   G_PKG_NAME           CONSTANT VARCHAR2(30)   := 'EGO_EXT_FWK_PUB';
8   G_APP_NAME           CONSTANT  VARCHAR2(3)   := 'EGO';
9   G_PKG_NAME_TOKEN     CONSTANT  VARCHAR2(8)   := 'PKG_NAME';
10   G_API_NAME_TOKEN     CONSTANT  VARCHAR2(8)   := 'API_NAME';
11   G_SQL_ERR_MSG_TOKEN  CONSTANT  VARCHAR2(11)  := 'SQL_ERR_MSG';
12   G_PLSQL_ERR          CONSTANT  VARCHAR2(17)  := 'EGO_PLSQL_ERR';
13 
14   G_CURRENT_USER_ID          NUMBER := FND_GLOBAL.User_Id;
15   G_CURRENT_LOGIN_ID         NUMBER := FND_GLOBAL.Login_Id;
16 
17   -- For use with error-reporting --
18   G_ADD_ERRORS_TO_FND_STACK  CONSTANT VARCHAR2(1) := 'Y';
19   G_DUMMY_ENTITY_INDEX       NUMBER;
20   G_DUMMY_ENTITY_ID          VARCHAR2(50);
21   G_DUMMY_MESSAGE_TYPE       VARCHAR2(1);
22 
23 
24                     --------------------------
25                     -- Package-Private APIs --
26                     --------------------------
27 
28 procedure code_debug (msg VARCHAR2) IS
29 BEGIN
30 --  IF msg like '%Delete_Association%' THEN
31 --    sri_debug(G_PKG_NAME||' '||msg);
32 --  END IF;
33   NULL;
34 END;
35 
36 /*-----------------------------------------------------------------------------
37 
38   DESCRIPTION
39     Converts a SELECT expression to its correct data type.
40 
41   BUG FIX
42     6319734
43 
44   PARAMETERS
45     See below.
46 
47   AUTHOR
48     ssarnoba
49 
50   NOTES
51 
52 -----------------------------------------------------------------------------*/
53 PROCEDURE Convert_Child_VS_Select_Expr (
54     p_parent_vs_row           IN            ego_value_sets_v%ROWTYPE
55   , p_convert_date            IN            VARCHAR2   :=  FND_API.G_FALSE
56   , x_column_name             IN OUT NOCOPY VARCHAR2
57 )
58 IS
59 BEGIN
60 
61   -- If the value set is not of data type character, conversion is needed.
62   IF ( p_parent_vs_row.FORMAT_CODE = G_NUMBER_DATA_TYPE ) THEN
63     x_column_name      := 'TO_NUMBER(' || x_column_name  || ')';
64 
65   ELSIF
66     (( p_parent_vs_row.FORMAT_CODE = G_DATE_DATA_TYPE      OR
67        p_parent_vs_row.FORMAT_CODE = G_DATE_TIME_DATA_TYPE ) AND
68                     p_convert_date = FND_API.G_TRUE )
69   THEN
70     -- Generally this is done later on so we don't do the conversion
71     -- unless forced by p_convert_date.
72     x_column_name      := 'TO_DATE('   || x_column_name || ',''' ||
73                                    EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT ||
74                                                           ''')';
75 
76   ELSE
77     x_column_name      :=   x_column_name ;
78   END IF;
79 
80 END Convert_Child_VS_Select_Expr;
81 
82 
83 /*-----------------------------------------------------------------------------
84 
85   DESCRIPTION
86     Builds the SELECT clause expressions for a child value set definition that
87     gets inserted into FND_FLEX_VALIDATION_TABLES.
88 
89   BUG FIX
90     6319734
91 
92   PARAMETERS
93     See below.
94 
95   AUTHOR
96     ssarnoba
97 
98   NOTES
99     The ID_COLUMN_NAME and VALUE_COLUMN_NAME values ultimately appears in a
100     SELECT clause to represent the value set. These child value set values
101     require conversion to their true data type for the values to be read
102     correctly in the Java layer.
103 
104 -----------------------------------------------------------------------------*/
105 PROCEDURE Build_Child_VS_Select_Exprs (
106     p_parent_vs_row       IN  ego_value_sets_v%ROWTYPE
107   , x_id_column_type      OUT NOCOPY fnd_flex_validation_tables.id_column_type%TYPE
108   , x_value_column_type   OUT NOCOPY fnd_flex_validation_tables.value_column_type%TYPE
109   , x_id_column_name      OUT NOCOPY fnd_flex_validation_tables.id_column_name%TYPE
110   , x_value_column_name   OUT NOCOPY fnd_flex_validation_tables.value_column_name%TYPE
111 )
112 IS
113 BEGIN
114 
115   ----------------------------------------------------------------------------
116   -- 1. FND_FLEX_VALIDATION_TABLES                                          --
117   --      - ID_COLUMN_NAME                                                  --
118   --      - ID_COLUMN_TYPE                                                  --
119   ----------------------------------------------------------------------------
120 
121   -- ID_COLUMN_TYPE must ALWAYS be the true data type of the value set
122   x_id_column_type             := p_parent_vs_row.FORMAT_CODE;
123 
124 
125   -- Set the value for ID_COLUMN_NAME
126   x_id_column_name             := 'vsv.INTERNAL_NAME';
127 
128   -- Convert ID_COLUMN_NAME if necessary
129   Convert_Child_VS_Select_Expr (
130      p_parent_vs_row            => p_parent_vs_row
131    , p_convert_date             => FND_API.G_FALSE
132    , x_column_name              => x_id_column_name
133   );
134 
135   ----------------------------------------------------------------------------
136   -- 2. FND_FLEX_VALIDATION_TABLES                                          --
137   --      - VALUE_COLUMN_NAME                                               --
138   --      - VALUE_COLUMN_TYPE                                               --
139   ----------------------------------------------------------------------------
140 
141   -- Initialize VALUE_COLUMN_NAME
142   x_value_column_name          := 'vsv.DISPLAY_NAME';
143 
144   -- Value set's validation type is Translatable Independent
145   IF ( p_parent_vs_row.VALIDATION_CODE_ADMIN = G_TRANS_IND_VALIDATION_CODE   )
146   THEN
147 
148     -- The value of VALUE_COLUMN_NAME will always be of type character since
149     -- it's used purely for display.
150     x_value_column_type        := G_CHAR_DATA_TYPE;
151 
152   -- Value set's validation type is Independent
153   ELSIF
154      ( p_parent_vs_row.VALIDATION_CODE_ADMIN = G_INDEPENDENT_VALIDATION_CODE )
155   THEN
156 
157     -- The value of VALUE_COLUMN_NAME will have the true data type of the value
158     -- set, so a conversion will be necessary as per ID_COLUMN_...
159     x_value_column_type        := x_id_column_type;
160 
161     -- Convert the value for VALUE_COLUMN_NAME if necessary
162     Convert_Child_VS_Select_Expr (
163        p_parent_vs_row            => p_parent_vs_row
164      , p_convert_date             => FND_API.G_TRUE
165      , x_column_name              => x_value_column_name
166     );
167 
168   END IF;
169 
170 END Build_Child_VS_Select_Exprs;
171 
172 
173 /*-----------------------------------------------------------------------------
174 
175   DESCRIPTION
176 
177     Inserts a space before an ORDER BY clause, so that order by elimination
178     takes place for inner query blocks.
179 
180   BUG FIX
181     6148833
182 
183   PARAMETERS
184     See below.
185 
186 -----------------------------------------------------------------------------*/
187 PROCEDURE Insert_Order_By_Space (
188   p_where_order_by           IN OUT NOCOPY  VARCHAR2
189 )
190 IS
191 BEGIN
192 
193   -- Insert a space before an ORDER BY clause, so that ORDER BY elimination
194   -- takes place for inner query blocks
195   p_where_order_by := regexp_replace(
196     p_where_order_by,                                           -- input string
197     '\)(O)',                                                -- pattern to match
198     ') \1',                                               -- replacement string
199     1,                               -- begin the search at the first character
200     0,                                 -- replaces all occurrences of the match
201     'i');                                          -- case insensitive matching
202 
203 END Insert_Order_By_Space;
204 
205 ----------------------------------------------------------------------
206 --R12C
207 -- call this API to delete all visibility for a given Action
208 PROCEDURE Delete_Action_Data_Level (
209         p_api_version                   IN   NUMBER
210        ,p_action_id                     IN   NUMBER
211        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
212        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
213        ,x_return_status                 OUT NOCOPY VARCHAR2
214        ,x_errorcode                     OUT NOCOPY NUMBER
215        ,x_msg_count                     OUT NOCOPY NUMBER
216        ,x_msg_data                      OUT NOCOPY VARCHAR2
217 ) IS
218 
219     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Action_Data_Level';
220 
221     --we don't use l_api_version yet, but eventually we might:
222     --if we change required parameters, version goes FROM n.x to (n+1).x
223     --if we change optional parameters, version goes FROM x.n to x.(n+1)
224     l_api_version            CONSTANT NUMBER := 1.0;
225 
226   BEGIN
227     code_debug ( l_api_name || ' Start ');
228     -- Standard start of API savepoint
229     IF FND_API.To_Boolean(p_commit) THEN
230       SAVEPOINT Delete_Action_Data_Level;
231     END IF;
232 
233     -- Check for call compatibility
234     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
235                                         l_api_name, G_PKG_NAME)
236     THEN
237       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
238     END IF;
239     -- Initialize message list even though we don't currently use it
240     IF FND_API.To_Boolean(p_init_msg_list) THEN
241       FND_MSG_PUB.Initialize;
242     END IF;
243 
244     DELETE FROM EGO_ACTIONS_DL
245     WHERE ACTION_ID = p_action_id;
246 
247     -- Standard check of p_commit
248     IF FND_API.To_Boolean(p_commit) THEN
249       COMMIT WORK;
250     END IF;
251     x_return_status := FND_API.G_RET_STS_SUCCESS;
252     code_debug ( l_api_name || ' Exiting with status: '||x_return_status);
253 
254   EXCEPTION
255     WHEN OTHERS THEN
256       IF FND_API.To_Boolean(p_commit) THEN
257         ROLLBACK TO Delete_Action_Data_Level;
258       END IF;
259       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
260 
261       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
262       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
263       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
264       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
265       FND_MSG_PUB.Add;
266       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
267                                ,p_count   => x_msg_count
268                                ,p_data    => x_msg_data);
269 
270 
271 END Delete_Action_Data_Level;
272 
273 ----------------------------------------------------------------------
274 
275 
276 
277 FUNCTION Execute_DDL_And_Return_Err (
278         p_ddl_to_execute                IN   VARCHAR2
279 )
280 RETURN VARCHAR2
281 IS
282 
283     PRAGMA AUTONOMOUS_TRANSACTION;
284     l_sqlerrm                VARCHAR2(1000);
285 
286   BEGIN
287 
288     EXECUTE IMMEDIATE p_ddl_to_execute;
289     RETURN NULL;
290 
291   EXCEPTION
292     WHEN OTHERS THEN
293       l_sqlerrm := SQLERRM;
294       RETURN l_sqlerrm;
295 
296 END Execute_DDL_And_Return_Err;
297 
298 ---------------------------------------------------------------------
299 -- Requirement:   bug: 3542670
300 --
301 -- Function: To return the where clause from long column as VARCHAR2
302 --           In case of any exceptions, NULL is returned
303 --
304 -- Parameters:
305 --         IN
306 --  p_value_set_id   : value set id
307 --        OUT
308 --  NONE
309 --
310 ---------------------------------------------------------------------
311 FUNCTION get_vs_table_where_clause (p_value_set_id  IN  NUMBER)
312 RETURN VARCHAR2 IS
313   l_addl_where_clause LONG;
314 BEGIN
315   SELECT additional_where_clause
316   INTO l_addl_where_clause
317   FROM fnd_flex_validation_tables
318   WHERE flex_value_set_id = p_value_set_id;
319   RETURN l_addl_where_clause;
320 EXCEPTION
321   WHEN OTHERS THEN
322     RETURN NULL;
323 END get_vs_table_where_clause;
324 
325 ---------------------------------------------------------------------
326 -- Requirement:   bug: 3542670
327 --
328 -- Function: To get the validation type of a value set.
329 --           If the user passes value_set_id and value_set_name,
330 --           value_set_id takes precedence.
331 --
332 -- Parameters:
333 --         IN
334 --  p_value_set_id   : value set id
335 --  p_value_set_name : value set name
336 --        OUT
337 --  NONE
338 --
339 ---------------------------------------------------------------------
340 FUNCTION get_vs_validation_type (p_value_set_id   IN  NUMBER
341                                 ,p_value_set_name IN  VARCHAR2
342                                 ) RETURN VARCHAR2 IS
343   l_return_value  fnd_flex_value_sets.validation_type%TYPE;
344 BEGIN
345   l_return_value := NULL;
346   IF p_value_set_id IS NOT NULL THEN
347     SELECT validation_type
348     INTO l_return_value
349     FROM fnd_flex_value_sets
350     WHERE flex_value_set_id = p_value_set_id;
351   ELSIF p_value_set_name IS NOT NULL THEN
352     SELECT validation_type
353     INTO l_return_value
354     FROM fnd_flex_value_sets
355     WHERE flex_value_set_name = p_value_set_name;
356   END IF;
357   RETURN l_return_value;
358 EXCEPTION
359   WHEN OTHERS THEN
360     RETURN l_return_value;
361 END get_vs_validation_type;
362 
363 
364 ------------------------------------------------------------------------------------------
365 -- Function: To return whether a record exists for the  given unique key combination
366 --           in FND and EGO Tables
367 --           If the table is not defined, NULL is returned
368 --
369 -- Parameters:
370 --         IN
371 --  p_context:  ATTRIBUTE or ATTRIBUTE GROUP
372 --  p_application_id      application_id
373 --  p_attr_group_type     Attribute Group Type
374 --  p_attr_group_name     Attribute Group Name
375 --  p_internal_name       Intenral Name of Either Attribute or Attribute group.
376 --        OUT
377 --  x_fnd_exists     : Y if record exists else N
378 --  x_ego_exists     : Y if record exists else N
379 ------------------------------------------------------------------------------------------
380 PROCEDURE Get_fnd_ego_record_exists (
381          p_context         IN VARCHAR2
382         ,p_application_id  IN NUMBER
383         ,p_attr_group_type IN VARCHAR2
384         ,p_attr_group_name IN VARCHAR2
385         ,p_internal_name   IN VARCHAR2
386         ,x_fnd_exists      OUT NOCOPY  VARCHAR2
387         ,x_ego_exists      OUT NOCOPY  VARCHAR2
388 )IS
389 
390 BEGIN
391 
392    IF (p_context = 'ATTRIBUTE GROUP') THEN
393       BEGIN
394          SELECT 'Y' INTO x_fnd_exists
395          FROM FND_DESCR_FLEX_CONTEXTS
396          WHERE APPLICATION_ID = p_application_id
397          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
398          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name;
399        EXCEPTION
400           WHEN OTHERS THEN
401              x_fnd_exists :='N';
402        END;
403        BEGIN
404          SELECT 'Y' INTO  x_ego_exists
405          FROM EGO_FND_DSC_FLX_CTX_EXT
406          WHERE APPLICATION_ID = p_application_id
407          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
408          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name;
409        EXCEPTION
410          WHEN OTHERS THEN
411              x_ego_exists :='N';
412         END;
413    ELSIF (p_context = 'ATTRIBUTE') THEN
417          WHERE APPLICATION_ID = p_application_id
414       BEGIN
415          SELECT 'Y' INTO x_fnd_exists
416          FROM FND_DESCR_FLEX_COLUMN_USAGES
418          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
419          AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
420          AND END_USER_COLUMN_NAME = p_internal_name;
421       EXCEPTION
422           WHEN OTHERS THEN
423             x_fnd_exists :='N';
424       END;
425       BEGIN
426          SELECT 'Y' INTO x_ego_exists
427          FROM EGO_FND_DF_COL_USGS_EXT ext
428         ,FND_DESCR_FLEX_COLUMN_USAGES fl_col
429          WHERE ext.APPLICATION_ID (+) = fl_col.APPLICATION_ID
430          AND ext.DESCRIPTIVE_FLEXFIELD_NAME (+) = fl_col.DESCRIPTIVE_FLEXFIELD_NAME
431          AND ext.DESCRIPTIVE_FLEX_CONTEXT_CODE (+) = fl_col.DESCRIPTIVE_FLEX_CONTEXT_CODE
432          AND ext.APPLICATION_COLUMN_NAME (+) = fl_col.APPLICATION_COLUMN_NAME
433          AND ext.APPLICATION_ID = p_application_id
434          AND ext.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
435          AND ext.DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
436          AND fl_col.END_USER_COLUMN_NAME = p_internal_name;
437       EXCEPTION
438         WHEN OTHERS THEN
439           x_ego_exists:='N';
440       END;
441    END IF;
442 
443 
444 EXCEPTION
445    WHEN OTHERS THEN
446        x_fnd_exists := NULL;
447        x_ego_exists := NULL;
448 END Get_fnd_ego_record_exists;
449 
450 --Bug 5443697
451 ------------------------------------------------------------------------------------------
452 -- Procedure: To set the variable x_start_num to 'Y' or 'N' based in whether the
453 --            String that is passed contains Number as the starting character.
454 --
455 -- Parameters:
456 --         IN
457 --  p_internal_name:      the internal name of the Attribute group/Attribute
458 --        OUT
459 --  x_start_num     : Y if the starting character is number else N
460 ------------------------------------------------------------------------------------------
461 
462 PROCEDURE has_Num_Start_char (
463                               p_internal_name  IN VARCHAR2,
464                               x_start_num OUT  NOCOPY VARCHAR2
465 )IS
466   l_start_char VARCHAR2(10);
467   l_internal_name VARCHAR2 (1000);
468 
469   BEGIN
470      l_internal_name:=p_internal_name;
471      IF (l_internal_name IS null) THEN
472        x_start_num :='N';
473      END IF;
474      l_internal_name:=trim(l_internal_name);
475      l_start_char:=substr(l_internal_name,1,1);
476 
477      IF  l_start_char IN ('0','1','2','3','4','5','6','7','8','9') THEN
478        x_start_num := 'Y';
479      ELSE
480        x_start_num :='N';
481      END IF;
482   EXCEPTION
483     WHEN OTHERS THEN
484           x_start_num:='N';
485           NULL;
486 END has_Num_Start_char;
487 
488 --Bug 5443697
489 ------------------------------------------------------------------------------------------
490 -- Procedure: To set the variable x_start_num to 'Y' or 'N' based in whether the
491 --            String that is passed contains under score as the starting character.
492 --
493 -- Parameters:
494 --         IN
495 --  p_internal_name:      the internal name of the Attribute group/Attribute
496 --  p_char_set:           the character set to be checked
497 --        OUT
498 --  x_start_und_sc     : Y if the starting character is equal to the p_char_set else N
499 ------------------------------------------------------------------------------------------
500 
501 PROCEDURE has_Given_Char_As_Start_char (
502                               p_internal_name  IN VARCHAR2,
503                               p_char_set IN VARCHAR2,
504                               x_start_und_sc OUT  NOCOPY VARCHAR2
505 )IS
506   l_start_char VARCHAR2(10);
507   l_internal_name VARCHAR2 (1000);
508 
509   BEGIN
510      l_internal_name:=p_internal_name;
511      IF (l_internal_name IS null) THEN
512        x_start_und_sc :='N';
513      END IF;
514      l_internal_name:=trim(l_internal_name);
515      l_start_char:=substr(l_internal_name,1,1);
516 
517      IF  (l_start_char = p_char_set) THEN
518        x_start_und_sc := 'Y';
519      ELSE
520        x_start_und_sc :='N';
521      END IF;
522   EXCEPTION
523     WHEN OTHERS THEN
524           x_start_und_sc:='N';
525           NULL;
526 END has_Given_Char_As_Start_char;
527 
528 
529 
530 ---------------------------------------------------------------------
531 -- Requirement:   bug: 3542670
532 --
533 -- Function: To process value set values.
534 --           Given all the parameters, the data is inserted into
535 --           FND_FLEX_VALUES and FND_FLEX_VALUES_TL
536 --
537 -- Parameters:
538 --         IN
539 --  p_transaction_type : CREATE, UPDATE
540 --  p_value_set_name   : value set name
541 --  p_internal_name    : flex value
542 --  p_display_name     : flex value meaning
543 --  p_description      : flex value description
544 --  p_sequence         : sequence of display -- APC column
545 --  p_start_date       : start date
546 --  p_end_date         : end date
547 --  p_enabled          : enabled flag
548 --        OUT
549 --  x_return_status                 OUT NOCOPY VARCHAR2
550 --
554        ,p_value_set_name                IN   VARCHAR2
551 ---------------------------------------------------------------------
552 PROCEDURE Process_Value_Set_Val (
553         p_transaction_type              IN   VARCHAR2
555        ,p_internal_name                 IN   VARCHAR2
556        ,p_display_name                  IN   VARCHAR2
557        ,p_description                   IN   VARCHAR2
558        ,p_sequence                      IN   NUMBER
559        ,p_start_date                    IN   DATE
560        ,p_end_date                      IN   DATE
561        ,p_enabled                       IN   VARCHAR2
562        ,p_owner                         IN   NUMBER  DEFAULT NULL
563        ,x_return_status                 OUT NOCOPY VARCHAR2
564 ) IS
565 
566     l_api_name               VARCHAR2(30);
567     l_flex_value_id          FND_FLEX_VALUES.flex_value_id%TYPE;
568     l_value_set_id           FND_FLEX_VALUES.flex_value_set_id%TYPE;
569     l_Sysdate                DATE;
570     l_rowid                  VARCHAR2(100);
571 
572     l_validation_type        fnd_flex_value_sets.validation_type%TYPE;
573     l_storage_value          VARCHAR2(32767);
574     l_msg_count              NUMBER;
575     l_msg_data               VARCHAR2(32767);
576     l_owner                  NUMBER;
577 
578 BEGIN
579 
580   l_api_name      := 'PVT_Process_Value_Set_Val';
581   code_debug (l_api_name||' invoked with parameters -- p_transaction_type: '||p_transaction_type);
582   code_debug (' p_value_set_name: '||p_value_set_name||' p_internal_name: '||p_internal_name||' p_display_name: '||p_display_name);
583   code_debug (' p_sequence: '||p_sequence||' p_start_date: '||p_start_date||' p_end_date: '||p_end_date);
584   code_debug (' p_enabled: '||p_enabled||' p_description: '||p_description);
585 
586   l_validation_type :=  get_vs_validation_type (p_value_set_id  => NULL
587                                      ,p_value_set_name => p_value_set_name
588                             );
589 
590   IF (p_owner IS NULL OR p_owner = -1) THEN
591     l_owner := g_current_user_id;
592   ELSE
593     l_owner := p_owner;
594   END IF;
595 
596   IF NVL(l_validation_type, 'A') NOT IN (G_TABLE_VALIDATION_CODE,
597                                          G_INDEPENDENT_VALIDATION_CODE,
598                                          G_NONE_VALIDATION_CODE,
599                                          G_TRANS_IND_VALIDATION_CODE) THEN
600     -- not currently supported in EGO
601     x_return_status := FND_API.G_RET_STS_ERROR;
602   END IF;
603 
604 --  IF l_validation_type = G_TRANS_IND_VALIDATION_CODE THEN
605     l_Sysdate  := SYSDATE;
606     SELECT flex_value_set_id
607     INTO l_value_set_id
608     FROM fnd_flex_value_sets
609     WHERE flex_value_set_name = p_value_set_name;
610 
611     IF p_transaction_type = 'CREATE'  THEN
612       -- create an translatable independent value set
613       SELECT fnd_flex_values_s.NEXTVAL
614       INTO l_flex_value_id
615       FROM dual;
616       FND_FLEX_VALUES_PKG.INSERT_ROW
617         (x_rowid                    => l_rowid
618         ,x_flex_value_id            => l_flex_value_id
619         ,x_attribute_sort_order     => NULL
620         ,x_flex_value_set_id        => l_value_set_id
621         ,x_flex_value               => p_internal_name
622         ,x_enabled_flag             => NVL(p_enabled,'Y')
623         ,x_summary_flag             => 'N'
624         ,x_start_date_active        => p_start_date
625         ,x_end_date_active          => p_end_date
626         ,x_parent_flex_value_low    => NULL
627         ,x_parent_flex_value_high   => NULL
628         ,x_structured_hierarchy_level => NULL
629         ,x_hierarchy_level            => NULL
630         ,x_compiled_value_attributes  => NULL
631         ,x_value_category             => NULL
632         ,x_attribute1                 => NULL
633         ,x_attribute2                 => NULL
634         ,x_attribute3                 => NULL
635         ,x_attribute4                 => NULL
636         ,x_attribute5                 => NULL
637         ,x_attribute6                 => NULL
638         ,x_attribute7                 => NULL
639         ,x_attribute8                 => NULL
640         ,x_attribute9                 => NULL
641         ,x_attribute10                => NULL
642         ,x_attribute11                => NULL
643         ,x_attribute12                => NULL
644         ,x_attribute13                => NULL
645         ,x_attribute14                => NULL
646         ,x_attribute15                => NULL
647         ,x_attribute16                => NULL
648         ,x_attribute17                => NULL
649         ,x_attribute18                => NULL
650         ,x_attribute19                => NULL
651         ,x_attribute20                => NULL
652         ,x_attribute21                => NULL
653         ,x_attribute22                => NULL
654         ,x_attribute23                => NULL
655         ,x_attribute24                => NULL
656         ,x_attribute25                => NULL
657         ,x_attribute26                => NULL
658         ,x_attribute27                => NULL
659         ,x_attribute28                => NULL
660         ,x_attribute29                => NULL
661         ,x_attribute30                => NULL
662         ,x_attribute31                => NULL
663         ,x_attribute32                => NULL
667         ,x_attribute36                => NULL
664         ,x_attribute33                => NULL
665         ,x_attribute34                => NULL
666         ,x_attribute35                => NULL
668         ,x_attribute37                => NULL
669         ,x_attribute38                => NULL
670         ,x_attribute39                => NULL
671         ,x_attribute40                => NULL
672         ,x_attribute41                => NULL
673         ,x_attribute42                => NULL
674         ,x_attribute43                => NULL
675         ,x_attribute44                => NULL
676         ,x_attribute45                => NULL
677         ,x_attribute46                => NULL
678         ,x_attribute47                => NULL
679         ,x_attribute48                => NULL
680         ,x_attribute49                => NULL
681         ,x_attribute50                => NULL
682         ,x_flex_value_meaning         => p_display_name
683         ,x_description                => p_description
684         ,x_creation_date              => l_sysdate
685         ,x_created_by                 => l_owner
686         ,x_last_update_date           => l_sysdate
687         ,x_last_updated_by            => l_owner
688         ,x_last_update_login          => G_CURRENT_LOGIN_ID);
689 
690     ELSIF p_transaction_type = 'UPDATE' THEN
691       SELECT flex_value_id
692       INTO l_flex_value_id
693       FROM fnd_flex_values
694       WHERE flex_value_set_id = l_value_set_id
695         AND flex_value = p_internal_name;
696 
697       FND_FLEX_VALUES_PKG.UPDATE_ROW
698         (x_flex_value_id            => l_flex_value_id
699         ,x_attribute_sort_order     => NULL
700         ,x_flex_value_set_id        => l_value_set_id
701         ,x_flex_value               => p_internal_name
702         ,x_enabled_flag             => p_enabled
703         ,x_summary_flag             => 'N'
704         ,x_start_date_active        => p_start_date
705         ,x_end_date_active          => p_end_date
706         ,x_parent_flex_value_low    => NULL
707         ,x_parent_flex_value_high   => NULL
708         ,x_structured_hierarchy_level => NULL
709         ,x_hierarchy_level            => NULL
710         ,x_compiled_value_attributes  => NULL
711         ,x_value_category             => NULL
712         ,x_attribute1                 => NULL
713         ,x_attribute2                 => NULL
714         ,x_attribute3                 => NULL
715         ,x_attribute4                 => NULL
716         ,x_attribute5                 => NULL
717         ,x_attribute6                 => NULL
718         ,x_attribute7                 => NULL
719         ,x_attribute8                 => NULL
720         ,x_attribute9                 => NULL
721         ,x_attribute10                => NULL
722         ,x_attribute11                => NULL
723         ,x_attribute12                => NULL
724         ,x_attribute13                => NULL
725         ,x_attribute14                => NULL
726         ,x_attribute15                => NULL
727         ,x_attribute16                => NULL
728         ,x_attribute17                => NULL
729         ,x_attribute18                => NULL
730         ,x_attribute19                => NULL
731         ,x_attribute20                => NULL
732         ,x_attribute21                => NULL
733         ,x_attribute22                => NULL
734         ,x_attribute23                => NULL
735         ,x_attribute24                => NULL
736         ,x_attribute25                => NULL
737         ,x_attribute26                => NULL
738         ,x_attribute27                => NULL
739         ,x_attribute28                => NULL
740         ,x_attribute29                => NULL
741         ,x_attribute30                => NULL
742         ,x_attribute31                => NULL
743         ,x_attribute32                => NULL
744         ,x_attribute33                => NULL
745         ,x_attribute34                => NULL
746         ,x_attribute35                => NULL
747         ,x_attribute36                => NULL
748         ,x_attribute37                => NULL
749         ,x_attribute38                => NULL
750         ,x_attribute39                => NULL
751         ,x_attribute40                => NULL
752         ,x_attribute41                => NULL
753         ,x_attribute42                => NULL
754         ,x_attribute43                => NULL
755         ,x_attribute44                => NULL
756         ,x_attribute45                => NULL
757         ,x_attribute46                => NULL
758         ,x_attribute47                => NULL
759         ,x_attribute48                => NULL
760         ,x_attribute49                => NULL
761         ,x_attribute50                => NULL
762         ,x_flex_value_meaning         => p_display_name
763         ,x_description                => p_description
764         ,x_last_update_date           => l_sysdate
765         ,x_last_updated_by            => l_owner
766         ,x_last_update_login          => G_CURRENT_LOGIN_ID);
767     END IF;
768 
769 /***
770   this is not working right now
771   logged bug 3957430 against FND
772 
773   ELSE -- value set of type Independent.
774     IF p_transaction_type = 'CREATE'  THEN
778           ,p_flex_value                 => p_internal_name
775     code_debug (l_api_name||' calling  FND_FLEX_VAL_API.create_independent_vset_value ');
776        FND_FLEX_VAL_API.create_independent_vset_value
777           (p_flex_value_set_name        => p_value_set_name
779           ,p_description                => p_description
780           ,p_enabled_flag               => p_enabled
781           ,p_start_date_active          => p_start_date
782           ,p_end_date_active            => p_end_date
783 -- allow default values
784 --          ,p_summary_flag               IN VARCHAR2 DEFAULT 'N',
785 --          ,p_structured_hierarchy_level IN NUMBER DEFAULT NULL,
786 --          ,p_hierarchy_level            IN VARCHAR2 DEFAULT NULL,
787           ,x_storage_value              => l_storage_value);
788     code_debug (l_api_name||' returning  FND_FLEX_VAL_API.create_independent_vset_value with value '||l_storage_value );
789     ELSIF p_transaction_type = 'UPDATE' THEN
790     code_debug (l_api_name||' calling  FND_FLEX_VAL_API.update_independent_vset_value ');
791       FND_FLEX_VAL_API.update_independent_vset_value
792           (p_flex_value_set_name        => p_value_set_name
793           ,p_flex_value                 => p_internal_name
794           ,p_description                => p_description
795           ,p_enabled_flag               => p_enabled
796           ,p_start_date_active          => p_start_date
797           ,p_end_date_active            => p_end_date
798 -- allow default values
799 --          ,p_summary_flag               IN VARCHAR2 DEFAULT 'N',
800 --          ,p_structured_hierarchy_level IN NUMBER DEFAULT NULL,
801 --          ,p_hierarchy_level            IN VARCHAR2 DEFAULT NULL,
802           ,x_storage_value              => l_storage_value);
803     code_debug (l_api_name||' returning  FND_FLEX_VAL_API.update_independent_vset_value with value '||l_storage_value );
804     END IF;
805   END IF;
806 ***/
807 
808     code_debug (l_api_name||' calling proces_vs_value_sequence  ');
809   process_vs_value_sequence
810        (p_api_version          => 1.0
811        ,p_transaction_type     => p_transaction_type
812        ,p_value_set_id         => NULL
813        ,p_value_set_name       => p_value_set_name
814        ,p_value_set_value_id   => l_flex_value_id
815        ,p_value_set_value      => p_internal_name
816        ,p_sequence             => p_sequence
817        ,p_owner                => l_owner
818        ,p_init_msg_list        => fnd_api.g_FALSE
819        ,p_commit               => fnd_api.g_FALSE
820        ,x_return_status        => x_return_status
821        ,x_msg_count            => l_msg_count
822        ,x_msg_data             => l_msg_data
823        );
824     code_debug (l_api_name||' returning proces_vs_value_sequence  with status '||x_return_status);
825 
826   EXCEPTION
827     WHEN OTHERS THEN
828     code_debug (l_api_name||' EXCEPTION -- OTHERS ');
829       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
830       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
831       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
832       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
833       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
834       FND_MSG_PUB.Add;
835 END Process_Value_Set_Val;
836 
837 
838 
839 ----------------------------------------------------------------------
840 PROCEDURE Get_Attr_Group_Comb_PKs(
841     p_attr_group_id     IN   NUMBER
842     , p_application_id  OUT NOCOPY NUMBER
843     , p_attr_grp_type   OUT NOCOPY VARCHAR2
844     , p_attr_grp_name   OUT NOCOPY VARCHAR2
845 )IS
846 CURSOR get_attr_details  IS
847      SELECT application_id , descriptive_flexfield_name ,descriptive_flex_context_code
848       FROM ego_fnd_dsc_flx_ctx_ext
849       WHERE attr_group_id = p_attr_group_id;
850 BEGIN
851   OPEN get_attr_details;
852   FETCH get_attr_details
853    INTO p_application_id , p_attr_grp_type , p_attr_grp_name;
854   IF get_attr_details%NOTFOUND THEN
855    p_application_id := NULL;
856    p_attr_grp_type  := NULL;
857    p_attr_grp_name  := NULL;
858   END IF;
859   CLOSE get_attr_details;
860 EXCEPTION
861   WHEN OTHERS THEN
862     IF get_attr_details%ISOPEN THEN
863       CLOSE get_attr_details;
864     END IF;
865    p_application_id := NULL;
866    p_attr_grp_type  := NULL;
867    p_attr_grp_name  := NULL;
868    RAISE;
869 END Get_Attr_Group_Comb_PKs;
870 
871 --------------------------------------------------------------------
872 
873 PROCEDURE Delete_Attribute_Internal (
874         p_application_id                IN   NUMBER
875        ,p_attr_group_type               IN   VARCHAR2
876        ,p_attr_group_name               IN   VARCHAR2
877        ,p_attr_name                     IN   VARCHAR2
878        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
879        ,x_return_status                 OUT NOCOPY VARCHAR2
880        ,x_errorcode                     OUT NOCOPY NUMBER
881        ,x_msg_count                     OUT NOCOPY NUMBER
882        ,x_msg_data                      OUT NOCOPY VARCHAR2
883 ) IS
884 
885     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Attribute_Internal';
886     l_app_col_name           VARCHAR2(30);
887 
888   BEGIN
889 
893     END IF;
890     -- Standard start of API savepoint
891     IF FND_API.TO_BOOLEAN(p_commit) THEN
892       SAVEPOINT Delete_Attribute_PRV;
894 
895     SELECT APPLICATION_COLUMN_NAME
896       INTO l_app_col_name
897       FROM FND_DESCR_FLEX_COLUMN_USAGES
898      WHERE APPLICATION_ID = p_application_id
899        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
900        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
901        AND END_USER_COLUMN_NAME = p_attr_name;
902 
903     DELETE FROM FND_DESCR_FLEX_COLUMN_USAGES
904      WHERE APPLICATION_ID = p_application_id
905        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
906        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
907        AND END_USER_COLUMN_NAME = p_attr_name;
908 
909     DELETE FROM FND_DESCR_FLEX_COL_USAGE_TL
910      WHERE APPLICATION_ID = p_application_id
911        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
912        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
913        AND APPLICATION_COLUMN_NAME = l_app_col_name;
914 
915     DELETE FROM EGO_FND_DF_COL_USGS_EXT
916      WHERE APPLICATION_ID = p_application_id
917        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
918        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
919        AND APPLICATION_COLUMN_NAME = l_app_col_name;
920 
921     -- Standard check of p_commit
922     IF FND_API.To_Boolean(p_commit) THEN
923       COMMIT WORK;
924     END IF;
925 
926     x_return_status := FND_API.G_RET_STS_SUCCESS;
927 
928   EXCEPTION
929     WHEN OTHERS THEN
930       IF FND_API.TO_BOOLEAN(p_commit) THEN
931         ROLLBACK TO Delete_Attribute_PRV;
932       END IF;
933       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
934 
935       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
936       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
937       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
938       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
939       FND_MSG_PUB.Add;
940       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
941                                ,p_count   => x_msg_count
942                                ,p_data    => x_msg_data);
943 
944 END Delete_Attribute_Internal;
945 
946 ----------------------------------------------------------------------
947 
948 PROCEDURE Delete_Attr_Group_Internal (
949         p_application_id                IN   NUMBER
950        ,p_attr_group_type               IN   VARCHAR2
951        ,p_attr_group_name               IN   VARCHAR2
952        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
953        ,x_return_status                 OUT NOCOPY VARCHAR2
954        ,x_errorcode                     OUT NOCOPY NUMBER
955        ,x_msg_count                     OUT NOCOPY NUMBER
956        ,x_msg_data                      OUT NOCOPY VARCHAR2
957 ) IS
958 
959     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Attr_Group_Internal';
960 
961     CURSOR attrs IS
962     SELECT END_USER_COLUMN_NAME
963       FROM FND_DESCR_FLEX_COLUMN_USAGES
964      WHERE APPLICATION_ID = p_application_id
965        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
966        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
967 
968   BEGIN
969 
970     -- Standard start of API savepoint
971     IF FND_API.TO_BOOLEAN(p_commit) THEN
972       SAVEPOINT Delete_Attribute_Group_PVT;
973     END IF;
974 
975     FOR attrs_rec IN attrs LOOP
976 
977       Delete_Attribute_Internal(p_application_id, p_attr_group_type, p_attr_group_name,
978                                 attrs_rec.end_user_column_name, p_commit,
979                                 x_return_status, x_errorcode, x_msg_count, x_msg_data);
980 
981     END LOOP;
982 
983     DELETE FROM FND_DESCR_FLEX_CONTEXTS
984      WHERE APPLICATION_ID = p_application_id
985        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
986        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
987 
988     DELETE FROM FND_DESCR_FLEX_CONTEXTS_TL
989      WHERE APPLICATION_ID = p_application_id
990        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
991        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
992 
993     DELETE FROM EGO_FND_DSC_FLX_CTX_EXT
994      WHERE APPLICATION_ID = p_application_id
995        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
996        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
997 
998     DELETE FROM EGO_ATTR_GROUP_DL
999      WHERE ATTR_GROUP_ID = (SELECT ATTR_GROUP_ID
1000                               FROM EGO_ATTR_GROUPS_V
1001                              WHERE APPLICATION_ID = p_application_id
1002                                AND ATTR_GROUP_TYPE = p_attr_group_type
1003                                AND ATTR_GROUP_NAME = p_attr_group_name);
1004 
1005     -- Standard check of p_commit
1006     IF FND_API.To_Boolean(p_commit) THEN
1007       COMMIT WORK;
1008     END IF;
1009 
1010     x_return_status := FND_API.G_RET_STS_SUCCESS;
1011 
1012   EXCEPTION
1013     WHEN OTHERS THEN
1014       IF FND_API.TO_BOOLEAN(p_commit) THEN
1015         ROLLBACK TO Delete_Attribute_Group_PVT;
1016       END IF;
1017       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1021       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
1018       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
1019       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
1020       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
1022       FND_MSG_PUB.Add;
1023       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
1024                                ,p_count   => x_msg_count
1025                                ,p_data    => x_msg_data);
1026 
1027 END Delete_Attr_Group_Internal;
1028 
1029 ----------------------------------------------------------------------
1030 
1031 FUNCTION Get_Association_Id_From_PKs (
1032         p_object_id                     IN   NUMBER
1033        ,p_classification_code           IN   VARCHAR2
1034        ,p_attr_group_id                 IN   NUMBER
1035 ) RETURN NUMBER
1036   IS
1037 
1038     l_association_id              NUMBER;
1039 
1040   BEGIN
1041 
1042     IF p_object_id IS NOT NULL THEN
1043       SELECT ASSOCIATION_ID
1044         INTO l_association_id
1045         FROM EGO_OBJ_AG_ASSOCS_B
1046        WHERE OBJECT_ID = p_object_id
1047          AND CLASSIFICATION_CODE = p_classification_code
1048          AND ATTR_GROUP_ID = p_attr_group_id;
1049     END IF;
1050 
1051     RETURN l_association_id;
1052 
1053   EXCEPTION
1054     WHEN NO_DATA_FOUND THEN
1055       RETURN NULL;
1056 
1057 END Get_Association_Id_From_PKs;
1058 
1059 ----------------------------------------------------------------------
1060 
1061 FUNCTION Get_Page_Id_From_PKs (
1062         p_object_id                     IN   NUMBER
1063        ,p_classification_code           IN   VARCHAR2
1064        ,p_page_internal_name            IN   VARCHAR2
1065 ) RETURN NUMBER
1066   IS
1067 
1068     l_page_id                     NUMBER;
1069 
1070   BEGIN
1071 
1072     IF p_object_id IS NOT NULL THEN
1073       SELECT PAGE_ID
1074         INTO l_page_id
1075         FROM EGO_PAGES_B
1076        WHERE OBJECT_ID = p_object_id
1077          AND CLASSIFICATION_CODE = p_classification_code
1078          AND INTERNAL_NAME = p_page_internal_name;
1079     END IF;
1080 
1081     RETURN l_page_id;
1082 
1083   EXCEPTION
1084     WHEN NO_DATA_FOUND THEN
1085       RETURN NULL;
1086 
1087 END Get_Page_Id_From_PKs;
1088 
1089 ----------------------------------------------------------------------
1090 
1091 FUNCTION Get_PKs_From_Attr_Group_Id (
1092         p_attr_group_id                 IN   NUMBER
1093 )
1094 RETURN EGO_VARCHAR_TBL_TYPE
1095 IS
1096 
1097     l_application_id         NUMBER;
1098     l_attr_group_type        VARCHAR2(40);
1099     l_attr_group_name        VARCHAR2(30);
1100 
1101   BEGIN
1102 
1103     SELECT APPLICATION_ID, DESCRIPTIVE_FLEXFIELD_NAME, DESCRIPTIVE_FLEX_CONTEXT_CODE
1104       INTO l_application_id, l_attr_group_type, l_attr_group_name
1105       FROM EGO_FND_DSC_FLX_CTX_EXT
1106      WHERE ATTR_GROUP_ID = p_attr_group_id;
1107 
1108     RETURN EGO_VARCHAR_TBL_TYPE(TO_CHAR(l_application_id), l_attr_group_type, l_attr_group_name);
1109 
1110   EXCEPTION
1111     WHEN NO_DATA_FOUND THEN
1112       RETURN NULL;
1113 
1114 END Get_PKs_From_Attr_Group_Id;
1115 
1116 ----------------------------------------------------------------------
1117 
1118 FUNCTION Check_Associations_Exist (
1119         p_application_id                IN   NUMBER
1120        ,p_attr_group_type               IN   VARCHAR2
1121        ,p_attr_group_name               IN   VARCHAR2
1122 )
1123 RETURN BOOLEAN
1124   IS
1125 
1126     l_attr_group_id          NUMBER;
1127     l_change_assocs_exist    BOOLEAN := FALSE;
1128     l_assocs_num             NUMBER := 0;
1129 
1130   BEGIN
1131 
1132     l_attr_group_id := Get_Attr_Group_Id_From_PKs(p_application_id
1133                                                  ,p_attr_group_type
1134                                                  ,p_attr_group_name);
1135 
1136     SELECT COUNT(*)
1137       INTO l_assocs_num
1138       FROM EGO_OBJ_AG_ASSOCS_B
1139      WHERE ATTR_GROUP_ID = l_attr_group_id
1140        AND ENABLED_FLAG = 'Y';
1141 
1142     IF (l_assocs_num > 0) OR (l_change_assocs_exist = TRUE) THEN
1143       RETURN TRUE;
1144     END IF;
1145 
1146     RETURN FALSE;
1147 
1148 END Check_Associations_Exist;
1149 
1150 ---------------------------------------------------------------------
1151 -- Checks if the UOM column exists in the p_table_name            --
1152 -- for Attribute value column p_column                            --
1153 -- bug 3875730                                                     --
1154 ---------------------------------------------------------------------
1155 
1156   FUNCTION check_Uom_Column_Exists (
1157       p_column                  IN     VARCHAR2
1158      ,p_table_name              IN     VARCHAR2
1159     )
1160     RETURN VARCHAR2
1161   IS
1162     l_uom_column_name        VARCHAR2(30);
1163   BEGIN
1164 
1165     IF  ( INSTR (p_column, 'N_EXT_ATTR' ) = 0) THEN
1166 
1167       SELECT COLUMN_NAME
1168         INTO l_uom_column_name
1169         FROM FND_COLUMNS
1170           WHERE TABLE_ID  =
1171            (SELECT TABLE_ID  FROM FND_TABLES
1175       RETURN l_uom_column_name;
1172                WHERE TABLE_NAME = p_table_name)
1173           AND COLUMN_NAME  = 'UOM_'||p_column ;
1174 
1176 
1177     END IF;
1178 
1179     RETURN '1' ;
1180 
1181     EXCEPTION
1182       WHEN NO_DATA_FOUND THEN
1183         RETURN NULL ;
1184 
1185   END check_Uom_Column_Exists;
1186 
1187 ---------------------------------------------------------------------
1188 -- Checks if the UOM column is used by any other attribute of this --
1189 -- Attribute Group                                                 --
1190 -- bug 3875730                                                     --
1191 ---------------------------------------------------------------------
1192 
1193   FUNCTION check_Uom_Col_In_Use (
1194        p_application_id          IN NUMBER
1195       ,p_attr_group_type         IN VARCHAR2
1196       ,p_attr_group_name         IN VARCHAR2
1197       ,p_internal_name           IN VARCHAR2
1198       ,p_uom_column_name         IN VARCHAR2
1199   )
1200   RETURN VARCHAR2
1201   IS
1202     l_uom_column_name        VARCHAR2(300);
1203   BEGIN
1204         SELECT 1
1205           INTO l_uom_column_name
1206           FROM FND_DESCR_FLEX_COLUMN_USAGES
1207          WHERE APPLICATION_ID = p_application_id
1208            AND DESCRIPTIVE_FLEXFIELD_NAME= p_attr_group_type
1209            AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
1210            AND END_USER_COLUMN_NAME <> p_internal_name
1211            AND APPLICATION_COLUMN_NAME  = p_uom_column_name ;
1212 
1213        RETURN l_uom_column_name;
1214 
1215       EXCEPTION
1216       WHEN NO_DATA_FOUND THEN
1217         RETURN NULL ;
1218 
1219   END check_Uom_Col_In_Use;
1220 
1221 ----------------------------------------------------------------------
1222 /*
1223 
1224 FUNCTION Get_Ext_Table_Owner (
1225         p_table_name                    IN   VARCHAR2
1226 )
1227 RETURN VARCHAR2
1228 IS
1229 
1230     l_table_owner            VARCHAR2(30);
1231 
1232   BEGIN
1233 
1234     SELECT OWNER
1235       INTO l_table_owner
1236       FROM ALL_TABLES
1237      WHERE TABLE_NAME = p_table_name;
1238 
1239     RETURN l_table_owner;
1240 
1241   EXCEPTION
1242     WHEN NO_DATA_FOUND THEN
1243       RETURN NULL;
1244 
1245 END Get_Ext_Table_Owner;
1246 */
1247 
1248 ----------------------------------------------------------------------
1249 
1250 FUNCTION Get_Application_name (
1251         p_appl_id         IN   NUMBER
1252 )
1253 RETURN VARCHAR2
1254 IS
1255 
1256     l_appl_name         VARCHAR2(30);
1257 
1258   BEGIN
1259 
1260     SELECT  APPLICATION_SHORT_NAME
1261       INTO l_appl_name
1262     FROM FND_APPLICATION
1263     WHERE APPLICATION_ID  = p_appl_id;
1264 
1265     RETURN l_appl_name;
1266 
1267   EXCEPTION
1268     WHEN NO_DATA_FOUND THEN
1269       RETURN NULL;
1270 
1271 END Get_Application_name;
1272 
1273 ----------------------------------------------------------------------
1274 
1275 FUNCTION Get_Application_Owner (
1276         p_appl_id                    IN   NUMBER
1277 )
1278 RETURN VARCHAR2
1279 IS
1280 
1281    l_schema        VARCHAR2(30);
1282    l_status        VARCHAR2(1);
1283    l_industry      VARCHAR2(1);
1284 
1285   BEGIN
1286 
1287     IF NOT FND_INSTALLATION.GET_APP_INFO(Get_Application_name(p_appl_id), l_status, l_industry, l_schema)
1288     THEN
1289       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1290     END IF;
1291 
1292     IF (l_schema IS NULL)
1293     THEN
1294       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1295     END IF;
1296 
1297    RETURN l_schema;
1298 
1299    EXCEPTION
1300      WHEN NO_DATA_FOUND THEN
1301        RETURN NULL;
1302 
1303 END Get_Application_Owner;
1304 
1305 ---------------------------------------------------------------------
1306 
1307 
1308 FUNCTION Get_Oracle_UserName
1309 RETURN VARCHAR2
1310 IS
1311 
1312    l_oracleUser        VARCHAR2(30);
1313 
1314   BEGIN
1315 
1316     SELECT
1317          ORACLE_USERNAME INTO l_oracleUser
1318        FROM
1319          FND_ORACLE_USERID
1320        WHERE
1321       READ_ONLY_FLAG = 'U';
1322 
1323    RETURN l_oracleUser;
1324 
1325    EXCEPTION
1326      WHEN NO_DATA_FOUND THEN
1327        RETURN NULL;
1328 
1329 END Get_Oracle_UserName;
1330 
1331 ---------------------------------------------------------------------
1332 
1333 
1334 
1335 FUNCTION Create_Index_For_DBCol (
1336         p_application_id                IN   NUMBER
1337        ,p_attr_group_type               IN   VARCHAR2
1338        ,p_attr_group_name               IN   VARCHAR2
1339        ,p_table_name                    IN   VARCHAR2
1340        ,p_chg_table_name                IN   VARCHAR2 --R12 for pending table name.
1341        ,p_is_column_indexed             IN   VARCHAR2 --R12 flag for column of production table
1342        ,p_is_chg_column_indexed         IN   VARCHAR2 --R12 flag for column of pending table
1343        ,p_column                        IN   VARCHAR2
1347 IS
1344        ,p_is_table_translatable         IN   BOOLEAN
1345 )
1346 RETURN VARCHAR2
1348 
1349     l_table_owner            VARCHAR2(30);
1350     l_class_code_column      VARCHAR2(30);
1351     l_index_name             VARCHAR2(30);
1352     l_chg_index_name         VARCHAR2(30);
1353     l_dynamic_sql            VARCHAR2(350);
1354     l_chg_dynamic_sql        VARCHAR2(350);
1355 
1356   BEGIN
1357     -------------------------
1358     -- Get the Table owner --
1359     -------------------------
1360     l_table_owner := Get_Application_Owner(p_appl_id=>p_application_id);
1361     ---------------------------------------------
1362     -- Get the Classification Code column name --
1363     ---------------------------------------------
1364     SELECT CLASSIFICATION_COL_NAME
1365       INTO l_class_code_column
1366       FROM EGO_FND_OBJECTS_EXT
1367      WHERE OBJECT_NAME = (SELECT OBJ_NAME FROM FND_OBJECTS
1368                            WHERE OBJECT_ID = (SELECT OBJECT_ID
1369                                                 FROM EGO_OBJECT_EXT_TABLES_B
1370                                                WHERE EXT_TABLE_NAME = p_table_name));
1371 
1372     SELECT EGO_DB_COL_INDEX_S.NEXTVAL INTO l_index_name FROM DUAL;
1373     l_chg_index_name:=l_index_name; --for the index name of pending table.
1374     l_index_name := 'ag_'||p_column||'_n'||l_index_name;
1375     l_chg_index_name := 'ag_pdg_'||p_column||'_n'||l_chg_index_name;--index name for the pending table.
1376 
1377     --Creating index on the production table if the column is not already indexed.
1378     IF(p_is_column_indexed IS NULL OR p_is_column_indexed <> 'Y') THEN
1379       l_dynamic_sql := ' CREATE INDEX '||l_table_owner||'.'||l_index_name||
1380                ' ON '||l_table_owner||'.'||p_table_name||' (';
1381 
1382       IF l_class_code_column IS NOT NULL THEN
1383         l_dynamic_sql := l_dynamic_sql ||l_class_code_column||', ';
1384       END IF;
1385 
1386       IF (p_is_table_translatable) THEN
1387         l_dynamic_sql := l_dynamic_sql||'LANGUAGE , ';
1388       END IF;
1389 
1390       l_dynamic_sql := l_dynamic_sql||p_column||') LOCAL COMPUTE STATISTICS';
1391 
1392       EXECUTE IMMEDIATE l_dynamic_sql;
1393     END IF;-- IF(p_is_column_indexed IS NULL OR p_is_column_indexed <> 'Y')
1394 
1395     --Creating index on the pending table if the column is not already indexed.
1396     IF(p_is_chg_column_indexed IS NULL OR p_is_chg_column_indexed <> 'Y') THEN
1397       l_chg_dynamic_sql := ' CREATE INDEX '||l_table_owner||'.'||l_chg_index_name||
1398                ' ON '||l_table_owner||'.'||p_chg_table_name ||' (';
1399 
1400       IF l_class_code_column IS NOT NULL THEN
1401         l_chg_dynamic_sql := l_chg_dynamic_sql ||l_class_code_column||', ';
1402       END IF;
1403       IF (p_is_table_translatable) THEN
1404         l_chg_dynamic_sql := l_chg_dynamic_sql||'LANGUAGE , ';
1405       END IF;
1406 
1407       l_chg_dynamic_sql := l_chg_dynamic_sql||p_column||') LOCAL COMPUTE STATISTICS';
1408 
1409       EXECUTE IMMEDIATE l_chg_dynamic_sql;
1410     END IF;--IF(p_is_chg_column_indexed IS NULL OR  p_is_chg_column_indexed <> 'Y')
1411     RETURN 'Y';
1412 
1413   EXCEPTION
1414     WHEN OTHERS THEN
1415      RETURN 'N';
1416 END Create_Index_For_DBCol;
1417 
1418 ----------------------------------------------------------------------
1419 
1420 FUNCTION Build_Tokenized_URL_Query (
1421         p_attr_group_metadata_obj       IN   EGO_ATTR_GROUP_METADATA_OBJ
1422        ,p_attr_metadata_obj             IN   EGO_ATTR_METADATA_OBJ
1423 )
1424 RETURN VARCHAR2
1425 IS
1426 
1427     l_head_of_query          VARCHAR2(32767);
1428     l_tail_of_query          VARCHAR2(32767);
1429     l_has_tokens_left        BOOLEAN;
1430     l_token_start_index      NUMBER;
1431     l_token_end_index        NUMBER;
1432     l_token                  VARCHAR2(50);
1433     l_replacement_attr_metadata EGO_ATTR_METADATA_OBJ;
1434 
1435   BEGIN
1436 
1437     l_tail_of_query := p_attr_metadata_obj.INFO_1;
1438 
1439     ------------------------------------------
1440     -- If there aren't two different '$' in --
1441     -- the string, then there are no tokens --
1442     ------------------------------------------
1443     l_has_tokens_left := (INSTR(l_tail_of_query, '$') <> 0 AND
1444                           INSTR(l_tail_of_query, '$') <> INSTR(l_tail_of_query, '$', -1));
1445 
1446     WHILE (l_has_tokens_left)
1447     LOOP
1448 
1449       ---------------------------------------
1450       -- Parse out the token for this loop --
1451       ---------------------------------------
1452       l_token_start_index := INSTR(l_tail_of_query, '$');
1453       l_token_end_index := INSTR(l_tail_of_query, '$', l_token_start_index + 1);
1454 
1455       l_token := SUBSTR(l_tail_of_query, l_token_start_index + 1, (l_token_end_index - (l_token_start_index + 1)));
1456 
1457       ------------------------------------------------------
1458       -- Validate the token by trying to get its metadata --
1459       ------------------------------------------------------
1460       IF (l_token = p_attr_metadata_obj.ATTR_NAME) THEN
1461         l_replacement_attr_metadata := p_attr_metadata_obj;
1462       ELSE
1463         l_replacement_attr_metadata := EGO_USER_ATTRS_COMMON_PVT.Find_Metadata_For_Attr(
1464                                          p_attr_group_metadata_obj.attr_metadata_table
1468 
1465                                         ,l_token
1466                                        );
1467       END IF;
1469       IF (l_replacement_attr_metadata IS NULL) THEN
1470 
1471         --------------------------------------
1472         -- Report that the URL is not valid --
1473         --------------------------------------
1474         FND_MESSAGE.Set_Name('EGO', 'EGO_EF_DYNAMIC_URL_DATA_ERROR');
1475         FND_MESSAGE.Set_Token('ATTR_GROUP_DISP_NAME', p_attr_group_metadata_obj.ATTR_GROUP_DISP_NAME);
1476         FND_MSG_PUB.Add;
1477 
1478         RAISE FND_API.G_EXC_ERROR;
1479       END IF;
1480 
1481       -----------------------
1482       -- Replace the token --
1483       -----------------------
1484       l_head_of_query := l_head_of_query ||
1485                          SUBSTR(l_tail_of_query, 1, (l_token_start_index - 1)) ||
1486                          '''||' ||
1487                          EGO_USER_ATTRS_COMMON_PVT.Create_DB_Col_Alias_If_Needed(l_replacement_attr_metadata) ||
1488                          '||''';
1489 
1490       l_tail_of_query := SUBSTR(l_tail_of_query, l_token_end_index + 1);
1491 
1492       --------------------------------------
1493       -- Reset variable for the next loop --
1494       --------------------------------------
1495       l_has_tokens_left := (INSTR(l_tail_of_query, '$') <> 0 AND
1496                             INSTR(l_tail_of_query, '$') <> INSTR(l_tail_of_query, '$', -1));
1497 
1498     END LOOP;
1499 
1500     l_head_of_query := l_head_of_query || l_tail_of_query;
1501 
1502     RETURN '''' || l_head_of_query || '''';
1503 
1504 END Build_Tokenized_URL_Query;
1505 
1506 ----------------------------------------------------------------------
1507 
1508                      ------------------------
1509                      -- Miscellaneous APIs --
1510                      ------------------------
1511 
1512 ----------------------------------------------------------------------
1513 -- signature to use if caller has ATTR_GROUP_ID
1514 FUNCTION Get_Privilege_For_Attr_Group (
1515         p_attr_group_id                 IN   NUMBER
1516        ,p_which_priv_to_return          IN   VARCHAR2
1517 )
1518 RETURN VARCHAR2
1519 IS
1520 
1521     l_privilege_name         FND_FORM_FUNCTIONS.FUNCTION_NAME%TYPE; --4105308
1522 
1523   BEGIN
1524 
1525     IF (UPPER(p_which_priv_to_return) = 'VIEW') THEN
1526 
1527       SELECT F.FUNCTION_NAME
1528         INTO l_privilege_name
1529         FROM FND_FORM_FUNCTIONS      F
1530             ,EGO_FND_DSC_FLX_CTX_EXT E
1531        WHERE E.ATTR_GROUP_ID = p_attr_group_id
1532          AND E.VIEW_PRIVILEGE_ID = F.FUNCTION_ID;
1533 
1534     ELSIF (UPPER(p_which_priv_to_return) = 'EDIT') THEN
1535 
1536       SELECT F.FUNCTION_NAME
1537         INTO l_privilege_name
1538         FROM FND_FORM_FUNCTIONS      F
1539             ,EGO_FND_DSC_FLX_CTX_EXT E
1540        WHERE E.ATTR_GROUP_ID = p_attr_group_id
1541          AND E.EDIT_PRIVILEGE_ID = F.FUNCTION_ID;
1542 
1543     END IF;
1544 
1545     RETURN l_privilege_name;
1546 
1547   EXCEPTION
1548     WHEN NO_DATA_FOUND THEN
1549       RETURN NULL;
1550 
1551 END Get_Privilege_For_Attr_Group;
1552 
1553 ----------------------------------------------------------------------
1554 
1555 FUNCTION Get_Privilege_For_Attr_Group (
1556         p_application_id                IN   NUMBER
1557        ,p_attr_group_type               IN   VARCHAR2
1558        ,p_attr_group_name               IN   VARCHAR2
1559        ,p_which_priv_to_return          IN   VARCHAR2
1560 )
1561 RETURN VARCHAR2
1562 IS
1563 
1564     l_attr_group_id          NUMBER;
1565 
1566   BEGIN
1567 
1568     l_attr_group_id := Get_Attr_Group_Id_From_PKs(p_application_id
1569                                                  ,p_attr_group_type
1570                                                  ,p_attr_group_name);
1571 
1572     IF l_attr_group_id IS NULL THEN
1573       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1574     END IF;
1575 
1576     RETURN EGO_EXT_FWK_PUB.Get_Privilege_For_Attr_Group(
1577         p_attr_group_id                 => l_attr_group_id
1578        ,p_which_priv_to_return          => p_which_priv_to_return
1579     );
1580 
1581   EXCEPTION
1582     WHEN OTHERS THEN
1583       RETURN NULL;
1584 
1585 END Get_Privilege_For_Attr_Group;
1586 
1587 ----------------------------------------------------------------------
1588 
1589 FUNCTION Is_Column_Indexed (
1590         p_column_name                   IN   VARCHAR2
1591        ,p_table_name                    IN   VARCHAR2
1592        ,p_application_id                IN   NUMBER     DEFAULT NULL
1593        ,p_attr_group_type               IN   VARCHAR2   DEFAULT NULL
1594 )
1595 RETURN VARCHAR2
1596 IS
1597 
1598     l_index_flag             VARCHAR2(1) := 'N';
1599     l_table_name             VARCHAR2(30);
1600     l_table_owner            VARCHAR2(30);
1601 
1602   BEGIN
1603 
1604     IF (p_table_name IS NOT NULL) THEN
1605 
1606       l_table_name := p_table_name;
1607 
1608     ELSE
1609 
1610       l_table_name := Get_Table_Name(p_application_id
1611                                     ,p_attr_group_type);
1612 
1613     END IF;
1614 
1618     l_table_owner := Get_Application_Owner(p_application_id);
1615     ----------------------------------------------------
1616     -- We assume that the table is an Extension Table --
1617     ----------------------------------------------------
1619 
1620     SELECT 'Y'
1621       INTO l_index_flag
1622       FROM ALL_IND_COLUMNS
1623      WHERE TABLE_OWNER = l_table_owner
1624        AND TABLE_NAME = l_table_name
1625        AND COLUMN_NAME = p_column_name
1626        AND ROWNUM < 2;
1627 
1628     RETURN l_index_flag;
1629 
1630   EXCEPTION
1631     WHEN NO_DATA_FOUND THEN
1632       RETURN 'N';
1633 
1634 END Is_Column_Indexed;
1635 
1636 ----------------------------------------------------------------------
1637 
1638 FUNCTION Get_Attr_Group_Id_From_PKs (
1639         p_application_id                IN   NUMBER
1640        ,p_attr_group_type               IN   VARCHAR2
1641        ,p_attr_group_name               IN   VARCHAR2
1642 )
1643 RETURN NUMBER
1644 IS
1645 
1646     l_attr_group_id          NUMBER;
1647 
1648   BEGIN
1649 
1650     SELECT ATTR_GROUP_ID INTO l_attr_group_id
1651       FROM EGO_FND_DSC_FLX_CTX_EXT
1652      WHERE APPLICATION_ID = p_application_id
1653        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
1654        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
1655 
1656     RETURN l_attr_group_id;
1657 
1658   EXCEPTION
1659     WHEN NO_DATA_FOUND THEN
1660       RETURN NULL;
1661 
1662 END Get_Attr_Group_Id_From_PKs;
1663 
1664 ----------------------------------------------------------------------
1665 
1666 FUNCTION Get_Attr_Group_DispName (
1667         p_attr_group_id                 IN   NUMBER
1668 )
1669 RETURN VARCHAR2
1670 IS
1671 
1672     l_attr_group_name          VARCHAR2(80);
1673 
1674   BEGIN
1675 
1676     SELECT FL_CTX_TL.DESCRIPTIVE_FLEX_CONTEXT_NAME INTO l_attr_group_name
1677       FROM FND_DESCR_FLEX_CONTEXTS_TL  FL_CTX_TL,
1678            EGO_FND_DSC_FLX_CTX_EXT     FL_CTX_EXT
1679      WHERE
1680           FL_CTX_EXT.APPLICATION_ID = FL_CTX_TL.APPLICATION_ID
1681             AND FL_CTX_EXT.DESCRIPTIVE_FLEXFIELD_NAME = FL_CTX_TL.DESCRIPTIVE_FLEXFIELD_NAME
1682       AND FL_CTX_EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = FL_CTX_TL.DESCRIPTIVE_FLEX_CONTEXT_CODE
1683       AND FL_CTX_EXT.ATTR_GROUP_ID = p_attr_group_id
1684       AND FL_CTX_TL.LANGUAGE = userenv('LANG');
1685 
1686     RETURN l_attr_group_name;
1687 
1688   EXCEPTION
1689     WHEN NO_DATA_FOUND THEN
1690       RETURN NULL;
1691 
1692 END Get_Attr_Group_DispName;
1693 
1694 ----------------------------------------------------------------------
1695 
1696 
1697 FUNCTION Get_Data_Level_DispName (
1698         p_data_level                 IN   VARCHAR2
1699 )
1700 RETURN VARCHAR2
1701 IS
1702 
1703     l_p_data_level_disp_name          VARCHAR2(80);
1704 
1705   BEGIN
1706 
1707    SELECT meaning  into l_p_data_level_disp_name
1708    FROM fnd_lookup_values
1709      WHERE lookup_type = 'EGO_EF_DATA_LEVEL'
1710       AND language = userenv('LANG')
1711       AND lookup_code = p_data_level;
1712 
1713     RETURN l_p_data_level_disp_name;
1714 
1715   EXCEPTION
1716     WHEN NO_DATA_FOUND THEN
1717       RETURN NULL;
1718 
1719 END Get_Data_Level_DispName;
1720 
1721 ----------------------------------------------------------------------
1722 
1723 FUNCTION Get_Associated_Datalevel (
1724         p_object_id                     IN   NUMBER
1725       , p_attr_group_id                 IN   NUMBER
1726 
1727 )
1728 RETURN VARCHAR2
1729 IS
1730    l_data_level  VARCHAR2(30);
1731 
1732   BEGIN
1733 
1734     SELECT DISTINCT DATA_LEVEL
1735       INTO l_data_level
1736       FROM EGO_OBJ_AG_ASSOCS_B
1737      WHERE ATTR_GROUP_ID = p_attr_group_id
1738        AND OBJECT_ID = p_object_id
1739        AND ROWNUM < 2;
1740 
1741     RETURN l_data_level;
1742 
1743   EXCEPTION
1744     WHEN NO_DATA_FOUND THEN
1745       RETURN NULL;
1746 
1747 END Get_Associated_Datalevel;
1748 
1749 ----------------------------------------------------------------------
1750 /*
1751 NOTE: WE DON'T USE THESE ANYMORE, BUT WE'LL KEEP THEM JUST IN CASE
1752 
1753 PROCEDURE Get_Available_AttrDBCol (
1754         p_api_version                   IN   NUMBER
1755        ,p_attr_group_id                 IN   NUMBER
1756        ,p_data_type                     IN   VARCHAR2
1757        ,x_database_column               OUT NOCOPY VARCHAR2
1758 ) IS
1759 
1760   l_database_columns         EGO_VARCHAR_TBL_TYPE;
1761 
1762   BEGIN
1763 
1764     EGO_EXT_FWK_PUB.Get_Available_AttrDBCols (
1765         p_api_version                   => p_api_version
1766        ,p_attr_group_id                 => p_attr_group_id
1767        ,p_data_type                     => p_data_type
1768        ,x_database_columns              => l_database_columns
1769     );
1770 
1771     -- for this method, we just return the first in the list of available columns
1772 
1773     x_database_column := l_database_columns(l_database_columns.FIRST);
1774 
1775 END Get_Available_AttrDBCol;
1776 
1777 ----------------------------------------------------------------------
1778 
1779 PROCEDURE Get_Available_AttrDBCol (
1783        ,p_attr_group_name               IN   VARCHAR2
1780         p_api_version                   IN   NUMBER
1781        ,p_application_id                IN   NUMBER
1782        ,p_attr_group_type               IN   VARCHAR2
1784        ,p_data_type                     IN   VARCHAR2
1785        ,x_database_column               OUT NOCOPY VARCHAR2
1786 ) IS
1787 
1788   l_database_columns         EGO_VARCHAR_TBL_TYPE;
1789 
1790   BEGIN
1791 
1792     EGO_EXT_FWK_PUB.Get_Available_AttrDBCols (
1793         p_api_version                   => p_api_version
1794        ,p_application_id                => p_application_id
1795        ,p_attr_group_type               => p_attr_group_type
1796        ,p_attr_group_name               => p_attr_group_name
1797        ,p_data_type                     => p_data_type
1798        ,x_database_columns              => l_database_columns
1799     );
1800 
1801     -- for this method, we just return the first in the list of available columns
1802 
1803     x_database_column := l_database_columns(l_database_columns.FIRST);
1804 
1805 END Get_Available_AttrDBCol;
1806 
1807 ----------------------------------------------------------------------
1808 
1809 PROCEDURE Get_Available_AttrDBCols (
1810         p_api_version                   IN   NUMBER
1811        ,p_application_id                IN   NUMBER
1812        ,p_attr_group_type               IN   VARCHAR2
1813        ,p_attr_group_name               IN   VARCHAR2
1814        ,p_data_type                     IN   VARCHAR2
1815        ,x_database_columns              OUT NOCOPY EGO_VARCHAR_TBL_TYPE
1816 ) IS
1817 
1818     l_ext_table_name         VARCHAR2(30);
1819     l_ext_table_id           NUMBER;
1820     l_column_type            VARCHAR2(1);
1821     l_column_prefix          VARCHAR2(15);
1822     l_db_cols_table_index    NUMBER;
1823     l_column_deleted         BOOLEAN;
1824 
1825     CURSOR allDBColNames_c (
1826         cp_application_id               IN   NUMBER
1827        ,cp_table_id                     IN   NUMBER
1828        ,cp_column_type                  IN   VARCHAR2
1829        ,cp_column_prefix                IN   VARCHAR2
1830     ) IS
1831       SELECT COLUMN_NAME
1832         FROM FND_COLUMNS
1833        WHERE APPLICATION_ID = cp_application_id
1834          AND TABLE_ID = cp_table_id
1835          AND COLUMN_TYPE = cp_column_type
1836          AND COLUMN_NAME LIKE cp_column_prefix
1837        ORDER BY COLUMN_SEQUENCE;
1838 
1839 TO DO: we must replace this column name check with FLEXFIELD_USAGE_CODE = 'D',
1840        as soon as Kirill tells us how to seed that in CASE
1841 
1842 
1843     CURSOR usedDBCol_c (
1844         cp_application_id               IN   NUMBER
1845        ,cp_attr_group_type              IN   VARCHAR2
1846        ,cp_attr_group_name              IN   VARCHAR2
1847        ,cp_data_type                    IN   VARCHAR2
1848        ,cp_table_id                     IN   NUMBER
1849        ,cp_column_type                  IN   VARCHAR2
1850     ) IS
1851       SELECT FC.COLUMN_NAME
1852         FROM FND_COLUMNS              FC
1853             ,EGO_FND_DF_COL_USGS_EXT  EXT
1854        WHERE EXT.APPLICATION_ID = cp_application_id
1855          AND EXT.DESCRIPTIVE_FLEXFIELD_NAME = cp_attr_group_type
1856          AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = cp_attr_group_name
1857          AND EXT.DATA_TYPE = cp_data_type
1858          AND FC.APPLICATION_ID = cp_application_id
1859          AND FC.TABLE_ID = cp_table_id
1860          AND FC.COLUMN_TYPE = cp_column_type
1861          AND EXT.APPLICATION_COLUMN_NAME = FC.COLUMN_NAME
1862        ORDER BY FC.COLUMN_SEQUENCE;
1863 
1864   BEGIN
1865 
1866     SELECT FT.TABLE_ID
1867       INTO l_ext_table_id
1868       FROM FND_TABLES              FT
1869           ,EGO_ATTR_GROUP_TYPES_V  EAGTV
1870      WHERE FT.TABLE_NAME = EAGTV.EXT_TABLE_NAME
1871        AND EAGTV.APPLICATION_ID = p_application_id
1872        AND EAGTV.ATTR_GROUP_TYPE = p_attr_group_type;
1873 
1874     IF (p_data_type = G_NUMBER_DATA_TYPE) THEN
1875       l_column_type := 'N';
1876       l_column_prefix := 'N_EXT_ATTR%';
1877     ELSIF (p_data_type = G_DATE_DATA_TYPE OR
1878            p_data_type = G_DATE_TIME_DATA_TYPE) THEN
1879       l_column_type := 'D';
1880       l_column_prefix := 'D_EXT_ATTR%';
1881     ELSE
1882       l_column_type := 'V';
1883       l_column_prefix := 'C_EXT_ATTR%';
1884     END IF;
1885 
1886     OPEN allDBColNames_c(p_application_id, l_ext_table_id, l_column_type, l_column_prefix);
1887     FETCH allDBColNames_c BULK COLLECT INTO x_database_columns;
1888     CLOSE allDBColNames_c;
1889 
1890     IF (x_database_columns.COUNT > 0) THEN
1891 
1892       ---------------------------------------------------------------
1893       -- Delete from our table all columns that are already in use --
1894       ---------------------------------------------------------------
1895       FOR colNumRec IN usedDBCol_c (p_application_id
1896                                    ,p_attr_group_type
1897                                    ,p_attr_group_name
1898                                    ,p_data_type
1899                                    ,l_ext_table_id
1900                                    ,l_column_type)
1901       LOOP
1902 
1903         ----------------------------------------------------------------
1904         -- Find and delete this particular used column from our table --
1908         WHILE (l_db_cols_table_index <= x_database_columns.LAST)
1905         ----------------------------------------------------------------
1906         l_column_deleted := FALSE;
1907         l_db_cols_table_index := x_database_columns.FIRST;
1909         LOOP
1910           EXIT WHEN (l_column_deleted);
1911 
1912           IF (x_database_columns(l_db_cols_table_index) = colNumRec.COLUMN_NAME) THEN
1913 
1914             x_database_columns.DELETE(l_db_cols_table_index);
1915             l_column_deleted := TRUE;
1916 
1917           END IF;
1918 
1919           l_db_cols_table_index := x_database_columns.NEXT(l_db_cols_table_index);
1920         END LOOP;
1921       END LOOP;
1922     END IF;
1923 
1924 END Get_Available_AttrDBCols;
1925 
1926 ----------------------------------------------------------------------
1927 
1928 PROCEDURE Get_Available_AttrDBCols (
1929         p_api_version                   IN   NUMBER
1930        ,p_attr_group_id                 IN   NUMBER
1931        ,p_data_type                     IN   VARCHAR2
1932        ,x_database_columns              OUT NOCOPY EGO_VARCHAR_TBL_TYPE
1933 ) IS
1934 
1935     l_attr_group_pks         EGO_VARCHAR_TBL_TYPE;
1936 
1937   BEGIN
1938 
1939     l_attr_group_pks := Get_PKs_From_Attr_Group_Id(p_attr_group_id);
1940 
1941     EGO_EXT_FWK_PUB.Get_Available_AttrDBCols (
1942         p_api_version                   => p_api_version
1943        ,p_application_id                => l_attr_group_pks(1)
1944        ,p_attr_group_type               => l_attr_group_pks(2)
1945        ,p_attr_group_name               => l_attr_group_pks(3)
1946        ,p_data_type                     => p_data_type
1947        ,x_database_columns              => x_database_columns
1948     );
1949 
1950 END Get_Available_AttrDBCols;
1951 */
1952 
1953 ----------------------------------------------------------------------
1954 
1955 FUNCTION Get_Table_Name (
1956         p_application_id                IN   NUMBER
1957        ,p_attr_group_type               IN   VARCHAR2
1958 )
1959 RETURN VARCHAR2
1960 IS
1961 
1962     l_table_name             VARCHAR2(30);
1963 
1964   BEGIN
1965     SELECT APPLICATION_TABLE_NAME
1966       INTO l_table_name
1967       FROM FND_DESCRIPTIVE_FLEXS
1968      WHERE APPLICATION_ID = p_application_id
1969        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type;
1970 
1971     RETURN l_table_name;
1972 
1973   EXCEPTION
1974     WHEN NO_DATA_FOUND THEN
1975       RETURN NULL;
1976 
1977 END Get_Table_Name;
1978 
1979 ----------------------------------------------------------------------
1980 
1981 FUNCTION Get_TL_Table_Name (
1982         p_application_id                IN   NUMBER
1983        ,p_attr_group_type               IN   VARCHAR2
1984 )
1985 RETURN VARCHAR2
1986 IS
1987     l_table_name             VARCHAR2(30);
1988 
1989   BEGIN
1990     SELECT EXT_TL_TABLE_NAME
1991       INTO l_table_name
1992       FROM EGO_ATTR_GROUP_TYPES_V
1993      WHERE APPLICATION_ID = p_application_id
1994        AND ATTR_GROUP_TYPE = p_attr_group_type;
1995 
1996     RETURN l_table_name;
1997 
1998   EXCEPTION
1999     WHEN NO_DATA_FOUND THEN
2000       RETURN NULL;
2001 
2002 END Get_TL_Table_Name;
2003 
2004 ----------------------------------------------------------------------
2005 
2006 FUNCTION Get_Object_Id_From_Name (p_object_name IN VARCHAR2) RETURN NUMBER
2007 IS
2008 
2009     l_object_id              NUMBER;
2010 
2011   BEGIN
2012 
2013     SELECT OBJECT_ID INTO l_object_id
2014       FROM FND_OBJECTS
2015      WHERE OBJ_NAME = p_object_name;
2016 
2017     RETURN l_object_id;
2018 
2019   EXCEPTION
2020     WHEN NO_DATA_FOUND THEN
2021       RETURN NULL;
2022 
2023 END Get_Object_Id_From_Name;
2024 
2025 ----------------------------------------------------------------------
2026 
2027 FUNCTION Get_Object_Id_For_AG_Type (
2028         p_application_id                IN   NUMBER
2029        ,p_attr_group_type               IN   VARCHAR2
2030 ) RETURN NUMBER
2031   IS
2032 
2033     l_object_id              NUMBER;
2034 
2035   BEGIN
2036 
2037     SELECT OBJ.OBJECT_ID
2038       INTO l_object_id
2039       FROM EGO_OBJECT_EXT_TABLES_B    OBJ
2040           ,FND_DESCRIPTIVE_FLEXS      FLX
2041      WHERE OBJ.EXT_TABLE_NAME = FLX.APPLICATION_TABLE_NAME
2042        AND OBJ.APPLICATION_ID = FLX.APPLICATION_ID
2043        AND FLX.APPLICATION_ID = p_application_id
2044        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type;
2045 
2046     RETURN l_object_id;
2047 
2048   EXCEPTION
2049     WHEN NO_DATA_FOUND THEN
2050       RETURN NULL;
2051 
2052 END Get_Object_Id_For_AG_Type;
2053 
2054 ----------------------------------------------------------------------
2055 
2056 FUNCTION Get_Class_Meaning (
2057         p_object_name                   IN   VARCHAR2
2058        ,p_class_code                    IN   VARCHAR2
2059 )
2060 RETURN VARCHAR2
2061 IS
2062 
2063     l_ocv_name               VARCHAR2(30);
2064     l_dynamic_sql            VARCHAR2(300);
2065     l_class_meaning          VARCHAR2(1000);
2066 
2067   BEGIN
2068 
2072 
2069     SELECT EXT_ATTR_OCV_NAME INTO l_ocv_name
2070       FROM EGO_FND_OBJECTS_EXT
2071      WHERE OBJECT_NAME = p_object_name;
2073     IF (l_ocv_name IS NULL) THEN
2074       l_class_meaning := p_class_code;
2075     ELSE
2076       l_dynamic_sql := 'SELECT MEANING FROM ' || l_ocv_name ||
2077                        ' WHERE CODE = :1 AND LANGUAGE = USERENV(''LANG'') ' ||
2078                        ' AND ROWNUM = 1 ';
2079 
2080       EXECUTE IMMEDIATE l_dynamic_sql INTO l_class_meaning USING p_class_code;
2081     END IF;
2082 
2083     RETURN l_class_meaning;
2084 
2085   EXCEPTION
2086     WHEN NO_DATA_FOUND THEN
2087       RETURN p_class_code;
2088 
2089 END Get_Class_Meaning;
2090 
2091 ----------------------------------------------------------------------
2092 
2093 FUNCTION Get_Class_Meaning (
2094         p_object_id                     IN   NUMBER
2095        ,p_class_code                    IN   VARCHAR2
2096 )
2097 RETURN VARCHAR2
2098 IS
2099 
2100     l_object_name          FND_OBJECTS.OBJ_NAME%TYPE; --4105308
2101 
2102   BEGIN
2103 
2104     SELECT OBJ_NAME INTO l_object_name
2105       FROM FND_OBJECTS
2106      WHERE OBJECT_ID = p_object_id;
2107 
2108     RETURN Get_Class_Meaning(l_object_name, p_class_code);
2109 
2110   EXCEPTION
2111     WHEN OTHERS THEN
2112       RETURN p_class_code;
2113 
2114 END Get_Class_Meaning;
2115 
2116 ----------------------------------------------------------------------
2117 
2118 PROCEDURE Get_Pk_Columns (
2119         p_api_version                   IN   NUMBER
2120        ,p_obj_name                      IN   VARCHAR2
2121        ,x_pkcolumn1_name                OUT NOCOPY VARCHAR2
2122        ,x_pkcolumn1_type                OUT NOCOPY VARCHAR2
2123        ,x_pkcolumn2_name                OUT NOCOPY VARCHAR2
2124        ,x_pkcolumn2_type                OUT NOCOPY VARCHAR2
2125        ,x_pkcolumn3_name                OUT NOCOPY VARCHAR2
2126        ,x_pkcolumn3_type                OUT NOCOPY VARCHAR2
2127        ,x_pkcolumn4_name                OUT NOCOPY VARCHAR2
2128        ,x_pkcolumn4_type                OUT NOCOPY VARCHAR2
2129        ,x_pkcolumn5_name                OUT NOCOPY VARCHAR2
2130        ,x_pkcolumn5_type                OUT NOCOPY VARCHAR2
2131 ) IS
2132 
2133     CURSOR pk_columns_c (cp_obj_name VARCHAR2)
2134     IS
2135     SELECT PK1_COLUMN_NAME, PK1_COLUMN_TYPE,
2136            PK2_COLUMN_NAME, PK2_COLUMN_TYPE,
2137            PK3_COLUMN_NAME, PK3_COLUMN_TYPE,
2138            PK4_COLUMN_NAME, PK4_COLUMN_TYPE,
2139            PK5_COLUMN_NAME, PK5_COLUMN_TYPE
2140       FROM FND_OBJECTS
2141      WHERE OBJ_NAME = cp_obj_name;
2142 
2143     l_pk_columns_rec pk_columns_c%ROWTYPE;
2144 
2145   BEGIN
2146     OPEN pk_columns_c(cp_obj_name => p_obj_name);
2147     FETCH pk_columns_c INTO l_pk_columns_rec;
2148     x_pkcolumn1_name := l_pk_columns_rec.PK1_COLUMN_NAME;
2149     x_pkcolumn1_type := l_pk_columns_rec.PK1_COLUMN_TYPE;
2150     x_pkcolumn2_name := l_pk_columns_rec.PK2_COLUMN_NAME;
2151     x_pkcolumn2_type := l_pk_columns_rec.PK2_COLUMN_TYPE;
2152     x_pkcolumn3_name := l_pk_columns_rec.PK3_COLUMN_NAME;
2153     x_pkcolumn3_type := l_pk_columns_rec.PK3_COLUMN_TYPE;
2154     x_pkcolumn4_name := l_pk_columns_rec.PK4_COLUMN_NAME;
2155     x_pkcolumn4_type := l_pk_columns_rec.PK4_COLUMN_TYPE;
2156     x_pkcolumn5_name := l_pk_columns_rec.PK5_COLUMN_NAME;
2157     x_pkcolumn5_type := l_pk_columns_rec.PK5_COLUMN_TYPE;
2158 
2159     CLOSE pk_columns_c;
2160 
2161 END Get_Pk_Columns;
2162 
2163 ----------------------------------------------------------------------
2164 
2165                     --------------------------
2166                     -- Attribute Group APIs --
2167                     --------------------------
2168 
2169 ----------------------------------------------------------------------
2170 
2171 PROCEDURE Create_Attribute_Group (
2172         p_api_version                   IN   NUMBER
2173        ,p_application_id                IN   NUMBER
2174        ,p_attr_group_type               IN   VARCHAR2
2175        ,p_internal_name                 IN   VARCHAR2
2176        ,p_display_name                  IN   VARCHAR2
2177        ,p_attr_group_desc               IN   VARCHAR2
2178        ,p_security_type                 IN   VARCHAR2
2179        ,p_multi_row_attrib_group        IN   VARCHAR2
2180        ,p_variant_attrib_group          IN   VARCHAR2
2181        ,p_num_of_cols                   IN   NUMBER     DEFAULT NULL
2182        ,p_num_of_rows                   IN   NUMBER     DEFAULT NULL
2183        ,p_owning_company_id             IN   NUMBER
2184        ,p_region_code                   IN   VARCHAR2   DEFAULT NULL
2185        ,p_view_privilege_id             IN   NUMBER     DEFAULT NULL
2186        ,p_edit_privilege_id             IN   NUMBER     DEFAULT NULL
2187        ,p_business_event_flag           IN   VARCHAR2   DEFAULT NULL
2188        ,p_pre_business_event_flag       IN   VARCHAR2   DEFAULT NULL
2189        ,p_owner                         IN   NUMBER     DEFAULT NULL
2190        ,p_lud                           IN   DATE       DEFAULT SYSDATE
2191        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2192        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2193        ,x_attr_group_id                 OUT NOCOPY NUMBER
2197        ,x_msg_data                      OUT NOCOPY VARCHAR2
2194        ,x_return_status                 OUT NOCOPY VARCHAR2
2195        ,x_errorcode                     OUT NOCOPY NUMBER
2196        ,x_msg_count                     OUT NOCOPY NUMBER
2198 ) IS
2199 
2200     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Attribute_Group';
2201 
2202     --we don't use l_api_version yet, but eventually we might:
2203     --if we change required parameters, version goes from n.x to (n+1).x
2204     --if we change optional parameters, version goes from x.n to x.(n+1)
2205     l_api_version            CONSTANT NUMBER := 1.0;
2206 
2207     l_appl_short_name        FND_APPLICATION.APPLICATION_SHORT_NAME%TYPE;
2208     l_ext_table_name         VARCHAR2(30);
2209     l_table_owner            VARCHAR2(30);
2210     l_dynamic_sql            VARCHAR2(200);
2211     l_partition_count        NUMBER;
2212 
2213     l_attr_chg_b_table       VARCHAR2(30);
2214     l_attr_chg_tl_table      VARCHAR2(30);
2215 
2216     --Bug 4703510
2217       l_fnd_exists            VARCHAR2(1);
2218       l_ego_exists            VARCHAR2(1);
2219      --Bug 5443697
2220       l_start_num             VARCHAR2(1);
2221       l_start_und_sc          VARCHAR2(1);
2222       e_ag_starts_with_num    EXCEPTION;
2223       e_ag_starts_with_und_sc EXCEPTION;
2224       --Bug 6120553
2225       l_sql_errm     VARCHAR2(1000);
2226     --Bug 6048237
2227     l_num_of_cols           NUMBER := p_num_of_cols;
2228     l_num_of_rows           NUMBER := p_num_of_rows;
2229 
2230 
2231   BEGIN
2232 
2233     -- Standard start of API savepoint
2234     IF FND_API.To_Boolean(p_commit) THEN
2235       SAVEPOINT Create_Attribute_Group_PUB;
2236     END IF;
2237 
2238     -- Check for call compatibility
2239     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
2240                                         l_api_name, G_PKG_NAME)
2241     THEN
2242       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2243     END IF;
2244     -- Initialize message list even though we don't currently use it
2245     IF FND_API.To_Boolean(p_init_msg_list) THEN
2246       FND_MSG_PUB.Initialize;
2247     END IF;
2248 -----------------------------------
2249    --check if the Attribute Group name begins with a number.
2250     --Bug 5443697
2251     has_Num_Start_char (p_internal_name =>p_internal_name,
2252                         x_start_num => l_start_num);
2253     IF (l_start_num = 'Y') THEN
2254       RAISE e_ag_starts_with_num;
2255     END IF;
2256 
2257    --check if the Attribute Group name begins with an under score.
2258     --Bug 5443697
2259     has_Given_Char_As_Start_char (p_internal_name =>p_internal_name,
2260                                   p_char_set =>'_',
2261                                   x_start_und_sc => l_start_und_sc);
2262     IF (l_start_und_sc = 'Y') THEN
2263       RAISE e_ag_starts_with_und_sc;
2264     END IF;
2265 
2266     --Initialize num cols and rows.
2267     --Bug 6048237
2268     IF p_multi_row_attrib_group = 'Y' THEN
2269       IF l_num_of_cols is null THEN
2270         l_num_of_cols := 5;
2271       END IF;
2272       IF l_num_of_rows is null THEN
2273         l_num_of_rows := 5;
2274       END IF;
2275     ELSIF p_multi_row_attrib_group = 'N' THEN
2276       IF l_num_of_cols is null THEN
2277         l_num_of_cols := 2;
2278       END IF;
2279     END IF;
2280 
2281     --Bug 4703510 START
2282     Get_fnd_ego_record_exists (
2283                      p_context=>'ATTRIBUTE GROUP'
2284                     ,p_application_id => p_application_id
2285                     ,p_attr_group_type => p_attr_group_type
2286                     ,p_attr_group_name => NULL
2287                     ,p_internal_name => p_internal_name
2288                     ,x_fnd_exists => l_fnd_exists
2289                     ,x_ego_exists => l_ego_exists
2290                     );
2291   IF (l_fnd_exists = 'Y') THEN --Bug 4703510
2292     UPDATE FND_DESCR_FLEX_CONTEXTS
2293        SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
2294            LAST_UPDATE_DATE = p_lud,
2295            LAST_UPDATE_LOGIN = g_current_login_id
2296      WHERE DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
2297        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name
2298        AND APPLICATION_ID = p_application_id;
2299 
2300     UPDATE FND_DESCR_FLEX_CONTEXTS_TL
2301        SET DESCRIPTION = p_attr_group_desc,
2302            DESCRIPTIVE_FLEX_CONTEXT_NAME = p_display_name,
2303            LAST_UPDATE_DATE = p_lud,
2304            LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
2305            LAST_UPDATE_LOGIN = g_current_login_id,
2306            SOURCE_LANG = USERENV('LANG')
2307      WHERE APPLICATION_ID = p_application_id
2308        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
2309        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name
2310        AND USERENV('LANG') in (LANGUAGE , SOURCE_LANG);
2311   ELSE --l_fnd_exists = 'Y'
2312      SELECT APPLICATION_SHORT_NAME
2313       INTO l_appl_short_name
2314       FROM FND_APPLICATION
2315      WHERE APPLICATION_ID = p_application_id;
2316     fnd_flex_dsc_api.set_session_mode('customer_data');
2317     fnd_flex_dsc_api.create_context(appl_short_name => l_appl_short_name,
2318                                     flexfield_name  => p_attr_group_type,
2319                                     context_code    => p_internal_name,
2323                                     global_flag     => 'N');
2320                                     context_name    => p_display_name,
2321                                     description     =>  p_attr_group_desc,
2322                                     enabled         => 'N',
2324   END IF;--l_fnd_exists = 'Y' Bug 4703510:END
2325 
2326   IF (l_ego_exists <> 'Y' ) THEN
2327     SELECT EGO_ATTR_GROUPS_S.NEXTVAL INTO x_attr_group_id FROM DUAL;
2328     INSERT INTO EGO_FND_DSC_FLX_CTX_EXT
2329     (
2330         ATTR_GROUP_ID
2331        ,APPLICATION_ID
2332        ,DESCRIPTIVE_FLEXFIELD_NAME
2333        ,DESCRIPTIVE_FLEX_CONTEXT_CODE
2334        ,MULTI_ROW
2335        ,VARIANT             --VARIANT(R12C)
2336        ,NUM_OF_COLS
2337        ,NUM_OF_ROWS
2338        ,SECURITY_TYPE
2339        ,OWNING_PARTY_ID
2340        ,REGION_CODE
2341        ,VIEW_PRIVILEGE_ID
2342        ,EDIT_PRIVILEGE_ID
2343        ,BUSINESS_EVENT_FLAG
2344        ,PRE_BUSINESS_EVENT_FLAG
2345        ,CREATED_BY
2346        ,CREATION_DATE
2347        ,LAST_UPDATED_BY
2348        ,LAST_UPDATE_DATE
2349        ,LAST_UPDATE_LOGIN
2350     )
2351     VALUES
2352     (
2353         x_attr_group_id                     --ATTR_GROUP_ID
2354        ,p_application_id                    --APPLICATION_ID
2355        ,p_attr_group_type                   --DESCRIPTIVE_FLEXFIELD_NAME
2356        ,p_internal_name                     --DESCRIPTIVE_FLEX_CONTEXT_CODE
2357        ,nvl(p_multi_row_attrib_group, 'N')  --MULTI_ROW
2358        ,p_variant_attrib_group             --VARIANT
2359        ,l_num_of_cols
2360        ,l_num_of_rows
2361        ,nvl(p_security_type, 'P')           --SECURITY_TYPE
2362        ,-100                                --p_owning_company_id   --OWNING_PARTY_ID
2363        ,p_region_code                       --p_region_code
2364        ,p_view_privilege_id                 -- View privilege
2365        ,p_edit_privilege_id                 -- Edit privilege
2366        ,p_business_event_flag               --BUSINESS_EVENT_FLAG
2367        ,p_pre_business_event_flag          --PRE_BUSINESS_EVENT_FLAG
2368        ,NVL(p_owner, g_current_user_id)     --CREATED_BY
2369        ,p_lud                               --CREATION_DATE
2370        ,NVL(p_owner, g_current_user_id)     --LAST_UPDATED_BY
2371        ,p_lud                               --LAST_UPDATE_DATE
2372        ,g_current_login_id                  --LAST_UPDATE_LOGIN
2373     );
2374 
2375 
2376     -------------------------------------------------------------------
2377     -- Now we add a partition to the Extension Table that will store --
2378     -- data for this Attribute Group so that if this Attribute Group --
2379     -- gets associated and data for it get stored in that table,     --
2380     -- query performance will be optimized.                          --
2381     -------------------------------------------------------------------
2382 
2383     --------------------------------
2384     --  partition extention table --
2385     --------------------------------
2386     l_ext_table_name := Get_Table_Name(p_application_id
2387                                       ,p_attr_group_type);
2388 
2389     l_table_owner := Get_Application_Owner(p_application_id);
2390 
2391     SELECT COUNT(*) into l_partition_count
2392     FROM ALL_TAB_PARTITIONS
2393     WHERE
2394      table_name = l_ext_table_name
2395      and table_owner = l_table_owner;
2396 
2397     if (l_partition_count > 0)  THEN
2398       l_dynamic_sql := ' ALTER TABLE '|| l_table_owner || '.' || l_ext_table_name ||
2399                        ' ADD PARTITION ag_' || x_attr_group_id ||
2400                        ' VALUES LESS THAN (' || (x_attr_group_id + 1) || ')';
2401 
2402       l_sql_errm := Execute_DDL_And_Return_Err(l_dynamic_sql);
2403       IF(l_sql_errm IS NOT NULL) THEN
2404         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2405       END IF;
2406       --EXECUTE IMMEDIATE l_dynamic_sql;
2407 
2408     END IF;
2409 
2410     -----------------------------------
2411     --  partition extention TL table --
2412     -----------------------------------
2413     l_ext_table_name := Get_TL_Table_Name(p_application_id
2414                                          ,p_attr_group_type);
2415 
2416     l_table_owner := Get_Application_Owner(p_application_id);
2417 
2418     IF (l_ext_table_name IS NOT NULL) THEN
2419 
2420       SELECT COUNT(*) into l_partition_count
2421       FROM ALL_TAB_PARTITIONS
2422       WHERE
2423        table_name = l_ext_table_name
2424        and table_owner = l_table_owner;
2425 
2426       if (l_partition_count > 0)  THEN
2427 
2428         l_dynamic_sql := ' ALTER TABLE '|| l_table_owner || '.' || l_ext_table_name ||
2429                          ' ADD PARTITION ag_' || x_attr_group_id ||
2430                          ' VALUES LESS THAN (' || (x_attr_group_id + 1) || ')';
2431 
2432         l_sql_errm := Execute_DDL_And_Return_Err(l_dynamic_sql);
2433         IF(l_sql_errm IS NOT NULL) THEN
2434           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2435         END IF;
2436         --EXECUTE IMMEDIATE l_dynamic_sql;
2437 
2438       END IF;
2439 
2440     END IF;
2441 
2442 /*    -- bug: 3801472
2443     -- partition the Attribute Changes Tables
2444 
2445 
2446   EGO_EXT_FWK_PUB.Get_Attr_Changes_Table
2447      (p_attr_group_type  => p_attr_group_type
2451     --Creating the partitions on the Pending tables
2448       ,x_base_table       => l_attr_chg_b_table
2449       ,x_tl_table         => l_attr_chg_tl_table
2450       );*/
2452     l_attr_chg_b_table := Get_Attr_Changes_B_Table(p_application_id =>p_application_id
2453                                                                        ,p_attr_group_type => p_attr_group_type);
2454     l_table_owner := Get_Application_Owner(p_appl_id => p_application_id);
2455 
2456     IF l_attr_chg_b_table IS NOT NULL THEN
2457       SELECT COUNT(*)
2458       INTO l_partition_count
2459       FROM ALL_TAB_PARTITIONS
2460       WHERE table_name = l_attr_chg_b_table
2461        AND table_owner = l_table_owner;
2462 
2463       IF (l_partition_count > 0)  THEN
2464         l_dynamic_sql := ' ALTER TABLE '|| l_table_owner || '.' || l_attr_chg_b_table ||
2465                          ' ADD PARTITION ag_' || x_attr_group_id ||
2466                          ' VALUES LESS THAN (' || (x_attr_group_id + 1) || ')';
2467 
2468         EXECUTE IMMEDIATE l_dynamic_sql;
2469       END IF; --IF (l_partition_count > 0)
2470     END IF;--IF l_attr_chg_b_table IS NOT NULL
2471 
2472     l_attr_chg_tl_table := Get_Attr_Changes_TL_Table(p_application_id => p_application_id
2473                                                      ,p_attr_group_type => p_attr_group_type);
2474 
2475     l_table_owner := Get_Application_Owner(p_appl_id => p_application_id);
2476 
2477     IF l_attr_chg_tl_table IS NOT NULL THEN
2478       SELECT COUNT(*)
2479       INTO l_partition_count
2480       FROM ALL_TAB_PARTITIONS
2481       WHERE table_name = l_attr_chg_tl_table
2482        AND table_owner = l_table_owner;
2483 
2484       IF (l_partition_count > 0)  THEN
2485         l_dynamic_sql := ' ALTER TABLE '|| l_table_owner || '.' || l_attr_chg_tl_table ||
2486                          ' ADD PARTITION ag_' || x_attr_group_id ||
2487                          ' VALUES LESS THAN (' || (x_attr_group_id + 1) || ')';
2488 
2489         EXECUTE IMMEDIATE l_dynamic_sql;
2490       END IF;
2491     END IF;
2492     -- Standard check of p_commit
2493     IF FND_API.To_Boolean(p_commit) THEN
2494       COMMIT WORK;
2495     END IF;
2496     x_return_status := FND_API.G_RET_STS_SUCCESS;
2497   ELSE --l_ego_exists <> Y --Bug 4703510
2498     IF FND_API.To_Boolean(p_commit) THEN
2499       ROLLBACK TO Create_Attribute_Group_PUB;
2500     END IF;
2501       x_return_status := FND_API.G_RET_STS_ERROR;
2502       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_GRP_EXIST');
2503       FND_MSG_PUB.Add;
2504       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2505                                ,p_count   => x_msg_count
2506                                ,p_data    => x_msg_data);
2507   END IF; --l_ego_exists <> Y --Bug 4703510
2508 
2509   EXCEPTION
2510    --Bug 5443697
2511     WHEN e_ag_starts_with_num THEN
2512     IF FND_API.TO_BOOLEAN(p_commit) THEN
2513       ROLLBACK TO Create_Attribute_Group_PUB;
2514     END IF;
2515       x_return_status := FND_API.G_RET_STS_ERROR;
2516       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_AG_NAME_ST_NUM');
2517       FND_MSG_PUB.Add;
2518       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2519                                ,p_count   => x_msg_count
2520                                ,p_data    => x_msg_data);
2521 
2522    --Bug 5443697
2523     WHEN e_ag_starts_with_und_sc THEN
2524     IF FND_API.TO_BOOLEAN(p_commit) THEN
2525       ROLLBACK TO Create_Attribute_Group_PUB;
2526     END IF;
2527       x_return_status := FND_API.G_RET_STS_ERROR;
2528       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_AG_NAME_ST_UND_SC');
2529       FND_MSG_PUB.Add;
2530       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2531                                ,p_count   => x_msg_count
2532                                ,p_data    => x_msg_data);
2533 
2534     WHEN OTHERS THEN
2535       IF FND_API.To_Boolean(p_commit) THEN
2536         ROLLBACK TO Create_Attribute_Group_PUB;
2537       END IF;
2538 
2539       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2540 
2541       IF (INSTR(SQLERRM, 'ORA-00001') <> 0) THEN
2542         SELECT MESSAGE_TEXT INTO x_msg_data
2543           FROM FND_NEW_MESSAGES
2544          WHERE MESSAGE_NAME = 'EGO_INTERNAL_NAME_EXISTS'
2545            AND LANGUAGE_CODE = USERENV('LANG');
2546       ELSE
2547         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
2548         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
2549         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
2550         -- SQLERRM from the autonomous transaction will not be reflected here
2551         -- x_msg_data will maintain the SQLERRM generated in the autonomous transaction.
2552         -- Bug 6120553
2553         FND_MESSAGE.Set_Token('SQL_ERR_MSG', NVL(l_sql_errm, SQLERRM)||' '||FND_FLEX_DSC_API.Message());
2554         FND_MSG_PUB.Add;
2555         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2556                                  ,p_count   => x_msg_count
2557                                  ,p_data    => x_msg_data);
2558       END IF;
2559 
2560 END Create_Attribute_Group;
2561 
2562 ----------------------------------------------------------------------
2563 
2564 -- Wrapper for JSPs that aren't set up to take ATTR_GROUP_ID --
2565 PROCEDURE Create_Attribute_Group (
2566         p_api_version                   IN   NUMBER
2567        ,p_application_id                IN   NUMBER
2568        ,p_attr_group_type               IN   VARCHAR2
2572        ,p_security_type                 IN   VARCHAR2
2569        ,p_internal_name                 IN   VARCHAR2
2570        ,p_display_name                  IN   VARCHAR2
2571        ,p_attr_group_desc               IN   VARCHAR2
2573        ,p_multi_row_attrib_group        IN   VARCHAR2
2574        ,p_variant_attrib_group          IN   VARCHAR2
2575        ,p_num_of_cols                   IN   NUMBER     DEFAULT NULL
2576        ,p_num_of_rows                   IN   NUMBER     DEFAULT NULL
2577        ,p_owning_company_id             IN   NUMBER
2578        ,p_region_code                   IN   VARCHAR2   DEFAULT NULL
2579        ,p_view_privilege_id             IN   NUMBER     DEFAULT NULL
2580        ,p_edit_privilege_id             IN   NUMBER     DEFAULT NULL
2581        ,p_business_event_flag           IN   VARCHAR2   DEFAULT NULL
2582        ,p_pre_business_event_flag       IN   VARCHAR2   DEFAULT NULL
2583        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2584        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2585        ,x_return_status                 OUT NOCOPY VARCHAR2
2586        ,x_errorcode                     OUT NOCOPY NUMBER
2587        ,x_msg_count                     OUT NOCOPY NUMBER
2588        ,x_msg_data                      OUT NOCOPY VARCHAR2
2589 ) IS
2590 
2591     l_attr_group_id          NUMBER;
2592 
2593   BEGIN
2594 
2595     EGO_EXT_FWK_PUB.Create_Attribute_Group
2596     (
2597         p_api_version                   => p_api_version
2598        ,p_application_id                => p_application_id
2599        ,p_attr_group_type               => p_attr_group_type
2600        ,p_internal_name                 => p_internal_name
2601        ,p_display_name                  => p_display_name
2602        ,p_attr_group_desc               => p_attr_group_desc
2603        ,p_security_type                 => p_security_type
2604        ,p_multi_row_attrib_group        => p_multi_row_attrib_group
2605        ,p_variant_attrib_group          => p_variant_attrib_group
2606        ,p_num_of_cols                   => p_num_of_cols
2607        ,p_num_of_rows                   => p_num_of_rows
2608        ,p_owning_company_id             => p_owning_company_id
2609        ,p_region_code                   => p_region_code
2610        ,p_view_privilege_id             => p_view_privilege_id
2611        ,p_edit_privilege_id             => p_edit_privilege_id
2612        ,p_business_event_flag           => p_business_event_flag
2613        ,p_pre_business_event_flag       => p_pre_business_event_flag
2614        ,p_init_msg_list                 => p_init_msg_list
2615        ,p_commit                        => p_commit
2616        ,x_attr_group_id                 => l_attr_group_id
2617        ,x_return_status                 => x_return_status
2618        ,x_errorcode                     => x_errorcode
2619        ,x_msg_count                     => x_msg_count
2620        ,x_msg_data                      => x_msg_data
2621     );
2622 
2623 END Create_Attribute_Group;
2624 
2625 ----------------------------------------------------------------------
2626 
2627 PROCEDURE Copy_Attribute_Group (
2628         p_api_version                   IN   NUMBER
2629        ,p_source_ag_app_id              IN   NUMBER
2630        ,p_source_ag_type                IN   VARCHAR2
2631        ,p_source_ag_name                IN   VARCHAR2
2632        ,p_dest_ag_app_id                IN   NUMBER
2633        ,p_dest_ag_type                  IN   VARCHAR2
2634        ,p_dest_ag_name                  IN   VARCHAR2
2635        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2636        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2637        ,x_attr_group_id                 OUT NOCOPY NUMBER
2638        ,x_return_status                 OUT NOCOPY VARCHAR2
2639        ,x_errorcode                     OUT NOCOPY NUMBER
2640        ,x_msg_count                     OUT NOCOPY NUMBER
2641        ,x_msg_data                      OUT NOCOPY VARCHAR2
2642 ) IS
2643 
2644     l_api_name               CONSTANT VARCHAR2(30) := 'Copy_Attribute_Group';
2645 
2646     l_lang_installed_flag    FND_LANGUAGES.INSTALLED_FLAG%TYPE;
2647 
2648     --we don't use l_api_version yet, but eventually we might:
2649     --if we change required parameters, version goes from n.x to (n+1).x
2650     --if we change optional parameters, version goes from x.n to x.(n+1)
2651     l_api_version            CONSTANT NUMBER := 1.0;
2652 
2653     l_return_status VARCHAR(1);
2654     l_errorcode NUMBER;
2655     l_msg_count NUMBER;
2656     l_msg_data VARCHAR2(1000);
2657 
2658     CURSOR ego_attribute_csr
2659     (
2660         v_source_ag_app_id              IN   EGO_ATTRS_V.APPLICATION_ID%TYPE
2661        ,v_source_ag_type                IN   EGO_ATTRS_V.ATTR_GROUP_TYPE%TYPE
2662        ,v_source_ag_name                IN   EGO_ATTRS_V.ATTR_GROUP_NAME%TYPE
2663     ) IS
2664     SELECT APPLICATION_ID,
2665            ATTR_GROUP_TYPE,
2666            ATTR_GROUP_NAME,
2667            ATTR_NAME,
2668            ATTR_DISPLAY_NAME,
2669            DESCRIPTION,
2670            DATA_TYPE_CODE,
2671            SEQUENCE,
2672            UNIQUE_KEY_FLAG,
2673            DEFAULT_VALUE,
2674            INFO_1,
2675            VALUE_SET_ID,
2676            ENABLED_FLAG,
2677            REQUIRED_FLAG,
2678            SEARCH_FLAG,
2679            DISPLAY_CODE,
2680            DATABASE_COLUMN,
2681            UOM_CLASS,
2682            DECODE(DISPLAY_CODE,'D',1,0) DISP_CODE --bugFix:5589398
2686        AND ATTR_GROUP_NAME = v_source_ag_name
2683       FROM EGO_ATTRS_V
2684      WHERE APPLICATION_ID = v_source_ag_app_id
2685        AND ATTR_GROUP_TYPE = v_source_ag_type
2687   ORDER BY DISP_CODE, SEQUENCE;
2688 
2689     l_sequence        ego_attrs_v.sequence%TYPE;
2690     ego_attribute_rec ego_attribute_csr%ROWTYPE;
2691     l_sequence_numbers VARCHAR2(10000);
2692 
2693   BEGIN
2694 
2695     -- Standard start of API savepoint
2696     IF FND_API.TO_BOOLEAN(p_commit) THEN
2697       SAVEPOINT Copy_Attribute_Group_PUB;
2698     END IF;
2699 
2700     -- Check for call compatibility
2701     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
2702                                         l_api_name, G_PKG_NAME)
2703     THEN
2704       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2705     END IF;
2706     -- Initialize message list even though we don't currently use it
2707     IF FND_API.To_Boolean(p_init_msg_list) THEN
2708       FND_MSG_PUB.Initialize;
2709     END IF;
2710 
2711     l_sequence_numbers := '  ';
2712 
2713     OPEN ego_attribute_csr (v_source_ag_app_id => p_source_ag_app_id,
2714                             v_source_ag_type => p_source_ag_type,
2715                             v_source_ag_name => p_source_ag_name);
2716     LOOP
2717       FETCH ego_attribute_csr INTO ego_attribute_rec;
2718       EXIT WHEN ego_attribute_csr%NOTFOUND;
2719 /*
2720       IF l_sequence IS NULL THEN
2721         l_sequence := ego_attribute_rec.SEQUENCE;
2722       ELSIF l_sequence >= ego_attribute_rec.SEQUENCE THEN
2723         l_sequence := l_sequence + 1;
2724       ELSIF l_sequence < ego_attribute_rec.SEQUENCE THEN
2725         l_sequence := ego_attribute_rec.SEQUENCE;
2726       END IF;
2727 */
2728 --Commented out the above logic and added the following while loop to
2729 --take care of the case for bug 4874670 where two attributes have the same seq no
2730 --The above logic was failing for the changes made for bugfix 5589398.
2731      l_sequence := ego_attribute_rec.SEQUENCE;
2732       WHILE(INSTR(l_sequence_numbers,(' '||l_sequence||' ')) <> 0 AND INSTR(l_sequence_numbers,(' '||l_sequence||' ')) IS NOT NULL)
2733       LOOP
2734   l_sequence := l_sequence+10;
2735       END LOOP;
2736       l_sequence_numbers := l_sequence_numbers||' '||l_sequence||' ';
2737 
2738 
2739       EGO_EXT_FWK_PUB.Create_Attribute(
2740         p_api_version           => l_api_version
2741        ,p_application_id        => p_dest_ag_app_id
2742        ,p_attr_group_type       => p_dest_ag_type
2743        ,p_attr_group_name       => p_dest_ag_name
2744        ,p_internal_name         => ego_attribute_rec.ATTR_NAME
2745        ,p_display_name          => ego_attribute_rec.ATTR_DISPLAY_NAME
2746        ,p_description           => ego_attribute_rec.DESCRIPTION
2747        ,p_sequence              => l_sequence
2748        ,p_data_type             => ego_attribute_rec.DATA_TYPE_CODE
2749        ,p_required              => ego_attribute_rec.REQUIRED_FLAG
2750        ,p_searchable            => ego_attribute_rec.SEARCH_FLAG
2751        ,p_column                => ego_attribute_rec.DATABASE_COLUMN
2752        ,p_is_column_indexed     => NULL --this will force Create_Attribute to query
2753        ,p_value_set_id          => ego_attribute_rec.VALUE_SET_ID
2754        ,p_info_1                => ego_attribute_rec.INFO_1
2755        ,p_default_value         => ego_attribute_rec.DEFAULT_VALUE
2756        ,p_unique_key_flag       => ego_attribute_rec.UNIQUE_KEY_FLAG
2757        ,p_enabled               => ego_attribute_rec.ENABLED_FLAG
2758        ,p_display               => ego_attribute_rec.DISPLAY_CODE
2759        ,p_uom_class             => ego_attribute_rec.UOM_CLASS
2760        ,p_init_msg_list         => FND_API.G_FALSE
2761        ,p_commit                => FND_API.G_FALSE
2762        ,x_return_status         => l_return_status
2763        ,x_errorcode             => l_errorcode
2764        ,x_msg_count             => l_msg_count
2765        ,x_msg_data              => l_msg_data
2766       );
2767    END LOOP;
2768    CLOSE ego_attribute_csr;
2769 
2770     -- Standard check of p_commit
2771     IF FND_API.To_Boolean(p_commit) THEN
2772       COMMIT WORK;
2773     END IF;
2774 
2775     x_return_status := FND_API.G_RET_STS_SUCCESS;
2776 
2777   EXCEPTION
2778     WHEN OTHERS THEN
2779       IF FND_API.TO_BOOLEAN(p_commit) THEN
2780         ROLLBACK TO Copy_Attribute_Group_PUB;
2781       END IF;
2782       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2783       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
2784       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
2785       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
2786       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
2787       FND_MSG_PUB.Add;
2788       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2789                                ,p_count   => x_msg_count
2790                                ,p_data    => x_msg_data);
2791 
2792 END Copy_Attribute_Group;
2793 
2794 ----------------------------------------------------------------------
2795 
2796 -- Wrapper for JSPs that aren't set up to take ATTR_GROUP_ID --
2797 PROCEDURE Copy_Attribute_Group (
2798         p_api_version                   IN   NUMBER
2799        ,p_source_ag_app_id              IN   NUMBER
2800        ,p_source_ag_type                IN   VARCHAR2
2801        ,p_source_ag_name                IN   VARCHAR2
2802        ,p_dest_ag_app_id                IN   NUMBER
2806        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2803        ,p_dest_ag_type                  IN   VARCHAR2
2804        ,p_dest_ag_name                  IN   VARCHAR2
2805        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2807        ,x_return_status                 OUT NOCOPY VARCHAR2
2808        ,x_errorcode                     OUT NOCOPY NUMBER
2809        ,x_msg_count                     OUT NOCOPY NUMBER
2810        ,x_msg_data                      OUT NOCOPY VARCHAR2
2811 ) IS
2812 
2813     l_attr_group_id          NUMBER;
2814 
2815   BEGIN
2816 
2817     EGO_EXT_FWK_PUB.Copy_Attribute_Group
2818     (
2819         p_api_version         => p_api_version
2820        ,p_source_ag_app_id    => p_source_ag_app_id
2821        ,p_source_ag_type      => p_source_ag_type
2822        ,p_source_ag_name      => p_source_ag_name
2823        ,p_dest_ag_app_id      => p_dest_ag_app_id
2824        ,p_dest_ag_type        => p_dest_ag_type
2825        ,p_dest_ag_name        => p_dest_ag_name
2826        ,p_init_msg_list       => p_init_msg_list
2827        ,p_commit              => p_commit
2828        ,x_attr_group_id       => l_attr_group_id
2829        ,x_return_status       => x_return_status
2830        ,x_errorcode           => x_errorcode
2831        ,x_msg_count           => x_msg_count
2832        ,x_msg_data            => x_msg_data
2833     );
2834 
2835 END Copy_Attribute_Group;
2836 
2837 ----------------------------------------------------------------------
2838 
2839 -- Wrapper for OA to pass source ATTR_GROUP_ID instead of Application Id, AG Type and AG Name--
2840 PROCEDURE Copy_Attribute_Group (
2841         p_api_version                   IN   NUMBER
2842        ,p_source_attr_group_id          IN   NUMBER
2843        ,p_dest_ag_app_id                IN   NUMBER
2844        ,p_dest_ag_type                  IN   VARCHAR2
2845        ,p_dest_ag_name                  IN   VARCHAR2
2846        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2847        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2848        ,x_attr_group_id                 OUT NOCOPY NUMBER
2849        ,x_return_status                 OUT NOCOPY VARCHAR2
2850        ,x_errorcode                     OUT NOCOPY NUMBER
2851        ,x_msg_count                     OUT NOCOPY NUMBER
2852        ,x_msg_data                      OUT NOCOPY VARCHAR2
2853 ) IS
2854 
2855     l_attr_group_pks         EGO_VARCHAR_TBL_TYPE;
2856 
2857   BEGIN
2858 
2859     l_attr_group_pks := Get_PKs_From_Attr_Group_Id(p_source_attr_group_id);
2860     IF l_attr_group_pks IS NULL THEN
2861       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2862     END IF;
2863 
2864     EGO_EXT_FWK_PUB.Copy_Attribute_Group
2865     (
2866         p_api_version         => p_api_version
2867        ,p_source_ag_app_id    => l_attr_group_pks(1)
2868        ,p_source_ag_type      => l_attr_group_pks(2)
2869        ,p_source_ag_name      => l_attr_group_pks(3)
2870        ,p_dest_ag_app_id      => p_dest_ag_app_id
2871        ,p_dest_ag_type        => p_dest_ag_type
2872        ,p_dest_ag_name        => p_dest_ag_name
2873        ,p_init_msg_list       => p_init_msg_list
2874        ,p_commit              => p_commit
2875        ,x_attr_group_id       => x_attr_group_id
2876        ,x_return_status       => x_return_status
2877        ,x_errorcode           => x_errorcode
2878        ,x_msg_count           => x_msg_count
2879        ,x_msg_data            => x_msg_data
2880     );
2881 
2882 END Copy_Attribute_Group;
2883 
2884 ---------------------------------------------------------------------------
2885 
2886 
2887 PROCEDURE Update_Attribute_Group (
2888         p_api_version                   IN   NUMBER
2889        ,p_attr_group_id                 IN   NUMBER
2890        ,p_display_name                  IN   VARCHAR2
2891        ,p_attr_group_desc               IN   VARCHAR2
2892        ,p_security_type                 IN   VARCHAR2
2893        ,p_multi_row_attrib_group        IN   VARCHAR2
2894        ,p_variant_attrib_group          IN   VARCHAR2
2895        ,p_num_of_cols                   IN   NUMBER     DEFAULT NULL
2896        ,p_num_of_rows                   IN   NUMBER     DEFAULT NULL
2897        ,p_owning_company_id             IN   NUMBER
2898        ,p_region_code                   IN   VARCHAR2   DEFAULT NULL
2899        ,p_view_privilege_id             IN   NUMBER     DEFAULT NULL
2900        ,p_edit_privilege_id             IN   NUMBER     DEFAULT NULL
2901        ,p_business_event_flag           IN   VARCHAR2   DEFAULT NULL
2902        ,p_pre_business_event_flag       IN   VARCHAR2   DEFAULT NULL
2903        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2904        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2905        ,x_return_status                 OUT NOCOPY VARCHAR2
2906        ,x_errorcode                     OUT NOCOPY NUMBER
2907        ,x_msg_count                     OUT NOCOPY NUMBER
2908        ,x_msg_data                      OUT NOCOPY VARCHAR2
2909 ) IS
2910 
2911     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Attribute_Group';
2912     l_attr_group_pks         EGO_VARCHAR_TBL_TYPE;
2913 
2914   BEGIN
2915 
2916     -- Standard start of API savepoint
2917     IF FND_API.TO_BOOLEAN(p_commit) THEN
2918       SAVEPOINT Update_Attribute_Group_PUB;
2919     END IF;
2920 
2921     l_attr_group_pks := Get_PKs_From_Attr_Group_Id(p_attr_group_id);
2925 
2922     IF l_attr_group_pks IS NULL THEN
2923       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2924     END IF;
2926     EGO_EXT_FWK_PUB.Update_Attribute_Group(
2927         p_api_version              => p_api_version
2928        ,p_application_id           => l_attr_group_pks(1)
2929        ,p_attr_group_type          => l_attr_group_pks(2)
2930        ,p_internal_name            => l_attr_group_pks(3)
2931        ,p_display_name             => p_display_name
2932        ,p_attr_group_desc          => p_attr_group_desc
2933        ,p_security_type            => p_security_type
2934        ,p_multi_row_attrib_group   => p_multi_row_attrib_group
2935        ,p_variant_attrib_group     => p_variant_attrib_group
2936        ,p_num_of_cols              => p_num_of_cols
2937        ,p_num_of_rows              => p_num_of_rows
2938        ,p_owning_company_id        => p_owning_company_id
2939        ,p_region_code              => p_region_code
2940        ,p_view_privilege_id        => p_view_privilege_id
2941        ,p_edit_privilege_id        => p_edit_privilege_id
2942        ,p_business_event_flag      => p_business_event_flag
2943        ,p_pre_business_event_flag  => p_pre_business_event_flag
2944        ,p_init_msg_list            => p_init_msg_list
2945        ,p_commit                   => p_commit
2946        ,x_return_status            => x_return_status
2947        ,x_errorcode                => x_errorcode
2948        ,x_msg_count                => x_msg_count
2949        ,x_msg_data                 => x_msg_data
2950     );
2951 
2952     -- Standard check of p_commit
2953     IF FND_API.To_Boolean(p_commit) THEN
2954       COMMIT WORK;
2955     END IF;
2956 
2957   EXCEPTION
2958     WHEN OTHERS THEN
2959       IF FND_API.TO_BOOLEAN(p_commit) THEN
2960         ROLLBACK TO Update_Attribute_Group_PUB;
2961       END IF;
2962       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2963 
2964       IF (l_attr_group_pks IS NULL) THEN
2965         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoPKsFoundForAttrGroupID';
2966       ELSE
2967         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
2968         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
2969         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
2970         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
2971         FND_MSG_PUB.Add;
2972         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2973                                  ,p_count   => x_msg_count
2974                                  ,p_data    => x_msg_data);
2975       END IF;
2976 
2977 END Update_Attribute_Group;
2978 
2979 ----------------------------------------------------------------------
2980 
2981 PROCEDURE Update_Attribute_Group (
2982         p_api_version                   IN   NUMBER
2983        ,p_application_id                IN   NUMBER
2984        ,p_attr_group_type               IN   VARCHAR2
2985        ,p_internal_name                 IN   VARCHAR2
2986        ,p_display_name                  IN   VARCHAR2
2987        ,p_attr_group_desc               IN   VARCHAR2
2988        ,p_security_type                 IN   VARCHAR2
2989        ,p_multi_row_attrib_group        IN   VARCHAR2
2990        ,p_variant_attrib_group          IN   VARCHAR2
2991        ,p_num_of_cols                   IN   NUMBER     DEFAULT NULL
2992        ,p_num_of_rows                   IN   NUMBER     DEFAULT NULL
2993        ,p_owning_company_id             IN   NUMBER
2994        ,p_region_code                   IN   VARCHAR2   DEFAULT NULL
2995        ,p_view_privilege_id             IN   NUMBER     DEFAULT NULL
2996        ,p_edit_privilege_id             IN   NUMBER     DEFAULT NULL
2997        ,p_business_event_flag           IN   VARCHAR2   DEFAULT NULL
2998        ,p_pre_business_event_flag       IN   VARCHAR2   DEFAULT NULL
2999        ,p_owner                         IN   NUMBER     DEFAULT NULL
3000        ,p_lud                           IN   DATE       DEFAULT SYSDATE
3001        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
3002        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
3003        ,p_is_nls_mode                   IN   VARCHAR2   DEFAULT FND_API.G_FALSE
3004        ,x_return_status                 OUT NOCOPY VARCHAR2
3005        ,x_errorcode                     OUT NOCOPY NUMBER
3006        ,x_msg_count                     OUT NOCOPY NUMBER
3007        ,x_msg_data                      OUT NOCOPY VARCHAR2
3008 ) IS
3009 
3010     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Attribute_Group';
3011 
3012     --we don't use l_api_version yet, but eventually we might:
3013     --if we change required parameters, version goes from n.x to (n+1).x
3014     --if we change optional parameters, version goes from x.n to x.(n+1)
3015     l_api_version            CONSTANT NUMBER := 1.0;
3016     --Bug 6048237
3017     l_num_of_cols           NUMBER := p_num_of_cols;
3018     l_num_of_rows           NUMBER := p_num_of_rows;
3019 
3020 
3021   BEGIN
3022 
3023     -- Standard start of API savepoint
3024     IF FND_API.TO_BOOLEAN(p_commit) THEN
3025       SAVEPOINT Update_Attribute_Group_PUB;
3026     END IF;
3027 
3028     -- Check for call compatibility
3029     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
3030                                         l_api_name, G_PKG_NAME)
3031     THEN
3032       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3033     END IF;
3034     -- Initialize message list even though we don't currently use it
3038     --Initialize num cols and rows.
3035     IF FND_API.To_Boolean(p_init_msg_list) THEN
3036       FND_MSG_PUB.Initialize;
3037     END IF;
3039     --Bug 6048237
3040     IF p_multi_row_attrib_group = 'Y' THEN
3041       IF l_num_of_cols is null THEN
3042         l_num_of_cols := 5;
3043       END IF;
3044       IF l_num_of_rows is null THEN
3045         l_num_of_rows := 5;
3046       END IF;
3047     ELSIF p_multi_row_attrib_group = 'N' THEN
3048       IF l_num_of_cols is null THEN
3049         l_num_of_cols := 2;
3050       END IF;
3051     END IF;
3052 
3053     IF (FND_API.To_Boolean(p_is_nls_mode)) THEN
3054 
3055       -- We do this IF check this way so that if p_is_nls_mode is NULL,
3056       -- we still update the non-trans tables (i.e., we treat NULL as 'F')
3057       NULL;
3058 
3059     ELSE
3060 
3061       -- We only update this information if we are NOT in NLS mode
3062       -- (i.e., we don't update it if we are in NLS mode)
3063       UPDATE FND_DESCR_FLEX_CONTEXTS
3064          SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
3065              LAST_UPDATE_DATE = p_lud,
3066              LAST_UPDATE_LOGIN = g_current_login_id
3067        WHERE DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
3068          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name
3069          AND APPLICATION_ID = p_application_id;
3070 
3071       UPDATE EGO_FND_DSC_FLX_CTX_EXT
3072          SET MULTI_ROW = nvl(p_multi_row_attrib_group, MULTI_ROW),
3073              VARIANT = nvl(p_variant_attrib_group, VARIANT),
3074              NUM_OF_COLS = l_num_of_cols,
3075              NUM_OF_ROWS = l_num_of_rows,
3076              SECURITY_TYPE = nvl(p_security_type, SECURITY_TYPE),
3077              REGION_CODE = p_region_code,
3078              VIEW_PRIVILEGE_ID = p_view_privilege_id,
3079              EDIT_PRIVILEGE_ID = p_edit_privilege_id,
3080              BUSINESS_EVENT_FLAG = p_business_event_flag,
3081              PRE_BUSINESS_EVENT_FLAG = p_pre_business_event_flag,
3082              LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
3083              LAST_UPDATE_DATE = p_lud,
3084              LAST_UPDATE_LOGIN = g_current_login_id
3085        WHERE DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
3086          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name
3087          AND APPLICATION_ID = p_application_id;
3088 
3089     END IF;
3090 
3091     -- We update the TL information whether or not we're in NLS mode
3092     UPDATE FND_DESCR_FLEX_CONTEXTS_TL
3093        SET DESCRIPTION = p_attr_group_desc,
3094            DESCRIPTIVE_FLEX_CONTEXT_NAME = p_display_name,
3095            LAST_UPDATE_DATE = p_lud,
3096            LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
3097            LAST_UPDATE_LOGIN = g_current_login_id,
3098            SOURCE_LANG = USERENV('LANG')
3099      WHERE APPLICATION_ID = p_application_id
3100        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
3101        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name
3102       -- AND LANGUAGE = USERENV('LANG');
3103        AND USERENV('LANG') in (LANGUAGE , SOURCE_LANG);
3104 
3105     -- Standard check of p_commit
3106     IF FND_API.To_Boolean(p_commit) THEN
3107       COMMIT WORK;
3108     END IF;
3109 
3110     x_return_status := FND_API.G_RET_STS_SUCCESS;
3111 
3112   EXCEPTION
3113     WHEN OTHERS THEN
3114       IF FND_API.TO_BOOLEAN(p_commit) THEN
3115         ROLLBACK TO Update_Attribute_Group_PUB;
3116       END IF;
3117       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3118       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
3119       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
3120       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
3121       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
3122       FND_MSG_PUB.Add;
3123       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
3124                                ,p_count   => x_msg_count
3125                                ,p_data    => x_msg_data);
3126 
3127 END Update_Attribute_Group;
3128 
3129 ----------------------------------------------------------------------
3130 
3131 PROCEDURE Delete_Attribute_Group (
3132         p_api_version                   IN   NUMBER
3133        ,p_attr_group_id                 IN   NUMBER
3134        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
3135        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
3136        ,x_return_status                 OUT NOCOPY VARCHAR2
3137        ,x_errorcode                     OUT NOCOPY NUMBER
3138        ,x_msg_count                     OUT NOCOPY NUMBER
3139        ,x_msg_data                      OUT NOCOPY VARCHAR2
3140 ) IS
3141 
3142     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Attribute_Group';
3143     l_attr_group_pks         EGO_VARCHAR_TBL_TYPE;
3144 
3145   BEGIN
3146 
3147     -- Standard start of API savepoint
3148     IF FND_API.TO_BOOLEAN(p_commit) THEN
3149       SAVEPOINT Delete_Attribute_Group_PUB;
3150     END IF;
3151 
3152     l_attr_group_pks := Get_PKs_From_Attr_Group_Id(p_attr_group_id);
3153     IF l_attr_group_pks IS NULL THEN
3154       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3155     END IF;
3156 
3157     EGO_EXT_FWK_PUB.Delete_Attribute_Group(
3158         p_api_version        => p_api_version
3159        ,p_application_id     => l_attr_group_pks(1)
3160        ,p_attr_group_type    => l_attr_group_pks(2)
3164        ,x_return_status      => x_return_status
3161        ,p_attr_group_name    => l_attr_group_pks(3)
3162        ,p_init_msg_list      => p_init_msg_list
3163        ,p_commit             => p_commit
3165        ,x_errorcode          => x_errorcode
3166        ,x_msg_count          => x_msg_count
3167        ,x_msg_data           => x_msg_data
3168     );
3169 
3170     -- Standard check of p_commit
3171     IF FND_API.To_Boolean(p_commit) THEN
3172       COMMIT WORK;
3173     END IF;
3174 
3175     x_return_status := FND_API.G_RET_STS_SUCCESS;
3176 
3177   EXCEPTION
3178     WHEN OTHERS THEN
3179       IF FND_API.TO_BOOLEAN(p_commit) THEN
3180         ROLLBACK TO Delete_Attribute_Group_PUB;
3181       END IF;
3182       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3183 
3184       IF (l_attr_group_pks IS NULL) THEN
3185         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoPKsFoundForAttrGroupID';
3186       ELSE
3187         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
3188         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
3189         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
3190         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
3191         FND_MSG_PUB.Add;
3192         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
3193                                  ,p_count   => x_msg_count
3194                                  ,p_data    => x_msg_data);
3195       END IF;
3196 
3197 END Delete_Attribute_Group;
3198 
3199 ----------------------------------------------------------------------
3200 
3201 PROCEDURE Delete_Attribute_Group (
3202         p_api_version                   IN   NUMBER
3203        ,p_application_id                IN   NUMBER
3204        ,p_attr_group_type               IN   VARCHAR2
3205        ,p_attr_group_name               IN   VARCHAR2
3206        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
3207        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
3208        ,x_return_status                 OUT NOCOPY VARCHAR2
3209        ,x_errorcode                     OUT NOCOPY NUMBER
3210        ,x_msg_count                     OUT NOCOPY NUMBER
3211        ,x_msg_data                      OUT NOCOPY VARCHAR2
3212 ) IS
3213 
3214     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Attribute_Group';
3215     --we don't use l_api_version yet, but eventually we might:
3216     --if we change required parameters, version goes from n.x to (n+1).x
3217     --if we change optional parameters, version goes from x.n to x.(n+1)
3218     l_api_version            CONSTANT NUMBER := 1.0;
3219 
3220     l_assocs_exist           BOOLEAN;
3221     l_attr_group_disp_name   VARCHAR2(80);
3222 
3223   BEGIN
3224 
3225     -- Standard start of API savepoint
3226     IF FND_API.TO_BOOLEAN(p_commit) THEN
3227       SAVEPOINT Delete_Attribute_Group_PUB;
3228     END IF;
3229 
3230     -- Check for call compatibility
3231     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
3232                                         l_api_name, G_PKG_NAME)
3233     THEN
3234       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3235     END IF;
3236     -- Initialize message list even though we don't currently use it
3237     IF FND_API.To_Boolean(p_init_msg_list) THEN
3238       FND_MSG_PUB.Initialize;
3239     END IF;
3240 
3241     l_assocs_exist := Check_Associations_Exist(p_application_id,
3242                                                p_attr_group_type,
3243                                                p_attr_group_name);
3244 
3245     IF (l_assocs_exist) THEN
3246 
3247       x_return_status := FND_API.G_RET_STS_ERROR;
3248 
3249       SELECT DESCRIPTIVE_FLEX_CONTEXT_NAME
3250         INTO l_attr_group_disp_name
3251         FROM FND_DESCR_FLEX_CONTEXTS_TL
3252        WHERE APPLICATION_ID = p_application_id
3253          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
3254          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
3255          AND LANGUAGE = USERENV('LANG');
3256 
3257 
3258       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ASSOCS_EXIST1');
3259       FND_MESSAGE.Set_Token('ATTR_GRP_NAME', l_attr_group_disp_name);
3260       FND_MSG_PUB.Add;
3261       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
3262                                ,p_count   => x_msg_count
3263                                ,p_data    => x_msg_data);
3264 
3265     ELSE
3266 
3267       Delete_Attr_Group_Internal(p_application_id
3268                                 ,p_attr_group_type
3269                                 ,p_attr_group_name
3270                                 ,p_commit
3271                                 ,x_return_status
3272                                 ,x_errorcode
3273                                 ,x_msg_count
3274                                 ,x_msg_data);
3275 
3276     END IF;
3277 
3278     -- Standard check of p_commit
3279     IF FND_API.To_Boolean(p_commit) THEN
3280       COMMIT WORK;
3281     END IF;
3282 
3283     x_return_status := FND_API.G_RET_STS_SUCCESS;
3284 
3285   EXCEPTION
3286     WHEN OTHERS THEN
3287       IF FND_API.TO_BOOLEAN(p_commit) THEN
3288         ROLLBACK TO Delete_Attribute_Group_PUB;
3289       END IF;
3290       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3291 
3292       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
3293       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
3297       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
3294       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
3295       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
3296       FND_MSG_PUB.Add;
3298                                ,p_count   => x_msg_count
3299                                ,p_data    => x_msg_data);
3300 
3301 END Delete_Attribute_Group;
3302 
3303 ---------------------------------------------------------------------------
3304 
3305 PROCEDURE Compile_Attr_Group_View (
3306         p_api_version                   IN   NUMBER
3307        ,p_attr_group_id                 IN   NUMBER
3308        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
3309        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
3310        ,x_return_status                 OUT NOCOPY VARCHAR2
3311        ,x_errorcode                     OUT NOCOPY NUMBER
3312        ,x_msg_count                     OUT NOCOPY NUMBER
3313        ,x_msg_data                      OUT NOCOPY VARCHAR2
3314 ) IS
3315 
3316     l_api_name               CONSTANT VARCHAR2(30) := 'Compile_Attr_Group_View';
3317     l_attr_group_metadata_obj EGO_ATTR_GROUP_METADATA_OBJ;
3318     l_ext_table_metadata_obj EGO_EXT_TABLE_METADATA_OBJ;
3319     l_pk_col_names           VARCHAR2(1000);
3320     l_dl_col_names           VARCHAR2(1000);
3321     l_attr_metadata_table    EGO_ATTR_METADATA_TABLE;
3322     l_curr_attr_index        NUMBER;
3323     l_curr_attr_metadata_obj EGO_ATTR_METADATA_OBJ;
3324     l_to_char_db_col_expression VARCHAR2(90);
3325     p_pk_column_name_value_pairs EGO_COL_NAME_VALUE_PAIR_ARRAY;
3326     l_aliased_attr_names     VARCHAR2(32000);
3327     l_user_attrs_view_ddl    VARCHAR2(32757);
3328     l_ddl_error_message      VARCHAR2(1000);
3329     l_token_table            ERROR_HANDLER.Token_Tbl_Type;
3330     l_ext_table_name         FND_DESCRIPTIVE_FLEXS.APPLICATION_TABLE_NAME%TYPE;
3331 
3332   BEGIN
3333 
3334     -- Standard start of API savepoint
3335     IF FND_API.TO_BOOLEAN(p_commit) THEN
3336       SAVEPOINT Compile_Attr_Group_View_PUB;
3337     END IF;
3338 
3339     ----------------------------------------------------------------
3340     -- Start by getting a metadata object for the Attribute Group --
3341     ----------------------------------------------------------------
3342     l_attr_group_metadata_obj := EGO_USER_ATTRS_COMMON_PVT.Get_Attr_Group_Metadata(
3343                                    p_attr_group_id                 => p_attr_group_id
3344                                    ,p_pick_from_cache              => FALSE
3345                                  );
3346 
3347     IF (l_attr_group_metadata_obj IS NOT NULL AND
3348         l_attr_group_metadata_obj.attr_metadata_table.COUNT > 0) THEN
3349 
3350       ---------------------------------------------------------
3351       -- Next, get a metadata object for the Extension Table --
3352       ---------------------------------------------------------
3353       l_ext_table_metadata_obj := EGO_USER_ATTRS_COMMON_PVT.Get_Ext_Table_Metadata(
3354                                     EGO_EXT_FWK_PUB.Get_Object_Id_For_AG_Type(
3355                                       l_attr_group_metadata_obj.APPLICATION_ID
3356                                      ,l_attr_group_metadata_obj.ATTR_GROUP_TYPE
3357                                     )
3358                                   );
3359 
3360       IF (l_ext_table_metadata_obj IS NOT NULL) THEN
3361 
3362         -----------------------------------------------------------------
3363         -- Build list strings for the Primary Key and Data Level names --
3364         -----------------------------------------------------------------
3365         l_pk_col_names := EGO_USER_ATTRS_COMMON_PVT.Get_List_For_Table_Cols(
3366                             l_ext_table_metadata_obj.pk_column_metadata
3367                            ,NULL
3368                            ,'NAMES'
3369                           );
3370 -- bug 6345399 fetching all the dl column names
3371 --        l_dl_col_names := EGO_USER_ATTRS_COMMON_PVT.Get_List_For_Table_Cols(
3372 --                            l_ext_table_metadata_obj.data_level_metadata
3373 --                           ,NULL
3374 --                           ,'NAMES'
3375 --                          );
3376         l_dl_col_names := EGO_USER_ATTRS_COMMON_PVT.Get_All_Data_Level_PK_Names(
3377                             p_application_id  => l_attr_group_metadata_obj.APPLICATION_ID
3378                            ,p_attr_group_type => l_attr_group_metadata_obj.ATTR_GROUP_TYPE
3379                           );
3380         SELECT application_table_name
3381           INTO l_ext_table_name
3382           FROM fnd_descriptive_flexs
3383          WHERE application_id = l_attr_group_metadata_obj.application_id
3384            AND descriptive_flexfield_name = l_attr_group_metadata_obj.attr_group_type;
3385 
3386         IF FND_API.TO_BOOLEAN(EGO_USER_ATTRS_COMMON_PVT.HAS_COLUMN_IN_TABLE (p_table_name  => l_ext_table_name
3387                                                                             ,p_column_name => 'DATA_LEVEL_ID'
3388                                                                             )
3389                              ) THEN
3390           l_dl_col_names := ' DATA_LEVEL_ID, '||l_dl_col_names;
3391         END IF;
3392 -- bug 6345399 end
3393 
3394 	----------------------------------------------------
3395         -- Add trailing commas if the lists are non-empty --
3396         ----------------------------------------------------
3397         IF (LENGTH(l_pk_col_names) > 0) THEN
3401           l_dl_col_names := l_dl_col_names || ',';
3398           l_pk_col_names := l_pk_col_names || ',';
3399         END IF;
3400         IF (LENGTH(l_dl_col_names) > 0) THEN
3402         END IF;
3403 
3404         ----------------------------------------------------
3405         -- Loop through all Attributes in the Attr Group, --
3406         -- building a list of aliased Attr names          --
3407         ----------------------------------------------------
3408         l_attr_metadata_table := l_attr_group_metadata_obj.attr_metadata_table;
3409         l_curr_attr_index := l_attr_metadata_table.FIRST;
3410         WHILE (l_curr_attr_index <= l_attr_metadata_table.LAST)
3411         LOOP
3412 
3413           l_curr_attr_metadata_obj := l_attr_metadata_table(l_curr_attr_index);
3414 
3415           ----------------------------------------------------
3416           -- Add a column named with the Attribute internal --
3417           -- name and showing the Attribute internal value  --
3418           ----------------------------------------------------
3419           l_aliased_attr_names := l_aliased_attr_names ||
3420                                   l_curr_attr_metadata_obj.DATABASE_COLUMN || ' ' ||
3421                                   l_curr_attr_metadata_obj.ATTR_NAME ||',';
3422 
3423           -----------------------------------------------------
3424           -- If the Attribute has a Value Set with different --
3425           -- internal and display values, create a second    --
3426           -- column (named with the Attribute internal name  --
3427           -- plus '_DISP') to show the display value         --
3428           -----------------------------------------------------
3429           IF (l_curr_attr_metadata_obj.VALIDATION_CODE = G_INDEPENDENT_VALIDATION_CODE OR
3430               l_curr_attr_metadata_obj.VALIDATION_CODE = G_TABLE_VALIDATION_CODE) THEN
3431 
3432             ---------------------------------------
3433             -- In most cases, we do not need to  --
3434             -- worry about tokenizing VS queries --
3435             ---------------------------------------
3436             IF (l_curr_attr_metadata_obj.VS_BIND_VALUES_CODE IS NULL OR
3437                 l_curr_attr_metadata_obj.VS_BIND_VALUES_CODE = 'N') THEN
3438 
3439               l_to_char_db_col_expression := l_curr_attr_metadata_obj.DATABASE_COLUMN;
3440 
3441               ----------------------------------------------------------
3442               -- If we have an Independent Int->Disp Val query, then  --
3443               -- we will need to cast the DB column value to a string --
3444               -- (if we have a Table Int->Disp Val query, we need the --
3445               -- value in its native data type for the query to work) --
3446               ----------------------------------------------------------
3447               IF (l_curr_attr_metadata_obj.VALIDATION_CODE = G_INDEPENDENT_VALIDATION_CODE) THEN
3448 
3449                 l_to_char_db_col_expression := EGO_USER_ATTRS_COMMON_PVT.Create_DB_Col_Alias_If_Needed(l_curr_attr_metadata_obj);
3450 
3451               END IF;
3452 
3453               l_aliased_attr_names := l_aliased_attr_names || '(' ||
3454                                       l_curr_attr_metadata_obj.INT_TO_DISP_VAL_QUERY ||
3455                                       l_to_char_db_col_expression || ') ';
3456 
3457             ELSE
3458 
3459               ---------------------------------------------------------
3460               -- If, however, the Value Set is a Table VS with bind  --
3461               -- values then we need to call Tokenized_Val_Set_Query --
3462               ---------------------------------------------------------
3463 
3464               -------------------------------------------------------------------
3465               -- If we need and don't yet have it, build an array of PK column --
3466               -- names/values (in this case, though, the values are themselves --
3467               -- the PK column names, because we want Tokenized_Val_Set_Query  --
3468               -- to replace any PK tokens with the column name itself so our   --
3469               -- view will be sufficiently generalized)                        --
3470               -------------------------------------------------------------------
3471               IF (p_pk_column_name_value_pairs IS NULL) THEN
3472 
3473                 IF (l_ext_table_metadata_obj.pk_column_metadata.COUNT = 5 AND
3474                     l_ext_table_metadata_obj.pk_column_metadata(5) IS NOT NULL AND
3475                     l_ext_table_metadata_obj.pk_column_metadata(5).COL_NAME IS NOT NULL) THEN
3476                     p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3477                                                     EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME)
3478                                                    ,EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(2).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(2).COL_NAME)
3479                                                    ,EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(3).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(3).COL_NAME)
3480                                                    ,EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(4).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(4).COL_NAME)
3481                                                    ,EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(5).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(5).COL_NAME)
3482                                                   );
3486                   p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3483                 ELSIF (l_ext_table_metadata_obj.pk_column_metadata.COUNT = 4 AND
3484                        l_ext_table_metadata_obj.pk_column_metadata(4) IS NOT NULL AND
3485                        l_ext_table_metadata_obj.pk_column_metadata(4).COL_NAME IS NOT NULL) THEN
3487                                                     EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME)
3488                                                    ,EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(2).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(2).COL_NAME)
3489                                                    ,EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(3).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(3).COL_NAME)
3490                                                    ,EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(4).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(4).COL_NAME)
3491                                                   );
3492                 ELSIF (l_ext_table_metadata_obj.pk_column_metadata.COUNT = 3 AND
3493                        l_ext_table_metadata_obj.pk_column_metadata(3) IS NOT NULL AND
3494                        l_ext_table_metadata_obj.pk_column_metadata(3).COL_NAME IS NOT NULL) THEN
3495                   p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3496                                                     EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME)
3497                                                    ,EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(2).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(2).COL_NAME)
3498                                                    ,EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(3).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(3).COL_NAME)
3499                                                   );
3500                 ELSIF (l_ext_table_metadata_obj.pk_column_metadata.COUNT = 2 AND
3501                        l_ext_table_metadata_obj.pk_column_metadata(2) IS NOT NULL AND
3502                        l_ext_table_metadata_obj.pk_column_metadata(2).COL_NAME IS NOT NULL) THEN
3503                   p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3504                                                     EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME)
3505                                                    ,EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(2).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(2).COL_NAME)
3506                                                   );
3507                 ELSIF (l_ext_table_metadata_obj.pk_column_metadata.COUNT = 1 AND
3508                        l_ext_table_metadata_obj.pk_column_metadata(1) IS NOT NULL AND
3509                        l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME IS NOT NULL) THEN
3510                   p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3511                                                     EGO_COL_NAME_VALUE_PAIR_OBJ(l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME, l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME)
3512                                                   );
3513                 END IF;
3514               END IF;
3515 
3516               l_aliased_attr_names := l_aliased_attr_names || '(' ||
3517                                       EGO_USER_ATTRS_DATA_PVT.Tokenized_Val_Set_Query(
3518                                         p_attr_metadata_obj             => l_curr_attr_metadata_obj
3519                                        ,p_attr_group_metadata_obj       => l_attr_group_metadata_obj
3520                                        ,p_ext_table_metadata_obj        => l_ext_table_metadata_obj
3521                                        ,p_pk_column_name_value_pairs    => p_pk_column_name_value_pairs
3522                                        ,p_data_level_name_value_pairs   => NULL
3523                                        ,p_entity_id                     => NULL
3524                                        ,p_entity_index                  => NULL
3525                                        ,p_entity_code                   => NULL
3526                                        ,p_add_errors_to_fnd_stack       => FND_API.G_TRUE
3527                                        ,p_attr_name_value_pairs         => NULL
3528                                        ,p_is_disp_to_int_query          => FALSE
3529                                        ,p_final_bind_value              => NULL
3530                                        ,p_return_bound_sql              => TRUE
3531                                       ) || l_curr_attr_metadata_obj.DATABASE_COLUMN || ') ';
3532 
3533             END IF;
3534 
3535             -----------------------------------------------------------------
3536             -- Whichever display value query we just added (Int->Disp Val  --
3537             -- query) or Tokenized Val Set Query), we now need to alias it --
3538             -- with the Attr internal name (changed by adding '_DISP')     --
3539             -----------------------------------------------------------------
3540             l_aliased_attr_names := l_aliased_attr_names ||
3541                                     SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 24) ||
3542                                     '_DISP,';
3543 
3544           END IF;
3548           -- then we add a column containing the tokenized URL; the column's --
3545 
3546           ---------------------------------------------------------------------
3547           -- If the Attribute's INFO_1 (its Dynamic URL) value is not null,  --
3549           -- name will be the Attr internal name (changed by adding '_URL')  --
3550           ---------------------------------------------------------------------
3551           IF (l_curr_attr_metadata_obj.INFO_1 IS NOT NULL) THEN
3552 
3553             l_aliased_attr_names := l_aliased_attr_names || '(' ||
3554                                     Build_Tokenized_URL_Query(l_attr_group_metadata_obj
3555                                                              ,l_curr_attr_metadata_obj) ||
3556                                     ')' ||
3557                                     SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 24) ||
3558                                     '_URL,';
3559 
3560           END IF;
3561 
3562           ------------------------------------------------------------------------
3563           -- In case the Attribute has some UOM class attached we need to have  --
3564           -- the UOM columns too.                                               --
3565           -- <Attr_name>_UOM  : contains the base UOM code                      --
3566           -- <Attr_name>_UUOM : contains the user entered uom                   ---------
3567           -- <Attr_name>_UVAL : contains the value in converted as per the UOM entered --
3568           -------------------------------------------------------------------------------
3569           IF (l_curr_attr_metadata_obj.UNIT_OF_MEASURE_CLASS IS NOT NULL) THEN
3570 
3571             l_aliased_attr_names := l_aliased_attr_names || '  ''' || l_curr_attr_metadata_obj.UNIT_OF_MEASURE_BASE ||'''  '
3572                                                          || SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 26)||'_UOM ,';
3573 
3574             l_aliased_attr_names := l_aliased_attr_names || '  UOM_' || SUBSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,INSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,'EXT_ATTR'))
3575                                                          ||' '|| SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 25)||'_UUOM ,';
3576 
3577 
3578             l_aliased_attr_names := l_aliased_attr_names || 'NVL2('||l_curr_attr_metadata_obj.DATABASE_COLUMN||
3579                                                             '     ,NVL2( UOM_'||SUBSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,INSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,'EXT_ATTR'))||' '||
3580                                                             '           ,INV_CONVERT.INV_UM_CONVERT ( null '||                                       --ItemId
3581                                                             '                                        ,null '||                                       --precision
3582                                                             '                                        , '||l_curr_attr_metadata_obj.DATABASE_COLUMN|| --quantity
3583                                                             '                                        , '''||l_curr_attr_metadata_obj.UNIT_OF_MEASURE_BASE||''' '|| --base uom
3584                                                             '                                        , '||'UOM_'||SUBSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,INSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,'EXT_ATTR'))||' '|| --to_UOM
3585                                                             '                                        , null  '||                                     --from name
3586                                                             '                                        , null )'||                                     --to name
3587                                                             '           ,NULL)    '||
3588                                                             '     ,NULL)          '||
3589                                                             '   '||SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 25)||'_UVAL ,';
3590 
3591 /* -- It was decided to use the api INV_CONVERT.INV_UM_CONVERT for uom conversions instead of doing it in the query.
3592             l_aliased_attr_names := l_aliased_attr_names || l_curr_attr_metadata_obj.DATABASE_COLUMN
3593                                                          ||'/NVL((SELECT CONVERSION_RATE FROM MTL_UOM_CONVERSIONS '
3594                                                          ||'      WHERE UOM_CLASS = '''||l_curr_attr_metadata_obj.UNIT_OF_MEASURE_CLASS||''' '
3595                                                          ||'        AND UOM_CODE =  UOM_' || SUBSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,INSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,'EXT_ATTR'))
3596                                                          ||'        AND ROWNUM = 1),1)  '
3597                                                          ||SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 24)||'_UVAL , ';
3598 */
3599           END IF;
3600 
3601 
3602           l_curr_attr_index := l_attr_metadata_table.NEXT(l_curr_attr_index);
3603         END LOOP;
3604 
3605         ------------------------------------------------------------------
3606         -- Trim the trailing ',' from l_aliased_attr_names if necessary --
3607         ------------------------------------------------------------------
3608         IF (LENGTH(l_aliased_attr_names) > 0) THEN
3609           l_aliased_attr_names := SUBSTR(l_aliased_attr_names, 1, LENGTH(l_aliased_attr_names) - LENGTH(','));
3610         END IF;
3611 
3612         -------------------------------------------------------------------------
3613         -- Now we construct and execute our AGV DDL if the AGV Name is defined --
3617           l_token_table(1).TOKEN_NAME := 'ATTR_GROUP_DISP_NAME';
3614         -------------------------------------------------------------------------
3615         IF (l_attr_group_metadata_obj.AGV_NAME IS NULL) THEN
3616 
3618           l_token_table(1).TOKEN_VALUE := l_attr_group_metadata_obj.ATTR_GROUP_DISP_NAME;
3619           ERROR_HANDLER.Add_Error_Message(
3620             p_message_name                  => 'EGO_EF_NO_AGV_NAME_ERROR'
3621            ,p_application_id                => 'EGO'
3622            ,p_token_tbl                     => l_token_table
3623            ,p_message_type                  => FND_API.G_RET_STS_ERROR
3624            ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3625           );
3626           RAISE FND_API.G_EXC_ERROR;
3627 
3628         ELSE
3629 
3630           l_user_attrs_view_ddl :=
3631           ' CREATE OR REPLACE VIEW '||l_attr_group_metadata_obj.AGV_NAME||
3632           ' AS SELECT EXTENSION_ID, '||l_pk_col_names||l_dl_col_names||l_aliased_attr_names||
3633           ' FROM '||l_attr_group_metadata_obj.EXT_TABLE_VL_NAME ||
3634           ' WHERE attr_group_id  = ' || p_attr_group_id ;
3635 
3636           l_ddl_error_message := Execute_DDL_And_Return_Err(l_user_attrs_view_ddl);
3637 
3638           ---------------------------------------------------------------
3639           -- If something went wrong with the DDL, we report the error --
3640           ---------------------------------------------------------------
3641           IF (l_ddl_error_message IS NOT NULL) THEN
3642             IF (l_attr_group_metadata_obj IS NOT NULL) THEN
3643               l_token_table(1).TOKEN_NAME := 'ATTR_GROUP_DISP_NAME';
3644               l_token_table(1).TOKEN_VALUE := l_attr_group_metadata_obj.ATTR_GROUP_DISP_NAME;
3645             ELSE
3646               ------------------------------------------------------
3647               -- If we don't have the metadata object, we have to --
3648               -- identify the Attribute Group by its passed-in ID --
3649               ------------------------------------------------------
3650               l_token_table(1).TOKEN_NAME := 'ATTR_GROUP_DISP_NAME';
3651               l_token_table(1).TOKEN_VALUE := p_attr_group_id;
3652             END IF;
3653 
3654             -----------------------------------------------------------------
3655             -- First we tell them that something went wrong with their DDL --
3656             -----------------------------------------------------------------
3657             ERROR_HANDLER.Add_Error_Message(
3658               p_message_name                  => 'EGO_EF_AGV_DDL_ERR'
3659              ,p_application_id                => 'EGO'
3660              ,p_token_tbl                     => l_token_table
3661              ,p_message_type                  => FND_API.G_RET_STS_ERROR
3662              ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3663             );
3664 
3665             ---------------------------------------------------
3666             -- Then we show them the DDL itself, looping to  --
3667             -- pass it to ERROR_HANDLER in 200-byte segments --
3668             ---------------------------------------------------
3669             WHILE (LENGTH(l_user_attrs_view_ddl) > 0)
3670             LOOP
3671               ERROR_HANDLER.Add_Error_Message(
3672                 p_application_id                => 'EGO'
3673                ,p_message_text                  => SUBSTR(l_user_attrs_view_ddl, 1, 200)
3674                ,p_message_type                  => FND_API.G_RET_STS_ERROR
3675                ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3676               );
3677 
3678               l_user_attrs_view_ddl := SUBSTR(l_user_attrs_view_ddl, 201);
3679             END LOOP;
3680 
3681             ------------------------------------------------------------
3682             -- Then we give them the error message we got from the DB --
3683             ------------------------------------------------------------
3684             l_token_table(1).TOKEN_NAME := 'SQLERRM';
3685             l_token_table(1).TOKEN_VALUE := l_ddl_error_message;
3686             ERROR_HANDLER.Add_Error_Message(
3687               p_message_name                  => 'EGO_EF_AGV_DDL_SQLERRM'
3688              ,p_application_id                => 'EGO'
3689              ,p_token_tbl                     => l_token_table
3690              ,p_message_type                  => FND_API.G_RET_STS_ERROR
3691              ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3692             );
3693             RAISE FND_API.G_EXC_ERROR;
3694           END IF;
3695         END IF;
3696       END IF;
3697     END IF;
3698 
3699     -- Standard check of p_commit
3700     IF FND_API.To_Boolean(p_commit) THEN
3701       COMMIT WORK;
3702     END IF;
3703 
3704     x_return_status := FND_API.G_RET_STS_SUCCESS;
3705 
3706   EXCEPTION
3707     WHEN FND_API.G_EXC_ERROR THEN
3708       IF FND_API.To_Boolean(p_commit) THEN
3709         ROLLBACK TO Compile_Attr_Group_View_PUB;
3710       END IF;
3711       x_return_status := FND_API.G_RET_STS_ERROR;
3712 
3713     WHEN OTHERS THEN
3714       IF FND_API.To_Boolean(p_commit) THEN
3715         ROLLBACK TO Compile_Attr_Group_View_PUB;
3716       END IF;
3717       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3718 
3719       -- If the DDL is not null, that's probably the cause of our error --
3720       IF (l_user_attrs_view_ddl IS NOT NULL) THEN
3721 
3725         ELSE
3722         IF (l_attr_group_metadata_obj IS NOT NULL) THEN
3723           l_token_table(1).TOKEN_NAME := 'ATTR_GROUP_DISP_NAME';
3724           l_token_table(1).TOKEN_VALUE := l_attr_group_metadata_obj.ATTR_GROUP_DISP_NAME;
3726           ------------------------------------------------------
3727           -- If we don't have the metadata object, we have to --
3728           -- identify the Attribute Group by its passed-in ID --
3729           ------------------------------------------------------
3730           l_token_table(1).TOKEN_NAME := 'ATTR_GROUP_DISP_NAME';
3731           l_token_table(1).TOKEN_VALUE := p_attr_group_id;
3732         END IF;
3733 
3734         -----------------------------------------------------------------
3735         -- First we tell them that something went wrong with their DDL --
3736         -----------------------------------------------------------------
3737         ERROR_HANDLER.Add_Error_Message(
3738           p_message_name                  => 'EGO_EF_AGV_DDL_ERR'
3739          ,p_application_id                => 'EGO'
3740          ,p_token_tbl                     => l_token_table
3741          ,p_message_type                  => FND_API.G_RET_STS_ERROR
3742          ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3743         );
3744 
3745         ---------------------------------------------------
3746         -- Then we show them the DDL itself, looping to  --
3747         -- pass it to ERROR_HANDLER in 100-byte segments --
3748         ---------------------------------------------------
3749         WHILE (LENGTH(l_user_attrs_view_ddl) > 0)
3750         LOOP
3751           ERROR_HANDLER.Add_Error_Message(
3752             p_application_id                => 'EGO'
3753            ,p_message_text                  => SUBSTR(l_user_attrs_view_ddl, 1, 100)
3754            ,p_message_type                  => FND_API.G_RET_STS_ERROR
3755            ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3756           );
3757 
3758           l_user_attrs_view_ddl := SUBSTR(l_user_attrs_view_ddl, 101);
3759         END LOOP;
3760 
3761       ELSE
3762 
3763         l_token_table(1).TOKEN_NAME := 'PKG_NAME';
3764         l_token_table(1).TOKEN_VALUE := G_PKG_NAME;
3765         l_token_table(2).TOKEN_NAME := 'API_NAME';
3766         l_token_table(2).TOKEN_VALUE := l_api_name;
3767         l_token_table(3).TOKEN_NAME := 'SQL_ERR_MSG';
3768         l_token_table(3).TOKEN_VALUE := SQLERRM;
3769 
3770         ERROR_HANDLER.Add_Error_Message(
3771           p_message_name              => 'EGO_PLSQL_ERR'
3772          ,p_application_id            => 'EGO'
3773          ,p_token_tbl                 => l_token_table
3774          ,p_message_type              => FND_API.G_RET_STS_ERROR
3775          ,p_addto_fnd_stack           => 'Y'
3776         );
3777 
3778       END IF;
3779 
3780 END Compile_Attr_Group_View;
3781 
3782 ---------------------------------------------------------------------------
3783 
3784 PROCEDURE Compile_Attr_Group_Views (
3785         ERRBUF                          OUT NOCOPY VARCHAR2
3786        ,RETCODE                         OUT NOCOPY VARCHAR2
3787        ,p_attr_group_id_list            IN   VARCHAR2
3788        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
3789        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
3790 ) IS
3791 
3792     l_ag_id_start_index      NUMBER := 1;
3793     l_ag_id_end_index        NUMBER;
3794     l_curr_ag_id             VARCHAR2(30);
3795     l_return_status          VARCHAR2(1);
3796     l_errorcode              NUMBER;
3797     l_msg_count              NUMBER;
3798     l_msg_data               VARCHAR2(1000);
3799 
3800   BEGIN
3801 
3802     -- Initialize message list if caller asked us to do so
3803     IF FND_API.To_Boolean(p_init_msg_list) THEN
3804       FND_MSG_PUB.Initialize;
3805       ERROR_HANDLER.Initialize;
3806     END IF;
3807 
3808     IF (p_attr_group_id_list IS NOT NULL) THEN
3809 
3810       WHILE (l_ag_id_start_index > 0)
3811       LOOP
3812 
3813         l_ag_id_end_index := INSTR(p_attr_group_id_list, ',', l_ag_id_start_index);
3814         IF (l_ag_id_end_index = 0) THEN
3815           l_curr_ag_id := TRIM(SUBSTR(p_attr_group_id_list, l_ag_id_start_index));
3816         ELSE
3817           l_curr_ag_id := TRIM(SUBSTR(p_attr_group_id_list, l_ag_id_start_index, l_ag_id_end_index - l_ag_id_start_index));
3818         END IF;
3819 
3820         --------------------------------------------------------
3821         -- Call the API for each Attribute Group in the list; --
3822         -- if any call fails, continue with the rest of them  --
3823         --------------------------------------------------------
3824         Compile_Attr_Group_View(
3825           p_api_version                   => 1.0
3826          ,p_attr_group_id                 => l_curr_ag_id
3827          ,p_init_msg_list                 => FND_API.G_FALSE
3828          ,p_commit                        => p_commit
3829          ,x_return_status                 => l_return_status
3830          ,x_errorcode                     => l_errorcode
3831          ,x_msg_count                     => l_msg_count
3832          ,x_msg_data                      => l_msg_data
3833         );
3834 
3835         ----------------------------------------------
3836         -- Update the start index for the next loop --
3837         ----------------------------------------------
3838         l_ag_id_start_index := l_ag_id_end_index;
3842       END LOOP;
3839         IF (l_ag_id_start_index > 0) THEN
3840           l_ag_id_start_index := l_ag_id_start_index + 1;
3841         END IF;
3843     END IF;
3844 
3845     --------------------------------------------------------
3846     -- Find out if any error messages were logged for any --
3847     -- of the Attribute Groups for which we compiled AGVs --
3848     --------------------------------------------------------
3849     l_msg_count := ERROR_HANDLER.Get_Message_Count();
3850     IF (l_msg_count = 0) THEN
3851       RETCODE := FND_API.G_RET_STS_SUCCESS;
3852     ELSE
3853       RETCODE := FND_API.G_RET_STS_ERROR;
3854       IF (l_msg_count = 1) THEN
3855         DECLARE
3856           l_dummy_entity_index     NUMBER;
3857           l_dummy_entity_id        VARCHAR2(60);
3858           l_dummy_message_type     VARCHAR2(1);
3859         BEGIN
3860           ERROR_HANDLER.Get_Message(x_message_text => ERRBUF
3861                                    ,x_entity_index => l_dummy_entity_index
3862                                    ,x_entity_id    => l_dummy_entity_id
3863                                    ,x_message_type => l_dummy_message_type);
3864         END;
3865       ELSE
3866         ERRBUF := 'EGO_CHECK_FND_STACK_FOR_ERRS';
3867       END IF;
3868 
3869       ERROR_HANDLER.Log_Error(
3870         p_write_err_to_inttable => 'Y'
3871        ,p_write_err_to_conclog  => 'Y'
3872       );
3873     END IF;
3874 
3875 END Compile_Attr_Group_Views;
3876 
3877 ----------------------------------------------------------------------
3878 
3879 
3880 FUNCTION Does_Attr_Have_Data (
3881         p_application_id                IN   NUMBER     DEFAULT NULL
3882        ,p_attr_group_type               IN   VARCHAR2   DEFAULT NULL
3883        ,p_attr_group_name               IN   VARCHAR2   DEFAULT NULL
3884        ,p_attr_name                     IN   VARCHAR2   DEFAULT NULL
3885        ,p_attr_id                       IN   NUMBER     DEFAULT NULL
3886 )
3887 RETURN VARCHAR2
3888 IS
3889 
3890     l_api_name               CONSTANT VARCHAR2(30) := 'Does_Attr_Have_Data';
3891 
3892     l_dynamic_sql            VARCHAR2(17000);
3893     l_attr_group_id          NUMBER;
3894     l_ext_table_vl_name      VARCHAR2(30);
3895     l_curr_db_column         VARCHAR2(30);
3896     l_row_count              NUMBER;
3897     l_attr_data_exist        VARCHAR2(1) := FND_API.G_FALSE;
3898     l_application_id         VARCHAR2(3);
3899     l_attr_group_type        VARCHAR2(80);
3900     l_attr_group_name        VARCHAR2(80);
3901     l_attr_name              VARCHAR2(80);
3902 
3903   BEGIN
3904 
3905     if (p_attr_id IS NOT NULL) then
3906       SELECT USGS.APPLICATION_ID,
3907              USGS.DESCRIPTIVE_FLEXFIELD_NAME,
3908              USGS.DESCRIPTIVE_FLEX_CONTEXT_CODE,
3909              USGS.END_USER_COLUMN_NAME,
3910              USGS.APPLICATION_COLUMN_NAME
3911       INTO
3912            l_application_id
3913           ,l_attr_group_type
3914           ,l_attr_group_name
3915           ,l_attr_name
3916           ,l_curr_db_column
3917       FROM
3918           FND_DESCR_FLEX_COLUMN_USAGES USGS,
3919           EGO_FND_DF_COL_USGS_EXT EXT
3920       WHERE
3921           USGS.APPLICATION_ID = EXT.APPLICATION_ID
3922       AND USGS.DESCRIPTIVE_FLEXFIELD_NAME = EXT.DESCRIPTIVE_FLEXFIELD_NAME
3923       AND USGS.DESCRIPTIVE_FLEX_CONTEXT_CODE = EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE
3924       AND USGS.APPLICATION_COLUMN_NAME = EXT.APPLICATION_COLUMN_NAME
3925       AND EXT.ATTR_ID = p_attr_id;
3926 
3927     else
3928 
3929       l_application_id   := p_application_id;
3930       l_attr_group_type  := p_attr_group_type;
3931       l_attr_group_name  := p_attr_group_name;
3932       l_attr_name        := p_attr_name;
3933 
3934       SELECT APPLICATION_COLUMN_NAME
3935       INTO l_curr_db_column
3936       FROM FND_DESCR_FLEX_COLUMN_USAGES EXT
3937       WHERE
3938            EXT.APPLICATION_ID = l_application_id
3939        AND EXT.DESCRIPTIVE_FLEXFIELD_NAME = l_attr_group_type
3940        AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = l_attr_group_name
3941        AND EXT.END_USER_COLUMN_NAME = l_attr_name;
3942 
3943 
3944     end if;
3945 
3946 
3947     -----------------------------------------------------------------------
3948     -- First, get the Object and Attr Group IDs and Extension Table name --
3949     -----------------------------------------------------------------------
3950     SELECT EXT.ATTR_GROUP_ID
3951           ,NVL(FLX_EXT.APPLICATION_VL_NAME, FLX.APPLICATION_TABLE_NAME)
3952       INTO l_attr_group_id
3953           ,l_ext_table_vl_name
3954       FROM EGO_OBJECT_EXT_TABLES_B    OBJ
3955           ,EGO_FND_DSC_FLX_CTX_EXT    EXT
3956           ,FND_DESCRIPTIVE_FLEXS      FLX
3957           ,EGO_FND_DESC_FLEXS_EXT     FLX_EXT
3958      WHERE OBJ.EXT_TABLE_NAME = FLX.APPLICATION_TABLE_NAME
3959        AND FLX.APPLICATION_ID = l_application_id
3960        AND FLX.APPLICATION_ID = FLX_EXT.APPLICATION_ID(+)
3961        AND FLX.APPLICATION_ID = EXT.APPLICATION_ID
3962        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = l_attr_group_type
3963        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = FLX_EXT.DESCRIPTIVE_FLEXFIELD_NAME(+)
3964        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = EXT.DESCRIPTIVE_FLEXFIELD_NAME
3965        AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = l_attr_group_name;
3966 
3967     ---------------------------------------------------------------------------
3971                        ' FROM ' || l_ext_table_vl_name ||
3968     -- Now get the count of rows from the table where the attr_value is null --
3969     ---------------------------------------------------------------------------
3970     l_dynamic_sql := ' SELECT COUNT(1)' ||
3972                       ' WHERE ATTR_GROUP_ID = :1' ||
3973                       ' AND ' || l_curr_db_column || ' is not null ';
3974 
3975     EXECUTE IMMEDIATE l_dynamic_sql INTO l_row_count USING l_attr_group_id;
3976 
3977     IF (l_row_count > 0) THEN
3978       l_attr_data_exist := FND_API.G_TRUE;
3979     END IF;
3980 
3981     RETURN l_attr_data_exist;
3982 
3983 END;
3984 
3985 ----------------------------------------------------------------------
3986 
3987 PROCEDURE Validate_Unique_Key_Attrs (
3988         p_application_id                IN   NUMBER
3989        ,p_attr_group_type               IN   VARCHAR2
3990        ,p_attr_group_name               IN   VARCHAR2
3991        ,p_id_list                       IN   VARCHAR2
3992        ,x_is_valid_key                  OUT NOCOPY VARCHAR2
3993 ) IS
3994 
3995     l_api_name               CONSTANT VARCHAR2(30) := 'Validate_Unique_Key_Attrs';
3996 
3997     l_dynamic_sql            VARCHAR2(17000);
3998     l_attr_group_id          NUMBER;
3999     l_ext_table_vl_name      VARCHAR2(30);
4000     l_object_id              NUMBER;
4001     l_ext_table_metadata_obj EGO_EXT_TABLE_METADATA_OBJ;
4002     l_curr_db_column         VARCHAR2(15);
4003     l_column_list            VARCHAR2(15000);
4004     l_dl_col_names           VARCHAR2(180);
4005     l_uk_count               NUMBER;
4006 
4007     TYPE DYNAMIC_CUR IS REF CURSOR;
4008     l_dynamic_cursor         DYNAMIC_CUR;
4009     l_tl_table_exists        VARCHAR2(1);
4010 
4011   BEGIN
4012 
4013     -----------------------------------------------------------------------
4014     -- First, get the Object and Attr Group IDs and Extension Table name --
4015     -----------------------------------------------------------------------
4016     SELECT OBJ.OBJECT_ID
4017           ,EXT.ATTR_GROUP_ID
4018           ,NVL(FLX_EXT.APPLICATION_VL_NAME, FLX.APPLICATION_TABLE_NAME)
4019           ,DECODE(FLX_EXT.APPLICATION_TL_TABLE_NAME, NULL, 'N', 'Y')
4020       INTO l_object_id
4021           ,l_attr_group_id
4022           ,l_ext_table_vl_name
4023           ,l_tl_table_exists
4024       FROM EGO_OBJECT_EXT_TABLES_B    OBJ
4025           ,EGO_FND_DSC_FLX_CTX_EXT    EXT
4026           ,FND_DESCRIPTIVE_FLEXS      FLX
4027           ,EGO_FND_DESC_FLEXS_EXT     FLX_EXT
4028      WHERE OBJ.EXT_TABLE_NAME = FLX.APPLICATION_TABLE_NAME
4029        AND FLX.APPLICATION_ID = p_application_id
4030        AND FLX.APPLICATION_ID = FLX_EXT.APPLICATION_ID(+)
4031        AND FLX.APPLICATION_ID = EXT.APPLICATION_ID
4032        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
4033        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = FLX_EXT.DESCRIPTIVE_FLEXFIELD_NAME(+)
4034        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = EXT.DESCRIPTIVE_FLEXFIELD_NAME
4035        AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
4036 
4037     -----------------------------------------------------
4038     -- Second, get the Extension Table metadata object --
4039     -----------------------------------------------------
4040     l_ext_table_metadata_obj := EGO_USER_ATTRS_COMMON_PVT.Get_Ext_Table_Metadata(l_object_id);
4041 
4042     --------------------------------------------------------------
4043     -- Next, start a list of columns on which to use 'Group By' --
4044     --------------------------------------------------------------
4045     l_column_list := EGO_USER_ATTRS_COMMON_PVT.Get_List_For_Table_Cols(
4046                        l_ext_table_metadata_obj.pk_column_metadata
4047                       ,NULL
4048                       ,'NAMES'
4049                      ) || ',';
4050     IF (l_tl_table_exists = 'Y') THEN
4051       l_column_list := l_column_list || 'LANGUAGE,';
4052     END IF;
4053     l_dl_col_names := EGO_USER_ATTRS_COMMON_PVT.Get_List_For_Table_Cols(
4054                         l_ext_table_metadata_obj.data_level_metadata
4055                        ,NULL
4056                        ,'NAMES'
4057                       );
4058     IF (LENGTH(l_dl_col_names) > 0) THEN
4059       l_column_list := l_column_list || l_dl_col_names || ',';
4060     END IF;
4061 
4062     -----------------------------------------------------------
4063     -- Next, use the Attribute IDs to get a list of database --
4067                        ' FROM EGO_FND_DF_COL_USGS_EXT' ||
4064     -- column names to add to the current 'Group By' list    --
4065     -----------------------------------------------------------
4066     l_dynamic_sql := ' SELECT APPLICATION_COLUMN_NAME' ||
4068                       ' WHERE ATTR_ID IN ('||p_id_list||') ';
4069 
4070     OPEN l_dynamic_cursor FOR l_dynamic_sql;
4071     LOOP
4072       FETCH l_dynamic_cursor INTO l_curr_db_column;
4073       EXIT WHEN l_dynamic_cursor%NOTFOUND;
4074 
4075       l_column_list := l_column_list || l_curr_db_column || ',';
4076 
4077     END LOOP;
4078     CLOSE l_dynamic_cursor;
4079 
4080     ----------------------------------------------
4081     -- Trim the trailing ',' from l_column_list --
4082     ----------------------------------------------
4083     l_column_list := SUBSTR(l_column_list, 1, LENGTH(l_column_list) - LENGTH(','));
4084 
4085     ------------------------------------------------------------------------
4086     -- Now find out whether the proposed Unique Key is currently violated --
4087     ------------------------------------------------------------------------
4088     l_dynamic_sql := ' SELECT COUNT(1)' ||
4089                        ' FROM ' || l_ext_table_vl_name ||
4090                       ' WHERE ATTR_GROUP_ID = :1' ||
4091                       ' GROUP BY ' || l_column_list;
4092 
4093     OPEN l_dynamic_cursor FOR l_dynamic_sql USING l_attr_group_id;
4094     LOOP
4095       FETCH l_dynamic_cursor INTO l_uk_count;
4096       EXIT WHEN (l_dynamic_cursor%NOTFOUND OR
4097                  x_is_valid_key = FND_API.G_FALSE);
4098 
4099         IF (l_uk_count > 1) THEN
4100           x_is_valid_key := FND_API.G_FALSE;
4101         END IF;
4102 
4103     END LOOP;
4104     CLOSE l_dynamic_cursor;
4105 
4106     ------------------------------------------------------------------------------
4107     -- If we got this far without adding a value to x_is_valid_key, then there  --
4108     -- are no rows in the extension tables that violate the proposed Unique Key --
4109     ------------------------------------------------------------------------------
4110     IF (x_is_valid_key IS NULL) THEN
4111       x_is_valid_key := FND_API.G_TRUE;
4112     END IF;
4113 
4114   EXCEPTION
4115     WHEN OTHERS THEN
4116 
4117 /***
4118 Dylan wonders: did I write this?  If so, why?  If not, who did...and why?
4119 Maybe it was for PA integration...?
4120 ***/
4121       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4122         FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
4123       END IF;
4124 
4125 END Validate_Unique_Key_Attrs;
4126 
4127 ----------------------------------------------------------------------
4128                     --------------------------
4129                     -- Data Level APIs --
4130                     --------------------------
4131 
4132 PROCEDURE  Sync_Data_Level (
4133           p_api_version           IN  NUMBER
4134          ,p_init_msg_list         IN  VARCHAR2
4135          ,p_commit                IN  VARCHAR2
4136          ,p_transaction_type      IN  VARCHAR2
4137          ,p_application_id        IN  NUMBER
4138          ,p_attr_group_type       IN  VARCHAR2
4139          ,p_data_level_name       IN  VARCHAR2
4140          ,p_user_data_level_name  IN  VARCHAR2
4141          ,p_pk1_column_name       IN  VARCHAR2
4142          ,p_pk1_column_type       IN  VARCHAR2
4143          ,p_pk2_column_name       IN  VARCHAR2
4144          ,p_pk2_column_type       IN  VARCHAR2
4145          ,p_pk3_column_name       IN  VARCHAR2
4146          ,p_pk3_column_type       IN  VARCHAR2
4147          ,p_pk4_column_name       IN  VARCHAR2
4148          ,p_pk4_column_type       IN  VARCHAR2
4149          ,p_pk5_column_name       IN  VARCHAR2
4150          ,p_pk5_column_type       IN  VARCHAR2
4154          ,p_enable_pre_event      IN  VARCHAR2
4151          ,p_enable_defaulting     IN  VARCHAR2
4152          ,p_enable_view_priv      IN  VARCHAR2
4153          ,p_enable_edit_priv      IN  VARCHAR2
4155          ,p_enable_post_event     IN  VARCHAR2
4156          ,p_last_updated_by       IN  VARCHAR2
4157          ,p_last_update_date      IN  DATE
4158          ,p_is_nls_mode           IN  VARCHAR2
4159          ,x_data_level_id         IN OUT NOCOPY NUMBER
4160          ,x_return_status         OUT NOCOPY VARCHAR2
4161          ,x_msg_count             OUT NOCOPY NUMBER
4162          ,x_msg_data              OUT NOCOPY VARCHAR2
4163          ) IS
4164 
4165   l_api_version       NUMBER;
4166   l_api_name          VARCHAR2(30);
4167   l_msg_data          VARCHAR2(4000);
4168   l_data_level_id     NUMBER;
4169   l_enable_pre_event  VARCHAR2(1);
4170   l_enable_post_event VARCHAR2(1);
4171 
4172 BEGIN
4173 
4174   l_api_version := 1.0;
4175   l_api_name    := 'SYNC_DATA_LEVEL';
4176   l_msg_data    := NULL;
4177   code_debug(l_api_name ||' Start ');
4178 
4179   -- Initialize message list even though we don't currently use it
4180   IF FND_API.To_Boolean(p_init_msg_list) THEN
4181     FND_MSG_PUB.Initialize;
4182   END IF;
4183 
4184   -- Check for call compatibility
4185   IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
4186                                       l_api_name, G_PKG_NAME)
4187   THEN
4188     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4189   END IF;
4190 
4191   -- Standard start of API savepoint
4192   IF FND_API.TO_BOOLEAN(p_commit) THEN
4193     SAVEPOINT SYNC_DATA_LEVEL;
4194   END IF;
4195 
4196   IF (p_transaction_type IS NULL) THEN
4197     fnd_message.set_name(G_APP_NAME, 'EGO_TRANSACTION_TYPE');
4198     l_msg_data := fnd_msg_pub.get();
4199   ELSIF p_application_id IS NULL THEN
4200     fnd_message.set_name(G_APP_NAME, 'EGO_EF_APPLICATION_ID');
4201     l_msg_data := fnd_msg_pub.get();
4202   ELSIF p_attr_group_type IS NULL THEN
4203     fnd_message.set_name(G_APP_NAME, 'EGO_EF_ATTR_GROUP_TYPE');
4204     l_msg_data := fnd_msg_pub.get();
4205   ELSIF p_data_level_name IS NULL THEN
4206     fnd_message.set_name(G_APP_NAME, 'EGO_EF_DATA_LEVEL');
4207     l_msg_data := fnd_msg_pub.get();
4208   END IF;
4209 
4210   IF l_msg_data IS NOT NULL THEN
4211     fnd_message.set_name(G_APP_NAME,'EGO_PKG_MAND_VALUES_MISS1');
4212     fnd_message.set_token('PACKAGE', G_PKG_NAME ||'.'|| l_api_name);
4213     fnd_message.set_token('VALUE', l_msg_data);
4214     FND_MSG_PUB.Add;
4215     RAISE FND_API.G_EXC_ERROR;
4216   END IF;
4217   code_debug(l_api_name ||' Mandatory param validation complete '||p_transaction_type);
4218 
4219   BEGIN
4220     SELECT NVL2(pre_business_event_name,NVL(p_enable_pre_event,'N'),'N'),
4221            NVL2(business_event_name,NVL(p_enable_post_event,'N'),'N')
4222     INTO l_enable_pre_event, l_enable_post_event
4223     FROM EGO_FND_DESC_FLEXS_EXT
4224     WHERE application_id = p_application_id
4225       AND descriptive_flexfield_name = p_attr_group_type;
4226   EXCEPTION
4227     WHEN NO_DATA_FOUND THEN
4228       l_enable_pre_event := 'N';
4229       l_enable_post_event := 'N';
4230     WHEN OTHERS THEN
4231       RAISE;
4232   END;
4233 
4234   IF p_transaction_type = 'CREATE' THEN
4235     SELECT max(data_level_id)
4236     INTO l_data_level_id
4237     FROM ego_data_level_b
4238     WHERE application_id = p_application_id;
4239 
4240     IF l_data_level_id IS NULL THEN
4241       l_data_level_id := p_application_id * 100 + 1;
4242     ELSE
4243       l_data_level_id := l_data_level_id + 1;
4244     END IF;
4245 
4246     IF l_data_level_id = ((p_application_id+1) * 100) THEN
4247       fnd_message.set_name(G_APP_NAME, 'EGO_EF_DATA_LEVEL_LIMIT');
4248       FND_MSG_PUB.Add;
4249       RAISE FND_API.G_EXC_ERROR;
4250     END IF;
4251 
4252     code_debug(l_api_name ||' Data level id being used in insert: '||l_data_level_id);
4253 
4254     INSERT INTO EGO_DATA_LEVEL_B
4255       (data_level_id
4256       ,application_id
4257       ,attr_group_type
4258       ,data_level_name
4259       ,pk1_column_name
4260       ,pk1_column_type
4261       ,pk2_column_name
4262       ,pk2_column_type
4263       ,pk3_column_name
4264       ,pk3_column_type
4265       ,pk4_column_name
4266       ,pk4_column_type
4267       ,pk5_column_name
4268       ,pk5_column_type
4269       ,enable_defaulting
4270       ,enable_view_priv
4271       ,enable_edit_priv
4272       ,enable_pre_event
4273       ,enable_post_event
4274       ,created_by
4275       ,creation_date
4276       ,last_updated_by
4277       ,last_update_date
4278       ,last_update_login
4279       )
4280     values
4281       (l_data_level_id
4282       ,p_application_id
4283       ,p_attr_group_type
4284       ,p_data_level_name
4285       ,p_pk1_column_name
4286       ,p_pk1_column_type
4287       ,p_pk2_column_name
4288       ,p_pk2_column_type
4289       ,p_pk3_column_name
4290       ,p_pk3_column_type
4291       ,p_pk4_column_name
4292       ,p_pk4_column_type
4293       ,p_pk5_column_name
4294       ,p_pk5_column_type
4295       ,p_enable_defaulting
4296       ,p_enable_view_priv
4297       ,p_enable_edit_priv
4298       ,l_enable_pre_event
4302       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4299       ,l_enable_post_event
4300       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4301       ,NVL(p_last_update_date, SYSDATE)
4303       ,NVL(p_last_update_date, SYSDATE)
4304       ,G_CURRENT_LOGIN_ID
4305       );
4306 
4307     INSERT INTO EGO_DATA_LEVEL_TL
4308       (data_level_id
4309       ,user_data_level_name
4310       ,language
4311       ,source_lang
4312       ,created_by
4313       ,creation_date
4314       ,last_updated_by
4315       ,last_update_date
4316       ,last_update_login
4317       )
4318     SELECT
4319        l_data_level_id
4320       ,NVL(p_user_data_level_name, p_data_level_name)
4321       ,l.language_code
4322       ,USERENV('LANG')
4323       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4324       ,NVL(p_last_update_date, SYSDATE)
4325       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4326       ,NVL(p_last_update_date, SYSDATE)
4327       ,G_CURRENT_LOGIN_ID
4328     FROM FND_LANGUAGES L
4329     WHERE L.INSTALLED_FLAG in ('I', 'B');
4330 
4331   ELSIF p_transaction_type = 'UPDATE' THEN
4332     SELECT data_level_id
4333       INTO l_data_level_id
4334       FROM ego_data_level_b
4335      WHERE application_id = p_application_id
4336        AND attr_group_type = p_attr_group_type
4337        AND data_level_name = p_data_level_name;
4338     code_debug(l_api_name ||' Data level id being used in update: '||l_data_level_id);
4339 
4340     IF x_data_level_id IS NOT NULL AND x_data_level_id <> l_data_level_id THEN
4341       fnd_message.set_name(G_APP_NAME, 'EGO_EF_INVALID_DATA_LEVEL');
4342       FND_MSG_PUB.Add;
4343       RAISE FND_API.G_EXC_ERROR;
4344     END IF;
4345     UPDATE EGO_DATA_LEVEL_TL
4346        SET user_data_level_name = NVL(p_user_data_level_name, p_data_level_name)
4347           ,source_lang = userenv('LANG')             -- Bug 6964013
4348           ,last_updated_by    = NVL(p_last_updated_by, G_CURRENT_USER_ID)
4349           ,last_update_date   = NVL(p_last_update_date, SYSDATE)
4350           ,last_update_login  = G_CURRENT_LOGIN_ID
4351      WHERE data_level_id = l_data_level_id
4352        AND USERENV('LANG') in (LANGUAGE , SOURCE_LANG);
4353 
4354     IF NOT FND_API.to_boolean(p_is_nls_mode) THEN
4355       UPDATE EGO_DATA_LEVEL_B
4356          SET pk1_column_name   = p_pk1_column_name
4357             ,pk1_column_type   = p_pk2_column_type
4358             ,pk2_column_name   = p_pk2_column_name
4359             ,pk2_column_type   = p_pk2_column_type
4360             ,pk3_column_name   = p_pk3_column_name
4361             ,pk3_column_type   = p_pk3_column_type
4362             ,pk4_column_name   = p_pk4_column_name
4363             ,pk4_column_type   = p_pk4_column_type
4364             ,pk5_column_name   = p_pk5_column_name
4365             ,pk5_column_type   = p_pk5_column_type
4366             ,enable_defaulting = p_enable_defaulting
4367             ,enable_view_priv  = p_enable_view_priv
4368             ,enable_edit_priv  = p_enable_edit_priv
4369             ,enable_pre_event  = l_enable_pre_event
4370             ,enable_post_event = l_enable_post_event
4371             ,last_updated_by   = NVL(p_last_updated_by, G_CURRENT_USER_ID)
4372             ,last_update_date  = NVL(p_last_update_date, SYSDATE)
4373             ,last_update_login = G_CURRENT_LOGIN_ID
4374        WHERE data_level_id = l_data_level_id;
4375     END IF;
4376   END IF;
4377 
4378   IF FND_API.TO_BOOLEAN(p_commit) THEN
4379     COMMIT WORK;
4380   END IF;
4381   x_data_level_id := l_data_level_id;
4382   x_return_status := FND_API.G_RET_STS_SUCCESS;
4383   code_debug(l_api_name ||' Done ');
4384 
4385 EXCEPTION
4386   WHEN FND_API.G_EXC_ERROR THEN
4387     code_debug(l_api_name ||' Exception -  FND_API.G_EXC_ERROR '||x_msg_data);
4388     IF FND_API.TO_BOOLEAN(p_commit) THEN
4389       ROLLBACK to SYNC_DATA_LEVEL;
4390     END IF;
4391     FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
4392                              ,p_count   => x_msg_count
4393                              ,p_data    => x_msg_data);
4394     x_return_status := FND_API.G_RET_STS_ERROR;
4395 
4396   WHEN OTHERS THEN
4397     code_debug(l_api_name ||' Exception - Others '||SQLERRM);
4398     IF FND_API.TO_BOOLEAN(p_commit) THEN
4399       ROLLBACK to SYNC_DATA_LEVEL;
4400     END IF;
4401     x_return_status := FND_API.G_RET_STS_ERROR;
4402 
4403 END Sync_Data_Level;
4404 ----------------------------------------------------------------------
4405 
4406 ----------------------------------------------------------------------
4407                   ---------------------------------
4408                   -- Data Level Association APIs --
4409                   ---------------------------------
4410 
4411 PROCEDURE  Sync_dl_assoc (
4412         p_api_version          IN  NUMBER
4413        ,p_init_msg_list        IN  VARCHAR2
4414        ,p_commit               IN  VARCHAR2
4415        ,p_transaction_type     IN  VARCHAR2
4416        ,p_attr_group_id        IN  NUMBER
4417        ,p_application_id       IN  NUMBER
4418        ,p_attr_group_type      IN  VARCHAR2
4419        ,p_attr_group_name      IN  VARCHAR2
4420        ,p_data_level_id        IN  NUMBER
4421        ,p_data_level_name      IN  VARCHAR2
4422        ,p_defaulting           IN  VARCHAR2
4423        ,p_defaulting_name      IN  VARCHAR2
4424        ,p_view_priv_id         IN  NUMBER
4425        ,p_view_priv_name       IN  VARCHAR2
4429        ,p_user_edit_priv_name  IN  VARCHAR2
4426        ,p_user_view_priv_name  IN  VARCHAR2
4427        ,p_edit_priv_id         IN  NUMBER
4428        ,p_edit_priv_name       IN  VARCHAR2
4430        ,p_raise_pre_event      IN  VARCHAR2
4431        ,p_raise_post_event     IN  VARCHAR2
4432        ,p_last_updated_by      IN  VARCHAR2
4433        ,p_last_update_date     IN  DATE
4434        ,x_return_status        OUT NOCOPY VARCHAR2
4435        ,x_msg_count            OUT NOCOPY NUMBER
4436        ,x_msg_data             OUT NOCOPY VARCHAR2
4437        ) IS
4438 
4439   l_api_version       NUMBER;
4440   l_api_name          VARCHAR2(30);
4441   l_msg_data          VARCHAR2(4000);
4442   l_attr_group_id     NUMBER;
4443   l_defaulting        VARCHAR2(1);
4444   l_view_priv_id      NUMBER;
4445   l_edit_priv_id      NUMBER;
4446   l_raise_pre_event   VARCHAR2(1);
4447   l_raise_post_event  VARCHAR2(1);
4448   l_data_level_rec    ego_data_level_b%ROWTYPE;
4449   l_msg_name          VARCHAR2(30);
4450 BEGIN
4451 
4452   l_api_version := 1.0;
4453   l_api_name    := 'SYNC_DL_ASSOC';
4454   l_msg_data    := NULL;
4455   l_msg_name    := 'EGO_IPI_INVALID_VALUE';
4456   code_debug(l_api_name ||' Start ');
4457 
4458   -- Initialize message list even though we don't currently use it
4459   IF FND_API.To_Boolean(p_init_msg_list) THEN
4460     FND_MSG_PUB.Initialize;
4461   END IF;
4462 
4463   -- Check for call compatibility
4464   IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
4465                                       l_api_name, G_PKG_NAME)
4466   THEN
4467     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4468   END IF;
4469 
4470   -- Standard start of API savepoint
4471   IF FND_API.TO_BOOLEAN(p_commit) THEN
4472     SAVEPOINT SYNC_DL_ASSOC;
4473   END IF;
4474 
4475   IF (p_transaction_type IS NULL) THEN
4476     fnd_message.set_name(G_APP_NAME, 'EGO_TRANSACTION_TYPE');
4477     l_msg_data := fnd_msg_pub.get();
4478   ELSIF p_attr_group_id   IS NULL AND
4479         p_application_id  IS NULL AND
4480         p_attr_group_type  IS NULL AND
4481         p_attr_group_name  IS NULL THEN
4482     fnd_message.set_name(G_APP_NAME, 'EGO_EF_ATTR_GRP');
4483     l_msg_data := fnd_msg_pub.get();
4484   ELSIF p_data_level_id IS NULL AND
4485         p_data_level_name IS NULL THEN
4486     fnd_message.set_name(G_APP_NAME, 'EGO_EF_DATA_LEVEL');
4487     l_msg_data := fnd_msg_pub.get();
4488   END IF;
4489 
4490   IF l_msg_data IS NOT NULL THEN
4491     fnd_message.set_name(G_APP_NAME,'EGO_PKG_MAND_VALUES_MISS1');
4492     fnd_message.set_token('PACKAGE', G_PKG_NAME ||'.'|| l_api_name);
4493     fnd_message.set_token('VALUE', l_msg_data);
4494     FND_MSG_PUB.Add;
4495     RAISE FND_API.G_EXC_ERROR;
4496   END IF;
4497   code_debug(l_api_name ||' Mandatory param validation complete '||p_transaction_type);
4498 
4499   -- attr group check
4500   BEGIN
4501     IF p_attr_group_id IS NULL THEN
4502       SELECT attr_group_id
4503       INTO l_attr_group_id
4504       FROM ego_fnd_dsc_flx_ctx_ext
4505       WHERE application_id  = p_application_id
4506         AND descriptive_flexfield_name = p_attr_group_type
4507         AND descriptive_flex_context_code = p_attr_group_name;
4508     ELSE
4509       SELECT attr_group_id
4510       INTO l_attr_group_id
4511       FROM ego_fnd_dsc_flx_ctx_ext
4512       WHERE attr_group_id = p_attr_group_id;
4513     END IF;
4514     code_debug(l_api_name ||' Attr Group Id '||l_attr_group_id);
4515   EXCEPTION
4516     WHEN NO_DATA_FOUND THEN
4517       FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4518       IF p_attr_group_id IS NULL THEN
4519         FND_MESSAGE.Set_Token('NAME','Attribute Group ' );
4520         FND_MESSAGE.Set_Token('VALUE',p_attr_group_type||' - '||p_attr_group_name );
4521       ELSE
4522         FND_MESSAGE.Set_Token('NAME','Attribute Id' );
4523         FND_MESSAGE.Set_Token('VALUE',l_attr_group_id);
4524       END IF;
4525       FND_MSG_PUB.Add;
4526       RAISE FND_API.G_EXC_ERROR;
4527   END;
4528 
4529   -- data level check
4530   code_debug(l_api_name ||' data level '||p_data_level_name||' p_attr_group_type '||p_attr_group_type ||'p_application_id '||p_application_id);
4531   BEGIN
4532     IF p_data_level_id IS NULL THEN
4533       SELECT *
4534       INTO l_data_level_rec
4535       FROM ego_data_level_b
4536       WHERE data_level_name = p_data_level_name
4537         AND attr_group_type = p_attr_group_type
4538         AND application_id = p_application_id;
4539     ELSE
4540       SELECT *
4541       INTO l_data_level_rec
4542       FROM ego_data_level_b
4543       WHERE data_level_name = p_data_level_id;
4544     END IF;
4545     code_debug(l_api_name ||' Data Level Id '||l_data_level_rec.data_level_id);
4546   EXCEPTION
4547     WHEN NO_DATA_FOUND THEN
4548       FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4549       IF p_data_level_id IS NULL THEN
4550         FND_MESSAGE.Set_Token('NAME','Data Level' );
4551         FND_MESSAGE.Set_Token('VALUE', p_data_level_name);
4552       ELSE
4553         FND_MESSAGE.Set_Token('NAME','Data Level Id' );
4554         FND_MESSAGE.Set_Token('VALUE',p_data_level_id);
4555       END IF;
4556       FND_MSG_PUB.Add;
4557       RAISE FND_API.G_EXC_ERROR;
4558   END;
4559   code_debug(l_api_name ||' Data Level id '||l_data_level_rec.data_level_id);
4563     IF l_data_level_rec.enable_defaulting = 'Y' THEN
4560 
4561   -- defaulting check check
4562   BEGIN
4564       IF p_defaulting IS NOT NULL THEN
4565         SELECT lookup_code
4566         INTO l_defaulting
4567         FROM fnd_lookup_values
4568         WHERE lookup_type = 'EGO_EF_AG_DL_BEHAVIOR'
4569         AND lookup_code = p_defaulting
4570         AND language = USERENV('LANG');
4571       ELSIF  p_defaulting_name IS NOT NULL THEN
4572         SELECT lookup_code
4573         INTO l_defaulting
4574         FROM fnd_lookup_values
4575         WHERE lookup_type = 'EGO_EF_AG_DL_BEHAVIOR'
4576         AND meaning = p_defaulting_name
4577         AND language = USERENV('LANG');
4578       ELSE
4579         l_defaulting := '';
4580       END IF;
4581     ELSE
4582       IF p_defaulting IS NOT NULL OR p_defaulting_name IS NOT NULL THEN
4583         FND_MESSAGE.SET_NAME(G_APP_NAME,'EGO_EF_DEFAULT_NOT_ALLOWED');
4584         FND_MSG_PUB.Add;
4585         RAISE FND_API.G_EXC_ERROR;
4586       END IF;
4587     END IF;
4588   EXCEPTION
4589     WHEN NO_DATA_FOUND THEN
4590       FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4591       IF p_defaulting IS NULL THEN
4592         FND_MESSAGE.Set_Token('NAME','Defaulting ' );
4593         FND_MESSAGE.Set_Token('VALUE',p_defaulting_name );
4594       ELSE
4595         FND_MESSAGE.Set_Token('NAME','Defaulting ' );
4596         FND_MESSAGE.Set_Token('VALUE',p_defaulting);
4597       END IF;
4598       FND_MSG_PUB.Add;
4599       RAISE FND_API.G_EXC_ERROR;
4600   END;
4601   code_debug(l_api_name ||' Defaulting '||l_defaulting);
4602 
4603   -- view priv check
4604   BEGIN
4605     IF l_data_level_rec.enable_view_priv = 'Y' THEN
4606       IF p_view_priv_id IS NOT NULL THEN
4607         SELECT function_id
4608         INTO l_view_priv_id
4609         FROM fnd_form_functions
4610         WHERE function_id = p_view_priv_id;
4611       ELSIF p_view_priv_name IS NOT NULL THEN
4612         SELECT function_id
4613         INTO l_view_priv_id
4614         FROM fnd_form_functions
4615         WHERE function_name = p_view_priv_name;
4616       ELSIF p_user_view_priv_name IS NOT NULL THEN
4617         SELECT function_id
4618         INTO l_view_priv_id
4619         FROM fnd_form_functions_vl
4620         WHERE user_function_name = p_user_view_priv_name;
4621       ELSE
4622         l_view_priv_id := NULL;
4623       END IF;
4624     ELSE
4625       IF p_view_priv_id IS NOT NULL OR p_view_priv_name IS NOT NULL THEN
4626         -- flash message you cannot view privileges
4627         fnd_message.set_name(G_APP_NAME,'EGO_VIEW_PRIV_NOT_ALLOWED');
4628         FND_MSG_PUB.Add;
4629         RAISE FND_API.G_EXC_ERROR;
4630       END IF;
4631     END IF;
4632   EXCEPTION
4633     WHEN NO_DATA_FOUND THEN
4634       FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4635       IF p_view_priv_id IS NOT NULL THEN
4636         FND_MESSAGE.Set_Token('NAME','View Privilege' );
4637         FND_MESSAGE.Set_Token('VALUE',p_view_priv_id );
4638       ELSIF p_view_priv_name IS NOT NULL THEN
4639         FND_MESSAGE.Set_Token('NAME','View Privilege' );
4640         FND_MESSAGE.Set_Token('VALUE',p_view_priv_name);
4641       ELSE
4642         FND_MESSAGE.set_token('NAME','View Privilege');
4643         FND_MESSAGE.set_token('VALUE',p_user_view_priv_name);
4644       END IF;
4645       FND_MSG_PUB.Add;
4646       RAISE FND_API.G_EXC_ERROR;
4647   END;
4648   code_debug(l_api_name ||' View Priv id '||l_view_priv_id);
4649 
4650   -- edit priv check
4651   BEGIN
4652     IF l_data_level_rec.enable_edit_priv = 'Y' THEN
4653       IF p_edit_priv_id IS NOT NULL THEN
4654         SELECT function_id
4655         INTO l_edit_priv_id
4656         FROM fnd_form_functions
4657         WHERE function_id = p_edit_priv_id;
4658       ELSIF p_edit_priv_name IS NOT NULL THEN
4659         SELECT function_id
4660         INTO l_edit_priv_id
4661         FROM fnd_form_functions
4662         WHERE function_name = p_edit_priv_name;
4663       ELSIF p_user_edit_priv_name IS NOT NULL THEN
4664         SELECT function_id
4665         INTO l_edit_priv_id
4666         FROM fnd_form_functions_vl
4667         WHERE user_function_name = p_user_edit_priv_name;
4668       ELSE
4669         l_edit_priv_id := NULL;
4670       END IF;
4671     ELSE
4672       IF p_edit_priv_id IS NOT NULL OR p_edit_priv_name IS NOT NULL THEN
4673         -- flash message you cannot view privileges
4674         fnd_message.set_name(G_APP_NAME,'EGO_EDIT_PRIV_NOT_ALLOWED');
4675         FND_MSG_PUB.Add;
4676         RAISE FND_API.G_EXC_ERROR;
4677       END IF;
4678     END IF;
4679   EXCEPTION
4680     WHEN NO_DATA_FOUND THEN
4681       FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4682       IF p_edit_priv_id IS NOT NULL THEN
4683         FND_MESSAGE.Set_Token('NAME','Edit Privilege' );
4684         FND_MESSAGE.Set_Token('VALUE',p_edit_priv_id );
4685       ELSIF p_edit_priv_name IS NOT NULL THEN
4686         FND_MESSAGE.Set_Token('NAME','Edit Privilege' );
4687         FND_MESSAGE.Set_Token('VALUE',p_edit_priv_name);
4688       ELSE
4689         FND_MESSAGE.set_token('NAME','Edit Privilege');
4690         FND_MESSAGE.set_token('VALUE',p_user_edit_priv_name);
4691       END IF;
4692       FND_MSG_PUB.Add;
4693       RAISE FND_API.G_EXC_ERROR;
4694   END;
4695   code_debug(l_api_name ||' Edit Priv id '||l_edit_priv_id);
4696 
4700       FND_MSG_PUB.Add;
4697   IF NVL(p_raise_pre_event,'N') IN ('Y', 'N')  THEN
4698     IF l_data_level_rec.enable_pre_event = 'N' AND NVL(p_raise_pre_event,'N') = 'Y' THEN
4699       fnd_message.set_name(G_APP_NAME,'EGO_PRE_EVENT_NOT_ALLOWED');
4701       RAISE FND_API.G_EXC_ERROR;
4702     ELSE
4703       l_raise_pre_event := NVL(p_raise_pre_event,'N');
4704     END IF;
4705   ELSE
4706     FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4707     FND_MESSAGE.Set_Token('NAME','Pre Event' );
4708     FND_MESSAGE.Set_Token('VALUE',l_raise_pre_event );
4709     FND_MSG_PUB.Add;
4710     RAISE FND_API.G_EXC_ERROR;
4711   END IF;
4712   code_debug(l_api_name ||' Pre Event '||l_raise_pre_event);
4713 
4714   IF NVL(p_raise_post_event,'N') IN ('Y', 'N')  THEN
4715     IF l_data_level_rec.enable_post_event = 'N' AND NVL(p_raise_post_event,'N') = 'Y' THEN
4716       fnd_message.set_name(G_APP_NAME,'EGO_POST_EVENT_NOT_ALLOWED');
4717       FND_MSG_PUB.Add;
4718       RAISE FND_API.G_EXC_ERROR;
4719     ELSE
4720       l_raise_post_event := NVL(p_raise_post_event,'N');
4721     END IF;
4722   ELSE
4723     FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4724     FND_MESSAGE.Set_Token('NAME','Post Event' );
4725     FND_MESSAGE.Set_Token('VALUE',l_raise_post_event );
4726     FND_MSG_PUB.Add;
4727     RAISE FND_API.G_EXC_ERROR;
4728   END IF;
4729   code_debug(l_api_name ||' Post Event '||l_raise_post_event);
4730 
4731   IF p_transaction_type = 'CREATE' THEN
4732     INSERT INTO EGO_ATTR_GROUP_DL
4733       (attr_group_id
4734       ,data_level_id
4735       ,defaulting
4736       ,view_privilege_id
4737       ,edit_privilege_id
4738       ,raise_pre_event
4739       ,raise_post_event
4740       ,created_by
4741       ,creation_date
4742       ,last_updated_by
4743       ,last_update_date
4744       ,last_update_login
4745       )
4746     VALUES
4747       (l_attr_group_id
4748       ,l_data_level_rec.data_level_id
4749       ,l_defaulting
4750       ,l_view_priv_id
4751       ,l_edit_priv_id
4752       ,l_raise_pre_event
4753       ,l_raise_post_event
4754       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4755       ,NVL(p_last_update_date, SYSDATE)
4756       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4757       ,NVL(p_last_update_date, SYSDATE)
4758       ,G_CURRENT_LOGIN_ID
4759       );
4760   ELSE
4761     UPDATE EGO_ATTR_GROUP_DL
4762     SET defaulting = l_defaulting
4763        ,view_privilege_id = l_view_priv_id
4764        ,edit_privilege_id = l_edit_priv_id
4765        ,raise_pre_event   = l_raise_pre_event
4766        ,raise_post_event  = l_raise_post_event
4767        ,last_updated_by   = NVL(p_last_updated_by, G_CURRENT_USER_ID)
4768        ,last_update_date  = NVL(p_last_update_date, SYSDATE)
4769        ,last_update_login = G_CURRENT_LOGIN_ID
4770         where attr_group_id = l_attr_group_id and data_level_id =l_data_level_rec.data_level_id;
4771   END IF;
4772 
4773   IF FND_API.TO_BOOLEAN(p_commit) THEN
4774     COMMIT WORK;
4775   END IF;
4776 
4777   x_return_status := FND_API.G_RET_STS_SUCCESS;
4778   code_debug(l_api_name ||' Done ');
4779 
4780 EXCEPTION
4781   WHEN FND_API.G_EXC_ERROR THEN
4782     code_debug(l_api_name ||' Exception -  FND_API.G_EXC_ERROR '||x_msg_data);
4783     IF FND_API.TO_BOOLEAN(p_commit) THEN
4784       ROLLBACK to SYNC_DL_ASSOC;
4785     END IF;
4786     FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
4787                              ,p_count   => x_msg_count
4788                              ,p_data    => x_msg_data);
4789     x_return_status := FND_API.G_RET_STS_ERROR;
4790 
4791   WHEN OTHERS THEN
4792     code_debug(l_api_name ||' Exception - Others '||SQLERRM);
4793     IF FND_API.TO_BOOLEAN(p_commit) THEN
4794       ROLLBACK to SYNC_DL_ASSOC;
4795     END IF;
4796     x_return_status := FND_API.G_RET_STS_ERROR;
4797 
4798 END Sync_dl_assoc;
4799 
4800 ----------------------------------------------------------------------
4801 
4802                        --------------------
4803                        -- Attribute APIs --
4804                        --------------------
4805 
4806 ----------------------------------------------------------------------
4807 
4808 PROCEDURE Create_Attribute (
4809         p_api_version                   IN   NUMBER
4810        ,p_application_id                IN   NUMBER
4811        ,p_attr_group_type               IN   VARCHAR2
4812        ,p_attr_group_name               IN   VARCHAR2
4813        ,p_internal_name                 IN   VARCHAR2
4814        ,p_display_name                  IN   VARCHAR2
4815        ,p_description                   IN   VARCHAR2
4816        ,p_sequence                      IN   NUMBER
4817        ,p_data_type                     IN   VARCHAR2
4818        ,p_required                      IN   VARCHAR2
4819        ,p_searchable                    IN   VARCHAR2
4820        ,p_column                        IN   VARCHAR2
4821        ,p_is_column_indexed             IN   VARCHAR2
4822        ,p_value_set_id                  IN   NUMBER
4823        ,p_info_1                        IN   VARCHAR2   DEFAULT NULL
4824        ,p_default_value                 IN   VARCHAR2
4825        ,p_unique_key_flag               IN   VARCHAR2
4826        ,p_enabled                       IN   VARCHAR2
4827        ,p_display                       IN   VARCHAR2
4828        ,p_uom_class                     IN   VARCHAR2
4829        ,p_control_level                 IN   NUMBER     DEFAULT 1 --JDEJESU: NULL for 11.5.10E
4833        ,p_customization_level           IN   VARCHAR2   DEFAULT 'A'
4830        ,p_attribute_code                IN   VARCHAR2   DEFAULT NULL
4831        ,p_view_in_hierarchy_code        IN   VARCHAR2   DEFAULT 'A'
4832        ,p_edit_in_hierarchy_code        IN   VARCHAR2   DEFAULT 'A'
4834        ,p_owner                         IN   NUMBER     DEFAULT NULL
4835        ,p_lud                           IN   DATE       DEFAULT SYSDATE
4836        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
4837        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
4838        ,x_return_status                 OUT NOCOPY VARCHAR2
4839        ,x_errorcode                     OUT NOCOPY NUMBER
4840        ,x_msg_count                     OUT NOCOPY NUMBER
4841        ,x_msg_data                      OUT NOCOPY VARCHAR2
4842 ) IS
4843 
4844     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Attribute';
4845 
4846     --we don't use l_api_version yet, but eventually we might:
4847     --if we change required parameters, version goes from n.x to (n+1).x
4848     --if we change optional parameters, version goes from x.n to x.(n+1)
4849     l_api_version            CONSTANT NUMBER := 1.0;
4850 
4851     l_sequence               NUMBER;
4852     l_data_type_is_trans_text BOOLEAN;
4853     l_col_data_type          VARCHAR2(1);
4854     l_col_width              NUMBER;
4855     l_required               VARCHAR2(1);
4856     l_searchable             VARCHAR2(1);
4857     l_unique_key_flag        VARCHAR2(1);
4858     l_enabled                VARCHAR2(1);
4859     l_display                VARCHAR2(1);
4860     l_is_column_correct      BOOLEAN := TRUE;
4861     l_is_column_indexed      VARCHAR2(1);
4862     l_is_chg_column_indexed  VARCHAR2(1);
4863     l_table_name             VARCHAR2(30);
4864     l_chg_table_name         VARCHAR2(30);
4865     l_valid_uom_column       VARCHAR2(300);
4866 
4867     --Bug 5443697
4868     e_attr_starts_with_num        EXCEPTION;
4869     e_attr_starts_with_und_sc     EXCEPTION;
4870     l_start_num                   VARCHAR2(10);
4871     l_start_und_sc                VARCHAR2(10);
4872 
4873     e_attr_dup_seq_error     EXCEPTION;
4874     e_first_attr_cbox        EXCEPTION;
4875     e_col_data_type_error    EXCEPTION;
4876     e_vs_data_type_error     EXCEPTION;
4877     e_no_vs_for_id_error     EXCEPTION;
4878     e_bad_info_1_error       EXCEPTION;
4879     e_uom_not_allowed        EXCEPTION;
4880     e_default_value_len_err  EXCEPTION;
4881     e_col_internal_name_error    EXCEPTION;  --vkeerthi - Fix for bug 5884003.
4882     --Bug 4703510
4883     l_fnd_exists             VARCHAR2(1) ;
4884     l_ego_exists              VARCHAR2(1);
4885     l_value_set_id           FND_DESCR_FLEX_COLUMN_USAGES.flex_value_set_id%TYPE;
4886     l_multi_row_flag         VARCHAR2(2);
4887     l_min_seq                NUMBER;
4888 
4889 
4890   BEGIN
4891 
4892     -- Standard start of API savepoint
4893     IF FND_API.TO_BOOLEAN(p_commit) THEN
4894       SAVEPOINT Create_Attribute_PUB;
4895     END IF;
4896 
4897     -- Check for call compatibility
4898     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
4899                                         l_api_name, G_PKG_NAME)
4900     THEN
4901       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4902     END IF;
4903     -- Initialize message list even though we don't currently use it
4904     IF FND_API.To_Boolean(p_init_msg_list) THEN
4905       FND_MSG_PUB.Initialize;
4906     END IF;
4907     --Bug 4703510
4908     --check if the Attribute name starts with a number
4909     --Bug 5443697
4910     has_Num_Start_char (p_internal_name =>p_internal_name,
4911                                      x_start_num => l_start_num);
4912     IF (l_start_num = 'Y') THEN
4913       RAISE e_attr_starts_with_num;
4914     END IF ;
4915     --check if the Attribute name starts with an under score
4916     --Bug 5443697
4917     has_Given_Char_As_Start_char (p_internal_name =>p_internal_name,
4918                                   p_char_set =>'_',
4919                                   x_start_und_sc => l_start_und_sc);
4920      IF (l_start_und_sc = 'Y') THEN
4921       RAISE e_attr_starts_with_und_sc;
4922     END IF ;
4923 
4924     Get_fnd_ego_record_exists (
4925                      p_context=>'ATTRIBUTE'
4926                     ,p_application_id => p_application_id
4927                     ,p_attr_group_type => p_attr_group_type
4928                     ,p_attr_group_name => p_attr_group_name
4929                     ,p_internal_name => p_internal_name
4930                     ,x_fnd_exists => l_fnd_exists
4931                     ,x_ego_exists => l_ego_exists
4932                     );
4933 
4934 -----------------------------------
4935     -----------------------------------------------------------------------------
4936     -- First we default the following parameters in case user didn't pass them --
4937     -----------------------------------------------------------------------------
4938     IF (p_sequence IS NOT NULL) THEN
4939     --commenting this out as the flags l_fnd_exists and l_ego_exists take care of this now.
4940       -- Make sure passed-in sequence does not already exist
4941       SELECT COUNT(*)
4942         INTO l_sequence
4943         FROM FND_DESCR_FLEX_COLUMN_USAGES
4944        WHERE APPLICATION_ID = p_application_id
4945          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
4946          AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
4950          RAISE e_attr_dup_seq_error;
4947          AND COLUMN_SEQ_NUM = p_sequence;
4948 
4949       IF (l_fnd_exists <> 'Y' AND l_sequence > 0) THEN
4951       ELSE
4952         l_sequence := p_sequence;
4953       END IF;
4954 
4955 
4956     ELSE
4957       -- If user didn't pass in a sequence, add 10 to highest one (or start with 10) --
4958       SELECT MAX(COLUMN_SEQ_NUM)
4959         INTO l_sequence
4960         FROM FND_DESCR_FLEX_COLUMN_USAGES
4961        WHERE APPLICATION_ID = p_application_id
4962          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
4963          AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name;
4964 
4965       l_sequence := NVL(l_sequence, 0) + 10;
4966     END IF;
4967 
4968 -- Vkeerthi - Fix for bug 5884003.
4969     -- Checking if Attribute's internal name is a keyword.
4970     IF (p_internal_name IS NOT  NULL) THEN
4971       BEGIN
4972         EXECUTE IMMEDIATE 'SELECT NULL AS ' || p_internal_name || ' FROM DUAL';
4973       EXCEPTION
4974         WHEN OTHERS THEN
4975           RAISE e_col_internal_name_error;
4976       END;
4977     END IF;
4978 -- End of fix for bug 5884003
4979 
4980 
4981     IF (p_display = EGO_EXT_FWK_PUB.G_CHECKBOX_DISP_TYPE
4982         OR p_display =EGO_EXT_FWK_PUB.G_RADIO_DISP_TYPE ) THEN --bugFix:5292226
4983 
4984       SELECT MULTI_ROW
4985         INTO l_multi_row_flag
4986         FROM EGO_FND_DSC_FLX_CTX_EXT
4987        WHERE APPLICATION_ID = p_application_id
4988          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
4989          AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name;
4990 
4991       IF (l_multi_row_flag = 'Y') THEN
4992 
4993         SELECT MIN(COLUMN_SEQ_NUM)
4994           INTO l_min_seq
4995           FROM FND_DESCR_FLEX_COLUMN_USAGES
4996          WHERE APPLICATION_ID = p_application_id
4997            AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
4998            AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name;
4999 
5000         IF (l_sequence <= l_min_seq OR l_min_seq IS NULL) THEN
5001           RAISE e_first_attr_cbox;
5002         END IF;
5003 
5004       END IF;
5005 
5006     END IF;
5007 
5008 
5009 
5010     l_required := NVL(p_required, 'N');
5011     l_searchable := NVL(p_searchable, 'N');
5012     l_unique_key_flag := NVL(p_unique_key_flag, 'N');
5013     l_enabled := NVL(p_enabled, 'Y');
5014     l_display := NVL(p_display, 'T');
5015 
5016     ------------------------------------------------------------------------
5017     -- Find the correct table name for use in validating column data type --
5018     ------------------------------------------------------------------------
5019     l_data_type_is_trans_text := (p_data_type = G_TRANS_TEXT_DATA_TYPE);
5020     IF (l_data_type_is_trans_text) THEN
5021       l_table_name := Get_TL_Table_Name(p_application_id
5022                                        ,p_attr_group_type);
5023       l_chg_table_name:=Get_Attr_Changes_TL_Table(p_application_id => p_application_id
5024                                        ,p_attr_group_type => p_attr_group_type);--for getting the pending table
5025     ELSE
5026       l_table_name := Get_Table_Name(p_application_id
5027                                     ,p_attr_group_type);
5028       l_chg_table_name:=Get_Attr_Changes_B_Table(p_application_id => p_application_id
5029                                        ,p_attr_group_type => p_attr_group_type);--for getting the pending table
5030 
5031     END IF;--IF (l_data_type_is_trans_text)
5032 
5033 
5034     BEGIN
5035 
5036       SELECT COLUMN_TYPE , WIDTH
5037         INTO l_col_data_type, l_col_width
5038         FROM FND_COLUMNS
5039        WHERE COLUMN_NAME = p_column
5040          AND TABLE_ID = (SELECT TABLE_ID
5041                            FROM FND_TABLES
5042                           WHERE TABLE_NAME = l_table_name);
5043 
5044       IF (((p_data_type = G_CHAR_DATA_TYPE OR
5045             p_data_type = G_TRANS_TEXT_DATA_TYPE) AND
5046            l_col_data_type <> 'V') OR
5047           (p_data_type = G_NUMBER_DATA_TYPE AND l_col_data_type <> 'N') OR
5048           ((p_data_type = G_DATE_DATA_TYPE OR
5049             p_data_type = G_DATE_TIME_DATA_TYPE) AND
5050            l_col_data_type <> 'D')) THEN
5051 
5052 /***
5053 TO DO: right now we can't verify that TransText Attributes use TL-type columns,
5054 because we can't rely on the column being named 'TL_EXT_ATTR%' and we aren't
5055 using FND_COLUMNS's TRANSLATE_FLAG column yet; but we should be, and we should
5056 add to the IF check above that if the data type is TransText and the column's
5057 TRANSLATE_FLAG isn't 'Y' then we should error out.
5058 ***/
5059 
5060         RAISE e_col_data_type_error;
5061 
5062       END IF;
5063 
5064       IF ( (p_data_type = G_CHAR_DATA_TYPE OR
5065             p_data_type = G_TRANS_TEXT_DATA_TYPE) AND
5066             LENGTH(p_default_value) >  l_col_width )THEN
5067 
5068         RAISE e_default_value_len_err;
5069 
5070       END IF;
5071 
5072     EXCEPTION
5073       WHEN NO_DATA_FOUND THEN
5074         -- whoever owns the table didn't seed the column correctly
5075         RAISE e_col_data_type_error;
5076     END;
5077 
5078     -- correct datatype and column name are passed
5079 
5080   -----------------------------------------------------------------------------------
5084     -- bug 3875730                                                                --
5081     -- If the UOM Class is not null we need to make sure that we have             --
5082     -- a corresponding database column in user workbench                          --
5083     -- to store the UOM Code                                                      --
5085   -----------------------------------------------------------------------------------
5086     IF(p_uom_class IS NOT  NULL) THEN
5087 
5088       l_valid_uom_column := check_Uom_Column_Exists(p_column , l_table_name );
5089 
5090       IF l_valid_uom_column IS NULL THEN
5091         RAISE e_uom_not_allowed;
5092       ELSIF l_valid_uom_column <> '1' THEN
5093         l_valid_uom_column := check_Uom_Col_In_Use ( p_application_id
5094                                                      ,p_attr_group_type
5095                                                      ,p_attr_group_name
5096                                                      ,p_internal_name
5097                                                      ,l_valid_uom_column
5098                                                     );
5099         IF l_valid_uom_column IS NOT NULL THEN
5100           RAISE e_uom_not_allowed;
5101         END IF ;
5102       END IF ;
5103     END IF ;
5104     -------------------------------------------------------------------------------------
5105     -- Make sure that if a Value Set was passed in, it's compatible with the data type --
5106     -------------------------------------------------------------------------------------
5107     IF (p_value_set_id > 0) THEN
5108       DECLARE
5109         l_value_set_format_code  VARCHAR2(1);
5110       BEGIN
5111 
5112         SELECT FORMAT_TYPE
5113           INTO l_value_set_format_code
5114           FROM FND_FLEX_VALUE_SETS
5115          WHERE FLEX_VALUE_SET_ID = p_value_set_id;
5116 
5117         IF (l_value_set_format_code IS NULL OR
5118             (l_value_set_format_code <> p_data_type)) THEN
5119           RAISE e_vs_data_type_error;
5120         END IF;
5121 
5122       EXCEPTION
5123         WHEN NO_DATA_FOUND THEN
5124           RAISE e_no_vs_for_id_error;
5125         END;
5126     END IF;
5127 
5128     ---------------------------------------------
5129     -- If p_info_1 is not null, we validate it --
5130     ---------------------------------------------
5131     IF (p_info_1 IS NOT NULL) THEN
5132       DECLARE
5133         l_tokenized_url_dummy     VARCHAR(10000);
5134         l_attr_group_metadata_obj EGO_ATTR_GROUP_METADATA_OBJ;
5135         l_attr_metadata_obj       EGO_ATTR_METADATA_OBJ;
5136       BEGIN
5137         l_attr_group_metadata_obj :=
5138           EGO_USER_ATTRS_COMMON_PVT.Get_Attr_Group_Metadata(
5139                                      p_application_id  => p_application_id
5140                                     ,p_attr_group_type => p_attr_group_type
5141                                     ,p_attr_group_name => p_attr_group_name
5142                                    );
5143 
5144         l_attr_metadata_obj := EGO_ATTR_METADATA_OBJ(
5145                                  null -- ATTR_ID
5146                                 ,null -- ATTR_GROUP_ID
5147                                 ,p_attr_group_name
5148                                 ,p_internal_name
5149                                 ,p_display_name
5150                                 ,p_data_type
5151                                 ,null -- DATA_TYPE_MEANING
5152                                 ,p_sequence
5153                                 ,p_unique_key_flag
5154                                 ,p_default_value
5155                                 ,p_info_1
5156                                 ,null -- MAXIMUM_SIZE
5157                                 ,p_required
5158                                 ,p_column
5159                                 ,p_value_set_id
5160                                 ,null -- VALIDATION_TYPE
5161                                 ,null -- MINIMUM_VALUE
5162                                 ,null -- MAXIMUM_VALUE
5163                                 ,p_uom_class
5164                                 ,null -- UOM_CODE
5165                                 ,null -- DISP_TO_INT_VAL_QUERY
5166                                 ,null -- INT_TO_DISP_VAL_QUERY
5167                                 ,'N'
5168                                 ,p_view_in_hierarchy_code
5169                                 ,p_edit_in_hierarchy_code
5170                                );
5171 
5172         l_tokenized_url_dummy := Build_Tokenized_URL_Query(
5173                                    l_attr_group_metadata_obj
5174                                   ,l_attr_metadata_obj
5175                                  );
5176 
5177       EXCEPTION
5178         WHEN FND_API.G_EXC_ERROR THEN
5179           RAISE e_bad_info_1_error;
5180       END;
5181     END IF;
5182     ----------------------------------------------------
5183     -- If the Attribute is searchable and there's not --
5184     -- already an index on this column, we create one --
5185     ----------------------------------------------------
5186 
5187     IF (l_searchable = 'Y') THEN
5188 
5189       IF (p_is_column_indexed IS NOT NULL) THEN
5190 
5191         ---------------------------------------------------------------------------
5192         -- We are passed in a meaning for 'Yes' or 'No'; we need to get its code --
5193         ---------------------------------------------------------------------------
5194         SELECT LOOKUP_CODE
5195           INTO l_is_column_indexed
5199            AND VIEW_APPLICATION_ID = 0
5196           FROM FND_LOOKUP_VALUES
5197          WHERE LOOKUP_TYPE = 'YES_NO'
5198            AND LANGUAGE = USERENV('LANG')
5200            AND MEANING = p_is_column_indexed;
5201 
5202 --look up code for  pending table.
5203             SELECT LOOKUP_CODE
5204                   INTO l_is_chg_column_indexed
5205                   FROM FND_LOOKUP_VALUES
5206                  WHERE LOOKUP_TYPE = 'YES_NO'
5207                    AND LANGUAGE = USERENV('LANG')
5208                    AND VIEW_APPLICATION_ID = 0
5209                    AND MEANING = p_is_column_indexed;
5210 
5211       ELSE
5212 
5213         l_is_column_indexed := Is_Column_Indexed(p_column_name     => p_column
5214                                                 ,p_table_name      => l_table_name
5215                                                 ,p_application_id  => p_application_id
5216                                                 ,p_attr_group_type => p_attr_group_type);
5217 
5218 --for checking whether the column in Pending table is indexed.
5219         l_is_chg_column_indexed := Is_Column_Indexed(p_column_name     => p_column
5220                                                 ,p_table_name      => l_chg_table_name
5221                                                 ,p_application_id  => p_application_id
5222                                                 ,p_attr_group_type => p_attr_group_type);
5223 
5224       END IF;
5225 
5226       IF ((l_is_column_indexed IS NULL OR
5227           l_is_column_indexed <> 'Y') OR
5228            (l_is_chg_column_indexed IS NULL OR
5229           l_is_chg_column_indexed <> 'Y')) THEN
5230         l_is_column_indexed :=Create_Index_For_DBCol(p_application_id => p_application_id
5231                                                      ,p_attr_group_type => p_attr_group_type
5232                                                      ,p_attr_group_name => p_attr_group_name
5233                                                      ,p_table_name => l_table_name
5234                                                      ,p_chg_table_name => l_chg_table_name
5235                                                      ,p_is_column_indexed => l_is_column_indexed
5236                                                      ,p_is_chg_column_indexed => l_is_chg_column_indexed
5237                                                      ,p_column => p_column
5238                                                      ,p_is_table_translatable =>l_data_type_is_trans_text);
5239 
5240 /*** Right now there is no reporting if this fails (i.e., if 'N' is returned) ***/
5241       END IF;--IF ((l_is_column_indexed IS NULL OR l_is_column_indexed <> 'Y') OR  (l_is_chg_column_indexed IS NULL OR  l_is_chg_column_indexed <> 'Y'))
5242     END IF;
5243 
5244   IF (l_fnd_exists = 'Y') THEN  --Bug 4703510
5245     BEGIN
5246       SELECT flex_value_set_id
5247       INTO l_value_set_id
5248       FROM FND_DESCR_FLEX_COLUMN_USAGES
5249       WHERE APPLICATION_ID = p_application_id
5250       AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5251       AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
5252       AND END_USER_COLUMN_NAME = p_internal_name;
5253     EXCEPTION
5254       WHEN OTHERS THEN
5255        l_value_set_id := NULL;
5256     END;
5257 
5258     UPDATE FND_DESCR_FLEX_COLUMN_USAGES
5259        SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
5260            LAST_UPDATE_DATE = p_lud,
5261            LAST_UPDATE_LOGIN = g_current_login_id,
5262            COLUMN_SEQ_NUM = NVL(l_sequence, COLUMN_SEQ_NUM),
5263            ENABLED_FLAG = NVL(p_enabled, ENABLED_FLAG),
5264            REQUIRED_FLAG = NVL(p_required, REQUIRED_FLAG),
5265            DISPLAY_FLAG = NVL(p_display, DISPLAY_FLAG),
5266            FLEX_VALUE_SET_ID = l_value_set_id,
5267            DEFAULT_VALUE = p_default_value
5268        WHERE APPLICATION_ID =  p_application_id
5269          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5270          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5271          AND APPLICATION_COLUMN_NAME = p_column;
5272 
5273     UPDATE FND_DESCR_FLEX_COL_USAGE_TL
5274        SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
5275            LAST_UPDATE_DATE = p_lud,
5276            LAST_UPDATE_LOGIN = g_current_login_id,
5277            FORM_LEFT_PROMPT = p_display_name,
5278            FORM_ABOVE_PROMPT = p_display_name,
5279            DESCRIPTION = p_description,
5280            SOURCE_LANG = USERENV('LANG')
5281      WHERE APPLICATION_ID = p_application_id
5282        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5283        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5284        AND APPLICATION_COLUMN_NAME = p_column
5285        --AND LANGUAGE = USERENV('LANG');
5286       AND USERENV('LANG') in (LANGUAGE , SOURCE_LANG);
5287   ELSE --l_fnd_exists = 'Y'
5288 
5289     INSERT INTO FND_DESCR_FLEX_COLUMN_USAGES
5290     (
5291         APPLICATION_ID
5292        ,DESCRIPTIVE_FLEXFIELD_NAME
5293        ,DESCRIPTIVE_FLEX_CONTEXT_CODE
5294        ,APPLICATION_COLUMN_NAME
5295        ,END_USER_COLUMN_NAME
5296        ,CREATED_BY
5297        ,CREATION_DATE
5298        ,LAST_UPDATED_BY
5299        ,LAST_UPDATE_DATE
5300        ,LAST_UPDATE_LOGIN
5301        ,COLUMN_SEQ_NUM
5302        ,ENABLED_FLAG
5303        ,REQUIRED_FLAG
5304        ,SECURITY_ENABLED_FLAG
5305        ,DISPLAY_FLAG
5306        ,DISPLAY_SIZE
5307        ,MAXIMUM_DESCRIPTION_LEN
5308        ,CONCATENATION_DESCRIPTION_LEN
5309        ,FLEX_VALUE_SET_ID
5310        ,RANGE_CODE
5314        ,RUNTIME_PROPERTY_FUNCTION
5311        ,DEFAULT_TYPE
5312        ,DEFAULT_VALUE
5313        ,SRW_PARAM
5315     )
5316     VALUES
5317     (
5318         p_application_id        --APPLICATION_ID
5319        ,p_attr_group_type       --DESCRIPTIVE_FLEXFIELD_NAME
5320        ,p_attr_group_name       --DESCRIPTIVE_FLEX_CONTEXT_CODE
5321        ,p_column                --APPLICATION_COLUMN_NAME
5322        ,p_internal_name         --END_USER_COLUMN_NAME
5323        ,NVL(p_owner, g_current_user_id) --CREATED_BY
5324        ,p_lud                   --CREATION_DATE
5325        ,NVL(p_owner, g_current_user_id) --LAST_UPDATED_BY
5326        ,p_lud                   --LAST_UPDATE_DATE
5327        ,g_current_login_id      --LAST_UPDATE_LOGIN
5328        ,l_sequence              --COLUMN_SEQ_NUM
5329        ,l_enabled               --ENABLED_FLAG
5330        ,l_required              --REQUIRED_FLAG
5331        ,'N'                     --SECURITY_ENABLED_FLAG
5332        ,l_display               --DISPLAY_FLAG
5333        ,50                      --DISPLAY_SIZE
5334        ,50                      --MAXIMUM_DESCRIPTION_LEN
5335        ,25                      --CONCATENATION_DESCRIPTION_LEN
5336        ,p_value_set_id          --FLEX_VALUE_SET_ID
5337        ,''                      --RANGE_CODE
5338        ,''                      --DEFAULT_TYPE
5339        ,p_default_value         --DEFAULT_VALUE
5340        ,''                      --SRW_PARAM
5341        ,''                      --RUNTIME_PROPERTY_FUNCTION
5342     );
5343     INSERT INTO FND_DESCR_FLEX_COL_USAGE_TL
5344     (
5345         APPLICATION_ID
5346        ,DESCRIPTIVE_FLEXFIELD_NAME
5347        ,DESCRIPTIVE_FLEX_CONTEXT_CODE
5348        ,APPLICATION_COLUMN_NAME
5349        ,LANGUAGE
5350        ,CREATED_BY
5351        ,CREATION_DATE
5352        ,LAST_UPDATED_BY
5353        ,LAST_UPDATE_DATE
5354        ,LAST_UPDATE_LOGIN
5355        ,FORM_LEFT_PROMPT
5356        ,FORM_ABOVE_PROMPT
5357        ,DESCRIPTION
5358        ,SOURCE_LANG
5359     )
5360     SELECT
5361         p_application_id        --APPLICATION_ID
5362        ,p_attr_group_type       --DESCRIPTIVE_FLEXFIELD_NAME
5363        ,p_attr_group_name       --DESCRIPTIVE_FLEX_CONTEXT_CODE
5364        ,p_column                --APPLICATION_COLUMN_NAME
5365        ,L.LANGUAGE_CODE         --LANGUAGE
5366        ,NVL(p_owner, g_current_user_id) --CREATED_BY
5367        ,p_lud                   --CREATION_DATE
5368        ,NVL(p_owner, g_current_user_id) --LAST_UPDATED_BY
5369        ,p_lud                   --LAST_UPDATE_DATE
5370        ,g_current_login_id      --LAST_UPDATE_LOGIN
5371        ,p_display_name          --FORM_LEFT_PROMPT
5372        ,p_display_name          --FORM_ABOVE_PROMPT
5373        ,p_description           --DESCRIPTION
5374        ,USERENV('LANG')         --SOURCE_LANG
5375     FROM FND_LANGUAGES L
5376     WHERE L.INSTALLED_FLAG in ('I', 'B');
5377   END IF ;--  l_fnd_exists = 'Y' --Bug 4703510 END
5378 
5379   IF (l_ego_exists <> 'Y') THEN --Bug 4703510
5380     INSERT INTO EGO_FND_DF_COL_USGS_EXT
5381     (
5382         ATTR_ID
5383        ,APPLICATION_ID
5384        ,DESCRIPTIVE_FLEXFIELD_NAME
5385        ,DESCRIPTIVE_FLEX_CONTEXT_CODE
5386        ,APPLICATION_COLUMN_NAME
5387        ,DATA_TYPE
5388        ,SEARCH_FLAG
5389        ,UNIQUE_KEY_FLAG
5390        ,INFO_1
5391        ,UOM_CLASS
5392        ,CONTROL_LEVEL
5393        ,ATTRIBUTE_CODE
5394        ,VIEW_IN_HIERARCHY_CODE
5395        ,EDIT_IN_HIERARCHY_CODE
5396        ,CUSTOMIZATION_LEVEL
5397        ,CREATED_BY
5398        ,CREATION_DATE
5399        ,LAST_UPDATED_BY
5400        ,LAST_UPDATE_DATE
5401        ,LAST_UPDATE_LOGIN
5402     )
5403     SELECT
5404         EGO_ATTRS_S.NEXTVAL                                          -- ATTR_ID
5405        ,p_application_id                                      -- APPLICATION_ID
5406        ,p_attr_group_type                         -- DESCRIPTIVE_FLEXFIELD_NAME
5407        ,p_attr_group_name                      -- DESCRIPTIVE_FLEX_CONTEXT_CODE
5408        ,p_column                                     -- APPLICATION_COLUMN_NAME
5409        ,p_data_type                                                -- DATA_TYPE
5410        ,l_searchable                                         -- SEARCHABLE FLAG
5411        ,l_unique_key_flag                                    -- UNIQUE_KEY_FLAG
5412        ,p_info_1                   -- DYNAMIC URL (IF APPLICABLE; USUALLY NULL)
5413        ,p_uom_class                                                -- UOM_CLASS
5414        ,p_control_level                                        -- CONTROL_LEVEL
5415        ,p_attribute_code                                      -- ATTRIBUTE_CODE
5416        ,p_view_in_hierarchy_code                      -- VIEW_IN_HIERARCHY_CODE
5417        ,p_edit_in_hierarchy_code                      -- EDIT_IN_HIERARCHY_CODE
5418        ,p_customization_level                            -- CUSTIMIZATION_LEVEL
5419        ,NVL(p_owner, g_current_user_id)                           -- CREATED_BY
5420        ,p_lud                                                  -- CREATION_DATE
5421        ,NVL(p_owner, g_current_user_id)                      -- LAST_UPDATED_BY
5422        ,p_lud                                               -- LAST_UPDATE_DATE
5423        ,g_current_login_id                                 -- LAST_UPDATE_LOGIN
5424     FROM DUAL;
5425 
5426     -- Standard check of p_commit
5430     x_return_status := FND_API.G_RET_STS_SUCCESS;
5427     IF FND_API.To_Boolean(p_commit) THEN
5428       COMMIT WORK;
5429     END IF;
5431   ELSE --l_ego_exists <> 'Y'
5432     IF FND_API.TO_BOOLEAN(p_commit) THEN
5433       ROLLBACK TO Create_Attribute_PUB;
5434     END IF;
5435 
5436       x_return_status := FND_API.G_RET_STS_ERROR;
5437       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_INTERNAL_NAME_UNIQUE');
5438       FND_MSG_PUB.Add;
5439       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5440                                ,p_count   => x_msg_count
5441                                ,p_data    => x_msg_data);
5442 
5443   END IF;--l_ego_exists <> 'Y'--Bug 4703510
5444 
5445   EXCEPTION
5446     --Bug 5443697
5447    WHEN e_attr_starts_with_num THEN
5448     IF FND_API.TO_BOOLEAN(p_commit) THEN
5449       ROLLBACK TO Create_Attribute_PUB;
5450     END IF;
5451       x_return_status := FND_API.G_RET_STS_ERROR;
5452       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_NAME_ST_NUM');
5453       FND_MSG_PUB.Add;
5454       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5455                                ,p_count   => x_msg_count
5456                                ,p_data    => x_msg_data);
5457 
5458    WHEN e_attr_starts_with_und_sc THEN
5459     IF FND_API.TO_BOOLEAN(p_commit) THEN
5460       ROLLBACK TO Create_Attribute_PUB;
5461     END IF;
5462       x_return_status := FND_API.G_RET_STS_ERROR;
5463       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_NAME_ST_UND_SC');
5464       FND_MSG_PUB.Add;
5465       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5466                                ,p_count   => x_msg_count
5467                                ,p_data    => x_msg_data);
5468 
5469    WHEN e_col_internal_name_error THEN
5470     IF FND_API.TO_BOOLEAN(p_commit) THEN
5471       ROLLBACK TO Create_Attribute_PUB;
5472     END IF;
5473       x_return_status := FND_API.G_RET_STS_ERROR;
5474       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_INTRNL_NAME_ERR');
5475       FND_MSG_PUB.Add;
5476       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5477                                ,p_count   => x_msg_count
5478                                ,p_data    => x_msg_data);
5479 
5480     WHEN e_default_value_len_err THEN
5481     IF FND_API.TO_BOOLEAN(p_commit) THEN
5482       ROLLBACK TO Create_Attribute_PUB;
5483     END IF;
5484       x_return_status := FND_API.G_RET_STS_ERROR;
5485       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_DEFAULT_VAL_LEN_ERR');
5486       FND_MESSAGE.Set_Token('ATTR_MAX_LENGTH', l_col_width);
5487       FND_MSG_PUB.Add;
5488       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5489                                ,p_count   => x_msg_count
5490                                ,p_data    => x_msg_data);
5491 
5492     WHEN e_attr_dup_seq_error THEN
5493     IF FND_API.TO_BOOLEAN(p_commit) THEN
5494       ROLLBACK TO Create_Attribute_PUB;
5495     END IF;
5496       x_return_status := FND_API.G_RET_STS_ERROR;
5497       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ATTR_DUP_SEQ_ERR');
5498       FND_MSG_PUB.Add;
5499       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5500                                ,p_count   => x_msg_count
5501                                ,p_data    => x_msg_data);
5502 
5503 
5504     WHEN e_first_attr_cbox THEN
5505     IF FND_API.TO_BOOLEAN(p_commit) THEN
5506       ROLLBACK TO Create_Attribute_PUB;
5507     END IF;
5508       x_return_status := FND_API.G_RET_STS_ERROR;
5509       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_MR_FIRST_ATTR_CBOX_ERR');
5510       FND_MSG_PUB.Add;
5511       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5512                                ,p_count   => x_msg_count
5513                                ,p_data    => x_msg_data);
5514 
5515 
5516 
5517     WHEN e_col_data_type_error THEN
5518     IF FND_API.TO_BOOLEAN(p_commit) THEN
5519       ROLLBACK TO Create_Attribute_PUB;
5520     END IF;
5521       x_return_status := FND_API.G_RET_STS_ERROR;
5522       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ATTR_COL_DT_ERR');
5523       FND_MSG_PUB.Add;
5524       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5525                                ,p_count   => x_msg_count
5526                                ,p_data    => x_msg_data);
5527 
5528     WHEN e_uom_not_allowed THEN
5529     IF FND_API.TO_BOOLEAN(p_commit) THEN
5530       ROLLBACK TO Create_Attribute_PUB;
5531     END IF;
5532       x_return_status :=  FND_API.G_RET_STS_ERROR;
5533       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_UOM_COL_ERR');
5534       FND_MSG_PUB.Add;
5535       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5536                                ,p_count   => x_msg_count
5537                                ,p_data    => x_msg_data);
5538 
5539     WHEN e_vs_data_type_error THEN
5540     IF FND_API.TO_BOOLEAN(p_commit) THEN
5541       ROLLBACK TO Create_Attribute_PUB;
5542     END IF;
5543       x_return_status := FND_API.G_RET_STS_ERROR;
5544       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ATTR_VS_DT_ERR');
5545       FND_MSG_PUB.Add;
5546       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5547                                ,p_count   => x_msg_count
5548                                ,p_data    => x_msg_data);
5549 
5550     WHEN e_no_vs_for_id_error THEN
5551     IF FND_API.TO_BOOLEAN(p_commit) THEN
5552       ROLLBACK TO Create_Attribute_PUB;
5553     END IF;
5554       x_return_status := FND_API.G_RET_STS_ERROR;
5558                                ,p_count   => x_msg_count
5555       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ATTR_NO_VS_ERR');
5556       FND_MSG_PUB.Add;
5557       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5559                                ,p_data    => x_msg_data);
5560 
5561     WHEN e_bad_info_1_error THEN
5562     IF FND_API.TO_BOOLEAN(p_commit) THEN
5563       ROLLBACK TO Create_Attribute_PUB;
5564     END IF;
5565 
5566       DECLARE
5567         l_attr_group_disp_name  FND_DESCR_FLEX_CONTEXTS_TL.DESCRIPTIVE_FLEX_CONTEXT_NAME%TYPE;
5568       BEGIN
5569         SELECT DESCRIPTIVE_FLEX_CONTEXT_NAME
5570           INTO l_attr_group_disp_name
5571           FROM FND_DESCR_FLEX_CONTEXTS_TL
5572          WHERE APPLICATION_ID = p_application_id
5573            AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5574            AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5575            AND LANGUAGE = USERENV('LANG');
5576 
5577         x_return_status := FND_API.G_RET_STS_ERROR;
5578         FND_MESSAGE.Set_Name('EGO', 'EGO_EF_DYNAMIC_URL_DATA_ERROR');
5579         FND_MESSAGE.Set_Token('ATTR_GROUP_DISP_NAME', l_attr_group_disp_name);
5580         FND_MSG_PUB.Add;
5581         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5582                                  ,p_count   => x_msg_count
5583                                  ,p_data    => x_msg_data);
5584       EXCEPTION
5585         WHEN NO_DATA_FOUND THEN
5586           x_return_status := FND_API.G_RET_STS_ERROR;
5587           FND_MESSAGE.Set_Name('EGO', 'EGO_EF_DYNAMIC_URL_DATA_ERROR');
5588           FND_MESSAGE.Set_Token('ATTR_GROUP_DISP_NAME', null);
5589           FND_MSG_PUB.Add;
5590           FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5591                                    ,p_count   => x_msg_count
5592                                    ,p_data    => x_msg_data);
5593       END;
5594 
5595     WHEN OTHERS THEN
5596     IF FND_API.TO_BOOLEAN(p_commit) THEN
5597       ROLLBACK TO Create_Attribute_PUB;
5598     END IF;
5599       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5600 
5601       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
5602       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
5603       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
5604       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
5605       FND_MSG_PUB.Add;
5606       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5607                                ,p_count   => x_msg_count
5608                                ,p_data    => x_msg_data);
5609 
5610 END Create_Attribute;
5611 
5612 ----------------------------------------------------------------------
5613 
5614 PROCEDURE Update_Attribute (
5615         p_api_version                   IN   NUMBER
5616        ,p_application_id                IN   NUMBER
5617        ,p_attr_group_type               IN   VARCHAR2
5618        ,p_attr_group_name               IN   VARCHAR2
5619        ,p_internal_name                 IN   VARCHAR2
5620        ,p_display_name                  IN   VARCHAR2
5621        ,p_description                   IN   VARCHAR2
5622        ,p_sequence                      IN   NUMBER
5623        ,p_required                      IN   VARCHAR2
5624        ,p_searchable                    IN   VARCHAR2
5625        ,p_column                        IN   VARCHAR2
5626        ,p_value_set_id                  IN   NUMBER     DEFAULT G_MISS_NUM
5627        ,p_info_1                        IN   VARCHAR2   DEFAULT NULL
5628        ,p_default_value                 IN   VARCHAR2
5629        ,p_unique_key_flag               IN   VARCHAR2   DEFAULT NULL
5630        ,p_enabled                       IN   VARCHAR2
5631        ,p_display                       IN   VARCHAR2
5632        ,p_control_level                 IN   NUMBER     DEFAULT -1
5633        ,p_attribute_code                IN   VARCHAR2   DEFAULT G_MISS_CHAR
5634        ,p_view_in_hierarchy_code        IN   VARCHAR2   DEFAULT G_MISS_CHAR
5635        ,p_edit_in_hierarchy_code        IN   VARCHAR2   DEFAULT G_MISS_CHAR
5636        ,p_customization_level           IN   VARCHAR2   DEFAULT G_MISS_CHAR
5637        ,p_owner                         IN   NUMBER     DEFAULT NULL
5638        ,p_lud                           IN   DATE       DEFAULT SYSDATE
5639        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
5640        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
5641        ,p_is_nls_mode                   IN   VARCHAR2   DEFAULT FND_API.G_FALSE
5642        ,p_uom_class                     IN   VARCHAR2   DEFAULT G_MISS_CHAR
5643        ,x_return_status                 OUT NOCOPY VARCHAR2
5644        ,x_errorcode                     OUT NOCOPY NUMBER
5645        ,x_msg_count                     OUT NOCOPY NUMBER
5646        ,x_msg_data                      OUT NOCOPY VARCHAR2
5647 ) IS
5648 
5649     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Attribute';
5650 
5651     --we don't use l_api_version yet, but eventually we might:
5652     --if we change required parameters, version goes from n.x to (n+1).x
5653     --if we change optional parameters, version goes from x.n to x.(n+1)
5654     l_api_version            CONSTANT NUMBER := 1.0;
5655 
5656     l_sequence               NUMBER;
5657     l_min_seq           NUMBER;
5658     l_was_searchable         EGO_FND_DF_COL_USGS_EXT.search_flag%TYPE;
5659     l_view_in_hierarchy_code EGO_FND_DF_COL_USGS_EXT.view_in_hierarchy_code%TYPE;
5663     l_uom_class              EGO_FND_DF_COL_USGS_EXT.uom_class%TYPE;
5660     l_edit_in_hierarchy_code EGO_FND_DF_COL_USGS_EXT.edit_in_hierarchy_code%TYPE;
5661     l_customization_level    EGO_FND_DF_COL_USGS_EXT.customization_level%TYPE;
5662     l_attribute_code         EGO_FND_DF_COL_USGS_EXT.attribute_code%TYPE;
5664     l_value_set_id           FND_DESCR_FLEX_COLUMN_USAGES.flex_value_set_id%TYPE;
5665     l_is_column_indexed      VARCHAR2(1);
5666     l_is_chg_column_indexed  VARCHAR2(1);
5667     l_table_name             VARCHAR2(100);
5668     l_chg_table_name         VARCHAR2(30);
5669     l_data_type_is_trans_text BOOLEAN;
5670     l_valid_uom_column       VARCHAR2(300);
5671     l_col_width              NUMBER;
5672     l_data_type_code         VARCHAR2(2);
5673     l_multi_row_flag         VARCHAR2(2);
5674 
5675     e_attr_dup_seq_error     EXCEPTION;
5676     e_first_attr_cbox        EXCEPTION;
5677     e_uom_not_allowed        EXCEPTION;
5678     e_default_value_len_err  EXCEPTION;
5679 
5680 
5681   BEGIN
5682     -- Standard start of API savepoint
5683     IF FND_API.To_Boolean(p_commit) THEN
5684       SAVEPOINT Update_Attribute_PUB;
5685     END IF;
5686 
5687     -- Check for call compatibility
5688     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
5689                                         l_api_name, G_PKG_NAME)
5690     THEN
5691       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5692     END IF;
5693     -- Initialize message list even though we don't currently use it
5694     IF FND_API.To_Boolean(p_init_msg_list) THEN
5695       FND_MSG_PUB.Initialize;
5696     END IF;
5697 
5698     -----------------------------------
5699     -- get the attribute details -- ego specific
5700     -----------------------------------
5701     BEGIN
5702       SELECT SEARCH_FLAG, view_in_hierarchy_code, edit_in_hierarchy_code,
5703              customization_level, attribute_code, uom_class
5704         INTO l_was_searchable, l_view_in_hierarchy_code, l_edit_in_hierarchy_code,
5705              l_customization_level, l_attribute_code, l_uom_class
5706         FROM EGO_FND_DF_COL_USGS_EXT
5707        WHERE APPLICATION_ID = p_application_id
5708          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5709          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5710          AND APPLICATION_COLUMN_NAME = p_column;
5711     EXCEPTION
5712       WHEN OTHERS THEN
5713         l_was_searchable := NULL;
5714         l_view_in_hierarchy_code := NULL;
5715         l_edit_in_hierarchy_code := NULL;
5716         l_customization_level := NULL;
5717         l_attribute_code := NULL;
5718         l_uom_class := NULL;
5719     END;
5720     IF (p_view_in_hierarchy_code IS NULL OR
5721         p_view_in_hierarchy_code <> G_MISS_CHAR) THEN
5722       l_view_in_hierarchy_code := p_view_in_hierarchy_code;
5723     END IF;
5724     IF (p_edit_in_hierarchy_code IS NULL OR
5725         p_edit_in_hierarchy_code <> G_MISS_CHAR) THEN
5726       l_edit_in_hierarchy_code := p_edit_in_hierarchy_code;
5727     END IF;
5728     IF (p_customization_level IS NULL OR
5729         p_customization_level <> G_MISS_CHAR) THEN
5730       l_customization_level := p_customization_level;
5731     END IF;
5732     IF (p_attribute_code IS NULL OR
5733         p_attribute_code <> G_MISS_CHAR) THEN
5734       l_attribute_code := p_attribute_code;
5735     END IF;
5736     IF (p_uom_class IS NULL OR
5737         p_uom_class <> G_MISS_CHAR) THEN
5738       l_uom_class := p_uom_class;
5739     END IF;
5740     -----------------------------------
5741     -- get the attribute details -- fnd specific
5742     -----------------------------------
5743     BEGIN
5744       SELECT flex_value_set_id
5745       INTO l_value_set_id
5746       FROM FND_DESCR_FLEX_COLUMN_USAGES
5747       WHERE APPLICATION_ID = p_application_id
5748         AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5749         AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
5750         AND END_USER_COLUMN_NAME = p_internal_name;
5751     EXCEPTION
5752       WHEN OTHERS THEN
5753         l_value_set_id := NULL;
5754     END;
5755     IF (p_value_set_id IS NULL OR
5756         p_value_set_id <> G_MISS_NUM) THEN
5757       l_value_set_id := p_value_set_id;
5758     END IF;
5759 
5760     IF (FND_API.To_Boolean(p_is_nls_mode)) THEN
5761 
5762       -- We do this IF check this way so that if p_is_nls_mode is NULL,
5763       -- we still update the non-trans tables (i.e., we treat NULL as 'F')
5764       NULL;
5765 
5766     ELSE
5767 
5768       -- We only update this information if we are NOT in NLS mode
5769       -- (i.e., we don't update it if we are in NLS mode)
5770 
5771       -- Make sure updated sequence does not already exist
5772       SELECT COLUMN_SEQ_NUM
5773         INTO l_sequence
5774         FROM FND_DESCR_FLEX_COLUMN_USAGES
5775        WHERE APPLICATION_ID = p_application_id
5776          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5777          AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
5778          AND END_USER_COLUMN_NAME = p_internal_name;
5779 
5780       IF (l_sequence <> NVL(p_sequence, l_sequence)) THEN
5781         -- If the sequence is being updated to a NEW non-null value,
5782         -- check for uniqueness
5783 
5784         SELECT COUNT(*)
5785           INTO l_sequence
5786           FROM FND_DESCR_FLEX_COLUMN_USAGES
5787          WHERE APPLICATION_ID = p_application_id
5791 
5788            AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5789            AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
5790            AND COLUMN_SEQ_NUM = p_sequence;
5792         IF (l_sequence > 0) THEN
5793           RAISE e_attr_dup_seq_error;
5794         ELSE
5795           l_sequence := p_sequence;
5796         END IF;
5797 
5798       END IF;
5799 
5800       IF (p_display = EGO_EXT_FWK_PUB.G_CHECKBOX_DISP_TYPE
5801           OR p_display =EGO_EXT_FWK_PUB.G_RADIO_DISP_TYPE ) THEN --bugFix:5292226
5802 
5803         SELECT MULTI_ROW
5804           INTO l_multi_row_flag
5805           FROM EGO_FND_DSC_FLX_CTX_EXT
5806          WHERE APPLICATION_ID = p_application_id
5807            AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5808            AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name;
5809 
5810         IF (l_multi_row_flag = 'Y') THEN
5811 
5812           SELECT MIN(COLUMN_SEQ_NUM)
5813             INTO l_min_seq
5814             FROM FND_DESCR_FLEX_COLUMN_USAGES
5815            WHERE APPLICATION_ID = p_application_id
5816              AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5817              AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name;
5818 
5819           IF (p_sequence <= l_min_seq) THEN
5820             RAISE e_first_attr_cbox;
5821           END IF;
5822 
5823         END IF;
5824 
5825       END IF;
5826 
5827       -----------------------------------------------------------
5828       -- Moved out of the searchable block               --
5829       -- as we need table name for UOM column check also --
5830       -----------------------------------------------------------
5831       --added for BUGFIX:4547918
5832       SELECT DATA_TYPE
5833         INTO l_data_type_code
5834         FROM EGO_FND_DF_COL_USGS_EXT
5835        WHERE APPLICATION_ID = p_application_id
5836          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5837          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5838          AND APPLICATION_COLUMN_NAME = p_column;
5839 
5840       IF (l_data_type_code = 'A' ) THEN
5841         l_data_type_is_trans_text := TRUE;
5842       ELSE
5843         l_data_type_is_trans_text := FALSE;
5844       END IF;
5845 
5846 --      l_data_type_is_trans_text := (SUBSTR(p_column,1,11) = 'TL_EXT_ATTR');
5847       -- end BUGFIX:4547918
5848 
5849       IF (l_data_type_is_trans_text) THEN
5850         l_table_name := Get_TL_Table_Name(p_application_id
5851                                          ,p_attr_group_type);
5852       l_chg_table_name:=Get_Attr_Changes_TL_Table(p_application_id => p_application_id
5853                                        ,p_attr_group_type => p_attr_group_type);--for the pending table
5854 
5855       ELSE
5856         l_table_name := Get_Table_Name(p_application_id
5857                                       ,p_attr_group_type);
5858       l_chg_table_name:=Get_Attr_Changes_B_Table(p_application_id => p_application_id
5859                                        ,p_attr_group_type => p_attr_group_type);--for the pending table
5860 
5861       END IF;
5862 
5863       -----------------------------------------------------------
5864       -- If the Attribute is being made searchable and there's --
5865       -- not already an index on this column, we create one    --
5866       -----------------------------------------------------------
5867 
5868       IF (p_searchable = 'Y') THEN
5869 
5870 --        l_data_type_is_trans_text := (SUBSTR(p_column,1,11) = 'TL_EXT_ATTR');
5871 /***
5872 TO DO: right now we aren't using FND_COLUMNS's TRANSLATE_FLAG column, but we
5873        should be, and we should use that flag to determine if the Attr is TransText
5874        ...or else we should see which table this column's in, but that's an
5875        expensive query, I'd guess
5876 ***/
5877 
5878         IF (l_was_searchable IS NULL OR
5879             l_was_searchable <> p_searchable) THEN
5880 
5881           l_is_column_indexed := Is_Column_Indexed(
5882                                    p_column_name     => p_column
5883                                   ,p_table_name      => l_table_name
5884                                   ,p_application_id  => p_application_id
5885                                   ,p_attr_group_type => p_attr_group_type
5886                                  );
5887 
5888 --for checking whether the column in Pending table is indexed.
5889         l_is_chg_column_indexed := Is_Column_Indexed(p_column_name     => p_column
5890                                                 ,p_table_name      => l_chg_table_name
5891                                                 ,p_application_id  => p_application_id
5892                                                 ,p_attr_group_type => p_attr_group_type);
5893 
5894           END IF;
5895           IF ((l_is_column_indexed <> 'Y') OR (l_is_chg_column_indexed <> 'Y'))  THEN
5896 
5897         l_is_column_indexed :=Create_Index_For_DBCol(p_application_id => p_application_id
5898                                                      ,p_attr_group_type => p_attr_group_type
5899                                                      ,p_attr_group_name => p_attr_group_name
5900                                                      ,p_table_name => l_table_name
5901                                                      ,p_chg_table_name => l_chg_table_name
5902                                                      ,p_is_column_indexed => l_is_column_indexed
5903                                                      ,p_is_chg_column_indexed => l_is_chg_column_indexed
5907      END IF;
5904                                                      ,p_column => p_column
5905                                                      ,p_is_table_translatable =>l_data_type_is_trans_text);
5906           END IF;--IF((l_is_column_indexed <> 'Y') OR (l_is_chg_column_indexed <> 'Y'))
5908 
5909   -----------------------------------------------------------------------------------
5910     -- If the UOM Class is not null we need to make sure that we have             --
5911     -- a corresponding database column in user workbench                          --
5912     -- to store the UOM Code                                                      --
5913     -- bug 3875730                                                                --
5914  -----------------------------------------------------------------------------------
5915 
5916      IF(p_uom_class IS NOT  NULL) THEN
5917         l_valid_uom_column := check_Uom_Column_Exists(p_column , l_table_name );
5918 
5919         IF l_valid_uom_column IS NULL THEN
5920           RAISE e_uom_not_allowed;
5921         ELSIF l_valid_uom_column <> '1' THEN
5922 
5923           l_valid_uom_column := check_Uom_Col_In_Use ( p_application_id
5924                                                       ,p_attr_group_type
5925                                                       ,p_attr_group_name
5926                                                       ,p_internal_name
5927                                                       ,l_valid_uom_column
5928                                                      );
5929 
5930           IF l_valid_uom_column IS NOT NULL THEN
5931             RAISE e_uom_not_allowed;
5932           END IF ;
5933 
5934         END IF ;
5935 
5936       END IF ;
5937 
5938       SELECT WIDTH
5939         INTO l_col_width
5940         FROM FND_COLUMNS
5941        WHERE COLUMN_NAME = p_column
5942          AND TABLE_ID = (SELECT TABLE_ID
5943                            FROM FND_TABLES
5944                           WHERE TABLE_NAME = l_table_name);
5945 
5946       IF ( ((SUBSTR(p_column,1,11) = 'TL_EXT_ATTR') OR
5947             (SUBSTR(p_column,1,10) = 'C_EXT_ATTR')) AND
5948             LENGTH(p_default_value) >  l_col_width )THEN
5949         RAISE e_default_value_len_err;
5950 
5951       END IF;
5952 
5953 
5954       UPDATE FND_DESCR_FLEX_COLUMN_USAGES
5955          SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
5956              LAST_UPDATE_DATE = p_lud,
5957              LAST_UPDATE_LOGIN = g_current_login_id,
5958              COLUMN_SEQ_NUM = NVL(l_sequence, COLUMN_SEQ_NUM),
5959              ENABLED_FLAG = NVL(p_enabled, ENABLED_FLAG),
5960              REQUIRED_FLAG = NVL(p_required, REQUIRED_FLAG),
5961              DISPLAY_FLAG = NVL(p_display, DISPLAY_FLAG),
5962              FLEX_VALUE_SET_ID = l_value_set_id,
5963              DEFAULT_VALUE = p_default_value
5964        WHERE APPLICATION_ID =  p_application_id
5965          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5966          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5967          AND APPLICATION_COLUMN_NAME = p_column;
5968 
5969       UPDATE EGO_FND_DF_COL_USGS_EXT
5970          SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
5971              LAST_UPDATE_DATE = p_lud,
5972              LAST_UPDATE_LOGIN = g_current_login_id,
5973              INFO_1 = p_info_1,
5974              SEARCH_FLAG = NVL(p_searchable, SEARCH_FLAG),
5975              CONTROL_LEVEL = decode(p_control_level, -1, CONTROL_LEVEL, p_control_level),
5976              ATTRIBUTE_CODE = l_attribute_code,
5977              VIEW_IN_HIERARCHY_CODE = l_view_in_hierarchy_code, -- update or keep the same by default?
5978              EDIT_IN_HIERARCHY_CODE = l_edit_in_hierarchy_code, -- update or keep the same by default?
5979              UOM_CLASS = l_uom_class -- Bug: 3525490
5980             ,CUSTOMIZATION_LEVEL = l_customization_level
5981             ,UNIQUE_KEY_FLAG = NVL(p_unique_key_flag, UNIQUE_KEY_FLAG)--to update the unique key in case of multi row attrgrp.
5982        WHERE APPLICATION_ID = p_application_id
5983          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5984          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5985          AND APPLICATION_COLUMN_NAME = p_column;
5986 
5987     END IF;
5988 
5989     -- We update the TL information whether or not we're in NLS mode
5990     UPDATE FND_DESCR_FLEX_COL_USAGE_TL
5991        SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
5992            LAST_UPDATE_DATE = p_lud,
5993            LAST_UPDATE_LOGIN = g_current_login_id,
5994            FORM_LEFT_PROMPT = p_display_name,
5995            FORM_ABOVE_PROMPT = p_display_name,
5996            DESCRIPTION = p_description,
5997            SOURCE_LANG = USERENV('LANG')
5998      WHERE APPLICATION_ID = p_application_id
5999        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6000        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
6001        AND APPLICATION_COLUMN_NAME = p_column
6002        --AND LANGUAGE = USERENV('LANG');
6003       AND USERENV('LANG') in (LANGUAGE , SOURCE_LANG);
6004 
6005     -- Standard check of p_commit
6006     IF FND_API.To_Boolean(p_commit) THEN
6007       COMMIT WORK;
6008     END IF;
6009 
6010     x_return_status := FND_API.G_RET_STS_SUCCESS;
6011 
6012   EXCEPTION
6013 
6014     WHEN e_default_value_len_err THEN
6015       IF FND_API.To_Boolean(p_commit) THEN
6016         ROLLBACK TO Update_Attribute_PUB;
6017       END IF;
6018       x_return_status := FND_API.G_RET_STS_ERROR;
6022       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6019       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_DEFAULT_VAL_LEN_ERR');
6020       FND_MESSAGE.Set_Token('ATTR_MAX_LENGTH', l_col_width);
6021       FND_MSG_PUB.Add;
6023                                ,p_count   => x_msg_count
6024                                ,p_data    => x_msg_data);
6025 
6026     WHEN e_attr_dup_seq_error THEN
6027       IF FND_API.To_Boolean(p_commit) THEN
6028         ROLLBACK TO Update_Attribute_PUB;
6029       END IF;
6030       x_return_status := FND_API.G_RET_STS_ERROR;
6031       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_UP_ATTR_DUP_SEQ_ERR');
6032       FND_MSG_PUB.Add;
6033       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6034                                ,p_count   => x_msg_count
6035                                ,p_data    => x_msg_data);
6036     WHEN e_uom_not_allowed THEN
6037       IF FND_API.TO_BOOLEAN(p_commit) THEN
6038         ROLLBACK TO Update_Attribute_PUB;
6039       END IF;
6040       x_return_status :=  FND_API.G_RET_STS_ERROR;
6041       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_UOM_COL_ERR');
6042       FND_MSG_PUB.Add;
6043       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6044                                 ,p_count   => x_msg_count
6045                                 ,p_data    => x_msg_data);
6046 
6047 
6048     WHEN e_first_attr_cbox THEN--bugFix:5292226
6049       IF FND_API.To_Boolean(p_commit) THEN
6050         ROLLBACK TO Update_Attribute_PUB;
6051       END IF;
6052       x_return_status :=  FND_API.G_RET_STS_ERROR;
6053       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_MR_FIRST_ATTR_CBOX_ERR');
6054       FND_MSG_PUB.Add;
6055       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6056                                 ,p_count   => x_msg_count
6057                                 ,p_data    => x_msg_data);
6058 
6059     WHEN OTHERS THEN
6060       IF FND_API.To_Boolean(p_commit) THEN
6061         ROLLBACK TO Update_Attribute_PUB;
6062       END IF;
6063       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6064 
6065       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
6066       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
6067       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
6068       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
6069       FND_MSG_PUB.Add;
6070       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6071                                ,p_count   => x_msg_count
6072                                ,p_data    => x_msg_data);
6073 
6074 END Update_Attribute;
6075 
6076 ----------------------------------------------------------------------
6077 
6078 PROCEDURE Delete_Attribute (
6079         p_api_version                   IN   NUMBER
6080        ,p_application_id                IN   NUMBER
6081        ,p_attr_group_type               IN   VARCHAR2
6082        ,p_attr_group_name               IN   VARCHAR2
6083        ,p_attr_name                     IN   VARCHAR2
6084        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
6085        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
6086        ,x_return_status                 OUT NOCOPY VARCHAR2
6087        ,x_errorcode                     OUT NOCOPY NUMBER
6088        ,x_msg_count                     OUT NOCOPY NUMBER
6089        ,x_msg_data                      OUT NOCOPY VARCHAR2
6090 ) IS
6091 
6092     l_api_name               CONSTANT VARCHAR2(30)  := 'Delete_Attribute';
6093 
6094     --we don't use l_api_version yet, but eventually we might:
6095     --if we change required parameters, version goes from n.x to (n+1).x
6096     --if we change optional parameters, version goes from x.n to x.(n+1)
6097     l_api_version            CONSTANT NUMBER := 1.0;
6098 
6099     l_assocs_exist           BOOLEAN;
6100     l_token_table            ERROR_HANDLER.Token_Tbl_Type;
6101 
6102   BEGIN
6103 
6104     -- Check for call compatibility
6105     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
6106                                         l_api_name, G_PKG_NAME)
6107     THEN
6108       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6109     END IF;
6110     -- Initialize message list even though we don't currently use it
6111     IF FND_API.To_Boolean(p_init_msg_list) THEN
6112       FND_MSG_PUB.Initialize;
6113     END IF;
6114 
6115     l_assocs_exist := Check_Associations_Exist(p_application_id,
6116                                                p_attr_group_type,
6117                                                p_attr_group_name);
6118 
6119     IF (l_assocs_exist) THEN
6120 
6121       x_return_status := FND_API.G_RET_STS_ERROR;
6122 
6123       -- We need to select the translatable tokens for our error message --
6124       l_token_table(1).TOKEN_NAME := 'ATTR_DISP_NAME';
6125       SELECT TL.FORM_LEFT_PROMPT
6126         INTO l_token_table(1).TOKEN_VALUE
6127         FROM FND_DESCR_FLEX_COL_USAGE_TL  TL
6128             ,FND_DESCR_FLEX_COLUMN_USAGES FL_COL
6129        WHERE FL_COL.APPLICATION_ID = p_application_id
6130          AND FL_COL.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6131          AND FL_COL.DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
6132          AND FL_COL.END_USER_COLUMN_NAME = p_attr_name
6133          AND FL_COL.APPLICATION_ID = TL.APPLICATION_ID
6134          AND FL_COL.DESCRIPTIVE_FLEXFIELD_NAME = TL.DESCRIPTIVE_FLEXFIELD_NAME
6135          AND FL_COL.DESCRIPTIVE_FLEX_CONTEXT_CODE = TL.DESCRIPTIVE_FLEX_CONTEXT_CODE
6139       l_token_table(2).TOKEN_NAME := 'ATTR_GRP_NAME';
6136          AND FL_COL.APPLICATION_COLUMN_NAME = TL.APPLICATION_COLUMN_NAME
6137          AND TL.LANGUAGE = USERENV('LANG');
6138 
6140       SELECT DESCRIPTIVE_FLEX_CONTEXT_NAME
6141         INTO l_token_table(2).TOKEN_VALUE
6142         FROM FND_DESCR_FLEX_CONTEXTS_TL
6143        WHERE APPLICATION_ID = p_application_id
6144          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6145          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
6146          AND LANGUAGE = USERENV('LANG');
6147 
6148       ERROR_HANDLER.Add_Error_Message(
6149         p_message_name                  => 'EGO_EF_ASSOCS_EXIST2'
6150        ,p_application_id                => 'EGO'
6151        ,p_token_tbl                     => l_token_table
6152        ,p_message_type                  => FND_API.G_RET_STS_ERROR
6153        ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
6154       );
6155 
6156       x_msg_count := 1;
6157       ERROR_HANDLER.Get_Message(x_message_text => x_msg_data
6158                                ,x_entity_index => G_DUMMY_ENTITY_INDEX
6159                                ,x_entity_id    => G_DUMMY_ENTITY_ID
6160                                ,x_message_type => G_DUMMY_MESSAGE_TYPE);
6161 
6162     ELSE
6163 
6164       Delete_Attribute_Internal(p_application_id, p_attr_group_type, p_attr_group_name,
6165                                 p_attr_name, p_commit, x_return_status,
6166                                 x_errorcode, x_msg_count, x_msg_data);
6167 
6168     END IF;
6169 END Delete_Attribute;
6170 
6171 ----------------------------------------------------------------------
6172 
6173                        --------------------
6174                        -- Value Set APIs --
6175                        --------------------
6176 
6177 ----------------------------------------------------------------------
6178 
6179 PROCEDURE Create_Value_Set (
6180         p_api_version                   IN   NUMBER
6181 --       ,p_application_id                IN   NUMBER
6182        ,p_value_set_name                IN   VARCHAR2
6183        ,p_description                   IN   VARCHAR2
6184        ,p_format_code                   IN   VARCHAR2
6185        ,p_maximum_size                  IN   NUMBER     DEFAULT 0
6186        ,p_maximum_value                 IN   VARCHAR2
6187        ,p_minimum_value                 IN   VARCHAR2
6188        ,p_long_list_flag                IN   VARCHAR2
6189        ,p_validation_code               IN   VARCHAR2
6190        ,p_owner                         IN   NUMBER
6191        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
6192        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
6193        ,x_value_set_id                  OUT NOCOPY NUMBER
6194        ,x_return_status                 OUT NOCOPY VARCHAR2
6195 --       ,x_errorcode                     OUT NOCOPY NUMBER
6196        ,x_msg_count                     OUT NOCOPY NUMBER
6197        ,x_msg_data                      OUT NOCOPY VARCHAR2
6198 ) IS
6199 
6200     l_api_name               VARCHAR2(30);
6201 
6202     --we don't use l_api_version yet, but eventually we might:
6203     --if we change required parameters, version goes from n.x to (n+1).x
6204     --if we change optional parameters, version goes from x.n to x.(n+1)
6205     l_api_version            NUMBER := 1.0;
6206 
6207 --    l_add_where_clause       VARCHAR2(1000);
6208     l_owner                  NUMBER;
6209     l_maximum_size           NUMBER;
6210     l_format_code            FND_FLEX_VALUE_SETS.FORMAT_TYPE%TYPE;
6211     l_validation_code        FND_LOOKUP_VALUES.LOOKUP_CODE%TYPE;
6212     l_maximum_value          FND_FLEX_VALUE_SETS.MAXIMUM_VALUE%TYPE;
6213     l_minimum_value          FND_FLEX_VALUE_SETS.MINIMUM_VALUE%TYPE;
6214 --    l_Sysdate                DATE := Sysdate;
6215 
6216     l_owner_name             VARCHAR2(40):='ANONYMOUS';
6217   BEGIN
6218 
6219     l_api_name     := 'Create_Value_Set';
6220     l_api_version  := 1.0;
6221     code_debug(' Started '||l_api_name ||' with params ');
6222     code_debug('p_value_set_name - '|| p_value_set_name||' p_description - '||p_description);
6223     code_debug('p_maximum_size - '|| p_maximum_size||' p_maximum_value - '||p_maximum_value||' p_minimum_value - '||p_minimum_value);
6224     code_debug('p_format_code - '|| p_format_code||' p_validation_code - '||p_validation_code||' p_long_list_flag - '||p_long_list_flag);
6225     -- Standard start of API savepoint
6226     IF FND_API.To_Boolean(p_commit) THEN
6227       SAVEPOINT Create_Value_Set_PUB;
6228     END IF;
6229 
6230     -- Initialize message list even though we don't currently use it
6231     IF FND_API.To_Boolean(p_init_msg_list) THEN
6232       FND_MSG_PUB.Initialize;
6233     END IF;
6234 
6235     -- Check for call compatibility
6236     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
6237                                         l_api_name, G_PKG_NAME)
6238     THEN
6239       RAISE FND_API.G_EXC_ERROR;
6240     END IF;
6241 
6242     IF (p_owner IS NULL OR p_owner = -1) THEN
6243       l_owner := g_current_user_id;
6244     ELSE
6245       l_owner := p_owner;
6246     END IF;
6247 
6248     IF (p_maximum_size IS NULL) THEN
6249       l_maximum_size := 0;
6250     ELSE
6251       l_maximum_size := p_maximum_size;
6252     END IF;
6253 
6254     IF (p_validation_code IS NULL) THEN
6258     END IF;
6255       l_validation_code := G_NONE_VALIDATION_CODE;
6256     ELSE
6257       l_validation_code := p_validation_code;
6259 
6260     IF (p_format_code = G_TRANS_TEXT_DATA_TYPE) THEN
6261       -- this should never occur after
6262       l_format_code := G_CHAR_DATA_TYPE;
6263       l_validation_code := G_TRANS_IND_VALIDATION_CODE;
6264     ELSE
6265       l_format_code:= NVL(p_format_code,G_CHAR_DATA_TYPE);
6266     END IF;
6267 
6268     -- bug 4137720 trim extra spaces
6269     IF l_format_code <> G_CHAR_DATA_TYPE THEN
6270       IF (p_maximum_value IS NOT NULL) THEN
6271         l_maximum_value := TRIM(p_maximum_value);
6272       ELSE
6273         l_maximum_value := NULL;
6274       END IF;
6275       IF (p_minimum_value IS NOT NULL) THEN
6276         l_minimum_value := TRIM(p_minimum_value);
6277       ELSE
6278         l_minimum_value := NULL;
6279       END IF;
6280     ELSE
6281       l_maximum_value := p_maximum_value;
6282       l_minimum_value := p_minimum_value;
6283     END IF;
6284 
6285 --    l_add_where_clause := 'where lookup_type =''EGO_EF_'||
6286 --                          p_value_set_name||'_TYPE'' AND language = userenv(''LANG'')';
6287 
6288     FND_FLEX_VAL_API.Set_Session_Mode('customer_data');
6289 --Bug No:5292701 :START
6290    /* IF (l_validation_code = G_NONE_VALIDATION_CODE) THEN
6291     code_debug(l_api_name ||' FND_FLEX_VAL_API.Create_Valueset_None ');
6292       FND_FLEX_VAL_API.Create_Valueset_None(
6293         VALUE_SET_NAME                  => p_value_set_name
6294        ,DESCRIPTION                     => p_description
6295        ,SECURITY_AVAILABLE              => 'N'
6296        ,ENABLE_LONGLIST                 => p_long_list_flag
6297        ,FORMAT_TYPE                     => l_format_code
6298        ,MAXIMUM_SIZE                    => l_maximum_size
6299        ,PRECISION                       => null
6300        ,NUMBERS_ONLY                    => 'N'
6301        ,UPPERCASE_ONLY                  => 'N'
6302        ,RIGHT_JUSTIFY_ZERO_FILL         => 'N'
6303        ,MIN_VALUE                       => l_minimum_value
6304        ,MAX_VALUE                       => l_maximum_value
6305       );
6306 
6307     ELSIF (l_validation_code IN (G_INDEPENDENT_VALIDATION_CODE,G_TRANS_IND_VALIDATION_CODE) ) THEN
6308     code_debug(l_api_name ||' FND_FLEX_VAL_API.create_valueset_independent ');
6309       FND_FLEX_VAL_API.create_valueset_independent(
6310         value_set_name                  => p_value_set_name
6311        ,description                     => p_description
6312        ,security_available              => 'N'
6313        ,enable_longlist                 => p_long_list_flag
6314        ,format_type                     => l_format_code
6315        ,maximum_size                    => l_maximum_size
6316        ,precision                       => null
6317        ,numbers_only                    => 'N'
6318        ,uppercase_only                  => 'N'
6319        ,right_justify_zero_fill         => 'N'
6320        ,min_value                       => l_minimum_value
6321        ,max_value                       => l_maximum_value
6322         );
6323       IF l_validation_code =  G_TRANS_IND_VALIDATION_CODE THEN
6324         UPDATE fnd_flex_value_sets
6325         SET validation_type = l_validation_code
6326         WHERE flex_value_set_name = p_value_set_name;
6327       END IF;
6328     ELSIF (l_validation_code = G_TABLE_VALIDATION_CODE) THEN
6329     code_debug(l_api_name ||' FND_FLEX_VAL_API.Create_Valueset_Table ');
6330       --
6331       -- as the table information is mandatory using the API
6332       -- we are creating a value set with validation type as NONE
6333       -- and then changing the validation_code flag
6334       --
6335       FND_FLEX_VAL_API.Create_Valueset_None(
6336         VALUE_SET_NAME                  => p_value_set_name
6337        ,DESCRIPTION                     => p_description
6338        ,SECURITY_AVAILABLE              => 'N'
6339        ,ENABLE_LONGLIST                 => p_long_list_flag
6340        ,FORMAT_TYPE                     => l_format_code
6341        ,MAXIMUM_SIZE                    => l_maximum_size
6342        ,PRECISION                       => null
6343        ,NUMBERS_ONLY                    => 'N'
6344        ,UPPERCASE_ONLY                  => 'N'
6345        ,RIGHT_JUSTIFY_ZERO_FILL         => 'N'
6346        ,MIN_VALUE                       => l_minimum_value
6347        ,MAX_VALUE                       => l_maximum_value
6348       );
6349       UPDATE fnd_flex_value_sets
6350       SET validation_type = l_validation_code
6351       WHERE flex_value_set_name = p_value_set_name;
6352     END IF;*/
6353 --Bug No:5292701
6354     BEGIN
6355       SELECT USER_NAME INTO l_owner_name
6356       FROM FND_USER
6357       WHERE USER_ID = l_owner;
6358     EXCEPTION
6359        WHEN NO_DATA_FOUND THEN
6360         NULL;
6361     END;
6362 
6363       fnd_flex_loader_apis.up_value_set
6364       (
6365         p_upload_phase                 => 'BEGIN'
6366        ,p_upload_mode                   =>'non-MLS'
6367        ,p_flex_value_set_name          =>p_value_set_name
6368        ,p_owner                        =>l_owner_name
6369        ,p_validation_type              =>p_validation_code
6370        ,p_protected_flag               =>'N'
6371        ,p_security_enabled_flag        =>'N'
6372        ,p_longlist_flag                =>p_long_list_flag
6373        ,p_format_type                  =>l_format_code
6377        ,p_uppercase_only_flag          =>'N'
6374        ,p_maximum_size                 =>l_maximum_size
6375        ,p_number_precision             =>''
6376        ,p_alphanumeric_allowed_flag    =>'Y'
6378        ,p_numeric_mode_enabled_flag    =>'N'
6379        ,p_minimum_value                =>l_minimum_value
6380        ,p_maximum_value                =>l_maximum_value
6381        ,p_parent_flex_value_set_name   =>''
6382        ,p_dependant_default_value      =>''
6383        ,p_dependant_default_meaning    =>''
6384        ,p_description                  =>p_description
6385        );
6386       fnd_flex_loader_apis.up_value_set
6387       (
6388         p_upload_phase                 => 'END'
6389        ,p_upload_mode                   =>'non-MLS'
6390        ,p_flex_value_set_name          =>p_value_set_name
6391        ,p_owner                        =>l_owner_name
6392        ,p_validation_type              =>p_validation_code
6393        ,p_protected_flag               =>'N'
6394        ,p_security_enabled_flag        =>'N'
6395        ,p_longlist_flag                =>p_long_list_flag
6396        ,p_format_type                  =>l_format_code
6397        ,p_maximum_size                 =>l_maximum_size
6398        ,p_number_precision             =>''
6399        ,p_alphanumeric_allowed_flag    =>'Y'
6400        ,p_uppercase_only_flag          =>'N'
6401        ,p_numeric_mode_enabled_flag    =>'N'
6402        ,p_minimum_value                =>l_minimum_value
6403        ,p_maximum_value                =>l_maximum_value
6404        ,p_parent_flex_value_set_name   =>''
6405        ,p_dependant_default_value      =>''
6406        ,p_dependant_default_meaning    =>''
6407        ,p_description                  =>p_description
6408        );
6409 
6410 --Bug No:5292701 :END
6411 
6412     SELECT flex_value_set_id
6413       INTO x_value_set_id
6414       FROM fnd_flex_value_sets
6415      WHERE flex_value_set_name = p_value_set_name;
6416 
6417     -- Standard check of p_commit
6418     IF FND_API.To_Boolean(p_commit) THEN
6419       COMMIT WORK;
6420     END IF;
6421 
6422     x_return_status := FND_API.G_RET_STS_SUCCESS;
6423 
6424   EXCEPTION
6425     WHEN FND_API.G_EXC_ERROR THEN
6426     code_debug(l_api_name ||' EXCEPTION - FND_API.G_EXC_ERROR ');
6427       IF FND_API.To_Boolean( p_commit ) THEN
6428         ROLLBACK TO Create_Value_Set_PUB;
6429       END IF;
6430       x_return_status := FND_API.G_RET_STS_ERROR;
6431       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6432                                ,p_count   => x_msg_count
6433                                ,p_data    => x_msg_data);
6434     WHEN OTHERS THEN
6435     code_debug(l_api_name ||' EXCEPTION - OTHERS '||SQLERRM);
6436       IF FND_API.To_Boolean( p_commit ) THEN
6437         ROLLBACK TO Create_Value_Set_PUB;
6438       END IF;
6439       x_msg_data := fnd_message.get();
6440       IF x_msg_data IS NULL THEN
6441         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6442         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
6443         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
6444         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
6445         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM||' '||FND_FLEX_DSC_API.Message());
6446         FND_MSG_PUB.Add;
6447         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6448                                  ,p_count   => x_msg_count
6449                                  ,p_data    => x_msg_data);
6450       ELSE
6451         x_return_status := FND_API.G_RET_STS_ERROR;
6452         x_msg_count := 1;
6453       END IF;
6454 END Create_Value_Set;
6455 
6456 
6457 /*-----------------------------------------------------------------------------
6458 
6459   DESCRIPTION
6460     Creates a child value set
6461 
6462   PARAMETERS
6463     See below.
6464 
6465   NOTES
6466     (-) When calling this procedure from the java layer, leave the
6467         child_vs_value_ids as NULL. Persistence of these values is
6468         is handled separately.
6469 
6470 -----------------------------------------------------------------------------*/
6471 PROCEDURE Create_Child_Value_Set (
6472         p_api_version                   IN   NUMBER     := 1.0
6473        ,p_value_set_name                IN   VARCHAR2   -- Child Value Set Name
6474        ,p_description                   IN   VARCHAR2
6475        ,p_parent_vs_id                  IN   NUMBER
6476        ,p_owner                         IN   NUMBER
6477        ,child_vs_value_ids              IN   EGO_VALUE_SET_VALUE_IDS := NULL
6478                                            -- collection of value set value IDs
6479        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
6480        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
6481        ,x_child_vs_id                   OUT NOCOPY NUMBER -- child value set ID
6482        ,x_return_status                 OUT NOCOPY VARCHAR2
6483        ,x_msg_count                     OUT NOCOPY NUMBER
6484        ,x_msg_data                      OUT NOCOPY VARCHAR2
6485 ) IS
6486     l_api_name                VARCHAR2(30);
6487     l_parent_vs_row           ego_value_sets_v%ROWTYPE;
6488     l_maximum_size            ego_value_sets_v.maximum_size%TYPE;
6489     l_format_code             ego_value_sets_v.format_code%TYPE;
6490     l_minimum_value           ego_value_sets_v.minimum_value%TYPE;
6491     l_maximum_value           ego_value_sets_v.maximum_value%TYPE;
6492     l_long_list_flag          ego_value_sets_v.longlist_flag%TYPE;
6496     l_id_column_name          fnd_flex_validation_tables.id_column_name%TYPE;
6493     l_owner                   NUMBER;
6494     l_return_status_inf       VARCHAR2(1);
6495     l_inf_where_clause        VARCHAR2(1000);
6497     l_id_column_type          fnd_flex_validation_tables.id_column_type%TYPE;
6498     l_value_column_name       fnd_flex_validation_tables.value_column_name%TYPE;
6499     l_value_column_type       fnd_flex_validation_tables.value_column_type%TYPE;
6500 
6501   BEGIN
6502 
6503   -- For Debugging
6504   l_api_name      := 'Create_Child_Value_Set';
6505   code_debug(' Started '                || l_api_name           ||
6506              ' with params:'            ||
6507              ' p_value_set_name - '     || p_value_set_name     ||
6508              ' p_description - '        || p_description        ||
6509              ' p_parent_vs_id - '       || p_parent_vs_id       );
6510 
6511   -- Standard start of API savepoint
6512   IF FND_API.To_Boolean(p_commit) THEN
6513     SAVEPOINT Create_Child_Value_Set_PUB;
6514   END IF;
6515 
6516   code_debug('Current user ID is ' || g_current_user_id);
6517 
6518   --
6519   -- Get the Parent Value Set
6520   --
6521   SELECT *
6522   INTO   l_parent_vs_row
6523   FROM   ego_value_sets_v
6524   WHERE  value_set_id = p_parent_vs_id;
6525 
6526   -- Inherit all necessary properties from the parent value set initially.
6527   -- Later we'll override them with what has been passed to this procedure, if
6528   -- legal.
6529   l_maximum_size   := l_parent_vs_row.maximum_size;
6530   l_format_code    := l_parent_vs_row.format_code;
6531   l_minimum_value  := l_parent_vs_row.minimum_value;
6532   l_maximum_value  := l_parent_vs_row.maximum_value;
6533   l_long_list_flag := l_parent_vs_row.longlist_flag;
6534 
6535   -- Get the owner from the session info
6536   IF (p_owner IS NULL OR p_owner = -1) THEN
6537     l_owner := g_current_user_id;
6538   ELSE
6539     l_owner := p_owner;
6540   END IF;
6541 
6542   ----------------------------------------------------------------------------
6543   -- Create the value set header and get the value set id                   --
6544   ----------------------------------------------------------------------------
6545 
6546    Create_Value_Set (
6547         p_api_version                   => p_api_version
6548        ,p_value_set_name                => p_value_set_name
6549        ,p_description                   => p_description
6550        ,p_format_code                   => l_format_code
6551        ,p_maximum_size                  => l_maximum_size
6552        ,p_maximum_value                 => l_maximum_value
6553        ,p_minimum_value                 => l_minimum_value
6554        ,p_long_list_flag                => l_long_list_flag
6555        ,p_validation_code               => G_TABLE_VALIDATION_CODE
6556        ,p_owner                         => l_owner
6557        ,p_init_msg_list                 => p_init_msg_list
6558        ,p_commit                        => p_commit
6559        ,x_value_set_id                  => x_child_vs_id
6560                                       -- Child Value Set ID that gets generated
6561        ,x_return_status                 => x_return_status
6562        ,x_msg_count                     => x_msg_count
6563        ,x_msg_data                      => x_msg_data
6564   );
6565 
6566   -- check the return status
6567   IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6568     code_debug('Create_Child_Value_Set(): Child value set header creation failed.');
6569   END IF;
6570 
6571   code_debug('Create_Child_Value_Set(): New Child Value Set ID is ' || x_child_vs_id);
6572   code_debug('Create_Child_Value_Set(): Parent Value Set ID is ' || p_parent_vs_id);
6573   code_debug('Create_Child_Value_Set(): OWNER is ' || p_owner);
6574 
6575   ----------------------------------------------------------------------------
6576   -- Capture the parent-child relationship by inserting a row into          --
6577   -- EGO_VALUE_SET_EXT.                                                     --
6578   ----------------------------------------------------------------------------
6579 
6580   INSERT INTO ego_value_set_ext (value_set_id, parent_value_set_id,
6581     created_by, creation_date,  last_updated_by, last_update_date,
6582     last_update_login)
6583   VALUES (x_child_vs_id, p_parent_vs_id, l_owner, SYSDATE, l_owner, SYSDATE,
6584     g_current_login_id );
6585 
6586   ----------------------------------------------------------------------------
6587   -- Insert into EGO_VS_VALUES_DISP_ORDER                                   --
6588   ----------------------------------------------------------------------------
6589 
6590   -- NOTE: This is not used when creating a child VS from the UI. Only when
6591   -- using the PL/SQL API directly.
6592 
6593   IF child_vs_value_ids IS NOT NULL THEN
6594     FOR i IN child_vs_value_ids.FIRST .. child_vs_value_ids.LAST
6595     LOOP
6596       code_debug('Current value is ' || child_vs_value_ids(i));
6597       code_debug('i: ' || i);
6598 
6599       -- Remember, we specify which of the EXISTING value set values (from the parent value
6600       -- set) are to become members of the child value set. No new values are
6601       -- created.
6602 
6603       INSERT INTO ego_vs_values_disp_order (value_set_value_id, value_set_id,
6604         disp_sequence, created_by, creation_date, last_updated_by,
6605         last_update_date, last_update_login)
6606       VALUES (child_vs_value_ids(i),  x_child_vs_id, i, l_owner, SYSDATE, l_owner,
6610   END IF;
6607               SYSDATE, g_current_login_id);
6608 
6609     END LOOP;
6611 
6612   ----------------------------------------------------------------------------
6613   -- Insert into FND_FLEX_VALIDATION_TABLES                                 --
6614   ----------------------------------------------------------------------------
6615 
6616   l_return_status_inf := FND_API.G_FALSE;
6617 
6618   -- The condition to obtain the correct subset of VS values from
6619   -- EGO_VS_VALUES_DISP_ORDER
6620   l_inf_where_clause :=
6621     'vsv.FLEX_VALUE_ID = do.value_set_value_id                 AND ' ||
6622     'do.value_set_id   = ' || x_child_vs_id  || '              AND ' ||
6623     'vsv.value_set_id  = ' || p_parent_vs_id || '              AND ' ||
6624     --
6625     -------------------------- BEGIN Bug Fix 6016429 -------------------------
6626     --
6627     -- We need conditions that ensure only enabled values
6628     -- show up in the USER level UI pages. The 3 criteria for displaying it
6629     -- to the user are:
6630     --
6631     --   (1) The value should be enabled
6632     --
6633     'vsv.ENABLED_CODE  = ''Y''                                 AND ' ||
6634     --   (2) The start date must be in the past
6635     --
6636     '('                                                              ||
6637     ' (vsv.start_date IS NOT NULL AND vsv.start_date   <= SYSDATE) ' ||
6638     ' OR '                                                           ||
6639     ' (vsv.start_date IS NULL) '                                     ||
6640     ') '                                                             ||
6641                                                               'AND ' ||
6642     --   (3) The end date must be in the present or future
6643     --
6644     '( '                                                             ||
6645     ' (vsv.end_date   IS NOT NULL AND vsv.end_date     >= SYSDATE) ' ||
6646     ' OR '                                                           ||
6647     ' (vsv.end_date   IS NULL) '                                     ||
6648 
6649       ------------------------ BEGIN Bug Fix 6148833 -------------------------
6650       --                                                                    --
6651       -- There must be a space before the ORDER BY, otherwise the order by  --
6652       -- removal pattern matching that takes place later will fail.         --
6653       --                                                                    --
6654     ') '                                                             ||
6655       ------------------------ END Bug Fix 6148833 ---------------------------
6656 
6657     -------------------------- END Bug Fix 6016429 ---------------------------
6658 
6659     'ORDER BY do.disp_sequence';
6660 
6661   -- SSARNOBA: As an experiment to fix 6194774, try editing the data type of the
6662   -- value set directly in the table FND_FLEX_VALIDATION_TABLES and then retry
6663   -- the search
6664 
6665   -- Bug fix 6319734 - convert the SELECT clause expressions if necessary.
6666   Build_Child_VS_Select_Exprs (
6667      p_parent_vs_row           => l_parent_vs_row
6668    , x_id_column_type          => l_id_column_type
6669    , x_value_column_type       => l_value_column_type
6670    , x_id_column_name          => l_id_column_name
6671    , x_value_column_name       => l_value_column_name
6672   );
6673 
6674   Insert_Value_Set_Table_Inf (
6675       p_api_version                      => p_api_version
6676     , p_value_set_id                     => x_child_vs_id
6677     , p_table_application_id             => 431
6678     , p_table_name                       => 'EGO_VALUE_SET_VALUES_V vsv , EGO_VS_VALUES_DISP_ORDER do'
6679     , p_value_column_name                => l_value_column_name
6680     , p_value_column_type                => l_value_column_type
6681     , p_value_column_size                => 150
6682     , p_meaning_column_name              => NULL
6683     , p_meaning_column_type              => NULL
6684     , p_meaning_column_size              => NULL
6685     , p_id_column_name                   => l_id_column_name
6686     , p_id_column_type                   => l_id_column_type
6687     , p_id_column_size                   => 150
6688     , p_where_order_by                   => l_inf_where_clause
6689     , p_additional_columns               => ''
6690     , p_owner                            => l_owner
6691     , p_init_msg_list                    => p_init_msg_list
6692     , p_commit                           => p_commit
6693     , x_return_status                    => l_return_status_inf
6694     , x_msg_count                        => x_msg_count
6695     , x_msg_data                         => x_msg_data
6696   );
6697 
6698   -- check the return status
6699   IF ( l_return_status_inf <> FND_API.G_RET_STS_SUCCESS AND
6700        x_return_status = FND_API.G_RET_STS_SUCCESS ) THEN
6701 
6702     -- Nothing had gone wrong until now, so set the global
6703     -- return status to the most recent one.
6704     x_return_status := l_return_status_inf;
6705     code_debug('Create_Child_Value_Set(): Insert into FND_FLEX_VALIDATION_TABLES failed.');
6706     RAISE FND_API.G_EXC_ERROR;
6707 
6708   END IF;
6709 
6710   IF FND_API.To_Boolean(p_commit) THEN
6711     COMMIT WORK;
6712   END IF;
6713 
6714   x_return_status := FND_API.G_RET_STS_SUCCESS;
6715 
6716   EXCEPTION
6717     WHEN FND_API.G_EXC_ERROR THEN
6718       IF FND_API.TO_BOOLEAN(p_commit) THEN
6719         ROLLBACK TO Create_Child_Value_Set_PUB;
6720       END IF;
6721       x_return_status := FND_API.G_RET_STS_ERROR;
6725         ROLLBACK TO Create_Child_Value_Set_PUB;
6722 
6723     WHEN OTHERS THEN
6724       IF FND_API.To_Boolean( p_commit ) THEN
6726       END IF;
6727       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6728 
6729       code_debug('SQL_ERR_MSG ' || SQLERRM);
6730 
6731       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
6732       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
6733       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
6734       FND_MSG_PUB.Add;
6735       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6736                                ,p_count   => x_msg_count
6737                                ,p_data    => x_msg_data);
6738 
6739 
6740       code_debug('END Create_Child_Value_Set');
6741 
6742 
6743 END Create_Child_Value_Set;
6744 
6745 
6746 /*-----------------------------------------------------------------------------
6747 
6748   DESCRIPTION
6749     Deletes a child value set
6750 
6751   PARAMETERS
6752     See below.
6753 
6754 -----------------------------------------------------------------------------*/
6755 PROCEDURE Delete_Child_Value_Set (
6756         p_api_version                   IN   NUMBER
6757        ,p_application_id                IN   NUMBER
6758        ,p_child_vs_id                   IN   NUMBER
6759        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
6760        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
6761        ,x_return_status                 OUT NOCOPY VARCHAR2
6762        ,x_errorcode                     OUT NOCOPY NUMBER
6763        ,x_msg_count                     OUT NOCOPY NUMBER
6764        ,x_msg_data                      OUT NOCOPY VARCHAR2
6765 )
6766 IS
6767 BEGIN
6768 
6769   ----------------------------------------------------------------------------
6770   -- Delete from fnd_flex_value_sets                                        --
6771   ----------------------------------------------------------------------------
6772   delete from FND_FLEX_VALUE_SETS where flex_value_set_id = p_child_vs_id;
6773 
6774 
6775   ----------------------------------------------------------------------------
6776   -- Delete from EGO_VALUE_SET_EXT                                          --
6777   ----------------------------------------------------------------------------
6778   delete from ego_value_set_ext where VALUE_SET_ID = p_child_vs_id;
6779 
6780   ----------------------------------------------------------------------------
6781   -- Delete from EGO_VS_VALUES_DISP_ORDER                                   --
6782   ----------------------------------------------------------------------------
6783   delete from ego_vs_values_disp_order where VALUE_SET_ID = p_child_vs_id;
6784 
6785 END Delete_Child_Value_Set;
6786 
6787 
6788 PROCEDURE Update_Value_Set (
6789         p_api_version                   IN   NUMBER
6790        ,p_value_set_id                  IN   NUMBER
6791        ,p_description                   IN   VARCHAR2
6792        ,p_format_code                   IN   VARCHAR2
6793        ,p_maximum_size                  IN   NUMBER
6794        ,p_maximum_value                 IN   VARCHAR2
6795        ,p_minimum_value                 IN   VARCHAR2
6796        ,p_long_list_flag                IN   FND_FLEX_VALUE_SETS.LONGLIST_FLAG%TYPE
6797                                                                     -- VARCHAR2
6798        ,p_validation_code               IN   VARCHAR2
6799        ,p_owner                         IN   NUMBER     DEFAULT NULL
6800        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
6801        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
6802        ,x_return_status                 OUT NOCOPY VARCHAR2
6803 --       ,x_errorcode                     OUT NOCOPY NUMBER
6804        ,x_msg_count                     OUT NOCOPY NUMBER
6805        ,x_msg_data                      OUT NOCOPY VARCHAR2
6806 ) IS
6807 
6808     l_api_name               VARCHAR2(30);
6809     --we don't use l_api_version yet, but eventually we might:
6810     --if we change required parameters, version goes from n.x to (n+1).x
6811     --if we change optional parameters, version goes from x.n to x.(n+1)
6812     l_api_version            NUMBER;
6813 
6814     l_maximum_size           NUMBER;
6815     l_Sysdate                DATE;
6816     l_OPDXcheck_dummy        VARCHAR(2);
6817     l_owner                  NUMBER;
6818 
6819     l_format_code            FND_FLEX_VALUE_SETS.FORMAT_TYPE%TYPE;
6820     l_maximum_value          FND_FLEX_VALUE_SETS.MAXIMUM_VALUE%TYPE;
6821     l_minimum_value          FND_FLEX_VALUE_SETS.MINIMUM_VALUE%TYPE;
6822 
6823     l_value_set_rec          EGO_VALUE_SETS_V%ROWTYPE;
6824   BEGIN
6825 
6826     l_api_name    := 'Update_Value_Set';
6827     l_api_version := 1.0;
6828     l_Sysdate     := SYSDATE;
6829 
6830     -- Standard start of API savepoint
6831     IF FND_API.To_Boolean(p_commit) THEN
6832       SAVEPOINT Update_Value_Set_PUB;
6833     END IF;
6834 
6835     -- Initialize message list even though we don't currently use it
6836     IF FND_API.To_Boolean(p_init_msg_list) THEN
6837       FND_MSG_PUB.Initialize;
6838     END IF;
6839 
6840     -- Check for call compatibility
6841     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
6842                                         l_api_name, G_PKG_NAME)
6843     THEN
6844       RAISE FND_API.G_EXC_ERROR;
6845     END IF;
6846 
6850       l_owner := p_owner;
6847     IF (p_owner IS NULL OR p_owner = -1) THEN
6848       l_owner := g_current_user_id;
6849     ELSE
6851     END IF;
6852 
6853     IF p_maximum_size IS NULL THEN
6854       l_maximum_size := 0;
6855     ELSE
6856       l_maximum_size := p_maximum_size;
6857     END IF;
6858 
6859     IF (p_format_code    = G_TRANS_TEXT_DATA_TYPE) THEN
6860       -- this should never occur after
6861       l_format_code     := G_CHAR_DATA_TYPE;
6862     ELSE
6863       l_format_code     := NVL(p_format_code,G_CHAR_DATA_TYPE);
6864     END IF;
6865 
6866     -- bug 4137720 trim extra spaces
6867     IF l_format_code <> G_CHAR_DATA_TYPE THEN
6868       IF (p_maximum_value IS NOT NULL) THEN
6869         l_maximum_value := TRIM(p_maximum_value);
6870       ELSE
6871         l_maximum_value := NULL;
6872       END IF;
6873       IF (p_minimum_value IS NOT NULL) THEN
6874         l_minimum_value := TRIM(p_minimum_value);
6875       ELSE
6876         l_minimum_value := NULL;
6877       END IF;
6878     ELSE
6879       l_maximum_value   := p_maximum_value;
6880       l_minimum_value   := p_minimum_value;
6881     END IF;
6882 
6883     -- API not available in FND for updation
6884     -- logged bug 3957430 against FND
6885     UPDATE FND_FLEX_VALUE_SETS
6886        SET DESCRIPTION       = p_description,
6887            LONGLIST_FLAG     = p_long_list_flag,
6888            MINIMUM_VALUE     = l_minimum_value,
6889            MAXIMUM_VALUE     = l_maximum_value,
6890            MAXIMUM_SIZE      = l_maximum_size,
6891            LAST_UPDATED_BY   = l_owner,
6892            LAST_UPDATE_DATE  = l_Sysdate,
6893            LAST_UPDATE_LOGIN = g_current_login_id
6894      WHERE FLEX_VALUE_SET_ID = p_value_set_id;
6895 
6896     --------------------------------------------------------------------------
6897     --                  Update all the child value sets                     --
6898     --------------------------------------------------------------------------
6899 
6900     -- Even though there is strong consistency between child and parent long
6901     -- list display types, it is still necessary to maintain a separate value
6902     -- for the child? It is not sufficient for the child value set's long list
6903     -- display type to be obtained from the parent value set since we do not
6904     -- always distinguish between parent and child value sets (e.g. the user
6905     -- UI rather than the setup workbench UI).
6906 
6907     --
6908     -- REASON FOR SUB-OPTIMAL SYNTAX
6909     --
6910     -- Unfortunately, we cannot use a single update statement on all rows
6911     -- where the ego_value_sets_v.value_set_id is in the list of child value
6912     -- ids. While we can obtain a collection of child value IDs:
6913     --
6914     --   EXECUTE IMMEDIATE
6915     --     'SELECT value_set_id FROM ego_value_sets_v ' ||
6916     --     'WHERE parent_value_set_id = p_value_set_id'
6917     --   BULK COLLECT INTO child_value_set_ids;
6918     --
6919     -- we cannot use it in a SQL Update statement like this:
6920     --
6921     --   UPDATE fnd_flex_value_sets
6922     --   SET    longlist_flag = p_long_list_flag
6923     --   WHERE  flex_value_set_id IN TABLE (child_value_set_ids);
6924     --
6925     -- because the collection's data type
6926     -- is user-defined. We will get a PLS-00642 error since the collection
6927     -- type is locally defined (in the function or the package, as opposed
6928     -- to globally). The SQL compiler cannot determine type safety. Only
6929     -- the PL/SQL compiler can, hence the need for a less efficient
6930     -- cursor approach.
6931 
6932     <<child_value_set_ids_loop>>
6933     FOR l_value_set_rec IN
6934      (SELECT *
6935       FROM   ego_value_sets_v
6936       WHERE  parent_value_set_id = p_value_set_id)
6937     LOOP
6938 
6939       -- Update the long list display type
6940       UPDATE fnd_flex_value_sets
6941       SET    longlist_flag = p_long_list_flag
6942       WHERE  flex_value_set_id = l_value_set_rec.value_set_id;
6943 
6944       -- dbms_output.put_line(' ' || l_value_set_rec.value_set_id);
6945     END LOOP child_value_set_ids_loop;
6946 
6947 
6948     -- Standard check of p_commit
6949     IF FND_API.To_Boolean(p_commit) THEN
6950       COMMIT WORK;
6951     END IF;
6952 
6953     x_return_status := FND_API.G_RET_STS_SUCCESS;
6954 
6955   EXCEPTION
6956     WHEN FND_API.G_EXC_ERROR THEN
6957       IF FND_API.To_Boolean( p_commit ) THEN
6958         ROLLBACK TO Update_Value_Set_PUB;
6959       END IF;
6960       x_return_status := FND_API.G_RET_STS_ERROR;
6961       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6962                                ,p_count   => x_msg_count
6963                                ,p_data    => x_msg_data);
6964 
6965     WHEN OTHERS THEN
6966       IF FND_API.To_Boolean( p_commit ) THEN
6967         ROLLBACK TO Update_Value_Set_PUB;
6968       END IF;
6969       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6970 
6971       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
6972       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
6973       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
6974       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
6975       FND_MSG_PUB.Add;
6976       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6977                                ,p_count   => x_msg_count
6981 
6978                                ,p_data    => x_msg_data);
6979 
6980 END Update_Value_Set;
6982 
6983 /*-----------------------------------------------------------------------------
6984 
6985   DESCRIPTION
6986     Updates a child value set
6987 
6988   PARAMETERS
6989     See below.
6990 
6991   NOTES
6992     (-) Old child value set IDs get erased.
6993     (-) The value set name cannot be altered after creation.
6994     (-) The 'created' fields will not retain the old data. The fact that the
6995         value set values are recreated every time becomes apparent when \
6996         viewing these fields.
6997 
6998 -----------------------------------------------------------------------------*/
6999 
7000 PROCEDURE Update_Child_Value_Set (
7001         p_api_version                   IN   NUMBER
7002        ,p_value_set_id                  IN   NUMBER
7003        ,p_description                   IN   VARCHAR2
7004        ,p_format_code                   IN   VARCHAR2
7005        ,p_owner                         IN   NUMBER     DEFAULT NULL
7006        ,child_vs_value_ids              IN   EGO_VALUE_SET_VALUE_IDS
7007        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
7008        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
7009        ,x_return_status                 OUT NOCOPY VARCHAR2
7010        ,x_msg_count                     OUT NOCOPY NUMBER
7011        ,x_msg_data                      OUT NOCOPY VARCHAR2
7012 ) IS
7013   l_vs_value_count                      NUMBER;
7014   l_api_name                            VARCHAR2(30);
7015   l_parent_vs_row                       ego_value_sets_v%ROWTYPE;
7016   l_validation_code                     FND_LOOKUP_VALUES.LOOKUP_CODE%TYPE;
7017   l_vs_value_disp_orders                EGO_VS_VALUES_DISP_ORDER_TBL
7018                                             := ego_vs_values_disp_order_tbl();
7019 BEGIN
7020 
7021   -- For Debugging
7022   l_api_name      := 'Update_Child_Value_Set';
7023   code_debug(' Started '                || l_api_name           ||
7024              ' with params:'            ||
7025              ' p_value_set_id - '       || p_value_set_id       ||
7026              ' p_description - '        || p_description        );
7027 
7028   -- Standard start of API savepoint
7029   IF FND_API.To_Boolean(p_commit) THEN
7030     SAVEPOINT Update_Child_Value_Set_PUB;
7031   END IF;
7032 
7033 
7034   ----------------------------------------------------------------------------
7035   -- Get unchanged (thus unspecified) but mandatory properties from parent  --
7036   ----------------------------------------------------------------------------
7037 
7038   SELECT pvs.*
7039   INTO   l_parent_vs_row
7040   FROM   ego_value_sets_v vs, ego_value_sets_v pvs
7041   WHERE  vs.parent_value_set_id = pvs.value_set_id
7042    AND   vs.value_set_id = p_value_set_id;
7043 
7044   l_validation_code := l_parent_vs_row.validation_code_admin;
7045 
7046   -- Make sure the validation type is independent or translatable independent.
7047   IF (l_validation_code <> G_INDEPENDENT_VALIDATION_CODE AND
7048       l_validation_code <> G_TRANS_IND_VALIDATION_CODE) THEN
7049       RAISE FND_API.G_EXC_ERROR;
7050   END IF;
7051 
7052 
7053   ----------------------------------------------------------------------------
7054   --                    Update the value set header                         --
7055   ----------------------------------------------------------------------------
7056 
7057   Update_Value_Set (
7058         p_api_version                   => p_api_version
7059        ,p_value_set_id                  => p_value_set_id
7060        ,p_description                   => p_description
7061        ,p_format_code                   => l_parent_vs_row.format_code
7062        ,p_maximum_size                  => l_parent_vs_row.maximum_size
7063        ,p_maximum_value                 => l_parent_vs_row.maximum_value
7064        ,p_minimum_value                 => l_parent_vs_row.minimum_value
7065        ,p_long_list_flag                => l_parent_vs_row.longlist_flag
7066        ,p_validation_code               => l_parent_vs_row.validation_code_admin
7067        ,p_owner                         => p_owner
7068        ,p_init_msg_list                 => p_init_msg_list
7069        ,p_commit                        => p_commit
7070        ,x_return_status                 => x_return_status
7071        ,x_msg_count                     => x_msg_count
7072        ,x_msg_data                      => x_msg_data
7073   );
7074 
7075 
7076   -- Nothing to update in EGO_VALUE_SET_EXT (because the parent-child
7077   -- relationship cannot be modified)
7078 
7079   ----------------------------------------------------------------------------
7080   --                    Update EGO_VS_VALUES_DISP_ORDER                     --
7081   ----------------------------------------------------------------------------
7082 
7083   -- Create a collection for the new child VS values' rows
7084 
7085   FOR i IN child_vs_value_ids.FIRST .. child_vs_value_ids.LAST
7086   LOOP
7087     code_debug('Current value is ' || child_vs_value_ids(i));
7088     code_debug('i: ' || i);
7089 
7090     l_vs_value_count := 0;
7091     SELECT COUNT(*) INTO l_vs_value_count
7092     FROM ego_vs_values_disp_order
7093     WHERE value_set_value_id = child_vs_value_ids(i)
7094       AND value_set_id = p_value_set_id;
7095 
7096     -- Add an extra space onto the array
7097     l_vs_value_disp_orders.extend();
7101       -- copy the old creation info
7098 
7099     IF (l_vs_value_count > 0) THEN         -- value already existed in child VS
7100       -- Add a row to the collection of new value sets, with the new 'update' attributes
7102       -- SSARNOBA: I'm not even sure if this is needed
7103       SELECT
7104           value_set_value_id                              -- VALUE_SET_VALUE_ID
7105         , value_set_id                                          -- VALUE_SET_ID
7106         , i                                                    -- DISP_SEQUENCE
7107         , created_by                                              -- CREATED_BY
7108         , creation_date                                        -- CREATION_DATE
7109         , p_owner                                            -- LAST_UPDATED_BY
7110         , SYSDATE                                           -- LAST_UPDATE_DATE
7111         , g_current_login_id                               -- LAST_UPDATE_LOGIN
7112       INTO l_vs_value_disp_orders(i)
7113       FROM ego_vs_values_disp_order
7114       WHERE value_set_value_id = child_vs_value_ids(i) and
7115             value_set_id = p_value_set_id;
7116     ELSE
7117       -- Add a row to the collection of new value sets
7118       -- with new creation info.
7119       SELECT
7120           child_vs_value_ids(i)                           -- VALUE_SET_VALUE_ID
7121         , p_value_set_id                                        -- VALUE_SET_ID
7122         , i                                                    -- DISP_SEQUENCE
7123         , p_owner                                                 -- CREATED_BY
7124         , SYSDATE                                              -- CREATION_DATE
7125         , p_owner                                            -- LAST_UPDATED_BY
7126         , SYSDATE                                           -- LAST_UPDATE_DATE
7127         , g_current_login_id                               -- LAST_UPDATE_LOGIN
7128       INTO l_vs_value_disp_orders(i)
7129       FROM dual;
7130     END IF;
7131   END LOOP;
7132 
7133   -- Delete all the existing values from the child VS
7134   DELETE FROM ego_vs_values_disp_order
7135   WHERE value_set_id = p_value_set_id;
7136 
7137   -- Insert the new values for the child VS from the collection
7138   FORALL j IN l_vs_value_disp_orders.FIRST ..
7139               l_vs_value_disp_orders.LAST
7140     INSERT INTO ego_vs_values_disp_order
7141     VALUES l_vs_value_disp_orders(j);
7142   -- END FORALL
7143 
7144 
7145   x_return_status := FND_API.G_RET_STS_SUCCESS;
7146 
7147   EXCEPTION
7148     WHEN OTHERS THEN
7149       IF FND_API.To_Boolean( p_commit ) THEN
7150         ROLLBACK TO Update_Child_Value_Set_PUB;
7151       END IF;
7152       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7153 
7154       code_debug('SQL_ERR_MSG ' || SQLERRM);
7155 
7156       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
7157       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
7158       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
7159       FND_MSG_PUB.Add;
7160       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7161                                ,p_count   => x_msg_count
7162                                ,p_data    => x_msg_data);
7163 
7164 END;
7165 
7166 ----------------------------------------------------------------------
7167 
7168 PROCEDURE Insert_Value_Set_Table_Inf (
7169         p_api_version                   IN   NUMBER
7170        ,p_value_set_id                  IN   NUMBER
7171        ,p_table_application_id          IN   NUMBER
7172        ,p_table_name                    IN   VARCHAR2
7173        ,p_value_column_name             IN   VARCHAR2
7174        ,p_value_column_type             IN   VARCHAR2
7175        ,p_value_column_size             IN   NUMBER
7176        ,p_meaning_column_name           IN   VARCHAR2
7177        ,p_meaning_column_type           IN   VARCHAR2
7178        ,p_meaning_column_size           IN   NUMBER
7179        ,p_id_column_name                IN   VARCHAR2
7180        ,p_id_column_type                IN   VARCHAR2
7181        ,p_id_column_size                IN   NUMBER
7182        ,p_where_order_by                IN   VARCHAR2
7183        ,p_additional_columns            IN   VARCHAR2
7184        ,p_owner                         IN   NUMBER     DEFAULT NULL
7185        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
7186        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
7187        ,x_return_status                 OUT NOCOPY VARCHAR2
7188        ,x_msg_count                     OUT NOCOPY NUMBER
7189        ,x_msg_data                      OUT NOCOPY VARCHAR2
7190 ) IS
7191 
7192     l_api_name               VARCHAR2(30);
7193     --we don't use l_api_version yet, but eventually we might:
7194     --if we change required parameters, version goes from n.x to (n+1).x
7195     --if we change optional parameters, version goes from x.n to x.(n+1)
7196     l_api_version            NUMBER;
7197     l_Sysdate                DATE;
7198     l_owner                  NUMBER;
7199     l_where_order_by         VARCHAR(2000);
7200 
7201   BEGIN
7202 
7203     l_api_name      := 'Insert_Value_Set_Table_Inf';
7204     l_api_version   := 1.0;
7205     l_Sysdate       := SYSDATE;
7206     code_debug(l_api_name ||' start ');
7207 
7208     -- Standard start of API savepoint
7209     IF FND_API.To_Boolean(p_commit) THEN
7210       SAVEPOINT Insert_Value_Set_Table_Inf_PUB;
7211     END IF;
7212 
7213     -- Initialize message list even though we don't currently use it
7217 
7214     IF FND_API.To_Boolean(p_init_msg_list) THEN
7215       FND_MSG_PUB.Initialize;
7216     END IF;
7218     -- Check for call compatibility
7219     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
7220                                         l_api_name, G_PKG_NAME)
7221     THEN
7222       RAISE FND_API.G_EXC_ERROR;
7223     END IF;
7224 
7225     IF (p_owner IS NULL OR p_owner = -1) THEN
7226       l_owner := g_current_user_id;
7227     ELSE
7228       l_owner := p_owner;
7229     END IF;
7230 
7231     ---------------------- BEGIN Bug fix 6148833 -----------------------------
7232 
7233     -- Since we can't modify IN function arguments, we have to make a copy
7234     -- of the clause.
7235     l_where_order_by         := p_where_order_by;
7236 
7237     -- Insert a space before an ORDER BY clause, so that
7238     -- order by elimination takes place for inner query blocks.
7239     Insert_Order_By_Space (
7240       p_where_order_by       => l_where_order_by
7241     );
7242 
7243     ---------------------- END Bug fix 6148833 -------------------------------
7244 
7245     code_debug(l_api_name ||' inserting data into fnd_flex_validation_tables ');
7246     INSERT INTO fnd_flex_validation_tables
7247     (
7248         FLEX_VALUE_SET_ID
7249        ,APPLICATION_TABLE_NAME
7250        ,VALUE_COLUMN_NAME
7251        ,VALUE_COLUMN_TYPE
7252        ,VALUE_COLUMN_SIZE
7253        ,COMPILED_ATTRIBUTE_COLUMN_NAME
7254        ,ENABLED_COLUMN_NAME
7255        ,HIERARCHY_LEVEL_COLUMN_NAME
7256        ,START_DATE_COLUMN_NAME
7257        ,END_DATE_COLUMN_NAME
7258        ,SUMMARY_ALLOWED_FLAG
7259        ,SUMMARY_COLUMN_NAME
7260        ,ID_COLUMN_NAME
7261        ,ID_COLUMN_TYPE
7262        ,ID_COLUMN_SIZE
7263        ,MEANING_COLUMN_NAME
7264        ,MEANING_COLUMN_TYPE
7265        ,MEANING_COLUMN_SIZE
7266        ,TABLE_APPLICATION_ID
7267        ,ADDITIONAL_WHERE_CLAUSE
7268        ,ADDITIONAL_QUICKPICK_COLUMNS
7269        ,CREATED_BY
7270        ,CREATION_DATE
7271        ,LAST_UPDATED_BY
7272        ,LAST_UPDATE_DATE
7273        ,LAST_UPDATE_LOGIN
7274     )
7275     VALUES
7276     (
7277         p_value_set_id          --FLEX_VALUE_SET_ID
7278        ,p_table_name            --APPLICATION_TABLE_NAME
7279        ,p_value_column_name     --VALUE_COLUMN_NAME
7280        ,p_value_column_type     --VALUE_COLUMN_TYPE
7281        ,p_value_column_size     --VALUE_COLUMN_SIZE
7282 --       ,p_value_column_name     --COMPILED_ATTRIBUTE_COLUMN_NAME
7283        ,'NULL'                    --COMPILED_ATTRIBUTE_COLUMN_NAME
7284 --       ,'Y'                     --ENABLED_COLUMN_NAME
7285        ,'''Y'''                 --ENABLED_COLUMN_NAME
7286        ,'NULL'                  --HIERARCHY_LEVEL_COLUMN_NAME
7287 --       ,'START_DATE_COLUMN_NAME' --START_DATE_COLUMN_NAME
7288 --       ,'END_DATE_COLUMN_NAME'   --END_DATE_COLUMN_NAME
7289        ,'TO_DATE(NULL)'         --START_DATE_COLUMN_NAME
7290        ,'TO_DATE(NULL)'         --END_DATE_COLUMN_NAME
7291        ,'N'                     --SUMMARY_ALLOWED_FLAG
7292        ,'''N'''                 --SUMMARY_COLUMN_NAME
7293        ,p_id_column_name        --ID_COLUMN_NAME
7294        ,p_id_column_type        --ID_COLUMN_SIZE
7295        ,p_id_column_size        --ID_COLUMN_TYPE
7296        ,p_meaning_column_name   --MEANING_COLUMN_NAME
7297        ,p_meaning_column_type   --MEANING_COLUMN_TYPE
7298        ,p_meaning_column_size   --MEANING_COLUMN_SIZE
7299        ,p_table_application_id  --TABLE_APPLICATION_ID
7300        ,l_where_order_by        --ADDITIONAL_WHERE_CLAUSE
7301        ,''                      --ADDITIONAL_QUICKPICK_COLUMNS
7302        ,l_owner                 --CREATED_BY
7303        ,l_Sysdate               --CREATION_DATE
7304        ,l_owner                 --LAST_UPDATED_BY
7305        ,l_Sysdate               --LAST_UPDATE_DATE
7306        ,g_current_login_id      --LAST_UPDATE_LOGIN
7307     );
7308 
7309     code_debug(l_api_name ||' inserting data into fnd_flex_validation_tables COMPLETED ');
7310     -- Standard check of p_commit
7311     IF FND_API.To_Boolean(p_commit) THEN
7312       COMMIT WORK;
7313     END IF;
7314 
7315     x_return_status := FND_API.G_RET_STS_SUCCESS;
7316 
7317   EXCEPTION
7318     WHEN FND_API.G_EXC_ERROR THEN
7319       code_debug(l_api_name ||' EXCEPTION desired ');
7320       IF FND_API.To_Boolean(p_commit) THEN
7321         ROLLBACK TO Insert_Value_Set_Table_Inf_PUB;
7322       END IF;
7323       x_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
7324       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7325                                ,p_count   => x_msg_count
7326                                ,p_data    => x_msg_data);
7327     WHEN OTHERS THEN
7328       code_debug(l_api_name ||' EXCEPTION  OTHERS '|| SQLERRM);
7329       IF FND_API.To_Boolean(p_commit) THEN
7330         ROLLBACK TO Insert_Value_Set_Table_Inf_PUB;
7331       END IF;
7332       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7333 
7334       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
7335       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
7336       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
7337       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
7338       FND_MSG_PUB.Add;
7339       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7340                                ,p_count   => x_msg_count
7341                                ,p_data    => x_msg_data);
7342 
7346 
7343 END Insert_Value_Set_table_Inf;
7344 
7345 ----------------------------------------------------------------------
7347 PROCEDURE Update_Value_Set_Table_Inf (
7348         p_api_version                   IN   NUMBER
7349        ,p_value_set_id                  IN   NUMBER
7350        ,p_table_application_id          IN   NUMBER
7351        ,p_table_name                    IN   VARCHAR2
7352        ,p_value_column_name             IN   VARCHAR2
7353        ,p_value_column_type             IN   VARCHAR2
7354        ,p_value_column_size             IN   NUMBER
7355        ,p_meaning_column_name           IN   VARCHAR2
7356        ,p_meaning_column_type           IN   VARCHAR2
7357        ,p_meaning_column_size           IN   NUMBER
7358        ,p_id_column_name                IN   VARCHAR2
7359        ,p_id_column_type                IN   VARCHAR2
7360        ,p_id_column_size                IN   NUMBER
7361        ,p_where_order_by                IN   VARCHAR2
7362        ,p_additional_columns            IN   VARCHAR2
7363        ,p_owner                         IN   NUMBER     DEFAULT NULL
7364        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
7365        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
7366        ,x_return_status                 OUT NOCOPY VARCHAR2
7367        ,x_msg_count                     OUT NOCOPY NUMBER
7368        ,x_msg_data                      OUT NOCOPY VARCHAR2
7369 ) IS
7370 
7371     l_api_name               VARCHAR2(30);
7372     --we don't use l_api_version yet, but eventually we might:
7373     --if we change required parameters, version goes from n.x to (n+1).x
7374     --if we change optional parameters, version goes from x.n to x.(n+1)
7375     l_api_version            NUMBER;
7376     l_Sysdate                DATE;
7377     l_owner                  NUMBER;
7378     l_where_order_by         VARCHAR(2000);
7379 
7380   BEGIN
7381 
7382     l_api_name      := 'Update_Value_Set_Table_Inf';
7383     l_api_version   := 1.0;
7384     l_Sysdate       := SYSDATE;
7385 
7386     code_debug(l_api_name ||' start ');
7387     -- Standard start of API savepoint
7388     IF FND_API.To_Boolean(p_commit) THEN
7389       SAVEPOINT Update_Value_Set_Table_Inf_PUB;
7390     END IF;
7391 
7392     -- Initialize message list even though we don't currently use it
7393     IF FND_API.To_Boolean(p_init_msg_list) THEN
7394       FND_MSG_PUB.Initialize;
7395     END IF;
7396 
7397     -- Check for call compatibility
7398     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
7399                                         l_api_name, G_PKG_NAME)
7400     THEN
7401       RAISE FND_API.G_EXC_ERROR;
7402     END IF;
7403 
7404     IF (p_owner IS NULL OR p_owner = -1) THEN
7405       l_owner := g_current_user_id;
7406     ELSE
7407       l_owner := p_owner;
7408     END IF;
7409 
7410     ---------------------- BEGIN Bug fix 6148833 -----------------------------
7411 
7412     -- Since we can't modify IN function arguments, we have to make a copy
7413     -- of the clause.
7414     l_where_order_by         := p_where_order_by;
7415 
7416     -- Insert a space before an ORDER BY clause, so that
7417     -- order by elimination takes place for inner query blocks.
7418     Insert_Order_By_Space (
7419       p_where_order_by       => l_where_order_by
7420     );
7421 
7422     ---------------------- END Bug fix 6148833 -------------------------------
7423 
7424     code_debug(l_api_name ||' calling update fnd_flex_validation_tables ');
7425     -- no API available from fnd logged bug 3957430
7426     UPDATE FND_FLEX_VALIDATION_TABLES
7427        SET APPLICATION_TABLE_NAME = p_table_name,
7428            VALUE_COLUMN_NAME = p_value_column_name,
7429            VALUE_COLUMN_TYPE = p_value_column_type,
7430            VALUE_COLUMN_SIZE = p_value_column_size,
7431 --           COMPILED_ATTRIBUTE_COLUMN_NAME = p_value_column_name,
7432 --           ENABLED_COLUMN_NAME = 'Y',
7433 --           HIERARCHY_LEVEL_COLUMN_NAME = 'Y',
7434 --           START_DATE_COLUMN_NAME = 'START_DATE_COLUMN_NAME',
7435 --           END_DATE_COLUMN_NAME  = 'END_DATE_COLUMN_NAME',
7436 --           SUMMARY_ALLOWED_FLAG = 'N',
7437 --           SUMMARY_COLUMN_NAME = 'N',
7438            ID_COLUMN_NAME = p_id_column_name,
7439            ID_COLUMN_SIZE = p_id_column_size,
7440            ID_COLUMN_TYPE = p_id_column_type,
7441            MEANING_COLUMN_NAME = p_meaning_column_name,
7442            MEANING_COLUMN_SIZE = p_meaning_column_size,
7443            MEANING_COLUMN_TYPE = p_meaning_column_type,
7444            TABLE_APPLICATION_ID = p_table_application_id,
7445            ADDITIONAL_WHERE_CLAUSE = l_where_order_by,
7446 --           ADDITIONAL_QUICKPICK_COLUMNS = '',
7447            LAST_UPDATED_BY = l_owner,
7448            LAST_UPDATE_DATE = l_Sysdate,
7449            LAST_UPDATE_LOGIN = g_current_login_id
7450      WHERE FLEX_VALUE_SET_ID = p_value_set_id;
7451 
7452     code_debug(l_api_name ||' calling update fnd_flex_validation_tables COMPLETED ');
7453     -- Standard check of p_commit
7454     IF FND_API.To_Boolean(p_commit) THEN
7455       COMMIT WORK;
7456     END IF;
7457 
7458     x_return_status := FND_API.G_RET_STS_SUCCESS;
7459 
7460   EXCEPTION
7461     WHEN FND_API.G_EXC_ERROR THEN
7462       code_debug(l_api_name ||' EXCEPTION desired ');
7463       IF FND_API.To_Boolean(p_commit) THEN
7464         ROLLBACK TO Update_Value_Set_Table_Inf_PUB;
7465       END IF;
7466       x_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
7470     WHEN OTHERS THEN
7467       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7468                                ,p_count   => x_msg_count
7469                                ,p_data    => x_msg_data);
7471       code_debug(l_api_name ||' EXCEPTION  OTHERS '|| SQLERRM);
7472       IF FND_API.To_Boolean(p_commit) THEN
7473         ROLLBACK TO Update_Value_Set_Table_Inf_PUB;
7474       END IF;
7475       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7476 
7477       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
7478       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
7479       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
7480       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
7481       FND_MSG_PUB.Add;
7482       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7483                                ,p_count   => x_msg_count
7484                                ,p_data    => x_msg_data);
7485 
7486 END Update_Value_Set_table_Inf;
7487 
7488 ----------------------------------------------------------------------
7489 
7490                     --------------------------
7491                     -- Value Set Value APIs --
7492                     --------------------------
7493 
7494 ----------------------------------------------------------------------
7495 
7496 PROCEDURE Create_Value_Set_Val (
7497         p_api_version                   IN   NUMBER
7498        ,p_value_set_name                IN   VARCHAR2
7499        ,p_internal_name                 IN   VARCHAR2
7500        ,p_display_name                  IN   VARCHAR2
7501        ,p_description                   IN   VARCHAR2
7502        ,p_sequence                      IN   NUMBER
7503        ,p_start_date                    IN   DATE
7504        ,p_end_date                      IN   DATE
7505        ,p_enabled                       IN   VARCHAR2
7506        ,p_owner                         IN   NUMBER     DEFAULT NULL
7507        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
7508        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
7509        ,x_return_status                 OUT NOCOPY VARCHAR2
7510        ,x_msg_count                     OUT NOCOPY NUMBER
7511        ,x_msg_data                      OUT NOCOPY VARCHAR2
7512 ) IS
7513 
7514     l_api_name               VARCHAR2(30);
7515     --we don't use l_api_version yet, but eventually we might:
7516     --if we change required parameters, version goes from n.x to (n+1).x
7517     --if we change optional parameters, version goes from x.n to x.(n+1)
7518     l_api_version            NUMBER;
7519     l_storage_value          VARCHAR2(32767);
7520 
7521     l_flex_value_id          FND_FLEX_VALUES.flex_value_id%TYPE;
7522 --    l_Sysdate                DATE;
7523     l_rowid                  VARCHAR2(100);
7524     l_owner                  NUMBER;
7525 
7526   BEGIN
7527 
7528     l_api_name      := 'Create_Value_Set_Val';
7529     l_api_version   := 1.0;
7530 
7531     -- Standard start of API savepoint
7532     IF FND_API.To_Boolean(p_commit) THEN
7533       SAVEPOINT Create_Value_Set_Val_PUB;
7534     END IF;
7535 
7536     -- Initialize message list even though we don't currently use it
7537     IF FND_API.To_Boolean(p_init_msg_list) THEN
7538       FND_MSG_PUB.Initialize;
7539     END IF;
7540 
7541     -- Check for call compatibility
7542     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
7543                                         l_api_name, G_PKG_NAME)
7544     THEN
7545       RAISE FND_API.G_EXC_ERROR;
7546     END IF;
7547 
7548     IF (p_owner IS NULL OR p_owner = -1) THEN
7549       l_owner := g_current_user_id;
7550     ELSE
7551       l_owner := p_owner;
7552     END IF;
7553 
7554 /***
7555     INSERT INTO fnd_lookup_values
7556     (
7557         LOOKUP_TYPE
7558        ,LANGUAGE
7559        ,LOOKUP_CODE
7560        ,MEANING
7561        ,DESCRIPTION
7562        ,ENABLED_FLAG
7563        ,START_DATE_ACTIVE
7564        ,END_DATE_ACTIVE
7565        ,SOURCE_LANG
7566        ,SECURITY_GROUP_ID
7567        ,VIEW_APPLICATION_ID
7568        ,TERRITORY_CODE
7569        ,ATTRIBUTE_CATEGORY
7570        ,ATTRIBUTE1
7571        ,ATTRIBUTE2
7572        ,ATTRIBUTE3
7573        ,ATTRIBUTE4
7574        ,ATTRIBUTE5
7575        ,ATTRIBUTE6
7576        ,ATTRIBUTE7
7577        ,ATTRIBUTE8
7578        ,ATTRIBUTE9
7579        ,ATTRIBUTE10
7580        ,ATTRIBUTE11
7581        ,ATTRIBUTE12
7582        ,ATTRIBUTE13
7583        ,ATTRIBUTE14
7584        ,ATTRIBUTE15
7585        ,TAG
7586        ,CREATED_BY
7587        ,CREATION_DATE
7588        ,LAST_UPDATED_BY
7589        ,LAST_UPDATE_DATE
7590        ,LAST_UPDATE_LOGIN
7591     )
7592     SELECT
7593        'EGO_EF_'||p_value_set_name||'_TYPE' --LOOKUP_TYPE
7594        ,L.LANGUAGE_CODE         --LANGUAGE
7595        ,p_internal_name         --LOOKUP_CODE
7596        ,p_display_name          --MEANING
7597        ,p_description           --DESCRIPTION
7598        ,p_enabled               --ENABLED_FLAG
7599        ,p_start_date            --START_DATE_ACTIVE
7600        ,p_end_date              --END_DATE_ACTIVE
7601        ,USERENV('LANG')         --SOURCE_LANG
7602        ,0                       --SECURITY_GROUP_ID
7603        ,p_application_id        --VIEW_APPLICATION_ID
7604        ,''                      --TERRITORY_CODE
7608        ,''                      --ATTRIBUTE3
7605        ,''                      --ATTRIBUTE_CATEGORY
7606        ,''                      --ATTRIBUTE1
7607        ,''                      --ATTRIBUTE2
7609        ,''                      --ATTRIBUTE4
7610        ,''                      --ATTRIBUTE5
7611        ,''                      --ATTRIBUTE6
7612        ,''                      --ATTRIBUTE7
7613        ,''                      --ATTRIBUTE8
7614        ,''                      --ATTRIBUTE9
7615        ,''                      --ATTRIBUTE10
7616        ,''                      --ATTRIBUTE11
7617        ,''                      --ATTRIBUTE12
7618        ,''                      --ATTRIBUTE13
7619        ,''                      --ATTRIBUTE14
7620        ,''                      --ATTRIBUTE15
7621        ,to_char(p_sequence)     --TAG
7622        ,g_current_user_id       --CREATED_BY
7623        ,l_Sysdate               --CREATION_DATE
7624        ,g_current_user_id       --LAST_UPDATED_BY
7625        ,l_Sysdate               --LAST_UPDATE_DATE
7626        ,g_current_login_id      --LAST_UPDATE_LOGIN
7627     FROM FND_LANGUAGES  L
7628     WHERE L.INSTALLED_FLAG in ('I', 'B');
7629 ***/
7630 
7631       Process_Value_Set_Val (
7632         p_transaction_type      => 'CREATE'
7633        ,p_value_set_name        => p_value_set_name
7634        ,p_internal_name         => p_internal_name
7635        ,p_display_name          => p_display_name
7636        ,p_description           => p_description
7637        ,p_sequence              => p_sequence
7638        ,p_start_date            => p_start_date
7639        ,p_end_date              => p_end_date
7640        ,p_enabled               => p_enabled
7641        ,p_owner                 => l_owner
7642        ,x_return_status         => x_return_status
7643        );
7644     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7645       RAISE FND_API.G_EXC_ERROR;
7646     END IF;
7647 
7648     -- Standard check of p_commit
7649     IF FND_API.To_Boolean(p_commit) THEN
7650       COMMIT WORK;
7651     END IF;
7652 
7653     x_return_status := FND_API.G_RET_STS_SUCCESS;
7654 
7655   EXCEPTION
7656     WHEN FND_API.G_EXC_ERROR THEN
7657       code_debug( l_api_name || ' EXCEPTION - FND_API.G_EXC_ERROR ');
7658       IF FND_API.To_Boolean(p_commit) THEN
7659         ROLLBACK TO Create_Value_Set_Val_PUB;
7660       END IF;
7661       x_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
7662       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7663                                ,p_count   => x_msg_count
7664                                ,p_data    => x_msg_data);
7665     WHEN OTHERS THEN
7666       code_debug( l_api_name || ' EXCEPTION - OTHERS ');
7667       code_debug (l_api_name|| sqlerrm );
7668       IF FND_API.To_Boolean(p_commit) THEN
7669         ROLLBACK TO Create_Value_Set_Val_PUB;
7670       END IF;
7671       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7672 
7673       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
7674       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
7675       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
7676       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
7677       FND_MSG_PUB.Add;
7678       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7679                                ,p_count   => x_msg_count
7680                                ,p_data    => x_msg_data);
7681 
7682 END Create_Value_Set_Val;
7683 
7684 ----------------------------------------------------------------------
7685 
7686 PROCEDURE Update_Value_Set_Val (
7687         p_api_version                   IN   NUMBER
7688        ,p_value_set_name                IN   VARCHAR2
7689        ,p_internal_name                 IN   VARCHAR2
7690        ,p_display_name                  IN   VARCHAR2
7691        ,p_description                   IN   VARCHAR2
7692        ,p_sequence                      IN   NUMBER
7693        ,p_start_date                    IN   DATE
7694        ,p_end_date                      IN   DATE
7695        ,p_enabled                       IN   VARCHAR2
7696        ,p_owner                         IN   NUMBER     DEFAULT NULL
7697        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
7698        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
7699        ,x_return_status                 OUT NOCOPY VARCHAR2
7700        ,x_msg_count                     OUT NOCOPY NUMBER
7701        ,x_msg_data                      OUT NOCOPY VARCHAR2
7702 ) IS
7703 
7704     l_api_name               VARCHAR2(30);
7705     --we don't use l_api_version yet, but eventually we might:
7706     --if we change required parameters, version goes from n.x to (n+1).x
7707     --if we change optional parameters, version goes from x.n to x.(n+1)
7708     l_api_version            NUMBER;
7709     l_owner                  NUMBER;
7710 
7711   BEGIN
7712 
7713     l_api_name      := 'Update_Value_Set_Val';
7714     l_api_version   := 1.0;
7715 
7716     -- Standard start of API savepoint
7717     IF FND_API.To_Boolean(p_commit) THEN
7718       SAVEPOINT Update_Value_Set_Val_PUB;
7719     END IF;
7720 
7721     -- Initialize message list even though we don't currently use it
7722     IF FND_API.To_Boolean(p_init_msg_list) THEN
7723       FND_MSG_PUB.Initialize;
7724     END IF;
7725 
7726     -- Check for call compatibility
7727     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
7728                                         l_api_name, G_PKG_NAME)
7732 
7729     THEN
7730       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7731     END IF;
7733     IF (p_owner IS NULL OR p_owner = -1) THEN
7734       l_owner := g_current_user_id;
7735     ELSE
7736       l_owner := p_owner;
7737     END IF;
7738 /***
7739     l_lookup_type := 'EGO_EF_'||p_value_set_name||'_TYPE';
7740 
7741     UPDATE FND_LOOKUP_VALUES
7742        SET MEANING = p_display_name,
7743            DESCRIPTION = p_description,
7744            ENABLED_FLAG = p_enabled,
7745            START_DATE_ACTIVE = p_start_date,
7746            END_DATE_ACTIVE = p_end_date,
7747            TAG = TO_CHAR(p_sequence),
7748            LAST_UPDATED_BY = g_current_user_id,
7749            LAST_UPDATE_DATE = l_Sysdate,
7750            LAST_UPDATE_LOGIN = g_current_login_id,
7751            SOURCE_LANG = USERENV('LANG')
7752      WHERE LOOKUP_TYPE = l_lookup_type
7753        AND LOOKUP_CODE = p_internal_name
7754        AND VIEW_APPLICATION_ID = p_application_id
7755        --AND LANGUAGE = USERENV('LANG');
7756        AND USERENV('LANG') IN (LANGUAGE, SOURCE_LANG);
7757 ***/
7758      Process_Value_Set_Val (
7759         p_transaction_type      => 'UPDATE'
7760        ,p_value_set_name        => p_value_set_name
7761        ,p_internal_name         => p_internal_name
7762        ,p_display_name          => p_display_name
7763        ,p_description           => p_description
7764        ,p_sequence              => p_sequence
7765        ,p_start_date            => p_start_date
7766        ,p_end_date              => p_end_date
7767        ,p_enabled               => p_enabled
7768        ,p_owner                 => l_owner
7769        ,x_return_status         => x_return_status
7770        );
7771     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7772       RAISE FND_API.G_EXC_ERROR;
7773     END IF;
7774 
7775     -- Standard check of p_commit
7776     IF FND_API.To_Boolean(p_commit) THEN
7777       COMMIT WORK;
7778     END IF;
7779 
7780     x_return_status := FND_API.G_RET_STS_SUCCESS;
7781 
7782   EXCEPTION
7783     WHEN FND_API.G_EXC_ERROR THEN
7784       code_debug( l_api_name || ' EXCEPTION - FND_API.G_EXC_ERROR ');
7785       IF FND_API.To_Boolean(p_commit) THEN
7786         ROLLBACK TO Update_Value_Set_Val_PUB;
7787       END IF;
7788       x_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
7789       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7790                                ,p_count   => x_msg_count
7791                                ,p_data    => x_msg_data);
7792     WHEN OTHERS THEN
7793       code_debug( l_api_name || ' EXCEPTION - OTHERS ');
7794       code_debug (l_api_name|| sqlerrm );
7795       IF FND_API.To_Boolean(p_commit) THEN
7796         ROLLBACK TO Update_Value_Set_Val_PUB;
7797       END IF;
7798       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7799 
7800       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
7801       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
7802       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
7803       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
7804       FND_MSG_PUB.Add;
7805       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7806                                ,p_count   => x_msg_count
7807                                ,p_data    => x_msg_data);
7808 
7809 END Update_Value_Set_Val;
7810 
7811 
7812 PROCEDURE Translate_Value_Set_Val
7813        (p_api_version           IN   NUMBER
7814        ,p_value_set_name        IN   VARCHAR2
7815        ,p_internal_name         IN   VARCHAR2
7816        ,p_display_name          IN   VARCHAR2
7817        ,p_description           IN   VARCHAR2
7818        ,p_last_update_date      IN   VARCHAR2
7819        ,p_last_updated_by       IN   NUMBER
7820        ,p_init_msg_list         IN   VARCHAR2
7821        ,p_commit                IN   VARCHAR2
7822        ,x_return_status         OUT  NOCOPY  VARCHAR2
7823        ,x_msg_count             OUT  NOCOPY  NUMBER
7824        ,x_msg_data              OUT  NOCOPY  VARCHAR2
7825        ) IS
7826     l_flex_value_id      fnd_flex_values.flex_value_id%TYPE;
7827     l_value_set_id       fnd_flex_values.flex_value_set_id%TYPE;
7828     l_validation_type    fnd_flex_value_sets.validation_type%TYPE;
7829 
7830     l_vsv_row            fnd_flex_values%ROWTYPE;
7831     l_vsvtl_row          fnd_flex_values_tl%ROWTYPE;
7832 
7833     CURSOR c_get_vs_details (cp_value_set_id IN  NUMBER) IS
7834     SELECT vsvtl.last_updated_by, vsvtl.last_update_date
7835     FROM FND_FLEX_VALUES vsv, FND_FLEX_VALUES_TL vsvtl
7836     WHERE vsv.flex_value_set_id = cp_value_set_id
7837     AND   vsv.flex_value = p_internal_name
7838     AND   vsv.flex_value_id = vsvtl.flex_value_id
7839     AND  USERENV('LANG') IN (language, source_lang);
7840 
7841 
7842     l_last_update_login  fnd_flex_values.last_update_login%TYPE;
7843     l_last_update_date   fnd_flex_values.last_update_date%TYPE;
7844     l_last_updated_by    fnd_flex_values.last_updated_by%TYPE;
7845 
7846 BEGIN
7847   SELECT vs.flex_value_set_id, vs.validation_type
7848   INTO l_value_set_id, l_validation_type
7849   FROM FND_FLEX_VALUE_SETS vs
7850   WHERE vs.flex_value_set_name = p_value_set_name;
7851 
7852   IF l_validation_type = G_TRANS_IND_VALIDATION_CODE THEN
7853 
7854     OPEN c_get_vs_details (cp_value_set_id => l_value_set_id);
7855     FETCH c_get_vs_details INTO  l_last_updated_by, l_last_update_date;
7856     CLOSE c_get_vs_details;
7857 
7858     l_last_update_login := FND_GLOBAL.Login_Id;
7859 
7863                                  ,l_last_update_date
7860     IF (fnd_load_util.upload_test(p_last_updated_by
7861                                  ,p_last_update_date
7862                                  ,l_last_updated_by
7864                                  ,NULL)) THEN
7865       SELECT vsv.*
7866       INTO l_vsv_row
7867       FROM FND_FLEX_VALUES vsv
7868       WHERE vsv.flex_value_set_id = l_value_set_id
7869       AND   vsv.flex_value = p_internal_name;
7870 
7871       FND_FLEX_VALUES_PKG.UPDATE_ROW
7872         (x_flex_value_id            => l_vsv_row.flex_value_id
7873         ,x_attribute_sort_order     => l_vsv_row.attribute_sort_order
7874         ,x_flex_value_set_id        => l_value_set_id
7875         ,x_flex_value               => p_internal_name
7876         ,x_enabled_flag             => l_vsv_row.enabled_flag
7877         ,x_summary_flag             => l_vsv_row.summary_flag
7878         ,x_start_date_active        => l_vsv_row.start_date_active
7879         ,x_end_date_active          => l_vsv_row.end_date_active
7880         ,x_parent_flex_value_low    => l_vsv_row.parent_flex_value_low
7881         ,x_parent_flex_value_high   => l_vsv_row.parent_flex_value_high
7882         ,x_structured_hierarchy_level => l_vsv_row.structured_hierarchy_level
7883         ,x_hierarchy_level            => l_vsv_row.hierarchy_level
7884         ,x_compiled_value_attributes  => l_vsv_row.compiled_value_attributes
7885         ,x_value_category             => l_vsv_row.value_category
7886         ,x_attribute1                 => l_vsv_row.attribute1
7887         ,x_attribute2                 => l_vsv_row.attribute2
7888         ,x_attribute3                 => l_vsv_row.attribute3
7889         ,x_attribute4                 => l_vsv_row.attribute4
7890         ,x_attribute5                 => l_vsv_row.attribute5
7891         ,x_attribute6                 => l_vsv_row.attribute6
7892         ,x_attribute7                 => l_vsv_row.attribute7
7893         ,x_attribute8                 => l_vsv_row.attribute8
7894         ,x_attribute9                 => l_vsv_row.attribute9
7895         ,x_attribute10                => l_vsv_row.attribute10
7896         ,x_attribute11                => l_vsv_row.attribute11
7897         ,x_attribute12                => l_vsv_row.attribute12
7898         ,x_attribute13                => l_vsv_row.attribute13
7899         ,x_attribute14                => l_vsv_row.attribute14
7900         ,x_attribute15                => l_vsv_row.attribute15
7901         ,x_attribute16                => l_vsv_row.attribute16
7902         ,x_attribute17                => l_vsv_row.attribute17
7903         ,x_attribute18                => l_vsv_row.attribute18
7904         ,x_attribute19                => l_vsv_row.attribute19
7905         ,x_attribute20                => l_vsv_row.attribute20
7906         ,x_attribute21                => l_vsv_row.attribute21
7907         ,x_attribute22                => l_vsv_row.attribute22
7908         ,x_attribute23                => l_vsv_row.attribute23
7909         ,x_attribute24                => l_vsv_row.attribute24
7910         ,x_attribute25                => l_vsv_row.attribute25
7911         ,x_attribute26                => l_vsv_row.attribute26
7912         ,x_attribute27                => l_vsv_row.attribute27
7913         ,x_attribute28                => l_vsv_row.attribute28
7914         ,x_attribute29                => l_vsv_row.attribute29
7915         ,x_attribute30                => l_vsv_row.attribute30
7916         ,x_attribute31                => l_vsv_row.attribute31
7917         ,x_attribute32                => l_vsv_row.attribute32
7918         ,x_attribute33                => l_vsv_row.attribute33
7919         ,x_attribute34                => l_vsv_row.attribute34
7920         ,x_attribute35                => l_vsv_row.attribute35
7921         ,x_attribute36                => l_vsv_row.attribute36
7922         ,x_attribute37                => l_vsv_row.attribute37
7923         ,x_attribute38                => l_vsv_row.attribute38
7924         ,x_attribute39                => l_vsv_row.attribute39
7925         ,x_attribute40                => l_vsv_row.attribute40
7926         ,x_attribute41                => l_vsv_row.attribute41
7927         ,x_attribute42                => l_vsv_row.attribute42
7928         ,x_attribute43                => l_vsv_row.attribute43
7929         ,x_attribute44                => l_vsv_row.attribute44
7930         ,x_attribute45                => l_vsv_row.attribute45
7931         ,x_attribute46                => l_vsv_row.attribute46
7932         ,x_attribute47                => l_vsv_row.attribute47
7933         ,x_attribute48                => l_vsv_row.attribute48
7934         ,x_attribute49                => l_vsv_row.attribute49
7935         ,x_attribute50                => l_vsv_row.attribute50
7936         ,x_flex_value_meaning         => p_display_name
7937         ,x_description                => p_description
7938         ,x_last_update_date           => SYSDATE
7939         ,x_last_updated_by            => p_last_updated_by
7940         ,x_last_update_login          => l_last_update_login);
7941     END IF;
7942   END IF;
7943   x_return_status  := 'S';
7944 EXCEPTION
7945   WHEN OTHERS THEN
7946    x_return_status  := 'E';
7947    x_msg_data       := SQLERRM;
7948 END Translate_Value_Set_Val;
7949 
7950 ----------------------------------------------------------------------
7951 
7952 FUNCTION has_flex_binding (cp_value_set_id  IN  NUMBER)
7953 RETURN VARCHAR2 IS
7954 -- T if Value Set Table has flex binding in where clause
7955 -- F if flex binding is not present.
7956   l_return_status   VARCHAR2(1);
7957   l_dummy_number    NUMBER;
7958 BEGIN
7959   l_return_status := FND_API.G_FALSE;
7963   END IF;
7960   l_dummy_number := INSTR(get_vs_table_where_clause(cp_value_set_id),':$FLEX$.');
7961   IF NVL(l_dummy_number,0) <> 0 THEN
7962     l_return_status := FND_API.G_TRUE;
7964   RETURN l_return_status;
7965 EXCEPTION
7966   WHEN OTHERS THEN
7967     RETURN l_return_status;
7968 END has_flex_binding;
7969 
7970 ---------------------------------------------------------------------
7971 -- Requirement:   bug: 3542670
7972 --
7973 -- Function: To check whether the value set is editable
7974 --           Returns T if valueset is editable
7975 --           Returns F if valueset is not editable
7976 -- Parameters:
7977 --         IN
7978 --  p_value_set_id  : value set id
7979 --        OUT
7980 --  NONE
7981 --
7982 ---------------------------------------------------------------------
7983 FUNCTION  is_vs_editable (cp_value_set_id  IN  NUMBER)
7984 RETURN VARCHAR2 IS
7985 -- T is VS is editable
7986 -- F if VS is not editable.
7987   l_return_status   VARCHAR2(1);
7988   l_vs_row          fnd_flex_value_sets%ROWTYPE;
7989 BEGIN
7990   l_return_status := FND_API.G_TRUE;
7991   SELECT *
7992   INTO l_vs_row
7993   FROM fnd_flex_value_sets
7994   WHERE flex_value_set_id = cp_value_set_id;
7995 
7996   IF  l_vs_row.created_by IN (1,2)
7997       OR
7998       l_vs_row.security_enabled_flag <> 'N'
7999       OR
8000       (l_vs_row.format_type = 'C'
8001          AND
8002          (  l_vs_row.alphanumeric_allowed_flag = 'N'
8003             OR
8004             l_vs_row.uppercase_only_flag = 'Y'
8005             OR
8006             l_vs_row.numeric_mode_enabled_flag = 'Y'
8007          )
8008       )
8009       THEN
8010     l_return_status := FND_API.G_FALSE;
8011   END IF;
8012   RETURN l_return_status;
8013 EXCEPTION
8014   WHEN OTHERS THEN
8015     RETURN FND_API.G_FALSE;
8016 END is_vs_editable;
8017 
8018 ---------------------------------------------------------------------
8019 -- Requirement:   bug: 3542670
8020 --
8021 -- Function: To check whether the value set value is editable
8022 --           Returns T if valueset value is editable
8023 --           Returns F if valueset value is not editable
8024 -- Parameters:
8025 --         IN
8026 --  p_value_set_id  : value set id
8027 --        OUT
8028 --  NONE
8029 --
8030 ---------------------------------------------------------------------
8031 FUNCTION  is_vs_value_editable (cp_vs_value_id  IN  NUMBER)
8032 RETURN VARCHAR2 IS
8033 -- T is VS Value is editable
8034 -- F if VS Value is not editable.
8035   l_return_status   VARCHAR2(1);
8036 
8037   l_vsv_created_by            fnd_flex_values.created_by%TYPE;
8038   l_vs_created_by             fnd_flex_values.created_by%TYPE;
8039   l_vs_format_type            fnd_flex_value_sets.format_type%TYPE;
8040   l_vs_validation_type        fnd_flex_value_sets.validation_type%TYPE;
8041   l_vs_alpha_numeric_allowed  fnd_flex_value_sets.alphanumeric_allowed_flag%TYPE;
8042   l_vs_uppercase_only         fnd_flex_value_sets.uppercase_only_flag%TYPE;
8043   l_vs_numeric_mode_enabled   fnd_flex_value_sets.numeric_mode_enabled_flag%TYPE;
8044   l_vs_security_enabled       fnd_flex_value_sets.security_enabled_flag%TYPE;
8045 
8046 BEGIN
8047 
8048   l_return_status := FND_API.G_TRUE;
8049   SELECT a.created_by, b.format_type, b.validation_type,
8050          b.alphanumeric_allowed_flag, b.uppercase_only_flag,
8051          b.numeric_mode_enabled_flag, b.security_enabled_flag, b.created_by
8052   INTO l_vsv_created_by, l_vs_format_type, l_vs_validation_type,
8053        l_vs_alpha_numeric_allowed, l_vs_uppercase_only,
8054        l_vs_numeric_mode_enabled, l_vs_security_enabled, l_vs_created_by
8055   FROM fnd_flex_values a, fnd_flex_value_sets b
8056   WHERE a.flex_value_id = cp_vs_value_id
8057     AND a.flex_value_set_id = b.flex_value_set_id;
8058 
8059   IF  l_vsv_created_by IN (1,2)
8060       OR
8061       l_vs_created_by  IN (1,2)
8062       OR
8063       l_vs_security_enabled <> 'N'
8064       OR
8065       (l_vs_format_type = 'C'
8066          AND
8067          (  l_vs_alpha_numeric_allowed = 'N'
8068             OR
8069             l_vs_uppercase_only = 'Y'
8070             OR
8071             l_vs_numeric_mode_enabled = 'Y'
8072          )
8073       )
8074       THEN
8075     l_return_status := FND_API.G_FALSE;
8076   END IF;
8077   RETURN l_return_status;
8078 EXCEPTION
8079   WHEN OTHERS THEN
8080     RETURN FND_API.G_FALSE;
8081 END is_vs_value_editable;
8082 
8083 ---------------------------------------------------------------------
8084 -- Requirement:   bug: 3542670
8085 --
8086 -- Function: To process the value set display sequence
8087 --           If the display_sequence is same as value_set_value_id,
8088 --           then record is not stored in EGO_VS_VALUES_DISP_ORDER
8089 --           else a record is stored in EGO_VS_VALUES_DISP_ORDER
8090 -- Parameters:
8091 --         IN
8092 --  p_transaction_type    : CREATE,UPDATE
8093 --  p_value_set_id        : value_set_id takes precedence over value_set_name
8094 --                          if both the parameters are passed
8095 --  p_value_set_name      : value set name
8096 --  p_value_set_value_id  : value set value id takes precedence over
8097 --                          value set value if both the parameters are passed
8098 --  p_value_set_value     : value set value
8102 --        OUT
8099 --  p_sequence            : sequence to be stored
8100 --  p_init_msg_list       :
8101 --  p_commit              :
8103 --  x_return_status                 OUT NOCOPY VARCHAR2
8104 --  x_msg_count                     OUT NOCOPY NUMBER
8105 --  x_msg_data                      OUT NOCOPY VARCHAR2
8106 --
8107 ---------------------------------------------------------------------
8108 PROCEDURE process_vs_value_sequence
8109        (p_api_version                   IN   NUMBER
8110        ,p_transaction_type              IN   VARCHAR2
8111        ,p_value_set_id                  IN   NUMBER    DEFAULT NULL
8112        ,p_value_set_name                IN   VARCHAR2  DEFAULT NULL
8113        ,p_value_set_value_id            IN   NUMBER    DEFAULT NULL
8114        ,p_value_set_value               IN   VARCHAR2  DEFAULT NULL
8115        ,p_sequence                      IN   NUMBER
8116        ,p_owner                         IN   NUMBER     DEFAULT NULL
8117        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8118        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8119        ,x_return_status                 OUT NOCOPY VARCHAR2
8120        ,x_msg_count                     OUT NOCOPY NUMBER
8121        ,x_msg_data                      OUT NOCOPY VARCHAR2
8122        ) IS
8123 
8124   l_api_name      VARCHAR2(30);
8125   l_api_version   NUMBER;
8126   l_value_set_value_id     fnd_flex_values.flex_value_id%TYPE;
8127   l_value_set_id           fnd_flex_value_sets.flex_value_set_id%TYPE;
8128   l_sequence               EGO_VS_VALUES_DISP_ORDER.disp_sequence%TYPE;
8129   l_invalid_params         BOOLEAN;
8130   l_create_sequence        BOOLEAN;
8131   l_update_sequence        BOOLEAN;
8132   l_Sysdate                DATE;
8133   l_owner                  NUMBER;
8134 
8135   CURSOR c_get_disp_sequence (cp_flex_value_id  IN  NUMBER) is
8136     SELECT disp_sequence
8137     FROM ego_vs_values_disp_order
8138     WHERE value_set_value_id = cp_flex_value_id;
8139 
8140 BEGIN
8141   l_api_name := 'process_vs_value_sequence';
8142   l_api_version := 1.0;
8143 
8144   IF FND_API.To_Boolean( p_commit ) THEN
8145    SAVEPOINT PROCESS_VS_VALUE_SEQUENCE_SP;
8146   END IF;
8147 
8148   --
8149   -- Initialize message list
8150   --
8151   IF FND_API.To_Boolean(p_init_msg_list) THEN
8152     FND_MSG_PUB.Initialize;
8153   END IF;
8154 
8155   code_debug(l_api_name||' msg pub initialized ' );
8156   --
8157   --Standard checks
8158   --
8159   IF NOT FND_API.Compatible_API_Call (l_api_version
8160                                      ,p_api_version
8161                                      ,l_api_name
8162                                      ,g_pkg_name) THEN
8163         code_debug (l_api_name ||' invalid api version ');
8164     RAISE FND_API.G_EXC_ERROR;
8165   END IF;
8166 
8167   IF (p_owner IS NULL OR p_owner = -1) THEN
8168     l_owner := g_current_user_id;
8169   ELSE
8170     l_owner := p_owner;
8171   END IF;
8172 
8173   l_invalid_params := FALSE;
8174   IF (  p_sequence IS NULL
8175         OR
8176         ( p_value_set_value_id IS NULL
8177           AND
8178           (p_value_set_value IS NULL OR (p_value_set_name IS NULL AND p_value_set_id IS NULL))
8179         )
8180      ) THEN
8181     l_invalid_params := TRUE;
8182   ELSE
8183     IF p_value_set_value_id IS NOT NULL THEN
8184       BEGIN
8185         SELECT flex_value_id, flex_value_set_id
8186         INTO l_value_set_value_id, l_value_set_id
8187         FROM fnd_flex_values
8188         WHERE flex_value_id = p_value_set_value_id;
8189       EXCEPTION
8190         WHEN OTHERS THEN
8191           l_invalid_params := TRUE;
8192       END;
8193     ELSE
8194       BEGIN
8195         SELECT a.flex_value_id, a.flex_value_set_id
8196         INTO l_value_set_value_id, l_value_set_id
8197         FROM fnd_flex_values a, fnd_flex_value_sets b
8198         WHERE a.flex_value_set_id = b.flex_value_set_id
8199           AND a.flex_value = p_value_set_value
8200           AND (b.flex_value_set_id = p_value_set_id OR b.flex_value_set_name = p_value_set_name);
8201       EXCEPTION
8202         WHEN OTHERS THEN
8203           l_invalid_params := TRUE;
8204       END;
8205     END IF;
8206   END IF;
8207 
8208   IF l_invalid_params THEN
8209     fnd_message.Set_Name(G_APP_NAME, 'EGO_API_INVALID_PARAMS');
8210     fnd_message.Set_Token(G_PKG_NAME_TOKEN, G_PKG_NAME);
8211     fnd_message.Set_Token(G_API_NAME_TOKEN, l_api_name);
8212     FND_MSG_PUB.Add;
8213     RAISE FND_API.G_EXC_ERROR;
8214   END IF;
8215 
8216 
8217   l_create_sequence := FALSE;
8218   l_update_sequence := FALSE;
8219   OPEN c_get_disp_sequence (cp_flex_value_id => l_value_set_value_id);
8220   FETCH c_get_disp_sequence INTO l_sequence;
8221   IF c_get_disp_sequence%NOTFOUND THEN
8222     IF p_sequence <> l_value_set_value_id THEN
8223       l_create_sequence := TRUE;
8224     END IF;
8225   ELSE
8226     IF l_sequence <> p_sequence THEN
8227       l_update_sequence := TRUE;
8228     END IF;
8229   END IF;
8230 
8231     l_Sysdate  := SYSDATE;
8232   IF l_create_sequence THEN
8233     INSERT INTO EGO_VS_VALUES_DISP_ORDER
8234       (value_set_value_id
8235       ,value_set_id
8236       ,disp_sequence
8237       ,created_by
8238       ,creation_date
8239       ,last_updated_by
8240       ,last_update_date
8241       ,last_update_login)
8245       ,p_sequence
8242     VALUES
8243       (l_value_set_value_id
8244       ,l_value_set_id
8246       ,l_owner
8247       ,l_Sysdate
8248       ,l_owner
8249       ,l_Sysdate
8250       ,G_CURRENT_LOGIN_ID);
8251   END IF;
8252 
8253   IF l_update_sequence THEN
8254     UPDATE EGO_VS_VALUES_DISP_ORDER
8255     SET disp_sequence = p_sequence
8256       ,last_updated_by = l_owner
8257       ,last_update_date = l_sysdate
8258       ,last_update_login = G_CURRENT_LOGIN_ID
8259     WHERE value_set_value_id = l_value_set_value_id;
8260   END IF;
8261 
8262   IF FND_API.To_Boolean( p_commit ) THEN
8263     COMMIT WORK;
8264   END IF;
8265   x_return_status := FND_API.G_RET_STS_SUCCESS;
8266 
8267 EXCEPTION
8268    WHEN FND_API.G_EXC_ERROR THEN
8269       IF FND_API.To_Boolean( p_commit ) THEN
8270         ROLLBACK TO  PROCESS_VS_VALUE_SEQUENCE_SP;
8271       END IF;
8272       x_return_status := FND_API.G_RET_STS_ERROR;
8273       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8274                                ,p_count   => x_msg_count
8275                                ,p_data    => x_msg_data);
8276     WHEN OTHERS THEN
8277       IF FND_API.To_Boolean( p_commit ) THEN
8278         ROLLBACK TO  PROCESS_VS_VALUE_SEQUENCE_SP;
8279       END IF;
8280 
8281 END process_vs_value_sequence;
8282 
8283 ----------------------------------------------------------------------
8284 
8285                   -----------------------------
8286                   -- Object Association APIs --
8287                   -----------------------------
8288 
8289 ----------------------------------------------------------------------
8290 
8291 PROCEDURE Create_Association (
8292         p_api_version                   IN   NUMBER
8293        ,p_association_id                IN   NUMBER DEFAULT NULL
8294        ,p_object_id                     IN   NUMBER
8295        ,p_classification_code           IN   VARCHAR2
8296        ,p_data_level                    IN   VARCHAR2
8297        ,p_attr_group_id                 IN   NUMBER
8298        ,p_enabled_flag                  IN   VARCHAR2
8299        ,p_view_privilege_id             IN   NUMBER     --ignored for now
8300        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
8301        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8302        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8303        ,x_association_id                OUT NOCOPY NUMBER
8304        ,x_return_status                 OUT NOCOPY VARCHAR2
8305        ,x_errorcode                     OUT NOCOPY NUMBER
8306        ,x_msg_count                     OUT NOCOPY NUMBER
8307        ,x_msg_data                      OUT NOCOPY VARCHAR2
8308 ) IS
8309 
8310     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Association';
8311 
8312     --we don't use l_api_version yet, but eventually we might:
8313     --if we change required parameters, version goes from n.x to (n+1).x
8314     --if we change optional parameters, version goes from x.n to x.(n+1)
8315     l_api_version            CONSTANT NUMBER := 1.0;
8316 
8317     l_attr_group_id          NUMBER;
8318     l_Sysdate                DATE := Sysdate;
8319     l_existing_datalevel     VARCHAR2(30);
8320     l_attr_disp_name         VARCHAR2(80);
8321     l_data_level_name        VARCHAR2(80);
8322 
8323     e_data_level_mismatch_error EXCEPTION;
8324     e_variant_assocs_excep    EXCEPTION;
8325     l_variant_exist_count    NUMBER;
8326     l_dyn_sql                     VARCHAR2(1000);
8327     l_style_exists                VARCHAR2(1);
8328     l_attr_count           NUMBER;
8329 
8330     l_dummy_number  NUMBER;
8331     l_variant_flag        VARCHAR2(1);
8332 
8333     CURSOR data_level_merge (cp_attr_group_id IN NUMBER
8334                             ,cp_classification_code  IN VARCHAR2) IS
8335     SELECT attr_grp_dl.data_level_id data_level_id, dl_meta.data_level_name data_level_name
8336     FROM   ego_data_level_b dl_meta, ego_attr_group_dl attr_grp_dl
8337     WHERE attr_grp_dl.data_level_id = dl_meta.data_level_id
8338       AND attr_grp_dl.attr_group_id = cp_attr_group_id
8339       AND NOT EXISTS
8340         (SELECT 1
8341           FROM EGO_OBJ_AG_ASSOCS_B
8342           WHERE classification_code = p_classification_code
8343             AND attr_group_id = cp_attr_group_id
8344             AND data_level_id = dl_meta.data_level_id
8345         );
8346 
8347     cursor_rec   data_level_merge%ROWTYPE;
8348 
8349 
8350   BEGIN
8351 
8352     -- Standard start of API savepoint
8353     IF FND_API.To_Boolean(p_commit) THEN
8354       SAVEPOINT Create_Association_PUB;
8355     END IF;
8356 
8357     -- Check for call compatibility
8358     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
8359                                         l_api_name, G_PKG_NAME)
8360     THEN
8361       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8362     END IF;
8363     -- Initialize message list even though we don't currently use it
8364     IF FND_API.To_Boolean(p_init_msg_list) THEN
8365       FND_MSG_PUB.Initialize;
8366     END IF;
8367 
8368     --Checking if the variant attribute group trying to be associated has attributes in it, if not raise exception
8369     SELECT Nvl(VARIANT, 'N')
8370     INTO l_variant_flag
8371     FROM EGO_ATTR_GROUPS_V WHERE ATTR_GROUP_ID = p_attr_group_id;
8372 
8373     SELECT Count(1)
8374     INTO l_attr_count
8378     AND AGV.ATTR_GROUP_NAME = AV.ATTR_GROUP_NAME
8375     FROM EGO_ATTR_GROUPS_V AGV, EGO_ATTRS_V AV
8376     WHERE AGV.APPLICATION_ID = AV.APPLICATION_ID
8377     AND AGV.ATTR_GROUP_TYPE = AV.ATTR_GROUP_TYPE
8379     AND AGV.ATTR_GROUP_ID = p_attr_group_id;
8380 
8381     IF(l_attr_count = 0 AND l_variant_flag = 'Y') THEN
8382        Fnd_Message.Set_Name (application  => 'EGO',
8383                             name         => 'EGO_EF_NO_ATTR_EXIST'
8384                            );
8385         FND_MSG_PUB.Add;
8386         RAISE e_variant_assocs_excep;
8387     END IF;
8388 
8389     -- SSARNOBA: Why do we have this SELECT INTO statement? We're not using
8390     -- l_variant_exist_count anywhere.
8391     SELECT COUNT(*)
8392     INTO l_variant_exist_count
8393     FROM EGO_OBJ_ATTR_GRP_ASSOCS_V
8394     WHERE OBJECT_ID = p_object_id
8395     AND CLASSIFICATION_CODE = p_classification_code
8396     AND VARIANT = 'Y'
8397     AND EXISTS (SELECT 'X'
8398                          FROM EGO_ATTR_GROUPS_V AGV
8399                          WHERE AGV.ATTR_GROUP_ID = p_attr_group_id
8400                          AND AGV.VARIANT = 'Y');
8401 
8402     -- special handling for variant attribute groups
8403     BEGIN
8404       SELECT OBJECT_ID
8405       INTO l_dummy_number
8406       FROM FND_OBJECTS
8407       WHERE OBJECT_ID = p_object_id
8408       AND OBJ_NAME = 'EGO_ITEM';
8409 
8410       IF(l_dummy_number IS NOT NULL) THEN
8411                 EXECUTE IMMEDIATE 'SELECT EGO_STYLE_SKU_ITEM_PVT.IsStyle_Item_Exist_For_ICC(:1) FROM DUAL'
8412         INTO l_style_exists USING  IN To_Number(p_classification_code);
8413       END IF;
8414 
8415     EXCEPTION
8416       WHEN OTHERS THEN
8417         NULL;
8418     END;
8419 
8420 
8421     --EXECUTE IMMEDIATE l_dyn_sql;
8422     IF(l_style_exists = 'T' AND l_variant_flag = 'Y') THEN
8423         Fnd_Message.Set_Name (application  => 'EGO',
8424                             name         => 'EGO_VARIANT_STYLE_EXIST'
8425                            );
8426         FND_MSG_PUB.Add;
8427         RAISE e_variant_assocs_excep;
8428     END IF;
8429 
8430     --l_existing_datalevel := Get_Associated_Datalevel(p_object_id, p_attr_group_id);
8431 
8432     --IF ((l_existing_datalevel IS NOT NULL) AND (l_existing_datalevel <> p_data_level)) THEN
8433      -- RAISE e_data_level_mismatch_error;
8434     --END IF;
8435 
8436 
8437     --if association id is not provided, get association id from sequence
8438     --IF( p_association_id IS NULL ) THEN
8439       --SELECT EGO_ASSOCS_S.NEXTVAL INTO x_association_id FROM DUAL;
8440     --ELSE
8441     IF(p_association_id IS NOT NULL AND p_association_id > 0) THEN
8442       x_association_id := p_association_id;
8443     END IF;
8444 
8445     IF(x_association_id IS NOT NULL) THEN
8446       -- used only for the creation of single association
8447       -- it is assumed that when the user is passing p_association_id , it is for a single association record
8448       INSERT INTO EGO_OBJ_AG_ASSOCS_B
8449       (
8450           ASSOCIATION_ID
8451          ,OBJECT_ID
8452          ,CLASSIFICATION_CODE
8453          ,DATA_LEVEL
8454          ,ATTR_GROUP_ID
8455          ,ENABLED_FLAG
8456          ,DATA_LEVEL_ID
8457          ,VIEW_PRIVILEGE_ID
8458          ,EDIT_PRIVILEGE_ID
8459          ,CREATION_DATE
8460          ,CREATED_BY
8461          ,LAST_UPDATE_DATE
8462          ,LAST_UPDATED_BY
8463          ,LAST_UPDATE_LOGIN
8464       )
8465       VALUES
8466       (
8467           x_association_id
8468          ,p_object_id
8469          ,p_classification_code
8470          ,p_data_level
8471          ,p_attr_group_id
8472          ,p_enabled_flag
8473          ,(SELECT data_level_id FROM ego_attr_groups_dl_v WHERE attr_group_id = p_attr_group_id AND data_level_internal_name = p_data_level)
8474          ,p_view_privilege_id
8475          ,p_edit_privilege_id
8476          ,l_Sysdate
8477          ,g_current_user_id
8478          ,l_Sysdate
8479          ,g_current_user_id
8480          ,g_current_login_id
8481       );
8482     ELSE
8483         -- merge is used here to create association for all the data levels of an AG
8484         -- when all the data levels are to be associated, p_association_id is passed NULL
8485         OPEN data_level_merge(p_attr_group_id, p_classification_code);
8486         LOOP
8487           FETCH data_level_merge INTO cursor_rec;
8488           EXIT WHEN data_level_merge%NOTFOUND;
8489 
8490           INSERT INTO EGO_OBJ_AG_ASSOCS_B
8491           (
8492             ASSOCIATION_ID,
8493             OBJECT_ID,
8494             CLASSIFICATION_CODE,
8495             DATA_LEVEL,
8496             ATTR_GROUP_ID,
8497             ENABLED_FLAG,
8498             DATA_LEVEL_ID,
8499             CREATION_DATE,
8500             CREATED_BY,
8501             LAST_UPDATE_DATE,
8502             LAST_UPDATED_BY,
8503             LAST_UPDATE_LOGIN
8504           )
8505           VALUES
8506           (
8507                EGO_ASSOCS_S.NEXTVAL,
8508                p_object_id,
8509                p_classification_code,
8510                cursor_rec.data_level_name,
8511                p_attr_group_id,
8512                p_enabled_flag,
8513                cursor_rec.data_level_id,
8514                l_Sysdate,
8515                g_current_user_id,
8516                l_Sysdate,
8520 
8517                g_current_user_id,
8518                g_current_login_id
8519           );
8521        END LOOP;
8522        CLOSE data_level_merge;
8523 
8524     END IF;
8525 
8526     -- Standard check of p_commit
8527     IF FND_API.To_Boolean(p_commit) THEN
8528       COMMIT WORK;
8529     END IF;
8530 
8531     x_return_status := FND_API.G_RET_STS_SUCCESS;
8532 
8533   EXCEPTION
8534 
8535     WHEN e_data_level_mismatch_error THEN
8536       IF FND_API.To_Boolean(p_commit) THEN
8537         ROLLBACK TO Create_Association_PUB;
8538       END IF;
8539       x_return_status := FND_API.G_RET_STS_ERROR;
8540 
8541 
8542       l_attr_disp_name := Get_Attr_Group_DispName(p_attr_group_id);
8543 
8544       l_data_level_name := Get_Data_Level_DispName(l_existing_datalevel);
8545 
8546 
8547       Fnd_Message.Set_Name (application  => 'EGO',
8548                             name         => 'EGO_EF_DL_MISMATCH_ERR'
8549                            );
8550 
8551       Fnd_Message.Set_Token ( token  => 'ATTR_GROUP'
8552                              , value =>  l_attr_disp_name
8553                              , translate   => false
8554                             );
8555 
8556 
8557       Fnd_Message.Set_Token ( token  => 'DATA_LEVEL'
8558                               , value =>  l_data_level_name
8559                               , translate   => false
8560                             );
8561 
8562       x_msg_data := Fnd_Message.Get;
8563 
8564     WHEN e_variant_assocs_excep THEN
8565       IF FND_API.To_Boolean(p_commit) THEN
8566         ROLLBACK TO Create_Association_PUB;
8567       END IF;
8568       x_return_status := FND_API.G_RET_STS_ERROR;
8569       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8570                                ,p_count   => x_msg_count
8571                                ,p_data    => x_msg_data);
8572 
8573 
8574 
8575     WHEN OTHERS THEN
8576       CLOSE data_level_merge; --closing the error in case the cursor errors out
8577 
8578       IF FND_API.To_Boolean(p_commit) THEN
8579         ROLLBACK TO Create_Association_PUB;
8580       END IF;
8581       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8582 
8583       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
8584       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
8585       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
8586       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
8587       FND_MSG_PUB.Add;
8588       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8589                                ,p_count   => x_msg_count
8590                                ,p_data    => x_msg_data);
8591 
8592 END Create_Association;
8593 
8594 ----------------------------------------------------------------------
8595 
8596 PROCEDURE Create_Association (
8597         p_api_version                   IN   NUMBER
8598        ,p_association_id                IN   NUMBER DEFAULT NULL
8599        ,p_object_id                     IN   NUMBER
8600        ,p_classification_code           IN   VARCHAR2
8601        ,p_data_level                    IN   VARCHAR2
8602        ,p_application_id                IN   NUMBER
8603        ,p_attr_group_type               IN   VARCHAR2
8604        ,p_attr_group_name               IN   VARCHAR2
8605        ,p_enabled_flag                  IN   VARCHAR2
8606        ,p_view_privilege_id             IN   NUMBER     --ignored for now
8607        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
8608        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8609        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8610        ,x_association_id                OUT NOCOPY NUMBER
8611        ,x_return_status                 OUT NOCOPY VARCHAR2
8612        ,x_errorcode                     OUT NOCOPY NUMBER
8613        ,x_msg_count                     OUT NOCOPY NUMBER
8614        ,x_msg_data                      OUT NOCOPY VARCHAR2
8615 ) IS
8616 
8617     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Association';
8618 
8619     l_attr_group_id          NUMBER;
8620 
8621   BEGIN
8622 
8623     -- Standard start of API savepoint
8624     IF FND_API.To_Boolean(p_commit) THEN
8625       SAVEPOINT Create_Association_PUB;
8626     END IF;
8627 
8628     l_attr_group_id := Get_Attr_Group_Id_From_PKs(p_application_id
8629                                                  ,p_attr_group_type
8630                                                  ,p_attr_group_name);
8631 
8632     IF l_attr_group_id IS NULL THEN
8633       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8634     END IF;
8635 
8636     EGO_EXT_FWK_PUB.Create_Association(
8637         p_api_version                   => p_api_version
8638        ,p_association_id                => p_association_id
8639        ,p_object_id                     => p_object_id
8640        ,p_classification_code           => p_classification_code
8641        ,p_data_level                    => p_data_level
8642        ,p_attr_group_id                 => l_attr_group_id
8643        ,p_enabled_flag                  => p_enabled_flag
8644        ,p_view_privilege_id             => p_view_privilege_id
8645        ,p_edit_privilege_id             => p_edit_privilege_id
8646        ,p_init_msg_list                 => p_init_msg_list
8647        ,p_commit                        => p_commit
8648        ,x_association_id                => x_association_id
8652        ,x_msg_data                      => x_msg_data
8649        ,x_return_status                 => x_return_status
8650        ,x_errorcode                     => x_errorcode
8651        ,x_msg_count                     => x_msg_count
8653     );
8654 
8655     -- Standard check of p_commit
8656     IF FND_API.To_Boolean(p_commit) THEN
8657       COMMIT WORK;
8658     END IF;
8659 
8660   EXCEPTION
8661     WHEN OTHERS THEN
8662       IF FND_API.To_Boolean(p_commit) THEN
8663         ROLLBACK TO Create_Association_PUB;
8664       END IF;
8665       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8666 
8667       IF l_attr_group_id IS NULL THEN
8668         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAttrGroupIDFoundForPKs';
8669       ELSE
8670         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
8671         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
8672         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
8673         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
8674         FND_MSG_PUB.Add;
8675         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8676                                  ,p_count   => x_msg_count
8677                                  ,p_data    => x_msg_data);
8678       END IF;
8679 
8680 END Create_Association;
8681 
8682 ----------------------------------------------------------------------
8683 
8684 PROCEDURE Create_Association (
8685         p_api_version                   IN   NUMBER
8686        ,p_object_name                   IN   VARCHAR2
8687        ,p_classification_code           IN   VARCHAR2
8688        ,p_data_level                    IN   VARCHAR2
8689        ,p_application_id                IN   NUMBER
8690        ,p_attr_group_type               IN   VARCHAR2
8691        ,p_attr_group_name               IN   VARCHAR2
8692        ,p_enabled_flag                  IN   VARCHAR2
8693        ,p_view_privilege_id             IN   NUMBER     --ignored for now
8694        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
8695        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8696        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8697        ,x_association_id                OUT NOCOPY NUMBER
8698        ,x_return_status                 OUT NOCOPY VARCHAR2
8699        ,x_errorcode                     OUT NOCOPY NUMBER
8700        ,x_msg_count                     OUT NOCOPY NUMBER
8701        ,x_msg_data                      OUT NOCOPY VARCHAR2
8702 ) IS
8703 
8704     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Association';
8705 
8706     l_object_id              NUMBER;
8707 
8708   BEGIN
8709 
8710     -- Standard start of API savepoint
8711     IF FND_API.To_Boolean(p_commit) THEN
8712       SAVEPOINT Create_Association_PUB;
8713     END IF;
8714 
8715     l_object_id := Get_Object_Id_From_Name(p_object_name);
8716     IF l_object_id IS NULL THEN
8717       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8718     END IF;
8719 
8720     EGO_EXT_FWK_PUB.Create_Association(
8721         p_api_version                   => p_api_version
8722        ,p_object_id                     => l_object_id
8723        ,p_classification_code           => p_classification_code
8724        ,p_data_level                    => p_data_level
8725        ,p_application_id                => p_application_id
8726        ,p_attr_group_type               => p_attr_group_type
8727        ,p_attr_group_name               => p_attr_group_name
8728        ,p_enabled_flag                  => p_enabled_flag
8729        ,p_view_privilege_id             => p_view_privilege_id
8730        ,p_edit_privilege_id             => p_edit_privilege_id
8731        ,p_init_msg_list                 => p_init_msg_list
8732        ,p_commit                        => p_commit
8733        ,x_association_id                => x_association_id
8734        ,x_return_status                 => x_return_status
8735        ,x_errorcode                     => x_errorcode
8736        ,x_msg_count                     => x_msg_count
8737        ,x_msg_data                      => x_msg_data
8738     );
8739 
8740     -- Standard check of p_commit
8741     IF FND_API.To_Boolean(p_commit) THEN
8742       COMMIT WORK;
8743     END IF;
8744 
8745   EXCEPTION
8746     WHEN OTHERS THEN
8747       IF FND_API.To_Boolean(p_commit) THEN
8748         ROLLBACK TO Create_Association_PUB;
8749       END IF;
8750       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8751 
8752       IF l_object_id IS NULL THEN
8753         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoObjectIdForObjectName';
8754       ELSE
8755         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
8756         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
8757         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
8758         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
8759         FND_MSG_PUB.Add;
8760         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8761                                  ,p_count   => x_msg_count
8762                                  ,p_data    => x_msg_data);
8763       END IF;
8764 
8765 END Create_Association;
8766 
8767 ----------------------------------------------------------------------
8768 
8769 -- definition for case when caller has ASSOCIATION_ID
8770 PROCEDURE Update_Association (
8771         p_api_version                   IN   NUMBER
8772        ,p_association_id                IN   NUMBER
8773        ,p_enabled_flag                  IN   VARCHAR2
8777        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8774        ,p_view_privilege_id             IN   NUMBER     --ignored for now
8775        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
8776        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8778        ,x_return_status                 OUT NOCOPY VARCHAR2
8779        ,x_errorcode                     OUT NOCOPY NUMBER
8780        ,x_msg_count                     OUT NOCOPY NUMBER
8781        ,x_msg_data                      OUT NOCOPY VARCHAR2
8782 ) IS
8783 
8784     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Association';
8785 
8786     --we don't use l_api_version yet, but eventually we might:
8787     --if we change required parameters, version goes from n.x to (n+1).x
8788     --if we change optional parameters, version goes from x.n to x.(n+1)
8789     l_api_version            CONSTANT NUMBER := 1.0;
8790 
8791     l_Sysdate                DATE := Sysdate;
8792 
8793   BEGIN
8794 
8795     -- Standard start of API savepoint
8796     IF FND_API.To_Boolean(p_commit) THEN
8797       SAVEPOINT Update_Association_PUB;
8798     END IF;
8799 
8800     -- Check for call compatibility
8801     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
8802                                         l_api_name, G_PKG_NAME)
8803     THEN
8804       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8805     END IF;
8806     -- Initialize message list even though we don't currently use it
8807     IF FND_API.To_Boolean(p_init_msg_list) THEN
8808       FND_MSG_PUB.Initialize;
8809     END IF;
8810 
8811     --bug 5513610
8812     /*DELETE FROM EGO_PAGE_ENTRIES_B
8813      WHERE ASSOCIATION_ID = p_association_id;*/
8814 
8815     UPDATE EGO_OBJ_AG_ASSOCS_B
8816        SET ENABLED_FLAG = p_enabled_flag,
8817            VIEW_PRIVILEGE_ID = p_view_privilege_id,
8818            EDIT_PRIVILEGE_ID = p_edit_privilege_id,
8819            LAST_UPDATE_DATE = l_Sysdate,
8820            LAST_UPDATED_BY = g_current_user_id,
8821            LAST_UPDATE_LOGIN = g_current_login_id
8822      WHERE ASSOCIATION_ID = p_association_id;
8823 
8824     -- Standard check of p_commit
8825     IF FND_API.To_Boolean(p_commit) THEN
8826       COMMIT WORK;
8827     END IF;
8828 
8829     x_return_status := FND_API.G_RET_STS_SUCCESS;
8830 
8831   EXCEPTION
8832     WHEN OTHERS THEN
8833       IF FND_API.To_Boolean(p_commit) THEN
8834         ROLLBACK TO Update_Association_PUB;
8835       END IF;
8836       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8837 
8838       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
8839       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
8840       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
8841       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
8842       FND_MSG_PUB.Add;
8843       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8844                                ,p_count   => x_msg_count
8845                                ,p_data    => x_msg_data);
8846 
8847 END Update_Association;
8848 
8849 ----------------------------------------------------------------------
8850 
8851 -- definition for case when caller doesn't have ASSOCIATION_ID but has ATTR_GROUP_ID
8852 PROCEDURE Update_Association (
8853         p_api_version                   IN   NUMBER
8854        ,p_object_id                     IN   NUMBER
8855        ,p_classification_code           IN   VARCHAR2
8856        ,p_attr_group_id                 IN   NUMBER
8857        ,p_enabled_flag                  IN   VARCHAR2
8858        ,p_view_privilege_id             IN   NUMBER     --ignored for now
8859        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
8860        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8861        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8862        ,x_return_status                 OUT NOCOPY VARCHAR2
8863        ,x_errorcode                     OUT NOCOPY NUMBER
8864        ,x_msg_count                     OUT NOCOPY NUMBER
8865        ,x_msg_data                      OUT NOCOPY VARCHAR2
8866 ) IS
8867 
8868     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Association';
8869 
8870     l_association_id         NUMBER;
8871 
8872   BEGIN
8873 
8874     -- Standard start of API savepoint
8875     IF FND_API.To_Boolean(p_commit) THEN
8876       SAVEPOINT Update_Association_PUB;
8877     END IF;
8878 
8879     l_association_id := Get_Association_Id_From_PKs(p_object_id
8880                                                    ,p_classification_code
8881                                                    ,p_attr_group_id);
8882     IF l_association_id IS NULL THEN
8883       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8884     END IF;
8885 
8886     EGO_EXT_FWK_PUB.Update_Association(
8887         p_api_version                   => p_api_version
8888        ,p_association_id                => l_association_id
8889        ,p_enabled_flag                  => p_enabled_flag
8890        ,p_view_privilege_id             => p_view_privilege_id
8891        ,p_edit_privilege_id             => p_edit_privilege_id
8892        ,p_init_msg_list                 => p_init_msg_list
8893        ,p_commit                        => p_commit
8894        ,x_return_status                 => x_return_status
8895        ,x_errorcode                     => x_errorcode
8896        ,x_msg_count                     => x_msg_count
8900     -- Standard check of p_commit
8897        ,x_msg_data                      => x_msg_data
8898     );
8899 
8901     IF FND_API.To_Boolean(p_commit) THEN
8902       COMMIT WORK;
8903     END IF;
8904 
8905   EXCEPTION
8906     WHEN OTHERS THEN
8907       IF FND_API.To_Boolean(p_commit) THEN
8908         ROLLBACK TO Update_Association_PUB;
8909       END IF;
8910       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8911 
8912       IF l_association_id IS NULL THEN
8913         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAssocFound';
8914       ELSE
8915         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
8916         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
8917         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
8918         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
8919         FND_MSG_PUB.Add;
8920         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8921                                  ,p_count   => x_msg_count
8922                                  ,p_data    => x_msg_data);
8923       END IF;
8924 
8925 END Update_Association;
8926 
8927 ----------------------------------------------------------------------
8928 
8929 -- definition for case when caller doesn't have ASSOCIATION_ID or ATTR_GROUP_ID
8930 PROCEDURE Update_Association (
8931         p_api_version                   IN   NUMBER
8932        ,p_object_id                     IN   NUMBER
8933        ,p_classification_code           IN   VARCHAR2
8934        ,p_application_id                IN   NUMBER
8935        ,p_attr_group_type               IN   VARCHAR2
8936        ,p_attr_group_name               IN   VARCHAR2
8937        ,p_enabled_flag                  IN   VARCHAR2
8938        ,p_view_privilege_id             IN   NUMBER     --ignored for now
8939        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
8940        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8941        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8942        ,x_return_status                 OUT NOCOPY VARCHAR2
8943        ,x_errorcode                     OUT NOCOPY NUMBER
8944        ,x_msg_count                     OUT NOCOPY NUMBER
8945        ,x_msg_data                      OUT NOCOPY VARCHAR2
8946 ) IS
8947 
8948     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Association';
8949 
8950     l_attr_group_id          NUMBER;
8951     l_association_id         NUMBER;
8952 
8953   BEGIN
8954 
8955     -- Standard start of API savepoint
8956     IF FND_API.To_Boolean(p_commit) THEN
8957       SAVEPOINT Update_Association_PUB;
8958     END IF;
8959 
8960     l_attr_group_id := Get_Attr_Group_Id_From_PKs(p_application_id
8961                                                  ,p_attr_group_type
8962                                                  ,p_attr_group_name);
8963 
8964     IF l_attr_group_id IS NULL THEN
8965       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8966     END IF;
8967 
8968     l_association_id := Get_Association_Id_From_PKs(p_object_id
8969                                                    ,p_classification_code
8970                                                    ,l_attr_group_id);
8971     IF l_association_id IS NULL THEN
8972       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8973     END IF;
8974 
8975     EGO_EXT_FWK_PUB.Update_Association(
8976         p_api_version                   => p_api_version
8977        ,p_association_id                => l_association_id
8978        ,p_enabled_flag                  => p_enabled_flag
8979        ,p_view_privilege_id             => p_view_privilege_id
8980        ,p_edit_privilege_id             => p_edit_privilege_id
8981        ,p_init_msg_list                 => p_init_msg_list
8982        ,p_commit                        => p_commit
8983        ,x_return_status                 => x_return_status
8984        ,x_errorcode                     => x_errorcode
8985        ,x_msg_count                     => x_msg_count
8986        ,x_msg_data                      => x_msg_data
8987     );
8988 
8989     -- Standard check of p_commit
8990     IF FND_API.To_Boolean(p_commit) THEN
8991       COMMIT WORK;
8992     END IF;
8993 
8994   EXCEPTION
8995     WHEN OTHERS THEN
8996       IF FND_API.To_Boolean(p_commit) THEN
8997         ROLLBACK TO Update_Association_PUB;
8998       END IF;
8999       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9000 
9001       IF l_attr_group_id IS NULL THEN
9002         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAttrGroupIDFoundForPKs';
9003       ELSIF l_association_id IS NULL THEN
9004         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAssocFound';
9005       ELSE
9006         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9007         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9008         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9009         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9010         FND_MSG_PUB.Add;
9011         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9012                                  ,p_count   => x_msg_count
9013                                  ,p_data    => x_msg_data);
9014       END IF;
9015 
9016 END Update_Association;
9017 
9018 ----------------------------------------------------------------------
9019 
9020 PROCEDURE Delete_Association (
9021         p_api_version                   IN   NUMBER
9025        ,p_force                         IN   VARCHAR2   :=  fnd_api.g_FALSE
9022        ,p_association_id                IN   NUMBER
9023        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9024        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9026        ,x_return_status                 OUT NOCOPY VARCHAR2
9027        ,x_errorcode                     OUT NOCOPY NUMBER
9028        ,x_msg_count                     OUT NOCOPY NUMBER
9029        ,x_msg_data                      OUT NOCOPY VARCHAR2
9030 ) IS
9031 
9032     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Association';
9033 
9034     --we don't use l_api_version yet, but eventually we might:
9035     --if we change required parameters, version goes FROM n.x to (n+1).x
9036     --if we change optional parameters, version goes FROM x.n to x.(n+1)
9037     l_api_version            CONSTANT NUMBER := 1.0;
9038 
9039     ---------------------------------------------------------------------------
9040     -- Type for tracking deletion-constraint checks for Associations with    --
9041     -- various objects; we start with entries for Item, Change, and Projects --
9042     ---------------------------------------------------------------------------
9043     TYPE LOCAL_DEL_ASSOC_CHECK_REC IS RECORD
9044     (
9045         OBJECT_NAME                          VARCHAR2(30)
9046        ,PACKAGE_AND_PROCEDURE                VARCHAR2(60)
9047     );
9048 
9049     TYPE LOCAL_DEL_ASSOC_CHECK_TABLE IS TABLE OF LOCAL_DEL_ASSOC_CHECK_REC
9050       INDEX BY BINARY_INTEGER;
9051 
9052     l_dummy_rec              LOCAL_DEL_ASSOC_CHECK_REC;
9053     l_del_assoc_table        LOCAL_DEL_ASSOC_CHECK_TABLE;
9054     l_association_row        EGO_OBJ_ATTR_GRP_ASSOCS_V%ROWTYPE;
9055     l_del_assoc_check_index  NUMBER;
9056     l_is_ok_to_delete        BOOLEAN := TRUE;
9057     l_api_to_call            VARCHAR2(999);
9058 
9059     CURSOR get_assoc_records (cp_association_id  IN  NUMBER) IS
9060       SELECT *
9061         FROM EGO_OBJ_ATTR_GRP_ASSOCS_V
9062        WHERE (object_id, classification_code, attr_group_id) IN
9063                (SELECT object_id, classification_code, attr_group_id
9064                 FROM ego_obj_ag_assocs_b
9065                 where association_id = cp_association_id);
9066 
9067   BEGIN
9068     code_debug(l_api_name||' started for association '||p_association_id);
9069     -- Standard start of API savepoint
9070     IF FND_API.To_Boolean(p_commit) THEN
9071       SAVEPOINT Delete_Association_PUB;
9072     END IF;
9073 
9074     -- Check for call compatibility
9075     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
9076                                         l_api_name, G_PKG_NAME)
9077     THEN
9078       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9079     END IF;
9080     -- Initialize message list even though we don't currently use it
9081     IF FND_API.To_Boolean(p_init_msg_list) THEN
9082       FND_MSG_PUB.Initialize;
9083     END IF;
9084 
9085     --if p_force is true, skip all deletion checks
9086     IF( p_force = fnd_api.g_TRUE ) THEN
9087       code_debug(l_api_name||' deleting association forcefully ');
9088       --delete association blindly
9089       FOR cr IN get_assoc_records(cp_association_id => p_association_id) LOOP
9090         code_debug(l_api_name||' deleting association forcefully for assoc : '||cr.association_id);
9091         DELETE FROM EGO_OBJ_AG_ASSOCS_B
9092          WHERE association_id = cr.association_id;
9093       END LOOP;
9094       l_is_ok_to_delete := TRUE;
9095     ELSE
9096 
9097       -- First, initialize the delete-constraint table
9098       l_dummy_rec.OBJECT_NAME := 'EGO_ITEM';
9099       l_dummy_rec.PACKAGE_AND_PROCEDURE := 'EGO_ITEM_CATALOG_PUB.Check_Delete_AttrGroup_Assoc';
9100       l_del_assoc_table(1) := l_dummy_rec;
9101 
9102       l_dummy_rec.OBJECT_NAME := 'PA_PROJECTS';
9103       l_dummy_rec.PACKAGE_AND_PROCEDURE := 'PA_USER_ATTR_PUB.Check_Delete_Assoc_Ok';
9104       l_del_assoc_table(2) := l_dummy_rec;
9105 
9106       l_dummy_rec.OBJECT_NAME := 'ENG_CHANGE';
9107       l_dummy_rec.PACKAGE_AND_PROCEDURE := 'EGO_CHANGE_USER_ATTRS_PUB.Check_Delete_Associations'; --Bug 3070807
9108       l_del_assoc_table(3) := l_dummy_rec;
9109 
9110       l_dummy_rec.OBJECT_NAME := 'ENG_CHANGE_LINE';
9111       l_dummy_rec.PACKAGE_AND_PROCEDURE := 'EGO_CHANGE_USER_ATTRS_PUB.Check_Delete_Associations'; --Bug 3070807
9112       l_del_assoc_table(4) := l_dummy_rec;
9113 
9114       l_api_to_call := NULL;
9115       FOR cr IN get_assoc_records(cp_association_id => p_association_id) LOOP
9116 
9117         code_debug(l_api_name||' obj : '||cr.object_name||' assoc id : '||cr.association_id
9118         ||' class code: '||cr.classification_code||' data level: '|| cr.data_level_int_name);
9119 
9120         -- Next, find and call any delete-constraint procedures provided
9121         l_del_assoc_check_index := l_del_assoc_table.FIRST;
9122         WHILE (l_del_assoc_check_index <= l_del_assoc_table.LAST AND l_api_to_call IS NULL) LOOP
9123           IF (l_del_assoc_table(l_del_assoc_check_index).OBJECT_NAME = cr.OBJECT_NAME AND
9124               l_del_assoc_table(l_del_assoc_check_index).PACKAGE_AND_PROCEDURE IS NOT NULL) THEN
9125             l_api_to_call := l_del_assoc_table(l_del_assoc_check_index).PACKAGE_AND_PROCEDURE;
9126           END IF;
9127           l_del_assoc_check_index := l_del_assoc_table.NEXT(l_del_assoc_check_index);
9128         END LOOP;
9129 
9130         IF l_api_to_call IS NOT NULL THEN
9131 
9132           DECLARE
9133             l_dynamic_sql    VARCHAR2(700);
9137             l_dynamic_sql := 'BEGIN ' ||
9134             l_ok_to_delete   VARCHAR2(1) := fnd_api.G_FALSE;
9135           BEGIN
9136             code_debug(l_api_name||' calling '||l_api_to_call);
9138                    l_api_to_call ||
9139                    '( ' ||
9140                    ' p_api_version         => 1.0  '||
9141                    ',p_association_id      => :1   '||
9142                    ',p_classification_code => :2   '||
9143                    ',p_data_level          => :3   '||
9144                    ',p_attr_group_id       => :4   '||
9145                    ',p_application_id      => :5   '||
9146                    ',p_attr_group_type     => :6   '||
9147                    ',p_attr_group_name     => :7   '||
9148                    ',p_enabled_code        => :8   '||
9149                    ',x_ok_to_delete        => :9   '||
9150                    ',x_return_status       => :10  '||
9151                    ',x_errorcode           => :11  '||
9152                    ',x_msg_count           => :12  '||
9153                    ',x_msg_data            => :13  '||
9154                    '); END;';
9155             EXECUTE IMMEDIATE l_dynamic_sql USING IN cr.association_id,
9156                                                   IN cr.classification_code,
9157                                                   IN cr.data_level_int_name,
9158                                                   IN cr.attr_group_id,
9159                                                   IN cr.application_id,
9160                                                   IN cr.attr_group_type,
9161                                                   IN cr.attr_group_name,
9162                                                   IN cr.enabled_code,
9163                                                   OUT l_ok_to_delete,
9164                                                   OUT x_return_status,
9165                                                   OUT x_errorcode,
9166                                                   OUT x_msg_count,
9167                                                   OUT x_msg_data;
9168             code_debug(l_api_name||' RETURNING '||l_del_assoc_table(l_del_assoc_check_index).PACKAGE_AND_PROCEDURE||' with status '||x_return_status);
9169             IF (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
9170               l_is_ok_to_delete := FND_API.To_Boolean(l_ok_to_delete);
9171             ELSE
9172               l_is_ok_to_delete := FALSE;
9173             END IF;
9174           EXCEPTION
9175             WHEN OTHERS THEN
9176               code_debug(l_api_name||' EXCEPTION from check '||x_msg_data);
9177 
9178               IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
9179                 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
9180               END IF;
9181               l_is_ok_to_delete := FALSE;
9182           END;
9183         ELSE
9184           l_is_ok_to_delete := TRUE;
9185         END IF;
9186 
9187         -- Finally, if we passed all checks, delete the records
9188         IF (l_is_ok_to_delete) THEN
9189           code_debug(l_api_name||' deleting association as conditions are met for assoc :'||cr.association_id);
9190           DELETE FROM EGO_PAGE_ENTRIES_B
9191           WHERE ASSOCIATION_ID = cr.association_id;
9192 
9193           DELETE FROM EGO_OBJ_AG_ASSOCS_B
9194           WHERE ASSOCIATION_ID = cr.association_id;
9195         ELSE
9196           code_debug(l_api_name||' CANNOT delete as prod specific conditions are not met for :'||cr.association_id);
9197           EXIT;
9198         END IF;
9199 
9200       END LOOP;
9201 
9202     END IF; --check p_force
9203 
9204 
9205     IF (l_is_ok_to_delete) THEN
9206       -- Standard check of p_commit
9207       IF FND_API.To_Boolean(p_commit) THEN
9208         COMMIT WORK;
9209       END IF;
9210       x_return_status := FND_API.G_RET_STS_SUCCESS;
9211     ELSE
9212       IF FND_API.To_Boolean(p_commit) THEN
9213         ROLLBACK TO Delete_Association_PUB;
9214       END IF;
9215       x_return_status := FND_API.G_RET_STS_ERROR;
9216     END IF;
9217     code_debug(l_api_name||' setting return status as '||x_return_status);
9218 
9219   EXCEPTION
9220     WHEN OTHERS THEN
9221       code_debug(l_api_name||' EXCEPTION : '||SQLERRM);
9222       IF FND_API.To_Boolean(p_commit) THEN
9223         ROLLBACK TO Delete_Association_PUB;
9224       END IF;
9225       IF get_assoc_records%ISOPEN THEN
9226         CLOSE get_assoc_records;
9227       END IF;
9228       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9229 
9230       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9231       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9232       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9233       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9234       FND_MSG_PUB.Add;
9235       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9236                                ,p_count   => x_msg_count
9237                                ,p_data    => x_msg_data);
9238 
9239 END Delete_Association;
9240 
9241 ----------------------------------------------------------------------
9242 
9243 
9244                  -------------------------------
9245                  -- Attribute Group Page APIs --
9246                  -------------------------------
9247 
9248 ----------------------------------------------------------------------
9249 
9250 PROCEDURE Create_Page (
9254        ,p_classification_code           IN   VARCHAR2
9251         p_api_version                   IN   NUMBER
9252        ,p_page_id                       IN   NUMBER DEFAULT NULL
9253        ,p_object_id                     IN   NUMBER
9255        ,p_data_level                    IN   VARCHAR2
9256        ,p_internal_name                 IN   VARCHAR2
9257        ,p_display_name                  IN   VARCHAR2
9258        ,p_description                   IN   VARCHAR2
9259        ,p_sequence                      IN   NUMBER
9260        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9261        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9262        ,x_page_id                       OUT NOCOPY NUMBER
9263        ,x_return_status                 OUT NOCOPY VARCHAR2
9264        ,x_errorcode                     OUT NOCOPY NUMBER
9265        ,x_msg_count                     OUT NOCOPY NUMBER
9266        ,x_msg_data                      OUT NOCOPY VARCHAR2
9267 ) IS
9268 
9269     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Page';
9270 
9271     --we don't use l_api_version yet, but eventually we might:
9272     --if we change required parameters, version goes FROM n.x to (n+1).x
9273     --if we change optional parameters, version goes FROM x.n to x.(n+1)
9274     l_api_version            CONSTANT NUMBER := 1.0;
9275 
9276     l_Sysdate                DATE := Sysdate;
9277 
9278   BEGIN
9279 
9280     -- Standard start of API savepoint
9281     IF FND_API.To_Boolean(p_commit) THEN
9282       SAVEPOINT Create_Page_PUB;
9283     END IF;
9284 
9285     -- Check for call compatibility
9286     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
9287                                         l_api_name, G_PKG_NAME)
9288     THEN
9289       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9290     END IF;
9291     -- Initialize message list even though we don't currently use it
9292     IF FND_API.To_Boolean(p_init_msg_list) THEN
9293       FND_MSG_PUB.Initialize;
9294     END IF;
9295 
9296     --if page id is not provided, get page id from sequence
9297     IF( p_page_id IS NULL ) THEN
9298       SELECT EGO_PAGES_S.NEXTVAL INTO x_page_id FROM DUAL;
9299     ELSE
9300       x_page_id := p_page_id;
9301     END IF;
9302 
9303     INSERT INTO EGO_PAGES_B
9304     (
9305         PAGE_ID
9306        ,OBJECT_ID
9307        ,CLASSIFICATION_CODE
9308        ,DATA_LEVEL
9309        ,INTERNAL_NAME
9310        ,SEQUENCE
9311        ,CREATION_DATE
9312        ,CREATED_BY
9313        ,LAST_UPDATE_DATE
9314        ,LAST_UPDATED_BY
9315        ,LAST_UPDATE_LOGIN
9316     )
9317     VALUES
9318     (
9319         x_page_id
9320        ,p_object_id
9321        ,p_classification_code
9322        ,p_data_level
9323        ,p_internal_name
9324        ,p_sequence
9325        ,l_Sysdate
9326        ,g_current_user_id
9327        ,l_Sysdate
9328        ,g_current_user_id
9329        ,g_current_login_id
9330     );
9331 
9332     INSERT INTO EGO_PAGES_TL
9333     (
9334         PAGE_ID
9335        ,DISPLAY_NAME
9336        ,DESCRIPTION
9337        ,LANGUAGE
9338        ,SOURCE_LANG
9339        ,CREATION_DATE
9340        ,CREATED_BY
9341        ,LAST_UPDATE_DATE
9342        ,LAST_UPDATED_BY
9343        ,LAST_UPDATE_LOGIN
9344     )
9345     SELECT
9346         x_page_id
9347        ,p_display_name
9348        ,p_description
9349        ,L.LANGUAGE_CODE
9350        ,USERENV('LANG')
9351        ,l_Sysdate
9352        ,g_current_user_id
9353        ,l_Sysdate
9354        ,g_current_user_id
9355        ,g_current_login_id
9356     FROM FND_LANGUAGES L
9357     WHERE L.INSTALLED_FLAG in ('I', 'B');
9358 
9359     -- Standard check of p_commit
9360     IF FND_API.To_Boolean(p_commit) THEN
9361       COMMIT WORK;
9362     END IF;
9363 
9364     x_return_status := FND_API.G_RET_STS_SUCCESS;
9365 
9366   EXCEPTION
9367     WHEN OTHERS THEN
9368       IF FND_API.To_Boolean(p_commit) THEN
9369         ROLLBACK TO Create_Page_PUB;
9370       END IF;
9371       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9372 
9373       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9374       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9375       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9376       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9377       FND_MSG_PUB.Add;
9378       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9379                                ,p_count   => x_msg_count
9380                                ,p_data    => x_msg_data);
9381 
9382 END Create_Page;
9383 
9384 ----------------------------------------------------------------------
9385 
9386 PROCEDURE Update_Page (
9387         p_api_version                   IN   NUMBER
9388        ,p_page_id                       IN   NUMBER
9389        ,p_internal_name                 IN   VARCHAR2
9390        ,p_display_name                  IN   VARCHAR2
9391        ,p_description                   IN   VARCHAR2
9392        ,p_sequence                      IN   NUMBER
9393        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9394        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9398        ,x_msg_count                     OUT NOCOPY NUMBER
9395        ,p_is_nls_mode                   IN   VARCHAR2   DEFAULT FND_API.G_FALSE
9396        ,x_return_status                 OUT NOCOPY VARCHAR2
9397        ,x_errorcode                     OUT NOCOPY NUMBER
9399        ,x_msg_data                      OUT NOCOPY VARCHAR2
9400 ) IS
9401 
9402     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Page';
9403 
9404     --we don't use l_api_version yet, but eventually we might:
9405     --if we change required parameters, version goes FROM n.x to (n+1).x
9406     --if we change optional parameters, version goes FROM x.n to x.(n+1)
9407     l_api_version            CONSTANT NUMBER := 1.0;
9408 
9409     l_Sysdate            DATE := Sysdate;
9410 
9411   BEGIN
9412 
9413     -- Standard start of API savepoint
9414     IF FND_API.To_Boolean(p_commit) THEN
9415       SAVEPOINT Update_Page_PUB;
9416     END IF;
9417 
9418     -- Check for call compatibility
9419     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
9420                                         l_api_name, G_PKG_NAME)
9421     THEN
9422       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9423     END IF;
9424     -- Initialize message list even though we don't currently use it
9425     IF FND_API.To_Boolean(p_init_msg_list) THEN
9426       FND_MSG_PUB.Initialize;
9427     END IF;
9428 
9429     IF (FND_API.To_Boolean(p_is_nls_mode)) THEN
9430 
9431       -- We do this IF check this way so that if p_is_nls_mode is NULL,
9432       -- we still update the non-trans table (i.e., we treat NULL as 'F')
9433       NULL;
9434 
9435     ELSE
9436 
9437       -- We only update this information if we are NOT in NLS mode
9438       -- (i.e., we don't update it if we are in NLS mode)
9439       UPDATE EGO_PAGES_B
9440          SET INTERNAL_NAME = p_internal_name,
9441              SEQUENCE = p_sequence,
9442              LAST_UPDATED_BY = g_current_user_id,
9443              LAST_UPDATE_DATE = l_Sysdate,
9444              LAST_UPDATE_LOGIN = g_current_login_id
9445        WHERE PAGE_ID = p_page_id;
9446 
9447     END IF;
9448 
9449     -- We update the TL information whether or not we're in NLS mode
9450     UPDATE EGO_PAGES_TL
9451        SET DISPLAY_NAME = p_display_name,
9452            DESCRIPTION = p_description,
9453            LAST_UPDATED_BY = g_current_user_id,
9454            LAST_UPDATE_DATE = l_Sysdate,
9455            LAST_UPDATE_LOGIN = g_current_login_id,
9456            SOURCE_LANG   = USERENV('LANG')
9457      WHERE PAGE_ID = p_page_id
9458        -- AND LANGUAGE = USERENV('LANG');
9459          AND USERENV('LANG') in ( LANGUAGE , SOURCE_LANG);
9460 
9461     -- Standard check of p_commit
9462     IF FND_API.To_Boolean(p_commit) THEN
9463       COMMIT WORK;
9464     END IF;
9465 
9466     x_return_status := FND_API.G_RET_STS_SUCCESS;
9467 
9468   EXCEPTION
9469     WHEN OTHERS THEN
9470       IF FND_API.To_Boolean(p_commit) THEN
9471         ROLLBACK TO Update_Page_PUB;
9472       END IF;
9473       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9474 
9475       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9476       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9477       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9478       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9479       FND_MSG_PUB.Add;
9480       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9481                                ,p_count   => x_msg_count
9482                                ,p_data    => x_msg_data);
9483 
9484 
9485 END Update_Page;
9486 
9487 ----------------------------------------------------------------------
9488 
9489 PROCEDURE Update_Page (
9490         p_api_version                   IN   NUMBER
9491        ,p_object_id                     IN   NUMBER
9492        ,p_classification_code           IN   VARCHAR2
9493        ,p_data_level                    IN   VARCHAR2
9494        ,p_old_internal_name             IN   VARCHAR2
9495        ,p_new_internal_name             IN   VARCHAR2
9496        ,p_display_name                  IN   VARCHAR2
9497        ,p_description                   IN   VARCHAR2
9498        ,p_sequence                      IN   NUMBER
9499        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9500        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9501        ,x_return_status                 OUT NOCOPY VARCHAR2
9502        ,x_errorcode                     OUT NOCOPY NUMBER
9503        ,x_msg_count                     OUT NOCOPY NUMBER
9504        ,x_msg_data                      OUT NOCOPY VARCHAR2
9505 ) IS
9506 
9507     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Page';
9508 
9509     l_page_id                NUMBER;
9510     l_new_internal_name      VARCHAR2(150);
9511 
9512   BEGIN
9513 
9514     -- Standard start of API savepoint
9515     IF FND_API.To_Boolean(p_commit) THEN
9516       SAVEPOINT Update_Page_PUB;
9517     END IF;
9518 
9519     l_page_id := Get_Page_Id_From_PKs(p_object_id
9520                                      ,p_classification_code
9521                                      ,p_old_internal_name);
9522     IF l_page_id IS NULL THEN
9523       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9524     END IF;
9525 
9526     -- If caller hasn't passed in a new internal name, we keep the old one
9530       l_new_internal_name := p_new_internal_name;
9527     IF p_new_internal_name IS NULL OR p_new_internal_name = '' THEN
9528       l_new_internal_name := p_old_internal_name;
9529     ELSE
9531     END IF;
9532 
9533     EGO_EXT_FWK_PUB.Update_Page(
9534         p_api_version                   => p_api_version
9535        ,p_page_id                       => l_page_id
9536        ,p_internal_name                 => l_new_internal_name
9537        ,p_display_name                  => p_display_name
9538        ,p_description                   => p_description
9539        ,p_sequence                      => p_sequence
9540        ,p_init_msg_list                 => p_init_msg_list
9541        ,p_commit                        => p_commit
9542        ,x_return_status                 => x_return_status
9543        ,x_errorcode                     => x_errorcode
9544        ,x_msg_count                     => x_msg_count
9545        ,x_msg_data                      => x_msg_data
9546     );
9547 
9548     -- Standard check of p_commit
9549     IF FND_API.To_Boolean(p_commit) THEN
9550       COMMIT WORK;
9551     END IF;
9552 
9553   EXCEPTION
9554     WHEN OTHERS THEN
9555       IF FND_API.To_Boolean(p_commit) THEN
9556         ROLLBACK TO Update_Page_PUB;
9557       END IF;
9558       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9559 
9560       IF l_page_id IS NULL THEN
9561         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoPageFound';
9562       ELSE
9563         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9564         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9565         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9566         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9567         FND_MSG_PUB.Add;
9568         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9569                                  ,p_count   => x_msg_count
9570                                  ,p_data    => x_msg_data);
9571 
9572       END IF;
9573 
9574 END Update_Page;
9575 
9576 ----------------------------------------------------------------------
9577 
9578 PROCEDURE Delete_Page (
9579         p_api_version                   IN   NUMBER
9580        ,p_page_id                       IN   NUMBER
9581        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9582        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9583        ,x_return_status                 OUT NOCOPY VARCHAR2
9584        ,x_errorcode                     OUT NOCOPY NUMBER
9585        ,x_msg_count                     OUT NOCOPY NUMBER
9586        ,x_msg_data                      OUT NOCOPY VARCHAR2
9587 ) IS
9588 
9589     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Page';
9590 
9591     --we don't use l_api_version yet, but eventually we might:
9592     --if we change required parameters, version goes FROM n.x to (n+1).x
9593     --if we change optional parameters, version goes FROM x.n to x.(n+1)
9594     l_api_version            CONSTANT NUMBER := 1.0;
9595 
9596   BEGIN
9597 
9598     -- Standard start of API savepoint
9599     IF FND_API.To_Boolean(p_commit) THEN
9600       SAVEPOINT Delete_Page_PUB;
9601     END IF;
9602 
9603     -- Check for call compatibility
9604     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
9605                                         l_api_name, G_PKG_NAME)
9606     THEN
9607       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9608     END IF;
9609     -- Initialize message list even though we don't currently use it
9610     IF FND_API.To_Boolean(p_init_msg_list) THEN
9611       FND_MSG_PUB.Initialize;
9612     END IF;
9613 
9614     DELETE FROM EGO_PAGE_ENTRIES_B
9615      WHERE PAGE_ID = p_page_id;
9616 
9617     DELETE FROM EGO_PAGES_B
9618      WHERE PAGE_ID = p_page_id;
9619 
9620     DELETE FROM EGO_PAGES_TL
9621      WHERE PAGE_ID = p_page_id;
9622 
9623     -- Standard check of p_commit
9624     IF FND_API.To_Boolean(p_commit) THEN
9625       COMMIT WORK;
9626     END IF;
9627 
9628     x_return_status := FND_API.G_RET_STS_SUCCESS;
9629 
9630   EXCEPTION
9631     WHEN OTHERS THEN
9632       IF FND_API.To_Boolean(p_commit) THEN
9633         ROLLBACK TO Delete_Page_PUB;
9634       END IF;
9635       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9636 
9637       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9638       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9639       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9640       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9641       FND_MSG_PUB.Add;
9642       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9643                                ,p_count   => x_msg_count
9644                                ,p_data    => x_msg_data);
9645 
9646 
9647 END Delete_Page;
9648 
9649 ----------------------------------------------------------------------
9650 
9651 PROCEDURE Delete_Page (
9652         p_api_version                   IN   NUMBER
9653        ,p_object_id                     IN   NUMBER
9654        ,p_classification_code           IN   VARCHAR2
9655        ,p_internal_name                 IN   VARCHAR2
9656        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9657        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9658        ,x_return_status                 OUT NOCOPY VARCHAR2
9662 ) IS
9659        ,x_errorcode                     OUT NOCOPY NUMBER
9660        ,x_msg_count                     OUT NOCOPY NUMBER
9661        ,x_msg_data                      OUT NOCOPY VARCHAR2
9663 
9664     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Page';
9665 
9666     l_page_id                NUMBER;
9667 
9668   BEGIN
9669 
9670     -- Standard start of API savepoint
9671     IF FND_API.To_Boolean(p_commit) THEN
9672       SAVEPOINT Delete_Page_PUB;
9673     END IF;
9674 
9675     l_page_id := Get_Page_Id_From_PKs(p_object_id
9676                                      ,p_classification_code
9677                                      ,p_internal_name);
9678     IF l_page_id IS NULL THEN
9679       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9680     END IF;
9681 
9682     EGO_EXT_FWK_PUB.Delete_Page(
9683         p_api_version                   => p_api_version
9684        ,p_page_id                       => l_page_id
9685        ,p_init_msg_list                 => p_init_msg_list
9686        ,p_commit                        => p_commit
9687        ,x_return_status                 => x_return_status
9688        ,x_errorcode                     => x_errorcode
9689        ,x_msg_count                     => x_msg_count
9690        ,x_msg_data                      => x_msg_data
9691     );
9692 
9693     -- Standard check of p_commit
9694     IF FND_API.To_Boolean(p_commit) THEN
9695       COMMIT WORK;
9696     END IF;
9697 
9698   EXCEPTION
9699     WHEN OTHERS THEN
9700       IF FND_API.To_Boolean(p_commit) THEN
9701         ROLLBACK TO Delete_Page_PUB;
9702       END IF;
9703       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9704 
9705       IF l_page_id IS NULL THEN
9706         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoPageFound';
9707       ELSE
9708         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9709         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9710         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9711         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9712         FND_MSG_PUB.Add;
9713         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9714                                  ,p_count   => x_msg_count
9715                                  ,p_data    => x_msg_data);
9716 
9717       END IF;
9718 
9719 END Delete_Page;
9720 
9721 ----------------------------------------------------------------------
9722 
9723 -- A "group by" function for SQL queries
9724 FUNCTION Group_Page_Regions (
9725         p_association_id                IN   NUMBER
9726        ,p_object_id                     IN   NUMBER
9727        ,p_object_name                   IN   VARCHAR2
9728        ,p_classification_code           IN   VARCHAR2
9729        ,p_data_level                    IN   VARCHAR2
9730        ,p_application_id                IN   NUMBER
9731        ,p_attr_group_type               IN   VARCHAR2
9732        ,p_attr_group_name               IN   VARCHAR2
9733        ,p_attr_group_disp_name          IN   VARCHAR2
9734        ,p_attr_group_description        IN   VARCHAR2
9735        ,p_enabled_code                  IN   VARCHAR2
9736 )
9737 RETURN VARCHAR2
9738 IS
9739 
9740     l_page_region_disp_name VARCHAR2(240);
9741     l_page_region_list      VARCHAR2(4000) := '';/* Increased the length from 2400 to 4000*/
9742 
9743     /*Changed the query for performance reason
9744     CURSOR page_region_csr (cp_association_id IN NUMBER) IS
9745     SELECT PAGE_DISPLAY_NAME
9746       FROM EGO_PAGE_ENTRIES_V
9747      WHERE ASSOCIATION_ID = cp_association_id;*/
9748 
9749 
9750    CURSOR page_region_csr (cp_association_id IN NUMBER) IS
9751        select display_name PAGE_DISPLAY_NAME from ego_pages_v
9752    where page_id in (select page_id from ego_page_entries_b
9753    where ASSOCIATION_ID = cp_association_id);
9754 
9755 
9756   BEGIN
9757 
9758     FOR page_region_rec IN page_region_csr(p_association_id)
9759     LOOP
9760       l_page_region_list := l_page_region_list || page_region_rec.PAGE_DISPLAY_NAME || ', ';
9761     END LOOP;
9762 
9763     --Joseph : We need to Keep LENGTHB instead of LENGTH for Multi-Byte Language Support.
9764     IF (LENGTHB(l_page_region_list) > 0) THEN
9765       -- strip off the trailing ', '
9766       l_page_region_list := SUBSTRB(l_page_region_list, 1, LENGTHB(l_page_region_list) - LENGTHB(', '));
9767     ELSE
9768       l_page_region_list := NULL;
9769     END IF;
9770     RETURN l_page_region_list;
9771 
9772 END;
9773 
9774 ----------------------------------------------------------------------
9775 
9776                       ---------------------
9777                       -- Page Entry APIs --
9778                       ---------------------
9779 
9780 ----------------------------------------------------------------------
9781 
9782 PROCEDURE Create_Page_Entry (
9783         p_api_version                   IN   NUMBER
9784        ,p_page_id                       IN   NUMBER
9785        ,p_association_id                IN   NUMBER
9786        ,p_sequence                      IN   NUMBER
9787        ,p_classification_code           IN   VARCHAR2
9788        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9789        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9790        ,x_return_status                 OUT NOCOPY VARCHAR2
9794 ) IS
9791        ,x_errorcode                     OUT NOCOPY NUMBER
9792        ,x_msg_count                     OUT NOCOPY NUMBER
9793        ,x_msg_data                      OUT NOCOPY VARCHAR2
9795 
9796     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Page_Entry';
9797 
9798     --we don't use l_api_version yet, but eventually we might:
9799     --if we change required parameters, version goes FROM n.x to (n+1).x
9800     --if we change optional parameters, version goes FROM x.n to x.(n+1)
9801     l_api_version            CONSTANT NUMBER := 1.0;
9802 
9803     l_Sysdate                DATE := Sysdate;
9804 
9805   BEGIN
9806 
9807     -- Standard start of API savepoint
9808     IF FND_API.To_Boolean(p_commit) THEN
9809       SAVEPOINT Create_Page_Entry_PUB;
9810     END IF;
9811 
9812     -- Check for call compatibility
9813     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
9814                                         l_api_name, G_PKG_NAME)
9815     THEN
9816       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9817     END IF;
9818     -- Initialize message list even though we don't currently use it
9819     IF FND_API.To_Boolean(p_init_msg_list) THEN
9820       FND_MSG_PUB.Initialize;
9821     END IF;
9822 
9823     INSERT INTO EGO_PAGE_ENTRIES_B
9824     (
9825         PAGE_ID
9826        ,ASSOCIATION_ID
9827        ,SEQUENCE
9828        ,CLASSIFICATION_CODE
9829        ,CREATION_DATE
9830        ,CREATED_BY
9831        ,LAST_UPDATE_DATE
9832        ,LAST_UPDATED_BY
9833        ,LAST_UPDATE_LOGIN
9834     )
9835     VALUES
9836     (
9837         p_page_id
9838        ,p_association_id
9839        ,p_sequence
9840        ,p_classification_code
9841        ,l_Sysdate
9842        ,g_current_user_id
9843        ,l_Sysdate
9844        ,g_current_user_id
9845        ,g_current_login_id
9846     );
9847 
9848     -- Standard check of p_commit
9849     IF FND_API.To_Boolean(p_commit) THEN
9850       COMMIT WORK;
9851     END IF;
9852 
9853     x_return_status := FND_API.G_RET_STS_SUCCESS;
9854 
9855   EXCEPTION
9856     WHEN DUP_VAL_ON_INDEX THEN
9857       IF FND_API.To_Boolean(p_commit) THEN
9858         ROLLBACK TO Create_Page_Entry_PUB;
9859       END IF;
9860       x_return_status := FND_API.G_RET_STS_ERROR;
9861       DECLARE
9862         l_ag_disp_name       VARCHAR2(80);
9863         l_page_disp_name     VARCHAR2(240);
9864         l_class_meaning      VARCHAR2(1000);
9865       BEGIN
9866         SELECT A.ATTR_GROUP_DISP_NAME
9867               ,PE.PAGE_DISPLAY_NAME
9868               ,EGO_EXT_FWK_PUB.Get_Class_Meaning(A.OBJECT_ID, PE.CLASSIFICATION_CODE)
9869           INTO l_ag_disp_name
9870               ,l_page_disp_name
9871               ,l_class_meaning
9872           FROM EGO_OBJ_ATTR_GRP_ASSOCS_V A,
9873                EGO_PAGE_ENTRIES_V PE
9874          WHERE A.ASSOCIATION_ID = PE.ASSOCIATION_ID
9875            AND PE.PAGE_ID = p_page_id
9876            AND PE.ASSOCIATION_ID = p_association_id;
9877 
9878         FND_MESSAGE.Set_Name('EGO', 'EGO_EF_AG_ALREADY_IN_PAGE');
9879         FND_MESSAGE.Set_Token('AG_NAME', l_ag_disp_name);
9880         FND_MESSAGE.Set_Token('PAGE_NAME', l_page_disp_name);
9881         FND_MESSAGE.Set_Token('CLASS_MEANING', l_class_meaning);
9882         FND_MSG_PUB.Add;
9883         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9884                                  ,p_count   => x_msg_count
9885                                  ,p_data    => x_msg_data);
9886 --ego_ef_test_pub.insert_into_ego_err_msgs(x_msg_data);
9887       ------------------------------------------------------------------
9888       -- If anything went wrong with our user-friend error reporting, --
9889       -- just resort to the unexpected error reporting behavior.      --
9890       ------------------------------------------------------------------
9891       EXCEPTION
9892         WHEN OTHERS THEN
9893           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9894 
9895           FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9896           FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9897           FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9898           FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9899           FND_MSG_PUB.Add;
9900           FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9901                                    ,p_count   => x_msg_count
9902                                    ,p_data    => x_msg_data);
9903       END;
9904 
9905     WHEN OTHERS THEN
9906       IF FND_API.To_Boolean(p_commit) THEN
9907         ROLLBACK TO Create_Page_Entry_PUB;
9908       END IF;
9909       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9910 
9911       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9912       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9913       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9914       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9915       FND_MSG_PUB.Add;
9916       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9917                                ,p_count   => x_msg_count
9918                                ,p_data    => x_msg_data);
9919 
9920 
9921 END Create_Page_Entry;
9922 
9923 ----------------------------------------------------------------------
9924 
9925 PROCEDURE Update_Page_Entry (
9926         p_api_version                   IN   NUMBER
9927        ,p_page_id                       IN   NUMBER
9931        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9928        ,p_new_association_id            IN   NUMBER --2995435: Doesnt update association id
9929        ,p_old_association_id            IN   NUMBER --2995435: Doesnt update association id
9930        ,p_sequence                      IN   NUMBER
9932        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9933        ,x_return_status                 OUT NOCOPY VARCHAR2
9934        ,x_errorcode                     OUT NOCOPY NUMBER
9935        ,x_msg_count                     OUT NOCOPY NUMBER
9936        ,x_msg_data                      OUT NOCOPY VARCHAR2
9937 ) IS
9938 
9939     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Page_Entry';
9940 
9941     --we don't use l_api_version yet, but eventually we might:
9942     --if we change required parameters, version goes FROM n.x to (n+1).x
9943     --if we change optional parameters, version goes FROM x.n to x.(n+1)
9944     l_api_version            CONSTANT NUMBER := 1.0;
9945 
9946     l_Sysdate                DATE := Sysdate;
9947 
9948   BEGIN
9949 
9950     -- Standard start of API savepoint
9951     IF FND_API.To_Boolean(p_commit) THEN
9952       SAVEPOINT Update_Page_Entry_PUB;
9953     END IF;
9954 
9955     -- Check for call compatibility
9956     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
9957                                         l_api_name, G_PKG_NAME)
9958     THEN
9959       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9960     END IF;
9961     -- Initialize message list even though we don't currently use it
9962     IF FND_API.To_Boolean(p_init_msg_list) THEN
9963       FND_MSG_PUB.Initialize;
9964     END IF;
9965 
9966     UPDATE EGO_PAGE_ENTRIES_B
9967        SET SEQUENCE            = p_sequence,
9968            ASSOCIATION_ID      = p_new_association_id, --2995435: Doesnt update association id
9969            LAST_UPDATED_BY     = g_current_user_id,
9970            LAST_UPDATE_DATE    = l_Sysdate,
9971            LAST_UPDATE_LOGIN   = g_current_login_id
9972      WHERE PAGE_ID             = p_page_id
9973        AND ASSOCIATION_ID      = p_old_association_id;
9974 
9975     -- Standard check of p_commit
9976     IF FND_API.To_Boolean(p_commit) THEN
9977       COMMIT WORK;
9978     END IF;
9979 
9980     x_return_status := FND_API.G_RET_STS_SUCCESS;
9981 
9982   EXCEPTION
9983     WHEN DUP_VAL_ON_INDEX THEN
9984       IF FND_API.To_Boolean(p_commit) THEN
9985         ROLLBACK TO Update_Page_Entry_PUB;
9986       END IF;
9987       x_return_status := FND_API.G_RET_STS_ERROR;
9988       DECLARE
9989         l_ag_disp_name       VARCHAR2(80);
9990         l_page_disp_name     VARCHAR2(240);
9991         l_class_meaning      VARCHAR2(1000);
9992       BEGIN
9993         SELECT A.ATTR_GROUP_DISP_NAME
9994               ,PE.PAGE_DISPLAY_NAME
9995               ,EGO_EXT_FWK_PUB.Get_Class_Meaning(A.OBJECT_ID, PE.CLASSIFICATION_CODE)
9996           INTO l_ag_disp_name
9997               ,l_page_disp_name
9998               ,l_class_meaning
9999           FROM EGO_OBJ_ATTR_GRP_ASSOCS_V A,
10000                EGO_PAGE_ENTRIES_V PE
10001          WHERE A.ASSOCIATION_ID = PE.ASSOCIATION_ID
10002            AND PE.PAGE_ID = p_page_id
10003            AND PE.ASSOCIATION_ID = p_new_association_id;
10004 
10005         FND_MESSAGE.Set_Name('EGO', 'EGO_EF_AG_ALREADY_IN_PAGE');
10006         FND_MESSAGE.Set_Token('AG_NAME', l_ag_disp_name);
10007         FND_MESSAGE.Set_Token('PAGE_NAME', l_page_disp_name);
10008         FND_MESSAGE.Set_Token('CLASS_MEANING', l_class_meaning);
10009         FND_MSG_PUB.Add;
10010         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10011                                  ,p_count   => x_msg_count
10012                                  ,p_data    => x_msg_data);
10013 
10014       ------------------------------------------------------------------
10015       -- If anything went wrong with our user-friend error reporting, --
10016       -- just resort to the unexpected error reporting behavior.      --
10017       ------------------------------------------------------------------
10018       EXCEPTION
10019         WHEN OTHERS THEN
10020           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10021 
10022           FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10023           FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10024           FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10025           FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10026           FND_MSG_PUB.Add;
10027           FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10028                                    ,p_count   => x_msg_count
10029                                    ,p_data    => x_msg_data);
10030       END;
10031 
10032     WHEN OTHERS THEN
10033       IF FND_API.To_Boolean(p_commit) THEN
10034         ROLLBACK TO Update_Page_Entry_PUB;
10035       END IF;
10036       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10037 
10038       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10039       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10040       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10041       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10042       FND_MSG_PUB.Add;
10043       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10044                                ,p_count   => x_msg_count
10045                                ,p_data    => x_msg_data);
10046 
10047 
10048 END Update_Page_Entry;
10049 
10053         p_api_version                   IN   NUMBER
10050 ----------------------------------------------------------------------
10051 
10052 PROCEDURE Delete_Page_Entry (
10054        ,p_page_id                       IN   NUMBER
10055        ,p_association_id                IN   NUMBER
10056        ,p_classification_code           IN   VARCHAR2
10057        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10058        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10059        ,x_return_status                 OUT NOCOPY VARCHAR2
10060        ,x_errorcode                     OUT NOCOPY NUMBER
10061        ,x_msg_count                     OUT NOCOPY NUMBER
10062        ,x_msg_data                      OUT NOCOPY VARCHAR2
10063 ) IS
10064 
10065     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Page_Entry';
10066 
10067     --we don't use l_api_version yet, but eventually we might:
10068     --if we change required parameters, version goes FROM n.x to (n+1).x
10069     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10070     l_api_version            CONSTANT NUMBER := 1.0;
10071 
10072   BEGIN
10073 
10074     -- Standard start of API savepoint
10075     IF FND_API.To_Boolean(p_commit) THEN
10076       SAVEPOINT Delete_Page_Entry_PUB;
10077     END IF;
10078 
10079     -- Check for call compatibility
10080     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10081                                         l_api_name, G_PKG_NAME)
10082     THEN
10083       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10084     END IF;
10085     -- Initialize message list even though we don't currently use it
10086     IF FND_API.To_Boolean(p_init_msg_list) THEN
10087       FND_MSG_PUB.Initialize;
10088     END IF;
10089 
10090  --Bug 3871440
10091     DELETE FROM EGO_PAGE_ENTRIES_B
10092      WHERE PAGE_ID = p_page_id
10093        AND ASSOCIATION_ID = p_association_id
10094        AND CLASSIFICATION_CODE = p_classification_code;
10095 
10096     -- Standard check of p_commit
10097     IF FND_API.To_Boolean(p_commit) THEN
10098       COMMIT WORK;
10099     END IF;
10100 
10101     x_return_status := FND_API.G_RET_STS_SUCCESS;
10102 
10103   EXCEPTION
10104     WHEN OTHERS THEN
10105       IF FND_API.To_Boolean(p_commit) THEN
10106         ROLLBACK TO Delete_Page_Entry_PUB;
10107       END IF;
10108       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10109 
10110       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10111       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10112       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10113       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10114       FND_MSG_PUB.Add;
10115       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10116                                ,p_count   => x_msg_count
10117                                ,p_data    => x_msg_data);
10118 
10119 
10120 END Delete_Page_Entry;
10121 
10122 ----------------------------------------------------------------------
10123 
10124                        -------------------
10125                        -- Function APIs --
10126                        -------------------
10127 
10128 ----------------------------------------------------------------------
10129 
10130 PROCEDURE Create_Function (
10131         p_api_version                   IN   NUMBER
10132        ,p_internal_name                 IN   VARCHAR2
10133        ,p_function_type                 IN   VARCHAR2
10134        ,p_function_info_1               IN   VARCHAR2
10135        ,p_function_info_2               IN   VARCHAR2
10136        ,p_display_name                  IN   VARCHAR2
10137        ,p_description                   IN   VARCHAR2
10138        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10139        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10140        ,x_function_id                   OUT NOCOPY NUMBER
10141        ,x_return_status                 OUT NOCOPY VARCHAR2
10142        ,x_errorcode                     OUT NOCOPY NUMBER
10143        ,x_msg_count                     OUT NOCOPY NUMBER
10144        ,x_msg_data                      OUT NOCOPY VARCHAR2
10145 ) IS
10146 
10147     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Function';
10148 
10149     --we don't use l_api_version yet, but eventually we might:
10150     --if we change required parameters, version goes FROM n.x to (n+1).x
10151     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10152     l_api_version            CONSTANT NUMBER := 1.0;
10153 
10154     l_Sysdate                DATE := Sysdate;
10155 
10156   BEGIN
10157 
10158     -- Standard start of API savepoint
10159     IF FND_API.To_Boolean(p_commit) THEN
10160       SAVEPOINT Create_Function_PUB;
10161     END IF;
10162 
10163     -- Check for call compatibility
10164     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10165                                         l_api_name, G_PKG_NAME)
10166     THEN
10167       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10168     END IF;
10169     -- Initialize message list even though we don't currently use it
10170     IF FND_API.To_Boolean(p_init_msg_list) THEN
10171       FND_MSG_PUB.Initialize;
10172     END IF;
10173 
10174     SELECT EGO_FUNCTIONS_S.NEXTVAL INTO x_function_id FROM DUAL;
10175 
10176     INSERT INTO EGO_FUNCTIONS_B
10177     (
10178         FUNCTION_ID
10182        ,FUNCTION_INFO_2
10179        ,INTERNAL_NAME
10180        ,FUNCTION_TYPE
10181        ,FUNCTION_INFO_1
10183        ,LAST_UPDATE_DATE
10184        ,LAST_UPDATED_BY
10185        ,CREATION_DATE
10186        ,CREATED_BY
10187        ,LAST_UPDATE_LOGIN
10188     )
10189     VALUES
10190     (
10191         x_function_id
10192        ,p_internal_name
10193        ,p_function_type
10194        ,p_FUNCTION_INFO_1
10195        ,p_FUNCTION_INFO_2
10196        ,l_Sysdate
10197        ,g_current_user_id
10198        ,l_Sysdate
10199        ,g_current_user_id
10200        ,g_current_login_id
10201     );
10202 
10203     INSERT INTO EGO_FUNCTIONS_TL
10204     (
10205         FUNCTION_ID
10206        ,DISPLAY_NAME
10207        ,DESCRIPTION
10208        ,LANGUAGE
10209        ,SOURCE_LANG
10210        ,LAST_UPDATE_DATE
10211        ,LAST_UPDATED_BY
10212        ,CREATION_DATE
10213        ,CREATED_BY
10214        ,LAST_UPDATE_LOGIN
10215     )
10216     SELECT
10217         x_function_id
10218        ,p_display_name
10219        ,p_description
10220        ,L.LANGUAGE_CODE
10221        ,USERENV('LANG')
10222        ,l_Sysdate
10223        ,g_current_user_id
10224        ,l_Sysdate
10225        ,g_current_user_id
10226        ,g_current_login_id
10227     FROM FND_LANGUAGES L
10228     WHERE L.INSTALLED_FLAG in ('I', 'B');
10229 
10230     -- Standard check of p_commit
10231     IF FND_API.To_Boolean(p_commit) THEN
10232       COMMIT WORK;
10233     END IF;
10234 
10235     x_return_status := FND_API.G_RET_STS_SUCCESS;
10236 
10237   EXCEPTION
10238     WHEN OTHERS THEN
10239       IF FND_API.To_Boolean(p_commit) THEN
10240         ROLLBACK TO Create_Function_PUB;
10241       END IF;
10242       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10243 
10244       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10245       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10246       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10247       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10248       FND_MSG_PUB.Add;
10249       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10250                                ,p_count   => x_msg_count
10251                                ,p_data    => x_msg_data);
10252 
10253 
10254 END Create_Function;
10255 
10256 ----------------------------------------------------------------------
10257 
10258 PROCEDURE Update_Function (
10259         p_api_version                   IN   NUMBER
10260        ,p_function_id                   IN   NUMBER
10261        ,p_internal_name                 IN   VARCHAR2
10262        ,p_function_info_1               IN   VARCHAR2
10263        ,p_function_info_2               IN   VARCHAR2
10264        ,p_display_name                  IN   VARCHAR2
10265        ,p_description                   IN   VARCHAR2
10266        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10267        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10268        ,x_return_status                 OUT NOCOPY VARCHAR2
10269        ,x_errorcode                     OUT NOCOPY NUMBER
10270        ,x_msg_count                     OUT NOCOPY NUMBER
10271        ,x_msg_data                      OUT NOCOPY VARCHAR2
10272 ) IS
10273 
10274     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Function';
10275 
10276     --we don't use l_api_version yet, but eventually we might:
10277     --if we change required parameters, version goes FROM n.x to (n+1).x
10278     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10279     l_api_version            CONSTANT NUMBER := 1.0;
10280 
10281     l_Sysdate            DATE                    := Sysdate;
10282 
10283   BEGIN
10284 
10285     -- Standard start of API savepoint
10286     IF FND_API.To_Boolean(p_commit) THEN
10287       SAVEPOINT Update_Function_PUB;
10288     END IF;
10289 
10290     -- Check for call compatibility
10291     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10292                                         l_api_name, G_PKG_NAME)
10293     THEN
10294       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10295     END IF;
10296     -- Initialize message list even though we don't currently use it
10297     IF FND_API.To_Boolean(p_init_msg_list) THEN
10298       FND_MSG_PUB.Initialize;
10299     END IF;
10300 
10301     UPDATE EGO_FUNCTIONS_B
10302     SET
10303       INTERNAL_NAME     = p_internal_name
10304     , FUNCTION_INFO_1   = p_FUNCTION_INFO_1
10305     , FUNCTION_INFO_2   = p_FUNCTION_INFO_2
10306     , LAST_UPDATE_DATE  = l_Sysdate
10307     , LAST_UPDATED_BY   = g_current_user_id
10308     , LAST_UPDATE_LOGIN = g_current_login_id
10309 
10310     WHERE
10311     FUNCTION_ID = p_function_id;
10312 
10313     UPDATE EGO_FUNCTIONS_TL
10314     SET
10315       DISPLAY_NAME      = p_display_name
10316     , DESCRIPTION       = p_description
10317     , LAST_UPDATE_DATE  = l_Sysdate
10318     , LAST_UPDATED_BY   = g_current_user_id
10319     , LAST_UPDATE_LOGIN = g_current_login_id
10320     , SOURCE_LANG   = USERENV('LANG')
10321     WHERE
10322     -- FUNCTION_ID = p_function_id AND LANGUAGE = USERENV('LANG');
10323      FUNCTION_ID = p_function_id AND USERENV('LANG') IN (LANGUAGE ,SOURCE_LANG );
10324 
10325     -- Standard check of p_commit
10326     IF FND_API.To_Boolean(p_commit) THEN
10330     x_return_status := FND_API.G_RET_STS_SUCCESS;
10327       COMMIT WORK;
10328     END IF;
10329 
10331 
10332   EXCEPTION
10333     WHEN OTHERS THEN
10334       IF FND_API.To_Boolean(p_commit) THEN
10335         ROLLBACK TO Update_Function_PUB;
10336       END IF;
10337       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10338 
10339       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10340       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10341       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10342       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10343       FND_MSG_PUB.Add;
10344       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10345                                ,p_count   => x_msg_count
10346                                ,p_data    => x_msg_data);
10347 
10348 
10349 END Update_Function;
10350 
10351 ----------------------------------------------------------------------
10352 
10353 PROCEDURE Delete_Function (
10354         p_api_version                   IN   NUMBER
10355        ,p_function_id                   IN   NUMBER
10356        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10357        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10358        ,x_return_status                 OUT NOCOPY VARCHAR2
10359        ,x_errorcode                     OUT NOCOPY NUMBER
10360        ,x_msg_count                     OUT NOCOPY NUMBER
10361        ,x_msg_data                      OUT NOCOPY VARCHAR2
10362 ) IS
10363 
10364     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Function';
10365 
10366     --we don't use l_api_version yet, but eventually we might:
10367     --if we change required parameters, version goes FROM n.x to (n+1).x
10368     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10369     l_api_version            CONSTANT NUMBER := 1.0;
10370 
10371     l_function_use_count     NUMBER;
10372     l_delete_error_flag      VARCHAR2(1) := 'N';
10373     l_Sysdate                DATE := Sysdate;
10374 
10375   BEGIN
10376 
10377     -- Standard start of API savepoint
10378     IF FND_API.To_Boolean(p_commit) THEN
10379       SAVEPOINT Delete_Function_PUB;
10380     END IF;
10381 
10382     -- Check for call compatibility
10383     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10384                                         l_api_name, G_PKG_NAME)
10385     THEN
10386       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10387     END IF;
10388     -- Initialize message list even though we don't currently use it
10389     IF FND_API.To_Boolean(p_init_msg_list) THEN
10390       FND_MSG_PUB.Initialize;
10391     END IF;
10392 
10393     -- If a Function is in use by any Actions, it cannot be deleted.
10394     -- We check function_id, prompt_function_id and visibility_func_id
10395     -- to make sure the Function we're trying to delete isn't in use.
10396 
10397     SELECT count(*)
10398       INTO l_function_use_count
10399       FROM EGO_ACTIONS_B
10400      WHERE FUNCTION_ID = p_function_id;
10401     IF (l_function_use_count > 0)
10402     THEN
10403       l_delete_error_flag := 'Y';
10404       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10405     END IF;
10406 
10407     SELECT count(*)
10408       INTO l_function_use_count
10409       FROM EGO_ACTION_DISPLAYS_B
10410      WHERE PROMPT_FUNCTION_ID = p_function_id;
10411     IF (l_function_use_count > 0)
10412     THEN
10413       l_delete_error_flag := 'Y';
10414       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10415     END IF;
10416 
10417     SELECT count(*)
10418       INTO l_function_use_count
10419       FROM EGO_ACTION_DISPLAYS_B
10420      WHERE VISIBILITY_FUNC_ID = p_function_id;
10421     IF (l_function_use_count > 0)
10422     THEN
10423       l_delete_error_flag := 'Y';
10424       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10425     END IF;
10426 
10427     DELETE FROM EGO_FUNCTIONS_B
10428     WHERE
10429     FUNCTION_ID = p_function_id;
10430 
10431     DELETE FROM EGO_FUNCTIONS_TL
10432     WHERE
10433     FUNCTION_ID = p_function_id;
10434 
10435     -- Standard check of p_commit
10436     IF FND_API.To_Boolean(p_commit) THEN
10437       COMMIT WORK;
10438     END IF;
10439 
10440     x_return_status := FND_API.G_RET_STS_SUCCESS;
10441 
10442   EXCEPTION
10443     WHEN OTHERS THEN
10444       IF FND_API.To_Boolean(p_commit) THEN
10445         ROLLBACK TO Delete_Function_PUB;
10446       END IF;
10447       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10448 
10449       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10450       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10451       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10452       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10453       FND_MSG_PUB.Add;
10454       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10455                                ,p_count   => x_msg_count
10456                                ,p_data    => x_msg_data);
10457 
10458 
10459       IF (l_delete_error_flag = 'Y') THEN
10460         -- Let the calling API know that this Function is being used
10461         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' FunctionInUse';
10462       END IF;
10463 
10464 END Delete_Function;
10465 
10466 ----------------------------------------------------------------------
10467 
10468                ------------------------------------
10469                -- Action AND Action Display APIs --
10470                ------------------------------------
10471 
10475         p_api_version                   IN   NUMBER
10472 ----------------------------------------------------------------------
10473 
10474 PROCEDURE Create_Action (
10476        ,p_object_id                     IN   NUMBER
10477        ,p_classification_code           IN   VARCHAR2
10478        ,p_attr_group_id                 IN   NUMBER   DEFAULT NULL
10479        ,p_sequence                      IN   NUMBER
10480        ,p_action_name                   IN   VARCHAR2
10481        ,p_description                   IN   VARCHAR2
10482        ,p_function_id                   IN   NUMBER
10483        ,p_enable_key_attrs              IN   VARCHAR2  DEFAULT NULL
10484        ,p_security_privilege_id         IN   NUMBER
10485        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10486        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10487        ,x_action_id                     OUT NOCOPY NUMBER
10488        ,x_return_status                 OUT NOCOPY VARCHAR2
10489        ,x_errorcode                     OUT NOCOPY NUMBER
10490        ,x_msg_count                     OUT NOCOPY NUMBER
10491        ,x_msg_data                      OUT NOCOPY VARCHAR2
10492 ) IS
10493 
10494     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action';
10495 
10496     --we don't use l_api_version yet, but eventually we might:
10497     --if we change required parameters, version goes FROM n.x to (n+1).x
10498     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10499     l_api_version            CONSTANT NUMBER := 1.0;
10500 
10501     l_Sysdate                DATE := Sysdate;
10502     l_validate               NUMBER;
10503 
10504     e_dup_action_seq_error   EXCEPTION;
10505     e_dup_action_name_error  EXCEPTION;
10506 
10507   BEGIN
10508 
10509     -- Standard start of API savepoint
10510     IF FND_API.To_Boolean(p_commit) THEN
10511       SAVEPOINT Create_Action_PUB;
10512     END IF;
10513 
10514     -- Check for call compatibility
10515     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10516                                         l_api_name, G_PKG_NAME)
10517     THEN
10518       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10519     END IF;
10520     -- Initialize message list even though we don't currently use it
10521     IF FND_API.To_Boolean(p_init_msg_list) THEN
10522       FND_MSG_PUB.Initialize;
10523     END IF;
10524 
10525     SELECT EGO_ACTIONS_S.NEXTVAL INTO x_action_id FROM DUAL;
10526 
10527     -- Ensure created action's name or sequence number do not
10528     -- match those of an action already associated with the
10529     -- classification/attribute pair.
10530 
10531     -- Validate sequence
10532     SELECT COUNT(*)
10533       INTO l_validate
10534       FROM EGO_ACTIONS_B
10535      WHERE SEQUENCE = p_sequence
10536        AND OBJECT_ID = p_object_id
10537        AND CLASSIFICATION_CODE = p_classification_code
10538        AND ATTR_GROUP_ID = p_attr_group_id;
10539 
10540     IF (l_validate > 0) THEN
10541       RAISE e_dup_action_seq_error;
10542     END IF;
10543 
10544     -- Validate name
10545     SELECT COUNT(*)
10546       INTO l_validate
10547       FROM EGO_ACTIONS_B
10548      WHERE ACTION_NAME = p_action_name
10549        AND OBJECT_ID = p_object_id
10550        AND CLASSIFICATION_CODE = p_classification_code
10551        AND ATTR_GROUP_ID = p_attr_group_id;
10552 
10553     IF (l_validate > 0) THEN
10554       RAISE e_dup_action_name_error;
10555     END IF;
10556 
10557 
10558     INSERT INTO EGO_ACTIONS_B
10559     (
10560         ACTION_ID
10561        ,OBJECT_ID
10562        ,CLASSIFICATION_CODE
10563        ,ATTR_GROUP_ID
10564        ,SEQUENCE
10565        ,ACTION_NAME
10566        ,FUNCTION_ID
10567        ,ENABLE_KEY_ATTRIBUTES
10568        ,SECURITY_PRIVILEGE_ID
10569        ,LAST_UPDATE_DATE
10570        ,LAST_UPDATED_BY
10571        ,CREATION_DATE
10572        ,CREATED_BY
10573        ,LAST_UPDATE_LOGIN
10574     )
10575     VALUES
10576     (
10577         x_action_id
10578        ,p_object_id
10579        ,p_classification_code
10580        ,p_attr_group_id
10581        ,p_sequence
10582        ,p_action_name
10583        ,p_function_id
10584        ,p_enable_key_attrs
10585        ,p_security_privilege_id
10586        ,l_Sysdate
10587        ,g_current_user_id
10588        ,l_Sysdate
10589        ,g_current_user_id
10590        ,g_current_login_id
10591     );
10592 
10593     INSERT INTO EGO_ACTIONS_TL
10594     (
10595         ACTION_ID
10596        ,DESCRIPTION
10597        ,LANGUAGE
10598        ,SOURCE_LANG
10599        ,LAST_UPDATE_DATE
10600        ,LAST_UPDATED_BY
10601        ,CREATION_DATE
10602        ,CREATED_BY
10603        ,LAST_UPDATE_LOGIN
10604     )
10605     SELECT
10606         x_action_id
10607        ,p_description
10608        ,L.LANGUAGE_CODE
10609        ,USERENV('LANG')
10610        ,l_Sysdate
10611        ,g_current_user_id
10612        ,l_Sysdate
10613        ,g_current_user_id
10614        ,g_current_login_id
10615 
10616     FROM FND_LANGUAGES L
10617     WHERE L.INSTALLED_FLAG in ('I', 'B');
10618 
10619     -- Standard check of p_commit
10620     IF FND_API.To_Boolean(p_commit) THEN
10621       COMMIT WORK;
10622     END IF;
10623 
10624     x_return_status := FND_API.G_RET_STS_SUCCESS;
10625     x_errorcode := 0;
10626 
10627   EXCEPTION
10628     WHEN e_dup_action_seq_error THEN
10632       x_return_status := FND_API.G_RET_STS_ERROR;
10629       IF FND_API.To_Boolean(p_commit) THEN
10630         ROLLBACK TO Create_Action_PUB;
10631       END IF;
10633       x_errorcode := 1;
10634       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ACTN_DUP_SEQ_ERR');
10635       FND_MSG_PUB.Add;
10636       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10637                                ,p_count   => x_msg_count
10638                                ,p_data    => x_msg_data);
10639 
10640     WHEN e_dup_action_name_error THEN
10641       IF FND_API.To_Boolean(p_commit) THEN
10642         ROLLBACK TO Create_Action_PUB;
10643       END IF;
10644       x_return_status := FND_API.G_RET_STS_ERROR;
10645       x_errorcode := 1;
10646       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ACTN_DUP_NAME_ERR');
10647       FND_MSG_PUB.Add;
10648       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10649                                ,p_count   => x_msg_count
10650                                ,p_data    => x_msg_data);
10651 
10652     WHEN OTHERS THEN
10653       IF FND_API.To_Boolean(p_commit) THEN
10654         ROLLBACK TO Create_Action_PUB;
10655       END IF;
10656       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10657       x_errorcode := 1;
10658       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10659       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10660       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10661       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10662       FND_MSG_PUB.Add;
10663       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10664                                ,p_count   => x_msg_count
10665                                ,p_data    => x_msg_data);
10666 
10667 
10668 END Create_Action;
10669 
10670 ----------------------------------------------------------------------
10671 
10672 PROCEDURE Create_Action (
10673         p_api_version                   IN   NUMBER
10674        ,p_object_id                     IN   NUMBER
10675        ,p_classification_code           IN   VARCHAR2
10676        ,p_attr_grp_application_id       IN   NUMBER
10677        ,p_attr_group_type               IN   VARCHAR2
10678        ,p_attr_group_name               IN   VARCHAR2
10679        ,p_sequence                      IN   NUMBER
10680        ,p_action_name                   IN   VARCHAR2
10681        ,p_description                   IN   VARCHAR2
10682        ,p_function_id                   IN   NUMBER
10683        ,p_enable_key_attrs              IN   VARCHAR2  DEFAULT NULL
10684        ,p_security_privilege_id         IN   NUMBER
10685        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10686        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10687        ,x_action_id                     OUT NOCOPY NUMBER
10688        ,x_return_status                 OUT NOCOPY VARCHAR2
10689        ,x_errorcode                     OUT NOCOPY NUMBER
10690        ,x_msg_count                     OUT NOCOPY NUMBER
10691        ,x_msg_data                      OUT NOCOPY VARCHAR2
10692 ) IS
10693 
10694     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action';
10695 
10696     l_attr_group_id          NUMBER;
10697 
10698   BEGIN
10699 
10700     -- Standard start of API savepoint
10701     IF FND_API.To_Boolean(p_commit) THEN
10702       SAVEPOINT Create_Action_PUB;
10703     END IF;
10704 
10705     l_attr_group_id := Get_Attr_Group_Id_From_PKs(p_attr_grp_application_id
10706                                                  ,p_attr_group_type
10707                                                  ,p_attr_group_name);
10708     IF l_attr_group_id IS NULL THEN
10709       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10710     END IF;
10711 
10712     EGO_EXT_FWK_PUB.Create_Action(
10713         p_api_version                   => p_api_version
10714        ,p_object_id                     => p_object_id
10715        ,p_classification_code           => p_classification_code
10716        ,p_attr_group_id                 => l_attr_group_id
10717        ,p_sequence                      => p_sequence
10718        ,p_action_name                   => p_action_name
10719        ,p_description                   => p_description
10720        ,p_function_id                   => p_function_id
10721        ,p_security_privilege_id         => p_security_privilege_id
10722        ,p_init_msg_list                 => p_init_msg_list
10723        ,p_commit                        => p_commit
10724        ,x_action_id                     => x_action_id
10725        ,x_return_status                 => x_return_status
10726        ,x_errorcode                     => x_errorcode
10727        ,x_msg_count                     => x_msg_count
10728        ,x_msg_data                      => x_msg_data
10729     );
10730 
10731     -- Standard check of p_commit
10732     IF FND_API.To_Boolean(p_commit) THEN
10733       COMMIT WORK;
10734     END IF;
10735 
10736   EXCEPTION
10737     WHEN OTHERS THEN
10738       IF FND_API.To_Boolean(p_commit) THEN
10739         ROLLBACK TO Create_Action_PUB;
10740       END IF;
10741       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10742       x_errorcode := 1;
10743 
10744       IF l_attr_group_id IS NULL THEN
10745         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAttrGroupIDFoundForPKs';
10746       ELSE
10747         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10748         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10749         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10750         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10751         FND_MSG_PUB.Add;
10755 
10752         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10753                                  ,p_count   => x_msg_count
10754                                  ,p_data    => x_msg_data);
10756       END IF;
10757 
10758 END Create_Action;
10759 
10760 ----------------------------------------------------------------------
10761 
10762 PROCEDURE Update_Action (
10763         p_api_version                   IN   NUMBER
10764        ,p_action_id                     IN   NUMBER
10765        ,p_sequence                      IN   NUMBER
10766        ,p_action_name                   IN   VARCHAR2
10767        ,p_description                   IN   VARCHAR2
10768        ,p_function_id                   IN   NUMBER
10769        ,p_enable_key_attrs              IN   VARCHAR2 DEFAULT NULL
10770        ,p_security_privilege_id         IN   NUMBER
10771        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10772        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10773        ,x_return_status                 OUT NOCOPY VARCHAR2
10774        ,x_errorcode                     OUT NOCOPY NUMBER
10775        ,x_msg_count                     OUT NOCOPY NUMBER
10776        ,x_msg_data                      OUT NOCOPY VARCHAR2
10777 ) IS
10778 
10779     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Action';
10780 
10781     --we don't use l_api_version yet, but eventually we might:
10782     --if we change required parameters, version goes FROM n.x to (n+1).x
10783     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10784     l_api_version            CONSTANT NUMBER := 1.0;
10785 
10786     l_Sysdate                DATE := Sysdate;
10787     l_validate               NUMBER;
10788     l_old_function_id        NUMBER;
10789     l_mapping_count          NUMBER;
10790     l_mapped_obj_type        EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'A';
10791     l_object_id              NUMBER;
10792     l_classification_code    VARCHAR2(150);
10793     l_attr_group_id          NUMBER;
10794 
10795     e_dup_action_seq_error   EXCEPTION;
10796     e_dup_action_name_error  EXCEPTION;
10797 
10798   BEGIN
10799 
10800     -- Standard start of API savepoint
10801     IF FND_API.To_Boolean(p_commit) THEN
10802       SAVEPOINT Update_Action_PUB;
10803     END IF;
10804 
10805     -- Check for call compatibility
10806     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10807                                         l_api_name, G_PKG_NAME)
10808     THEN
10809       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10810     END IF;
10811     -- Initialize message list even though we don't currently use it
10812     IF FND_API.To_Boolean(p_init_msg_list) THEN
10813       FND_MSG_PUB.Initialize;
10814     END IF;
10815 
10816     -- Disallow changes that duplicate a preexisting action's sequence
10817     -- number or name in the classification/attribute group association.
10818 
10819     -- Retrieve type/classification/attribute group info.
10820     SELECT OBJECT_ID, CLASSIFICATION_CODE, ATTR_GROUP_ID
10821       INTO l_object_id, l_classification_code, l_attr_group_id
10822       FROM EGO_ACTIONS_B
10823     WHERE ACTION_ID = p_action_id;
10824 
10825     -- Validate sequence
10826     SELECT COUNT(*)
10827       INTO l_validate
10828       FROM EGO_ACTIONS_B
10829      WHERE SEQUENCE = p_sequence
10830        AND ACTION_ID <> p_action_id
10831        AND OBJECT_ID = l_object_id
10832        AND CLASSIFICATION_CODE = l_classification_code
10833        AND ATTR_GROUP_ID = l_attr_group_id;
10834 
10835     IF (l_validate > 0) THEN
10836       RAISE e_dup_action_seq_error;
10837     END IF;
10838 
10839     -- Validate name
10840     SELECT COUNT(*)
10841       INTO l_validate
10842       FROM EGO_ACTIONS_B
10843      WHERE ACTION_NAME = p_action_name
10844        AND ACTION_ID <> p_action_id
10845        AND OBJECT_ID = l_object_id
10846        AND CLASSIFICATION_CODE = l_classification_code
10847        AND ATTR_GROUP_ID = l_attr_group_id;
10848 
10849     IF (l_validate > 0) THEN
10850       RAISE e_dup_action_name_error;
10851     END IF;
10852 
10853 
10854     -- If the function_id is different and if there were
10855     -- Mappings for the old Function, we delete those Mappings.
10856 
10857     SELECT FUNCTION_ID
10858       INTO l_old_function_id
10859       FROM EGO_ACTIONS_B
10860      WHERE ACTION_ID = p_action_id;
10861 
10862     IF l_old_function_id <> p_function_id THEN
10863       SELECT COUNT(*)
10864         INTO l_mapping_count
10865         FROM EGO_MAPPINGS_B
10866        WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
10867          AND FUNCTION_ID = l_old_function_id
10868          AND MAPPED_OBJ_TYPE = l_mapped_obj_type;
10869 
10870       IF (l_mapping_count > 0) THEN
10871         EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_old_function_id,
10872                                             l_mapped_obj_type, p_action_id, null,
10873                                             null, x_return_status, x_errorcode,
10874                                             x_msg_count, x_msg_data);
10875       END IF;
10876     END IF;
10877 
10878     UPDATE EGO_ACTIONS_B
10879     SET
10880        SEQUENCE              = p_sequence
10881      , ACTION_NAME           = p_action_name
10882      , FUNCTION_ID           = p_function_id
10883      , SECURITY_PRIVILEGE_ID = p_security_privilege_id
10887      , ENABLE_KEY_ATTRIBUTES = p_enable_key_attrs
10884      , LAST_UPDATE_DATE      = l_Sysdate
10885      , LAST_UPDATED_BY       = g_current_user_id
10886      , LAST_UPDATE_LOGIN     = g_current_login_id
10888     WHERE
10889        ACTION_ID = p_action_id;
10890 
10891     UPDATE EGO_ACTIONS_TL
10892     SET
10893        DESCRIPTION       = p_description
10894      , LAST_UPDATE_DATE  = l_Sysdate
10895      , LAST_UPDATED_BY   = g_current_user_id
10896      , LAST_UPDATE_LOGIN = g_current_login_id
10897      , SOURCE_LANG  = USERENV('LANG')
10898     WHERE
10899       -- ACTION_ID = p_action_id AND LANGUAGE = USERENV('LANG');
10900       ACTION_ID = p_action_id AND USERENV('LANG') IN (LANGUAGE , SOURCE_LANG);
10901 
10902     -- Standard check of p_commit
10903     IF FND_API.To_Boolean(p_commit) THEN
10904       COMMIT WORK;
10905     END IF;
10906 
10907     x_return_status := FND_API.G_RET_STS_SUCCESS;
10908     x_errorcode := 0;
10909 
10910   EXCEPTION
10911     WHEN e_dup_action_seq_error THEN
10912       IF FND_API.To_Boolean(p_commit) THEN
10913         ROLLBACK TO Update_Action_PUB;
10914       END IF;
10915       x_return_status := FND_API.G_RET_STS_ERROR;
10916       x_errorcode := 1;
10917       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_UP_ACTN_DUP_SEQ_ERR');
10918       FND_MSG_PUB.Add;
10919       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10920                                ,p_count   => x_msg_count
10921                                ,p_data    => x_msg_data);
10922 
10923     WHEN e_dup_action_name_error THEN
10924       IF FND_API.To_Boolean(p_commit) THEN
10925         ROLLBACK TO Update_Action_PUB;
10926       END IF;
10927       x_return_status := FND_API.G_RET_STS_ERROR;
10928       x_errorcode := 1;
10929       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_UP_ACTN_DUP_NAME_ERR');
10930       FND_MSG_PUB.Add;
10931       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10932                                ,p_count   => x_msg_count
10933                                ,p_data    => x_msg_data);
10934 
10935     WHEN OTHERS THEN
10936       IF FND_API.To_Boolean(p_commit) THEN
10937         ROLLBACK TO Update_Action_PUB;
10938       END IF;
10939       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10940 
10941       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10942       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10943       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10944       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10945       FND_MSG_PUB.Add;
10946       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10947                                ,p_count   => x_msg_count
10948                                ,p_data    => x_msg_data);
10949 
10950 
10951 END Update_Action;
10952 
10953 ----------------------------------------------------------------------
10954 
10955 PROCEDURE Delete_Action (
10956         p_api_version                   IN   NUMBER
10957        ,p_action_id                     IN   NUMBER
10958        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10959        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10960        ,x_return_status                 OUT NOCOPY VARCHAR2
10964 ) IS
10961        ,x_errorcode                     OUT NOCOPY NUMBER
10962        ,x_msg_count                     OUT NOCOPY NUMBER
10963        ,x_msg_data                      OUT NOCOPY VARCHAR2
10965 
10966     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Action';
10967 
10968     --we don't use l_api_version yet, but eventually we might:
10969     --if we change required parameters, version goes FROM n.x to (n+1).x
10970     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10971     l_api_version            CONSTANT NUMBER := 1.0;
10972 
10973     l_function_id            NUMBER;
10974     l_mapping_count          NUMBER;
10975     l_mapped_obj_type        EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'A';
10976     --R12C
10977     l_visibility_count          NUMBER;
10978 
10979 
10980   BEGIN
10981 
10982     -- Standard start of API savepoint
10983     IF FND_API.To_Boolean(p_commit) THEN
10984       SAVEPOINT Delete_Action_PUB;
10985     END IF;
10986 
10987     -- Check for call compatibility
10988     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10989                                         l_api_name, G_PKG_NAME)
10990     THEN
10991       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10992     END IF;
10993     -- Initialize message list even though we don't currently use it
10994     IF FND_API.To_Boolean(p_init_msg_list) THEN
10995       FND_MSG_PUB.Initialize;
10996     END IF;
10997 
10998     -- We get the Function ID before deleting the row so we can
10999     -- delete Mappings for the Function if necessary.
11000 
11001     SELECT FUNCTION_ID
11002       INTO l_function_id
11003       FROM EGO_ACTIONS_B
11004      WHERE ACTION_ID = p_action_id;
11005 
11006     DELETE FROM EGO_ACTIONS_B
11007     WHERE
11008     ACTION_ID = p_action_id;
11009 
11010     DELETE FROM EGO_ACTIONS_TL
11011     WHERE
11012     ACTION_ID = p_action_id;
11013 
11014     SELECT COUNT(*)
11015      INTO l_mapping_count
11016      FROM EGO_MAPPINGS_B
11017     WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
11018       AND FUNCTION_ID = l_function_id
11019       AND MAPPED_OBJ_TYPE = l_mapped_obj_type;
11020 
11021     IF (l_mapping_count > 0) THEN
11022       EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_function_id, l_mapped_obj_type,
11023                                           p_action_id, null, null, x_return_status,
11024                                           x_errorcode, x_msg_count, x_msg_data);
11025     END IF;
11026 
11027     --R12C Deleting the datalevel visibility from the EGO_ACTIONS_DL table.
11028         SELECT COUNT(*)
11029         INTO l_visibility_count
11030         FROM EGO_ACTIONS_DL
11031         WHERE ACTION_ID = p_action_id;
11032 code_debug ('ENTERED THE FUCNTION Delete_Action  l_visibility_count'||l_visibility_count);
11033 
11034     IF (l_visibility_count > 0) THEN
11035       Delete_Action_Data_Level(p_api_version,p_action_id,null, null, x_return_status,x_errorcode, x_msg_count, x_msg_data);
11036     END IF;
11037 
11038     -- Standard check of p_commit
11039     IF FND_API.To_Boolean(p_commit) THEN
11040       COMMIT WORK;
11041     END IF;
11042 
11043     x_return_status := FND_API.G_RET_STS_SUCCESS;
11044 
11045   EXCEPTION
11046     WHEN OTHERS THEN
11047       IF FND_API.To_Boolean(p_commit) THEN
11048         ROLLBACK TO Delete_Action_PUB;
11049       END IF;
11050       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11051 
11052       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11053       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11054       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11055       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11056       FND_MSG_PUB.Add;
11057       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11058                                ,p_count   => x_msg_count
11059                                ,p_data    => x_msg_data);
11060 
11061 
11062 END Delete_Action;
11063 
11064 ----------------------------------------------------------------------
11065 --R12C
11066 -- call this API to create an Visibilty information that is executed by a user action
11067 PROCEDURE Create_Action_Data_Level (
11068         p_api_version                   IN   NUMBER
11069        ,p_action_id                     IN   NUMBER
11070        ,p_data_level_id                  IN   NUMBER
11071        ,p_visibility_flag               IN   VARCHAR2 DEFAULT 'Y'
11072        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11073        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11074        ,x_return_status                 OUT NOCOPY VARCHAR2
11075        ,x_errorcode                     OUT NOCOPY NUMBER
11076        ,x_msg_count                     OUT NOCOPY NUMBER
11077        ,x_msg_data                      OUT NOCOPY VARCHAR2
11078 ) IS
11079 
11080     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Visibilty_DL';
11081 
11082     --we don't use l_api_version yet, but eventually we might:
11083     --if we change required parameters, version goes FROM n.x to (n+1).x
11084     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11085     l_api_version            CONSTANT NUMBER := 1.0;
11086 
11087     l_Sysdate                DATE := Sysdate;
11088 
11089   BEGIN
11090 
11091     -- Standard start of API savepoint
11095 
11092     IF FND_API.To_Boolean(p_commit) THEN
11093       SAVEPOINT Create_Visibilty_DL_PUB;
11094     END IF;
11096     -- Check for call compatibility
11097     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11098                                         l_api_name, G_PKG_NAME)
11099     THEN
11100       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11101     END IF;
11102     -- Initialize message list even though we don't currently use it
11103     IF FND_API.To_Boolean(p_init_msg_list) THEN
11104       FND_MSG_PUB.Initialize;
11105     END IF;
11106 
11107     INSERT INTO EGO_ACTIONS_DL
11108     (
11109         ACTION_ID
11110        ,DATA_LEVEL_ID
11111        ,VISIBILITY_FLAG
11112        ,LAST_UPDATE_DATE
11113        ,LAST_UPDATED_BY
11114        ,CREATION_DATE
11115        ,CREATED_BY
11116        ,LAST_UPDATE_LOGIN
11117     )
11118     VALUES
11119     (
11120        p_action_id
11121       ,p_data_level_id
11122       ,p_visibility_flag
11123       ,l_Sysdate
11124       ,g_current_user_id
11125       ,l_Sysdate
11126       ,g_current_user_id
11127       ,g_current_login_id
11128     );
11129 
11130     -- Standard check of p_commit
11131     IF FND_API.To_Boolean(p_commit) THEN
11132       COMMIT WORK;
11133     END IF;
11134 
11135     x_return_status := FND_API.G_RET_STS_SUCCESS;
11136 
11137   EXCEPTION
11138     WHEN OTHERS THEN
11139       IF FND_API.To_Boolean(p_commit) THEN
11140         ROLLBACK TO Create_Visibilty_DL_PUB;
11141       END IF;
11142       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11143 
11144       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11145       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11146       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11147       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11148       FND_MSG_PUB.Add;
11149       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11150                                ,p_count   => x_msg_count
11151                                ,p_data    => x_msg_data);
11152 END Create_Action_Data_Level;
11153 
11154 
11155 
11156 -- call this API to create an action that is executed by a user action
11157 PROCEDURE Create_Action_Display (
11158         p_api_version                   IN   NUMBER
11159        ,p_action_id                     IN   NUMBER
11160        ,p_display_style                 IN   VARCHAR2
11161        ,p_prompt_application_id         IN   NUMBER
11162        ,p_prompt_message_name           IN   VARCHAR2
11163        ,p_visibility_flag               IN   VARCHAR2
11164        ,p_prompt_function_id            IN   NUMBER
11165        ,p_visibility_func_id            IN   NUMBER
11166        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11167        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11168        ,x_return_status                 OUT NOCOPY VARCHAR2
11169        ,x_errorcode                     OUT NOCOPY NUMBER
11170        ,x_msg_count                     OUT NOCOPY NUMBER
11171        ,x_msg_data                      OUT NOCOPY VARCHAR2
11172 ) IS
11173 
11174     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action_Display';
11175 
11176     --we don't use l_api_version yet, but eventually we might:
11177     --if we change required parameters, version goes FROM n.x to (n+1).x
11178     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11179     l_api_version            CONSTANT NUMBER := 1.0;
11180 
11181     l_Sysdate                DATE := Sysdate;
11182 
11183   BEGIN
11184 
11185     -- Standard start of API savepoint
11186     IF FND_API.To_Boolean(p_commit) THEN
11187       SAVEPOINT Create_Action_Display_PUB;
11188     END IF;
11189 
11190     -- Check for call compatibility
11191     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11192                                         l_api_name, G_PKG_NAME)
11193     THEN
11194       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11195     END IF;
11196     -- Initialize message list even though we don't currently use it
11197     IF FND_API.To_Boolean(p_init_msg_list) THEN
11198       FND_MSG_PUB.Initialize;
11199     END IF;
11200 
11201     INSERT INTO EGO_ACTION_DISPLAYS_B
11202     (
11203         ACTION_ID
11204        ,EXECUTION_METHOD
11205        ,DISPLAY_STYLE
11206        ,PROMPT_APPLICATION_ID
11207        ,PROMPT_MESSAGE_NAME
11208        ,VISIBILITY_FLAG
11209        ,PROMPT_FUNCTION_ID
11210        ,VISIBILITY_FUNC_ID
11211        ,LAST_UPDATE_DATE
11212        ,LAST_UPDATED_BY
11213        ,CREATION_DATE
11214        ,CREATED_BY
11215        ,LAST_UPDATE_LOGIN
11216     )
11217     VALUES
11218     (
11219        p_action_id
11220       ,'U'
11221       ,p_display_style
11222       ,p_prompt_application_id
11223       ,p_prompt_message_name
11224       ,p_visibility_flag
11225       ,p_prompt_function_id
11226       ,p_visibility_func_id
11227       ,l_Sysdate
11228       ,g_current_user_id
11229       ,l_Sysdate
11230       ,g_current_user_id
11231       ,g_current_login_id
11232     );
11233 
11234     -- Standard check of p_commit
11235     IF FND_API.To_Boolean(p_commit) THEN
11236       COMMIT WORK;
11237     END IF;
11238 
11239     x_return_status := FND_API.G_RET_STS_SUCCESS;
11243       IF FND_API.To_Boolean(p_commit) THEN
11240 
11241   EXCEPTION
11242     WHEN OTHERS THEN
11244         ROLLBACK TO Create_Action_Display_PUB;
11245       END IF;
11246       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11247 
11248       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11249       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11250       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11251       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11252       FND_MSG_PUB.Add;
11253       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11254                                ,p_count   => x_msg_count
11255                                ,p_data    => x_msg_data);
11256 
11257 
11258 END Create_Action_Display;
11259 
11260 ----------------------------------------------------------------------
11261 
11262 -- call this API to create an action that is executed by a trigger
11263 PROCEDURE Create_Action_Display (
11264         p_api_version                   IN   NUMBER
11265        ,p_action_id                     IN   NUMBER
11266        ,p_trigger_code                  IN   VARCHAR2
11267        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11268        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11269        ,x_return_status                 OUT NOCOPY VARCHAR2
11270        ,x_errorcode                     OUT NOCOPY NUMBER
11271        ,x_msg_count                     OUT NOCOPY NUMBER
11272        ,x_msg_data                      OUT NOCOPY VARCHAR2
11273 ) IS
11274 
11275     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action_Display';
11276 
11277     --we don't use l_api_version yet, but eventually we might:
11278     --if we change required parameters, version goes FROM n.x to (n+1).x
11279     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11280     l_api_version            CONSTANT NUMBER := 1.0;
11281 
11282     l_Sysdate                DATE := Sysdate;
11283 
11284   BEGIN
11285 
11286     -- Standard start of API savepoint
11287     IF FND_API.To_Boolean(p_commit) THEN
11288       SAVEPOINT Create_Action_Display_PUB;
11289     END IF;
11290 
11291     -- Check for call compatibility
11292     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11293                                         l_api_name, G_PKG_NAME)
11294     THEN
11295       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11296     END IF;
11297     -- Initialize message list even though we don't currently use it
11298     IF FND_API.To_Boolean(p_init_msg_list) THEN
11299       FND_MSG_PUB.Initialize;
11300     END IF;
11301 
11302     INSERT INTO EGO_ACTION_DISPLAYS_B
11303     (
11304         ACTION_ID
11305        ,EXECUTION_METHOD
11306        ,EXECUTION_TRIGGER
11307        ,LAST_UPDATE_DATE
11308        ,LAST_UPDATED_BY
11309        ,CREATION_DATE
11310        ,CREATED_BY
11311        ,LAST_UPDATE_LOGIN
11312     )
11313     VALUES
11314     (
11315        p_action_id
11316       ,'T'
11317       ,p_trigger_code
11318       ,l_Sysdate
11319       ,g_current_user_id
11320       ,l_Sysdate
11321       ,g_current_user_id
11322       ,g_current_login_id
11323     );
11324 
11325     -- Standard check of p_commit
11326     IF FND_API.To_Boolean(p_commit) THEN
11327       COMMIT WORK;
11328     END IF;
11329 
11330     x_return_status := FND_API.G_RET_STS_SUCCESS;
11331 
11332   EXCEPTION
11333     WHEN OTHERS THEN
11334       IF FND_API.To_Boolean(p_commit) THEN
11335         ROLLBACK TO Create_Action_Display_PUB;
11336       END IF;
11337       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11338 
11339       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11340       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11341       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11342       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11343       FND_MSG_PUB.Add;
11344       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11345                                ,p_count   => x_msg_count
11346                                ,p_data    => x_msg_data);
11347 
11348 
11349 END  Create_Action_Display;
11350 
11351 ----------------------------------------------------------------------
11352 
11353 -- call this API to update an action that is executed by a user action
11354 PROCEDURE Update_Action_Display (
11355         p_api_version                   IN   NUMBER
11356        ,p_action_id                     IN   NUMBER
11357        ,p_display_style                 IN   VARCHAR2
11358        ,p_prompt_application_id         IN   NUMBER
11359        ,p_prompt_message_name           IN   VARCHAR2
11360        ,p_visibility_flag               IN   VARCHAR2
11361        ,p_prompt_function_id            IN   NUMBER
11362        ,p_visibility_func_id            IN   NUMBER
11363        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11364        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11365        ,x_return_status                 OUT NOCOPY VARCHAR2
11366        ,x_errorcode                     OUT NOCOPY NUMBER
11367        ,x_msg_count                     OUT NOCOPY NUMBER
11368        ,x_msg_data                      OUT NOCOPY VARCHAR2
11369 ) IS
11370 
11371     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Action_Display';
11372 
11373     --we don't use l_api_version yet, but eventually we might:
11377 
11374     --if we change required parameters, version goes FROM n.x to (n+1).x
11375     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11376     l_api_version            CONSTANT NUMBER := 1.0;
11378     l_Sysdate                DATE := Sysdate;
11379     l_disp_check_count       NUMBER;
11380     l_old_prompt_func_id     NUMBER;
11381     l_old_vis_func_id        NUMBER;
11382     l_mapping_count          NUMBER;
11383     l_prompt_obj_type        EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'P';
11384     l_vis_obj_type           EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'V';
11385 
11386   BEGIN
11387 
11388     -- Standard start of API savepoint
11389     IF FND_API.To_Boolean(p_commit) THEN
11390       SAVEPOINT Update_Action_Display_PUB;
11391     END IF;
11392 
11393     -- Check for call compatibility
11394     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11395                                         l_api_name, G_PKG_NAME)
11396     THEN
11397       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11398     END IF;
11399     -- Initialize message list even though we don't currently use it
11400     IF FND_API.To_Boolean(p_init_msg_list) THEN
11401       FND_MSG_PUB.Initialize;
11402     END IF;
11403 
11404     -- Just in case caller is updating an Action that doesn't yet have a Display...
11405 
11406     SELECT COUNT(*)
11407       INTO l_disp_check_count
11408       FROM EGO_ACTION_DISPLAYS_B
11409      WHERE ACTION_ID = p_action_id;
11410 
11411     IF (l_disp_check_count = 0)
11412     THEN
11413     EGO_EXT_FWK_PUB.Create_Action_Display (
11414         p_api_version           => '1.0'
11415        ,p_action_id             => p_action_id
11416        ,p_display_style         => p_display_style
11417        ,p_prompt_application_id => p_prompt_application_id
11418        ,p_prompt_message_name   => p_prompt_message_name
11419        ,p_visibility_flag       => p_visibility_flag
11420        ,p_prompt_function_id    => p_prompt_function_id
11421        ,p_visibility_func_id    => p_visibility_func_id
11422        ,p_init_msg_list         => p_init_msg_list
11423        ,p_commit                => p_commit
11424        ,x_return_status         => x_return_status
11425        ,x_errorcode             => x_errorcode
11426        ,x_msg_count             => x_msg_count
11427        ,x_msg_data              => x_msg_data
11428     );
11429     ELSE
11430 
11431       -- If the function_id's are different, we delete Mappings.
11432 
11433       SELECT PROMPT_FUNCTION_ID
11434         INTO l_old_prompt_func_id
11435         FROM EGO_ACTION_DISPLAYS_B
11436        WHERE ACTION_ID = p_action_id;
11437 
11438       IF ((l_old_prompt_func_id IS NOT NULL)
11439       AND (l_old_prompt_func_id <> p_prompt_function_id)) THEN
11440         SELECT COUNT(*)
11441           INTO l_mapping_count
11442           FROM EGO_MAPPINGS_B
11443          WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
11444            AND FUNCTION_ID = l_old_prompt_func_id
11445            AND MAPPED_OBJ_TYPE = l_prompt_obj_type;
11446 
11447         IF (l_mapping_count > 0)
11448         THEN
11449           EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_old_prompt_func_id,
11450                                               l_prompt_obj_type, p_action_id, null,
11451                                               null, x_return_status, x_errorcode,
11452                                               x_msg_count, x_msg_data);
11453         END IF;
11454       END IF;
11455 
11456       SELECT VISIBILITY_FUNC_ID
11457       INTO l_old_vis_func_id
11458       FROM EGO_ACTION_DISPLAYS_B
11459       WHERE ACTION_ID = p_action_id;
11460 
11461       IF l_old_vis_func_id is not null AND l_old_vis_func_id <> p_visibility_func_id
11462       THEN
11463         SELECT COUNT(*)
11464         INTO l_mapping_count
11465         FROM EGO_MAPPINGS_B
11466         WHERE MAPPED_OBJ_PK1_VAL = to_char(p_action_id)
11467           AND FUNCTION_ID = l_old_vis_func_id
11468           AND MAPPED_OBJ_TYPE = l_vis_obj_type;
11469 
11470         IF (l_mapping_count > 0)
11471         THEN
11472           EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_old_vis_func_id,
11473                          l_vis_obj_type, p_action_id, null,
11474                          null, x_return_status, x_errorcode,
11475                          x_msg_count, x_msg_data);
11476         END IF;
11477       END IF;
11478 
11479       UPDATE EGO_ACTION_DISPLAYS_B
11480       SET
11481          EXECUTION_METHOD      = 'U'
11482         ,DISPLAY_STYLE         = p_display_style
11483         ,PROMPT_APPLICATION_ID = p_prompt_application_id
11484         ,PROMPT_MESSAGE_NAME   = p_prompt_message_name
11485         ,VISIBILITY_FLAG       = p_visibility_flag
11486         ,PROMPT_FUNCTION_ID    = p_prompt_function_id
11487         ,VISIBILITY_FUNC_ID    = p_visibility_func_id
11488         ,LAST_UPDATE_DATE      = l_Sysdate
11489         ,LAST_UPDATED_BY       = g_current_user_id
11490         ,LAST_UPDATE_LOGIN     = g_current_login_id
11491         ,EXECUTION_TRIGGER     = null
11492       WHERE
11493       ACTION_ID = p_action_id;
11494     END IF;
11495 
11496     -- Standard check of p_commit
11497     IF FND_API.To_Boolean(p_commit) THEN
11498       COMMIT WORK;
11499     END IF;
11500 
11501     x_return_status := FND_API.G_RET_STS_SUCCESS;
11502 
11503   EXCEPTION
11504     WHEN OTHERS THEN
11508       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11505       IF FND_API.To_Boolean(p_commit) THEN
11506         ROLLBACK TO Update_Action_Display_PUB;
11507       END IF;
11509 
11510       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11511       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11512       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11513       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11514       FND_MSG_PUB.Add;
11515       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11516                                ,p_count   => x_msg_count
11517                                ,p_data    => x_msg_data);
11518 
11519 
11520 END Update_Action_Display;
11521 
11522 ----------------------------------------------------------------------
11523 
11524 -- call this API to update an action that is executed by a trigger
11525 PROCEDURE Update_Action_Display (
11526         p_api_version                   IN   NUMBER
11527        ,p_action_id                     IN   NUMBER
11528        ,p_trigger_code                  IN   VARCHAR2
11529        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11530        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11531        ,x_return_status                 OUT NOCOPY VARCHAR2
11532        ,x_errorcode                     OUT NOCOPY NUMBER
11533        ,x_msg_count                     OUT NOCOPY NUMBER
11534        ,x_msg_data                      OUT NOCOPY VARCHAR2
11535 ) IS
11536 
11537     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Action_Display';
11538 
11539     --we don't use l_api_version yet, but eventually we might:
11540     --if we change required parameters, version goes FROM n.x to (n+1).x
11541     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11542     l_api_version            CONSTANT NUMBER := 1.0;
11543 
11544     l_Sysdate                DATE := Sysdate;
11545     l_disp_check_count       NUMBER;
11546     l_old_prompt_func_id     NUMBER;
11547     l_old_vis_func_id        NUMBER;
11548     l_mapping_count          NUMBER;
11549     l_prompt_obj_type        EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'P';
11550     l_vis_obj_type           EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'V';
11551 
11552   BEGIN
11553 
11554     -- Standard start of API savepoint
11555     IF FND_API.To_Boolean(p_commit) THEN
11556       SAVEPOINT Update_Action_Display_PUB;
11557     END IF;
11558 
11559     -- Check for call compatibility
11560     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11561                                         l_api_name, G_PKG_NAME)
11562     THEN
11563       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11564     END IF;
11565     -- Initialize message list even though we don't currently use it
11566     IF FND_API.To_Boolean(p_init_msg_list) THEN
11567       FND_MSG_PUB.Initialize;
11568     END IF;
11569 
11570     SELECT COUNT(*)
11571       INTO l_disp_check_count
11572       FROM EGO_ACTION_DISPLAYS_B
11573      WHERE ACTION_ID = p_action_id;
11574 
11575     IF (l_disp_check_count = 0) THEN
11576       EGO_EXT_FWK_PUB.Create_Action_Display
11577       (
11578         p_api_version           =>  '1.0'
11579        ,p_action_id             =>  p_action_id
11580        ,p_trigger_code          => p_trigger_code
11581        ,p_init_msg_list         =>  p_init_msg_list
11582        ,p_commit                =>  p_commit
11583        ,x_return_status         => x_return_status
11584        ,x_errorcode             =>  x_errorcode
11585        ,x_msg_count             =>  x_msg_count
11586        ,x_msg_data              =>  x_msg_data
11587       );
11588 
11589     ELSE
11590 
11591       -- If the Action execution is changed from a user Action to trigger
11592       -- then we need to delete Mappings for prompt, visibility function IDs.
11593 
11594       SELECT PROMPT_FUNCTION_ID
11595         INTO l_old_prompt_func_id
11596         FROM EGO_ACTION_DISPLAYS_B
11597        WHERE ACTION_ID = p_action_id;
11598 
11599       IF l_old_prompt_func_id IS NOT NULL THEN
11600         SELECT COUNT(*)
11601         INTO l_mapping_count
11602         FROM EGO_MAPPINGS_B
11603        WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
11604          AND FUNCTION_ID = l_old_prompt_func_id
11605          AND MAPPED_OBJ_TYPE = l_prompt_obj_type;
11606 
11607         IF (l_mapping_count > 0) THEN
11608          EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_old_prompt_func_id,
11609                                              l_prompt_obj_type, p_action_id, null,
11610                                              null, x_return_status, x_errorcode,
11611                                              x_msg_count, x_msg_data);
11612         END IF;
11613       END IF;
11614 
11615       SELECT VISIBILITY_FUNC_ID
11616       INTO l_old_vis_func_id
11617       FROM EGO_ACTION_DISPLAYS_B
11618       WHERE ACTION_ID = p_action_id;
11619 
11620       IF l_old_vis_func_id IS NOT NULL THEN
11621         SELECT COUNT(*)
11622           INTO l_mapping_count
11623           FROM EGO_MAPPINGS_B
11624          WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
11625            AND FUNCTION_ID = l_old_vis_func_id
11626            AND MAPPED_OBJ_TYPE = l_vis_obj_type;
11627 
11628         IF (l_mapping_count > 0) THEN
11629           EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_old_vis_func_id,
11633         END IF;
11630                                               l_vis_obj_type, p_action_id, null,
11631                                               null, x_return_status, x_errorcode,
11632                                               x_msg_count, x_msg_data);
11634       END IF;
11635 
11636       UPDATE EGO_ACTION_DISPLAYS_B
11637       SET
11638          EXECUTION_METHOD      = 'T'
11639         ,EXECUTION_TRIGGER     = p_trigger_code
11640         ,DISPLAY_STYLE         = NULL
11641         ,PROMPT_APPLICATION_ID = NULL
11642         ,PROMPT_MESSAGE_NAME   = NULL
11643         ,VISIBILITY_FLAG       = NULL
11644         ,PROMPT_FUNCTION_ID    = NULL
11645         ,VISIBILITY_FUNC_ID    = NULL
11646         ,LAST_UPDATE_DATE      = l_Sysdate
11647         ,LAST_UPDATED_BY       = g_current_user_id
11648         ,LAST_UPDATE_LOGIN     = g_current_login_id
11649       WHERE
11650       ACTION_ID = p_action_id;
11651 
11652     END IF;
11653 
11654 -----------------------------------
11655 
11656     -- Standard check of p_commit
11657     IF FND_API.To_Boolean(p_commit) THEN
11658       COMMIT WORK;
11659     END IF;
11660 
11661     x_return_status := FND_API.G_RET_STS_SUCCESS;
11662 
11663   EXCEPTION
11664     WHEN OTHERS THEN
11665       IF FND_API.To_Boolean(p_commit) THEN
11666         ROLLBACK TO Update_Action_Display_PUB;
11667       END IF;
11668       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11669 
11670       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11671       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11672       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11673       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11674       FND_MSG_PUB.Add;
11675       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11676                                ,p_count   => x_msg_count
11677                                ,p_data    => x_msg_data);
11678 
11679 
11680 END Update_Action_Display;
11681 
11682 ----------------------------------------------------------------------
11683 
11684 PROCEDURE Delete_Action_Display (
11685         p_api_version                   IN   NUMBER
11686        ,p_action_id                     IN   NUMBER
11687        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11688        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11689        ,x_return_status                 OUT NOCOPY VARCHAR2
11690        ,x_errorcode                     OUT NOCOPY NUMBER
11691        ,x_msg_count                     OUT NOCOPY NUMBER
11692        ,x_msg_data                      OUT NOCOPY VARCHAR2
11693 ) IS
11694 
11695     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Action';
11696 
11697     --we don't use l_api_version yet, but eventually we might:
11698     --if we change required parameters, version goes FROM n.x to (n+1).x
11699     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11700     l_api_version            CONSTANT NUMBER := 1.0;
11701 
11702     l_mapping_count          NUMBER;
11703     l_prompt_func_id         NUMBER;
11704     l_vis_func_id            NUMBER;
11705     l_prompt_obj_type        EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'P';
11706     l_vis_obj_type           EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'V';
11707 
11708   BEGIN
11709 
11710     -- Standard start of API savepoint
11711     IF FND_API.To_Boolean(p_commit) THEN
11712       SAVEPOINT Delete_Action_Display_PUB;
11713     END IF;
11714 
11715     -- Check for call compatibility
11716     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11717                                         l_api_name, G_PKG_NAME)
11718     THEN
11719       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11720     END IF;
11721     -- Initialize message list even though we don't currently use it
11722     IF FND_API.To_Boolean(p_init_msg_list) THEN
11723       FND_MSG_PUB.Initialize;
11724     END IF;
11725 
11726     -- We get the prompt and vis function IDs before we delete the row
11727     -- so we can also delete their function mappings, if necessary
11728 
11729     SELECT PROMPT_FUNCTION_ID
11730       INTO l_prompt_func_id
11731       FROM EGO_ACTION_DISPLAYS_B
11732      WHERE ACTION_ID = p_action_id;
11733 
11734     SELECT VISIBILITY_FUNC_ID
11735       INTO l_vis_func_id
11736       FROM EGO_ACTION_DISPLAYS_B
11737      WHERE ACTION_ID = p_action_id;
11738 
11739     -- Then we delete the row
11740 
11741     DELETE FROM EGO_ACTION_DISPLAYS_B
11742     WHERE ACTION_ID = p_action_id;
11743 
11744     -- Then we delete the mappings for the prompt and visibility
11745     -- functions for this action, if there are any
11746 
11747     SELECT COUNT(*)
11748       INTO l_mapping_count
11749       FROM EGO_MAPPINGS_B
11750      WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
11751        AND FUNCTION_ID = l_prompt_func_id
11752        AND MAPPED_OBJ_TYPE = l_prompt_obj_type;
11753 
11754     IF (l_mapping_count > 0) THEN
11755       EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_prompt_func_id,
11756                                           l_prompt_obj_type, p_action_id, null,
11757                                           null, x_return_status, x_errorcode,
11758                                           x_msg_count, x_msg_data);
11759     END IF;
11760 
11761     SELECT COUNT(*)
11762       INTO l_mapping_count
11763       FROM EGO_MAPPINGS_B
11767 
11764      WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
11765        AND FUNCTION_ID = l_vis_func_id
11766        AND MAPPED_OBJ_TYPE = l_vis_obj_type;
11768     IF (l_mapping_count > 0) THEN
11769       EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_vis_func_id,
11770                                           l_vis_obj_type, p_action_id, null,
11771                                           null, x_return_status, x_errorcode,
11772                                           x_msg_count, x_msg_data);
11773     END IF;
11774 
11775     -- Standard check of p_commit
11776     IF FND_API.To_Boolean(p_commit) THEN
11777       COMMIT WORK;
11778     END IF;
11779 
11780     x_return_status := FND_API.G_RET_STS_SUCCESS;
11781 
11782   EXCEPTION
11783     WHEN OTHERS THEN
11784       IF FND_API.To_Boolean(p_commit) THEN
11785         ROLLBACK TO Delete_Action_Display_PUB;
11786       END IF;
11787       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11788 
11789       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11790       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11791       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11792       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11793       FND_MSG_PUB.Add;
11794       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11795                                ,p_count   => x_msg_count
11796                                ,p_data    => x_msg_data);
11797 
11798 
11799 END Delete_Action_Display;
11800 
11801 ----------------------------------------------------------------------
11802 
11803                   -----------------------------
11804                   -- Function Parameter APIs --
11805                   -----------------------------
11806 
11807 ----------------------------------------------------------------------
11808 
11809 PROCEDURE Create_Function_Param (
11810         p_api_version                   IN   NUMBER
11811        ,p_function_id                   IN   NUMBER
11812        ,p_sequence                      IN   NUMBER
11813        ,p_internal_name                 IN   VARCHAR2
11814        ,p_data_type                     IN   VARCHAR2
11815        ,p_param_type                    IN   VARCHAR2
11816        ,p_display_name                  IN   VARCHAR2
11817        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11818        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11819        ,x_function_param_id             OUT NOCOPY NUMBER
11820        ,x_return_status                 OUT NOCOPY VARCHAR2
11821        ,x_errorcode                     OUT NOCOPY NUMBER
11822        ,x_msg_count                     OUT NOCOPY NUMBER
11823        ,x_msg_data                      OUT NOCOPY VARCHAR2
11824 ) IS
11825 
11826      l_api_name              CONSTANT VARCHAR2(30) := 'Create_Function_Param';
11827 
11828     --we don't use l_api_version yet, but eventually we might:
11829     --if we change required parameters, version goes FROM n.x to (n+1).x
11830     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11831     l_api_version            CONSTANT NUMBER := 1.0;
11832 
11833     l_Sysdate                DATE := Sysdate;
11834 
11838     IF FND_API.To_Boolean(p_commit) THEN
11835   BEGIN
11836 
11837     -- Standard start of API savepoint
11839       SAVEPOINT Create_Function_Param_PUB;
11840     END IF;
11841 
11842     -- Check for call compatibility
11843     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11844                                         l_api_name, G_PKG_NAME)
11845     THEN
11846       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11847     END IF;
11848     -- Initialize message list even though we don't currently use it
11849     IF FND_API.To_Boolean(p_init_msg_list) THEN
11850       FND_MSG_PUB.Initialize;
11851     END IF;
11852 
11853     SELECT EGO_FUNC_PARAMS_S.NEXTVAL INTO x_function_param_id FROM DUAL;
11854 
11855     INSERT INTO EGO_FUNC_PARAMS_B
11856     (
11857         FUNC_PARAM_ID
11858        ,FUNCTION_ID
11859        ,SEQUENCE
11860        ,INTERNAL_NAME
11861        ,DATA_TYPE
11862        ,PARAM_TYPE
11863        ,LAST_UPDATE_DATE
11864        ,LAST_UPDATED_BY
11865        ,CREATION_DATE
11866        ,CREATED_BY
11867        ,LAST_UPDATE_LOGIN
11868     )
11869     VALUES
11870     (
11871         x_function_param_id
11872        ,p_function_id
11873        ,p_sequence
11874        ,p_internal_name
11875        ,p_data_type
11876        ,p_param_type
11877        ,l_Sysdate
11878        ,g_current_user_id
11879        ,l_Sysdate
11880        ,g_current_user_id
11881        ,g_current_login_id
11882     );
11883 
11884     INSERT INTO EGO_FUNC_PARAMS_TL
11885     (
11886         FUNC_PARAM_ID
11887        ,DISPLAY_NAME
11888        ,LANGUAGE
11889        ,SOURCE_LANG
11890        ,LAST_UPDATE_DATE
11891        ,LAST_UPDATED_BY
11892        ,CREATION_DATE
11893        ,CREATED_BY
11894        ,LAST_UPDATE_LOGIN
11895     )
11896     SELECT
11897         x_function_param_id
11898        ,p_display_name
11899        ,L.LANGUAGE_CODE
11900        ,USERENV('LANG')
11901        ,l_Sysdate
11902        ,g_current_user_id
11903        ,l_Sysdate
11904        ,g_current_user_id
11905        ,g_current_login_id
11906     FROM FND_LANGUAGES L
11907     WHERE L.INSTALLED_FLAG in ('I', 'B');
11908 
11909     -- Standard check of p_commit
11910     IF FND_API.To_Boolean(p_commit) THEN
11911       COMMIT WORK;
11912     END IF;
11913 
11914     x_return_status := FND_API.G_RET_STS_SUCCESS;
11915 
11916   EXCEPTION
11917     WHEN OTHERS THEN
11918       IF FND_API.To_Boolean(p_commit) THEN
11919         ROLLBACK TO Create_Function_Param_PUB;
11920       END IF;
11921       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11922 
11923       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11924       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11925       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11926       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11927       FND_MSG_PUB.Add;
11928       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11929                                ,p_count   => x_msg_count
11930                                ,p_data    => x_msg_data);
11931 
11932 
11933 END Create_Function_Param;
11934 
11935 ----------------------------------------------------------------------
11936 
11937 PROCEDURE Update_Function_Param (
11938         p_api_version                   IN   NUMBER
11939        ,p_function_param_id             IN   NUMBER
11940        ,p_sequence                      IN   NUMBER
11941        ,p_internal_name                 IN   VARCHAR2
11942        ,p_display_name                  IN   VARCHAR2
11943        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11944        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11945        ,x_return_status                 OUT NOCOPY VARCHAR2
11946        ,x_errorcode                     OUT NOCOPY NUMBER
11947        ,x_msg_count                     OUT NOCOPY NUMBER
11948        ,x_msg_data                      OUT NOCOPY VARCHAR2
11949 ) IS
11950 
11951     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Function_Param';
11952 
11953     --we don't use l_api_version yet, but eventually we might:
11954     --if we change required parameters, version goes FROM n.x to (n+1).x
11955     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11956     l_api_version            CONSTANT NUMBER := 1.0;
11957 
11958     l_Sysdate                DATE := Sysdate;
11959 
11960   BEGIN
11961 
11965     END IF;
11962     -- Standard start of API savepoint
11963     IF FND_API.To_Boolean(p_commit) THEN
11964       SAVEPOINT Update_Function_Param_PUB;
11966 
11967     -- Check for call compatibility
11968     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11969                                         l_api_name, G_PKG_NAME)
11970     THEN
11971       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11972     END IF;
11973     -- Initialize message list even though we don't currently use it
11974     IF FND_API.To_Boolean(p_init_msg_list) THEN
11975       FND_MSG_PUB.Initialize;
11976     END IF;
11977 
11978     UPDATE EGO_FUNC_PARAMS_B
11979     SET
11980       SEQUENCE          = p_sequence
11981      ,INTERNAL_NAME     = p_internal_name
11982      ,LAST_UPDATE_DATE  = l_Sysdate
11983      ,LAST_UPDATED_BY   = g_current_user_id
11984      ,LAST_UPDATE_LOGIN = g_current_login_id
11985     WHERE
11986     FUNC_PARAM_ID = p_function_param_id;
11987 
11988     UPDATE EGO_FUNC_PARAMS_TL
11989     SET
11990       DISPLAY_NAME      = p_display_name
11991      ,LAST_UPDATE_DATE  = l_Sysdate
11992      ,LAST_UPDATED_BY   = g_current_user_id
11993      ,LAST_UPDATE_LOGIN = g_current_login_id
11994      ,SOURCE_LANG = USERENV('LANG')
11995     WHERE
11996     FUNC_PARAM_ID = p_function_param_id AND
11997     --userenv('LANG') = LANGUAGE;
11998     USERENV('LANG') IN ( LANGUAGE ,SOURCE_LANG );
11999 
12000     -- Standard check of p_commit
12001     IF FND_API.To_Boolean(p_commit) THEN
12002       COMMIT WORK;
12003     END IF;
12004 
12005     x_return_status := FND_API.G_RET_STS_SUCCESS;
12006 
12007   EXCEPTION
12008     WHEN OTHERS THEN
12009       IF FND_API.To_Boolean(p_commit) THEN
12010         ROLLBACK TO Update_Function_Param_PUB;
12011       END IF;
12012       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12013 
12014       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12015       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12016       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12017       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12018       FND_MSG_PUB.Add;
12019       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12020                                ,p_count   => x_msg_count
12021                                ,p_data    => x_msg_data);
12022 
12023 
12024 END Update_Function_Param;
12025 
12026 ----------------------------------------------------------------------
12027 
12028 PROCEDURE Delete_Function_Param (
12029         p_api_version                   IN   NUMBER
12030        ,p_function_param_id             IN   NUMBER
12031        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12032        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12033        ,x_return_status                 OUT NOCOPY VARCHAR2
12034        ,x_errorcode                     OUT NOCOPY NUMBER
12035        ,x_msg_count                     OUT NOCOPY NUMBER
12036        ,x_msg_data                      OUT NOCOPY VARCHAR2
12037 ) IS
12038 
12039     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Function_Param';
12040 
12041     --we don't use l_api_version yet, but eventually we might:
12042     --if we change required parameters, version goes FROM n.x to (n+1).x
12043     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12044     l_api_version            CONSTANT NUMBER := 1.0;
12045 
12046     l_Sysdate                DATE := Sysdate;
12047 
12048   BEGIN
12049 
12050     -- Standard start of API savepoint
12051     IF FND_API.To_Boolean(p_commit) THEN
12052       SAVEPOINT Delete_Function_Param_PUB;
12053     END IF;
12054 
12055     -- Check for call compatibility
12056     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12057                                         l_api_name, G_PKG_NAME)
12058     THEN
12059       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12060     END IF;
12061     -- Initialize message list even though we don't currently use it
12062     IF FND_API.To_Boolean(p_init_msg_list) THEN
12063       FND_MSG_PUB.Initialize;
12064     END IF;
12065 
12066     DELETE FROM EGO_FUNC_PARAMS_B
12067     WHERE
12068     FUNC_PARAM_ID = p_function_param_id;
12069 
12070     DELETE FROM EGO_FUNC_PARAMS_TL
12071     WHERE
12072     FUNC_PARAM_ID = p_function_param_id;
12073 
12074     DELETE FROM EGO_MAPPINGS_B
12075     WHERE
12076     FUNC_PARAM_ID = p_function_param_id;
12077 
12078     -- Standard check of p_commit
12079     IF FND_API.To_Boolean(p_commit) THEN
12080       COMMIT WORK;
12081     END IF;
12082 
12083     x_return_status := FND_API.G_RET_STS_SUCCESS;
12084 
12085   EXCEPTION
12086     WHEN OTHERS THEN
12087       IF FND_API.To_Boolean(p_commit) THEN
12088         ROLLBACK TO Delete_Function_Param_PUB;
12089       END IF;
12090       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12091 
12092       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12093       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12094       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12095       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12096       FND_MSG_PUB.Add;
12097       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12098                                ,p_count   => x_msg_count
12099                                ,p_data    => x_msg_data);
12100 
12101 
12105 
12102 END Delete_Function_Param;
12103 
12104 ----------------------------------------------------------------------
12106                     -------------------------
12107                     -- Action Mapping APIs --
12108                     -------------------------
12109 
12110 ----------------------------------------------------------------------
12111 
12112 PROCEDURE Create_Mapping (
12113         p_api_version                   IN   NUMBER
12114        ,p_function_id                   IN   NUMBER
12115        ,p_mapped_obj_type               IN   VARCHAR2
12116        ,p_mapped_obj_pk1_value          IN   VARCHAR2
12117        ,p_func_param_id                 IN   NUMBER
12118        ,p_mapping_group_type            IN   VARCHAR2
12119        ,p_mapping_group_pk1             IN   VARCHAR2
12120        ,p_mapping_group_pk2             IN   VARCHAR2
12121        ,p_mapping_group_pk3             IN   VARCHAR2
12122        ,p_mapping_value                 IN   VARCHAR2
12123        ,p_mapped_uom_parameter          IN   VARCHAR2   :=  NULL
12124        ,p_value_uom_source              IN   VARCHAR2   :=  NULL
12125        ,p_fixed_uom                     IN   VARCHAR2   :=  NULL
12126        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12127        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12128        ,x_return_status                 OUT NOCOPY VARCHAR2
12129        ,x_errorcode                     OUT NOCOPY NUMBER
12130        ,x_msg_count                     OUT NOCOPY NUMBER
12131        ,x_msg_data                      OUT NOCOPY VARCHAR2
12132 ) IS
12133 
12134     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Mapping';
12135 
12136     --we don't use l_api_version yet, but eventually we might:
12137     --if we change required parameters, version goes FROM n.x to (n+1).x
12138     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12139     l_api_version            CONSTANT NUMBER := 1.0;
12140 
12141     l_Sysdate                DATE := Sysdate;
12142 
12143   BEGIN
12144 
12145     -- Standard start of API savepoint
12146     IF FND_API.To_Boolean(p_commit) THEN
12147       SAVEPOINT Create_Mapping_PUB;
12148     END IF;
12149 
12150     -- Check for call compatibility
12151     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12152                                         l_api_name, G_PKG_NAME)
12153     THEN
12154       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12155     END IF;
12156     -- Initialize message list even though we don't currently use it
12157     IF FND_API.To_Boolean(p_init_msg_list) THEN
12158       FND_MSG_PUB.Initialize;
12159     END IF;
12160 
12161     INSERT INTO EGO_MAPPINGS_B
12162     (
12163         FUNCTION_ID
12164        ,MAPPED_OBJ_TYPE
12165        ,MAPPED_OBJ_PK1_VAL
12166        ,FUNC_PARAM_ID
12167        ,MAPPED_TO_GROUP_TYPE
12168        ,MAPPED_TO_GROUP_PK1
12169        ,MAPPED_TO_GROUP_PK2
12170        ,MAPPED_TO_GROUP_PK3
12171        ,MAPPED_ATTRIBUTE
12172        ,MAPPED_UOM_PARAMETER
12173        ,VALUE_UOM_SOURCE
12174        ,FIXED_UOM
12175        ,LAST_UPDATE_DATE
12176        ,LAST_UPDATED_BY
12177        ,CREATION_DATE
12178        ,CREATED_BY
12179        ,LAST_UPDATE_LOGIN
12180     )
12181     VALUES
12182     (
12183         p_function_id
12184        ,p_mapped_obj_type
12185        ,p_mapped_obj_pk1_value
12186        ,p_func_param_id
12187        ,p_mapping_group_type
12188        ,p_mapping_group_pk1
12189        ,p_mapping_group_pk2
12190        ,p_mapping_group_pk3
12191        ,p_mapping_value
12192        ,p_mapped_uom_parameter
12193        ,p_value_uom_source
12194        ,p_fixed_uom
12195        ,l_Sysdate
12196        ,g_current_user_id
12197        ,l_Sysdate
12198        ,g_current_user_id
12199        ,g_current_login_id
12200     );
12201 
12202     -- Standard check of p_commit
12203     IF FND_API.To_Boolean(p_commit) THEN
12204       COMMIT WORK;
12205     END IF;
12206 
12207     x_return_status := FND_API.G_RET_STS_SUCCESS;
12208 
12209   EXCEPTION
12210     WHEN OTHERS THEN
12211       IF FND_API.To_Boolean(p_commit) THEN
12212         ROLLBACK TO Create_Mapping_PUB;
12213       END IF;
12214       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12215 
12216       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12217       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12218       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12219       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12220       FND_MSG_PUB.Add;
12221       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12222                                ,p_count   => x_msg_count
12226 END Create_Mapping;
12223                                ,p_data    => x_msg_data);
12224 
12225 
12227 
12228 ----------------------------------------------------------------------
12229 
12230 
12231 PROCEDURE Create_Mapping (
12232         p_api_version                   IN   NUMBER
12233        ,p_function_id                   IN   NUMBER
12234        ,p_mapped_obj_type               IN   VARCHAR2
12235        ,p_mapped_obj_pk1_value          IN   VARCHAR2
12236        ,p_func_param_id                 IN   NUMBER
12237        ,p_attr_group_id                 IN   NUMBER
12238        ,p_mapping_value                 IN   VARCHAR2
12239        ,p_mapped_uom_parameter          IN   VARCHAR2   :=  NULL
12240        ,p_value_uom_source              IN   VARCHAR2   :=  NULL
12241        ,p_fixed_uom                     IN   VARCHAR2   :=  NULL
12242        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12243        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12244        ,x_return_status                 OUT NOCOPY VARCHAR2
12245        ,x_errorcode                     OUT NOCOPY NUMBER
12246        ,x_msg_count                     OUT NOCOPY NUMBER
12247        ,x_msg_data                      OUT NOCOPY VARCHAR2
12248 ) IS
12249 
12250     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Mapping';
12251 
12252     l_application_id        NUMBER;
12253     l_attr_grp_type     VARCHAR2(40);
12254     l_attr_grp_name     VARCHAR2(30);
12255     l_mapping_group_type    VARCHAR2(30);
12256 
12257   BEGIN
12258 
12259     -- Standard start of API savepoint
12260     IF FND_API.TO_BOOLEAN(p_commit) THEN
12261       SAVEPOINT Create_Mapping_PUB;
12262     END IF;
12263 
12264     Get_Attr_Group_Comb_PKs(p_attr_group_id, l_application_id,l_attr_grp_type ,l_attr_grp_name  );
12265     IF l_application_id IS NULL THEN
12266       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12267     END IF;
12268     l_mapping_group_type := 'A';
12269     EGO_EXT_FWK_PUB.Create_Mapping(
12270         p_api_version                   => p_api_version
12271        ,p_function_id                   => p_function_id
12272        ,p_mapped_obj_type               => p_mapped_obj_type
12273        ,p_mapped_obj_pk1_value          => p_mapped_obj_pk1_value
12274        ,p_func_param_id                 => p_func_param_id
12275        ,p_mapping_group_type            => l_mapping_group_type
12276        ,p_mapping_group_pk1             => l_application_id
12277        ,p_mapping_group_pk2             => l_attr_grp_type
12278        ,p_mapping_group_pk3             => l_attr_grp_name
12279        ,p_mapping_value                 => p_mapping_value
12280        ,p_mapped_uom_parameter          => p_mapped_uom_parameter
12281        ,p_value_uom_source              => p_value_uom_source
12282        ,p_fixed_uom                     => p_fixed_uom
12283        ,p_init_msg_list                 => p_init_msg_list
12284        ,p_commit                        => p_commit
12285        ,x_return_status                 => x_return_status
12286        ,x_errorcode                     => x_errorcode
12287        ,x_msg_count                     => x_msg_count
12288        ,x_msg_data                      => x_msg_data
12289     );
12290 
12291     -- Standard check of p_commit
12292     IF FND_API.To_Boolean(p_commit) THEN
12293       COMMIT WORK;
12294     END IF;
12295 
12296   EXCEPTION
12297     WHEN OTHERS THEN
12298       IF FND_API.TO_BOOLEAN(p_commit) THEN
12299         ROLLBACK TO Create_Mapping_PUB;
12300       END IF;
12301       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12302 
12303       IF l_application_id IS NULL THEN
12304         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAttrGroupApplicationIDFoundForPKs';
12305       ELSE
12306         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12307         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12308         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12309         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12310         FND_MSG_PUB.Add;
12311         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12312                                  ,p_count   => x_msg_count
12313                                  ,p_data    => x_msg_data);
12314 
12315       END IF;
12316 
12317 END Create_Mapping;
12318 
12319 ----------------------------------------------------------------------
12320 
12321 PROCEDURE Update_Mapping (
12322         p_api_version                   IN   NUMBER
12323        ,p_function_id                   IN   NUMBER
12324        ,p_mapped_obj_type               IN   VARCHAR2
12325        ,p_mapped_obj_pk1_value          IN   VARCHAR2
12326        ,p_func_param_id                 IN   NUMBER
12327        ,p_mapping_group_type            IN   VARCHAR2
12328        ,p_mapping_group_pk1             IN   VARCHAR2
12329        ,p_mapping_group_pk2             IN   VARCHAR2
12330        ,p_mapping_group_pk3             IN   VARCHAR2
12331        ,p_mapping_value                 IN   VARCHAR2
12332        ,p_new_func_param_id             IN   NUMBER     :=  NULL
12333        ,p_new_mapping_group_pk1         IN   VARCHAR2   :=  NULL
12334        ,p_new_mapping_group_pk2         IN   VARCHAR2   :=  NULL
12335        ,p_new_mapping_group_pk3         IN   VARCHAR2   :=  NULL
12336        ,p_new_mapping_value             IN   VARCHAR2   :=  NULL
12340        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12337        ,p_mapped_uom_parameter          IN   VARCHAR2   :=  NULL
12338        ,p_value_uom_source              IN   VARCHAR2   :=  NULL
12339        ,p_fixed_uom                     IN   VARCHAR2   :=  NULL
12341        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12342        ,x_return_status                 OUT NOCOPY VARCHAR2
12343        ,x_errorcode                     OUT NOCOPY NUMBER
12344        ,x_msg_count                     OUT NOCOPY NUMBER
12345        ,x_msg_data                      OUT NOCOPY VARCHAR2
12346 ) IS
12347 
12348     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Mapping';
12349 
12350     --we don't use l_api_version yet, but eventually we might:
12351     --if we change required parameters, version goes FROM n.x to (n+1).x
12352     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12353     l_api_version            CONSTANT NUMBER := 1.0;
12354 
12355     l_Sysdate                DATE := Sysdate;
12356 
12357   BEGIN
12358 
12359     -- Standard start of API savepoint
12360     IF FND_API.To_Boolean(p_commit) THEN
12361       SAVEPOINT Update_Mapping_PUB;
12362     END IF;
12363 
12364     -- Check for call compatibility
12365     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12366                                         l_api_name, G_PKG_NAME)
12367     THEN
12368       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12369     END IF;
12370     -- Initialize message list even though we don't currently use it
12371     IF FND_API.To_Boolean(p_init_msg_list) THEN
12372       FND_MSG_PUB.Initialize;
12373     END IF;
12374 
12375     IF (p_new_mapping_group_pk1 IS NOT NULL AND
12376         p_new_mapping_group_pk2 IS NOT NULL AND
12377         p_new_mapping_group_pk3 IS NOT NULL AND
12378         p_new_mapping_value IS NOT NULL) THEN
12379 
12380       UPDATE EGO_MAPPINGS_B
12381       SET
12382          MAPPED_TO_GROUP_TYPE     = p_mapping_group_type
12383         ,MAPPED_TO_GROUP_PK1      = p_new_mapping_group_pk1
12384         ,MAPPED_TO_GROUP_PK2      = p_new_mapping_group_pk2
12385         ,MAPPED_TO_GROUP_PK3      = p_new_mapping_group_pk3
12386         ,MAPPED_ATTRIBUTE         = p_new_mapping_value
12387         ,MAPPED_UOM_PARAMETER     = p_mapped_uom_parameter
12388         ,VALUE_UOM_SOURCE         = p_value_uom_source
12389         ,FIXED_UOM                = p_fixed_uom
12390         ,FUNC_PARAM_ID            = NVL(p_new_func_param_id, p_func_param_id)
12391         ,LAST_UPDATE_DATE         = l_Sysdate
12392         ,LAST_UPDATED_BY          = g_current_user_id
12393         ,LAST_UPDATE_LOGIN        = g_current_login_id
12394       WHERE
12395          FUNCTION_ID = p_function_id AND
12396          MAPPED_OBJ_TYPE = p_mapped_obj_type AND
12397          MAPPED_OBJ_PK1_VAL = p_mapped_obj_pk1_value AND
12398          FUNC_PARAM_ID = p_func_param_id AND
12399          MAPPED_TO_GROUP_PK1 = p_mapping_group_pk1 AND
12400          MAPPED_TO_GROUP_PK2 = p_mapping_group_pk2 AND
12401          MAPPED_TO_GROUP_PK3 = p_mapping_group_pk3 AND
12402          MAPPED_ATTRIBUTE = p_mapping_value;
12403 
12404     ELSE
12405 
12406       UPDATE EGO_MAPPINGS_B
12407       SET
12408          MAPPED_TO_GROUP_TYPE     = p_mapping_group_type
12409         ,MAPPED_TO_GROUP_PK1      = p_mapping_group_pk1
12410         ,MAPPED_TO_GROUP_PK2      = p_mapping_group_pk2
12411         ,MAPPED_TO_GROUP_PK3      = p_mapping_group_pk3
12412         ,MAPPED_ATTRIBUTE         = p_mapping_value
12413         ,MAPPED_UOM_PARAMETER     = p_mapped_uom_parameter
12414         ,VALUE_UOM_SOURCE         = p_value_uom_source
12415         ,FIXED_UOM                = p_fixed_uom
12416         ,FUNC_PARAM_ID            = NVL(p_new_func_param_id, p_func_param_id)
12417         ,LAST_UPDATE_DATE         = l_Sysdate
12418         ,LAST_UPDATED_BY          = g_current_user_id
12419         ,LAST_UPDATE_LOGIN        = g_current_login_id
12420       WHERE
12421          FUNCTION_ID = p_function_id AND
12422          MAPPED_OBJ_TYPE = p_mapped_obj_type AND
12423          MAPPED_OBJ_PK1_VAL = p_mapped_obj_pk1_value AND
12424          FUNC_PARAM_ID = p_func_param_id;
12425 
12426     END IF;
12427 
12428     -- Standard check of p_commit
12429     IF FND_API.To_Boolean(p_commit) THEN
12430       COMMIT WORK;
12431     END IF;
12432 
12433     x_return_status := FND_API.G_RET_STS_SUCCESS;
12434 
12435   EXCEPTION
12436     WHEN OTHERS THEN
12437       IF FND_API.To_Boolean(p_commit) THEN
12438         ROLLBACK TO Update_Mapping_PUB;
12439       END IF;
12440       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12441 
12442       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12443       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12444       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12445       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12446       FND_MSG_PUB.Add;
12447       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12448                                ,p_count   => x_msg_count
12449                                ,p_data    => x_msg_data);
12450 
12451 
12452 END Update_Mapping;
12453 
12454 ----------------------------------------------------------------------
12455 
12456 
12457 
12458 PROCEDURE Update_Mapping (
12459         p_api_version                   IN   NUMBER
12460        ,p_function_id                   IN   NUMBER
12464        ,p_attr_group_id                 IN   NUMBER
12461        ,p_mapped_obj_type               IN   VARCHAR2
12462        ,p_mapped_obj_pk1_value          IN   VARCHAR2
12463        ,p_func_param_id                 IN   NUMBER
12465        ,p_mapping_value                 IN   VARCHAR2
12466        ,p_mapping_group_pk1             IN   VARCHAR2   :=  NULL
12467        ,p_mapping_group_pk2             IN   VARCHAR2   :=  NULL
12468        ,p_mapping_group_pk3             IN   VARCHAR2   :=  NULL
12469        ,p_new_func_param_id             IN   NUMBER     :=  NULL
12470        ,p_new_mapping_value             IN   VARCHAR2   :=  NULL
12471        ,p_mapped_uom_parameter          IN   VARCHAR2   :=  NULL
12472        ,p_value_uom_source              IN   VARCHAR2   :=  NULL
12473        ,p_fixed_uom                     IN   VARCHAR2   :=  NULL
12474        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12475        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12476        ,x_return_status                 OUT NOCOPY VARCHAR2
12477        ,x_errorcode                     OUT NOCOPY NUMBER
12478        ,x_msg_count                     OUT NOCOPY NUMBER
12479        ,x_msg_data                      OUT NOCOPY VARCHAR2
12480 ) IS
12481 
12482     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Mapping';
12483 
12484     l_application_id        NUMBER;
12485     l_attr_grp_type         VARCHAR2(40);
12486     l_attr_grp_name         VARCHAR2(30);
12487     l_mapping_group_type    VARCHAR2(30);
12488 
12489   BEGIN
12490 
12491     -- Standard start of API savepoint
12492     IF FND_API.TO_BOOLEAN(p_commit) THEN
12493       SAVEPOINT Update_Mapping_PUB;
12494     END IF;
12495 
12496     Get_Attr_Group_Comb_PKs(p_attr_group_id, l_application_id,l_attr_grp_type ,l_attr_grp_name);
12497     IF l_application_id IS NULL THEN
12498       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12499     END IF;
12500     l_mapping_group_type := 'A';
12501 
12502     EGO_EXT_FWK_PUB.Update_Mapping (
12503 
12504             p_api_version                   => p_api_version
12505            ,p_function_id                   => p_function_id
12506            ,p_mapped_obj_type               => p_mapped_obj_type
12507            ,p_mapped_obj_pk1_value          => p_mapped_obj_pk1_value
12508            ,p_func_param_id                 => p_func_param_id
12509            ,p_mapping_group_type            => l_mapping_group_type
12510            ,p_mapping_group_pk1             => p_mapping_group_pk1
12511            ,p_mapping_group_pk2             => p_mapping_group_pk2
12512            ,p_mapping_group_pk3             => p_mapping_group_pk3
12513            ,p_mapping_value                 => p_mapping_value
12514            ,p_new_mapping_group_pk1         => l_application_id
12515            ,p_new_mapping_group_pk2         => l_attr_grp_type
12516            ,p_new_mapping_group_pk3         => l_attr_grp_name
12517            ,p_new_mapping_value             => p_new_mapping_value
12518            ,p_new_func_param_id             => p_new_func_param_id
12519            ,p_mapped_uom_parameter          => p_mapped_uom_parameter
12520            ,p_value_uom_source              => p_value_uom_source
12521            ,p_fixed_uom                     => p_fixed_uom
12522            ,p_init_msg_list                 => p_init_msg_list
12523            ,p_commit                        => p_commit
12524            ,x_return_status                 => x_return_status
12525            ,x_errorcode                     => x_errorcode
12526            ,x_msg_count                     => x_msg_count
12527            ,x_msg_data                      => x_msg_data
12528     );
12529 
12530       -- Standard check of p_commit
12531     IF FND_API.To_Boolean(p_commit) THEN
12532       COMMIT WORK;
12533     END IF;
12534   EXCEPTION
12535     WHEN OTHERS THEN
12536       IF FND_API.TO_BOOLEAN(p_commit) THEN
12537         ROLLBACK TO Update_Mapping_PUB;
12538       END IF;
12539       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12540 
12541       IF l_application_id IS NULL THEN
12542         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAttrGroupApplicationIDFoundForPKs';
12543       ELSE
12544         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12545         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12546         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12547         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12548         FND_MSG_PUB.Add;
12549         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12550                                  ,p_count   => x_msg_count
12551                                  ,p_data    => x_msg_data);
12552 
12553       END IF;
12554 
12555 END Update_Mapping;
12556 
12557 ----------------------------------------------------------------------------
12558 
12559 -- call this API to delete all mappings for a given Action and Function
12560 PROCEDURE Delete_Func_Mapping (
12561         p_api_version                   IN   NUMBER
12562        ,p_function_id                   IN   NUMBER
12563        ,p_mapped_obj_type               IN   VARCHAR2
12564        ,p_mapped_obj_pk1_value          IN   VARCHAR2
12565        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12566        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12567        ,x_return_status                 OUT NOCOPY VARCHAR2
12571 ) IS
12568        ,x_errorcode                     OUT NOCOPY NUMBER
12569        ,x_msg_count                     OUT NOCOPY NUMBER
12570        ,x_msg_data                      OUT NOCOPY VARCHAR2
12572 
12573     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Func_Mapping';
12574 
12575     --we don't use l_api_version yet, but eventually we might:
12576     --if we change required parameters, version goes FROM n.x to (n+1).x
12577     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12578     l_api_version            CONSTANT NUMBER := 1.0;
12579 
12580   BEGIN
12581 
12582     -- Standard start of API savepoint
12583     IF FND_API.To_Boolean(p_commit) THEN
12584       SAVEPOINT Update_Mapping_PUB;
12585     END IF;
12586 
12587     -- Check for call compatibility
12588     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12589                                         l_api_name, G_PKG_NAME)
12590     THEN
12591       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12592     END IF;
12593     -- Initialize message list even though we don't currently use it
12594     IF FND_API.To_Boolean(p_init_msg_list) THEN
12595       FND_MSG_PUB.Initialize;
12596     END IF;
12597 
12598     DELETE FROM EGO_MAPPINGS_B
12599     WHERE
12600     FUNCTION_ID = p_function_id AND
12601     MAPPED_OBJ_TYPE = p_mapped_obj_type AND
12602     MAPPED_OBJ_PK1_VAL = p_mapped_obj_pk1_value;
12603 
12604     -- Standard check of p_commit
12605     IF FND_API.To_Boolean(p_commit) THEN
12606       COMMIT WORK;
12607     END IF;
12608 
12609     x_return_status := FND_API.G_RET_STS_SUCCESS;
12610 
12611   EXCEPTION
12612     WHEN OTHERS THEN
12613       IF FND_API.To_Boolean(p_commit) THEN
12614         ROLLBACK TO Delete_Func_Mapping_PUB;
12615       END IF;
12616       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12617 
12618       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12619       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12620       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12621       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12622       FND_MSG_PUB.Add;
12623       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12624                                ,p_count   => x_msg_count
12625                                ,p_data    => x_msg_data);
12626 
12627 
12628 END Delete_Func_Mapping;
12629 
12630 ----------------------------------------------------------------------
12631 
12632 -- call this API to delete an individual parameter mapping
12633 PROCEDURE Delete_Func_Param_Mapping (
12634         p_api_version                   IN   NUMBER
12635        ,p_function_id                   IN   NUMBER
12636        ,p_mapped_obj_type               IN   VARCHAR2
12637        ,p_mapped_obj_pk1_value          IN   VARCHAR2
12638        ,p_func_param_id                 IN   NUMBER
12639        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12640        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12641        ,x_return_status                 OUT NOCOPY VARCHAR2
12642        ,x_errorcode                     OUT NOCOPY NUMBER
12643        ,x_msg_count                     OUT NOCOPY NUMBER
12644        ,x_msg_data                      OUT NOCOPY VARCHAR2
12645 ) IS
12646 
12647     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Func_Param_Mapping';
12648 
12649     --we don't use l_api_version yet, but eventually we might:
12650     --if we change required parameters, version goes FROM n.x to (n+1).x
12651     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12652     l_api_version            CONSTANT NUMBER := 1.0;
12653 
12654   BEGIN
12655 
12656     -- Standard start of API savepoint
12657     IF FND_API.To_Boolean(p_commit) THEN
12658       SAVEPOINT Delete_Func_Param_Mapping_PUB;
12659     END IF;
12660 
12661     -- Check for call compatibility
12662     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12663                                         l_api_name, G_PKG_NAME)
12664     THEN
12665       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12666     END IF;
12667     -- Initialize message list even though we don't currently use it
12668     IF FND_API.To_Boolean(p_init_msg_list) THEN
12669       FND_MSG_PUB.Initialize;
12670     END IF;
12671 
12672     DELETE FROM EGO_MAPPINGS_B
12673     WHERE
12674     FUNCTION_ID = p_function_id AND
12675     MAPPED_OBJ_TYPE = p_mapped_obj_type AND
12676     MAPPED_OBJ_PK1_VAL = p_mapped_obj_pk1_value AND
12677     FUNC_PARAM_ID = p_func_param_id;
12678 
12679     -- Standard check of p_commit
12680     IF FND_API.To_Boolean(p_commit) THEN
12681       COMMIT WORK;
12682     END IF;
12683 
12684     x_return_status := FND_API.G_RET_STS_SUCCESS;
12685 
12686   EXCEPTION
12687     WHEN OTHERS THEN
12688       IF FND_API.TO_BOOLEAN(p_commit) THEN
12689         ROLLBACK TO Delete_Func_Param_Mapping_PUB;
12690       END IF;
12691       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12692 
12693       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12694       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12695       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12696       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12697       FND_MSG_PUB.Add;
12698       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12702 
12699                                ,p_count   => x_msg_count
12700                                ,p_data    => x_msg_data);
12701 
12703 END Delete_Func_Param_Mapping;
12704 
12705 ----------------------------------------------------------------------
12706 
12707                      -----------------------
12708                      -- Action Group APIs --
12709                      -----------------------
12710 
12711 ----------------------------------------------------------------------
12712 
12713 PROCEDURE Create_Action_Group (
12714         p_api_version                   IN   NUMBER
12715        ,p_object_id                     IN   NUMBER
12716        ,p_classification_code           IN   VARCHAR2
12717        ,p_sequence                      IN   NUMBER
12718        ,p_internal_name                 IN   VARCHAR2
12719        ,p_display_name                  IN   VARCHAR2
12720        ,p_description                   IN   VARCHAR2
12721        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12722        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12723        ,x_action_group_id               OUT NOCOPY NUMBER
12724        ,x_return_status                 OUT NOCOPY VARCHAR2
12725        ,x_errorcode                     OUT NOCOPY NUMBER
12726        ,x_msg_count                     OUT NOCOPY NUMBER
12727        ,x_msg_data                      OUT NOCOPY VARCHAR2
12728 ) IS
12729 
12730     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action_Group';
12731 
12732     --we don't use l_api_version yet, but eventually we might:
12733     --if we change required parameters, version goes FROM n.x to (n+1).x
12734     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12735     l_api_version            CONSTANT NUMBER := 1.0;
12736 
12737     l_Sysdate                DATE := Sysdate;
12738 
12739   BEGIN
12740 
12741     -- Standard start of API savepoint
12742     IF FND_API.To_Boolean(p_commit) THEN
12743       SAVEPOINT Create_Action_Group_PUB;
12744     END IF;
12745 
12746     -- Check for call compatibility
12747     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12748                                         l_api_name, G_PKG_NAME)
12749     THEN
12750       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12751     END IF;
12752     -- Initialize message list even though we don't currently use it
12753     IF FND_API.To_Boolean(p_init_msg_list) THEN
12754       FND_MSG_PUB.Initialize;
12755     END IF;
12756 
12757     SELECT EGO_ACTION_GROUPS_S.NEXTVAL INTO x_action_group_id FROM DUAL;
12758 
12759     INSERT INTO EGO_ACTION_GROUPS_B
12760     (
12761         ACTION_GROUP_ID
12762        ,OBJECT_ID
12763        ,CLASSIFICATION_CODE
12764        ,SEQUENCE
12765        ,INTERNAL_NAME
12766        ,LAST_UPDATE_DATE
12767        ,LAST_UPDATED_BY
12768        ,CREATION_DATE
12769        ,CREATED_BY
12770        ,LAST_UPDATE_LOGIN
12771     )
12772     VALUES
12773     (
12774         x_action_group_id
12775        ,p_object_id
12776        ,p_classification_code
12777        ,p_sequence
12778        ,p_internal_name
12779        ,l_Sysdate
12780        ,g_current_user_id
12781        ,l_Sysdate
12782        ,g_current_user_id
12783        ,g_current_login_id
12784     );
12785 
12786     INSERT INTO EGO_ACTION_GROUPS_TL
12787     (
12788         ACTION_GROUP_ID
12789        ,DISPLAY_NAME
12790        ,DESCRIPTION
12791        ,LANGUAGE
12792        ,SOURCE_LANG
12793        ,LAST_UPDATE_DATE
12794        ,LAST_UPDATED_BY
12795        ,CREATION_DATE
12796        ,CREATED_BY
12797        ,LAST_UPDATE_LOGIN
12798     )
12799     SELECT
12800         x_action_group_id
12801        ,p_display_name
12802        ,p_description
12803        ,L.LANGUAGE_CODE
12804        ,USERENV('LANG')
12805        ,l_Sysdate
12806        ,g_current_user_id
12807        ,l_Sysdate
12808        ,g_current_user_id
12809        ,g_current_login_id
12810 
12811     FROM FND_LANGUAGES L
12812     WHERE L.INSTALLED_FLAG in ('I', 'B');
12813 
12814     -- Standard check of p_commit
12815     IF FND_API.To_Boolean(p_commit) THEN
12816       COMMIT WORK;
12817     END IF;
12818 
12819     x_return_status := FND_API.G_RET_STS_SUCCESS;
12820 
12821   EXCEPTION
12822     WHEN OTHERS THEN
12823       IF FND_API.To_Boolean(p_commit) THEN
12824         ROLLBACK TO Create_Action_Group_PUB;
12825       END IF;
12826       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12827 
12828       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12829       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12830       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12831       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12832       FND_MSG_PUB.Add;
12833       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12837 
12834                                ,p_count   => x_msg_count
12835                                ,p_data    => x_msg_data);
12836 
12838 END Create_Action_Group;
12839 
12840 ----------------------------------------------------------------------
12841 
12842 PROCEDURE Update_Action_Group (
12843         p_api_version                   IN   NUMBER
12844        ,p_action_group_id               IN   NUMBER
12845        ,p_sequence                      IN   NUMBER
12846        ,p_internal_name                 IN   VARCHAR2
12847        ,p_display_name                  IN   VARCHAR2
12848        ,p_description                   IN   VARCHAR2
12849        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12850        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12851        ,x_return_status                 OUT NOCOPY VARCHAR2
12852        ,x_errorcode                     OUT NOCOPY NUMBER
12853        ,x_msg_count                     OUT NOCOPY NUMBER
12854        ,x_msg_data                      OUT NOCOPY VARCHAR2
12855 ) IS
12856 
12857     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Action_Group';
12858 
12859     --we don't use l_api_version yet, but eventually we might:
12860     --if we change required parameters, version goes FROM n.x to (n+1).x
12861     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12862     l_api_version            CONSTANT NUMBER := 1.0;
12863 
12864     l_Sysdate                DATE := Sysdate;
12865 
12866   BEGIN
12867 
12868     -- Standard start of API savepoint
12869     IF FND_API.To_Boolean(p_commit) THEN
12870       SAVEPOINT Update_Action_Group_PUB;
12871     END IF;
12872 
12873     -- Check for call compatibility
12874     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12875                                         l_api_name, G_PKG_NAME)
12876     THEN
12877       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12878     END IF;
12879     -- Initialize message list even though we don't currently use it
12880     IF FND_API.To_Boolean(p_init_msg_list) THEN
12881       FND_MSG_PUB.Initialize;
12882     END IF;
12883 
12884     UPDATE EGO_ACTION_GROUPS_B
12885     SET
12886        SEQUENCE              = p_sequence
12887      , INTERNAL_NAME         = p_internal_name
12888      , LAST_UPDATE_DATE      = l_Sysdate
12889      , LAST_UPDATED_BY       = g_current_user_id
12890      , LAST_UPDATE_LOGIN     = g_current_login_id
12891 
12892     WHERE
12893        ACTION_GROUP_ID = p_action_group_id;
12894 
12895     UPDATE EGO_ACTION_GROUPS_TL
12896     SET
12897        DESCRIPTION       = p_description
12898      , DISPLAY_NAME      = p_display_name
12899      , LAST_UPDATE_DATE  = l_Sysdate
12900      , LAST_UPDATED_BY   = g_current_user_id
12901      , LAST_UPDATE_LOGIN = g_current_login_id
12902      , SOURCE_LANG = USERENV('LANG')
12903 
12904     WHERE
12905        -- ACTION_GROUP_ID = p_action_group_id AND LANGUAGE = USERENV('LANG');
12906        ACTION_GROUP_ID = p_action_group_id AND USERENV('LANG') IN (LANGUAGE , SOURCE_LANG);
12907 
12908     -- Standard check of p_commit
12909     IF FND_API.To_Boolean(p_commit) THEN
12910       COMMIT WORK;
12911     END IF;
12912 
12913     x_return_status := FND_API.G_RET_STS_SUCCESS;
12914 
12915   EXCEPTION
12916     WHEN OTHERS THEN
12917       IF FND_API.TO_BOOLEAN(p_commit) THEN
12918         ROLLBACK TO Update_Action_Group_PUB;
12919       END IF;
12920       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12921 
12922       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12923       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12924       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12925       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12926       FND_MSG_PUB.Add;
12927       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12928                                ,p_count   => x_msg_count
12929                                ,p_data    => x_msg_data);
12930 
12931 
12932 END Update_Action_Group;
12933 
12934 ----------------------------------------------------------------------
12935 
12936 PROCEDURE Delete_Action_Group (
12937         p_api_version                   IN   NUMBER
12938        ,p_action_group_id               IN   NUMBER
12939        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12940        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12941        ,x_return_status                 OUT NOCOPY VARCHAR2
12942        ,x_errorcode                     OUT NOCOPY NUMBER
12943        ,x_msg_count                     OUT NOCOPY NUMBER
12944        ,x_msg_data                      OUT NOCOPY VARCHAR2
12945 ) IS
12946 
12947     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Action_Group';
12948 
12949     --we don't use l_api_version yet, but eventually we might:
12950     --if we change required parameters, version goes FROM n.x to (n+1).x
12951     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12952     l_api_version            CONSTANT NUMBER := 1.0;
12953 
12954   BEGIN
12955 
12956     -- Standard start of API savepoint
12957     IF FND_API.To_Boolean(p_commit) THEN
12958       SAVEPOINT Delete_Action_Group_PUB;
12959     END IF;
12963                                         l_api_name, G_PKG_NAME)
12960 
12961     -- Check for call compatibility
12962     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12964     THEN
12965       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12966     END IF;
12967     -- Initialize message list even though we don't currently use it
12968     IF FND_API.To_Boolean(p_init_msg_list) THEN
12969       FND_MSG_PUB.Initialize;
12970     END IF;
12971 
12972     -- If there are Actions in this Action Group, we delete their entries
12973     -- in the Action_Group_Entries table (but we don't delete the Actions).
12974     DELETE FROM EGO_ACTN_GRP_ENTRIES_B
12975     WHERE
12976     ACTION_GROUP_ID = p_action_group_id;
12977 
12978     DELETE FROM EGO_ACTION_GROUPS_B
12979     WHERE
12980     ACTION_GROUP_ID = p_action_group_id;
12981 
12982     DELETE FROM EGO_ACTION_GROUPS_TL
12983     WHERE
12984     ACTION_GROUP_ID = p_action_group_id;
12985 
12986     -- Standard check of p_commit
12987     IF FND_API.To_Boolean(p_commit) THEN
12988       COMMIT WORK;
12989     END IF;
12990 
12991     x_return_status := FND_API.G_RET_STS_SUCCESS;
12992 
12993   EXCEPTION
12994     WHEN OTHERS THEN
12995       IF FND_API.To_Boolean(p_commit) THEN
12996         ROLLBACK TO Delete_Action_Group_PUB;
12997       END IF;
12998       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12999 
13000       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13001       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13002       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13003       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13004       FND_MSG_PUB.Add;
13005       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13006                                ,p_count   => x_msg_count
13007                                ,p_data    => x_msg_data);
13008 
13009 
13010 END Delete_Action_Group;
13011 
13012 ----------------------------------------------------------------------
13013 
13014                   -----------------------------
13015                   -- Action Group Entry APIs --
13016                   -----------------------------
13017 
13018 ----------------------------------------------------------------------
13019 
13020 PROCEDURE Create_Action_Group_Entry (
13021         p_api_version                   IN   NUMBER
13022        ,p_action_group_id               IN   NUMBER
13023        ,p_action_id                     IN   NUMBER
13024        ,p_sequence                      IN   NUMBER
13025        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13026        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13027        ,x_return_status                 OUT NOCOPY VARCHAR2
13028        ,x_errorcode                     OUT NOCOPY NUMBER
13029        ,x_msg_count                     OUT NOCOPY NUMBER
13030        ,x_msg_data                      OUT NOCOPY VARCHAR2
13031 ) IS
13032 
13033     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action_Group_Entry';
13034 
13035     --we don't use l_api_version yet, but eventually we might:
13036     --if we change required parameters, version goes FROM n.x to (n+1).x
13037     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13038     l_api_version            CONSTANT NUMBER := 1.0;
13039 
13040     l_Sysdate                DATE := Sysdate;
13041     l_exist_action_count     NUMBER := 0;
13042 
13043   BEGIN
13044 
13045     -- Standard start of API savepoint
13046     IF FND_API.To_Boolean(p_commit) THEN
13047       SAVEPOINT Create_Action_Group_Entry_PUB;
13048     END IF;
13049 
13050     -- Check for call compatibility
13051     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13052                                         l_api_name, G_PKG_NAME)
13053     THEN
13054       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13055     END IF;
13056     -- Initialize message list even though we don't currently use it
13057     IF FND_API.To_Boolean(p_init_msg_list) THEN
13058       FND_MSG_PUB.Initialize;
13059     END IF;
13060 
13061     SELECT COUNT(ACTION_ID)
13062       INTO l_exist_action_count
13063       FROM EGO_ACTN_GRP_ENTRIES_B
13064      WHERE ACTION_GROUP_ID = p_action_group_id
13065        AND ACTION_ID = p_action_id;
13066 
13067     IF (l_exist_action_count = 0) THEN
13068       INSERT INTO EGO_ACTN_GRP_ENTRIES_B
13069       (
13070         ACTION_GROUP_ID
13071        ,ACTION_ID
13072        ,SEQUENCE
13073        ,LAST_UPDATE_DATE
13074        ,LAST_UPDATED_BY
13075        ,CREATION_DATE
13076        ,CREATED_BY
13077        ,LAST_UPDATE_LOGIN
13078       )
13079       VALUES
13080       (
13081         p_action_group_id
13082        ,p_action_id
13083        ,p_sequence
13084        ,l_Sysdate
13085        ,g_current_user_id
13086        ,l_Sysdate
13087        ,g_current_user_id
13088        ,g_current_login_id
13089       );
13090     END IF;
13091 
13092     -- Standard check of p_commit
13093     IF FND_API.To_Boolean(p_commit) THEN
13094       COMMIT WORK;
13095     END IF;
13096 
13097     x_return_status := FND_API.G_RET_STS_SUCCESS;
13098 
13099   EXCEPTION
13100     WHEN OTHERS THEN
13104       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13101       IF FND_API.To_Boolean(p_commit) THEN
13102         ROLLBACK TO Create_Action_Group_Entry_PUB;
13103       END IF;
13105 
13106       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13107       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13108       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13109       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13110       FND_MSG_PUB.Add;
13111       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13112                                ,p_count   => x_msg_count
13113                                ,p_data    => x_msg_data);
13114 
13115 
13116 END Create_Action_Group_Entry;
13117 
13118 ----------------------------------------------------------------------
13119 
13120 PROCEDURE Update_Action_Group_Entry (
13121         p_api_version                   IN   NUMBER
13122        ,p_action_group_id               IN   NUMBER
13123        ,p_action_id                     IN   NUMBER
13124        ,p_sequence                      IN   NUMBER
13125        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13126        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13127        ,x_return_status                 OUT NOCOPY VARCHAR2
13128        ,x_errorcode                     OUT NOCOPY NUMBER
13129        ,x_msg_count                     OUT NOCOPY NUMBER
13130        ,x_msg_data                      OUT NOCOPY VARCHAR2
13131 ) IS
13132 
13133     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Action_Group_Entry';
13134 
13135     --we don't use l_api_version yet, but eventually we might:
13136     --if we change required parameters, version goes FROM n.x to (n+1).x
13137     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13138     l_api_version            CONSTANT NUMBER := 1.0;
13139 
13140     l_Sysdate                DATE := Sysdate;
13141     l_exist_action_count     NUMBER := 0;
13142 
13143   BEGIN
13144 
13145     -- Standard start of API savepoint
13146     IF FND_API.To_Boolean(p_commit) THEN
13147       SAVEPOINT Update_Action_Group_Entry_PUB;
13148     END IF;
13149 
13150     -- Check for call compatibility
13151     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13152                                         l_api_name, G_PKG_NAME)
13153     THEN
13154       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13155     END IF;
13156     -- Initialize message list even though we don't currently use it
13157     IF FND_API.To_Boolean(p_init_msg_list) THEN
13158       FND_MSG_PUB.Initialize;
13159     END IF;
13160 
13161     UPDATE EGO_ACTN_GRP_ENTRIES_B
13162     SET SEQUENCE = p_sequence
13163   WHERE ACTION_GROUP_ID = p_action_group_id
13164     AND ACTION_ID = p_action_id;
13165 
13166     -- Standard check of p_commit
13167     IF FND_API.To_Boolean(p_commit) THEN
13168       COMMIT WORK;
13169     END IF;
13170 
13171     x_return_status := FND_API.G_RET_STS_SUCCESS;
13172 
13173   EXCEPTION
13174     WHEN OTHERS THEN
13175       IF FND_API.To_Boolean(p_commit) THEN
13176         ROLLBACK TO Update_Action_Group_Entry_PUB;
13177       END IF;
13178       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13179 
13180       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13181       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13182       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13183       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13184       FND_MSG_PUB.Add;
13185       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13186                                ,p_count   => x_msg_count
13187                                ,p_data    => x_msg_data);
13188 
13189 
13190 END Update_Action_Group_Entry;
13191 
13192 ----------------------------------------------------------------------
13193 
13194 PROCEDURE Delete_Action_Group_Entry (
13195         p_api_version                   IN   NUMBER
13196        ,p_action_group_id               IN   NUMBER
13197        ,p_action_id                     IN   NUMBER
13198        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13199        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13200        ,x_return_status                 OUT NOCOPY VARCHAR2
13201        ,x_errorcode                     OUT NOCOPY NUMBER
13202        ,x_msg_count                     OUT NOCOPY NUMBER
13203        ,x_msg_data                      OUT NOCOPY VARCHAR2
13204 ) IS
13205 
13206     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Action_Group_Entry';
13207 
13208     --we don't use l_api_version yet, but eventually we might:
13209     --if we change required parameters, version goes FROM n.x to (n+1).x
13210     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13211     l_api_version            CONSTANT NUMBER := 1.0;
13212 
13213   BEGIN
13214 
13215     -- Standard start of API savepoint
13216     IF FND_API.To_Boolean(p_commit) THEN
13217       SAVEPOINT Update_Action_Group_Entry_PUB;
13218     END IF;
13219 
13220     -- Check for call compatibility
13221     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13222                                         l_api_name, G_PKG_NAME)
13223     THEN
13224       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13225     END IF;
13226     -- Initialize message list even though we don't currently use it
13230 
13227     IF FND_API.To_Boolean(p_init_msg_list) THEN
13228       FND_MSG_PUB.Initialize;
13229     END IF;
13231     DELETE FROM EGO_ACTN_GRP_ENTRIES_B
13232     WHERE
13233     ACTION_GROUP_ID = p_action_group_id AND
13234     ACTION_ID = p_action_id;
13235 
13236     -- Standard check of p_commit
13237     IF FND_API.To_Boolean(p_commit) THEN
13238       COMMIT WORK;
13239     END IF;
13240 
13241     x_return_status := FND_API.G_RET_STS_SUCCESS;
13242 
13243   EXCEPTION
13244     WHEN OTHERS THEN
13245       IF FND_API.To_Boolean(p_commit) THEN
13246         ROLLBACK TO Delete_Action_Group_Entry_PUB;
13247       END IF;
13248       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13249 
13250       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13251       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13252       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13253       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13254       FND_MSG_PUB.Add;
13255       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13256                                ,p_count   => x_msg_count
13257                                ,p_data    => x_msg_data);
13258 
13259 
13260 END Delete_Action_Group_Entry;
13261 
13262 ----------------------------------------------------------------------
13263 
13264 PROCEDURE Add_Language_for_Action IS
13265 
13266   BEGIN
13267 
13268    delete from EGO_ACTIONS_TL T
13269       where not exists
13270         (select NULL
13271         from EGO_ACTIONS_B B
13272         where B.ACTION_ID = T.ACTION_ID
13273         );
13274 
13275       update EGO_ACTIONS_TL T set (
13276           DESCRIPTION
13277         ) = (select
13278           B.DESCRIPTION
13279         from EGO_ACTIONS_TL B
13280         where B.ACTION_ID = T.ACTION_ID
13281         and B.LANGUAGE = T.SOURCE_LANG)
13282       where (
13283           T.ACTION_ID,
13284           T.LANGUAGE
13285       ) in (select
13286           SUBT.ACTION_ID,
13287           SUBT.LANGUAGE
13288         from EGO_ACTIONS_TL SUBB, EGO_ACTIONS_TL SUBT
13289         where SUBB.ACTION_ID = SUBT.ACTION_ID
13290         and SUBB.LANGUAGE = SUBT.SOURCE_LANG
13291         and (SUBB.DESCRIPTION <> SUBT.DESCRIPTION
13292           or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
13293           or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
13294       ));
13295 
13296       insert into EGO_ACTIONS_TL (
13297         ACTION_ID,
13298         DESCRIPTION,
13299         CREATED_BY,
13300         CREATION_DATE,
13301         LAST_UPDATED_BY,
13302         LAST_UPDATE_DATE,
13303         LAST_UPDATE_LOGIN,
13304         LANGUAGE,
13305         SOURCE_LANG)
13306       select
13307         B.ACTION_ID,
13308         B.DESCRIPTION,
13309         B.CREATED_BY,
13310         B.CREATION_DATE,
13311         B.LAST_UPDATED_BY,
13312         B.LAST_UPDATE_DATE,
13313         B.LAST_UPDATE_LOGIN,
13314         L.LANGUAGE_CODE,
13315         B.SOURCE_LANG
13316       from EGO_ACTIONS_TL B, FND_LANGUAGES L
13317       where L.INSTALLED_FLAG in ('I', 'B')
13318       and B.LANGUAGE = userenv('LANG')
13319       and not exists
13320         (select NULL
13321         from EGO_ACTIONS_TL T
13322         where T.ACTION_ID = B.ACTION_ID
13323     and T.LANGUAGE = L.LANGUAGE_CODE);
13324 
13325 END Add_Language_for_Action;
13326 
13327 ----------------------------------------------------------------------
13328 
13329 
13330 PROCEDURE Add_Language_for_Action_Group IS
13331   BEGIN
13332 
13333    delete from EGO_ACTION_GROUPS_TL T
13334    where not exists
13335      (select NULL
13336      from EGO_ACTION_GROUPS_B B
13337      where B.ACTION_GROUP_ID = T.ACTION_GROUP_ID
13338      );
13339 
13340    update EGO_ACTION_GROUPS_TL T set (
13341        DISPLAY_NAME,
13342        DESCRIPTION
13343      ) = (select
13344        B.DISPLAY_NAME,
13345        B.DESCRIPTION
13346      from EGO_ACTION_GROUPS_TL B
13347      where B.ACTION_GROUP_ID = T.ACTION_GROUP_ID
13348      and B.LANGUAGE = T.SOURCE_LANG)
13349    where (
13350        T.ACTION_GROUP_ID,
13351        T.LANGUAGE
13352    ) in (select
13353        SUBT.ACTION_GROUP_ID,
13354        SUBT.LANGUAGE
13355      from EGO_ACTION_GROUPS_TL SUBB, EGO_ACTION_GROUPS_TL SUBT
13356      where SUBB.ACTION_GROUP_ID = SUBT.ACTION_GROUP_ID
13357      and SUBB.LANGUAGE = SUBT.SOURCE_LANG
13358      and (SUBB.DISPLAY_NAME <> SUBT.DISPLAY_NAME
13359        or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
13360        or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
13361        or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
13362    ));
13363 
13364    insert into EGO_ACTION_GROUPS_TL (
13365      ACTION_GROUP_ID,
13366      DISPLAY_NAME,
13367      DESCRIPTION,
13368      CREATED_BY,
13369      CREATION_DATE,
13370      LAST_UPDATED_BY,
13371      LAST_UPDATE_DATE,
13372      LAST_UPDATE_LOGIN,
13373      LANGUAGE,
13374      SOURCE_LANG
13375    ) select
13376      B.ACTION_GROUP_ID,
13377      B.DISPLAY_NAME,
13378      B.DESCRIPTION,
13379      B.CREATED_BY,
13380      B.CREATION_DATE,
13381      B.LAST_UPDATED_BY,
13382      B.LAST_UPDATE_DATE,
13383      B.LAST_UPDATE_LOGIN,
13384      L.LANGUAGE_CODE,
13388    and B.LANGUAGE = userenv('LANG')
13385      B.SOURCE_LANG
13386    from EGO_ACTION_GROUPS_TL B, FND_LANGUAGES L
13387    where L.INSTALLED_FLAG in ('I', 'B')
13389    and not exists
13390      (select NULL
13391      from EGO_ACTION_GROUPS_TL T
13392      where T.ACTION_GROUP_ID = B.ACTION_GROUP_ID
13393     and T.LANGUAGE = L.LANGUAGE_CODE);
13394 
13395 END Add_Language_for_Action_Group;
13396 
13397 ----------------------------------------------------------------------
13398 
13399 PROCEDURE Add_Language_for_Function IS
13400   BEGIN
13401 
13402   delete from EGO_FUNCTIONS_TL T
13403       where not exists
13404         (select NULL
13405         from EGO_FUNCTIONS_B B
13406         where B.FUNCTION_ID = T.FUNCTION_ID
13407         );
13408 
13409       update EGO_FUNCTIONS_TL T set (
13410           DISPLAY_NAME,
13411           DESCRIPTION
13412         ) = (select
13413           B.DISPLAY_NAME,
13414           B.DESCRIPTION
13415         from EGO_FUNCTIONS_TL B
13416         where B.FUNCTION_ID = T.FUNCTION_ID
13417         and B.LANGUAGE = T.SOURCE_LANG)
13418       where (
13419           T.FUNCTION_ID,
13420           T.LANGUAGE
13421       ) in (select
13422           SUBT.FUNCTION_ID,
13423           SUBT.LANGUAGE
13424         from EGO_FUNCTIONS_TL SUBB, EGO_FUNCTIONS_TL SUBT
13425         where SUBB.FUNCTION_ID = SUBT.FUNCTION_ID
13426         and SUBB.LANGUAGE = SUBT.SOURCE_LANG
13427         and (SUBB.DISPLAY_NAME <> SUBT.DISPLAY_NAME
13428           or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
13429           or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
13430           or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
13431       ));
13432 
13433       insert into EGO_FUNCTIONS_TL (
13434         CREATION_DATE,
13435         LAST_UPDATED_BY,
13436         LAST_UPDATE_DATE,
13437         LAST_UPDATE_LOGIN,
13438         CREATED_BY,
13439         FUNCTION_ID,
13440         DISPLAY_NAME,
13441         DESCRIPTION,
13442         LANGUAGE,
13443         SOURCE_LANG
13444       ) select
13445         B.CREATION_DATE,
13446         B.LAST_UPDATED_BY,
13447         B.LAST_UPDATE_DATE,
13448         B.LAST_UPDATE_LOGIN,
13449         B.CREATED_BY,
13450         B.FUNCTION_ID,
13451         B.DISPLAY_NAME,
13452         B.DESCRIPTION,
13453         L.LANGUAGE_CODE,
13454         B.SOURCE_LANG
13455       from EGO_FUNCTIONS_TL B, FND_LANGUAGES L
13456       where L.INSTALLED_FLAG in ('I', 'B')
13457       and B.LANGUAGE = userenv('LANG')
13458       and not exists
13459         (select NULL
13460         from EGO_FUNCTIONS_TL T
13461         where T.FUNCTION_ID = B.FUNCTION_ID
13462     and T.LANGUAGE = L.LANGUAGE_CODE);
13463 
13464 END Add_Language_for_Function;
13465 
13466 ----------------------------------------------------------------------
13467 
13468 PROCEDURE Add_Language_for_Func_Param IS
13469   BEGIN
13470 
13471   delete from EGO_FUNC_PARAMS_TL T
13472   where not exists
13473     (select NULL
13474     from EGO_FUNC_PARAMS_B B
13475     where B.FUNC_PARAM_ID = T.FUNC_PARAM_ID
13476     );
13477 
13478   update EGO_FUNC_PARAMS_TL T set (
13479       DISPLAY_NAME,
13480       DESCRIPTION
13481     ) = (select
13482       B.DISPLAY_NAME,
13483       B.DESCRIPTION
13484     from EGO_FUNC_PARAMS_TL B
13485     where B.FUNC_PARAM_ID = T.FUNC_PARAM_ID
13486     and B.LANGUAGE = T.SOURCE_LANG)
13487   where (
13488       T.FUNC_PARAM_ID,
13489       T.LANGUAGE
13490   ) in (select
13491       SUBT.FUNC_PARAM_ID,
13492       SUBT.LANGUAGE
13493     from EGO_FUNC_PARAMS_TL SUBB, EGO_FUNC_PARAMS_TL SUBT
13494     where SUBB.FUNC_PARAM_ID = SUBT.FUNC_PARAM_ID
13495     and SUBB.LANGUAGE = SUBT.SOURCE_LANG
13496     and (SUBB.DISPLAY_NAME <> SUBT.DISPLAY_NAME
13497       or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
13498       or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
13499       or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
13500   ));
13501 
13502   insert into EGO_FUNC_PARAMS_TL (
13503     FUNC_PARAM_ID,
13504     DISPLAY_NAME,
13505     DESCRIPTION,
13506     CREATED_BY,
13507     CREATION_DATE,
13508     LAST_UPDATED_BY,
13509     LAST_UPDATE_DATE,
13510     LAST_UPDATE_LOGIN,
13511     LANGUAGE,
13512     SOURCE_LANG
13513   ) select
13514     B.FUNC_PARAM_ID,
13515     B.DISPLAY_NAME,
13516     B.DESCRIPTION,
13517     B.CREATED_BY,
13518     B.CREATION_DATE,
13519     B.LAST_UPDATED_BY,
13520     B.LAST_UPDATE_DATE,
13521     B.LAST_UPDATE_LOGIN,
13522     L.LANGUAGE_CODE,
13523     B.SOURCE_LANG
13524   from EGO_FUNC_PARAMS_TL B, FND_LANGUAGES L
13525   where L.INSTALLED_FLAG in ('I', 'B')
13526   and B.LANGUAGE = userenv('LANG')
13527   and not exists
13528     (select NULL
13529     from EGO_FUNC_PARAMS_TL T
13530     where T.FUNC_PARAM_ID = B.FUNC_PARAM_ID
13531     and T.LANGUAGE = L.LANGUAGE_CODE);
13532 
13533 END Add_Language_for_Func_Param;
13534 
13535 ----------------------------------------------------------------------
13536 
13537 PROCEDURE Add_Language_for_Pages IS
13538   BEGIN
13539 
13540   delete from EGO_PAGES_TL T
13541   where not exists
13542     (select NULL
13543     from EGO_PAGES_B B
13547   update EGO_PAGES_TL T set (
13544     where B.PAGE_ID = T.PAGE_ID
13545     );
13546 
13548       DISPLAY_NAME,
13549       DESCRIPTION
13550     ) = (select
13551       B.DISPLAY_NAME,
13552       B.DESCRIPTION
13553     from EGO_PAGES_TL B
13554     where B.PAGE_ID = T.PAGE_ID
13555     and B.LANGUAGE = T.SOURCE_LANG)
13556   where (
13557       T.PAGE_ID,
13558       T.LANGUAGE
13559   ) in (select
13560       SUBT.PAGE_ID,
13561       SUBT.LANGUAGE
13562     from EGO_PAGES_TL SUBB, EGO_PAGES_TL SUBT
13563     where SUBB.PAGE_ID = SUBT.PAGE_ID
13564     and SUBB.LANGUAGE = SUBT.SOURCE_LANG
13565     and (SUBB.DISPLAY_NAME <> SUBT.DISPLAY_NAME
13566       or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
13567       or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
13568       or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
13569   ));
13570 
13571   insert into EGO_PAGES_TL (
13572     PAGE_ID,
13573     DISPLAY_NAME,
13574     DESCRIPTION,
13575     CREATED_BY,
13576     CREATION_DATE,
13577     LAST_UPDATED_BY,
13578     LAST_UPDATE_DATE,
13579     LAST_UPDATE_LOGIN,
13580     LANGUAGE,
13581     SOURCE_LANG
13582   ) select
13583     B.PAGE_ID,
13584     B.DISPLAY_NAME,
13585     B.DESCRIPTION,
13586     B.CREATED_BY,
13587     B.CREATION_DATE,
13588     B.LAST_UPDATED_BY,
13589     B.LAST_UPDATE_DATE,
13590     B.LAST_UPDATE_LOGIN,
13591     L.LANGUAGE_CODE,
13592     B.SOURCE_LANG
13593   from EGO_PAGES_TL B, FND_LANGUAGES L
13594   where L.INSTALLED_FLAG in ('I', 'B')
13595   and B.LANGUAGE = userenv('LANG')
13596   and not exists
13597     (select NULL
13598     from EGO_PAGES_TL T
13599     where T.PAGE_ID = B.PAGE_ID
13600     and T.LANGUAGE = L.LANGUAGE_CODE);
13601 
13602 END Add_Language_for_Pages;
13603 
13604 ----------------------------------------------------------------------
13605 
13606 PROCEDURE Add_Language_for_Data_level IS
13607 BEGIN
13608 
13609   DELETE FROM EGO_DATA_LEVEL_TL T
13610   WHERE NOT EXISTS
13611     (SELECT NULL
13612     FROM EGO_DATA_LEVEL_B B
13613     WHERE B.DATA_LEVEL_ID = T.DATA_LEVEL_ID
13614     );
13615 
13616   UPDATE EGO_DATA_LEVEL_TL T
13617   SET (USER_DATA_LEVEL_NAME
13618       )
13619       =
13620       (SELECT B.USER_DATA_LEVEL_NAME
13621        FROM EGO_DATA_LEVEL_TL B
13622        WHERE B.DATA_LEVEL_ID = T.DATA_LEVEL_ID
13623        AND B.LANGUAGE = T.SOURCE_LANG)
13624   WHERE (
13625       T.DATA_LEVEL_ID,
13626       T.LANGUAGE
13627          )
13628          IN
13629          (SELECT
13630             SUBT.DATA_LEVEL_ID,
13631             SUBT.LANGUAGE
13632           from EGO_DATA_LEVEL_TL SUBB, EGO_DATA_LEVEL_TL SUBT
13633           where SUBB.DATA_LEVEL_ID = SUBT.DATA_LEVEL_ID
13634           and SUBB.LANGUAGE = SUBT.SOURCE_LANG
13635           and SUBB.USER_DATA_LEVEL_NAME <> SUBT.USER_DATA_LEVEL_NAME
13636          );
13637 
13638   INSERT INTO EGO_DATA_LEVEL_TL (
13639     DATA_LEVEL_ID,
13640     USER_DATA_LEVEL_NAME,
13641     CREATED_BY,
13642     CREATION_DATE,
13643     LAST_UPDATED_BY,
13644     LAST_UPDATE_DATE,
13645     LAST_UPDATE_LOGIN,
13646     LANGUAGE,
13647     SOURCE_LANG
13648   ) select
13649     B.DATA_LEVEL_ID,
13650     B.USER_DATA_LEVEL_NAME,
13651     B.CREATED_BY,
13652     B.CREATION_DATE,
13653     B.LAST_UPDATED_BY,
13654     B.LAST_UPDATE_DATE,
13655     B.LAST_UPDATE_LOGIN,
13656     L.LANGUAGE_CODE,
13657     B.SOURCE_LANG
13658   from EGO_DATA_LEVEL_TL B, FND_LANGUAGES L
13659   where L.INSTALLED_FLAG in ('I', 'B')
13660   and B.LANGUAGE = userenv('LANG')
13661   and not exists
13662     (select NULL
13663     from EGO_DATA_LEVEL_TL T
13664     where T.DATA_LEVEL_ID = B.DATA_LEVEL_ID
13665     and T.LANGUAGE = L.LANGUAGE_CODE);
13666 
13667 END Add_Language_for_Data_level;
13668 
13669 ----------------------------------------------------------------------
13670 
13671 PROCEDURE ADD_LANGUAGE (
13672        p_tl_table_name   IN   VARCHAR2
13673 ) IS
13674 
13675 BEGIN
13676 
13677   IF (p_tl_table_name = 'EGO_ACTIONS_TL') THEN
13678     Add_Language_for_Action;
13679   ELSIF (p_tl_table_name = 'EGO_ACTION_GROUPS_TL') THEN
13680     Add_Language_for_Action_Group;
13681   ELSIF (p_tl_table_name = 'EGO_FUNCTIONS_TL') THEN
13682     Add_Language_for_Function;
13683   ELSIF (p_tl_table_name = 'EGO_FUNC_PARAMS_TL') THEN
13684     Add_Language_for_Func_Param;
13685   ELSIF (p_tl_table_name = 'EGO_PAGES_TL') THEN
13686     Add_Language_for_Pages;
13687   ELSIF (p_tl_table_name = 'EGO_DATA_LEVEL_TL') THEN
13688     Add_Language_for_Data_level;
13689   END IF;
13690 
13691 END ADD_LANGUAGE;
13692 
13693 ---------------------------------------------------------------------
13694 FUNCTION Return_Association_Existance
13695      (p_application_id   IN  NUMBER
13696      ,p_attr_group_type  IN  VARCHAR2
13697      ,p_attr_group_name  IN  VARCHAR2) RETURN VARCHAR2 IS
13698 --
13699 -- The function takes the application_id, attribute Group Type
13700 -- and Attribute Group Name and determines whether any associations
13701 -- are created for the attribute specified
13702 -- If there are any existing associations
13703 --       then 1 will be returned
13704 --       else 0 will be returned
13708 BEGIN
13705 --
13706 
13707   check_association_existance  BOOLEAN := true;
13709  check_association_existance := Check_Associations_Exist
13710                       (p_application_id   => p_application_id
13711                       ,p_attr_group_type  => p_attr_group_type
13712                       ,p_attr_group_name  => p_attr_group_name);
13713   IF check_association_existance THEN
13714     RETURN '1';
13715   ELSE
13716     RETURN '0';
13717   END IF;
13718 
13719   EXCEPTION
13720     WHEN OTHERS THEN
13721       return '1';
13722 END Return_Association_Existance;
13723 
13724 --------------------------------------------------------------------------
13725 
13726 PROCEDURE Update_AGV_Name(
13727      p_api_version                   IN   NUMBER
13728     ,p_application_id                IN   NUMBER
13729     ,p_attr_group_type               IN   VARCHAR2
13730     ,p_attr_group_name               IN   VARCHAR2
13731     ,p_agv_name                      IN   VARCHAR2
13732     ,p_init_msg_list                 IN   VARCHAR2   :=  FND_API.G_FALSE
13733     ,p_commit                        IN   VARCHAR2   :=  FND_API.G_FALSE
13734     ,x_return_status                 OUT NOCOPY VARCHAR2
13735     ,x_errorcode                     OUT NOCOPY NUMBER
13736     ,x_msg_count                     OUT NOCOPY NUMBER
13737     ,x_msg_data                      OUT NOCOPY VARCHAR2)
13738   IS
13739 
13740     -- Start OF comments
13741     -- API name  : Update_AGV_Name
13742     -- TYPE      : Public
13743     -- Pre-reqs  : None
13744     -- FUNCTION  : Update Table 'ego_fnd_dsc_flx_ctx_ext'
13745     --         for attribute View Name
13746     -- Version: Current Version 1.0
13747     -- Previous Version :  None
13748     --
13749     -- END OF comments
13750 
13751   CURSOR c_check_agv_name (cp_agv_name  IN VARCHAR2
13752                           ,cp_application_id  IN NUMBER
13753                           ,cp_attr_group_type IN VARCHAR2
13754                           ,cp_attr_group_name IN VARCHAR2
13755                           ) IS
13756   SELECT agv_name
13757   FROM ego_fnd_dsc_flx_ctx_ext
13758   WHERE agv_name = cp_agv_name
13759     AND attr_group_id NOT IN
13760             (select attr_group_id
13761                from  ego_fnd_dsc_flx_ctx_ext
13762               where agv_name = cp_agv_name
13763                 AND application_id  = cp_application_id
13764                 AND descriptive_flexfield_name =  cp_attr_group_type
13765                 AND descriptive_flex_context_code =  cp_attr_group_name
13766              );
13767 
13768   CURSOR c_check_obj_name (cp_agv_name IN  VARCHAR2, cp_appl_id IN NUMBER) IS
13769   SELECT object_name
13770   FROM all_objects
13771   where object_name = cp_agv_name
13772   and owner in (EGO_EXT_FWK_PUB.Get_Application_Owner(cp_appl_id), EGO_EXT_FWK_PUB.Get_Oracle_UserName);
13773 
13774     l_api_version CONSTANT  NUMBER := 1.0 ;
13775     l_api_name    CONSTANT  VARCHAR (30) := 'Update_AGV_Name' ;
13776 
13777     l_dynamic_sql    VARCHAR2(100);
13778     l_agv_name       ego_fnd_dsc_flx_ctx_ext.agv_name%TYPE;
13779     l_temp_agv_name  ego_fnd_dsc_flx_ctx_ext.agv_name%TYPE;
13780 
13781   BEGIN
13782     -- Standard Start of API savepoint
13783     IF FND_API.To_Boolean( p_commit ) THEN
13784       SAVEPOINT   Update_AGV_Name ;
13785     END IF;
13786     -- Check for call compatibility.
13787     IF NOT FND_API.Compatible_API_Call( l_api_version ,
13788                     p_api_version ,
13789                     l_api_name ,
13790                     G_PKG_NAME
13791                        ) THEN
13792        RAISE FND_API.G_EXC_ERROR;
13793     END IF;
13794 
13795     -- Initialize API message list if necessary.
13796     -- Initialize message list if p_init_msg_list is set to TRUE.
13797     IF FND_API.to_Boolean( P_INIT_MSG_LIST ) THEN
13798       FND_MSG_PUB.initialize;
13799     END IF;
13800 
13801     -- Check If the view name is already present
13802     l_agv_name := UPPER(p_agv_name);
13803     OPEN c_check_agv_name (cp_agv_name        => l_agv_name
13804                           ,cp_application_id  => p_application_id
13805                           ,cp_attr_group_type => p_attr_group_type
13806                           ,cp_attr_group_name => p_attr_group_name
13807                           );
13808     FETCH c_check_agv_name INTO l_temp_agv_name;
13809     IF c_check_agv_name%FOUND THEN
13810       FND_MESSAGE.set_name('EGO','EGO_EF_NAME_EXTS');
13811       FND_MSG_PUB.add;
13812       RAISE FND_API.g_exc_error;
13813     END IF;
13814     CLOSE c_check_agv_name;
13815 
13816     -- the AGV Name is unique among the existing records
13817     -- check if the AGV Name is an already existing object
13818     OPEN c_check_obj_name (cp_agv_name => l_agv_name,
13819                            cp_appl_id => p_application_id);
13820     FETCH c_check_obj_name INTO l_temp_agv_name;
13821     IF c_check_obj_name%FOUND THEN
13822       FND_MESSAGE.set_name('EGO','EGO_EF_NAME_EXTS');
13823       FND_MSG_PUB.add;
13824       RAISE FND_API.g_exc_error;
13825     END IF;
13826     CLOSE c_check_obj_name;
13827 
13828     --Test with this dummy Query for the validity of the view name
13829     --It should not be a reserve word
13830     l_dynamic_sql := 'CREATE OR REPLACE VIEW '|| l_agv_name ||' AS SELECT * FROM DUAL';
13831     EXECUTE IMMEDIATE l_dynamic_sql;
13832 
13836     -- dummy view should not exist in the database.
13833     -- Syalaman - Fix for bug 5911824
13834     -- Droping the dummy view created in above statement so that
13835     -- if any error occurs while creating the actual view, this
13837     l_dynamic_sql := 'DROP VIEW '|| l_agv_name;
13838     EXECUTE IMMEDIATE l_dynamic_sql;
13839     -- End of fix for bug 5911824
13840 
13841 --
13842 -- As the method is called in validate, we should not update
13843 --
13844 --    -- Insert Attribute Group View name for the corresponding
13845 --    -- Attribute Group
13846 --    UPDATE ego_fnd_dsc_flx_ctx_ext
13847 --      SET agv_name             = l_agv_name,
13848 --          last_updated_by      = FND_GLOBAL.user_id,
13849 --          last_update_date     = SYSDATE,
13850 --          last_update_login    = FND_GLOBAL.login_id
13851 --    WHERE application_id                = p_application_id
13852 --      AND descriptive_flexfield_name    = p_attr_group_type
13853 --      AND descriptive_flex_context_code = p_attr_group_name ;
13854 --
13855     IF FND_API.To_Boolean(p_commit) THEN
13856       COMMIT WORK;
13857     END IF;
13858     x_return_status := FND_API.G_RET_STS_SUCCESS;
13859   EXCEPTION
13860     WHEN FND_API.G_EXC_ERROR THEN
13861       IF FND_API.To_Boolean( p_commit ) THEN
13862         ROLLBACK TO Update_AGV_Name;
13863       END IF;
13864       IF c_check_agv_name%ISOPEN THEN
13865         CLOSE c_check_agv_name;
13866       END IF;
13867       IF c_check_obj_name%ISOPEN THEN
13868         CLOSE c_check_obj_name;
13869       END IF;
13870       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13871                                ,p_count   => x_msg_count
13872                                ,p_data    => x_msg_data);
13873       x_return_status := FND_API.G_RET_STS_ERROR;
13874     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13875       IF FND_API.To_Boolean( p_commit ) THEN
13876         ROLLBACK TO Update_AGV_Name;
13877       END IF;
13878       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13879                                ,p_count   => x_msg_count
13880                                ,p_data    => x_msg_data);
13881       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13882     WHEN OTHERS THEN
13883       IF FND_API.To_Boolean( p_commit ) THEN
13884         ROLLBACK TO Update_AGV_Name;
13885       END IF;
13886       IF c_check_agv_name%ISOPEN THEN
13887         CLOSE c_check_agv_name;
13888       END IF;
13889       IF c_check_obj_name%ISOPEN THEN
13890         CLOSE c_check_obj_name;
13891       END IF;
13892       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13893                                ,p_count   => x_msg_count
13894                                ,p_data    => x_msg_data);
13895       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
13896 
13897   END Update_AGV_Name;
13898 
13899 ------------------------------------------------------------------------------------------
13900 -- This method will update the control level of an attribute in EGO_FND_DF_COL_USGS_EXT
13901 -- requires:  1) p_control_level is a valid control level
13902 --             as represented in lookup 'EGO_PC_CONTROL_LEVEL' in fnd_lookups
13903 --            2) p_application_column_name is not null and is a valid column name
13904 --            3) p_application_id is not null and is valid
13905 --            4) p_descriptive_flexfield_name corresponds to a valid attribute group type
13906 ------------------------------------------------------------------------------------------
13907 PROCEDURE Update_Attribute_Control_Level (
13908         p_api_version                   IN   NUMBER
13909        ,p_application_id                IN   NUMBER
13910        ,p_descriptive_flexfield_name    IN   VARCHAR2
13911        ,p_application_column_name       IN   VARCHAR2
13912        ,p_control_level                 IN   NUMBER
13913        ,p_init_msg_list                 IN   VARCHAR2   :=  FND_API.G_FALSE
13914        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13915        ,x_return_status                 OUT NOCOPY VARCHAR2
13916        ,x_msg_count                     OUT NOCOPY NUMBER
13917        ,x_msg_data                      OUT NOCOPY VARCHAR2
13918 ) IS
13919 
13920     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Attribute_Control_Level';
13921     l_attr_id                NUMBER;
13922     l_control_level          VARCHAR2(30);
13923     e_control_level_invalid  EXCEPTION;
13924     e_no_attr_for_id_error   EXCEPTION;
13925 
13926   BEGIN
13927 
13928     -- Initialize API message list if necessary.
13929     -- Initialize message list if p_init_msg_list is set to TRUE.
13930     IF FND_API.to_Boolean( P_INIT_MSG_LIST ) THEN
13931       FND_MSG_PUB.initialize;
13932     END IF;
13933 
13934     -------------------------------------------------------------------------------------
13935     -- Make sure that the control level corresponds with either Master Level or Org Level
13936     -------------------------------------------------------------------------------------
13937     IF( p_control_level IS NULL ) THEN
13938       RAISE e_control_level_invalid;
13939     ELSE
13940      BEGIN
13941        select lookup_code into l_control_level from fnd_lookups
13942        where lookup_type = 'EGO_PC_CONTROL_LEVEL'
13943        and lookup_code = p_control_level;
13944 
13945       EXCEPTION
13946         WHEN NO_DATA_FOUND THEN
13950 
13947           RAISE e_control_level_invalid;
13948       END;
13949     END IF;
13951     -------------------------------------------------------------------------------------
13952     -- Make sure that application_id, descriptive_flexfield_name and application_column_name were passed in
13953     -- and correspond to a valid attribute id
13954     -------------------------------------------------------------------------------------
13955 
13956 
13957     IF (p_application_column_name IS NULL OR p_descriptive_flexfield_name IS NULL OR p_application_column_name IS NULL) THEN
13958       RAISE e_no_attr_for_id_error;
13959     ELSE
13960       BEGIN
13961 
13962         -- check if there exists any attributes to be updated
13963         select attr_id into l_attr_id
13964         from EGO_FND_DF_COL_USGS_EXT
13965         where application_id = p_application_id
13966         and descriptive_flexfield_name = p_descriptive_flexfield_name
13967         and application_column_name = p_application_column_name;
13968 
13969         -- change the control level for this attribute
13970         update EGO_FND_DF_COL_USGS_EXT
13971         set control_level = p_control_level
13972         where application_id = p_application_id
13973         and descriptive_flexfield_name = p_descriptive_flexfield_name
13974         and application_column_name = p_application_column_name;
13975 
13976       EXCEPTION
13977         WHEN NO_DATA_FOUND THEN
13978           RAISE e_no_attr_for_id_error;
13979       END;
13980     END IF;
13981 
13982 
13983 
13984     -- Standard check of p_commit
13985     IF FND_API.To_Boolean(p_commit) THEN
13986       COMMIT WORK;
13987     END IF;
13988 
13989     x_return_status := FND_API.G_RET_STS_SUCCESS;
13990 
13991 
13992   EXCEPTION
13993     WHEN e_control_level_invalid THEN
13994       x_return_status := FND_API.G_RET_STS_ERROR;
13995       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CL_INVALID');
13996       FND_MSG_PUB.Add;
13997       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13998                                ,p_count   => x_msg_count
13999                                ,p_data    => x_msg_data);
14000 
14001 
14002     WHEN e_no_attr_for_id_error THEN
14003       x_return_status := FND_API.G_RET_STS_ERROR;
14004       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_NO_ATTR_FOUND');
14005       FND_MSG_PUB.Add;
14006       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
14007                                ,p_count   => x_msg_count
14008                                ,p_data    => x_msg_data);
14009 
14010 
14011 
14012     WHEN OTHERS THEN
14013       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14014 
14015       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
14016       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
14017       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
14018       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM||' '||FND_FLEX_DSC_API.Message());
14019       FND_MSG_PUB.Add;
14020       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
14021                                ,p_count   => x_msg_count
14022                                ,p_data    => x_msg_data);
14023 
14024   END Update_Attribute_Control_Level;
14025 ------------------------------------------------------------------------------------------
14026 -- Requirement:   bug: 3801472
14027 --
14028 -- Function: To return the attribute changes table for a given attribute group type.
14029 --           If the table is not defined, NULL is returned
14030 --
14031 -- Parameters:
14032 --         IN
14033 --  p_attr_group_type:  attribute_group_type
14034 --        OUT
14035 --  x_base_table     : base table for attribute_changes
14036 --  x_tl_table       : translatable table for attribute_changes
14037 --
14038 ------------------------------------------------------------------------------------------
14039 --
14040 PROCEDURE Get_Attr_Changes_Table (
14041    p_attr_group_type  IN  VARCHAR2
14042   ,x_base_table      OUT NOCOPY VARCHAR2
14043   ,x_tl_table        OUT NOCOPY VARCHAR2
14044   ) IS
14045 BEGIN
14046   -- currently all programs call this
14047   -- this need to be changed once we have decided
14048   -- where to store this meta data.
14049   IF p_attr_group_type = 'EGO_ITEMMGMT_GROUP' THEN
14050      x_base_table := 'EGO_ITEMS_ATTRS_CHANGES_B';
14051      x_tl_table   := 'EGO_ITEMS_ATTRS_CHANGES_TL';
14052    ELSE
14053     x_base_table := NULL;
14054     x_tl_table   := NULL;
14055 END IF;
14056 
14057   EXCEPTION
14058   WHEN OTHERS THEN
14059     x_base_table := NULL;
14060     x_tl_table   := NULL;
14061 END Get_Attr_Changes_Table;
14062 ------------------------------------------------------------------------------------------
14063 
14064 ------------------------------------------------------------------------------------------
14065 -- This function takes an object name and a classification code and returns the display --
14066 -- name belonging to the classification code.                                           --
14067 ------------------------------------------------------------------------------------------
14068 FUNCTION Convert_Class_Code_To_Name (
14069    p_object_name      IN VARCHAR2
14070   ,p_class_code       IN VARCHAR2
14071 ) RETURN VARCHAR2 IS
14072 
14073   l_ocv_name          VARCHAR2(30);
14074   l_class_name        VARCHAR2(40);
14075 
14076 BEGIN
14080    WHERE OBJECT_NAME = p_object_name;
14077   SELECT EXT_ATTR_OCV_NAME
14078     INTO l_ocv_name
14079     FROM EGO_FND_OBJECTS_EXT
14081 
14082   IF (p_class_code = '-1') THEN
14083     l_class_name := '-1';
14084   ELSE
14085     EXECUTE IMMEDIATE 'SELECT MEANING FROM '||l_ocv_name||' WHERE CODE = :code AND ROWNUM = 1'
14086        INTO l_class_name
14087       USING p_class_code;
14088 
14089   END IF;
14090 
14091   RETURN l_class_name;
14092 EXCEPTION
14093   WHEN OTHERS THEN
14094     RETURN NULL;
14095 END Convert_Class_Code_To_Name;
14096 
14097 ------------------------------------------------------------------------------------------
14098 -- This function takes an object name and a classification name and returns the         --
14099 -- classification code of the given classification name.                                --
14100 ------------------------------------------------------------------------------------------
14101 FUNCTION Convert_Name_To_Class_Code (
14102    p_object_name      IN VARCHAR2
14103   ,p_class_name       IN VARCHAR2
14104 ) RETURN VARCHAR2 IS
14105 
14106   l_ocv_name          VARCHAR2(30);
14107   l_class_code        VARCHAR2(40);
14108 
14109 BEGIN
14110   SELECT EXT_ATTR_OCV_NAME
14111     INTO l_ocv_name
14112     FROM EGO_FND_OBJECTS_EXT
14113    WHERE OBJECT_NAME = p_object_name;
14114 
14115   IF (p_class_name = '-1') THEN
14116     l_class_code := '-1';
14117   ELSE
14118     EXECUTE IMMEDIATE 'SELECT CODE FROM '||l_ocv_name||' WHERE MEANING = :name AND ROWNUM = 1'
14119        INTO l_class_code
14120       USING p_class_name;
14121 
14122   END IF;
14123 
14124   RETURN l_class_code;
14125 EXCEPTION
14126   WHEN OTHERS THEN
14127     RETURN NULL;
14128 END Convert_Name_To_Class_Code;
14129 
14130 -------------------------------------------------------------------------------------------
14131 -- This function calls the specified API, passing the specified attribute metadata, to   --
14132 -- determine whether the attribute is supported by application to which the API belongs. --
14133 -------------------------------------------------------------------------------------------
14134 FUNCTION Check_Supported_Attr_Usages (
14135         p_support_api                   IN   VARCHAR2
14136        ,p_application_id                IN   NUMBER
14137        ,p_attr_grp_type                 IN   VARCHAR2
14138        ,p_attr_grp_name                 IN   VARCHAR2
14139        ,p_attr_name                     IN   VARCHAR2
14140        ,p_data_level                    IN   VARCHAR2
14141        ,p_is_multi_row                  IN   VARCHAR2
14142        ,p_data_type                     IN   VARCHAR2
14143 ) RETURN VARCHAR2 IS
14144 
14145   l_ret_char_val                        VARCHAR2(1);
14146   l_string    VARCHAR2(10000);
14147 
14148 BEGIN
14149 
14150   EXECUTE IMMEDIATE
14151     'DECLARE ' ||
14152     '  l_metadata EGO_EXT_FWK_PUB.EGO_ATTR_USG_METADATA; ' ||
14153     '  l_api_ret_val VARCHAR2(1); ' ||
14154     'BEGIN ' ||
14155     '  l_api_ret_val := ''N''; ' ||
14156     '  l_metadata.application_id := :1; ' ||
14157     '  l_metadata.attr_grp_type := :2; ' ||
14158     '  l_metadata.attr_grp_name := :3; ' ||
14159     '  l_metadata.attr_name := :4; ' ||
14160     '  l_metadata.data_level := :5; ' ||
14161     '  l_metadata.is_multi_row := :6; ' ||
14162     '  l_metadata.data_type := :7; ' ||
14163     '  IF (' || p_support_api || '(l_metadata)) THEN ' ||
14164     '    l_api_ret_val := ''Y''; ' ||
14165     '  ELSE ' ||
14166     '    l_api_ret_val := ''N''; ' ||
14167     '  END IF; ' ||
14168     '  :8 := l_api_ret_val; ' ||
14169     'END;'
14170     USING IN p_application_id
14171          ,IN p_attr_grp_type
14172          ,IN p_attr_grp_name
14173          ,IN p_attr_name
14174          ,IN p_data_level
14175          ,IN p_is_multi_row
14176          ,IN p_data_type
14177          ,OUT l_ret_char_val;
14178 
14179   RETURN l_ret_char_val;
14180 
14181 EXCEPTION
14182 
14183   WHEN OTHERS THEN
14184     RETURN 'N';
14185 
14186 END Check_Supported_Attr_Usages;
14187 
14188 ------------------------------------------------------------------------------------------
14189 -- Function: To return the  pending transalatable table name  for a given attribute group type
14190 --  an the application id
14191 --           If the table is not defined, NULL is returned
14192 --
14193 -- Parameters:
14194 --         IN
14195 --  p_attr_group_type:  attribute_group_type
14196 --  p_attr_group_type      application_id
14197 --        OUT
14198 --  l_table_name     : translatable table for attribute_changes
14199 ------------------------------------------------------------------------------------------
14200 FUNCTION Get_Attr_Changes_TL_Table (
14201         p_application_id                IN   NUMBER
14202        ,p_attr_group_type               IN   VARCHAR2
14203 )
14204 RETURN VARCHAR2
14205 IS
14206 
14207     l_table_name             VARCHAR2(30);
14208     l_dynamic_sql            VARCHAR2(350);
14209 
14210   BEGIN
14211     l_dynamic_sql:='SELECT CHANGE_TL_TABLE_NAME'||
14212 '      FROM ENG_PENDING_CHANGE_CTX'||
14213 '     WHERE APPLICATION_ID = :1'||--p_application_id
14214 '    AND CHANGE_ATTRIBUTE_GROUP_TYPE =:2' ;--p_attr_group_type;
14215 
14216     EXECUTE IMMEDIATE l_dynamic_sql INTO l_table_name USING p_application_id
14217                                                             ,p_attr_group_type;
14218 
14219     RETURN l_table_name;
14220 
14221   EXCEPTION
14222     WHEN OTHERS THEN
14223       RETURN NULL;
14224 
14225 END Get_Attr_Changes_TL_Table;
14226 -------------------------------------------------------------------------------
14227 ------------------------------------------------------------------------------------------
14228 -- Function: To return the  pending base table name  for a given attribute group type
14229 --  an the application id
14230 --           If the table is not defined, NULL is returned
14231 --
14232 -- Parameters:
14233 --         IN
14234 --  p_attr_group_type:  attribute_group_type
14235 --  p_attr_group_type      application_id
14236 --        OUT
14237 --  l_table_name     : base table for attribute_changes
14238 ------------------------------------------------------------------------------------------
14239 FUNCTION Get_Attr_Changes_B_Table (
14240         p_application_id                IN   NUMBER
14241        ,p_attr_group_type               IN   VARCHAR2
14242 )
14243 RETURN VARCHAR2
14244 IS
14245 
14246     l_table_name             VARCHAR2(30);
14247     l_dynamic_sql            VARCHAR2(350);
14248 
14249   BEGIN
14250     l_dynamic_sql:='SELECT CHANGE_B_TABLE_NAME'||
14251 '      FROM ENG_PENDING_CHANGE_CTX'||
14252 '     WHERE APPLICATION_ID = :1'||--p_application_id
14253 '    AND CHANGE_ATTRIBUTE_GROUP_TYPE =:2' ;--p_attr_group_type;
14254 
14255     EXECUTE IMMEDIATE l_dynamic_sql INTO l_table_name USING p_application_id
14256                                                             ,p_attr_group_type;
14257     RETURN l_table_name;
14258 
14259   EXCEPTION
14260     WHEN OTHERS THEN
14261       RETURN NULL;
14262 END Get_Attr_Changes_B_Table;
14263 
14264 -----------------------------------------------------------------------------------------
14265 
14266 
14267 
14268 
14269 
14270 
14271 PROCEDURE Sync_Up_Attr_Metadata (
14272                                    p_source_ag_name      IN     VARCHAR2,
14273                                    p_source_ag_type      IN     VARCHAR2,
14274                                    p_source_appl_id      IN     VARCHAR2,
14275                                    p_target_ag_name      IN     VARCHAR2,
14276                                    p_target_ag_type      IN     VARCHAR2,
14277                                    p_target_appl_id      IN     VARCHAR2,
14278                                    x_return_status       OUT  NOCOPY  VARCHAR2,
14279                                    x_errorcode           OUT  NOCOPY  VARCHAR2,
14280                                    x_msg_count           OUT  NOCOPY  NUMBER,
14281                                    x_msg_data            OUT  NOCOPY  VARCHAR2
14282                                 )
14283 IS
14284 
14285  l_attr_Group_metadata_obj       EGO_ATTR_GROUP_METADATA_OBJ;
14286  l_attr_metadata_table           EGO_ATTR_METADATA_TABLE;
14287  l_return_status                 VARCHAR2(1);
14288  l_errorcode                     VARCHAR2(100);
14289  l_msg_count                     NUMBER;
14290  l_msg_data                      VARCHAR2(10000);
14291  l_col_name                      VARCHAR2(30);
14292 
14293 BEGIN
14294 
14295      l_attr_group_metadata_obj :=
14296           EGO_USER_ATTRS_COMMON_PVT.Get_Attr_Group_Metadata(
14297                                      p_application_id  => p_source_appl_id
14298                                     ,p_attr_group_type => p_source_ag_type
14299                                     ,p_attr_group_name => p_source_ag_name
14300                                     ,p_pick_from_cache => FALSE
14301                                    );
14302 
14303      IF (l_attr_group_metadata_obj IS NOT NULL ) THEN
14304        l_attr_metadata_table := l_attr_group_metadata_obj.attr_metadata_table;
14305      END IF;
14306 
14307      IF (l_attr_metadata_table IS NOT NULL) THEN
14308 
14309        FOR i IN l_attr_metadata_table.FIRST .. l_attr_metadata_table.LAST
14310        LOOP
14311 
14312           BEGIN
14313               SELECT APPLICATION_COLUMN_NAME
14314               INTO l_col_name
14315               FROM FND_DESCR_FLEX_COLUMN_USAGES
14316               WHERE APPLICATION_ID =  p_target_appl_id
14317                 AND DESCRIPTIVE_FLEXFIELD_NAME = p_target_ag_type
14318                 AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_target_ag_name
14319                 AND END_USER_COLUMN_NAME = l_attr_metadata_table(i).ATTR_NAME;
14320           EXCEPTION
14321            WHEN OTHERS THEN
14322              l_col_name := NULL;
14323           END;
14324 
14325           IF (l_col_name IS NOT NULL) THEN
14326 
14327             Update_Attribute (
14328                p_api_version              => 1.0
14329               ,p_application_id           => p_target_appl_id
14330               ,p_attr_group_type          => p_target_ag_type
14331               ,p_attr_group_name          => p_target_ag_name
14332               ,p_internal_name            => l_attr_metadata_table(i).ATTR_NAME
14333               ,p_display_name             => l_attr_metadata_table(i).ATTR_DISP_NAME
14334               ,p_description              => NULL
14335               ,p_sequence                 => l_attr_metadata_table(i).SEQUENCE
14336               ,p_required                 => l_attr_metadata_table(i).REQUIRED_FLAG
14337               ,p_searchable               => NULL
14338               ,p_column                   => l_col_name
14339               ,p_value_set_id             => l_attr_metadata_table(i).VALUE_SET_ID
14340               ,p_info_1                   => l_attr_metadata_table(i).INFO_1
14341               ,p_default_value            => l_attr_metadata_table(i).DEFAULT_VALUE
14342               ,p_enabled                  => NULL
14343               ,p_display                  => NULL
14344               ,p_view_in_hierarchy_code   => NULL
14345               ,p_edit_in_hierarchy_code   => NULL
14346               ,p_uom_class                => l_attr_metadata_table(i).UNIT_OF_MEASURE_CLASS
14347               ,x_return_status            => l_return_status
14348               ,x_errorcode                => l_errorcode
14349               ,x_msg_count                => l_msg_count
14350               ,x_msg_data                 => l_msg_data
14351               );
14352 
14353             x_msg_count := l_msg_count + NVL(x_msg_count,0);
14354             x_msg_data := x_msg_data || l_msg_data;
14355             x_errorcode := x_errorcode || l_errorcode;
14356 
14357             IF (x_return_status IS NULL) THEN
14358               x_return_status := l_return_status;
14359             END IF;
14360 
14361             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
14362                x_return_status := l_return_status;
14363             END IF;
14364 
14365          END IF;
14366 
14367        END LOOP;
14368 
14369      END IF;
14370 
14371 END Sync_Up_Attr_Metadata;
14372 
14373 --Method for concatenating DataLevels, R12C changes--
14374 FUNCTION Concat_Data_Level_DisplayNames (p_attr_grp_id IN NUMBER)
14375 RETURN VARCHAR2 IS
14376 
14377     CURSOR c_data_levels(p_attr_grp_id IN NUMBER) IS
14378     SELECT DL_TL.user_data_level_name  data_level_name
14379     FROM EGO_ATTR_GROUP_DL AG_DL, EGO_DATA_LEVEL_B DL_B, EGO_DATA_LEVEL_TL DL_TL
14380     WHERE AG_DL.data_level_id = DL_B.data_level_id
14381     AND DL_B.data_level_id = DL_TL.data_level_id
14382     AND UserEnv('LANG')=LANGUAGE
14383     AND AG_DL.attr_group_id = p_attr_grp_id;
14384 
14385     l_data_levels VARCHAR2(4000) := '';
14386 
14387  BEGIN
14388 
14389     FOR i IN c_data_levels(p_attr_grp_id) LOOP
14390     l_data_levels :=  l_data_levels || ',' || i.data_level_name;
14391     END LOOP;
14392     l_data_levels := SubStr(l_data_levels,2);
14393     RETURN l_data_levels;
14394 
14395  END;
14396 
14397 END EGO_EXT_FWK_PUB;
14398