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.95.12020000.6 2012/11/29 10:35:09 lifcheng ship $ */
3 
4 
5                 ------------------------------------
6                 -- Global Variables and Constants --
7                 ------------------------------------
8   G_PKG_NAME           CONSTANT VARCHAR2(30)   := 'EGO_EXT_FWK_PUB';
9   G_APP_NAME           CONSTANT  VARCHAR2(3)   := 'EGO';
10   G_PKG_NAME_TOKEN     CONSTANT  VARCHAR2(8)   := 'PKG_NAME';
11   G_API_NAME_TOKEN     CONSTANT  VARCHAR2(8)   := 'API_NAME';
12   G_SQL_ERR_MSG_TOKEN  CONSTANT  VARCHAR2(11)  := 'SQL_ERR_MSG';
13   G_PLSQL_ERR          CONSTANT  VARCHAR2(17)  := 'EGO_PLSQL_ERR';
14 
15   G_CURRENT_USER_ID          NUMBER := FND_GLOBAL.User_Id;
16   G_CURRENT_LOGIN_ID         NUMBER := FND_GLOBAL.Login_Id;
17 
18   -- For use with error-reporting --
19   G_ADD_ERRORS_TO_FND_STACK  CONSTANT VARCHAR2(1) := 'Y';
20   G_DUMMY_ENTITY_INDEX       NUMBER;
21   G_DUMMY_ENTITY_ID          VARCHAR2(50);
22   G_DUMMY_MESSAGE_TYPE       VARCHAR2(1);
23 
24 
25                     --------------------------
26                     -- Package-Private APIs --
27                     --------------------------
28 
29 procedure code_debug (msg VARCHAR2) IS
30 BEGIN
31 --  IF msg like '%Delete_Association%' THEN
32 --    sri_debug(G_PKG_NAME||' '||msg);
33 --  END IF;
34   NULL;
35 END;
36 
37 /*-----------------------------------------------------------------------------
38 
39   DESCRIPTION
40     Converts a SELECT expression to its correct data type.
41 
42   BUG FIX
43     6319734
44 
45   PARAMETERS
46     See below.
47 
48   AUTHOR
49     ssarnoba
50 
51   NOTES
52 
53 -----------------------------------------------------------------------------*/
54 PROCEDURE Convert_Child_VS_Select_Expr (
55     p_parent_vs_row           IN            ego_value_sets_v%ROWTYPE
56   , p_convert_date            IN            VARCHAR2   :=  FND_API.G_FALSE
57   , x_column_name             IN OUT NOCOPY VARCHAR2
58 )
59 IS
60 BEGIN
61 
62   -- If the value set is not of data type character, conversion is needed.
63   IF ( p_parent_vs_row.FORMAT_CODE = G_NUMBER_DATA_TYPE ) THEN
64     x_column_name      := 'TO_NUMBER(' || x_column_name  || ')';
65 
66   ELSIF
67     (( p_parent_vs_row.FORMAT_CODE = G_DATE_DATA_TYPE      OR
68        p_parent_vs_row.FORMAT_CODE = G_DATE_TIME_DATA_TYPE ) AND
69                     p_convert_date = FND_API.G_TRUE )
70   THEN
71     -- Generally this is done later on so we don't do the conversion
72     -- unless forced by p_convert_date.
73     x_column_name      := 'TO_DATE('   || x_column_name || ',''' ||
74                                    EGO_USER_ATTRS_COMMON_PVT.G_DATE_FORMAT ||
75                                                           ''')';
76 
77   ELSE
78     x_column_name      :=   x_column_name ;
79   END IF;
80 
81 END Convert_Child_VS_Select_Expr;
82 
83 
84 /*-----------------------------------------------------------------------------
85 
86   DESCRIPTION
87     Builds the SELECT clause expressions for a child value set definition that
88     gets inserted into FND_FLEX_VALIDATION_TABLES.
89 
90   BUG FIX
91     6319734
92 
93   PARAMETERS
94     See below.
95 
96   AUTHOR
97     ssarnoba
98 
99   NOTES
100     The ID_COLUMN_NAME and VALUE_COLUMN_NAME values ultimately appears in a
101     SELECT clause to represent the value set. These child value set values
102     require conversion to their true data type for the values to be read
103     correctly in the Java layer.
104 
105 -----------------------------------------------------------------------------*/
106 PROCEDURE Build_Child_VS_Select_Exprs (
107     p_parent_vs_row       IN  ego_value_sets_v%ROWTYPE
108   , x_id_column_type      OUT NOCOPY fnd_flex_validation_tables.id_column_type%TYPE
109   , x_value_column_type   OUT NOCOPY fnd_flex_validation_tables.value_column_type%TYPE
110   , x_id_column_name      OUT NOCOPY fnd_flex_validation_tables.id_column_name%TYPE
111   , x_value_column_name   OUT NOCOPY fnd_flex_validation_tables.value_column_name%TYPE
112 )
113 IS
114 BEGIN
115 
116   ----------------------------------------------------------------------------
117   -- 1. FND_FLEX_VALIDATION_TABLES                                          --
118   --      - ID_COLUMN_NAME                                                  --
119   --      - ID_COLUMN_TYPE                                                  --
120   ----------------------------------------------------------------------------
121 
122   -- ID_COLUMN_TYPE must ALWAYS be the true data type of the value set
123   x_id_column_type             := p_parent_vs_row.FORMAT_CODE;
124 
125 
126   -- Set the value for ID_COLUMN_NAME
127   x_id_column_name             := 'vsv.INTERNAL_NAME';
128 
129   -- Convert ID_COLUMN_NAME if necessary
130   Convert_Child_VS_Select_Expr (
131      p_parent_vs_row            => p_parent_vs_row
132    , p_convert_date             => FND_API.G_FALSE
133    , x_column_name              => x_id_column_name
134   );
135 
136   ----------------------------------------------------------------------------
137   -- 2. FND_FLEX_VALIDATION_TABLES                                          --
138   --      - VALUE_COLUMN_NAME                                               --
139   --      - VALUE_COLUMN_TYPE                                               --
140   ----------------------------------------------------------------------------
141 
142   -- Initialize VALUE_COLUMN_NAME
143   x_value_column_name          := 'vsv.DISPLAY_NAME';
144 
145   -- Value set's validation type is Translatable Independent
146   IF ( p_parent_vs_row.VALIDATION_CODE_ADMIN = G_TRANS_IND_VALIDATION_CODE   )
147   THEN
148 
149     -- The value of VALUE_COLUMN_NAME will always be of type character since
150     -- it's used purely for display.
151     x_value_column_type        := G_CHAR_DATA_TYPE;
152 
153   -- Value set's validation type is Independent
154   ELSIF
155      ( p_parent_vs_row.VALIDATION_CODE_ADMIN = G_INDEPENDENT_VALIDATION_CODE )
156   THEN
157 
158     -- The value of VALUE_COLUMN_NAME will have the true data type of the value
159     -- set, so a conversion will be necessary as per ID_COLUMN_...
160     x_value_column_type        := x_id_column_type;
161 
162     -- Convert the value for VALUE_COLUMN_NAME if necessary
163     Convert_Child_VS_Select_Expr (
164        p_parent_vs_row            => p_parent_vs_row
165      , p_convert_date             => FND_API.G_TRUE
166      , x_column_name              => x_value_column_name
167     );
168 
169   END IF;
170 
171 END Build_Child_VS_Select_Exprs;
172 
173 
174 /*-----------------------------------------------------------------------------
175 
176   DESCRIPTION
177 
178     Inserts a space before an ORDER BY clause, so that order by elimination
179     takes place for inner query blocks.
180 
181   BUG FIX
182     6148833
183 
184   PARAMETERS
185     See below.
186 
187 -----------------------------------------------------------------------------*/
188 PROCEDURE Insert_Order_By_Space (
189   p_where_order_by           IN OUT NOCOPY  VARCHAR2
190 )
191 IS
192 BEGIN
193 
194   -- Insert a space before an ORDER BY clause, so that ORDER BY elimination
195   -- takes place for inner query blocks
196   p_where_order_by := regexp_replace(
197     p_where_order_by,                                           -- input string
198     '\)(O)',                                                -- pattern to match
199     ') \1',                                               -- replacement string
200     1,                               -- begin the search at the first character
201     0,                                 -- replaces all occurrences of the match
202     'i');                                          -- case insensitive matching
203 
204 END Insert_Order_By_Space;
205 
206 ----------------------------------------------------------------------
207 --R12C
208 -- call this API to delete all visibility for a given Action
209 PROCEDURE Delete_Action_Data_Level (
210         p_api_version                   IN   NUMBER
211        ,p_action_id                     IN   NUMBER
212        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
213        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
214        ,x_return_status                 OUT NOCOPY VARCHAR2
215        ,x_errorcode                     OUT NOCOPY NUMBER
216        ,x_msg_count                     OUT NOCOPY NUMBER
217        ,x_msg_data                      OUT NOCOPY VARCHAR2
218 ) IS
219 
220     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Action_Data_Level';
221 
222     --we don't use l_api_version yet, but eventually we might:
223     --if we change required parameters, version goes FROM n.x to (n+1).x
224     --if we change optional parameters, version goes FROM x.n to x.(n+1)
225     l_api_version            CONSTANT NUMBER := 1.0;
226 
227   BEGIN
228     code_debug ( l_api_name || ' Start ');
229     -- Standard start of API savepoint
230     IF FND_API.To_Boolean(p_commit) THEN
231       SAVEPOINT Delete_Action_Data_Level;
232     END IF;
233 
234     -- Check for call compatibility
235     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
236                                         l_api_name, G_PKG_NAME)
237     THEN
238       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
239     END IF;
240     -- Initialize message list even though we don't currently use it
241     IF FND_API.To_Boolean(p_init_msg_list) THEN
242       FND_MSG_PUB.Initialize;
243     END IF;
244 
245     DELETE FROM EGO_ACTIONS_DL
246     WHERE ACTION_ID = p_action_id;
247 
248     -- Standard check of p_commit
249     IF FND_API.To_Boolean(p_commit) THEN
250       COMMIT WORK;
251     END IF;
252     x_return_status := FND_API.G_RET_STS_SUCCESS;
253     code_debug ( l_api_name || ' Exiting with status: '||x_return_status);
254 
255   EXCEPTION
256     WHEN OTHERS THEN
257       IF FND_API.To_Boolean(p_commit) THEN
258         ROLLBACK TO Delete_Action_Data_Level;
259       END IF;
260       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
261 
262       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
263       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
264       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
265       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
266       FND_MSG_PUB.Add;
267       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
268                                ,p_count   => x_msg_count
269                                ,p_data    => x_msg_data);
270 
271 
272 END Delete_Action_Data_Level;
273 
274 ----------------------------------------------------------------------
275 
276 
277 
278 FUNCTION Execute_DDL_And_Return_Err (
279         p_ddl_to_execute                IN   VARCHAR2
280 )
281 RETURN VARCHAR2
282 IS
283 
284     PRAGMA AUTONOMOUS_TRANSACTION;
285     l_sqlerrm                VARCHAR2(1000);
286 
287   BEGIN
288 
289     EXECUTE IMMEDIATE p_ddl_to_execute;
290     RETURN NULL;
291 
292   EXCEPTION
293     WHEN OTHERS THEN
294       l_sqlerrm := SQLERRM;
295       RETURN l_sqlerrm;
296 
297 END Execute_DDL_And_Return_Err;
298 
299 --new function created to use ad_ddl
300 ----bugfix 11907422 for 12.2 AD_DDL changes
301 FUNCTION Execute_AD_DDL_And_Return_Err (
302         p_ddl_sql               IN   VARCHAR2,
303   p_object_owner          IN   VARCHAR2,
304   p_object_name           IN   VARCHAR2,
305   p_ad_ddl_cmd            IN   VARCHAR2
306 )
307 RETURN VARCHAR2
308 IS
309 
310     PRAGMA AUTONOMOUS_TRANSACTION;
311     l_sqlerrm                VARCHAR2(1000);
312 
313     fnd_apps_schema      VARCHAR2(30) := NULL;
314     h_status             VARCHAR2(2000);
315     h_industry           VARCHAR2(2000);
316     h_x                  BOOLEAN;
317 
318 
319   BEGIN
320 
321 
322     h_x := FND_INSTALLATION.Get_App_Info('FND', h_status, h_industry, fnd_apps_schema);
323 
324     AD_DDL.DO_DDL(fnd_apps_schema, p_object_owner, p_ad_ddl_cmd,p_ddl_sql,p_object_name);
325     RETURN NULL;
326 
327   EXCEPTION
328     WHEN OTHERS THEN
329       l_sqlerrm := SQLERRM||AD_DDL.ERROR_BUF;
330       RETURN l_sqlerrm;
331 
332 END Execute_AD_DDL_And_Return_Err;
333 
334 ---------------------------------------------------------------------
335 -- Requirement:   bug: 3542670
336 --
337 -- Function: To return the where clause from long column as VARCHAR2
338 --           In case of any exceptions, NULL is returned
339 --
340 -- Parameters:
341 --         IN
342 --  p_value_set_id   : value set id
343 --        OUT
344 --  NONE
345 --
346 ---------------------------------------------------------------------
347 FUNCTION get_vs_table_where_clause (p_value_set_id  IN  NUMBER)
348 RETURN VARCHAR2 IS
349   l_addl_where_clause LONG;
350 BEGIN
351   SELECT additional_where_clause
352   INTO l_addl_where_clause
353   FROM fnd_flex_validation_tables
354   WHERE flex_value_set_id = p_value_set_id;
355   RETURN l_addl_where_clause;
356 EXCEPTION
357   WHEN OTHERS THEN
358     RETURN NULL;
359 END get_vs_table_where_clause;
360 
361 ---------------------------------------------------------------------
362 -- Requirement:   bug: 3542670
363 --
364 -- Function: To get the validation type of a value set.
365 --           If the user passes value_set_id and value_set_name,
366 --           value_set_id takes precedence.
367 --
368 -- Parameters:
369 --         IN
370 --  p_value_set_id   : value set id
371 --  p_value_set_name : value set name
372 --        OUT
373 --  NONE
374 --
375 ---------------------------------------------------------------------
376 FUNCTION get_vs_validation_type (p_value_set_id   IN  NUMBER
377                                 ,p_value_set_name IN  VARCHAR2
378                                 ) RETURN VARCHAR2 IS
379   l_return_value  fnd_flex_value_sets.validation_type%TYPE;
380 BEGIN
381   l_return_value := NULL;
382   IF p_value_set_id IS NOT NULL THEN
383     SELECT validation_type
384     INTO l_return_value
385     FROM fnd_flex_value_sets
386     WHERE flex_value_set_id = p_value_set_id;
387   ELSIF p_value_set_name IS NOT NULL THEN
388     SELECT validation_type
389     INTO l_return_value
390     FROM fnd_flex_value_sets
391     WHERE flex_value_set_name = p_value_set_name;
392   END IF;
393   RETURN l_return_value;
394 EXCEPTION
395   WHEN OTHERS THEN
396     RETURN l_return_value;
397 END get_vs_validation_type;
398 
399 
400 ------------------------------------------------------------------------------------------
401 -- Function: To return whether a record exists for the  given unique key combination
402 --           in FND and EGO Tables
403 --           If the table is not defined, NULL is returned
404 --
405 -- Parameters:
406 --         IN
407 --  p_context:  ATTRIBUTE or ATTRIBUTE GROUP
408 --  p_application_id      application_id
409 --  p_attr_group_type     Attribute Group Type
410 --  p_attr_group_name     Attribute Group Name
411 --  p_internal_name       Intenral Name of Either Attribute or Attribute group.
412 --        OUT
413 --  x_fnd_exists     : Y if record exists else N
414 --  x_ego_exists     : Y if record exists else N
415 ------------------------------------------------------------------------------------------
416 PROCEDURE Get_fnd_ego_record_exists (
417          p_context         IN VARCHAR2
418         ,p_application_id  IN NUMBER
419         ,p_attr_group_type IN VARCHAR2
420         ,p_attr_group_name IN VARCHAR2
421         ,p_internal_name   IN VARCHAR2
422         ,x_fnd_exists      OUT NOCOPY  VARCHAR2
423         ,x_ego_exists      OUT NOCOPY  VARCHAR2
424 )IS
425 
426 BEGIN
427 
428    IF (p_context = 'ATTRIBUTE GROUP') THEN
429       BEGIN
430          SELECT 'Y' INTO x_fnd_exists
431          FROM FND_DESCR_FLEX_CONTEXTS
432          WHERE APPLICATION_ID = p_application_id
433          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
434          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name;
435        EXCEPTION
436           WHEN OTHERS THEN
437              x_fnd_exists :='N';
438        END;
439        BEGIN
440          SELECT 'Y' INTO  x_ego_exists
441          FROM EGO_FND_DSC_FLX_CTX_EXT
442          WHERE APPLICATION_ID = p_application_id
443          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
444          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name;
445        EXCEPTION
446          WHEN OTHERS THEN
447              x_ego_exists :='N';
448         END;
449    ELSIF (p_context = 'ATTRIBUTE') THEN
450       BEGIN
451          SELECT 'Y' INTO x_fnd_exists
452          FROM FND_DESCR_FLEX_COLUMN_USAGES
453          WHERE APPLICATION_ID = p_application_id
454          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
455          AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
456          AND END_USER_COLUMN_NAME = p_internal_name;
457       EXCEPTION
458           WHEN OTHERS THEN
459             x_fnd_exists :='N';
460       END;
461       BEGIN
462          SELECT 'Y' INTO x_ego_exists
463          FROM EGO_FND_DF_COL_USGS_EXT ext
464         ,FND_DESCR_FLEX_COLUMN_USAGES fl_col
465          WHERE ext.APPLICATION_ID (+) = fl_col.APPLICATION_ID
466          AND ext.DESCRIPTIVE_FLEXFIELD_NAME (+) = fl_col.DESCRIPTIVE_FLEXFIELD_NAME
467          AND ext.DESCRIPTIVE_FLEX_CONTEXT_CODE (+) = fl_col.DESCRIPTIVE_FLEX_CONTEXT_CODE
468          AND ext.APPLICATION_COLUMN_NAME (+) = fl_col.APPLICATION_COLUMN_NAME
469          AND ext.APPLICATION_ID = p_application_id
470          AND ext.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
471          AND ext.DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
472          AND fl_col.END_USER_COLUMN_NAME = p_internal_name;
473       EXCEPTION
474         WHEN OTHERS THEN
475           x_ego_exists:='N';
476       END;
477    END IF;
478 
479 
480 EXCEPTION
481    WHEN OTHERS THEN
482        x_fnd_exists := NULL;
483        x_ego_exists := NULL;
484 END Get_fnd_ego_record_exists;
485 
486 --Bug 5443697
487 ------------------------------------------------------------------------------------------
488 -- Procedure: To set the variable x_start_num to 'Y' or 'N' based in whether the
489 --            String that is passed contains Number as the starting character.
490 --
491 -- Parameters:
492 --         IN
493 --  p_internal_name:      the internal name of the Attribute group/Attribute
494 --        OUT
495 --  x_start_num     : Y if the starting character is number else N
496 ------------------------------------------------------------------------------------------
497 
498 PROCEDURE has_Num_Start_char (
499                               p_internal_name  IN VARCHAR2,
500                               x_start_num OUT  NOCOPY VARCHAR2
501 )IS
502   l_start_char VARCHAR2(10);
503   l_internal_name VARCHAR2 (1000);
504 
505   BEGIN
506      l_internal_name:=p_internal_name;
507      IF (l_internal_name IS null) THEN
508        x_start_num :='N';
509      END IF;
510      l_internal_name:=trim(l_internal_name);
511      l_start_char:=substr(l_internal_name,1,1);
512 
513      IF  l_start_char IN ('0','1','2','3','4','5','6','7','8','9') THEN
514        x_start_num := 'Y';
515      ELSE
516        x_start_num :='N';
517      END IF;
518   EXCEPTION
519     WHEN OTHERS THEN
520           x_start_num:='N';
521           NULL;
522 END has_Num_Start_char;
523 
524 --Bug 5443697
525 ------------------------------------------------------------------------------------------
526 -- Procedure: To set the variable x_start_num to 'Y' or 'N' based in whether the
527 --            String that is passed contains under score as the starting character.
528 --
529 -- Parameters:
530 --         IN
531 --  p_internal_name:      the internal name of the Attribute group/Attribute
532 --  p_char_set:           the character set to be checked
533 --        OUT
534 --  x_start_und_sc     : Y if the starting character is equal to the p_char_set else N
535 ------------------------------------------------------------------------------------------
536 
537 PROCEDURE has_Given_Char_As_Start_char (
538                               p_internal_name  IN VARCHAR2,
539                               p_char_set IN VARCHAR2,
540                               x_start_und_sc OUT  NOCOPY VARCHAR2
541 )IS
542   l_start_char VARCHAR2(10);
543   l_internal_name VARCHAR2 (1000);
544 
545   BEGIN
546      l_internal_name:=p_internal_name;
547      IF (l_internal_name IS null) THEN
548        x_start_und_sc :='N';
549      END IF;
550      l_internal_name:=trim(l_internal_name);
551      l_start_char:=substr(l_internal_name,1,1);
552 
553      IF  (l_start_char = p_char_set) THEN
554        x_start_und_sc := 'Y';
555      ELSE
556        x_start_und_sc :='N';
557      END IF;
558   EXCEPTION
559     WHEN OTHERS THEN
560           x_start_und_sc:='N';
561           NULL;
562 END has_Given_Char_As_Start_char;
563 
564 
565 
566 ---------------------------------------------------------------------
567 -- Requirement:   bug: 3542670
568 --
569 -- Function: To process value set values.
570 --           Given all the parameters, the data is inserted into
571 --           FND_FLEX_VALUES and FND_FLEX_VALUES_TL
572 --
573 -- Parameters:
574 --         IN
575 --  p_transaction_type : CREATE, UPDATE
576 --  p_value_set_name   : value set name
577 --  p_internal_name    : flex value
578 --  p_display_name     : flex value meaning
579 --  p_description      : flex value description
580 --  p_sequence         : sequence of display -- APC column
581 --  p_start_date       : start date
582 --  p_end_date         : end date
583 --  p_enabled          : enabled flag
584 --        OUT
585 --  x_return_status                 OUT NOCOPY VARCHAR2
586 --
587 ---------------------------------------------------------------------
588 PROCEDURE Process_Value_Set_Val (
589         p_transaction_type              IN   VARCHAR2
590        ,p_value_set_name                IN   VARCHAR2
591        ,p_internal_name                 IN   VARCHAR2
592        ,p_display_name                  IN   VARCHAR2
593        ,p_description                   IN   VARCHAR2
594        ,p_sequence                      IN   NUMBER
595        ,p_start_date                    IN   DATE
596        ,p_end_date                      IN   DATE
597        ,p_enabled                       IN   VARCHAR2
598        ,p_owner                         IN   NUMBER  DEFAULT NULL
599        ,x_return_status                 OUT NOCOPY VARCHAR2
600 ) IS
601 
602     l_api_name               VARCHAR2(30);
603     l_flex_value_id          FND_FLEX_VALUES.flex_value_id%TYPE;
604     l_value_set_id           FND_FLEX_VALUES.flex_value_set_id%TYPE;
605     l_Sysdate                DATE;
606     l_rowid                  VARCHAR2(100);
607 
608     l_validation_type        fnd_flex_value_sets.validation_type%TYPE;
609     l_storage_value          VARCHAR2(32767);
610     l_msg_count              NUMBER;
611     l_msg_data               VARCHAR2(32767);
612     l_owner                  NUMBER;
613     --bug 13629961
614      l_rec_fnd_flex_values    FND_FLEX_VALUES%ROWTYPE;
615 
616 BEGIN
617 
618   l_api_name      := 'PVT_Process_Value_Set_Val';
619   code_debug (l_api_name||' invoked with parameters -- p_transaction_type: '||p_transaction_type);
620   code_debug (' p_value_set_name: '||p_value_set_name||' p_internal_name: '||p_internal_name||' p_display_name: '||p_display_name);
621   code_debug (' p_sequence: '||p_sequence||' p_start_date: '||p_start_date||' p_end_date: '||p_end_date);
622   code_debug (' p_enabled: '||p_enabled||' p_description: '||p_description);
623 
624   l_validation_type :=  get_vs_validation_type (p_value_set_id  => NULL
625                                      ,p_value_set_name => p_value_set_name
626                             );
627 
628   IF (p_owner IS NULL OR p_owner = -1) THEN
629     l_owner := g_current_user_id;
630   ELSE
631     l_owner := p_owner;
632   END IF;
633 
634   IF NVL(l_validation_type, 'A') NOT IN (G_TABLE_VALIDATION_CODE,
635                                          G_INDEPENDENT_VALIDATION_CODE,
636                                          G_NONE_VALIDATION_CODE,
637                                          G_TRANS_IND_VALIDATION_CODE) THEN
638     -- not currently supported in EGO
639     x_return_status := FND_API.G_RET_STS_ERROR;
640   END IF;
641 
642 --  IF l_validation_type = G_TRANS_IND_VALIDATION_CODE THEN
643     l_Sysdate  := SYSDATE;
644     SELECT flex_value_set_id
645     INTO l_value_set_id
646     FROM fnd_flex_value_sets
647     WHERE flex_value_set_name = p_value_set_name;
648 
649     IF p_transaction_type = 'CREATE'  THEN
650       -- create an translatable independent value set
651       SELECT fnd_flex_values_s.NEXTVAL
652       INTO l_flex_value_id
653       FROM dual;
654       FND_FLEX_VALUES_PKG.INSERT_ROW
655         (x_rowid                    => l_rowid
656         ,x_flex_value_id            => l_flex_value_id
657         ,x_attribute_sort_order     => NULL
658         ,x_flex_value_set_id        => l_value_set_id
659         ,x_flex_value               => p_internal_name
660         ,x_enabled_flag             => NVL(p_enabled,'Y')
661         ,x_summary_flag             => 'N'
662         ,x_start_date_active        => p_start_date
663         ,x_end_date_active          => p_end_date
664         ,x_parent_flex_value_low    => NULL
665         ,x_parent_flex_value_high   => NULL
666         ,x_structured_hierarchy_level => NULL
667         ,x_hierarchy_level            => NULL
668         ,x_compiled_value_attributes  => NULL
669         ,x_value_category             => NULL
670         ,x_attribute1                 => NULL
671         ,x_attribute2                 => NULL
672         ,x_attribute3                 => NULL
673         ,x_attribute4                 => NULL
674         ,x_attribute5                 => NULL
675         ,x_attribute6                 => NULL
676         ,x_attribute7                 => NULL
677         ,x_attribute8                 => NULL
678         ,x_attribute9                 => NULL
679         ,x_attribute10                => NULL
680         ,x_attribute11                => NULL
681         ,x_attribute12                => NULL
682         ,x_attribute13                => NULL
683         ,x_attribute14                => NULL
684         ,x_attribute15                => NULL
685         ,x_attribute16                => NULL
686         ,x_attribute17                => NULL
687         ,x_attribute18                => NULL
688         ,x_attribute19                => NULL
689         ,x_attribute20                => NULL
690         ,x_attribute21                => NULL
691         ,x_attribute22                => NULL
692         ,x_attribute23                => NULL
693         ,x_attribute24                => NULL
694         ,x_attribute25                => NULL
695         ,x_attribute26                => NULL
696         ,x_attribute27                => NULL
697         ,x_attribute28                => NULL
698         ,x_attribute29                => NULL
699         ,x_attribute30                => NULL
700         ,x_attribute31                => NULL
701         ,x_attribute32                => NULL
702         ,x_attribute33                => NULL
703         ,x_attribute34                => NULL
704         ,x_attribute35                => NULL
705         ,x_attribute36                => NULL
706         ,x_attribute37                => NULL
707         ,x_attribute38                => NULL
708         ,x_attribute39                => NULL
709         ,x_attribute40                => NULL
710         ,x_attribute41                => NULL
711         ,x_attribute42                => NULL
712         ,x_attribute43                => NULL
713         ,x_attribute44                => NULL
714         ,x_attribute45                => NULL
715         ,x_attribute46                => NULL
716         ,x_attribute47                => NULL
717         ,x_attribute48                => NULL
718         ,x_attribute49                => NULL
719         ,x_attribute50                => NULL
720         ,x_flex_value_meaning         => p_display_name
721         ,x_description                => p_description
722         ,x_creation_date              => l_sysdate
723         ,x_created_by                 => l_owner
724         ,x_last_update_date           => l_sysdate
725         ,x_last_updated_by            => l_owner
726         ,x_last_update_login          => G_CURRENT_LOGIN_ID);
727 
728     ELSIF p_transaction_type = 'UPDATE' THEN
729       --bug 13629961
730       --When some Attribute has value, it is overridden with NULL value,hence getting the value from table and resetting
731       SELECT *
732       INTO l_rec_fnd_flex_values
733       FROM fnd_flex_values
734       WHERE flex_value_set_id = l_value_set_id
735         AND flex_value = p_internal_name;
736 
737       FND_FLEX_VALUES_PKG.UPDATE_ROW
738         (x_flex_value_id            =>l_rec_fnd_flex_values.FLEX_VALUE_ID
739         ,x_attribute_sort_order     => NULL
740         ,x_flex_value_set_id        => l_value_set_id
741         ,x_flex_value               => p_internal_name
742         ,x_enabled_flag             => p_enabled
743         ,x_summary_flag             => 'N'
744         ,x_start_date_active        => p_start_date
745         ,x_end_date_active          => p_end_date
746         ,x_parent_flex_value_low    =>l_rec_fnd_flex_values.PARENT_FLEX_VALUE_LOW
747         ,x_parent_flex_value_high   =>l_rec_fnd_flex_values.PARENT_FLEX_VALUE_HIGH
748         ,x_structured_hierarchy_level =>l_rec_fnd_flex_values.STRUCTURED_HIERARCHY_LEVEL
749         ,x_hierarchy_level            => l_rec_fnd_flex_values.HIERARCHY_LEVEL
750         ,x_compiled_value_attributes  =>l_rec_fnd_flex_values.COMPILED_VALUE_ATTRIBUTES
751         ,x_value_category             => l_rec_fnd_flex_values.VALUE_CATEGORY
752         ,x_attribute1                 => l_rec_fnd_flex_values.ATTRIBUTE1
753         ,x_attribute2                 => l_rec_fnd_flex_values.ATTRIBUTE2
754         ,x_attribute3                 => l_rec_fnd_flex_values.ATTRIBUTE3
755         ,x_attribute4                 => l_rec_fnd_flex_values.ATTRIBUTE4
756         ,x_attribute5                 => l_rec_fnd_flex_values.ATTRIBUTE5
757         ,x_attribute6                 => l_rec_fnd_flex_values.ATTRIBUTE6
758         ,x_attribute7                 => l_rec_fnd_flex_values.ATTRIBUTE7
759         ,x_attribute8                 => l_rec_fnd_flex_values.ATTRIBUTE8
760         ,x_attribute9                 => l_rec_fnd_flex_values.ATTRIBUTE9
761         ,x_attribute10                => l_rec_fnd_flex_values.ATTRIBUTE10
762         ,x_attribute11                => l_rec_fnd_flex_values.ATTRIBUTE11
763         ,x_attribute12                => l_rec_fnd_flex_values.ATTRIBUTE12
764         ,x_attribute13                => l_rec_fnd_flex_values.ATTRIBUTE13
765         ,x_attribute14                => l_rec_fnd_flex_values.ATTRIBUTE14
766         ,x_attribute15                => l_rec_fnd_flex_values.ATTRIBUTE15
767         ,x_attribute16                => l_rec_fnd_flex_values.ATTRIBUTE16
768         ,x_attribute17                => l_rec_fnd_flex_values.ATTRIBUTE17
769         ,x_attribute18                => l_rec_fnd_flex_values.ATTRIBUTE18
770         ,x_attribute19                => l_rec_fnd_flex_values.ATTRIBUTE19
771         ,x_attribute20                => l_rec_fnd_flex_values.ATTRIBUTE20
772         ,x_attribute21                => l_rec_fnd_flex_values.ATTRIBUTE21
773         ,x_attribute22                => l_rec_fnd_flex_values.ATTRIBUTE22
774         ,x_attribute23                => l_rec_fnd_flex_values.ATTRIBUTE23
775         ,x_attribute24                => l_rec_fnd_flex_values.ATTRIBUTE24
776         ,x_attribute25                => l_rec_fnd_flex_values.ATTRIBUTE25
777         ,x_attribute26                => l_rec_fnd_flex_values.ATTRIBUTE26
778         ,x_attribute27                => l_rec_fnd_flex_values.ATTRIBUTE27
779         ,x_attribute28                => l_rec_fnd_flex_values.ATTRIBUTE28
780         ,x_attribute29                => l_rec_fnd_flex_values.ATTRIBUTE29
781         ,x_attribute30                => l_rec_fnd_flex_values.ATTRIBUTE30
782         ,x_attribute31                => l_rec_fnd_flex_values.ATTRIBUTE31
783         ,x_attribute32                => l_rec_fnd_flex_values.ATTRIBUTE32
784         ,x_attribute33                => l_rec_fnd_flex_values.ATTRIBUTE33
785         ,x_attribute34                => l_rec_fnd_flex_values.ATTRIBUTE34
786         ,x_attribute35                => l_rec_fnd_flex_values.ATTRIBUTE35
787         ,x_attribute36                => l_rec_fnd_flex_values.ATTRIBUTE36
788         ,x_attribute37                => l_rec_fnd_flex_values.ATTRIBUTE37
789         ,x_attribute38                => l_rec_fnd_flex_values.ATTRIBUTE38
790         ,x_attribute39                => l_rec_fnd_flex_values.ATTRIBUTE39
791         ,x_attribute40                => l_rec_fnd_flex_values.ATTRIBUTE40
792         ,x_attribute41                => l_rec_fnd_flex_values.ATTRIBUTE41
793         ,x_attribute42                => l_rec_fnd_flex_values.ATTRIBUTE42
794         ,x_attribute43                => l_rec_fnd_flex_values.ATTRIBUTE43
795         ,x_attribute44                => l_rec_fnd_flex_values.ATTRIBUTE44
796         ,x_attribute45                => l_rec_fnd_flex_values.ATTRIBUTE45
797         ,x_attribute46                => l_rec_fnd_flex_values.ATTRIBUTE46
798         ,x_attribute47                => l_rec_fnd_flex_values.ATTRIBUTE47
799         ,x_attribute48                => l_rec_fnd_flex_values.ATTRIBUTE48
800         ,x_attribute49                => l_rec_fnd_flex_values.ATTRIBUTE49
801         ,x_attribute50                => l_rec_fnd_flex_values.ATTRIBUTE50
802         ,x_flex_value_meaning         => p_display_name
803         ,x_description                => p_description
804         ,x_last_update_date           => l_sysdate
805         ,x_last_updated_by            => l_owner
806         ,x_last_update_login          => G_CURRENT_LOGIN_ID);
807     END IF;
808 
809 /***
810   this is not working right now
811   logged bug 3957430 against FND
812 
813   ELSE -- value set of type Independent.
814     IF p_transaction_type = 'CREATE'  THEN
815     code_debug (l_api_name||' calling  FND_FLEX_VAL_API.create_independent_vset_value ');
816        FND_FLEX_VAL_API.create_independent_vset_value
817           (p_flex_value_set_name        => p_value_set_name
818           ,p_flex_value                 => p_internal_name
819           ,p_description                => p_description
820           ,p_enabled_flag               => p_enabled
821           ,p_start_date_active          => p_start_date
822           ,p_end_date_active            => p_end_date
823 -- allow default values
824 --          ,p_summary_flag               IN VARCHAR2 DEFAULT 'N',
825 --          ,p_structured_hierarchy_level IN NUMBER DEFAULT NULL,
826 --          ,p_hierarchy_level            IN VARCHAR2 DEFAULT NULL,
827           ,x_storage_value              => l_storage_value);
828     code_debug (l_api_name||' returning  FND_FLEX_VAL_API.create_independent_vset_value with value '||l_storage_value );
829     ELSIF p_transaction_type = 'UPDATE' THEN
830     code_debug (l_api_name||' calling  FND_FLEX_VAL_API.update_independent_vset_value ');
831       FND_FLEX_VAL_API.update_independent_vset_value
832           (p_flex_value_set_name        => p_value_set_name
833           ,p_flex_value                 => p_internal_name
834           ,p_description                => p_description
835           ,p_enabled_flag               => p_enabled
836           ,p_start_date_active          => p_start_date
837           ,p_end_date_active            => p_end_date
838 -- allow default values
839 --          ,p_summary_flag               IN VARCHAR2 DEFAULT 'N',
840 --          ,p_structured_hierarchy_level IN NUMBER DEFAULT NULL,
841 --          ,p_hierarchy_level            IN VARCHAR2 DEFAULT NULL,
842           ,x_storage_value              => l_storage_value);
843     code_debug (l_api_name||' returning  FND_FLEX_VAL_API.update_independent_vset_value with value '||l_storage_value );
844     END IF;
845   END IF;
846 ***/
847 
848     code_debug (l_api_name||' calling proces_vs_value_sequence  ');
849   process_vs_value_sequence
850        (p_api_version          => 1.0
851        ,p_transaction_type     => p_transaction_type
852        ,p_value_set_id         => NULL
853        ,p_value_set_name       => p_value_set_name
854        ,p_value_set_value_id   => l_flex_value_id
855        ,p_value_set_value      => p_internal_name
856        ,p_sequence             => p_sequence
857        ,p_owner                => l_owner
858        ,p_init_msg_list        => fnd_api.g_FALSE
859        ,p_commit               => fnd_api.g_FALSE
860        ,x_return_status        => x_return_status
861        ,x_msg_count            => l_msg_count
862        ,x_msg_data             => l_msg_data
863        );
864     code_debug (l_api_name||' returning proces_vs_value_sequence  with status '||x_return_status);
865 
866   EXCEPTION
867     WHEN OTHERS THEN
868     code_debug (l_api_name||' EXCEPTION -- OTHERS ');
869       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
870       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
871       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
872       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
873       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
874       FND_MSG_PUB.Add;
875 END Process_Value_Set_Val;
876 
877 
878 
879 ----------------------------------------------------------------------
880 PROCEDURE Get_Attr_Group_Comb_PKs(
881     p_attr_group_id     IN   NUMBER
882     , p_application_id  OUT NOCOPY NUMBER
883     , p_attr_grp_type   OUT NOCOPY VARCHAR2
884     , p_attr_grp_name   OUT NOCOPY VARCHAR2
885 )IS
886 CURSOR get_attr_details  IS
887      SELECT application_id , descriptive_flexfield_name ,descriptive_flex_context_code
888       FROM ego_fnd_dsc_flx_ctx_ext
889       WHERE attr_group_id = p_attr_group_id;
890 BEGIN
891   OPEN get_attr_details;
892   FETCH get_attr_details
893    INTO p_application_id , p_attr_grp_type , p_attr_grp_name;
894   IF get_attr_details%NOTFOUND THEN
895    p_application_id := NULL;
896    p_attr_grp_type  := NULL;
897    p_attr_grp_name  := NULL;
898   END IF;
899   CLOSE get_attr_details;
900 EXCEPTION
901   WHEN OTHERS THEN
902     IF get_attr_details%ISOPEN THEN
903       CLOSE get_attr_details;
904     END IF;
905    p_application_id := NULL;
906    p_attr_grp_type  := NULL;
907    p_attr_grp_name  := NULL;
908    RAISE;
909 END Get_Attr_Group_Comb_PKs;
910 
911 --------------------------------------------------------------------
912 
913 PROCEDURE Delete_Attribute_Internal (
914         p_application_id                IN   NUMBER
915        ,p_attr_group_type               IN   VARCHAR2
916        ,p_attr_group_name               IN   VARCHAR2
917        ,p_attr_name                     IN   VARCHAR2
918        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
919        ,x_return_status                 OUT NOCOPY VARCHAR2
920        ,x_errorcode                     OUT NOCOPY NUMBER
921        ,x_msg_count                     OUT NOCOPY NUMBER
922        ,x_msg_data                      OUT NOCOPY VARCHAR2
923 ) IS
924 
925     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Attribute_Internal';
926     l_app_col_name           VARCHAR2(30);
927 
928   BEGIN
929 
930     -- Standard start of API savepoint
931     IF FND_API.TO_BOOLEAN(p_commit) THEN
932       SAVEPOINT Delete_Attribute_PRV;
933     END IF;
934 
935     SELECT APPLICATION_COLUMN_NAME
936       INTO l_app_col_name
937       FROM FND_DESCR_FLEX_COLUMN_USAGES
938      WHERE APPLICATION_ID = p_application_id
939        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
940        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
941        AND END_USER_COLUMN_NAME = p_attr_name;
942 
943     DELETE FROM FND_DESCR_FLEX_COLUMN_USAGES
944      WHERE APPLICATION_ID = p_application_id
945        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
946        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
947        AND END_USER_COLUMN_NAME = p_attr_name;
948 
949     DELETE FROM FND_DESCR_FLEX_COL_USAGE_TL
950      WHERE APPLICATION_ID = p_application_id
951        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
952        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
953        AND APPLICATION_COLUMN_NAME = l_app_col_name;
954 
955     DELETE FROM EGO_FND_DF_COL_USGS_EXT
956      WHERE APPLICATION_ID = p_application_id
957        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
958        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
959        AND APPLICATION_COLUMN_NAME = l_app_col_name;
960 
961     -- Standard check of p_commit
962     IF FND_API.To_Boolean(p_commit) THEN
963       COMMIT WORK;
964     END IF;
965 
966     x_return_status := FND_API.G_RET_STS_SUCCESS;
967 
968   EXCEPTION
969     WHEN OTHERS THEN
970       IF FND_API.TO_BOOLEAN(p_commit) THEN
971         ROLLBACK TO Delete_Attribute_PRV;
972       END IF;
973       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
974 
975       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
976       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
977       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
978       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
979       FND_MSG_PUB.Add;
980       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
981                                ,p_count   => x_msg_count
982                                ,p_data    => x_msg_data);
983 
984 END Delete_Attribute_Internal;
985 
986 ----------------------------------------------------------------------
987 
988 PROCEDURE Delete_Attr_Group_Internal (
989         p_application_id                IN   NUMBER
990        ,p_attr_group_type               IN   VARCHAR2
991        ,p_attr_group_name               IN   VARCHAR2
992        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
993        ,x_return_status                 OUT NOCOPY VARCHAR2
994        ,x_errorcode                     OUT NOCOPY NUMBER
995        ,x_msg_count                     OUT NOCOPY NUMBER
996        ,x_msg_data                      OUT NOCOPY VARCHAR2
997 ) IS
998 
999     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Attr_Group_Internal';
1000 
1001     CURSOR attrs IS
1002     SELECT END_USER_COLUMN_NAME
1003       FROM FND_DESCR_FLEX_COLUMN_USAGES
1004      WHERE APPLICATION_ID = p_application_id
1005        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
1006        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
1007 
1008   BEGIN
1009 
1010     -- Standard start of API savepoint
1011     IF FND_API.TO_BOOLEAN(p_commit) THEN
1012       SAVEPOINT Delete_Attribute_Group_PVT;
1013     END IF;
1014 
1015     FOR attrs_rec IN attrs LOOP
1016 
1017       Delete_Attribute_Internal(p_application_id, p_attr_group_type, p_attr_group_name,
1018                                 attrs_rec.end_user_column_name, p_commit,
1019                                 x_return_status, x_errorcode, x_msg_count, x_msg_data);
1020 
1021     END LOOP;
1022 
1023     DELETE FROM FND_DESCR_FLEX_CONTEXTS
1024      WHERE APPLICATION_ID = p_application_id
1025        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
1026        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
1027 
1028     DELETE FROM FND_DESCR_FLEX_CONTEXTS_TL
1029      WHERE APPLICATION_ID = p_application_id
1030        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
1031        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
1032 
1033     DELETE FROM EGO_FND_DSC_FLX_CTX_EXT
1034      WHERE APPLICATION_ID = p_application_id
1035        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
1036        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
1037 
1038     DELETE FROM EGO_ATTR_GROUP_DL
1039      WHERE ATTR_GROUP_ID = (SELECT ATTR_GROUP_ID
1040                               FROM EGO_ATTR_GROUPS_V
1041                              WHERE APPLICATION_ID = p_application_id
1042                                AND ATTR_GROUP_TYPE = p_attr_group_type
1043                                AND ATTR_GROUP_NAME = p_attr_group_name);
1044 
1045     -- Standard check of p_commit
1046     IF FND_API.To_Boolean(p_commit) THEN
1047       COMMIT WORK;
1048     END IF;
1049 
1050     x_return_status := FND_API.G_RET_STS_SUCCESS;
1051 
1052   EXCEPTION
1053     WHEN OTHERS THEN
1054       IF FND_API.TO_BOOLEAN(p_commit) THEN
1055         ROLLBACK TO Delete_Attribute_Group_PVT;
1056       END IF;
1057       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1058       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
1059       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
1060       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
1061       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
1062       FND_MSG_PUB.Add;
1063       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
1064                                ,p_count   => x_msg_count
1065                                ,p_data    => x_msg_data);
1066 
1067 END Delete_Attr_Group_Internal;
1068 
1069 ----------------------------------------------------------------------
1070 
1071 FUNCTION Get_Association_Id_From_PKs (
1072         p_object_id                     IN   NUMBER
1073        ,p_classification_code           IN   VARCHAR2
1074        ,p_attr_group_id                 IN   NUMBER
1075 ) RETURN NUMBER
1076   IS
1077 
1078     l_association_id              NUMBER;
1079 
1080   BEGIN
1081 
1082     IF p_object_id IS NOT NULL THEN
1083       SELECT ASSOCIATION_ID
1084         INTO l_association_id
1085         FROM EGO_OBJ_AG_ASSOCS_B
1086        WHERE OBJECT_ID = p_object_id
1087          AND CLASSIFICATION_CODE = p_classification_code
1088          AND ATTR_GROUP_ID = p_attr_group_id;
1089     END IF;
1090 
1091     RETURN l_association_id;
1092 
1093   EXCEPTION
1094     WHEN NO_DATA_FOUND THEN
1095       RETURN NULL;
1096 
1097 END Get_Association_Id_From_PKs;
1098 
1099 ----------------------------------------------------------------------
1100 
1101 FUNCTION Get_Page_Id_From_PKs (
1102         p_object_id                     IN   NUMBER
1103        ,p_classification_code           IN   VARCHAR2
1104        ,p_page_internal_name            IN   VARCHAR2
1105 ) RETURN NUMBER
1106   IS
1107 
1108     l_page_id                     NUMBER;
1109 
1110   BEGIN
1111 
1112     IF p_object_id IS NOT NULL THEN
1113       SELECT PAGE_ID
1114         INTO l_page_id
1115         FROM EGO_PAGES_B
1116        WHERE OBJECT_ID = p_object_id
1117          AND CLASSIFICATION_CODE = p_classification_code
1118          AND INTERNAL_NAME = p_page_internal_name;
1119     END IF;
1120 
1121     RETURN l_page_id;
1122 
1123   EXCEPTION
1124     WHEN NO_DATA_FOUND THEN
1125       RETURN NULL;
1126 
1127 END Get_Page_Id_From_PKs;
1128 
1129 ----------------------------------------------------------------------
1130 
1131 FUNCTION Get_PKs_From_Attr_Group_Id (
1132         p_attr_group_id                 IN   NUMBER
1133 )
1134 RETURN EGO_VARCHAR_TBL_TYPE
1135 IS
1136 
1137     l_application_id         NUMBER;
1138     l_attr_group_type        VARCHAR2(40);
1139     l_attr_group_name        VARCHAR2(30);
1140 
1141   BEGIN
1142 
1143     SELECT APPLICATION_ID, DESCRIPTIVE_FLEXFIELD_NAME, DESCRIPTIVE_FLEX_CONTEXT_CODE
1144       INTO l_application_id, l_attr_group_type, l_attr_group_name
1145       FROM EGO_FND_DSC_FLX_CTX_EXT
1146      WHERE ATTR_GROUP_ID = p_attr_group_id;
1147 
1148     RETURN EGO_VARCHAR_TBL_TYPE(TO_CHAR(l_application_id), l_attr_group_type, l_attr_group_name);
1149 
1150   EXCEPTION
1151     WHEN NO_DATA_FOUND THEN
1152       RETURN NULL;
1153 
1154 END Get_PKs_From_Attr_Group_Id;
1155 
1156 ----------------------------------------------------------------------
1157 
1158 FUNCTION Check_Associations_Exist (
1159         p_application_id                IN   NUMBER
1160        ,p_attr_group_type               IN   VARCHAR2
1161        ,p_attr_group_name               IN   VARCHAR2
1162 )
1163 RETURN BOOLEAN
1164   IS
1165 
1166     l_attr_group_id          NUMBER;
1167     l_change_assocs_exist    BOOLEAN := FALSE;
1168     l_assocs_num             NUMBER := 0;
1169 
1170   BEGIN
1171 
1172     l_attr_group_id := Get_Attr_Group_Id_From_PKs(p_application_id
1173                                                  ,p_attr_group_type
1174                                                  ,p_attr_group_name);
1175 
1176     SELECT COUNT(*)
1177       INTO l_assocs_num
1178       FROM EGO_OBJ_AG_ASSOCS_B
1179      WHERE ATTR_GROUP_ID = l_attr_group_id
1180        AND ENABLED_FLAG = 'Y';
1181 
1182     IF (l_assocs_num > 0) OR (l_change_assocs_exist = TRUE) THEN
1183       RETURN TRUE;
1184     END IF;
1185 
1186     RETURN FALSE;
1187 
1188 END Check_Associations_Exist;
1189 
1190 ---------------------------------------------------------------------
1191 -- Checks if the UOM column exists in the p_table_name            --
1192 -- for Attribute value column p_column                            --
1193 -- bug 3875730                                                     --
1194 ---------------------------------------------------------------------
1195 
1196   FUNCTION check_Uom_Column_Exists (
1197       p_column                  IN     VARCHAR2
1198      ,p_table_name              IN     VARCHAR2
1199     )
1200     RETURN VARCHAR2
1201   IS
1202     l_uom_column_name        VARCHAR2(30);
1203   BEGIN
1204 
1205     IF  ( INSTR (p_column, 'N_EXT_ATTR' ) = 0) THEN
1206 
1207       SELECT COLUMN_NAME
1208         INTO l_uom_column_name
1209         FROM FND_COLUMNS
1210           WHERE TABLE_ID  =
1211            (SELECT TABLE_ID  FROM FND_TABLES
1212                WHERE TABLE_NAME = p_table_name)
1213           AND COLUMN_NAME  = 'UOM_'||p_column ;
1214 
1215       RETURN l_uom_column_name;
1216 
1217     END IF;
1218 
1219     RETURN '1' ;
1220 
1221     EXCEPTION
1222       WHEN NO_DATA_FOUND THEN
1223         RETURN NULL ;
1224 
1225   END check_Uom_Column_Exists;
1226 
1227 ---------------------------------------------------------------------
1228 -- Checks if the UOM column is used by any other attribute of this --
1229 -- Attribute Group                                                 --
1230 -- bug 3875730                                                     --
1231 ---------------------------------------------------------------------
1232 
1233   FUNCTION check_Uom_Col_In_Use (
1234        p_application_id          IN NUMBER
1235       ,p_attr_group_type         IN VARCHAR2
1236       ,p_attr_group_name         IN VARCHAR2
1237       ,p_internal_name           IN VARCHAR2
1238       ,p_uom_column_name         IN VARCHAR2
1239   )
1240   RETURN VARCHAR2
1241   IS
1242     l_uom_column_name        VARCHAR2(300);
1243   BEGIN
1244         SELECT 1
1245           INTO l_uom_column_name
1246           FROM FND_DESCR_FLEX_COLUMN_USAGES
1247          WHERE APPLICATION_ID = p_application_id
1248            AND DESCRIPTIVE_FLEXFIELD_NAME= p_attr_group_type
1249            AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
1250            AND END_USER_COLUMN_NAME <> p_internal_name
1251            AND APPLICATION_COLUMN_NAME  = p_uom_column_name ;
1252 
1253        RETURN l_uom_column_name;
1254 
1255       EXCEPTION
1256       WHEN NO_DATA_FOUND THEN
1257         RETURN NULL ;
1258 
1259   END check_Uom_Col_In_Use;
1260 
1261 ----------------------------------------------------------------------
1262 /*
1263 
1264 FUNCTION Get_Ext_Table_Owner (
1265         p_table_name                    IN   VARCHAR2
1266 )
1267 RETURN VARCHAR2
1268 IS
1269 
1270     l_table_owner            VARCHAR2(30);
1271 
1272   BEGIN
1273 
1274     SELECT OWNER
1275       INTO l_table_owner
1276       FROM ALL_TABLES
1277      WHERE TABLE_NAME = p_table_name;
1278 
1279     RETURN l_table_owner;
1280 
1281   EXCEPTION
1282     WHEN NO_DATA_FOUND THEN
1283       RETURN NULL;
1284 
1285 END Get_Ext_Table_Owner;
1286 */
1287 
1288 ----------------------------------------------------------------------
1289 
1290 FUNCTION Get_Application_name (
1291         p_appl_id         IN   NUMBER
1292 )
1293 RETURN VARCHAR2
1294 IS
1295 
1296     l_appl_name         VARCHAR2(30);
1297 
1298   BEGIN
1299 
1300     SELECT  APPLICATION_SHORT_NAME
1301       INTO l_appl_name
1302     FROM FND_APPLICATION
1303     WHERE APPLICATION_ID  = p_appl_id;
1304 
1305     RETURN l_appl_name;
1306 
1307   EXCEPTION
1308     WHEN NO_DATA_FOUND THEN
1309       RETURN NULL;
1310 
1311 END Get_Application_name;
1312 
1313 ----------------------------------------------------------------------
1314 
1315 FUNCTION Get_Application_Owner (
1316         p_appl_id                    IN   NUMBER
1317 )
1318 RETURN VARCHAR2
1319 IS
1320 
1321    l_schema        VARCHAR2(30);
1322    l_status        VARCHAR2(1);
1323    l_industry      VARCHAR2(1);
1324 
1325   BEGIN
1326 
1327     IF NOT FND_INSTALLATION.GET_APP_INFO(Get_Application_name(p_appl_id), l_status, l_industry, l_schema)
1328     THEN
1329       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1330     END IF;
1331 
1332     IF (l_schema IS NULL)
1333     THEN
1334       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1335     END IF;
1336 
1337    RETURN l_schema;
1338 
1339    EXCEPTION
1340      WHEN NO_DATA_FOUND THEN
1341        RETURN NULL;
1342 
1343 END Get_Application_Owner;
1344 
1345 ---------------------------------------------------------------------
1346 
1347 
1348 FUNCTION Get_Oracle_UserName
1349 RETURN VARCHAR2
1350 IS
1351 
1352    l_oracleUser        VARCHAR2(30);
1353 
1354   BEGIN
1355 
1356     SELECT
1357          ORACLE_USERNAME INTO l_oracleUser
1358        FROM
1359          FND_ORACLE_USERID
1360        WHERE
1361       READ_ONLY_FLAG = 'U';
1362 
1363    RETURN l_oracleUser;
1364 
1365    EXCEPTION
1366      WHEN NO_DATA_FOUND THEN
1367        RETURN NULL;
1368 
1369 END Get_Oracle_UserName;
1370 
1371 ---------------------------------------------------------------------
1372 
1373 
1374 
1375 FUNCTION Create_Index_For_DBCol (
1376         p_application_id                IN   NUMBER
1377        ,p_attr_group_type               IN   VARCHAR2
1378        ,p_attr_group_name               IN   VARCHAR2
1379        ,p_table_name                    IN   VARCHAR2
1380        ,p_chg_table_name                IN   VARCHAR2 --R12 for pending table name.
1381        ,p_is_column_indexed             IN   VARCHAR2 --R12 flag for column of production table
1382        ,p_is_chg_column_indexed         IN   VARCHAR2 --R12 flag for column of pending table
1383        ,p_column                        IN   VARCHAR2
1384        ,p_is_table_translatable         IN   BOOLEAN
1385 )
1386 RETURN VARCHAR2
1387 IS
1388 
1389     l_table_owner            VARCHAR2(30);
1390     l_class_code_column      VARCHAR2(30);
1391     l_index_name             VARCHAR2(30);
1392     l_chg_index_name         VARCHAR2(30);
1393     l_dynamic_sql            VARCHAR2(350);
1394     l_chg_dynamic_sql        VARCHAR2(350);
1395 
1396    h_sql                VARCHAR2(32700);
1397    h_x                  BOOLEAN;
1398    h_status             VARCHAR2(2000);
1399    h_industry           VARCHAR2(2000);
1400     fnd_apps_schema      VARCHAR2(30) := NULL;
1401 
1402 
1403   BEGIN
1404     -------------------------
1405     -- Get the Table owner --
1406     -------------------------
1407     l_table_owner := Get_Application_Owner(p_appl_id=>p_application_id);
1408     ---------------------------------------------
1409     -- Get the Classification Code column name --
1410     ---------------------------------------------
1411     SELECT CLASSIFICATION_COL_NAME
1412       INTO l_class_code_column
1413       FROM EGO_FND_OBJECTS_EXT
1414      WHERE OBJECT_NAME = (SELECT OBJ_NAME FROM FND_OBJECTS
1415                            WHERE OBJECT_ID = (SELECT OBJECT_ID
1416                                                 FROM EGO_OBJECT_EXT_TABLES_B
1417                                                WHERE EXT_TABLE_NAME = p_table_name));
1418 
1419     SELECT EGO_DB_COL_INDEX_S.NEXTVAL INTO l_index_name FROM DUAL;
1420     l_chg_index_name:=l_index_name; --for the index name of pending table.
1421     l_index_name := 'ag_'||p_column||'_n'||l_index_name;
1422     l_chg_index_name := 'ag_pdg_'||p_column||'_n'||l_chg_index_name;--index name for the pending table.
1423 
1424     --Creating index on the production table if the column is not already indexed.
1425     IF(p_is_column_indexed IS NULL OR p_is_column_indexed <> 'Y') THEN
1426       l_dynamic_sql := ' CREATE INDEX '||l_table_owner||'.'||l_index_name||
1427                ' ON '||l_table_owner||'.'||p_table_name||' (';
1428 
1429       IF l_class_code_column IS NOT NULL THEN
1430         l_dynamic_sql := l_dynamic_sql ||l_class_code_column||', ';
1431       END IF;
1432 
1433       IF (p_is_table_translatable) THEN
1434         l_dynamic_sql := l_dynamic_sql||'LANGUAGE , ';
1435       END IF;
1436 
1437       l_dynamic_sql := l_dynamic_sql||p_column||') LOCAL COMPUTE STATISTICS';
1438 
1439       --bugfix 11907422 for 12.2 AD_DDL changes
1440       --EXECUTE IMMEDIATE l_dynamic_sql;
1441       h_sql := l_dynamic_sql;
1442       h_x := FND_INSTALLATION.Get_App_Info('FND', h_status, h_industry, fnd_apps_schema);
1443       AD_DDL.DO_DDL(fnd_apps_schema, l_table_owner, AD_DDL.CREATE_INDEX, h_sql, l_index_name);
1444 
1445 
1446     END IF;-- IF(p_is_column_indexed IS NULL OR p_is_column_indexed <> 'Y')
1447 
1448     --Creating index on the pending table if the column is not already indexed.
1449     IF(p_is_chg_column_indexed IS NULL OR p_is_chg_column_indexed <> 'Y') THEN
1450       l_chg_dynamic_sql := ' CREATE INDEX '||l_table_owner||'.'||l_chg_index_name||
1451                ' ON '||l_table_owner||'.'||p_chg_table_name ||' (';
1452 
1453       IF l_class_code_column IS NOT NULL THEN
1454         l_chg_dynamic_sql := l_chg_dynamic_sql ||l_class_code_column||', ';
1455       END IF;
1456       IF (p_is_table_translatable) THEN
1457         l_chg_dynamic_sql := l_chg_dynamic_sql||'LANGUAGE , ';
1458       END IF;
1459 
1460       l_chg_dynamic_sql := l_chg_dynamic_sql||p_column||') LOCAL COMPUTE STATISTICS';
1461 
1462       --bugfix 11907422 for 12.2 AD_DDL changes
1463       --EXECUTE IMMEDIATE l_chg_dynamic_sql;
1464       h_sql := l_chg_dynamic_sql;
1465       h_x := FND_INSTALLATION.Get_App_Info('FND', h_status, h_industry, fnd_apps_schema);
1466       AD_DDL.DO_DDL(fnd_apps_schema, l_table_owner, AD_DDL.CREATE_INDEX, h_sql, l_chg_index_name);
1467 
1468     END IF;--IF(p_is_chg_column_indexed IS NULL OR  p_is_chg_column_indexed <> 'Y')
1469     RETURN 'Y';
1470 
1471   EXCEPTION
1472     WHEN OTHERS THEN
1473      RETURN 'N';
1474 END Create_Index_For_DBCol;
1475 
1476 ----------------------------------------------------------------------
1477 
1478 FUNCTION Build_Tokenized_URL_Query (
1479         p_attr_group_metadata_obj       IN   EGO_ATTR_GROUP_METADATA_OBJ
1480        ,p_attr_metadata_obj             IN   EGO_ATTR_METADATA_OBJ
1481 )
1482 RETURN VARCHAR2
1483 IS
1484 
1485     l_head_of_query          VARCHAR2(32767);
1486     l_tail_of_query          VARCHAR2(32767);
1487     l_has_tokens_left        BOOLEAN;
1488     l_token_start_index      NUMBER;
1489     l_token_end_index        NUMBER;
1490     l_token                  VARCHAR2(50);
1491     l_replacement_attr_metadata EGO_ATTR_METADATA_OBJ;
1492 
1493   BEGIN
1494 
1495     l_tail_of_query := p_attr_metadata_obj.INFO_1;
1496 
1497     ------------------------------------------
1498     -- If there aren't two different '$' in --
1499     -- the string, then there are no tokens --
1500     ------------------------------------------
1501     l_has_tokens_left := (INSTR(l_tail_of_query, '$') <> 0 AND
1502                           INSTR(l_tail_of_query, '$') <> INSTR(l_tail_of_query, '$', -1));
1503 
1504     WHILE (l_has_tokens_left)
1505     LOOP
1506 
1507       ---------------------------------------
1508       -- Parse out the token for this loop --
1509       ---------------------------------------
1510       l_token_start_index := INSTR(l_tail_of_query, '$');
1511       l_token_end_index := INSTR(l_tail_of_query, '$', l_token_start_index + 1);
1512 
1513       l_token := SUBSTR(l_tail_of_query, l_token_start_index + 1, (l_token_end_index - (l_token_start_index + 1)));
1514 
1515       ------------------------------------------------------
1516       -- Validate the token by trying to get its metadata --
1517       ------------------------------------------------------
1518       IF (l_token = p_attr_metadata_obj.ATTR_NAME) THEN
1519         l_replacement_attr_metadata := p_attr_metadata_obj;
1520       ELSE
1521         l_replacement_attr_metadata := EGO_USER_ATTRS_COMMON_PVT.Find_Metadata_For_Attr(
1522                                          p_attr_group_metadata_obj.attr_metadata_table
1523                                         ,l_token
1524                                        );
1525       END IF;
1526 
1527       IF (l_replacement_attr_metadata IS NULL) THEN
1528 
1529         --------------------------------------
1530         -- Report that the URL is not valid --
1531         --------------------------------------
1532         FND_MESSAGE.Set_Name('EGO', 'EGO_EF_DYNAMIC_URL_DATA_ERROR');
1533         FND_MESSAGE.Set_Token('ATTR_GROUP_DISP_NAME', p_attr_group_metadata_obj.ATTR_GROUP_DISP_NAME);
1534         FND_MSG_PUB.Add;
1535 
1536         RAISE FND_API.G_EXC_ERROR;
1537       END IF;
1538 
1539       -----------------------
1540       -- Replace the token --
1541       -----------------------
1542       l_head_of_query := l_head_of_query ||
1543                          SUBSTR(l_tail_of_query, 1, (l_token_start_index - 1)) ||
1544                          '''||' ||
1545                          EGO_USER_ATTRS_COMMON_PVT.Create_DB_Col_Alias_If_Needed(l_replacement_attr_metadata) ||
1546                          '||''';
1547 
1548       l_tail_of_query := SUBSTR(l_tail_of_query, l_token_end_index + 1);
1549 
1550       --------------------------------------
1551       -- Reset variable for the next loop --
1552       --------------------------------------
1553       l_has_tokens_left := (INSTR(l_tail_of_query, '$') <> 0 AND
1554                             INSTR(l_tail_of_query, '$') <> INSTR(l_tail_of_query, '$', -1));
1555 
1556     END LOOP;
1557 
1558     l_head_of_query := l_head_of_query || l_tail_of_query;
1559 
1560     RETURN '''' || l_head_of_query || '''';
1561 
1562 END Build_Tokenized_URL_Query;
1563 
1564 ----------------------------------------------------------------------
1565 
1566                      ------------------------
1567                      -- Miscellaneous APIs --
1568                      ------------------------
1569 
1570 ----------------------------------------------------------------------
1571 -- signature to use if caller has ATTR_GROUP_ID
1572 FUNCTION Get_Privilege_For_Attr_Group (
1573         p_attr_group_id                 IN   NUMBER
1574        ,p_which_priv_to_return          IN   VARCHAR2
1575 )
1576 RETURN VARCHAR2
1577 IS
1578 
1579     l_privilege_name         FND_FORM_FUNCTIONS.FUNCTION_NAME%TYPE; --4105308
1580 
1581   BEGIN
1582 
1583     IF (UPPER(p_which_priv_to_return) = 'VIEW') THEN
1584 
1585       SELECT F.FUNCTION_NAME
1586         INTO l_privilege_name
1587         FROM FND_FORM_FUNCTIONS      F
1588             ,EGO_FND_DSC_FLX_CTX_EXT E
1589        WHERE E.ATTR_GROUP_ID = p_attr_group_id
1590          AND E.VIEW_PRIVILEGE_ID = F.FUNCTION_ID;
1591 
1592     ELSIF (UPPER(p_which_priv_to_return) = 'EDIT') THEN
1593 
1594       SELECT F.FUNCTION_NAME
1595         INTO l_privilege_name
1596         FROM FND_FORM_FUNCTIONS      F
1597             ,EGO_FND_DSC_FLX_CTX_EXT E
1598        WHERE E.ATTR_GROUP_ID = p_attr_group_id
1599          AND E.EDIT_PRIVILEGE_ID = F.FUNCTION_ID;
1600 
1601     END IF;
1602 
1603     RETURN l_privilege_name;
1604 
1605   EXCEPTION
1606     WHEN NO_DATA_FOUND THEN
1607       RETURN NULL;
1608 
1609 END Get_Privilege_For_Attr_Group;
1610 
1611 ----------------------------------------------------------------------
1612 
1613 FUNCTION Get_Privilege_For_Attr_Group (
1614         p_application_id                IN   NUMBER
1615        ,p_attr_group_type               IN   VARCHAR2
1616        ,p_attr_group_name               IN   VARCHAR2
1617        ,p_which_priv_to_return          IN   VARCHAR2
1618 )
1619 RETURN VARCHAR2
1620 IS
1621 
1622     l_attr_group_id          NUMBER;
1623 
1624   BEGIN
1625 
1626     l_attr_group_id := Get_Attr_Group_Id_From_PKs(p_application_id
1627                                                  ,p_attr_group_type
1628                                                  ,p_attr_group_name);
1629 
1630     IF l_attr_group_id IS NULL THEN
1631       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1632     END IF;
1633 
1634     RETURN EGO_EXT_FWK_PUB.Get_Privilege_For_Attr_Group(
1635         p_attr_group_id                 => l_attr_group_id
1636        ,p_which_priv_to_return          => p_which_priv_to_return
1637     );
1638 
1639   EXCEPTION
1640     WHEN OTHERS THEN
1641       RETURN NULL;
1642 
1643 END Get_Privilege_For_Attr_Group;
1644 
1645 ----------------------------------------------------------------------
1646 
1647 FUNCTION Is_Column_Indexed (
1648         p_column_name                   IN   VARCHAR2
1649        ,p_table_name                    IN   VARCHAR2
1650        ,p_application_id                IN   NUMBER     DEFAULT NULL
1651        ,p_attr_group_type               IN   VARCHAR2   DEFAULT NULL
1652 )
1653 RETURN VARCHAR2
1654 IS
1655 
1656     l_index_flag             VARCHAR2(1) := 'N';
1657     l_table_name             VARCHAR2(30);
1658     l_table_owner            VARCHAR2(30);
1659 
1660     l_real_column_name       VARCHAR2(30);  -- bug#15835530
1661 
1662   BEGIN
1663 
1664     IF (p_table_name IS NOT NULL) THEN
1665 
1666       l_table_name := p_table_name;
1667 
1668     ELSE
1669 
1670       l_table_name := Get_Table_Name(p_application_id
1671                                     ,p_attr_group_type);
1672 
1673     END IF;
1674 
1675     ----------------------------------------------------
1676     -- We assume that the table is an Extension Table --
1677     ----------------------------------------------------
1678     l_table_owner := Get_Application_Owner(p_application_id);
1679 
1680     -- bug#15835530  fix for 12.2 OLP compatible
1681      select col.column_name
1682      into l_real_column_name
1683      from dba_tables               tab,
1684           dba_tab_columns          col,
1685           dba_editioning_views     ev,
1686           dba_editioning_view_cols evc
1687     where tab.owner = l_table_owner
1688       and tab.table_name = l_table_name
1689       and col.owner = tab.owner
1690       and col.table_name = tab.table_name
1691       and ev.owner(+) = tab.owner
1692       and ev.table_name(+) = tab.table_name
1693       and evc.owner(+) = ev.owner
1694       and evc.view_name(+) = ev.view_name
1695       and (ev.view_name is null or
1696           evc.table_column_name = col.column_name)
1697       and decode(ev.view_name,
1698                  NULL,
1699                  col.column_name,
1700                  evc.view_column_name) = p_column_name;
1701 
1702     SELECT 'Y'
1703       INTO l_index_flag
1704       FROM ALL_IND_COLUMNS
1705      WHERE TABLE_OWNER = l_table_owner
1706        AND TABLE_NAME = l_table_name
1707        AND COLUMN_NAME = l_real_column_name
1708        AND ROWNUM < 2;
1709 
1710     RETURN l_index_flag;
1711 
1712   EXCEPTION
1713     WHEN NO_DATA_FOUND THEN
1714       RETURN 'N';
1715 
1716 END Is_Column_Indexed;
1717 
1718 ----------------------------------------------------------------------
1719 
1720 FUNCTION Get_Attr_Group_Id_From_PKs (
1721         p_application_id                IN   NUMBER
1722        ,p_attr_group_type               IN   VARCHAR2
1723        ,p_attr_group_name               IN   VARCHAR2
1724 )
1725 RETURN NUMBER
1726 IS
1727 
1728     l_attr_group_id          NUMBER;
1729 
1730   BEGIN
1731 
1732     SELECT ATTR_GROUP_ID INTO l_attr_group_id
1733       FROM EGO_FND_DSC_FLX_CTX_EXT
1734      WHERE APPLICATION_ID = p_application_id
1735        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
1736        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
1737 
1738     RETURN l_attr_group_id;
1739 
1740   EXCEPTION
1741     WHEN NO_DATA_FOUND THEN
1742       RETURN NULL;
1743 
1744 END Get_Attr_Group_Id_From_PKs;
1745 
1746 ----------------------------------------------------------------------
1747 
1748 FUNCTION Get_Attr_Group_DispName (
1749         p_attr_group_id                 IN   NUMBER
1750 )
1751 RETURN VARCHAR2
1752 IS
1753 
1754     l_attr_group_name          VARCHAR2(80);
1755 
1756   BEGIN
1757 
1758     SELECT FL_CTX_TL.DESCRIPTIVE_FLEX_CONTEXT_NAME INTO l_attr_group_name
1759       FROM FND_DESCR_FLEX_CONTEXTS_TL  FL_CTX_TL,
1760            EGO_FND_DSC_FLX_CTX_EXT     FL_CTX_EXT
1761      WHERE
1762           FL_CTX_EXT.APPLICATION_ID = FL_CTX_TL.APPLICATION_ID
1763             AND FL_CTX_EXT.DESCRIPTIVE_FLEXFIELD_NAME = FL_CTX_TL.DESCRIPTIVE_FLEXFIELD_NAME
1764       AND FL_CTX_EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = FL_CTX_TL.DESCRIPTIVE_FLEX_CONTEXT_CODE
1765       AND FL_CTX_EXT.ATTR_GROUP_ID = p_attr_group_id
1766       AND FL_CTX_TL.LANGUAGE = userenv('LANG');
1767 
1768     RETURN l_attr_group_name;
1769 
1770   EXCEPTION
1771     WHEN NO_DATA_FOUND THEN
1772       RETURN NULL;
1773 
1774 END Get_Attr_Group_DispName;
1775 
1776 ----------------------------------------------------------------------
1777 
1778 
1779 FUNCTION Get_Data_Level_DispName (
1780         p_data_level                 IN   VARCHAR2
1781 )
1782 RETURN VARCHAR2
1783 IS
1784 
1785     l_p_data_level_disp_name          VARCHAR2(80);
1786 
1787   BEGIN
1788 
1789    SELECT meaning  into l_p_data_level_disp_name
1790    FROM fnd_lookup_values
1791      WHERE lookup_type = 'EGO_EF_DATA_LEVEL'
1792       AND language = userenv('LANG')
1793       AND lookup_code = p_data_level;
1794 
1795     RETURN l_p_data_level_disp_name;
1796 
1797   EXCEPTION
1798     WHEN NO_DATA_FOUND THEN
1799       RETURN NULL;
1800 
1801 END Get_Data_Level_DispName;
1802 
1803 ----------------------------------------------------------------------
1804 
1805 FUNCTION Get_Associated_Datalevel (
1806         p_object_id                     IN   NUMBER
1807       , p_attr_group_id                 IN   NUMBER
1808 
1809 )
1810 RETURN VARCHAR2
1811 IS
1812    l_data_level  VARCHAR2(30);
1813 
1814   BEGIN
1815 
1816     SELECT DISTINCT DATA_LEVEL
1817       INTO l_data_level
1818       FROM EGO_OBJ_AG_ASSOCS_B
1819      WHERE ATTR_GROUP_ID = p_attr_group_id
1820        AND OBJECT_ID = p_object_id
1821        AND ROWNUM < 2;
1822 
1823     RETURN l_data_level;
1824 
1825   EXCEPTION
1826     WHEN NO_DATA_FOUND THEN
1827       RETURN NULL;
1828 
1829 END Get_Associated_Datalevel;
1830 
1831 ----------------------------------------------------------------------
1832 /*
1833 NOTE: WE DON'T USE THESE ANYMORE, BUT WE'LL KEEP THEM JUST IN CASE
1834 
1835 PROCEDURE Get_Available_AttrDBCol (
1836         p_api_version                   IN   NUMBER
1837        ,p_attr_group_id                 IN   NUMBER
1838        ,p_data_type                     IN   VARCHAR2
1839        ,x_database_column               OUT NOCOPY VARCHAR2
1840 ) IS
1841 
1842   l_database_columns         EGO_VARCHAR_TBL_TYPE;
1843 
1844   BEGIN
1845 
1846     EGO_EXT_FWK_PUB.Get_Available_AttrDBCols (
1847         p_api_version                   => p_api_version
1848        ,p_attr_group_id                 => p_attr_group_id
1849        ,p_data_type                     => p_data_type
1850        ,x_database_columns              => l_database_columns
1851     );
1852 
1853     -- for this method, we just return the first in the list of available columns
1854 
1855     x_database_column := l_database_columns(l_database_columns.FIRST);
1856 
1857 END Get_Available_AttrDBCol;
1858 
1859 ----------------------------------------------------------------------
1860 
1861 PROCEDURE Get_Available_AttrDBCol (
1862         p_api_version                   IN   NUMBER
1863        ,p_application_id                IN   NUMBER
1864        ,p_attr_group_type               IN   VARCHAR2
1865        ,p_attr_group_name               IN   VARCHAR2
1866        ,p_data_type                     IN   VARCHAR2
1867        ,x_database_column               OUT NOCOPY VARCHAR2
1868 ) IS
1869 
1870   l_database_columns         EGO_VARCHAR_TBL_TYPE;
1871 
1872   BEGIN
1873 
1874     EGO_EXT_FWK_PUB.Get_Available_AttrDBCols (
1875         p_api_version                   => p_api_version
1876        ,p_application_id                => p_application_id
1877        ,p_attr_group_type               => p_attr_group_type
1878        ,p_attr_group_name               => p_attr_group_name
1879        ,p_data_type                     => p_data_type
1880        ,x_database_columns              => l_database_columns
1881     );
1882 
1883     -- for this method, we just return the first in the list of available columns
1884 
1885     x_database_column := l_database_columns(l_database_columns.FIRST);
1886 
1887 END Get_Available_AttrDBCol;
1888 
1889 ----------------------------------------------------------------------
1890 
1891 PROCEDURE Get_Available_AttrDBCols (
1892         p_api_version                   IN   NUMBER
1893        ,p_application_id                IN   NUMBER
1894        ,p_attr_group_type               IN   VARCHAR2
1895        ,p_attr_group_name               IN   VARCHAR2
1896        ,p_data_type                     IN   VARCHAR2
1897        ,x_database_columns              OUT NOCOPY EGO_VARCHAR_TBL_TYPE
1898 ) IS
1899 
1900     l_ext_table_name         VARCHAR2(30);
1901     l_ext_table_id           NUMBER;
1902     l_column_type            VARCHAR2(1);
1903     l_column_prefix          VARCHAR2(15);
1904     l_db_cols_table_index    NUMBER;
1905     l_column_deleted         BOOLEAN;
1906 
1907     CURSOR allDBColNames_c (
1908         cp_application_id               IN   NUMBER
1909        ,cp_table_id                     IN   NUMBER
1910        ,cp_column_type                  IN   VARCHAR2
1911        ,cp_column_prefix                IN   VARCHAR2
1912     ) IS
1913       SELECT COLUMN_NAME
1914         FROM FND_COLUMNS
1915        WHERE APPLICATION_ID = cp_application_id
1916          AND TABLE_ID = cp_table_id
1917          AND COLUMN_TYPE = cp_column_type
1918          AND COLUMN_NAME LIKE cp_column_prefix
1919        ORDER BY COLUMN_SEQUENCE;
1920 
1921 TO DO: we must replace this column name check with FLEXFIELD_USAGE_CODE = 'D',
1922        as soon as Kirill tells us how to seed that in CASE
1923 
1924 
1925     CURSOR usedDBCol_c (
1926         cp_application_id               IN   NUMBER
1927        ,cp_attr_group_type              IN   VARCHAR2
1928        ,cp_attr_group_name              IN   VARCHAR2
1929        ,cp_data_type                    IN   VARCHAR2
1930        ,cp_table_id                     IN   NUMBER
1931        ,cp_column_type                  IN   VARCHAR2
1932     ) IS
1933       SELECT FC.COLUMN_NAME
1934         FROM FND_COLUMNS              FC
1935             ,EGO_FND_DF_COL_USGS_EXT  EXT
1936        WHERE EXT.APPLICATION_ID = cp_application_id
1937          AND EXT.DESCRIPTIVE_FLEXFIELD_NAME = cp_attr_group_type
1938          AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = cp_attr_group_name
1939          AND EXT.DATA_TYPE = cp_data_type
1940          AND FC.APPLICATION_ID = cp_application_id
1941          AND FC.TABLE_ID = cp_table_id
1942          AND FC.COLUMN_TYPE = cp_column_type
1943          AND EXT.APPLICATION_COLUMN_NAME = FC.COLUMN_NAME
1944        ORDER BY FC.COLUMN_SEQUENCE;
1945 
1946   BEGIN
1947 
1948     SELECT FT.TABLE_ID
1949       INTO l_ext_table_id
1950       FROM FND_TABLES              FT
1951           ,EGO_ATTR_GROUP_TYPES_V  EAGTV
1952      WHERE FT.TABLE_NAME = EAGTV.EXT_TABLE_NAME
1953        AND EAGTV.APPLICATION_ID = p_application_id
1954        AND EAGTV.ATTR_GROUP_TYPE = p_attr_group_type;
1955 
1956     IF (p_data_type = G_NUMBER_DATA_TYPE) THEN
1957       l_column_type := 'N';
1958       l_column_prefix := 'N_EXT_ATTR%';
1959     ELSIF (p_data_type = G_DATE_DATA_TYPE OR
1960            p_data_type = G_DATE_TIME_DATA_TYPE) THEN
1961       l_column_type := 'D';
1962       l_column_prefix := 'D_EXT_ATTR%';
1963     ELSE
1964       l_column_type := 'V';
1965       l_column_prefix := 'C_EXT_ATTR%';
1966     END IF;
1967 
1968     OPEN allDBColNames_c(p_application_id, l_ext_table_id, l_column_type, l_column_prefix);
1969     FETCH allDBColNames_c BULK COLLECT INTO x_database_columns;
1970     CLOSE allDBColNames_c;
1971 
1972     IF (x_database_columns.COUNT > 0) THEN
1973 
1974       ---------------------------------------------------------------
1975       -- Delete from our table all columns that are already in use --
1976       ---------------------------------------------------------------
1977       FOR colNumRec IN usedDBCol_c (p_application_id
1978                                    ,p_attr_group_type
1979                                    ,p_attr_group_name
1980                                    ,p_data_type
1981                                    ,l_ext_table_id
1982                                    ,l_column_type)
1983       LOOP
1984 
1985         ----------------------------------------------------------------
1986         -- Find and delete this particular used column from our table --
1987         ----------------------------------------------------------------
1988         l_column_deleted := FALSE;
1989         l_db_cols_table_index := x_database_columns.FIRST;
1990         WHILE (l_db_cols_table_index <= x_database_columns.LAST)
1991         LOOP
1992           EXIT WHEN (l_column_deleted);
1993 
1994           IF (x_database_columns(l_db_cols_table_index) = colNumRec.COLUMN_NAME) THEN
1995 
1996             x_database_columns.DELETE(l_db_cols_table_index);
1997             l_column_deleted := TRUE;
1998 
1999           END IF;
2000 
2001           l_db_cols_table_index := x_database_columns.NEXT(l_db_cols_table_index);
2002         END LOOP;
2003       END LOOP;
2004     END IF;
2005 
2006 END Get_Available_AttrDBCols;
2007 
2008 ----------------------------------------------------------------------
2009 
2010 PROCEDURE Get_Available_AttrDBCols (
2011         p_api_version                   IN   NUMBER
2012        ,p_attr_group_id                 IN   NUMBER
2013        ,p_data_type                     IN   VARCHAR2
2014        ,x_database_columns              OUT NOCOPY EGO_VARCHAR_TBL_TYPE
2015 ) IS
2016 
2017     l_attr_group_pks         EGO_VARCHAR_TBL_TYPE;
2018 
2019   BEGIN
2020 
2021     l_attr_group_pks := Get_PKs_From_Attr_Group_Id(p_attr_group_id);
2022 
2023     EGO_EXT_FWK_PUB.Get_Available_AttrDBCols (
2024         p_api_version                   => p_api_version
2025        ,p_application_id                => l_attr_group_pks(1)
2026        ,p_attr_group_type               => l_attr_group_pks(2)
2027        ,p_attr_group_name               => l_attr_group_pks(3)
2028        ,p_data_type                     => p_data_type
2029        ,x_database_columns              => x_database_columns
2030     );
2031 
2032 END Get_Available_AttrDBCols;
2033 */
2034 
2035 ----------------------------------------------------------------------
2036 
2037 FUNCTION Get_Table_Name (
2038         p_application_id                IN   NUMBER
2039        ,p_attr_group_type               IN   VARCHAR2
2040 )
2041 RETURN VARCHAR2
2042 IS
2043 
2044     l_table_name             VARCHAR2(30);
2045 
2046   BEGIN
2047     SELECT APPLICATION_TABLE_NAME
2048       INTO l_table_name
2049       FROM FND_DESCRIPTIVE_FLEXS
2050      WHERE APPLICATION_ID = p_application_id
2051        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type;
2052 
2053     RETURN l_table_name;
2054 
2055   EXCEPTION
2056     WHEN NO_DATA_FOUND THEN
2057       RETURN NULL;
2058 
2059 END Get_Table_Name;
2060 
2061 ----------------------------------------------------------------------
2062 
2063 FUNCTION Get_TL_Table_Name (
2064         p_application_id                IN   NUMBER
2065        ,p_attr_group_type               IN   VARCHAR2
2066 )
2067 RETURN VARCHAR2
2068 IS
2069     l_table_name             VARCHAR2(30);
2070 
2071   BEGIN
2072     SELECT EXT_TL_TABLE_NAME
2073       INTO l_table_name
2074       FROM EGO_ATTR_GROUP_TYPES_V
2075      WHERE APPLICATION_ID = p_application_id
2076        AND ATTR_GROUP_TYPE = p_attr_group_type;
2077 
2078     RETURN l_table_name;
2079 
2080   EXCEPTION
2081     WHEN NO_DATA_FOUND THEN
2082       RETURN NULL;
2083 
2084 END Get_TL_Table_Name;
2085 
2086 ----------------------------------------------------------------------
2087 
2088 FUNCTION Get_Object_Id_From_Name (p_object_name IN VARCHAR2) RETURN NUMBER
2089 IS
2090 
2091     l_object_id              NUMBER;
2092 
2093   BEGIN
2094 
2095     SELECT OBJECT_ID INTO l_object_id
2096       FROM FND_OBJECTS
2097      WHERE OBJ_NAME = p_object_name;
2098 
2099     RETURN l_object_id;
2100 
2101   EXCEPTION
2102     WHEN NO_DATA_FOUND THEN
2103       RETURN NULL;
2104 
2105 END Get_Object_Id_From_Name;
2106 
2107 ----------------------------------------------------------------------
2108 
2109 FUNCTION Get_Object_Id_For_AG_Type (
2110         p_application_id                IN   NUMBER
2111        ,p_attr_group_type               IN   VARCHAR2
2112 ) RETURN NUMBER
2113   IS
2114 
2115     l_object_id              NUMBER;
2116 
2117   BEGIN
2118 
2119     SELECT OBJ.OBJECT_ID
2120       INTO l_object_id
2121       FROM EGO_OBJECT_EXT_TABLES_B    OBJ
2122           ,FND_DESCRIPTIVE_FLEXS      FLX
2123      WHERE OBJ.EXT_TABLE_NAME = FLX.APPLICATION_TABLE_NAME
2124        AND OBJ.APPLICATION_ID = FLX.APPLICATION_ID
2125        AND FLX.APPLICATION_ID = p_application_id
2126        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type;
2127 
2128     RETURN l_object_id;
2129 
2130   EXCEPTION
2131     WHEN NO_DATA_FOUND THEN
2132       RETURN NULL;
2133 
2134 END Get_Object_Id_For_AG_Type;
2135 
2136 ----------------------------------------------------------------------
2137 
2138 FUNCTION Get_Class_Meaning (
2139         p_object_name                   IN   VARCHAR2
2140        ,p_class_code                    IN   VARCHAR2
2141 )
2142 RETURN VARCHAR2
2143 IS
2144 
2145     l_ocv_name               VARCHAR2(30);
2146     l_dynamic_sql            VARCHAR2(300);
2147     l_class_meaning          VARCHAR2(1000);
2148 
2149   BEGIN
2150 
2151     SELECT EXT_ATTR_OCV_NAME INTO l_ocv_name
2152       FROM EGO_FND_OBJECTS_EXT
2153      WHERE OBJECT_NAME = p_object_name;
2154 
2155     IF (l_ocv_name IS NULL) THEN
2156       l_class_meaning := p_class_code;
2157     ELSE
2158       l_dynamic_sql := 'SELECT MEANING FROM ' || l_ocv_name ||
2159                        ' WHERE CODE = :1 AND LANGUAGE = USERENV(''LANG'') ' ||
2160                        ' AND ROWNUM = 1 ';
2161 
2162       EXECUTE IMMEDIATE l_dynamic_sql INTO l_class_meaning USING p_class_code;
2163     END IF;
2164 
2165     RETURN l_class_meaning;
2166 
2167   EXCEPTION
2168     WHEN NO_DATA_FOUND THEN
2169       RETURN p_class_code;
2170 
2171 END Get_Class_Meaning;
2172 
2173 ----------------------------------------------------------------------
2174 
2175 FUNCTION Get_Class_Meaning (
2176         p_object_id                     IN   NUMBER
2177        ,p_class_code                    IN   VARCHAR2
2178 )
2179 RETURN VARCHAR2
2180 IS
2181 
2182     l_object_name          FND_OBJECTS.OBJ_NAME%TYPE; --4105308
2183 
2184   BEGIN
2185 
2186     SELECT OBJ_NAME INTO l_object_name
2187       FROM FND_OBJECTS
2188      WHERE OBJECT_ID = p_object_id;
2189 
2190     RETURN Get_Class_Meaning(l_object_name, p_class_code);
2191 
2192   EXCEPTION
2193     WHEN OTHERS THEN
2194       RETURN p_class_code;
2195 
2196 END Get_Class_Meaning;
2197 
2198 ----------------------------------------------------------------------
2199 
2200 PROCEDURE Get_Pk_Columns (
2201         p_api_version                   IN   NUMBER
2202        ,p_obj_name                      IN   VARCHAR2
2203        ,x_pkcolumn1_name                OUT NOCOPY VARCHAR2
2204        ,x_pkcolumn1_type                OUT NOCOPY VARCHAR2
2205        ,x_pkcolumn2_name                OUT NOCOPY VARCHAR2
2206        ,x_pkcolumn2_type                OUT NOCOPY VARCHAR2
2207        ,x_pkcolumn3_name                OUT NOCOPY VARCHAR2
2208        ,x_pkcolumn3_type                OUT NOCOPY VARCHAR2
2209        ,x_pkcolumn4_name                OUT NOCOPY VARCHAR2
2210        ,x_pkcolumn4_type                OUT NOCOPY VARCHAR2
2211        ,x_pkcolumn5_name                OUT NOCOPY VARCHAR2
2212        ,x_pkcolumn5_type                OUT NOCOPY VARCHAR2
2213 ) IS
2214 
2215     CURSOR pk_columns_c (cp_obj_name VARCHAR2)
2216     IS
2217     SELECT PK1_COLUMN_NAME, PK1_COLUMN_TYPE,
2218            PK2_COLUMN_NAME, PK2_COLUMN_TYPE,
2219            PK3_COLUMN_NAME, PK3_COLUMN_TYPE,
2220            PK4_COLUMN_NAME, PK4_COLUMN_TYPE,
2221            PK5_COLUMN_NAME, PK5_COLUMN_TYPE
2222       FROM FND_OBJECTS
2223      WHERE OBJ_NAME = cp_obj_name;
2224 
2225     l_pk_columns_rec pk_columns_c%ROWTYPE;
2226 
2227   BEGIN
2228     OPEN pk_columns_c(cp_obj_name => p_obj_name);
2229     FETCH pk_columns_c INTO l_pk_columns_rec;
2230     x_pkcolumn1_name := l_pk_columns_rec.PK1_COLUMN_NAME;
2231     x_pkcolumn1_type := l_pk_columns_rec.PK1_COLUMN_TYPE;
2232     x_pkcolumn2_name := l_pk_columns_rec.PK2_COLUMN_NAME;
2233     x_pkcolumn2_type := l_pk_columns_rec.PK2_COLUMN_TYPE;
2234     x_pkcolumn3_name := l_pk_columns_rec.PK3_COLUMN_NAME;
2235     x_pkcolumn3_type := l_pk_columns_rec.PK3_COLUMN_TYPE;
2236     x_pkcolumn4_name := l_pk_columns_rec.PK4_COLUMN_NAME;
2237     x_pkcolumn4_type := l_pk_columns_rec.PK4_COLUMN_TYPE;
2238     x_pkcolumn5_name := l_pk_columns_rec.PK5_COLUMN_NAME;
2239     x_pkcolumn5_type := l_pk_columns_rec.PK5_COLUMN_TYPE;
2240 
2241     CLOSE pk_columns_c;
2242 
2243 END Get_Pk_Columns;
2244 
2245 ----------------------------------------------------------------------
2246 
2247                     --------------------------
2248                     -- Attribute Group APIs --
2249                     --------------------------
2250 
2251 ----------------------------------------------------------------------
2252 
2253 PROCEDURE Create_Attribute_Group (
2254         p_api_version                   IN   NUMBER
2255        ,p_application_id                IN   NUMBER
2256        ,p_attr_group_type               IN   VARCHAR2
2257        ,p_internal_name                 IN   VARCHAR2
2258        ,p_display_name                  IN   VARCHAR2
2259        ,p_attr_group_desc               IN   VARCHAR2
2260        ,p_security_type                 IN   VARCHAR2
2261        ,p_multi_row_attrib_group        IN   VARCHAR2
2262        ,p_variant_attrib_group          IN   VARCHAR2
2263        ,p_num_of_cols                   IN   NUMBER     DEFAULT NULL
2264        ,p_num_of_rows                   IN   NUMBER     DEFAULT NULL
2265        ,p_owning_company_id             IN   NUMBER
2266        ,p_region_code                   IN   VARCHAR2   DEFAULT NULL
2267        ,p_view_privilege_id             IN   NUMBER     DEFAULT NULL
2268        ,p_edit_privilege_id             IN   NUMBER     DEFAULT NULL
2269        ,p_business_event_flag           IN   VARCHAR2   DEFAULT NULL
2270        ,p_pre_business_event_flag       IN   VARCHAR2   DEFAULT NULL
2271        ,p_owner                         IN   NUMBER     DEFAULT NULL
2272        ,p_lud                           IN   DATE       DEFAULT SYSDATE
2273        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2274        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2275        ,x_attr_group_id                 OUT NOCOPY NUMBER
2276        ,x_return_status                 OUT NOCOPY VARCHAR2
2277        ,x_errorcode                     OUT NOCOPY NUMBER
2278        ,x_msg_count                     OUT NOCOPY NUMBER
2279        ,x_msg_data                      OUT NOCOPY VARCHAR2
2280 ) IS
2281 
2282     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Attribute_Group';
2283 
2284     --we don't use l_api_version yet, but eventually we might:
2285     --if we change required parameters, version goes from n.x to (n+1).x
2286     --if we change optional parameters, version goes from x.n to x.(n+1)
2287     l_api_version            CONSTANT NUMBER := 1.0;
2288 
2289     l_appl_short_name        FND_APPLICATION.APPLICATION_SHORT_NAME%TYPE;
2290     l_ext_table_name         VARCHAR2(30);
2291     l_table_owner            VARCHAR2(30);
2292     l_dynamic_sql            VARCHAR2(200);
2293     l_partition_count        NUMBER;
2294 
2295     l_attr_chg_b_table       VARCHAR2(30);
2296     l_attr_chg_tl_table      VARCHAR2(30);
2297 
2298     --Bug 4703510
2299       l_fnd_exists            VARCHAR2(1);
2300       l_ego_exists            VARCHAR2(1);
2301      --Bug 5443697
2302       l_start_num             VARCHAR2(1);
2303       l_start_und_sc          VARCHAR2(1);
2304       e_ag_starts_with_num    EXCEPTION;
2305       e_ag_starts_with_und_sc EXCEPTION;
2306       --Bug 6120553
2307       l_sql_errm     VARCHAR2(1000);
2308     --Bug 6048237
2309     l_num_of_cols           NUMBER := p_num_of_cols;
2310     l_num_of_rows           NUMBER := p_num_of_rows;
2311 
2312 
2313   BEGIN
2314 
2315     -- Standard start of API savepoint
2316     IF FND_API.To_Boolean(p_commit) THEN
2317       SAVEPOINT Create_Attribute_Group_PUB;
2318     END IF;
2319 
2320     -- Check for call compatibility
2321     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
2322                                         l_api_name, G_PKG_NAME)
2323     THEN
2324 
2325       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2326     END IF;
2327     -- Initialize message list even though we don't currently use it
2328     IF FND_API.To_Boolean(p_init_msg_list) THEN
2329       FND_MSG_PUB.Initialize;
2330     END IF;
2331 -----------------------------------
2332    --check if the Attribute Group name begins with a number.
2333     --Bug 5443697
2334     has_Num_Start_char (p_internal_name =>p_internal_name,
2335                         x_start_num => l_start_num);
2336     IF (l_start_num = 'Y') THEN
2337       RAISE e_ag_starts_with_num;
2338     END IF;
2339 
2340    --check if the Attribute Group name begins with an under score.
2341     --Bug 5443697
2342     has_Given_Char_As_Start_char (p_internal_name =>p_internal_name,
2343                                   p_char_set =>'_',
2344                                   x_start_und_sc => l_start_und_sc);
2345     IF (l_start_und_sc = 'Y') THEN
2346       RAISE e_ag_starts_with_und_sc;
2347     END IF;
2348 
2349     --Initialize num cols and rows.
2350     --Bug 6048237
2351     IF p_multi_row_attrib_group = 'Y' THEN
2352       IF l_num_of_cols is null THEN
2353         l_num_of_cols := 5;
2354       END IF;
2355       IF l_num_of_rows is null THEN
2356         l_num_of_rows := 5;
2357       END IF;
2358     ELSIF p_multi_row_attrib_group = 'N' THEN
2359       IF l_num_of_cols is null THEN
2360         l_num_of_cols := 2;
2361       END IF;
2362     END IF;
2363 
2364     --Bug 4703510 START
2365     Get_fnd_ego_record_exists (
2366                      p_context=>'ATTRIBUTE GROUP'
2367                     ,p_application_id => p_application_id
2368                     ,p_attr_group_type => p_attr_group_type
2369                     ,p_attr_group_name => NULL
2370                     ,p_internal_name => p_internal_name
2371                     ,x_fnd_exists => l_fnd_exists
2372                     ,x_ego_exists => l_ego_exists
2373                     );
2374   IF (l_fnd_exists = 'Y') THEN --Bug 4703510
2375 
2376     UPDATE FND_DESCR_FLEX_CONTEXTS
2377        SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
2378            LAST_UPDATE_DATE = p_lud,
2379            LAST_UPDATE_LOGIN = g_current_login_id
2380      WHERE DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
2381        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name
2382        AND APPLICATION_ID = p_application_id;
2383 
2384     UPDATE FND_DESCR_FLEX_CONTEXTS_TL
2385        SET DESCRIPTION = p_attr_group_desc,
2386            DESCRIPTIVE_FLEX_CONTEXT_NAME = p_display_name,
2387            LAST_UPDATE_DATE = p_lud,
2388            LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
2389            LAST_UPDATE_LOGIN = g_current_login_id,
2390            SOURCE_LANG = USERENV('LANG')
2391      WHERE APPLICATION_ID = p_application_id
2392        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
2393        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name
2394        AND USERENV('LANG') in (LANGUAGE , SOURCE_LANG);
2395   ELSE --l_fnd_exists = 'Y'
2396      SELECT APPLICATION_SHORT_NAME
2397       INTO l_appl_short_name
2398       FROM FND_APPLICATION
2399      WHERE APPLICATION_ID = p_application_id;
2400     fnd_flex_dsc_api.set_session_mode('customer_data');
2401     fnd_flex_dsc_api.create_context(appl_short_name => l_appl_short_name,
2402                                     flexfield_name  => p_attr_group_type,
2403                                     context_code    => p_internal_name,
2404                                     context_name    => p_display_name,
2405                                     description     =>  p_attr_group_desc,
2406                                     enabled         => 'N',
2407                                     global_flag     => 'N');
2408   END IF;--l_fnd_exists = 'Y' Bug 4703510:END
2409 
2410   IF (l_ego_exists <> 'Y' ) THEN
2411 
2412     SELECT EGO_ATTR_GROUPS_S.NEXTVAL INTO x_attr_group_id FROM DUAL;
2413     INSERT INTO EGO_FND_DSC_FLX_CTX_EXT
2414     (
2415         ATTR_GROUP_ID
2416        ,APPLICATION_ID
2417        ,DESCRIPTIVE_FLEXFIELD_NAME
2418        ,DESCRIPTIVE_FLEX_CONTEXT_CODE
2419        ,MULTI_ROW
2420        ,VARIANT             --VARIANT(R12C)
2421        ,NUM_OF_COLS
2422        ,NUM_OF_ROWS
2423        ,SECURITY_TYPE
2424        ,OWNING_PARTY_ID
2425        ,REGION_CODE
2426        ,VIEW_PRIVILEGE_ID
2427        ,EDIT_PRIVILEGE_ID
2428        ,BUSINESS_EVENT_FLAG
2429        ,PRE_BUSINESS_EVENT_FLAG
2430        ,CREATED_BY
2431        ,CREATION_DATE
2432        ,LAST_UPDATED_BY
2433        ,LAST_UPDATE_DATE
2434        ,LAST_UPDATE_LOGIN
2435     )
2436     VALUES
2437     (
2438         x_attr_group_id                     --ATTR_GROUP_ID
2439        ,p_application_id                    --APPLICATION_ID
2440        ,p_attr_group_type                   --DESCRIPTIVE_FLEXFIELD_NAME
2441        ,p_internal_name                     --DESCRIPTIVE_FLEX_CONTEXT_CODE
2442        ,nvl(p_multi_row_attrib_group, 'N')  --MULTI_ROW
2443        ,p_variant_attrib_group             --VARIANT
2444        ,l_num_of_cols
2445        ,l_num_of_rows
2446        ,nvl(p_security_type, 'P')           --SECURITY_TYPE
2447        ,-100                                --p_owning_company_id   --OWNING_PARTY_ID
2448        ,p_region_code                       --p_region_code
2449        ,p_view_privilege_id                 -- View privilege
2450        ,p_edit_privilege_id                 -- Edit privilege
2451        ,p_business_event_flag               --BUSINESS_EVENT_FLAG
2452        ,p_pre_business_event_flag          --PRE_BUSINESS_EVENT_FLAG
2453        ,NVL(p_owner, g_current_user_id)     --CREATED_BY
2454        ,p_lud                               --CREATION_DATE
2455        ,NVL(p_owner, g_current_user_id)     --LAST_UPDATED_BY
2456        ,p_lud                               --LAST_UPDATE_DATE
2457        ,g_current_login_id                  --LAST_UPDATE_LOGIN
2458     );
2459 
2460 
2461     -------------------------------------------------------------------
2462     -- Now we add a partition to the Extension Table that will store --
2463     -- data for this Attribute Group so that if this Attribute Group --
2464     -- gets associated and data for it get stored in that table,     --
2465     -- query performance will be optimized.                          --
2466     -------------------------------------------------------------------
2467 
2468     --------------------------------
2469     --  partition extention table --
2470     --------------------------------
2471     l_ext_table_name := Get_Table_Name(p_application_id
2472                                       ,p_attr_group_type);
2473 
2474     l_table_owner := Get_Application_Owner(p_application_id);
2475 
2476     SELECT COUNT(*) into l_partition_count
2477     FROM ALL_TAB_PARTITIONS
2478     WHERE
2479      table_name = l_ext_table_name
2480      and table_owner = l_table_owner;
2481 
2482     if (l_partition_count > 0)  THEN
2483       l_dynamic_sql := ' ALTER TABLE '|| l_table_owner || '.' || l_ext_table_name ||
2484                        ' ADD PARTITION ag_' || x_attr_group_id ||
2485                        ' VALUES LESS THAN (' || (x_attr_group_id + 1) || ')';
2486 
2487       l_sql_errm := Execute_DDL_And_Return_Err(l_dynamic_sql);
2488       IF(l_sql_errm IS NOT NULL) THEN
2489         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2490       END IF;
2491       --EXECUTE IMMEDIATE l_dynamic_sql;
2492 
2493     END IF;
2494 
2495     -----------------------------------
2496     --  partition extention TL table --
2497     -----------------------------------
2498     l_ext_table_name := Get_TL_Table_Name(p_application_id
2499                                          ,p_attr_group_type);
2500 
2501     l_table_owner := Get_Application_Owner(p_application_id);
2502 
2503     IF (l_ext_table_name IS NOT NULL) THEN
2504 
2505       SELECT COUNT(*) into l_partition_count
2506       FROM ALL_TAB_PARTITIONS
2507       WHERE
2508        table_name = l_ext_table_name
2509        and table_owner = l_table_owner;
2510 
2511       if (l_partition_count > 0)  THEN
2512 
2513         l_dynamic_sql := ' ALTER TABLE '|| l_table_owner || '.' || l_ext_table_name ||
2514                          ' ADD PARTITION ag_' || x_attr_group_id ||
2515                          ' VALUES LESS THAN (' || (x_attr_group_id + 1) || ')';
2516 
2517         l_sql_errm := Execute_DDL_And_Return_Err(l_dynamic_sql);
2518         IF(l_sql_errm IS NOT NULL) THEN
2519 
2520           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2521         END IF;
2522         --EXECUTE IMMEDIATE l_dynamic_sql;
2523 
2524       END IF;
2525 
2526     END IF;
2527 
2528 /*    -- bug: 3801472
2529     -- partition the Attribute Changes Tables
2530 
2531 
2532   EGO_EXT_FWK_PUB.Get_Attr_Changes_Table
2533      (p_attr_group_type  => p_attr_group_type
2534       ,x_base_table       => l_attr_chg_b_table
2535       ,x_tl_table         => l_attr_chg_tl_table
2536       );*/
2537     --Creating the partitions on the Pending tables
2538     l_attr_chg_b_table := Get_Attr_Changes_B_Table(p_application_id =>p_application_id
2539                                                                        ,p_attr_group_type => p_attr_group_type);
2540     l_table_owner := Get_Application_Owner(p_appl_id => p_application_id);
2541 
2542     IF l_attr_chg_b_table IS NOT NULL THEN
2543       SELECT COUNT(*)
2544       INTO l_partition_count
2545       FROM ALL_TAB_PARTITIONS
2546       WHERE table_name = l_attr_chg_b_table
2547        AND table_owner = l_table_owner;
2548 
2549       IF (l_partition_count > 0)  THEN
2550         l_dynamic_sql := ' ALTER TABLE '|| l_table_owner || '.' || l_attr_chg_b_table ||
2551                          ' ADD PARTITION ag_' || x_attr_group_id ||
2552                          ' VALUES LESS THAN (' || (x_attr_group_id + 1) || ')';
2553 
2554         EXECUTE IMMEDIATE l_dynamic_sql;
2555       END IF; --IF (l_partition_count > 0)
2556     END IF;--IF l_attr_chg_b_table IS NOT NULL
2557 
2558     l_attr_chg_tl_table := Get_Attr_Changes_TL_Table(p_application_id => p_application_id
2559                                                      ,p_attr_group_type => p_attr_group_type);
2560 
2561     l_table_owner := Get_Application_Owner(p_appl_id => p_application_id);
2562 
2563     IF l_attr_chg_tl_table IS NOT NULL THEN
2564       SELECT COUNT(*)
2565       INTO l_partition_count
2566       FROM ALL_TAB_PARTITIONS
2567       WHERE table_name = l_attr_chg_tl_table
2568        AND table_owner = l_table_owner;
2569 
2570       IF (l_partition_count > 0)  THEN
2571         l_dynamic_sql := ' ALTER TABLE '|| l_table_owner || '.' || l_attr_chg_tl_table ||
2572                          ' ADD PARTITION ag_' || x_attr_group_id ||
2573                          ' VALUES LESS THAN (' || (x_attr_group_id + 1) || ')';
2574 
2575         EXECUTE IMMEDIATE l_dynamic_sql;
2576       END IF;
2577     END IF;
2578     -- Standard check of p_commit
2579     IF FND_API.To_Boolean(p_commit) THEN
2580       COMMIT WORK;
2581     END IF;
2582     x_return_status := FND_API.G_RET_STS_SUCCESS;
2583   ELSE --l_ego_exists <> Y --Bug 4703510
2584     IF FND_API.To_Boolean(p_commit) THEN
2585       ROLLBACK TO Create_Attribute_Group_PUB;
2586     END IF;
2587       x_return_status := FND_API.G_RET_STS_ERROR;
2588       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_GRP_EXIST');
2589       FND_MSG_PUB.Add;
2590       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2591                                ,p_count   => x_msg_count
2592                                ,p_data    => x_msg_data);
2593   END IF; --l_ego_exists <> Y --Bug 4703510
2594 
2595   EXCEPTION
2596    --Bug 5443697
2597     WHEN e_ag_starts_with_num THEN
2598     IF FND_API.TO_BOOLEAN(p_commit) THEN
2599       ROLLBACK TO Create_Attribute_Group_PUB;
2600     END IF;
2601       x_return_status := FND_API.G_RET_STS_ERROR;
2602       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_AG_NAME_ST_NUM');
2603       FND_MSG_PUB.Add;
2604       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2605                                ,p_count   => x_msg_count
2606                                ,p_data    => x_msg_data);
2607 
2608    --Bug 5443697
2609     WHEN e_ag_starts_with_und_sc THEN
2610     IF FND_API.TO_BOOLEAN(p_commit) THEN
2611       ROLLBACK TO Create_Attribute_Group_PUB;
2612     END IF;
2613       x_return_status := FND_API.G_RET_STS_ERROR;
2614       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_AG_NAME_ST_UND_SC');
2615       FND_MSG_PUB.Add;
2616       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2617                                ,p_count   => x_msg_count
2618                                ,p_data    => x_msg_data);
2619 
2620     WHEN OTHERS THEN
2621       IF FND_API.To_Boolean(p_commit) THEN
2622         ROLLBACK TO Create_Attribute_Group_PUB;
2623       END IF;
2624 
2625       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2626 
2627       IF (INSTR(SQLERRM, 'ORA-00001') <> 0) THEN
2628         SELECT MESSAGE_TEXT INTO x_msg_data
2629           FROM FND_NEW_MESSAGES
2630          WHERE MESSAGE_NAME = 'EGO_INTERNAL_NAME_EXISTS'
2631            AND LANGUAGE_CODE = USERENV('LANG');
2632       ELSE
2633         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
2634         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
2635         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
2636         -- SQLERRM from the autonomous transaction will not be reflected here
2637         -- x_msg_data will maintain the SQLERRM generated in the autonomous transaction.
2638         -- Bug 6120553
2639         FND_MESSAGE.Set_Token('SQL_ERR_MSG', NVL(l_sql_errm, SQLERRM)||' '||FND_FLEX_DSC_API.Message());
2640         FND_MSG_PUB.Add;
2641         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2642                                  ,p_count   => x_msg_count
2643                                  ,p_data    => x_msg_data);
2644       END IF;
2645 
2646 END Create_Attribute_Group;
2647 
2648 ----------------------------------------------------------------------
2649 
2650 -- Wrapper for JSPs that aren't set up to take ATTR_GROUP_ID --
2651 PROCEDURE Create_Attribute_Group (
2652         p_api_version                   IN   NUMBER
2653        ,p_application_id                IN   NUMBER
2654        ,p_attr_group_type               IN   VARCHAR2
2655        ,p_internal_name                 IN   VARCHAR2
2656        ,p_display_name                  IN   VARCHAR2
2657        ,p_attr_group_desc               IN   VARCHAR2
2658        ,p_security_type                 IN   VARCHAR2
2659        ,p_multi_row_attrib_group        IN   VARCHAR2
2660        ,p_variant_attrib_group          IN   VARCHAR2
2661        ,p_num_of_cols                   IN   NUMBER     DEFAULT NULL
2662        ,p_num_of_rows                   IN   NUMBER     DEFAULT NULL
2663        ,p_owning_company_id             IN   NUMBER
2664        ,p_region_code                   IN   VARCHAR2   DEFAULT NULL
2665        ,p_view_privilege_id             IN   NUMBER     DEFAULT NULL
2666        ,p_edit_privilege_id             IN   NUMBER     DEFAULT NULL
2667        ,p_business_event_flag           IN   VARCHAR2   DEFAULT NULL
2668        ,p_pre_business_event_flag       IN   VARCHAR2   DEFAULT NULL
2669        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2670        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2671        ,x_return_status                 OUT NOCOPY VARCHAR2
2672        ,x_errorcode                     OUT NOCOPY NUMBER
2673        ,x_msg_count                     OUT NOCOPY NUMBER
2674        ,x_msg_data                      OUT NOCOPY VARCHAR2
2675 ) IS
2676 
2677     l_attr_group_id          NUMBER;
2678 
2679   BEGIN
2680 
2681     EGO_EXT_FWK_PUB.Create_Attribute_Group
2682     (
2683         p_api_version                   => p_api_version
2684        ,p_application_id                => p_application_id
2685        ,p_attr_group_type               => p_attr_group_type
2686        ,p_internal_name                 => p_internal_name
2687        ,p_display_name                  => p_display_name
2688        ,p_attr_group_desc               => p_attr_group_desc
2689        ,p_security_type                 => p_security_type
2690        ,p_multi_row_attrib_group        => p_multi_row_attrib_group
2691        ,p_variant_attrib_group          => p_variant_attrib_group
2692        ,p_num_of_cols                   => p_num_of_cols
2693        ,p_num_of_rows                   => p_num_of_rows
2694        ,p_owning_company_id             => p_owning_company_id
2695        ,p_region_code                   => p_region_code
2696        ,p_view_privilege_id             => p_view_privilege_id
2697        ,p_edit_privilege_id             => p_edit_privilege_id
2698        ,p_business_event_flag           => p_business_event_flag
2699        ,p_pre_business_event_flag       => p_pre_business_event_flag
2700        ,p_init_msg_list                 => p_init_msg_list
2701        ,p_commit                        => p_commit
2702        ,x_attr_group_id                 => l_attr_group_id
2703        ,x_return_status                 => x_return_status
2704        ,x_errorcode                     => x_errorcode
2705        ,x_msg_count                     => x_msg_count
2706        ,x_msg_data                      => x_msg_data
2707     );
2708 
2709 END Create_Attribute_Group;
2710 
2711 ----------------------------------------------------------------------
2712 
2713 PROCEDURE Copy_Attribute_Group (
2714         p_api_version                   IN   NUMBER
2715        ,p_source_ag_app_id              IN   NUMBER
2716        ,p_source_ag_type                IN   VARCHAR2
2717        ,p_source_ag_name                IN   VARCHAR2
2718        ,p_dest_ag_app_id                IN   NUMBER
2719        ,p_dest_ag_type                  IN   VARCHAR2
2720        ,p_dest_ag_name                  IN   VARCHAR2
2721        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2722        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2723        ,x_attr_group_id                 OUT NOCOPY NUMBER
2724        ,x_return_status                 OUT NOCOPY VARCHAR2
2725        ,x_errorcode                     OUT NOCOPY NUMBER
2726        ,x_msg_count                     OUT NOCOPY NUMBER
2727        ,x_msg_data                      OUT NOCOPY VARCHAR2
2728 ) IS
2729 
2730     l_api_name               CONSTANT VARCHAR2(30) := 'Copy_Attribute_Group';
2731 
2732     l_lang_installed_flag    FND_LANGUAGES.INSTALLED_FLAG%TYPE;
2733 
2734     --we don't use l_api_version yet, but eventually we might:
2735     --if we change required parameters, version goes from n.x to (n+1).x
2736     --if we change optional parameters, version goes from x.n to x.(n+1)
2737     l_api_version            CONSTANT NUMBER := 1.0;
2738 
2739     l_return_status VARCHAR(1);
2740     l_errorcode NUMBER;
2741     l_msg_count NUMBER;
2742     l_msg_data VARCHAR2(1000);
2743 
2744     CURSOR ego_attribute_csr
2745     (
2746         v_source_ag_app_id              IN   EGO_ATTRS_V.APPLICATION_ID%TYPE
2747        ,v_source_ag_type                IN   EGO_ATTRS_V.ATTR_GROUP_TYPE%TYPE
2748        ,v_source_ag_name                IN   EGO_ATTRS_V.ATTR_GROUP_NAME%TYPE
2749     ) IS
2750     SELECT APPLICATION_ID,
2751            ATTR_GROUP_TYPE,
2752            ATTR_GROUP_NAME,
2753            ATTR_NAME,
2754            ATTR_DISPLAY_NAME,
2755            DESCRIPTION,
2756            DATA_TYPE_CODE,
2757            SEQUENCE,
2758            UNIQUE_KEY_FLAG,
2759            DEFAULT_VALUE,
2760            INFO_1,
2761            VALUE_SET_ID,
2762            ENABLED_FLAG,
2763            REQUIRED_FLAG,
2764            SEARCH_FLAG,
2765            DISPLAY_CODE,
2766            DATABASE_COLUMN,
2767            UOM_CLASS,
2768            DECODE(DISPLAY_CODE,'D',1,0) DISP_CODE --bugFix:5589398
2769       FROM EGO_ATTRS_V
2770      WHERE APPLICATION_ID = v_source_ag_app_id
2771        AND ATTR_GROUP_TYPE = v_source_ag_type
2772        AND ATTR_GROUP_NAME = v_source_ag_name
2773   ORDER BY DISP_CODE, SEQUENCE;
2774 
2775     l_sequence        ego_attrs_v.sequence%TYPE;
2776     ego_attribute_rec ego_attribute_csr%ROWTYPE;
2777     l_sequence_numbers VARCHAR2(10000);
2778 
2779   BEGIN
2780 
2781     -- Standard start of API savepoint
2782     IF FND_API.TO_BOOLEAN(p_commit) THEN
2783       SAVEPOINT Copy_Attribute_Group_PUB;
2784     END IF;
2785 
2786     -- Check for call compatibility
2787     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
2788                                         l_api_name, G_PKG_NAME)
2789     THEN
2790       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2791     END IF;
2792     -- Initialize message list even though we don't currently use it
2793     IF FND_API.To_Boolean(p_init_msg_list) THEN
2794       FND_MSG_PUB.Initialize;
2795     END IF;
2796 
2797     l_sequence_numbers := '  ';
2798 
2799     OPEN ego_attribute_csr (v_source_ag_app_id => p_source_ag_app_id,
2800                             v_source_ag_type => p_source_ag_type,
2801                             v_source_ag_name => p_source_ag_name);
2802     LOOP
2803       FETCH ego_attribute_csr INTO ego_attribute_rec;
2804       EXIT WHEN ego_attribute_csr%NOTFOUND;
2805 /*
2806       IF l_sequence IS NULL THEN
2807         l_sequence := ego_attribute_rec.SEQUENCE;
2808       ELSIF l_sequence >= ego_attribute_rec.SEQUENCE THEN
2809         l_sequence := l_sequence + 1;
2810       ELSIF l_sequence < ego_attribute_rec.SEQUENCE THEN
2811         l_sequence := ego_attribute_rec.SEQUENCE;
2812       END IF;
2813 */
2814 --Commented out the above logic and added the following while loop to
2815 --take care of the case for bug 4874670 where two attributes have the same seq no
2816 --The above logic was failing for the changes made for bugfix 5589398.
2817      l_sequence := ego_attribute_rec.SEQUENCE;
2818       WHILE(INSTR(l_sequence_numbers,(' '||l_sequence||' ')) <> 0 AND INSTR(l_sequence_numbers,(' '||l_sequence||' ')) IS NOT NULL)
2819       LOOP
2820   l_sequence := l_sequence+10;
2821       END LOOP;
2822       l_sequence_numbers := l_sequence_numbers||' '||l_sequence||' ';
2823 
2824 
2825       EGO_EXT_FWK_PUB.Create_Attribute(
2826         p_api_version           => l_api_version
2827        ,p_application_id        => p_dest_ag_app_id
2828        ,p_attr_group_type       => p_dest_ag_type
2829        ,p_attr_group_name       => p_dest_ag_name
2830        ,p_internal_name         => ego_attribute_rec.ATTR_NAME
2831        ,p_display_name          => ego_attribute_rec.ATTR_DISPLAY_NAME
2832        ,p_description           => ego_attribute_rec.DESCRIPTION
2833        ,p_sequence              => l_sequence
2834        ,p_data_type             => ego_attribute_rec.DATA_TYPE_CODE
2835        ,p_required              => ego_attribute_rec.REQUIRED_FLAG
2836        ,p_searchable            => ego_attribute_rec.SEARCH_FLAG
2837        ,p_column                => ego_attribute_rec.DATABASE_COLUMN
2838        ,p_is_column_indexed     => NULL --this will force Create_Attribute to query
2839        ,p_value_set_id          => ego_attribute_rec.VALUE_SET_ID
2840        ,p_info_1                => ego_attribute_rec.INFO_1
2841        ,p_default_value         => ego_attribute_rec.DEFAULT_VALUE
2842        ,p_unique_key_flag       => ego_attribute_rec.UNIQUE_KEY_FLAG
2843        ,p_enabled               => ego_attribute_rec.ENABLED_FLAG
2844        ,p_display               => ego_attribute_rec.DISPLAY_CODE
2845        ,p_uom_class             => ego_attribute_rec.UOM_CLASS
2846        ,p_init_msg_list         => FND_API.G_FALSE
2847        ,p_commit                => FND_API.G_FALSE
2848        ,x_return_status         => l_return_status
2849        ,x_errorcode             => l_errorcode
2850        ,x_msg_count             => l_msg_count
2851        ,x_msg_data              => l_msg_data
2852       );
2853    END LOOP;
2854    CLOSE ego_attribute_csr;
2855 
2856     -- Standard check of p_commit
2857     IF FND_API.To_Boolean(p_commit) THEN
2858       COMMIT WORK;
2859     END IF;
2860 
2861     x_return_status := FND_API.G_RET_STS_SUCCESS;
2862 
2863   EXCEPTION
2864     WHEN OTHERS THEN
2865       IF FND_API.TO_BOOLEAN(p_commit) THEN
2866         ROLLBACK TO Copy_Attribute_Group_PUB;
2867       END IF;
2868       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2869       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
2870       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
2871       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
2872       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
2873       FND_MSG_PUB.Add;
2874       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
2875                                ,p_count   => x_msg_count
2876                                ,p_data    => x_msg_data);
2877 
2878 END Copy_Attribute_Group;
2879 
2880 ----------------------------------------------------------------------
2881 
2882 -- Wrapper for JSPs that aren't set up to take ATTR_GROUP_ID --
2883 PROCEDURE Copy_Attribute_Group (
2884         p_api_version                   IN   NUMBER
2885        ,p_source_ag_app_id              IN   NUMBER
2886        ,p_source_ag_type                IN   VARCHAR2
2887        ,p_source_ag_name                IN   VARCHAR2
2888        ,p_dest_ag_app_id                IN   NUMBER
2889        ,p_dest_ag_type                  IN   VARCHAR2
2890        ,p_dest_ag_name                  IN   VARCHAR2
2891        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2892        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2893        ,x_return_status                 OUT NOCOPY VARCHAR2
2894        ,x_errorcode                     OUT NOCOPY NUMBER
2895        ,x_msg_count                     OUT NOCOPY NUMBER
2896        ,x_msg_data                      OUT NOCOPY VARCHAR2
2897 ) IS
2898 
2899     l_attr_group_id          NUMBER;
2900 
2901   BEGIN
2902 
2903     EGO_EXT_FWK_PUB.Copy_Attribute_Group
2904     (
2905         p_api_version         => p_api_version
2906        ,p_source_ag_app_id    => p_source_ag_app_id
2907        ,p_source_ag_type      => p_source_ag_type
2908        ,p_source_ag_name      => p_source_ag_name
2909        ,p_dest_ag_app_id      => p_dest_ag_app_id
2910        ,p_dest_ag_type        => p_dest_ag_type
2911        ,p_dest_ag_name        => p_dest_ag_name
2912        ,p_init_msg_list       => p_init_msg_list
2913        ,p_commit              => p_commit
2914        ,x_attr_group_id       => l_attr_group_id
2915        ,x_return_status       => x_return_status
2916        ,x_errorcode           => x_errorcode
2917        ,x_msg_count           => x_msg_count
2918        ,x_msg_data            => x_msg_data
2919     );
2920 
2921 END Copy_Attribute_Group;
2922 
2923 ----------------------------------------------------------------------
2924 
2925 -- Wrapper for OA to pass source ATTR_GROUP_ID instead of Application Id, AG Type and AG Name--
2926 PROCEDURE Copy_Attribute_Group (
2927         p_api_version                   IN   NUMBER
2928        ,p_source_attr_group_id          IN   NUMBER
2929        ,p_dest_ag_app_id                IN   NUMBER
2930        ,p_dest_ag_type                  IN   VARCHAR2
2931        ,p_dest_ag_name                  IN   VARCHAR2
2932        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2933        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2934        ,x_attr_group_id                 OUT NOCOPY NUMBER
2935        ,x_return_status                 OUT NOCOPY VARCHAR2
2936        ,x_errorcode                     OUT NOCOPY NUMBER
2937        ,x_msg_count                     OUT NOCOPY NUMBER
2938        ,x_msg_data                      OUT NOCOPY VARCHAR2
2939 ) IS
2940 
2941     l_attr_group_pks         EGO_VARCHAR_TBL_TYPE;
2942 
2943   BEGIN
2944 
2945     l_attr_group_pks := Get_PKs_From_Attr_Group_Id(p_source_attr_group_id);
2946     IF l_attr_group_pks IS NULL THEN
2947       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2948     END IF;
2949 
2950     EGO_EXT_FWK_PUB.Copy_Attribute_Group
2951     (
2952         p_api_version         => p_api_version
2953        ,p_source_ag_app_id    => l_attr_group_pks(1)
2954        ,p_source_ag_type      => l_attr_group_pks(2)
2955        ,p_source_ag_name      => l_attr_group_pks(3)
2956        ,p_dest_ag_app_id      => p_dest_ag_app_id
2957        ,p_dest_ag_type        => p_dest_ag_type
2958        ,p_dest_ag_name        => p_dest_ag_name
2959        ,p_init_msg_list       => p_init_msg_list
2960        ,p_commit              => p_commit
2961        ,x_attr_group_id       => x_attr_group_id
2962        ,x_return_status       => x_return_status
2963        ,x_errorcode           => x_errorcode
2964        ,x_msg_count           => x_msg_count
2965        ,x_msg_data            => x_msg_data
2966     );
2967 
2968 END Copy_Attribute_Group;
2969 
2970 ---------------------------------------------------------------------------
2971 
2972 
2973 PROCEDURE Update_Attribute_Group (
2974         p_api_version                   IN   NUMBER
2975        ,p_attr_group_id                 IN   NUMBER
2976        ,p_display_name                  IN   VARCHAR2
2977        ,p_attr_group_desc               IN   VARCHAR2
2978        ,p_security_type                 IN   VARCHAR2
2979        ,p_multi_row_attrib_group        IN   VARCHAR2
2980        ,p_variant_attrib_group          IN   VARCHAR2
2981        ,p_num_of_cols                   IN   NUMBER     DEFAULT NULL
2982        ,p_num_of_rows                   IN   NUMBER     DEFAULT NULL
2983        ,p_owning_company_id             IN   NUMBER
2984        ,p_region_code                   IN   VARCHAR2   DEFAULT NULL
2985        ,p_view_privilege_id             IN   NUMBER     DEFAULT NULL
2986        ,p_edit_privilege_id             IN   NUMBER     DEFAULT NULL
2987        ,p_business_event_flag           IN   VARCHAR2   DEFAULT NULL
2988        ,p_pre_business_event_flag       IN   VARCHAR2   DEFAULT NULL
2989        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
2990        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
2991        ,x_return_status                 OUT NOCOPY VARCHAR2
2992        ,x_errorcode                     OUT NOCOPY NUMBER
2993        ,x_msg_count                     OUT NOCOPY NUMBER
2994        ,x_msg_data                      OUT NOCOPY VARCHAR2
2995 ) IS
2996 
2997     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Attribute_Group';
2998     l_attr_group_pks         EGO_VARCHAR_TBL_TYPE;
2999 
3000   BEGIN
3001 
3002     -- Standard start of API savepoint
3003     IF FND_API.TO_BOOLEAN(p_commit) THEN
3004       SAVEPOINT Update_Attribute_Group_PUB;
3005     END IF;
3006 
3007     l_attr_group_pks := Get_PKs_From_Attr_Group_Id(p_attr_group_id);
3008     IF l_attr_group_pks IS NULL THEN
3009       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3010     END IF;
3011 
3012     EGO_EXT_FWK_PUB.Update_Attribute_Group(
3013         p_api_version              => p_api_version
3014        ,p_application_id           => l_attr_group_pks(1)
3015        ,p_attr_group_type          => l_attr_group_pks(2)
3016        ,p_internal_name            => l_attr_group_pks(3)
3017        ,p_display_name             => p_display_name
3018        ,p_attr_group_desc          => p_attr_group_desc
3019        ,p_security_type            => p_security_type
3020        ,p_multi_row_attrib_group   => p_multi_row_attrib_group
3021        ,p_variant_attrib_group     => p_variant_attrib_group
3022        ,p_num_of_cols              => p_num_of_cols
3023        ,p_num_of_rows              => p_num_of_rows
3024        ,p_owning_company_id        => p_owning_company_id
3025        ,p_region_code              => p_region_code
3026        ,p_view_privilege_id        => p_view_privilege_id
3027        ,p_edit_privilege_id        => p_edit_privilege_id
3028        ,p_business_event_flag      => p_business_event_flag
3029        ,p_pre_business_event_flag  => p_pre_business_event_flag
3030        ,p_init_msg_list            => p_init_msg_list
3031        ,p_commit                   => p_commit
3032        ,x_return_status            => x_return_status
3033        ,x_errorcode                => x_errorcode
3034        ,x_msg_count                => x_msg_count
3035        ,x_msg_data                 => x_msg_data
3036     );
3037 
3038     -- Standard check of p_commit
3039     IF FND_API.To_Boolean(p_commit) THEN
3040       COMMIT WORK;
3041     END IF;
3042 
3043   EXCEPTION
3044     WHEN OTHERS THEN
3045       IF FND_API.TO_BOOLEAN(p_commit) THEN
3046         ROLLBACK TO Update_Attribute_Group_PUB;
3047       END IF;
3048       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3049 
3050       IF (l_attr_group_pks IS NULL) THEN
3051         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoPKsFoundForAttrGroupID';
3052       ELSE
3053         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
3054         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
3055         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
3056         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
3057         FND_MSG_PUB.Add;
3058         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
3059                                  ,p_count   => x_msg_count
3060                                  ,p_data    => x_msg_data);
3061       END IF;
3062 
3063 END Update_Attribute_Group;
3064 
3065 ----------------------------------------------------------------------
3066 
3067 PROCEDURE Update_Attribute_Group (
3068         p_api_version                   IN   NUMBER
3069        ,p_application_id                IN   NUMBER
3070        ,p_attr_group_type               IN   VARCHAR2
3071        ,p_internal_name                 IN   VARCHAR2
3072        ,p_display_name                  IN   VARCHAR2
3073        ,p_attr_group_desc               IN   VARCHAR2
3074        ,p_security_type                 IN   VARCHAR2
3075        ,p_multi_row_attrib_group        IN   VARCHAR2
3076        ,p_variant_attrib_group          IN   VARCHAR2
3077        ,p_num_of_cols                   IN   NUMBER     DEFAULT NULL
3078        ,p_num_of_rows                   IN   NUMBER     DEFAULT NULL
3079        ,p_owning_company_id             IN   NUMBER
3080        ,p_region_code                   IN   VARCHAR2   DEFAULT NULL
3081        ,p_view_privilege_id             IN   NUMBER     DEFAULT NULL
3082        ,p_edit_privilege_id             IN   NUMBER     DEFAULT NULL
3083        ,p_business_event_flag           IN   VARCHAR2   DEFAULT NULL
3084        ,p_pre_business_event_flag       IN   VARCHAR2   DEFAULT NULL
3085        ,p_owner                         IN   NUMBER     DEFAULT NULL
3086        ,p_lud                           IN   DATE       DEFAULT SYSDATE
3087        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
3088        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
3089        ,p_is_nls_mode                   IN   VARCHAR2   DEFAULT FND_API.G_FALSE
3090        ,x_return_status                 OUT NOCOPY VARCHAR2
3091        ,x_errorcode                     OUT NOCOPY NUMBER
3092        ,x_msg_count                     OUT NOCOPY NUMBER
3093        ,x_msg_data                      OUT NOCOPY VARCHAR2
3094 ) IS
3095 
3096     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Attribute_Group';
3097 
3098     --we don't use l_api_version yet, but eventually we might:
3099     --if we change required parameters, version goes from n.x to (n+1).x
3100     --if we change optional parameters, version goes from x.n to x.(n+1)
3101     l_api_version            CONSTANT NUMBER := 1.0;
3102     --Bug 6048237
3103     l_num_of_cols           NUMBER := p_num_of_cols;
3104     l_num_of_rows           NUMBER := p_num_of_rows;
3105 
3106 
3107   BEGIN
3108 
3109     -- Standard start of API savepoint
3110     IF FND_API.TO_BOOLEAN(p_commit) THEN
3111       SAVEPOINT Update_Attribute_Group_PUB;
3112     END IF;
3113 
3114     -- Check for call compatibility
3115     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
3116                                         l_api_name, G_PKG_NAME)
3117     THEN
3118       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3119     END IF;
3120     -- Initialize message list even though we don't currently use it
3121     IF FND_API.To_Boolean(p_init_msg_list) THEN
3122       FND_MSG_PUB.Initialize;
3123     END IF;
3124     --Initialize num cols and rows.
3125     --Bug 6048237
3126     IF p_multi_row_attrib_group = 'Y' THEN
3127       IF l_num_of_cols is null THEN
3128         l_num_of_cols := 5;
3129       END IF;
3130       IF l_num_of_rows is null THEN
3131         l_num_of_rows := 5;
3132       END IF;
3133     ELSIF p_multi_row_attrib_group = 'N' THEN
3134       IF l_num_of_cols is null THEN
3135         l_num_of_cols := 2;
3136       END IF;
3137     END IF;
3138 
3139     IF (FND_API.To_Boolean(p_is_nls_mode)) THEN
3140 
3141       -- We do this IF check this way so that if p_is_nls_mode is NULL,
3142       -- we still update the non-trans tables (i.e., we treat NULL as 'F')
3143       NULL;
3144 
3145     ELSE
3146 
3147       -- We only update this information if we are NOT in NLS mode
3148       -- (i.e., we don't update it if we are in NLS mode)
3149       UPDATE FND_DESCR_FLEX_CONTEXTS
3150          SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
3151              LAST_UPDATE_DATE = p_lud,
3152              LAST_UPDATE_LOGIN = g_current_login_id
3153        WHERE DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
3154          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name
3155          AND APPLICATION_ID = p_application_id;
3156 
3157       UPDATE EGO_FND_DSC_FLX_CTX_EXT
3158          SET MULTI_ROW = nvl(p_multi_row_attrib_group, MULTI_ROW),
3159              VARIANT = nvl(p_variant_attrib_group, VARIANT),
3160              NUM_OF_COLS = l_num_of_cols,
3161              NUM_OF_ROWS = l_num_of_rows,
3162              SECURITY_TYPE = nvl(p_security_type, SECURITY_TYPE),
3163              REGION_CODE = p_region_code,
3164              VIEW_PRIVILEGE_ID = p_view_privilege_id,
3165              EDIT_PRIVILEGE_ID = p_edit_privilege_id,
3166              BUSINESS_EVENT_FLAG = p_business_event_flag,
3167              PRE_BUSINESS_EVENT_FLAG = p_pre_business_event_flag,
3168              LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
3169              LAST_UPDATE_DATE = p_lud,
3170              LAST_UPDATE_LOGIN = g_current_login_id
3171        WHERE DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
3172          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name
3173          AND APPLICATION_ID = p_application_id;
3174 
3175     END IF;
3176 
3177     -- We update the TL information whether or not we're in NLS mode
3178     UPDATE FND_DESCR_FLEX_CONTEXTS_TL
3179        SET DESCRIPTION = p_attr_group_desc,
3180            DESCRIPTIVE_FLEX_CONTEXT_NAME = p_display_name,
3181            LAST_UPDATE_DATE = p_lud,
3182            LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
3183            LAST_UPDATE_LOGIN = g_current_login_id,
3184            SOURCE_LANG = USERENV('LANG')
3185      WHERE APPLICATION_ID = p_application_id
3186        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
3187        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_internal_name
3188       -- AND LANGUAGE = USERENV('LANG');
3189        AND USERENV('LANG') in (LANGUAGE , SOURCE_LANG);
3190 
3191     -- Standard check of p_commit
3192     IF FND_API.To_Boolean(p_commit) THEN
3193       COMMIT WORK;
3194     END IF;
3195 
3196     x_return_status := FND_API.G_RET_STS_SUCCESS;
3197 
3198   EXCEPTION
3199     WHEN OTHERS THEN
3200       IF FND_API.TO_BOOLEAN(p_commit) THEN
3201         ROLLBACK TO Update_Attribute_Group_PUB;
3202       END IF;
3203       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3204       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
3205       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
3206       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
3207       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
3208       FND_MSG_PUB.Add;
3209       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
3210                                ,p_count   => x_msg_count
3211                                ,p_data    => x_msg_data);
3212 
3213 END Update_Attribute_Group;
3214 
3215 ----------------------------------------------------------------------
3216 
3217 PROCEDURE Delete_Attribute_Group (
3218         p_api_version                   IN   NUMBER
3219        ,p_attr_group_id                 IN   NUMBER
3220        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
3221        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
3222        ,x_return_status                 OUT NOCOPY VARCHAR2
3223        ,x_errorcode                     OUT NOCOPY NUMBER
3224        ,x_msg_count                     OUT NOCOPY NUMBER
3225        ,x_msg_data                      OUT NOCOPY VARCHAR2
3226 ) IS
3227 
3228     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Attribute_Group';
3229     l_attr_group_pks         EGO_VARCHAR_TBL_TYPE;
3230 
3231   BEGIN
3232 
3233     -- Standard start of API savepoint
3234     IF FND_API.TO_BOOLEAN(p_commit) THEN
3235       SAVEPOINT Delete_Attribute_Group_PUB;
3236     END IF;
3237 
3238     l_attr_group_pks := Get_PKs_From_Attr_Group_Id(p_attr_group_id);
3239     IF l_attr_group_pks IS NULL THEN
3240       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3241     END IF;
3242 
3243     EGO_EXT_FWK_PUB.Delete_Attribute_Group(
3244         p_api_version        => p_api_version
3245        ,p_application_id     => l_attr_group_pks(1)
3246        ,p_attr_group_type    => l_attr_group_pks(2)
3247        ,p_attr_group_name    => l_attr_group_pks(3)
3248        ,p_init_msg_list      => p_init_msg_list
3249        ,p_commit             => p_commit
3250        ,x_return_status      => x_return_status
3251        ,x_errorcode          => x_errorcode
3252        ,x_msg_count          => x_msg_count
3253        ,x_msg_data           => x_msg_data
3254     );
3255 
3256     -- Standard check of p_commit
3257     IF FND_API.To_Boolean(p_commit) THEN
3258       COMMIT WORK;
3259     END IF;
3260 
3261     x_return_status := FND_API.G_RET_STS_SUCCESS;
3262 
3263   EXCEPTION
3264     WHEN OTHERS THEN
3265       IF FND_API.TO_BOOLEAN(p_commit) THEN
3266         ROLLBACK TO Delete_Attribute_Group_PUB;
3267       END IF;
3268       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3269 
3270       IF (l_attr_group_pks IS NULL) THEN
3271         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoPKsFoundForAttrGroupID';
3272       ELSE
3273         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
3274         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
3275         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
3276         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
3277         FND_MSG_PUB.Add;
3278         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
3279                                  ,p_count   => x_msg_count
3280                                  ,p_data    => x_msg_data);
3281       END IF;
3282 
3283 END Delete_Attribute_Group;
3284 
3285 ----------------------------------------------------------------------
3286 
3287 PROCEDURE Delete_Attribute_Group (
3288         p_api_version                   IN   NUMBER
3289        ,p_application_id                IN   NUMBER
3290        ,p_attr_group_type               IN   VARCHAR2
3291        ,p_attr_group_name               IN   VARCHAR2
3292        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
3293        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
3294        ,x_return_status                 OUT NOCOPY VARCHAR2
3295        ,x_errorcode                     OUT NOCOPY NUMBER
3296        ,x_msg_count                     OUT NOCOPY NUMBER
3297        ,x_msg_data                      OUT NOCOPY VARCHAR2
3298 ) IS
3299 
3300     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Attribute_Group';
3301     --we don't use l_api_version yet, but eventually we might:
3302     --if we change required parameters, version goes from n.x to (n+1).x
3303     --if we change optional parameters, version goes from x.n to x.(n+1)
3304     l_api_version            CONSTANT NUMBER := 1.0;
3305 
3306     l_assocs_exist           BOOLEAN;
3307     l_attr_group_disp_name   VARCHAR2(80);
3308 
3309   BEGIN
3310 
3311     -- Standard start of API savepoint
3312     IF FND_API.TO_BOOLEAN(p_commit) THEN
3313       SAVEPOINT Delete_Attribute_Group_PUB;
3314     END IF;
3315 
3316     -- Check for call compatibility
3317     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
3318                                         l_api_name, G_PKG_NAME)
3319     THEN
3320       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3321     END IF;
3322     -- Initialize message list even though we don't currently use it
3323     IF FND_API.To_Boolean(p_init_msg_list) THEN
3324       FND_MSG_PUB.Initialize;
3325     END IF;
3326 
3327     l_assocs_exist := Check_Associations_Exist(p_application_id,
3328                                                p_attr_group_type,
3329                                                p_attr_group_name);
3330 
3331     IF (l_assocs_exist) THEN
3332 
3333       x_return_status := FND_API.G_RET_STS_ERROR;
3334 
3335       SELECT DESCRIPTIVE_FLEX_CONTEXT_NAME
3336         INTO l_attr_group_disp_name
3337         FROM FND_DESCR_FLEX_CONTEXTS_TL
3338        WHERE APPLICATION_ID = p_application_id
3339          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
3340          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
3341          AND LANGUAGE = USERENV('LANG');
3342 
3343 
3344       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ASSOCS_EXIST1');
3345       FND_MESSAGE.Set_Token('ATTR_GRP_NAME', l_attr_group_disp_name);
3346       FND_MSG_PUB.Add;
3347       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
3348                                ,p_count   => x_msg_count
3349                                ,p_data    => x_msg_data);
3350 
3351     ELSE
3352 
3353       Delete_Attr_Group_Internal(p_application_id
3354                                 ,p_attr_group_type
3355                                 ,p_attr_group_name
3356                                 ,p_commit
3357                                 ,x_return_status
3358                                 ,x_errorcode
3359                                 ,x_msg_count
3360                                 ,x_msg_data);
3361 
3362     END IF;
3363 
3364     -- Standard check of p_commit
3365     IF FND_API.To_Boolean(p_commit) THEN
3366       COMMIT WORK;
3367     END IF;
3368 
3369     x_return_status := FND_API.G_RET_STS_SUCCESS;
3370 
3371   EXCEPTION
3372     WHEN OTHERS THEN
3373       IF FND_API.TO_BOOLEAN(p_commit) THEN
3374         ROLLBACK TO Delete_Attribute_Group_PUB;
3375       END IF;
3376       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3377 
3378       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
3379       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
3380       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
3381       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
3382       FND_MSG_PUB.Add;
3383       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
3384                                ,p_count   => x_msg_count
3385                                ,p_data    => x_msg_data);
3386 
3387 END Delete_Attribute_Group;
3388 
3389 ---------------------------------------------------------------------------
3390 
3391 PROCEDURE Compile_Attr_Group_View (
3392         p_api_version                   IN   NUMBER
3393        ,p_attr_group_id                 IN   NUMBER
3394        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
3395        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
3396        ,x_return_status                 OUT NOCOPY VARCHAR2
3397        ,x_errorcode                     OUT NOCOPY NUMBER
3398        ,x_msg_count                     OUT NOCOPY NUMBER
3399        ,x_msg_data                      OUT NOCOPY VARCHAR2
3400 ) IS
3401 
3402     l_api_name               CONSTANT VARCHAR2(30) := 'Compile_Attr_Group_View';
3403     l_attr_group_metadata_obj EGO_ATTR_GROUP_METADATA_OBJ;
3404     l_ext_table_metadata_obj EGO_EXT_TABLE_METADATA_OBJ;
3405     l_pk_col_names           VARCHAR2(1000);
3406     l_dl_col_names           VARCHAR2(1000);
3407     l_attr_metadata_table    EGO_ATTR_METADATA_TABLE;
3408     l_curr_attr_index        NUMBER;
3409     l_curr_attr_metadata_obj EGO_ATTR_METADATA_OBJ;
3410     l_to_char_db_col_expression VARCHAR2(90);
3411     p_pk_column_name_value_pairs EGO_COL_NAME_VALUE_PAIR_ARRAY;
3412     l_aliased_attr_names     VARCHAR2(32000);
3413     l_user_attrs_view_ddl    VARCHAR2(32757);
3414     l_ddl_error_message      VARCHAR2(1000);
3415     l_token_table            ERROR_HANDLER.Token_Tbl_Type;
3416     l_ext_table_name         FND_DESCRIPTIVE_FLEXS.APPLICATION_TABLE_NAME%TYPE;
3417 
3418     fnd_apps_schema      VARCHAR2(30) := NULL;
3419     h_status             VARCHAR2(2000);
3420     h_industry           VARCHAR2(2000);
3421     h_x                  BOOLEAN;
3422 
3423 
3424   BEGIN
3425 
3426     -- Standard start of API savepoint
3427     IF FND_API.TO_BOOLEAN(p_commit) THEN
3428       SAVEPOINT Compile_Attr_Group_View_PUB;
3429     END IF;
3430 
3431     ----------------------------------------------------------------
3432     -- Start by getting a metadata object for the Attribute Group --
3433     ----------------------------------------------------------------
3434     l_attr_group_metadata_obj := EGO_USER_ATTRS_COMMON_PVT.Get_Attr_Group_Metadata(
3435                                    p_attr_group_id                 => p_attr_group_id
3436                                    ,p_pick_from_cache              => FALSE
3437                                  );
3438 
3439     IF (l_attr_group_metadata_obj IS NOT NULL AND
3440         l_attr_group_metadata_obj.attr_metadata_table.COUNT > 0) THEN
3441 
3442       ---------------------------------------------------------
3443       -- Next, get a metadata object for the Extension Table --
3444       ---------------------------------------------------------
3445       l_ext_table_metadata_obj := EGO_USER_ATTRS_COMMON_PVT.Get_Ext_Table_Metadata(
3446                                     EGO_EXT_FWK_PUB.Get_Object_Id_For_AG_Type(
3447                                       l_attr_group_metadata_obj.APPLICATION_ID
3448                                      ,l_attr_group_metadata_obj.ATTR_GROUP_TYPE
3449                                     )
3450                                   );
3451 
3452       IF (l_ext_table_metadata_obj IS NOT NULL) THEN
3453 
3454         -----------------------------------------------------------------
3455         -- Build list strings for the Primary Key and Data Level names --
3456         -----------------------------------------------------------------
3457         l_pk_col_names := EGO_USER_ATTRS_COMMON_PVT.Get_List_For_Table_Cols(
3458                             l_ext_table_metadata_obj.pk_column_metadata
3459                            ,NULL
3460                            ,'NAMES'
3461                           );
3462 -- bug 6345399 fetching all the dl column names
3463 --        l_dl_col_names := EGO_USER_ATTRS_COMMON_PVT.Get_List_For_Table_Cols(
3464 --                            l_ext_table_metadata_obj.data_level_metadata
3465 --                           ,NULL
3466 --                           ,'NAMES'
3467 --                          );
3468         l_dl_col_names := EGO_USER_ATTRS_COMMON_PVT.Get_All_Data_Level_PK_Names(
3469                             p_application_id  => l_attr_group_metadata_obj.APPLICATION_ID
3470                            ,p_attr_group_type => l_attr_group_metadata_obj.ATTR_GROUP_TYPE
3471                           );
3472         SELECT application_table_name
3473           INTO l_ext_table_name
3474           FROM fnd_descriptive_flexs
3475          WHERE application_id = l_attr_group_metadata_obj.application_id
3476            AND descriptive_flexfield_name = l_attr_group_metadata_obj.attr_group_type;
3477 
3478         IF FND_API.TO_BOOLEAN(EGO_USER_ATTRS_COMMON_PVT.HAS_COLUMN_IN_TABLE (p_table_name  => l_ext_table_name
3479                                                                             ,p_column_name => 'DATA_LEVEL_ID'
3480                                                                             )
3481                              ) THEN
3482           IF (LENGTH(l_dl_col_names) > 0) THEN
3483             l_dl_col_names := ' DATA_LEVEL_ID, '||l_dl_col_names;
3484           ELSE
3485             l_dl_col_names := ' DATA_LEVEL_ID ';
3486           END IF;
3487 
3488         END IF;
3489 -- bug 6345399 end
3490 
3491   ----------------------------------------------------
3492         -- Add trailing commas if the lists are non-empty --
3493         ----------------------------------------------------
3494         IF (LENGTH(l_pk_col_names) > 0) THEN
3495           l_pk_col_names := l_pk_col_names || ',';
3496         END IF;
3497         IF (LENGTH(l_dl_col_names) > 0) THEN
3498           l_dl_col_names := l_dl_col_names || ',';
3499         END IF;
3500 
3501         ----------------------------------------------------
3502         -- Loop through all Attributes in the Attr Group, --
3503         -- building a list of aliased Attr names          --
3504         ----------------------------------------------------
3505         l_attr_metadata_table := l_attr_group_metadata_obj.attr_metadata_table;
3506         l_curr_attr_index := l_attr_metadata_table.FIRST;
3507         WHILE (l_curr_attr_index <= l_attr_metadata_table.LAST)
3508         LOOP
3509 
3510           l_curr_attr_metadata_obj := l_attr_metadata_table(l_curr_attr_index);
3511 
3512           ----------------------------------------------------
3513           -- Add a column named with the Attribute internal --
3514           -- name and showing the Attribute internal value  --
3515           ----------------------------------------------------
3516           l_aliased_attr_names := l_aliased_attr_names ||
3517                                   l_curr_attr_metadata_obj.DATABASE_COLUMN || ' ' ||
3518                                   l_curr_attr_metadata_obj.ATTR_NAME ||',';
3519 
3520           -----------------------------------------------------
3521           -- If the Attribute has a Value Set with different --
3522           -- internal and display values, create a second    --
3523           -- column (named with the Attribute internal name  --
3524           -- plus '_DISP') to show the display value         --
3525           -----------------------------------------------------
3526           IF (l_curr_attr_metadata_obj.VALIDATION_CODE = G_INDEPENDENT_VALIDATION_CODE OR
3527               l_curr_attr_metadata_obj.VALIDATION_CODE = G_TABLE_VALIDATION_CODE) THEN
3528 
3529             ---------------------------------------
3530             -- In most cases, we do not need to  --
3531             -- worry about tokenizing VS queries --
3532             ---------------------------------------
3533             IF (l_curr_attr_metadata_obj.VS_BIND_VALUES_CODE IS NULL OR
3534                 l_curr_attr_metadata_obj.VS_BIND_VALUES_CODE = 'N') THEN
3535 
3536               l_to_char_db_col_expression := l_curr_attr_metadata_obj.DATABASE_COLUMN;
3537 
3538               ----------------------------------------------------------
3539               -- If we have an Independent Int->Disp Val query, then  --
3540               -- we will need to cast the DB column value to a string --
3541               -- (if we have a Table Int->Disp Val query, we need the --
3542               -- value in its native data type for the query to work) --
3543               ----------------------------------------------------------
3544               IF (l_curr_attr_metadata_obj.VALIDATION_CODE = G_INDEPENDENT_VALIDATION_CODE) THEN
3545 
3546                 l_to_char_db_col_expression := EGO_USER_ATTRS_COMMON_PVT.Create_DB_Col_Alias_If_Needed(l_curr_attr_metadata_obj);
3547 
3548               END IF;
3549 
3550               l_aliased_attr_names := l_aliased_attr_names || '(' ||
3551                                       l_curr_attr_metadata_obj.INT_TO_DISP_VAL_QUERY ||
3552                                       l_to_char_db_col_expression || ') ';
3553 
3554             ELSE
3555 
3556               ---------------------------------------------------------
3557               -- If, however, the Value Set is a Table VS with bind  --
3558               -- values then we need to call Tokenized_Val_Set_Query --
3559               ---------------------------------------------------------
3560 
3561               -------------------------------------------------------------------
3562               -- If we need and don't yet have it, build an array of PK column --
3563               -- names/values (in this case, though, the values are themselves --
3564               -- the PK column names, because we want Tokenized_Val_Set_Query  --
3565               -- to replace any PK tokens with the column name itself so our   --
3566               -- view will be sufficiently generalized)                        --
3567               -------------------------------------------------------------------
3568               IF (p_pk_column_name_value_pairs IS NULL) THEN
3569 
3570                 IF (l_ext_table_metadata_obj.pk_column_metadata.COUNT = 5 AND
3571                     l_ext_table_metadata_obj.pk_column_metadata(5) IS NOT NULL AND
3572                     l_ext_table_metadata_obj.pk_column_metadata(5).COL_NAME IS NOT NULL) THEN
3573                     p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3574                                                     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)
3575                                                    ,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)
3576                                                    ,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)
3577                                                    ,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)
3578                                                    ,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)
3579                                                   );
3580                 ELSIF (l_ext_table_metadata_obj.pk_column_metadata.COUNT = 4 AND
3581                        l_ext_table_metadata_obj.pk_column_metadata(4) IS NOT NULL AND
3582                        l_ext_table_metadata_obj.pk_column_metadata(4).COL_NAME IS NOT NULL) THEN
3583                   p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3584                                                     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)
3585                                                    ,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)
3586                                                    ,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)
3587                                                    ,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)
3588                                                   );
3589                 ELSIF (l_ext_table_metadata_obj.pk_column_metadata.COUNT = 3 AND
3590                        l_ext_table_metadata_obj.pk_column_metadata(3) IS NOT NULL AND
3591                        l_ext_table_metadata_obj.pk_column_metadata(3).COL_NAME IS NOT NULL) THEN
3592                   p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3593                                                     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)
3594                                                    ,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)
3595                                                    ,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)
3596                                                   );
3597                 ELSIF (l_ext_table_metadata_obj.pk_column_metadata.COUNT = 2 AND
3598                        l_ext_table_metadata_obj.pk_column_metadata(2) IS NOT NULL AND
3599                        l_ext_table_metadata_obj.pk_column_metadata(2).COL_NAME IS NOT NULL) THEN
3600                   p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3601                                                     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)
3602                                                    ,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)
3603                                                   );
3604                 ELSIF (l_ext_table_metadata_obj.pk_column_metadata.COUNT = 1 AND
3605                        l_ext_table_metadata_obj.pk_column_metadata(1) IS NOT NULL AND
3606                        l_ext_table_metadata_obj.pk_column_metadata(1).COL_NAME IS NOT NULL) THEN
3607                   p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3608                                                     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)
3609                                                   );
3610                 END IF;
3611               END IF;
3612 
3613               l_aliased_attr_names := l_aliased_attr_names || '(' ||
3614                                       EGO_USER_ATTRS_DATA_PVT.Tokenized_Val_Set_Query(
3615                                         p_attr_metadata_obj             => l_curr_attr_metadata_obj
3616                                        ,p_attr_group_metadata_obj       => l_attr_group_metadata_obj
3617                                        ,p_ext_table_metadata_obj        => l_ext_table_metadata_obj
3618                                        ,p_pk_column_name_value_pairs    => p_pk_column_name_value_pairs
3619                                        ,p_data_level_name_value_pairs   => NULL
3620                                        ,p_entity_id                     => NULL
3621                                        ,p_entity_index                  => NULL
3622                                        ,p_entity_code                   => NULL
3623                                        ,p_add_errors_to_fnd_stack       => FND_API.G_TRUE
3624                                        ,p_attr_name_value_pairs         => NULL
3625                                        ,p_is_disp_to_int_query          => FALSE
3626                                        ,p_final_bind_value              => NULL
3627                                        ,p_return_bound_sql              => TRUE
3628                                       ) || l_curr_attr_metadata_obj.DATABASE_COLUMN || ') ';
3629 
3630             END IF;
3631 
3632             -----------------------------------------------------------------
3633             -- Whichever display value query we just added (Int->Disp Val  --
3634             -- query) or Tokenized Val Set Query), we now need to alias it --
3635             -- with the Attr internal name (changed by adding '_DISP')     --
3636             -----------------------------------------------------------------
3637             l_aliased_attr_names := l_aliased_attr_names ||
3638                                     SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 24) ||
3639                                     '_DISP,';
3640 
3641           END IF;
3642 
3643           ---------------------------------------------------------------------
3644           -- If the Attribute's INFO_1 (its Dynamic URL) value is not null,  --
3645           -- then we add a column containing the tokenized URL; the column's --
3646           -- name will be the Attr internal name (changed by adding '_URL')  --
3647           ---------------------------------------------------------------------
3648           IF (l_curr_attr_metadata_obj.INFO_1 IS NOT NULL) THEN
3649 
3650             l_aliased_attr_names := l_aliased_attr_names || '(' ||
3651                                     Build_Tokenized_URL_Query(l_attr_group_metadata_obj
3652                                                              ,l_curr_attr_metadata_obj) ||
3653                                     ')' ||
3654                                     SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 24) ||
3655                                     '_URL,';
3656 
3657           END IF;
3658 
3659           ------------------------------------------------------------------------
3660           -- In case the Attribute has some UOM class attached we need to have  --
3661           -- the UOM columns too.                                               --
3662           -- <Attr_name>_UOM  : contains the base UOM code                      --
3663           -- <Attr_name>_UUOM : contains the user entered uom                   ---------
3664           -- <Attr_name>_UVAL : contains the value in converted as per the UOM entered --
3665           -------------------------------------------------------------------------------
3666           IF (l_curr_attr_metadata_obj.UNIT_OF_MEASURE_CLASS IS NOT NULL) THEN
3667 
3668             l_aliased_attr_names := l_aliased_attr_names || '  ''' || l_curr_attr_metadata_obj.UNIT_OF_MEASURE_BASE ||'''  '
3669                                                          || SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 26)||'_UOM ,';
3670 
3671             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'))
3672                                                          ||' '|| SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 25)||'_UUOM ,';
3673 
3674 
3675             l_aliased_attr_names := l_aliased_attr_names || 'NVL2('||l_curr_attr_metadata_obj.DATABASE_COLUMN||
3676                                                             '     ,NVL2( UOM_'||SUBSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,INSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,'EXT_ATTR'))||' '||
3677                                                             '           ,INV_CONVERT.INV_UM_CONVERT ( null '||                                       --ItemId
3678                                                             '                                        ,null '||                                       --precision
3679                                                             '                                        , '||l_curr_attr_metadata_obj.DATABASE_COLUMN|| --quantity
3680                                                             '                                        , '''||l_curr_attr_metadata_obj.UNIT_OF_MEASURE_BASE||''' '|| --base uom
3681                                                             '                                        , '||'UOM_'||SUBSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,INSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,'EXT_ATTR'))||' '|| --to_UOM
3682                                                             '                                        , null  '||                                     --from name
3683                                                             '                                        , null )'||                                     --to name
3684                                                             '           ,NULL)    '||
3685                                                             '     ,NULL)          '||
3686                                                             '   '||SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 25)||'_UVAL ,';
3687 
3688 /* -- It was decided to use the api INV_CONVERT.INV_UM_CONVERT for uom conversions instead of doing it in the query.
3689             l_aliased_attr_names := l_aliased_attr_names || l_curr_attr_metadata_obj.DATABASE_COLUMN
3690                                                          ||'/NVL((SELECT CONVERSION_RATE FROM MTL_UOM_CONVERSIONS '
3691                                                          ||'      WHERE UOM_CLASS = '''||l_curr_attr_metadata_obj.UNIT_OF_MEASURE_CLASS||''' '
3692                                                          ||'        AND UOM_CODE =  UOM_' || SUBSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,INSTR(l_curr_attr_metadata_obj.DATABASE_COLUMN,'EXT_ATTR'))
3693                                                          ||'        AND ROWNUM = 1),1)  '
3694                                                          ||SUBSTRB(l_curr_attr_metadata_obj.ATTR_NAME, 1, 24)||'_UVAL , ';
3695 */
3696           END IF;
3697 
3698 
3699           l_curr_attr_index := l_attr_metadata_table.NEXT(l_curr_attr_index);
3700         END LOOP;
3701 
3702         ------------------------------------------------------------------
3703         -- Trim the trailing ',' from l_aliased_attr_names if necessary --
3704         ------------------------------------------------------------------
3705         IF (LENGTH(l_aliased_attr_names) > 0) THEN
3706           l_aliased_attr_names := SUBSTR(l_aliased_attr_names, 1, LENGTH(l_aliased_attr_names) - LENGTH(','));
3707         END IF;
3708 
3709         -------------------------------------------------------------------------
3710         -- Now we construct and execute our AGV DDL if the AGV Name is defined --
3711         -------------------------------------------------------------------------
3712         IF (l_attr_group_metadata_obj.AGV_NAME IS NULL) THEN
3713 
3714           l_token_table(1).TOKEN_NAME := 'ATTR_GROUP_DISP_NAME';
3715           l_token_table(1).TOKEN_VALUE := l_attr_group_metadata_obj.ATTR_GROUP_DISP_NAME;
3716           ERROR_HANDLER.Add_Error_Message(
3717             p_message_name                  => 'EGO_EF_NO_AGV_NAME_ERROR'
3718            ,p_application_id                => 'EGO'
3719            ,p_token_tbl                     => l_token_table
3720            ,p_message_type                  => FND_API.G_RET_STS_ERROR
3721            ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3722           );
3723           RAISE FND_API.G_EXC_ERROR;
3724 
3725         ELSE
3726 
3727           l_user_attrs_view_ddl :=
3728           ' CREATE OR REPLACE VIEW '||l_attr_group_metadata_obj.AGV_NAME||
3729           ' AS SELECT EXTENSION_ID, '||l_pk_col_names||l_dl_col_names||l_aliased_attr_names||
3730           ' FROM '||l_attr_group_metadata_obj.EXT_TABLE_VL_NAME ||
3731           ' WHERE attr_group_id  = ' || p_attr_group_id ;
3732 
3733     --bugfix 11907422 for 12.2 AD_DDL changes
3734           --l_ddl_error_message := Execute_DDL_And_Return_Err(l_user_attrs_view_ddl);
3735 
3736            h_x := FND_INSTALLATION.Get_App_Info('FND', h_status, h_industry, fnd_apps_schema);
3737      --since this is view object_owner is same as APPS
3738 	 --bug 12392423, hard code APPS as second parameter
3739      --l_ddl_error_message:= Execute_AD_DDL_And_Return_Err(l_user_attrs_view_ddl,'APPS',l_attr_group_metadata_obj.AGV_NAME,ad_ddl.create_view);
3740 	 begin
3741      AD_DDL.DO_DDL(fnd_apps_schema, 'APPS',ad_ddl.create_view,l_user_attrs_view_ddl, l_attr_group_metadata_obj.AGV_NAME);
3742 	 EXCEPTION
3743       WHEN OTHERS
3744       THEN
3745 	    l_ddl_error_message := SQLERRM || ad_ddl.error_buf;
3746      END;
3747 
3748           ---------------------------------------------------------------
3749           -- If something went wrong with the DDL, we report the error --
3750           ---------------------------------------------------------------
3751           IF (l_ddl_error_message IS NOT NULL) THEN
3752             IF (l_attr_group_metadata_obj IS NOT NULL) THEN
3753               l_token_table(1).TOKEN_NAME := 'ATTR_GROUP_DISP_NAME';
3754               l_token_table(1).TOKEN_VALUE := l_attr_group_metadata_obj.ATTR_GROUP_DISP_NAME;
3755         Check_Attr_Group_View(p_attr_group_id);
3756             ELSE
3757               ------------------------------------------------------
3758               -- If we don't have the metadata object, we have to --
3759               -- identify the Attribute Group by its passed-in ID --
3760               ------------------------------------------------------
3761               l_token_table(1).TOKEN_NAME := 'ATTR_GROUP_DISP_NAME';
3762               l_token_table(1).TOKEN_VALUE := p_attr_group_id;
3763             END IF;
3764 
3765             -----------------------------------------------------------------
3766             -- First we tell them that something went wrong with their DDL --
3767             -----------------------------------------------------------------
3768             ERROR_HANDLER.Add_Error_Message(
3769               p_message_name                  => 'EGO_EF_AGV_DDL_ERR'
3770              ,p_application_id                => 'EGO'
3771              ,p_token_tbl                     => l_token_table
3772              ,p_message_type                  => FND_API.G_RET_STS_ERROR
3773              ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3774             );
3775 
3776             ---------------------------------------------------
3777             -- Then we show them the DDL itself, looping to  --
3778             -- pass it to ERROR_HANDLER in 200-byte segments --
3779             ---------------------------------------------------
3780             WHILE (LENGTH(l_user_attrs_view_ddl) > 0)
3781             LOOP
3782               ERROR_HANDLER.Add_Error_Message(
3783                 p_application_id                => 'EGO'
3784                ,p_message_text                  => SUBSTR(l_user_attrs_view_ddl, 1, 200)
3785                ,p_message_type                  => FND_API.G_RET_STS_ERROR
3786                ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3787               );
3788 
3789               l_user_attrs_view_ddl := SUBSTR(l_user_attrs_view_ddl, 201);
3790             END LOOP;
3791 
3792             ------------------------------------------------------------
3793             -- Then we give them the error message we got from the DB --
3794             ------------------------------------------------------------
3795             l_token_table(1).TOKEN_NAME := 'SQLERRM';
3796             l_token_table(1).TOKEN_VALUE := l_ddl_error_message;
3797             ERROR_HANDLER.Add_Error_Message(
3798               p_message_name                  => 'EGO_EF_AGV_DDL_SQLERRM'
3799              ,p_application_id                => 'EGO'
3800              ,p_token_tbl                     => l_token_table
3801              ,p_message_type                  => FND_API.G_RET_STS_ERROR
3802              ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3803             );
3804             RAISE FND_API.G_EXC_ERROR;
3805           END IF;
3806         END IF;
3807       END IF;
3808     END IF;
3809      --Bug : 10097736 Added to check for view before commiting
3810      Check_Attr_Group_View(p_attr_group_id);
3811 
3812     -- Standard check of p_commit
3813     IF FND_API.To_Boolean(p_commit) THEN
3814       COMMIT WORK;
3815     END IF;
3816 
3817     x_return_status := FND_API.G_RET_STS_SUCCESS;
3818 
3819   EXCEPTION
3820     WHEN FND_API.G_EXC_ERROR THEN
3821       IF FND_API.To_Boolean(p_commit) THEN
3822         ROLLBACK TO Compile_Attr_Group_View_PUB;
3823       END IF;
3824       x_return_status := FND_API.G_RET_STS_ERROR;
3825 
3826     WHEN OTHERS THEN
3827       IF FND_API.To_Boolean(p_commit) THEN
3828         ROLLBACK TO Compile_Attr_Group_View_PUB;
3829       END IF;
3830       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3831 
3832       -- If the DDL is not null, that's probably the cause of our error --
3833       IF (l_user_attrs_view_ddl IS NOT NULL) THEN
3834 
3835         IF (l_attr_group_metadata_obj IS NOT NULL) THEN
3836           l_token_table(1).TOKEN_NAME := 'ATTR_GROUP_DISP_NAME';
3837           l_token_table(1).TOKEN_VALUE := l_attr_group_metadata_obj.ATTR_GROUP_DISP_NAME;
3838         ELSE
3839           ------------------------------------------------------
3840           -- If we don't have the metadata object, we have to --
3841           -- identify the Attribute Group by its passed-in ID --
3842           ------------------------------------------------------
3843           l_token_table(1).TOKEN_NAME := 'ATTR_GROUP_DISP_NAME';
3844           l_token_table(1).TOKEN_VALUE := p_attr_group_id;
3845         END IF;
3846 
3847         -----------------------------------------------------------------
3848         -- First we tell them that something went wrong with their DDL --
3849         -----------------------------------------------------------------
3850         ERROR_HANDLER.Add_Error_Message(
3851           p_message_name                  => 'EGO_EF_AGV_DDL_ERR'
3852          ,p_application_id                => 'EGO'
3853          ,p_token_tbl                     => l_token_table
3854          ,p_message_type                  => FND_API.G_RET_STS_ERROR
3855          ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3856         );
3857 
3858         ---------------------------------------------------
3859         -- Then we show them the DDL itself, looping to  --
3860         -- pass it to ERROR_HANDLER in 100-byte segments --
3861         ---------------------------------------------------
3862         WHILE (LENGTH(l_user_attrs_view_ddl) > 0)
3863         LOOP
3864           ERROR_HANDLER.Add_Error_Message(
3865             p_application_id                => 'EGO'
3866            ,p_message_text                  => SUBSTR(l_user_attrs_view_ddl, 1, 100)
3867            ,p_message_type                  => FND_API.G_RET_STS_ERROR
3868            ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
3869           );
3870 
3871           l_user_attrs_view_ddl := SUBSTR(l_user_attrs_view_ddl, 101);
3872         END LOOP;
3873 
3874       ELSE
3875 
3876         l_token_table(1).TOKEN_NAME := 'PKG_NAME';
3877         l_token_table(1).TOKEN_VALUE := G_PKG_NAME;
3878         l_token_table(2).TOKEN_NAME := 'API_NAME';
3879         l_token_table(2).TOKEN_VALUE := l_api_name;
3880         l_token_table(3).TOKEN_NAME := 'SQL_ERR_MSG';
3881         l_token_table(3).TOKEN_VALUE := SQLERRM;
3882 
3883         ERROR_HANDLER.Add_Error_Message(
3884           p_message_name              => 'EGO_PLSQL_ERR'
3885          ,p_application_id            => 'EGO'
3886          ,p_token_tbl                 => l_token_table
3887          ,p_message_type              => FND_API.G_RET_STS_ERROR
3888          ,p_addto_fnd_stack           => 'Y'
3889         );
3890 
3891       END IF;
3892 
3893 END Compile_Attr_Group_View;
3894 
3895 ---------------------------------------------------------------------------
3896 
3897 PROCEDURE Compile_Attr_Group_Views (
3898         ERRBUF                          OUT NOCOPY VARCHAR2
3899        ,RETCODE                         OUT NOCOPY VARCHAR2
3900        ,p_attr_group_id_list            IN   VARCHAR2
3901        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
3902        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
3903 ) IS
3904 
3905     l_ag_id_start_index      NUMBER := 1;
3906     l_ag_id_end_index        NUMBER;
3907     l_curr_ag_id             VARCHAR2(30);
3908     l_return_status          VARCHAR2(1);
3909     l_errorcode              NUMBER;
3910     l_msg_count              NUMBER;
3911     l_msg_data               VARCHAR2(1000);
3912 
3913   BEGIN
3914 
3915     -- Initialize message list if caller asked us to do so
3916     IF FND_API.To_Boolean(p_init_msg_list) THEN
3917       FND_MSG_PUB.Initialize;
3918       ERROR_HANDLER.Initialize;
3919     END IF;
3920 
3921     IF (p_attr_group_id_list IS NOT NULL) THEN
3922 
3923       WHILE (l_ag_id_start_index > 0)
3924       LOOP
3925 
3926         l_ag_id_end_index := INSTR(p_attr_group_id_list, ',', l_ag_id_start_index);
3927         IF (l_ag_id_end_index = 0) THEN
3928           l_curr_ag_id := TRIM(SUBSTR(p_attr_group_id_list, l_ag_id_start_index));
3929         ELSE
3930           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));
3931         END IF;
3932 
3933         --------------------------------------------------------
3934         -- Call the API for each Attribute Group in the list; --
3935         -- if any call fails, continue with the rest of them  --
3936         --------------------------------------------------------
3937         Compile_Attr_Group_View(
3938           p_api_version                   => 1.0
3939          ,p_attr_group_id                 => l_curr_ag_id
3940          ,p_init_msg_list                 => FND_API.G_FALSE
3941          ,p_commit                        => p_commit
3942          ,x_return_status                 => l_return_status
3943          ,x_errorcode                     => l_errorcode
3944          ,x_msg_count                     => l_msg_count
3945          ,x_msg_data                      => l_msg_data
3946         );
3947 
3948         ----------------------------------------------
3949         -- Update the start index for the next loop --
3950         ----------------------------------------------
3951         l_ag_id_start_index := l_ag_id_end_index;
3952         IF (l_ag_id_start_index > 0) THEN
3953           l_ag_id_start_index := l_ag_id_start_index + 1;
3954         END IF;
3955       END LOOP;
3956     END IF;
3957 
3958     --------------------------------------------------------
3959     -- Find out if any error messages were logged for any --
3960     -- of the Attribute Groups for which we compiled AGVs --
3961     --------------------------------------------------------
3962     l_msg_count := ERROR_HANDLER.Get_Message_Count();
3963     IF (l_msg_count = 0) THEN
3964       RETCODE := FND_API.G_RET_STS_SUCCESS;
3965     ELSE
3966       RETCODE := FND_API.G_RET_STS_ERROR;
3967       IF (l_msg_count = 1) THEN
3968         DECLARE
3969           l_dummy_entity_index     NUMBER;
3970           l_dummy_entity_id        VARCHAR2(60);
3971           l_dummy_message_type     VARCHAR2(1);
3972         BEGIN
3973           ERROR_HANDLER.Get_Message(x_message_text => ERRBUF
3974                                    ,x_entity_index => l_dummy_entity_index
3975                                    ,x_entity_id    => l_dummy_entity_id
3976                                    ,x_message_type => l_dummy_message_type);
3977         END;
3978       ELSE
3979         ERRBUF := 'EGO_CHECK_FND_STACK_FOR_ERRS';
3980       END IF;
3981 
3982       ERROR_HANDLER.Log_Error(
3983         p_write_err_to_inttable => 'Y'
3984        ,p_write_err_to_conclog  => 'Y'
3985       );
3986     END IF;
3987 
3988 END Compile_Attr_Group_Views;
3989 
3990 ----------------------------------------------------------------------
3991 
3992 
3993 FUNCTION Does_Attr_Have_Data (
3994         p_application_id                IN   NUMBER     DEFAULT NULL
3995        ,p_attr_group_type               IN   VARCHAR2   DEFAULT NULL
3996        ,p_attr_group_name               IN   VARCHAR2   DEFAULT NULL
3997        ,p_attr_name                     IN   VARCHAR2   DEFAULT NULL
3998        ,p_attr_id                       IN   NUMBER     DEFAULT NULL
3999 )
4000 RETURN VARCHAR2
4001 IS
4002 
4003     l_api_name               CONSTANT VARCHAR2(30) := 'Does_Attr_Have_Data';
4004 
4005     l_dynamic_sql            VARCHAR2(17000);
4006     l_attr_group_id          NUMBER;
4007     l_ext_table_vl_name      VARCHAR2(30);
4008     l_curr_db_column         VARCHAR2(30);
4009     l_row_count              NUMBER;
4010     l_attr_data_exist        VARCHAR2(1) := FND_API.G_FALSE;
4011     --l_application_id         VARCHAR2(3); bug 9491192 change type to NUMBER
4012     l_application_id         NUMBER;
4013     l_attr_group_type        VARCHAR2(80);
4014     l_attr_group_name        VARCHAR2(80);
4015     l_attr_name              VARCHAR2(80);
4016 
4017   BEGIN
4018 
4019     if (p_attr_id IS NOT NULL) then
4020       SELECT USGS.APPLICATION_ID,
4021              USGS.DESCRIPTIVE_FLEXFIELD_NAME,
4022              USGS.DESCRIPTIVE_FLEX_CONTEXT_CODE,
4023              USGS.END_USER_COLUMN_NAME,
4024              USGS.APPLICATION_COLUMN_NAME
4025       INTO
4026            l_application_id
4027           ,l_attr_group_type
4028           ,l_attr_group_name
4029           ,l_attr_name
4030           ,l_curr_db_column
4031       FROM
4032           FND_DESCR_FLEX_COLUMN_USAGES USGS,
4033           EGO_FND_DF_COL_USGS_EXT EXT
4034       WHERE
4035           USGS.APPLICATION_ID = EXT.APPLICATION_ID
4036       AND USGS.DESCRIPTIVE_FLEXFIELD_NAME = EXT.DESCRIPTIVE_FLEXFIELD_NAME
4037       AND USGS.DESCRIPTIVE_FLEX_CONTEXT_CODE = EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE
4038       AND USGS.APPLICATION_COLUMN_NAME = EXT.APPLICATION_COLUMN_NAME
4039       AND EXT.ATTR_ID = p_attr_id;
4040 
4041     else
4042 
4043       l_application_id   := p_application_id;
4044       l_attr_group_type  := p_attr_group_type;
4045       l_attr_group_name  := p_attr_group_name;
4046       l_attr_name        := p_attr_name;
4047 
4048       SELECT APPLICATION_COLUMN_NAME
4049       INTO l_curr_db_column
4050       FROM FND_DESCR_FLEX_COLUMN_USAGES EXT
4051       WHERE
4052            EXT.APPLICATION_ID = l_application_id
4053        AND EXT.DESCRIPTIVE_FLEXFIELD_NAME = l_attr_group_type
4054        AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = l_attr_group_name
4055        AND EXT.END_USER_COLUMN_NAME = l_attr_name;
4056 
4057 
4058     end if;
4059 
4060 
4061     -----------------------------------------------------------------------
4062     -- First, get the Object and Attr Group IDs and Extension Table name --
4063     -----------------------------------------------------------------------
4064     SELECT EXT.ATTR_GROUP_ID
4065           ,NVL(FLX_EXT.APPLICATION_VL_NAME, FLX.APPLICATION_TABLE_NAME)
4066       INTO l_attr_group_id
4067           ,l_ext_table_vl_name
4068       FROM EGO_OBJECT_EXT_TABLES_B    OBJ
4069           ,EGO_FND_DSC_FLX_CTX_EXT    EXT
4070           ,FND_DESCRIPTIVE_FLEXS      FLX
4071           ,EGO_FND_DESC_FLEXS_EXT     FLX_EXT
4072      WHERE OBJ.EXT_TABLE_NAME = FLX.APPLICATION_TABLE_NAME
4073        AND FLX.APPLICATION_ID = l_application_id
4074        AND FLX.APPLICATION_ID = FLX_EXT.APPLICATION_ID(+)
4075        AND FLX.APPLICATION_ID = EXT.APPLICATION_ID
4076        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = l_attr_group_type
4077        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = FLX_EXT.DESCRIPTIVE_FLEXFIELD_NAME(+)
4078        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = EXT.DESCRIPTIVE_FLEXFIELD_NAME
4079        AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = l_attr_group_name;
4080 
4081     ---------------------------------------------------------------------------
4082     -- Now get the count of rows from the table where the attr_value is null --
4083     ---------------------------------------------------------------------------
4084 
4085  --
4086  	     -- Bug 14186167. Performance issue while updating an
4087  	     -- attribute in setup workbench. Modified the query to
4088  	     -- use EXISTS clause.
4089  	     -- sreharih. Mon Jun 18 11:26:32 PDT 2012
4090  	     --
4091 
4092  	l_dynamic_sql :=    ' SELECT 1 ' ||
4093  	                    ' FROM DUAL ' ||
4094  	                    ' WHERE EXISTS (SELECT 1 FROM  ' || l_ext_table_vl_name ||
4095  	                                  ' WHERE ATTR_GROUP_ID = :1' ||
4096  	                                        ' AND ROWNUM = 1 ' ||
4097  	                                        ' AND ' || l_curr_db_column || ' IS NOT NULL) ';
4098 
4099 
4100     EXECUTE IMMEDIATE l_dynamic_sql INTO l_row_count USING l_attr_group_id;
4101 
4102     IF (l_row_count > 0) THEN
4103       l_attr_data_exist := FND_API.G_TRUE;
4104     END IF;
4105 
4106     RETURN l_attr_data_exist;
4107 
4108 END;
4109 
4110 ----------------------------------------------------------------------
4111 
4112 PROCEDURE Validate_Unique_Key_Attrs (
4113         p_application_id                IN   NUMBER
4114        ,p_attr_group_type               IN   VARCHAR2
4115        ,p_attr_group_name               IN   VARCHAR2
4116        ,p_id_list                       IN   VARCHAR2
4117        ,x_is_valid_key                  OUT NOCOPY VARCHAR2
4118 ) IS
4119 
4120     l_api_name               CONSTANT VARCHAR2(30) := 'Validate_Unique_Key_Attrs';
4121 
4122     l_dynamic_sql            VARCHAR2(17000);
4123     l_attr_group_id          NUMBER;
4124     l_ext_table_vl_name      VARCHAR2(30);
4125     l_object_id              NUMBER;
4126     l_ext_table_metadata_obj EGO_EXT_TABLE_METADATA_OBJ;
4127     l_curr_db_column         VARCHAR2(15);
4128     l_column_list            VARCHAR2(15000);
4129     l_dl_col_names           VARCHAR2(180);
4130     l_uk_count               NUMBER;
4131 
4132     TYPE DYNAMIC_CUR IS REF CURSOR;
4133     l_dynamic_cursor         DYNAMIC_CUR;
4134     l_tl_table_exists        VARCHAR2(1);
4135 
4136   BEGIN
4137 
4138     -----------------------------------------------------------------------
4139     -- First, get the Object and Attr Group IDs and Extension Table name --
4140     -----------------------------------------------------------------------
4141     SELECT OBJ.OBJECT_ID
4142           ,EXT.ATTR_GROUP_ID
4143           ,NVL(FLX_EXT.APPLICATION_VL_NAME, FLX.APPLICATION_TABLE_NAME)
4144           ,DECODE(FLX_EXT.APPLICATION_TL_TABLE_NAME, NULL, 'N', 'Y')
4145       INTO l_object_id
4146           ,l_attr_group_id
4147           ,l_ext_table_vl_name
4148           ,l_tl_table_exists
4149       FROM EGO_OBJECT_EXT_TABLES_B    OBJ
4150           ,EGO_FND_DSC_FLX_CTX_EXT    EXT
4151           ,FND_DESCRIPTIVE_FLEXS      FLX
4152           ,EGO_FND_DESC_FLEXS_EXT     FLX_EXT
4153      WHERE OBJ.EXT_TABLE_NAME = FLX.APPLICATION_TABLE_NAME
4154        AND FLX.APPLICATION_ID = p_application_id
4155        AND FLX.APPLICATION_ID = FLX_EXT.APPLICATION_ID(+)
4156        AND FLX.APPLICATION_ID = EXT.APPLICATION_ID
4157        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
4158        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = FLX_EXT.DESCRIPTIVE_FLEXFIELD_NAME(+)
4159        AND FLX.DESCRIPTIVE_FLEXFIELD_NAME = EXT.DESCRIPTIVE_FLEXFIELD_NAME
4160        AND EXT.DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name;
4161 
4162     -----------------------------------------------------
4163     -- Second, get the Extension Table metadata object --
4164     -----------------------------------------------------
4165     l_ext_table_metadata_obj := EGO_USER_ATTRS_COMMON_PVT.Get_Ext_Table_Metadata(l_object_id);
4166 
4167     --------------------------------------------------------------
4168     -- Next, start a list of columns on which to use 'Group By' --
4169     --------------------------------------------------------------
4170     l_column_list := EGO_USER_ATTRS_COMMON_PVT.Get_List_For_Table_Cols(
4171                        l_ext_table_metadata_obj.pk_column_metadata
4172                       ,NULL
4173                       ,'NAMES'
4174                      ) || ',';
4175     IF (l_tl_table_exists = 'Y') THEN
4176       l_column_list := l_column_list || 'LANGUAGE,';
4177     END IF;
4178     l_dl_col_names := EGO_USER_ATTRS_COMMON_PVT.Get_List_For_Table_Cols(
4179                         l_ext_table_metadata_obj.data_level_metadata
4180                        ,NULL
4181                        ,'NAMES'
4182                       );
4183     IF (LENGTH(l_dl_col_names) > 0) THEN
4184       l_column_list := l_column_list || l_dl_col_names || ',';
4185     END IF;
4186 
4187     -----------------------------------------------------------
4188     -- Next, use the Attribute IDs to get a list of database --
4189     -- column names to add to the current 'Group By' list    --
4190     -----------------------------------------------------------
4191     l_dynamic_sql := ' SELECT APPLICATION_COLUMN_NAME' ||
4192                        ' FROM EGO_FND_DF_COL_USGS_EXT' ||
4193                       ' WHERE ATTR_ID IN ('||p_id_list||') ';
4194 
4195     OPEN l_dynamic_cursor FOR l_dynamic_sql;
4196     LOOP
4197       FETCH l_dynamic_cursor INTO l_curr_db_column;
4198       EXIT WHEN l_dynamic_cursor%NOTFOUND;
4199 
4200       l_column_list := l_column_list || l_curr_db_column || ',';
4201 
4202     END LOOP;
4203     CLOSE l_dynamic_cursor;
4204 
4205     ----------------------------------------------
4206     -- Trim the trailing ',' from l_column_list --
4207     ----------------------------------------------
4208     l_column_list := SUBSTR(l_column_list, 1, LENGTH(l_column_list) - LENGTH(','));
4209 
4210     ------------------------------------------------------------------------
4211     -- Now find out whether the proposed Unique Key is currently violated --
4212     ------------------------------------------------------------------------
4213     l_dynamic_sql := ' SELECT COUNT(1)' ||
4214                        ' FROM ' || l_ext_table_vl_name ||
4215                       ' WHERE ATTR_GROUP_ID = :1' ||
4216                       ' GROUP BY ' || l_column_list;
4217 
4218     OPEN l_dynamic_cursor FOR l_dynamic_sql USING l_attr_group_id;
4219     LOOP
4220       FETCH l_dynamic_cursor INTO l_uk_count;
4221       EXIT WHEN (l_dynamic_cursor%NOTFOUND OR
4222                  x_is_valid_key = FND_API.G_FALSE);
4223 
4224         IF (l_uk_count > 1) THEN
4225           x_is_valid_key := FND_API.G_FALSE;
4226         END IF;
4227 
4228     END LOOP;
4229     CLOSE l_dynamic_cursor;
4230 
4231     ------------------------------------------------------------------------------
4232     -- If we got this far without adding a value to x_is_valid_key, then there  --
4233     -- are no rows in the extension tables that violate the proposed Unique Key --
4234     ------------------------------------------------------------------------------
4235     IF (x_is_valid_key IS NULL) THEN
4236       x_is_valid_key := FND_API.G_TRUE;
4237     END IF;
4238 
4239   EXCEPTION
4240     WHEN OTHERS THEN
4241 
4242 /***
4243 Dylan wonders: did I write this?  If so, why?  If not, who did...and why?
4244 Maybe it was for PA integration...?
4245 ***/
4246       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4247         FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
4248       END IF;
4249 
4250 END Validate_Unique_Key_Attrs;
4251 
4252 ----------------------------------------------------------------------
4253                     --------------------------
4254                     -- Data Level APIs --
4255                     --------------------------
4256 
4257 PROCEDURE  Sync_Data_Level (
4258           p_api_version           IN  NUMBER
4259          ,p_init_msg_list         IN  VARCHAR2
4260          ,p_commit                IN  VARCHAR2
4261          ,p_transaction_type      IN  VARCHAR2
4262          ,p_application_id        IN  NUMBER
4263          ,p_attr_group_type       IN  VARCHAR2
4264          ,p_data_level_name       IN  VARCHAR2
4265          ,p_user_data_level_name  IN  VARCHAR2
4266          ,p_pk1_column_name       IN  VARCHAR2
4267          ,p_pk1_column_type       IN  VARCHAR2
4268          ,p_pk2_column_name       IN  VARCHAR2
4269          ,p_pk2_column_type       IN  VARCHAR2
4270          ,p_pk3_column_name       IN  VARCHAR2
4271          ,p_pk3_column_type       IN  VARCHAR2
4272          ,p_pk4_column_name       IN  VARCHAR2
4273          ,p_pk4_column_type       IN  VARCHAR2
4274          ,p_pk5_column_name       IN  VARCHAR2
4275          ,p_pk5_column_type       IN  VARCHAR2
4276          ,p_enable_defaulting     IN  VARCHAR2
4277          ,p_enable_view_priv      IN  VARCHAR2
4278          ,p_enable_edit_priv      IN  VARCHAR2
4279          ,p_enable_pre_event      IN  VARCHAR2
4280          ,p_enable_post_event     IN  VARCHAR2
4281          ,p_last_updated_by       IN  VARCHAR2
4282          ,p_last_update_date      IN  DATE
4283          ,p_is_nls_mode           IN  VARCHAR2
4284          ,x_data_level_id         IN OUT NOCOPY NUMBER
4285          ,x_return_status         OUT NOCOPY VARCHAR2
4286          ,x_msg_count             OUT NOCOPY NUMBER
4287          ,x_msg_data              OUT NOCOPY VARCHAR2
4288          ) IS
4289 
4290   l_api_version       NUMBER;
4291   l_api_name          VARCHAR2(30);
4292   l_msg_data          VARCHAR2(4000);
4293   l_data_level_id     NUMBER;
4294   l_enable_pre_event  VARCHAR2(1);
4295   l_enable_post_event VARCHAR2(1);
4296 
4297 BEGIN
4298 
4299   l_api_version := 1.0;
4300   l_api_name    := 'SYNC_DATA_LEVEL';
4301   l_msg_data    := NULL;
4302   code_debug(l_api_name ||' Start ');
4303 
4304   -- Initialize message list even though we don't currently use it
4305   IF FND_API.To_Boolean(p_init_msg_list) THEN
4306     FND_MSG_PUB.Initialize;
4307   END IF;
4308 
4309   -- Check for call compatibility
4310   IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
4311                                       l_api_name, G_PKG_NAME)
4312   THEN
4313     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4314   END IF;
4315 
4316   -- Standard start of API savepoint
4317   IF FND_API.TO_BOOLEAN(p_commit) THEN
4318     SAVEPOINT SYNC_DATA_LEVEL;
4319   END IF;
4320 
4321   IF (p_transaction_type IS NULL) THEN
4322     fnd_message.set_name(G_APP_NAME, 'EGO_TRANSACTION_TYPE');
4323     l_msg_data := fnd_msg_pub.get();
4324   ELSIF p_application_id IS NULL THEN
4325     fnd_message.set_name(G_APP_NAME, 'EGO_EF_APPLICATION_ID');
4326     l_msg_data := fnd_msg_pub.get();
4327   ELSIF p_attr_group_type IS NULL THEN
4328     fnd_message.set_name(G_APP_NAME, 'EGO_EF_ATTR_GROUP_TYPE');
4329     l_msg_data := fnd_msg_pub.get();
4330   ELSIF p_data_level_name IS NULL THEN
4331     fnd_message.set_name(G_APP_NAME, 'EGO_EF_DATA_LEVEL');
4332     l_msg_data := fnd_msg_pub.get();
4333   END IF;
4334 
4335   IF l_msg_data IS NOT NULL THEN
4336     fnd_message.set_name(G_APP_NAME,'EGO_PKG_MAND_VALUES_MISS1');
4337     fnd_message.set_token('PACKAGE', G_PKG_NAME ||'.'|| l_api_name);
4338     fnd_message.set_token('VALUE', l_msg_data);
4339     FND_MSG_PUB.Add;
4340     RAISE FND_API.G_EXC_ERROR;
4341   END IF;
4342   code_debug(l_api_name ||' Mandatory param validation complete '||p_transaction_type);
4343 
4344   BEGIN
4345     SELECT NVL2(pre_business_event_name,NVL(p_enable_pre_event,'N'),'N'),
4346            NVL2(business_event_name,NVL(p_enable_post_event,'N'),'N')
4347     INTO l_enable_pre_event, l_enable_post_event
4348     FROM EGO_FND_DESC_FLEXS_EXT
4349     WHERE application_id = p_application_id
4350       AND descriptive_flexfield_name = p_attr_group_type;
4351   EXCEPTION
4352     WHEN NO_DATA_FOUND THEN
4353       l_enable_pre_event := 'N';
4354       l_enable_post_event := 'N';
4355     WHEN OTHERS THEN
4356       RAISE;
4357   END;
4358 
4359   IF p_transaction_type = 'CREATE' THEN
4360     SELECT max(data_level_id)
4361     INTO l_data_level_id
4362     FROM ego_data_level_b
4363     WHERE application_id = p_application_id;
4364 
4365     IF l_data_level_id IS NULL THEN
4366       l_data_level_id := p_application_id * 100 + 1;
4367     ELSE
4368       l_data_level_id := l_data_level_id + 1;
4369     END IF;
4370 
4371     IF l_data_level_id = ((p_application_id+1) * 100) THEN
4372       fnd_message.set_name(G_APP_NAME, 'EGO_EF_DATA_LEVEL_LIMIT');
4373       FND_MSG_PUB.Add;
4374       RAISE FND_API.G_EXC_ERROR;
4375     END IF;
4376 
4377     code_debug(l_api_name ||' Data level id being used in insert: '||l_data_level_id);
4378 
4379     INSERT INTO EGO_DATA_LEVEL_B
4380       (data_level_id
4381       ,application_id
4382       ,attr_group_type
4383       ,data_level_name
4384       ,pk1_column_name
4385       ,pk1_column_type
4386       ,pk2_column_name
4387       ,pk2_column_type
4388       ,pk3_column_name
4389       ,pk3_column_type
4390       ,pk4_column_name
4391       ,pk4_column_type
4392       ,pk5_column_name
4393       ,pk5_column_type
4394       ,enable_defaulting
4395       ,enable_view_priv
4396       ,enable_edit_priv
4397       ,enable_pre_event
4398       ,enable_post_event
4399       ,created_by
4400       ,creation_date
4401       ,last_updated_by
4402       ,last_update_date
4403       ,last_update_login
4404       )
4405     values
4406       (l_data_level_id
4407       ,p_application_id
4408       ,p_attr_group_type
4409       ,p_data_level_name
4410       ,p_pk1_column_name
4411       ,p_pk1_column_type
4412       ,p_pk2_column_name
4413       ,p_pk2_column_type
4414       ,p_pk3_column_name
4415       ,p_pk3_column_type
4416       ,p_pk4_column_name
4417       ,p_pk4_column_type
4418       ,p_pk5_column_name
4419       ,p_pk5_column_type
4420       ,p_enable_defaulting
4421       ,p_enable_view_priv
4422       ,p_enable_edit_priv
4423       ,l_enable_pre_event
4424       ,l_enable_post_event
4425       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4426       ,NVL(p_last_update_date, SYSDATE)
4427       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4428       ,NVL(p_last_update_date, SYSDATE)
4429       ,G_CURRENT_LOGIN_ID
4430       );
4431 
4432     INSERT INTO EGO_DATA_LEVEL_TL
4433       (data_level_id
4434       ,user_data_level_name
4435       ,language
4436       ,source_lang
4437       ,created_by
4438       ,creation_date
4439       ,last_updated_by
4440       ,last_update_date
4441       ,last_update_login
4442       )
4443     SELECT
4444        l_data_level_id
4445       ,NVL(p_user_data_level_name, p_data_level_name)
4446       ,l.language_code
4447       ,USERENV('LANG')
4448       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4449       ,NVL(p_last_update_date, SYSDATE)
4450       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4451       ,NVL(p_last_update_date, SYSDATE)
4452       ,G_CURRENT_LOGIN_ID
4453     FROM FND_LANGUAGES L
4454     WHERE L.INSTALLED_FLAG in ('I', 'B');
4455 
4456   ELSIF p_transaction_type = 'UPDATE' THEN
4457     SELECT data_level_id
4458       INTO l_data_level_id
4459       FROM ego_data_level_b
4460      WHERE application_id = p_application_id
4461        AND attr_group_type = p_attr_group_type
4462        AND data_level_name = p_data_level_name;
4463     code_debug(l_api_name ||' Data level id being used in update: '||l_data_level_id);
4464 
4465     IF x_data_level_id IS NOT NULL AND x_data_level_id <> l_data_level_id THEN
4466       fnd_message.set_name(G_APP_NAME, 'EGO_EF_INVALID_DATA_LEVEL');
4467       FND_MSG_PUB.Add;
4468       RAISE FND_API.G_EXC_ERROR;
4469     END IF;
4470     UPDATE EGO_DATA_LEVEL_TL
4471        SET user_data_level_name = NVL(p_user_data_level_name, p_data_level_name)
4472           ,source_lang = userenv('LANG')             -- Bug 6964013
4473           ,last_updated_by    = NVL(p_last_updated_by, G_CURRENT_USER_ID)
4474           ,last_update_date   = NVL(p_last_update_date, SYSDATE)
4475           ,last_update_login  = G_CURRENT_LOGIN_ID
4476      WHERE data_level_id = l_data_level_id
4477        AND USERENV('LANG') in (LANGUAGE , SOURCE_LANG);
4478 
4479     IF NOT FND_API.to_boolean(p_is_nls_mode) THEN
4480       UPDATE EGO_DATA_LEVEL_B
4481          SET pk1_column_name   = p_pk1_column_name
4482             ,pk1_column_type   = p_pk1_column_type
4483             ,pk2_column_name   = p_pk2_column_name
4484             ,pk2_column_type   = p_pk2_column_type
4485             ,pk3_column_name   = p_pk3_column_name
4486             ,pk3_column_type   = p_pk3_column_type
4487             ,pk4_column_name   = p_pk4_column_name
4488             ,pk4_column_type   = p_pk4_column_type
4489             ,pk5_column_name   = p_pk5_column_name
4490             ,pk5_column_type   = p_pk5_column_type
4491             ,enable_defaulting = p_enable_defaulting
4492             ,enable_view_priv  = p_enable_view_priv
4493             ,enable_edit_priv  = p_enable_edit_priv
4494             ,enable_pre_event  = l_enable_pre_event
4495             ,enable_post_event = l_enable_post_event
4496             ,last_updated_by   = NVL(p_last_updated_by, G_CURRENT_USER_ID)
4497             ,last_update_date  = NVL(p_last_update_date, SYSDATE)
4498             ,last_update_login = G_CURRENT_LOGIN_ID
4499        WHERE data_level_id = l_data_level_id;
4500     END IF;
4501   END IF;
4502 
4503   IF FND_API.TO_BOOLEAN(p_commit) THEN
4504     COMMIT WORK;
4505   END IF;
4506   x_data_level_id := l_data_level_id;
4507   x_return_status := FND_API.G_RET_STS_SUCCESS;
4508   code_debug(l_api_name ||' Done ');
4509 
4510 EXCEPTION
4511   WHEN FND_API.G_EXC_ERROR THEN
4512     code_debug(l_api_name ||' Exception -  FND_API.G_EXC_ERROR '||x_msg_data);
4513     IF FND_API.TO_BOOLEAN(p_commit) THEN
4514       ROLLBACK to SYNC_DATA_LEVEL;
4515     END IF;
4516     FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
4517                              ,p_count   => x_msg_count
4518                              ,p_data    => x_msg_data);
4519     x_return_status := FND_API.G_RET_STS_ERROR;
4520 
4521   WHEN OTHERS THEN
4522     code_debug(l_api_name ||' Exception - Others '||SQLERRM);
4523     IF FND_API.TO_BOOLEAN(p_commit) THEN
4524       ROLLBACK to SYNC_DATA_LEVEL;
4525     END IF;
4526     x_return_status := FND_API.G_RET_STS_ERROR;
4527 
4528 END Sync_Data_Level;
4529 ----------------------------------------------------------------------
4530 
4531 ----------------------------------------------------------------------
4532                   ---------------------------------
4533                   -- Data Level Association APIs --
4534                   ---------------------------------
4535 
4536 PROCEDURE  Sync_dl_assoc (
4537         p_api_version          IN  NUMBER
4538        ,p_init_msg_list        IN  VARCHAR2
4539        ,p_commit               IN  VARCHAR2
4540        ,p_transaction_type     IN  VARCHAR2
4541        ,p_attr_group_id        IN  NUMBER
4542        ,p_application_id       IN  NUMBER
4543        ,p_attr_group_type      IN  VARCHAR2
4544        ,p_attr_group_name      IN  VARCHAR2
4545        ,p_data_level_id        IN  NUMBER
4546        ,p_data_level_name      IN  VARCHAR2
4547        ,p_defaulting           IN  VARCHAR2
4548        ,p_defaulting_name      IN  VARCHAR2
4549        ,p_view_priv_id         IN  NUMBER
4550        ,p_view_priv_name       IN  VARCHAR2
4551        ,p_user_view_priv_name  IN  VARCHAR2
4552        ,p_edit_priv_id         IN  NUMBER
4553        ,p_edit_priv_name       IN  VARCHAR2
4554        ,p_user_edit_priv_name  IN  VARCHAR2
4555        ,p_raise_pre_event      IN  VARCHAR2
4556        ,p_raise_post_event     IN  VARCHAR2
4557        ,p_last_updated_by      IN  VARCHAR2
4558        ,p_last_update_date     IN  DATE
4559        ,x_return_status        OUT NOCOPY VARCHAR2
4560        ,x_msg_count            OUT NOCOPY NUMBER
4561        ,x_msg_data             OUT NOCOPY VARCHAR2
4562        ) IS
4563 
4564   l_api_version       NUMBER;
4565   l_api_name          VARCHAR2(30);
4566   l_msg_data          VARCHAR2(4000);
4567   l_attr_group_id     NUMBER;
4568   l_defaulting        VARCHAR2(1);
4569   l_view_priv_id      NUMBER;
4570   l_edit_priv_id      NUMBER;
4571   l_raise_pre_event   VARCHAR2(1);
4572   l_raise_post_event  VARCHAR2(1);
4573   l_data_level_rec    ego_data_level_b%ROWTYPE;
4574   l_msg_name          VARCHAR2(30);
4575 BEGIN
4576 
4577   l_api_version := 1.0;
4578   l_api_name    := 'SYNC_DL_ASSOC';
4579   l_msg_data    := NULL;
4580   l_msg_name    := 'EGO_IPI_INVALID_VALUE';
4581   code_debug(l_api_name ||' Start ');
4582 
4583 
4584 
4585   -- Initialize message list even though we don't currently use it
4586   IF FND_API.To_Boolean(p_init_msg_list) THEN
4587     FND_MSG_PUB.Initialize;
4588   END IF;
4589 
4590 
4591   -- Check for call compatibility
4592   IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
4593                                       l_api_name, G_PKG_NAME)
4594   THEN
4595     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4596   END IF;
4597 
4598 
4599 
4600   -- Standard start of API savepoint
4601   IF FND_API.TO_BOOLEAN(p_commit) THEN
4602     SAVEPOINT SYNC_DL_ASSOC;
4603   END IF;
4604 
4605   IF (p_transaction_type IS NULL) THEN
4606     fnd_message.set_name(G_APP_NAME, 'EGO_TRANSACTION_TYPE');
4607     l_msg_data := fnd_msg_pub.get();
4608   ELSIF p_attr_group_id   IS NULL AND
4609         p_application_id  IS NULL AND
4610         p_attr_group_type  IS NULL AND
4611         p_attr_group_name  IS NULL THEN
4612     fnd_message.set_name(G_APP_NAME, 'EGO_EF_ATTR_GRP');
4613     l_msg_data := fnd_msg_pub.get();
4614   ELSIF p_data_level_id IS NULL AND
4615         p_data_level_name IS NULL THEN
4616     fnd_message.set_name(G_APP_NAME, 'EGO_EF_DATA_LEVEL');
4617     l_msg_data := fnd_msg_pub.get();
4618   END IF;
4619 
4620   IF l_msg_data IS NOT NULL THEN
4621     fnd_message.set_name(G_APP_NAME,'EGO_PKG_MAND_VALUES_MISS1');
4622     fnd_message.set_token('PACKAGE', G_PKG_NAME ||'.'|| l_api_name);
4623     fnd_message.set_token('VALUE', l_msg_data);
4624     FND_MSG_PUB.Add;
4625     RAISE FND_API.G_EXC_ERROR;
4626   END IF;
4627   code_debug(l_api_name ||' Mandatory param validation complete '||p_transaction_type);
4628 
4629 
4630   -- attr group check
4631   BEGIN
4632     IF p_attr_group_id IS NULL THEN
4633       SELECT attr_group_id
4634       INTO l_attr_group_id
4635       FROM ego_fnd_dsc_flx_ctx_ext
4636       WHERE application_id  = p_application_id
4637         AND descriptive_flexfield_name = p_attr_group_type
4638         AND descriptive_flex_context_code = p_attr_group_name;
4639     ELSE
4640       SELECT attr_group_id
4641       INTO l_attr_group_id
4642       FROM ego_fnd_dsc_flx_ctx_ext
4643       WHERE attr_group_id = p_attr_group_id;
4644     END IF;
4645     code_debug(l_api_name ||' Attr Group Id '||l_attr_group_id);
4646 
4647   EXCEPTION
4648     WHEN NO_DATA_FOUND THEN
4649       FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4650       IF p_attr_group_id IS NULL THEN
4651         FND_MESSAGE.Set_Token('NAME','Attribute Group ' );
4652         FND_MESSAGE.Set_Token('VALUE',p_attr_group_type||' - '||p_attr_group_name );
4653       ELSE
4654         FND_MESSAGE.Set_Token('NAME','Attribute Id' );
4655         FND_MESSAGE.Set_Token('VALUE',l_attr_group_id);
4656       END IF;
4657       FND_MSG_PUB.Add;
4658       RAISE FND_API.G_EXC_ERROR;
4659   END;
4660 
4661   -- data level check
4662   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);
4663 
4664   BEGIN
4665     IF p_data_level_id IS NULL THEN
4666       SELECT *
4667       INTO l_data_level_rec
4668       FROM ego_data_level_b
4669       WHERE data_level_name = p_data_level_name
4670         AND attr_group_type = p_attr_group_type
4671         AND application_id = p_application_id;
4672     ELSE
4673       SELECT *
4674       INTO l_data_level_rec
4675       FROM ego_data_level_b
4676       WHERE 1=1 --data_level_name = p_data_level_id;
4677       AND data_level_id = p_data_level_id; --Changed for bug 9574826
4678     END IF;
4679     code_debug(l_api_name ||' Data Level Id '||l_data_level_rec.data_level_id);
4680 
4681   EXCEPTION
4682     WHEN NO_DATA_FOUND THEN
4683       FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4684       IF p_data_level_id IS NULL THEN
4685         FND_MESSAGE.Set_Token('NAME','Data Level' );
4686         FND_MESSAGE.Set_Token('VALUE', p_data_level_name);
4687       ELSE
4688         FND_MESSAGE.Set_Token('NAME','Data Level Id' );
4689         FND_MESSAGE.Set_Token('VALUE',p_data_level_id);
4690       END IF;
4691       FND_MSG_PUB.Add;
4692       RAISE FND_API.G_EXC_ERROR;
4693   END;
4694   code_debug(l_api_name ||' Data Level id '||l_data_level_rec.data_level_id);
4695 
4696 
4697   -- defaulting check check
4698   BEGIN
4699     IF l_data_level_rec.enable_defaulting = 'Y' THEN
4700       IF p_defaulting IS NOT NULL THEN
4701         SELECT lookup_code
4702         INTO l_defaulting
4703         FROM fnd_lookup_values
4704         WHERE lookup_type = 'EGO_EF_AG_DL_BEHAVIOR'
4705         AND lookup_code = p_defaulting
4706         AND language = USERENV('LANG');
4707       ELSIF  p_defaulting_name IS NOT NULL THEN
4708         SELECT lookup_code
4709         INTO l_defaulting
4710         FROM fnd_lookup_values
4711         WHERE lookup_type = 'EGO_EF_AG_DL_BEHAVIOR'
4712         AND meaning = p_defaulting_name
4713         AND language = USERENV('LANG');
4714       ELSE
4715         l_defaulting := '';
4716       END IF;
4717     ELSE
4718       IF p_defaulting IS NOT NULL OR p_defaulting_name IS NOT NULL THEN
4719         FND_MESSAGE.SET_NAME(G_APP_NAME,'EGO_EF_DEFAULT_NOT_ALLOWED');
4720         FND_MSG_PUB.Add;
4721         RAISE FND_API.G_EXC_ERROR;
4722       END IF;
4723     END IF;
4724   EXCEPTION
4725     WHEN NO_DATA_FOUND THEN
4726       FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4727       IF p_defaulting IS NULL THEN
4728         FND_MESSAGE.Set_Token('NAME','Defaulting ' );
4729         FND_MESSAGE.Set_Token('VALUE',p_defaulting_name );
4730       ELSE
4731         FND_MESSAGE.Set_Token('NAME','Defaulting ' );
4732         FND_MESSAGE.Set_Token('VALUE',p_defaulting);
4733       END IF;
4734       FND_MSG_PUB.Add;
4735       RAISE FND_API.G_EXC_ERROR;
4736   END;
4737   code_debug(l_api_name ||' Defaulting '||l_defaulting);
4738 
4739   -- view priv check
4740   BEGIN
4741     IF l_data_level_rec.enable_view_priv = 'Y' THEN
4742       IF p_view_priv_id IS NOT NULL THEN
4743         SELECT function_id
4744         INTO l_view_priv_id
4745         FROM fnd_form_functions
4746         WHERE function_id = p_view_priv_id;
4747       ELSIF p_view_priv_name IS NOT NULL THEN
4748         SELECT function_id
4749         INTO l_view_priv_id
4750         FROM fnd_form_functions
4751         WHERE function_name = p_view_priv_name;
4752       ELSIF p_user_view_priv_name IS NOT NULL THEN
4753         SELECT function_id
4754         INTO l_view_priv_id
4755         FROM fnd_form_functions_vl
4756         WHERE user_function_name = p_user_view_priv_name;
4757       ELSE
4758         l_view_priv_id := NULL;
4759       END IF;
4760     ELSE
4761       IF p_view_priv_id IS NOT NULL OR p_view_priv_name IS NOT NULL THEN
4762         -- flash message you cannot view privileges
4763         fnd_message.set_name(G_APP_NAME,'EGO_VIEW_PRIV_NOT_ALLOWED');
4764         FND_MSG_PUB.Add;
4765         RAISE FND_API.G_EXC_ERROR;
4766       END IF;
4767     END IF;
4768   EXCEPTION
4769     WHEN NO_DATA_FOUND THEN
4770       FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4771       IF p_view_priv_id IS NOT NULL THEN
4772         FND_MESSAGE.Set_Token('NAME','View Privilege' );
4773         FND_MESSAGE.Set_Token('VALUE',p_view_priv_id );
4774       ELSIF p_view_priv_name IS NOT NULL THEN
4775         FND_MESSAGE.Set_Token('NAME','View Privilege' );
4776         FND_MESSAGE.Set_Token('VALUE',p_view_priv_name);
4777       ELSE
4778         FND_MESSAGE.set_token('NAME','View Privilege');
4779         FND_MESSAGE.set_token('VALUE',p_user_view_priv_name);
4780       END IF;
4781       FND_MSG_PUB.Add;
4782       RAISE FND_API.G_EXC_ERROR;
4783   END;
4784   code_debug(l_api_name ||' View Priv id '||l_view_priv_id);
4785 
4786   -- edit priv check
4787   BEGIN
4788     IF l_data_level_rec.enable_edit_priv = 'Y' THEN
4789       IF p_edit_priv_id IS NOT NULL THEN
4790         SELECT function_id
4791         INTO l_edit_priv_id
4792         FROM fnd_form_functions
4793         WHERE function_id = p_edit_priv_id;
4794       ELSIF p_edit_priv_name IS NOT NULL THEN
4795         SELECT function_id
4796         INTO l_edit_priv_id
4797         FROM fnd_form_functions
4798         WHERE function_name = p_edit_priv_name;
4799       ELSIF p_user_edit_priv_name IS NOT NULL THEN
4800         SELECT function_id
4801         INTO l_edit_priv_id
4802         FROM fnd_form_functions_vl
4803         WHERE user_function_name = p_user_edit_priv_name;
4804       ELSE
4805         l_edit_priv_id := NULL;
4806       END IF;
4807     ELSE
4808       IF p_edit_priv_id IS NOT NULL OR p_edit_priv_name IS NOT NULL THEN
4809         -- flash message you cannot view privileges
4810         fnd_message.set_name(G_APP_NAME,'EGO_EDIT_PRIV_NOT_ALLOWED');
4811         FND_MSG_PUB.Add;
4812         RAISE FND_API.G_EXC_ERROR;
4813       END IF;
4814     END IF;
4815   EXCEPTION
4816     WHEN NO_DATA_FOUND THEN
4817       FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4818       IF p_edit_priv_id IS NOT NULL THEN
4819         FND_MESSAGE.Set_Token('NAME','Edit Privilege' );
4820         FND_MESSAGE.Set_Token('VALUE',p_edit_priv_id );
4821       ELSIF p_edit_priv_name IS NOT NULL THEN
4822         FND_MESSAGE.Set_Token('NAME','Edit Privilege' );
4823         FND_MESSAGE.Set_Token('VALUE',p_edit_priv_name);
4824       ELSE
4825         FND_MESSAGE.set_token('NAME','Edit Privilege');
4826         FND_MESSAGE.set_token('VALUE',p_user_edit_priv_name);
4827       END IF;
4828       FND_MSG_PUB.Add;
4829       RAISE FND_API.G_EXC_ERROR;
4830   END;
4831   code_debug(l_api_name ||' Edit Priv id '||l_edit_priv_id);
4832 
4833   IF NVL(p_raise_pre_event,'N') IN ('Y', 'N')  THEN
4834     IF l_data_level_rec.enable_pre_event = 'N' AND NVL(p_raise_pre_event,'N') = 'Y' THEN
4835       fnd_message.set_name(G_APP_NAME,'EGO_PRE_EVENT_NOT_ALLOWED');
4836       FND_MSG_PUB.Add;
4837       RAISE FND_API.G_EXC_ERROR;
4838     ELSE
4839       l_raise_pre_event := NVL(p_raise_pre_event,'N');
4840     END IF;
4841   ELSE
4842     FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4843     FND_MESSAGE.Set_Token('NAME','Pre Event' );
4844     FND_MESSAGE.Set_Token('VALUE',l_raise_pre_event );
4845     FND_MSG_PUB.Add;
4846     RAISE FND_API.G_EXC_ERROR;
4847   END IF;
4848   code_debug(l_api_name ||' Pre Event '||l_raise_pre_event);
4849 
4850   IF NVL(p_raise_post_event,'N') IN ('Y', 'N')  THEN
4851     IF l_data_level_rec.enable_post_event = 'N' AND NVL(p_raise_post_event,'N') = 'Y' THEN
4852       fnd_message.set_name(G_APP_NAME,'EGO_POST_EVENT_NOT_ALLOWED');
4853       FND_MSG_PUB.Add;
4854       RAISE FND_API.G_EXC_ERROR;
4855     ELSE
4856       l_raise_post_event := NVL(p_raise_post_event,'N');
4857     END IF;
4858   ELSE
4859     FND_MESSAGE.Set_Name(G_APP_NAME, l_msg_name);
4860     FND_MESSAGE.Set_Token('NAME','Post Event' );
4861     FND_MESSAGE.Set_Token('VALUE',l_raise_post_event );
4862     FND_MSG_PUB.Add;
4863     RAISE FND_API.G_EXC_ERROR;
4864   END IF;
4865   code_debug(l_api_name ||' Post Event '||l_raise_post_event);
4866 
4867   IF p_transaction_type = 'CREATE' THEN
4868     INSERT INTO EGO_ATTR_GROUP_DL
4869       (attr_group_id
4870       ,data_level_id
4871       ,defaulting
4872       ,view_privilege_id
4873       ,edit_privilege_id
4874       ,raise_pre_event
4875       ,raise_post_event
4876       ,created_by
4877       ,creation_date
4878       ,last_updated_by
4879       ,last_update_date
4880       ,last_update_login
4881       )
4882     VALUES
4883       (l_attr_group_id
4884       ,l_data_level_rec.data_level_id
4885       ,l_defaulting
4886       ,l_view_priv_id
4887       ,l_edit_priv_id
4888       ,l_raise_pre_event
4889       ,l_raise_post_event
4890       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4891       ,NVL(p_last_update_date, SYSDATE)
4892       ,NVL(p_last_updated_by, G_CURRENT_USER_ID)
4893       ,NVL(p_last_update_date, SYSDATE)
4894       ,G_CURRENT_LOGIN_ID
4895       );
4896   ELSE
4897     UPDATE EGO_ATTR_GROUP_DL
4898     SET defaulting = l_defaulting
4899        ,view_privilege_id = l_view_priv_id
4900        ,edit_privilege_id = l_edit_priv_id
4901        ,raise_pre_event   = l_raise_pre_event
4902        ,raise_post_event  = l_raise_post_event
4903        ,last_updated_by   = NVL(p_last_updated_by, G_CURRENT_USER_ID)
4904        ,last_update_date  = NVL(p_last_update_date, SYSDATE)
4905        ,last_update_login = G_CURRENT_LOGIN_ID
4906         where attr_group_id = l_attr_group_id and data_level_id =l_data_level_rec.data_level_id;
4907   END IF;
4908 
4909   IF FND_API.TO_BOOLEAN(p_commit) THEN
4910     COMMIT WORK;
4911   END IF;
4912 
4913   x_return_status := FND_API.G_RET_STS_SUCCESS;
4914   code_debug(l_api_name ||' Done ');
4915 
4916 EXCEPTION
4917   WHEN FND_API.G_EXC_ERROR THEN
4918     code_debug(l_api_name ||' Exception -  FND_API.G_EXC_ERROR '||x_msg_data);
4919     IF FND_API.TO_BOOLEAN(p_commit) THEN
4920       ROLLBACK to SYNC_DL_ASSOC;
4921     END IF;
4922     FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
4923                              ,p_count   => x_msg_count
4924                              ,p_data    => x_msg_data);
4925     x_return_status := FND_API.G_RET_STS_ERROR;
4926 
4927   WHEN OTHERS THEN
4928     code_debug(l_api_name ||' Exception - Others '||SQLERRM);
4929     IF FND_API.TO_BOOLEAN(p_commit) THEN
4930       ROLLBACK to SYNC_DL_ASSOC;
4931     END IF;
4932     x_return_status := FND_API.G_RET_STS_ERROR;
4933 
4934 END Sync_dl_assoc;
4935 
4936 ----------------------------------------------------------------------
4937 
4938                        --------------------
4939                        -- Attribute APIs --
4940                        --------------------
4941 
4942 ----------------------------------------------------------------------
4943 
4944 PROCEDURE Create_Attribute (
4945         p_api_version                   IN   NUMBER
4946        ,p_application_id                IN   NUMBER
4947        ,p_attr_group_type               IN   VARCHAR2
4948        ,p_attr_group_name               IN   VARCHAR2
4949        ,p_internal_name                 IN   VARCHAR2
4950        ,p_display_name                  IN   VARCHAR2
4951        ,p_description                   IN   VARCHAR2
4952        ,p_sequence                      IN   NUMBER
4953        ,p_data_type                     IN   VARCHAR2
4954        ,p_required                      IN   VARCHAR2
4955        ,p_searchable                    IN   VARCHAR2
4956        ,p_column                        IN   VARCHAR2
4957        ,p_is_column_indexed             IN   VARCHAR2
4958        ,p_value_set_id                  IN   NUMBER
4959        ,p_info_1                        IN   VARCHAR2   DEFAULT NULL
4960        ,p_default_value                 IN   VARCHAR2
4961        ,p_unique_key_flag               IN   VARCHAR2
4962        ,p_enabled                       IN   VARCHAR2
4963        ,p_display                       IN   VARCHAR2
4964        ,p_uom_class                     IN   VARCHAR2
4965        ,p_control_level                 IN   NUMBER     DEFAULT 1 --JDEJESU: NULL for 11.5.10E
4966        ,p_attribute_code                IN   VARCHAR2   DEFAULT NULL
4967        ,p_view_in_hierarchy_code        IN   VARCHAR2   DEFAULT 'A'
4968        ,p_edit_in_hierarchy_code        IN   VARCHAR2   DEFAULT 'A'
4969        ,p_customization_level           IN   VARCHAR2   DEFAULT 'A'
4970        ,p_owner                         IN   NUMBER     DEFAULT NULL
4971        ,p_lud                           IN   DATE       DEFAULT SYSDATE
4972        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
4973        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
4974        ,x_return_status                 OUT NOCOPY VARCHAR2
4975        ,x_errorcode                     OUT NOCOPY NUMBER
4976        ,x_msg_count                     OUT NOCOPY NUMBER
4977        ,x_msg_data                      OUT NOCOPY VARCHAR2
4978 ) IS
4979 BEGIN
4980   Create_Attribute (
4981           p_api_version
4982          ,p_application_id
4983          ,p_attr_group_type
4984          ,p_attr_group_name
4985          ,p_internal_name
4986          ,p_display_name
4987          ,p_description
4988          ,p_sequence
4989          ,p_data_type
4990          ,p_required
4991          ,p_searchable
4992          ,null
4993          ,p_column
4994          ,p_is_column_indexed
4995          ,p_value_set_id
4996          ,p_info_1
4997          ,p_default_value
4998          ,p_unique_key_flag
4999          ,p_enabled
5000          ,p_display
5001          ,p_uom_class
5002          ,p_control_level
5003          ,p_attribute_code
5004          ,p_view_in_hierarchy_code
5005          ,p_edit_in_hierarchy_code
5006          ,p_customization_level
5007          ,p_owner
5008          ,p_lud
5009          ,p_init_msg_list
5010          ,p_commit
5011          ,x_return_status
5012          ,x_errorcode
5013          ,x_msg_count
5014          ,x_msg_data
5015   );
5016 END;
5017 PROCEDURE Create_Attribute (
5018         p_api_version                   IN   NUMBER
5019        ,p_application_id                IN   NUMBER
5020        ,p_attr_group_type               IN   VARCHAR2
5021        ,p_attr_group_name               IN   VARCHAR2
5022        ,p_internal_name                 IN   VARCHAR2
5023        ,p_display_name                  IN   VARCHAR2
5024        ,p_description                   IN   VARCHAR2
5025        ,p_sequence                      IN   NUMBER
5026        ,p_data_type                     IN   VARCHAR2
5027        ,p_required                      IN   VARCHAR2
5028        ,p_searchable                    IN   VARCHAR2
5029        ,p_read_only_flag                 IN   VARCHAR2
5030        ,p_column                        IN   VARCHAR2
5031        ,p_is_column_indexed             IN   VARCHAR2
5032        ,p_value_set_id                  IN   NUMBER
5033        ,p_info_1                        IN   VARCHAR2   DEFAULT NULL
5034        ,p_default_value                 IN   VARCHAR2
5035        ,p_unique_key_flag               IN   VARCHAR2
5036        ,p_enabled                       IN   VARCHAR2
5037        ,p_display                       IN   VARCHAR2
5038        ,p_uom_class                     IN   VARCHAR2
5039        ,p_control_level                 IN   NUMBER     DEFAULT 1 --JDEJESU: NULL for 11.5.10E
5040        ,p_attribute_code                IN   VARCHAR2   DEFAULT NULL
5041        ,p_view_in_hierarchy_code        IN   VARCHAR2   DEFAULT 'A'
5042        ,p_edit_in_hierarchy_code        IN   VARCHAR2   DEFAULT 'A'
5043        ,p_customization_level           IN   VARCHAR2   DEFAULT 'A'
5044        ,p_owner                         IN   NUMBER     DEFAULT NULL
5045        ,p_lud                           IN   DATE       DEFAULT SYSDATE
5046        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
5047        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
5048        ,x_return_status                 OUT NOCOPY VARCHAR2
5049        ,x_errorcode                     OUT NOCOPY NUMBER
5050        ,x_msg_count                     OUT NOCOPY NUMBER
5051        ,x_msg_data                      OUT NOCOPY VARCHAR2
5052 ) IS
5053 
5054     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Attribute';
5055 
5056     --we don't use l_api_version yet, but eventually we might:
5057     --if we change required parameters, version goes from n.x to (n+1).x
5058     --if we change optional parameters, version goes from x.n to x.(n+1)
5059     l_api_version            CONSTANT NUMBER := 1.0;
5060 
5061     l_sequence               NUMBER;
5062     l_data_type_is_trans_text BOOLEAN;
5063     l_col_data_type          VARCHAR2(1);
5064     l_col_width              NUMBER;
5065     l_required               VARCHAR2(1);
5066     l_searchable             VARCHAR2(1);
5067     l_unique_key_flag        VARCHAR2(1);
5068     l_enabled                VARCHAR2(1);
5069     l_read_only_flag          VARCHAR2(1);
5070     l_display                VARCHAR2(1);
5071     l_is_column_correct      BOOLEAN := TRUE;
5072     l_is_column_indexed      VARCHAR2(1);
5073     l_is_chg_column_indexed  VARCHAR2(1);
5074     l_table_name             VARCHAR2(30);
5075     l_chg_table_name         VARCHAR2(30);
5076     l_valid_uom_column       VARCHAR2(300);
5077 
5078     --Bug 5443697
5079     e_attr_starts_with_num        EXCEPTION;
5080     e_attr_starts_with_und_sc     EXCEPTION;
5081     l_start_num                   VARCHAR2(10);
5082     l_start_und_sc                VARCHAR2(10);
5083 
5084     e_attr_dup_seq_error     EXCEPTION;
5085     e_first_attr_cbox        EXCEPTION;
5086     e_col_data_type_error    EXCEPTION;
5087     e_vs_data_type_error     EXCEPTION;
5088     e_no_vs_for_id_error     EXCEPTION;
5089     e_bad_info_1_error       EXCEPTION;
5090     e_uom_not_allowed        EXCEPTION;
5091     e_default_value_len_err  EXCEPTION;
5092     e_col_internal_name_error    EXCEPTION;  --vkeerthi - Fix for bug 5884003.
5093     --Bug 4703510
5094     l_fnd_exists             VARCHAR2(1) ;
5095     l_ego_exists              VARCHAR2(1);
5096     l_value_set_id           FND_DESCR_FLEX_COLUMN_USAGES.flex_value_set_id%TYPE;
5097     l_multi_row_flag         VARCHAR2(2);
5098     l_min_seq                NUMBER;
5099 
5100   BEGIN
5101 
5102     -- Standard start of API savepoint
5103     IF FND_API.TO_BOOLEAN(p_commit) THEN
5104       SAVEPOINT Create_Attribute_PUB;
5105     END IF;
5106 
5107     -- Check for call compatibility
5108     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
5109                                         l_api_name, G_PKG_NAME)
5110     THEN
5111       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5112     END IF;
5113     -- Initialize message list even though we don't currently use it
5114     IF FND_API.To_Boolean(p_init_msg_list) THEN
5115       FND_MSG_PUB.Initialize;
5116     END IF;
5117     --Bug 4703510
5118     --check if the Attribute name starts with a number
5119     --Bug 5443697
5120     has_Num_Start_char (p_internal_name =>p_internal_name,
5121                                      x_start_num => l_start_num);
5122     IF (l_start_num = 'Y') THEN
5123       RAISE e_attr_starts_with_num;
5124     END IF ;
5125     --check if the Attribute name starts with an under score
5126     --Bug 5443697
5127     has_Given_Char_As_Start_char (p_internal_name =>p_internal_name,
5128                                   p_char_set =>'_',
5129                                   x_start_und_sc => l_start_und_sc);
5130      IF (l_start_und_sc = 'Y') THEN
5131       RAISE e_attr_starts_with_und_sc;
5132     END IF ;
5133 
5134     Get_fnd_ego_record_exists (
5135                      p_context=>'ATTRIBUTE'
5136                     ,p_application_id => p_application_id
5137                     ,p_attr_group_type => p_attr_group_type
5138                     ,p_attr_group_name => p_attr_group_name
5139                     ,p_internal_name => p_internal_name
5140                     ,x_fnd_exists => l_fnd_exists
5141                     ,x_ego_exists => l_ego_exists
5142                     );
5143 -----------------------------------
5144     -----------------------------------------------------------------------------
5145     -- First we default the following parameters in case user didn't pass them --
5146     -----------------------------------------------------------------------------
5147     IF (p_sequence IS NOT NULL) THEN
5148     --commenting this out as the flags l_fnd_exists and l_ego_exists take care of this now.
5149       -- Make sure passed-in sequence does not already exist
5150       SELECT COUNT(*)
5151         INTO l_sequence
5152         FROM FND_DESCR_FLEX_COLUMN_USAGES
5153        WHERE APPLICATION_ID = p_application_id
5154          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5155          AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
5156          AND COLUMN_SEQ_NUM = p_sequence;
5157 
5158       IF (l_fnd_exists <> 'Y' AND l_sequence > 0) THEN
5159          RAISE e_attr_dup_seq_error;
5160       ELSE
5161         l_sequence := p_sequence;
5162       END IF;
5163 
5164 
5165     ELSE
5166       -- If user didn't pass in a sequence, add 10 to highest one (or start with 10) --
5167       SELECT MAX(COLUMN_SEQ_NUM)
5168         INTO l_sequence
5169         FROM FND_DESCR_FLEX_COLUMN_USAGES
5170        WHERE APPLICATION_ID = p_application_id
5171          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5172          AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name;
5173 
5174       l_sequence := NVL(l_sequence, 0) + 10;
5175     END IF;
5176 -- Vkeerthi - Fix for bug 5884003.
5177     -- Checking if Attribute's internal name is a keyword.
5178     IF (p_internal_name IS NOT  NULL) THEN
5179       BEGIN
5180         EXECUTE IMMEDIATE 'SELECT NULL AS ' || p_internal_name || ' FROM DUAL';
5181       EXCEPTION
5182         WHEN OTHERS THEN
5183           RAISE e_col_internal_name_error;
5184       END;
5185     END IF;
5186 -- End of fix for bug 5884003
5187 
5188 
5189     IF (p_display = EGO_EXT_FWK_PUB.G_CHECKBOX_DISP_TYPE
5190         OR p_display =EGO_EXT_FWK_PUB.G_RADIO_DISP_TYPE ) THEN --bugFix:5292226
5191 
5192       SELECT MULTI_ROW
5193         INTO l_multi_row_flag
5194         FROM EGO_FND_DSC_FLX_CTX_EXT
5195        WHERE APPLICATION_ID = p_application_id
5196          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5197          AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name;
5198 
5199       IF (l_multi_row_flag = 'Y') THEN
5200 
5201         SELECT MIN(COLUMN_SEQ_NUM)
5202           INTO l_min_seq
5203           FROM FND_DESCR_FLEX_COLUMN_USAGES
5204          WHERE APPLICATION_ID = p_application_id
5205            AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5206            AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name;
5207 
5208         IF (l_sequence <= l_min_seq OR l_min_seq IS NULL) THEN
5209           RAISE e_first_attr_cbox;
5210         END IF;
5211 
5212       END IF;
5213 
5214     END IF;
5215 
5216 
5217     l_required := NVL(p_required, 'N');
5218     l_searchable := NVL(p_searchable, 'N');
5219     l_unique_key_flag := NVL(p_unique_key_flag, 'N');
5220     l_enabled := NVL(p_enabled, 'Y');
5221     l_display := NVL(p_display, 'T');
5222     l_read_only_flag := NVL(p_read_only_flag, 'N'); --add by geguo
5223     ------------------------------------------------------------------------
5224     -- Find the correct table name for use in validating column data type --
5225     ------------------------------------------------------------------------
5226 
5227     l_data_type_is_trans_text := (p_data_type = G_TRANS_TEXT_DATA_TYPE);
5228     IF (l_data_type_is_trans_text) THEN
5229       l_table_name := Get_TL_Table_Name(p_application_id
5230                                        ,p_attr_group_type);
5231       l_chg_table_name:=Get_Attr_Changes_TL_Table(p_application_id => p_application_id
5232                                        ,p_attr_group_type => p_attr_group_type);--for getting the pending table
5233     ELSE
5234       l_table_name := Get_Table_Name(p_application_id
5235                                     ,p_attr_group_type);
5236       l_chg_table_name:=Get_Attr_Changes_B_Table(p_application_id => p_application_id
5237                                        ,p_attr_group_type => p_attr_group_type);--for getting the pending table
5238 
5239     END IF;--IF (l_data_type_is_trans_text)
5240 
5241     BEGIN
5242 
5243       SELECT COLUMN_TYPE , WIDTH
5244         INTO l_col_data_type, l_col_width
5245         FROM FND_COLUMNS
5246        WHERE COLUMN_NAME = p_column
5247          AND TABLE_ID = (SELECT TABLE_ID
5248                            FROM FND_TABLES
5249                           WHERE TABLE_NAME = l_table_name);
5250 
5251       IF (((p_data_type = G_CHAR_DATA_TYPE OR
5252             p_data_type = G_TRANS_TEXT_DATA_TYPE) AND
5253            l_col_data_type <> 'V') OR
5254           (p_data_type = G_NUMBER_DATA_TYPE AND l_col_data_type <> 'N') OR
5255           ((p_data_type = G_DATE_DATA_TYPE OR
5256             p_data_type = G_DATE_TIME_DATA_TYPE) AND
5257            l_col_data_type <> 'D')) THEN
5258 
5259 /***
5260 TO DO: right now we can't verify that TransText Attributes use TL-type columns,
5261 because we can't rely on the column being named 'TL_EXT_ATTR%' and we aren't
5262 using FND_COLUMNS's TRANSLATE_FLAG column yet; but we should be, and we should
5263 add to the IF check above that if the data type is TransText and the column's
5264 TRANSLATE_FLAG isn't 'Y' then we should error out.
5265 ***/
5266 
5267         RAISE e_col_data_type_error;
5268 
5269       END IF;
5270 
5271       IF ( (p_data_type = G_CHAR_DATA_TYPE OR
5272             p_data_type = G_TRANS_TEXT_DATA_TYPE) AND
5273             LENGTH(p_default_value) >  l_col_width )THEN
5274 
5275         RAISE e_default_value_len_err;
5276 
5277       END IF;
5278 
5279     EXCEPTION
5280       WHEN NO_DATA_FOUND THEN
5281         -- whoever owns the table didn't seed the column correctly
5282         RAISE e_col_data_type_error;
5283     END;
5284     -- correct datatype and column name are passed
5285 
5286   -----------------------------------------------------------------------------------
5287     -- If the UOM Class is not null we need to make sure that we have             --
5288     -- a corresponding database column in user workbench                          --
5289     -- to store the UOM Code                                                      --
5290     -- bug 3875730                                                                --
5291   -----------------------------------------------------------------------------------
5292     IF(p_uom_class IS NOT  NULL) THEN
5293 
5294       l_valid_uom_column := check_Uom_Column_Exists(p_column , l_table_name );
5295 
5296       IF l_valid_uom_column IS NULL THEN
5297         RAISE e_uom_not_allowed;
5298       ELSIF l_valid_uom_column <> '1' THEN
5299         l_valid_uom_column := check_Uom_Col_In_Use ( p_application_id
5300                                                      ,p_attr_group_type
5301                                                      ,p_attr_group_name
5302                                                      ,p_internal_name
5303                                                      ,l_valid_uom_column
5304                                                     );
5305         IF l_valid_uom_column IS NOT NULL THEN
5306           RAISE e_uom_not_allowed;
5307         END IF ;
5308       END IF ;
5309     END IF ;
5310 
5311     -------------------------------------------------------------------------------------
5312     -- Make sure that if a Value Set was passed in, it's compatible with the data type --
5313     -------------------------------------------------------------------------------------
5314     IF (p_value_set_id > 0) THEN
5315 
5316       DECLARE
5317         l_value_set_format_code  VARCHAR2(1);
5318       BEGIN
5319 
5320         SELECT FORMAT_TYPE
5321           INTO l_value_set_format_code
5322           FROM FND_FLEX_VALUE_SETS
5323          WHERE FLEX_VALUE_SET_ID = p_value_set_id;
5324 
5325         IF (l_value_set_format_code IS NULL OR
5326             (l_value_set_format_code <> p_data_type)) THEN
5327           RAISE e_vs_data_type_error;
5328         END IF;
5329 
5330       EXCEPTION
5331         WHEN NO_DATA_FOUND THEN
5332           RAISE e_no_vs_for_id_error;
5333         END;
5334     END IF;
5335 
5336     ---------------------------------------------
5337     -- If p_info_1 is not null, we validate it --
5338     ---------------------------------------------
5339     IF (p_info_1 IS NOT NULL) THEN
5340       DECLARE
5341         l_tokenized_url_dummy     VARCHAR(10000);
5342         l_attr_group_metadata_obj EGO_ATTR_GROUP_METADATA_OBJ;
5343         l_attr_metadata_obj       EGO_ATTR_METADATA_OBJ;
5344       BEGIN
5345         l_attr_group_metadata_obj :=
5346           EGO_USER_ATTRS_COMMON_PVT.Get_Attr_Group_Metadata(
5347                                      p_application_id  => p_application_id
5348                                     ,p_attr_group_type => p_attr_group_type
5349                                     ,p_attr_group_name => p_attr_group_name
5350                                    );
5351 
5352         l_attr_metadata_obj := EGO_ATTR_METADATA_OBJ(
5353                                  null -- ATTR_ID
5354                                 ,null -- ATTR_GROUP_ID
5355                                 ,p_attr_group_name
5356                                 ,p_internal_name
5357                                 ,p_display_name
5358                                 ,p_data_type
5359                                 ,null -- DATA_TYPE_MEANING
5360                                 ,p_sequence
5361                                 ,p_unique_key_flag
5362                                 ,p_default_value
5363                                 ,p_info_1
5364                                 ,null -- MAXIMUM_SIZE
5365                                 ,p_required
5366                                 ,p_column
5367                                 ,p_value_set_id
5368                                 ,null -- VALIDATION_TYPE
5369                                 ,null -- MINIMUM_VALUE
5370                                 ,null -- MAXIMUM_VALUE
5371                                 ,p_uom_class
5372                                 ,null -- UOM_CODE
5373                                 ,null -- DISP_TO_INT_VAL_QUERY
5374                                 ,null -- INT_TO_DISP_VAL_QUERY
5375                                 ,'N'
5376                                 ,p_view_in_hierarchy_code
5377                                 ,p_edit_in_hierarchy_code
5378                                );
5379 
5380         l_tokenized_url_dummy := Build_Tokenized_URL_Query(
5381                                    l_attr_group_metadata_obj
5382                                   ,l_attr_metadata_obj
5383                                  );
5384 
5385       EXCEPTION
5386         WHEN FND_API.G_EXC_ERROR THEN
5387           RAISE e_bad_info_1_error;
5388       END;
5389     END IF;
5390     ----------------------------------------------------
5391     -- If the Attribute is searchable and there's not --
5392     -- already an index on this column, we create one --
5393     ----------------------------------------------------
5394 
5395     IF (l_searchable = 'Y') THEN
5396 
5397       IF (p_is_column_indexed IS NOT NULL) THEN
5398 
5399         ---------------------------------------------------------------------------
5400         -- We are passed in a meaning for 'Yes' or 'No'; we need to get its code --
5401         ---------------------------------------------------------------------------
5402         SELECT LOOKUP_CODE
5403           INTO l_is_column_indexed
5404           FROM FND_LOOKUP_VALUES
5405          WHERE LOOKUP_TYPE = 'YES_NO'
5406            AND LANGUAGE = USERENV('LANG')
5407            AND VIEW_APPLICATION_ID = 0
5408            AND MEANING = p_is_column_indexed;
5409 --look up code for  pending table.
5410             SELECT LOOKUP_CODE
5411                   INTO l_is_chg_column_indexed
5412                   FROM FND_LOOKUP_VALUES
5413                  WHERE LOOKUP_TYPE = 'YES_NO'
5414                    AND LANGUAGE = USERENV('LANG')
5415                    AND VIEW_APPLICATION_ID = 0
5416                    AND MEANING = p_is_column_indexed;
5417       ELSE
5418 
5419         l_is_column_indexed := Is_Column_Indexed(p_column_name     => p_column
5420                                                 ,p_table_name      => l_table_name
5421                                                 ,p_application_id  => p_application_id
5422                                                 ,p_attr_group_type => p_attr_group_type);
5423 
5424 --for checking whether the column in Pending table is indexed.
5425         l_is_chg_column_indexed := Is_Column_Indexed(p_column_name     => p_column
5426                                                 ,p_table_name      => l_chg_table_name
5427                                                 ,p_application_id  => p_application_id
5428                                                 ,p_attr_group_type => p_attr_group_type);
5429 
5430       END IF;
5431 
5432       IF ((l_is_column_indexed IS NULL OR
5433           l_is_column_indexed <> 'Y') OR
5434            (l_is_chg_column_indexed IS NULL OR
5435           l_is_chg_column_indexed <> 'Y')) THEN
5436 
5437         l_is_column_indexed :=Create_Index_For_DBCol(p_application_id => p_application_id
5438                                                      ,p_attr_group_type => p_attr_group_type
5439                                                      ,p_attr_group_name => p_attr_group_name
5440                                                      ,p_table_name => l_table_name
5441                                                      ,p_chg_table_name => l_chg_table_name
5442                                                      ,p_is_column_indexed => l_is_column_indexed
5443                                                      ,p_is_chg_column_indexed => l_is_chg_column_indexed
5444                                                      ,p_column => p_column
5445                                                      ,p_is_table_translatable =>l_data_type_is_trans_text);
5446 
5447 /*** Right now there is no reporting if this fails (i.e., if 'N' is returned) ***/
5448       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'))
5449     END IF;
5450   IF (l_fnd_exists = 'Y') THEN  --Bug 4703510
5451     BEGIN
5452       SELECT flex_value_set_id
5453       INTO l_value_set_id
5454       FROM FND_DESCR_FLEX_COLUMN_USAGES
5455       WHERE APPLICATION_ID = p_application_id
5456       AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5457       AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
5458       AND END_USER_COLUMN_NAME = p_internal_name;
5459     EXCEPTION
5460       WHEN OTHERS THEN
5461        l_value_set_id := NULL;
5462     END;
5463 
5464     UPDATE FND_DESCR_FLEX_COLUMN_USAGES
5465        SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
5466            LAST_UPDATE_DATE = p_lud,
5467            LAST_UPDATE_LOGIN = g_current_login_id,
5468            COLUMN_SEQ_NUM = NVL(l_sequence, COLUMN_SEQ_NUM),
5469            ENABLED_FLAG = NVL(p_enabled, ENABLED_FLAG),
5470            REQUIRED_FLAG = NVL(p_required, REQUIRED_FLAG),
5471            DISPLAY_FLAG = NVL(p_display, DISPLAY_FLAG),
5472            FLEX_VALUE_SET_ID = l_value_set_id,
5473            DEFAULT_VALUE = p_default_value
5474        WHERE APPLICATION_ID =  p_application_id
5475          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5476          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5477          AND APPLICATION_COLUMN_NAME = p_column;
5478 
5479     UPDATE FND_DESCR_FLEX_COL_USAGE_TL
5480        SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
5481            LAST_UPDATE_DATE = p_lud,
5482            LAST_UPDATE_LOGIN = g_current_login_id,
5483            FORM_LEFT_PROMPT = p_display_name,
5484            FORM_ABOVE_PROMPT = p_display_name,
5485            DESCRIPTION = p_description,
5486            SOURCE_LANG = USERENV('LANG')
5487      WHERE APPLICATION_ID = p_application_id
5488        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5489        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5490        AND APPLICATION_COLUMN_NAME = p_column
5491        --AND LANGUAGE = USERENV('LANG');
5492       AND USERENV('LANG') in (LANGUAGE , SOURCE_LANG);
5493   ELSE --l_fnd_exists = 'Y'
5494     INSERT INTO FND_DESCR_FLEX_COLUMN_USAGES
5495     (
5496         APPLICATION_ID
5497        ,DESCRIPTIVE_FLEXFIELD_NAME
5498        ,DESCRIPTIVE_FLEX_CONTEXT_CODE
5499        ,APPLICATION_COLUMN_NAME
5500        ,END_USER_COLUMN_NAME
5501        ,CREATED_BY
5502        ,CREATION_DATE
5503        ,LAST_UPDATED_BY
5504        ,LAST_UPDATE_DATE
5505        ,LAST_UPDATE_LOGIN
5506        ,COLUMN_SEQ_NUM
5507        ,ENABLED_FLAG
5508        ,REQUIRED_FLAG
5509        ,SECURITY_ENABLED_FLAG
5510        ,DISPLAY_FLAG
5511        ,DISPLAY_SIZE
5512        ,MAXIMUM_DESCRIPTION_LEN
5513        ,CONCATENATION_DESCRIPTION_LEN
5514        ,FLEX_VALUE_SET_ID
5515        ,RANGE_CODE
5516        ,DEFAULT_TYPE
5517        ,DEFAULT_VALUE
5518        ,SRW_PARAM
5519        ,RUNTIME_PROPERTY_FUNCTION
5520     )
5521     VALUES
5522     (
5523         p_application_id        --APPLICATION_ID
5524        ,p_attr_group_type       --DESCRIPTIVE_FLEXFIELD_NAME
5525        ,p_attr_group_name       --DESCRIPTIVE_FLEX_CONTEXT_CODE
5526        ,p_column                --APPLICATION_COLUMN_NAME
5527        ,p_internal_name         --END_USER_COLUMN_NAME
5528        ,NVL(p_owner, g_current_user_id) --CREATED_BY
5529        ,p_lud                   --CREATION_DATE
5530        ,NVL(p_owner, g_current_user_id) --LAST_UPDATED_BY
5531        ,p_lud                   --LAST_UPDATE_DATE
5532        ,g_current_login_id      --LAST_UPDATE_LOGIN
5533        ,l_sequence              --COLUMN_SEQ_NUM
5534        ,l_enabled               --ENABLED_FLAG
5535        ,l_required              --REQUIRED_FLAG
5536        ,'N'                     --SECURITY_ENABLED_FLAG
5537        ,l_display               --DISPLAY_FLAG
5538        ,50                      --DISPLAY_SIZE
5539        ,50                      --MAXIMUM_DESCRIPTION_LEN
5540        ,25                      --CONCATENATION_DESCRIPTION_LEN
5541        ,p_value_set_id          --FLEX_VALUE_SET_ID
5542        ,''                      --RANGE_CODE
5543        ,''                      --DEFAULT_TYPE
5544        ,p_default_value         --DEFAULT_VALUE
5545        ,''                      --SRW_PARAM
5546        ,''                      --RUNTIME_PROPERTY_FUNCTION
5547     );
5548     INSERT INTO FND_DESCR_FLEX_COL_USAGE_TL
5549     (
5550         APPLICATION_ID
5551        ,DESCRIPTIVE_FLEXFIELD_NAME
5552        ,DESCRIPTIVE_FLEX_CONTEXT_CODE
5553        ,APPLICATION_COLUMN_NAME
5554        ,LANGUAGE
5555        ,CREATED_BY
5556        ,CREATION_DATE
5557        ,LAST_UPDATED_BY
5558        ,LAST_UPDATE_DATE
5559        ,LAST_UPDATE_LOGIN
5560        ,FORM_LEFT_PROMPT
5561        ,FORM_ABOVE_PROMPT
5562        ,DESCRIPTION
5563        ,SOURCE_LANG
5564     )
5565     SELECT
5566         p_application_id        --APPLICATION_ID
5567        ,p_attr_group_type       --DESCRIPTIVE_FLEXFIELD_NAME
5568        ,p_attr_group_name       --DESCRIPTIVE_FLEX_CONTEXT_CODE
5569        ,p_column                --APPLICATION_COLUMN_NAME
5570        ,L.LANGUAGE_CODE         --LANGUAGE
5571        ,NVL(p_owner, g_current_user_id) --CREATED_BY
5572        ,p_lud                   --CREATION_DATE
5573        ,NVL(p_owner, g_current_user_id) --LAST_UPDATED_BY
5574        ,p_lud                   --LAST_UPDATE_DATE
5575        ,g_current_login_id      --LAST_UPDATE_LOGIN
5576        ,p_display_name          --FORM_LEFT_PROMPT
5577        ,p_display_name          --FORM_ABOVE_PROMPT
5578        ,p_description           --DESCRIPTION
5579        ,USERENV('LANG')         --SOURCE_LANG
5580     FROM FND_LANGUAGES L
5581     WHERE L.INSTALLED_FLAG in ('I', 'B');
5582   END IF ;--  l_fnd_exists = 'Y' --Bug 4703510 END
5583 
5584 
5585   IF (l_ego_exists <> 'Y') THEN --Bug 4703510
5586     INSERT INTO EGO_FND_DF_COL_USGS_EXT
5587     (
5588         ATTR_ID
5589        ,APPLICATION_ID
5590        ,DESCRIPTIVE_FLEXFIELD_NAME
5591        ,DESCRIPTIVE_FLEX_CONTEXT_CODE
5592        ,APPLICATION_COLUMN_NAME
5593        ,DATA_TYPE
5594        ,SEARCH_FLAG
5595        ,UNIQUE_KEY_FLAG
5596        ,INFO_1
5597        ,UOM_CLASS
5598        ,CONTROL_LEVEL
5599        ,ATTRIBUTE_CODE
5600        ,VIEW_IN_HIERARCHY_CODE
5601        ,EDIT_IN_HIERARCHY_CODE
5602        ,CUSTOMIZATION_LEVEL
5603        ,READ_ONLY_FLAG
5604        ,CREATED_BY
5605        ,CREATION_DATE
5606        ,LAST_UPDATED_BY
5607        ,LAST_UPDATE_DATE
5608        ,LAST_UPDATE_LOGIN
5609     )
5610     SELECT
5611         EGO_ATTRS_S.NEXTVAL                                          -- ATTR_ID
5612        ,p_application_id                                      -- APPLICATION_ID
5613        ,p_attr_group_type                         -- DESCRIPTIVE_FLEXFIELD_NAME
5614        ,p_attr_group_name                      -- DESCRIPTIVE_FLEX_CONTEXT_CODE
5615        ,p_column                                     -- APPLICATION_COLUMN_NAME
5616        ,p_data_type                                                -- DATA_TYPE
5617        ,l_searchable                                         -- SEARCHABLE FLAG
5618        ,l_unique_key_flag                                    -- UNIQUE_KEY_FLAG
5619        ,p_info_1                   -- DYNAMIC URL (IF APPLICABLE; USUALLY NULL)
5620        ,p_uom_class                                                -- UOM_CLASS
5621        ,p_control_level                                        -- CONTROL_LEVEL
5622        ,p_attribute_code                                      -- ATTRIBUTE_CODE
5623        ,p_view_in_hierarchy_code                      -- VIEW_IN_HIERARCHY_CODE
5624        ,p_edit_in_hierarchy_code                      -- EDIT_IN_HIERARCHY_CODE
5625        ,p_customization_level                            -- CUSTIMIZATION_LEVEL
5626        ,l_read_only_flag                                         --read_only_flag add by geguo
5627        ,NVL(p_owner, g_current_user_id)                           -- CREATED_BY
5628        ,p_lud                                                  -- CREATION_DATE
5629        ,NVL(p_owner, g_current_user_id)                      -- LAST_UPDATED_BY
5630        ,p_lud                                               -- LAST_UPDATE_DATE
5631        ,g_current_login_id                                 -- LAST_UPDATE_LOGIN
5632     FROM DUAL;
5633 
5634     -- Standard check of p_commit
5635     IF FND_API.To_Boolean(p_commit) THEN
5636       COMMIT WORK;
5637     END IF;
5638     x_return_status := FND_API.G_RET_STS_SUCCESS;
5639   ELSE --l_ego_exists <> 'Y'
5640     IF FND_API.TO_BOOLEAN(p_commit) THEN
5641       ROLLBACK TO Create_Attribute_PUB;
5642     END IF;
5643 
5644       x_return_status := FND_API.G_RET_STS_ERROR;
5645       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_INTERNAL_NAME_UNIQUE');
5646       FND_MSG_PUB.Add;
5647       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5648                                ,p_count   => x_msg_count
5649                                ,p_data    => x_msg_data);
5650 
5651   END IF;--l_ego_exists <> 'Y'--Bug 4703510
5652   EXCEPTION
5653     --Bug 5443697
5654    WHEN e_attr_starts_with_num THEN
5655     IF FND_API.TO_BOOLEAN(p_commit) THEN
5656       ROLLBACK TO Create_Attribute_PUB;
5657     END IF;
5658 
5659       x_return_status := FND_API.G_RET_STS_ERROR;
5660       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_NAME_ST_NUM');
5661       FND_MSG_PUB.Add;
5662       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5663                                ,p_count   => x_msg_count
5664                                ,p_data    => x_msg_data);
5665 
5666    WHEN e_attr_starts_with_und_sc THEN
5667     IF FND_API.TO_BOOLEAN(p_commit) THEN
5668       ROLLBACK TO Create_Attribute_PUB;
5669     END IF;
5670 
5671       x_return_status := FND_API.G_RET_STS_ERROR;
5672       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_NAME_ST_UND_SC');
5673       FND_MSG_PUB.Add;
5674       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5675                                ,p_count   => x_msg_count
5676                                ,p_data    => x_msg_data);
5677 
5678    WHEN e_col_internal_name_error THEN
5679     IF FND_API.TO_BOOLEAN(p_commit) THEN
5680       ROLLBACK TO Create_Attribute_PUB;
5681     END IF;
5682 
5683       x_return_status := FND_API.G_RET_STS_ERROR;
5684       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_INTRNL_NAME_ERR');
5685       FND_MSG_PUB.Add;
5686       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5687                                ,p_count   => x_msg_count
5688                                ,p_data    => x_msg_data);
5689 
5690     WHEN e_default_value_len_err THEN
5691     IF FND_API.TO_BOOLEAN(p_commit) THEN
5692       ROLLBACK TO Create_Attribute_PUB;
5693     END IF;
5694 
5695       x_return_status := FND_API.G_RET_STS_ERROR;
5696       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_DEFAULT_VAL_LEN_ERR');
5697       FND_MESSAGE.Set_Token('ATTR_MAX_LENGTH', l_col_width);
5698       FND_MSG_PUB.Add;
5699       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5700                                ,p_count   => x_msg_count
5701                                ,p_data    => x_msg_data);
5702 
5703     WHEN e_attr_dup_seq_error THEN
5704     IF FND_API.TO_BOOLEAN(p_commit) THEN
5705       ROLLBACK TO Create_Attribute_PUB;
5706     END IF;
5707 
5708       x_return_status := FND_API.G_RET_STS_ERROR;
5709       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ATTR_DUP_SEQ_ERR');
5710       FND_MSG_PUB.Add;
5711       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5712                                ,p_count   => x_msg_count
5713                                ,p_data    => x_msg_data);
5714 
5715 
5716     WHEN e_first_attr_cbox THEN
5717     IF FND_API.TO_BOOLEAN(p_commit) THEN
5718       ROLLBACK TO Create_Attribute_PUB;
5719     END IF;
5720 
5721       x_return_status := FND_API.G_RET_STS_ERROR;
5722       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_MR_FIRST_ATTR_CBOX_ERR');
5723       FND_MSG_PUB.Add;
5724       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5725                                ,p_count   => x_msg_count
5726                                ,p_data    => x_msg_data);
5727 
5728 
5729 
5730     WHEN e_col_data_type_error THEN
5731     IF FND_API.TO_BOOLEAN(p_commit) THEN
5732       ROLLBACK TO Create_Attribute_PUB;
5733     END IF;
5734 
5735       x_return_status := FND_API.G_RET_STS_ERROR;
5736       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ATTR_COL_DT_ERR');
5737       FND_MSG_PUB.Add;
5738       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5739                                ,p_count   => x_msg_count
5740                                ,p_data    => x_msg_data);
5741 
5742     WHEN e_uom_not_allowed THEN
5743     IF FND_API.TO_BOOLEAN(p_commit) THEN
5744       ROLLBACK TO Create_Attribute_PUB;
5745     END IF;
5746 
5747       x_return_status :=  FND_API.G_RET_STS_ERROR;
5748       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_UOM_COL_ERR');
5749       FND_MSG_PUB.Add;
5750       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5751                                ,p_count   => x_msg_count
5752                                ,p_data    => x_msg_data);
5753 
5754     WHEN e_vs_data_type_error THEN
5755     IF FND_API.TO_BOOLEAN(p_commit) THEN
5756       ROLLBACK TO Create_Attribute_PUB;
5757     END IF;
5758       x_return_status := FND_API.G_RET_STS_ERROR;
5759       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ATTR_VS_DT_ERR');
5760       FND_MSG_PUB.Add;
5761       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5762                                ,p_count   => x_msg_count
5763                                ,p_data    => x_msg_data);
5764 
5765     WHEN e_no_vs_for_id_error THEN
5766     IF FND_API.TO_BOOLEAN(p_commit) THEN
5767       ROLLBACK TO Create_Attribute_PUB;
5768     END IF;
5769 
5770       x_return_status := FND_API.G_RET_STS_ERROR;
5771       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ATTR_NO_VS_ERR');
5772       FND_MSG_PUB.Add;
5773       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5774                                ,p_count   => x_msg_count
5775                                ,p_data    => x_msg_data);
5776 
5777     WHEN e_bad_info_1_error THEN
5778     IF FND_API.TO_BOOLEAN(p_commit) THEN
5779       ROLLBACK TO Create_Attribute_PUB;
5780     END IF;
5781 
5782       DECLARE
5783         l_attr_group_disp_name  FND_DESCR_FLEX_CONTEXTS_TL.DESCRIPTIVE_FLEX_CONTEXT_NAME%TYPE;
5784       BEGIN
5785         SELECT DESCRIPTIVE_FLEX_CONTEXT_NAME
5786           INTO l_attr_group_disp_name
5787           FROM FND_DESCR_FLEX_CONTEXTS_TL
5788          WHERE APPLICATION_ID = p_application_id
5789            AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5790            AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5791            AND LANGUAGE = USERENV('LANG');
5792 
5793         x_return_status := FND_API.G_RET_STS_ERROR;
5794         FND_MESSAGE.Set_Name('EGO', 'EGO_EF_DYNAMIC_URL_DATA_ERROR');
5795         FND_MESSAGE.Set_Token('ATTR_GROUP_DISP_NAME', l_attr_group_disp_name);
5796         FND_MSG_PUB.Add;
5797         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5798                                  ,p_count   => x_msg_count
5799                                  ,p_data    => x_msg_data);
5800       EXCEPTION
5801         WHEN NO_DATA_FOUND THEN
5802           x_return_status := FND_API.G_RET_STS_ERROR;
5803           FND_MESSAGE.Set_Name('EGO', 'EGO_EF_DYNAMIC_URL_DATA_ERROR');
5804           FND_MESSAGE.Set_Token('ATTR_GROUP_DISP_NAME', null);
5805           FND_MSG_PUB.Add;
5806           FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5807                                    ,p_count   => x_msg_count
5808                                    ,p_data    => x_msg_data);
5809       END;
5810 
5811     WHEN OTHERS THEN
5812     IF FND_API.TO_BOOLEAN(p_commit) THEN
5813       ROLLBACK TO Create_Attribute_PUB;
5814     END IF;
5815       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5816       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
5817       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
5818       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
5819       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
5820       FND_MSG_PUB.Add;
5821       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
5822                                ,p_count   => x_msg_count
5823                                ,p_data    => x_msg_data);
5824 
5825 END Create_Attribute;
5826 
5827 ----------------------------------------------------------------------
5828 
5829 PROCEDURE Update_Attribute (
5830         p_api_version                   IN   NUMBER
5831        ,p_application_id                IN   NUMBER
5832        ,p_attr_group_type               IN   VARCHAR2
5833        ,p_attr_group_name               IN   VARCHAR2
5834        ,p_internal_name                 IN   VARCHAR2
5835        ,p_display_name                  IN   VARCHAR2
5836        ,p_description                   IN   VARCHAR2
5837        ,p_sequence                      IN   NUMBER
5838        ,p_required                      IN   VARCHAR2
5839        ,p_searchable                    IN   VARCHAR2
5840        ,p_column                        IN   VARCHAR2
5841        ,p_value_set_id                  IN   NUMBER     DEFAULT G_MISS_NUM
5842        ,p_info_1                        IN   VARCHAR2   DEFAULT NULL
5843        ,p_default_value                 IN   VARCHAR2
5844        ,p_unique_key_flag               IN   VARCHAR2   DEFAULT NULL
5845        ,p_enabled                       IN   VARCHAR2
5846        ,p_display                       IN   VARCHAR2
5847        ,p_control_level                 IN   NUMBER     DEFAULT -1
5848        ,p_attribute_code                IN   VARCHAR2   DEFAULT G_MISS_CHAR
5849        ,p_view_in_hierarchy_code        IN   VARCHAR2   DEFAULT G_MISS_CHAR
5850        ,p_edit_in_hierarchy_code        IN   VARCHAR2   DEFAULT G_MISS_CHAR
5851        ,p_customization_level           IN   VARCHAR2   DEFAULT G_MISS_CHAR
5852        ,p_owner                         IN   NUMBER     DEFAULT NULL
5853        ,p_lud                           IN   DATE       DEFAULT SYSDATE
5854        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
5855        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
5856        ,p_is_nls_mode                   IN   VARCHAR2   DEFAULT FND_API.G_FALSE
5857        ,p_uom_class                     IN   VARCHAR2   DEFAULT G_MISS_CHAR
5858        ,x_return_status                 OUT NOCOPY VARCHAR2
5859        ,x_errorcode                     OUT NOCOPY NUMBER
5860        ,x_msg_count                     OUT NOCOPY NUMBER
5861        ,x_msg_data                      OUT NOCOPY VARCHAR2
5862 ) IS
5863 BEGIN
5864   Update_Attribute (
5865           p_api_version
5866          ,p_application_id
5867          ,p_attr_group_type
5868          ,p_attr_group_name
5869          ,p_internal_name
5870          ,p_display_name
5871          ,p_description
5872          ,p_sequence
5873          ,p_required
5874          ,p_searchable
5875          ,NULL
5876          ,p_column
5877          ,p_value_set_id
5878          ,p_info_1
5879          ,p_default_value
5880          ,p_unique_key_flag
5881          ,p_enabled
5882          ,p_display
5883          ,p_control_level
5884          ,p_attribute_code
5885          ,p_view_in_hierarchy_code
5886          ,p_edit_in_hierarchy_code
5887          ,p_customization_level
5888          ,p_owner
5889          ,p_lud
5890          ,p_init_msg_list
5891          ,p_commit
5892          ,p_is_nls_mode
5893          ,p_uom_class
5894          ,x_return_status
5895          ,x_errorcode
5896          ,x_msg_count
5897          ,x_msg_data
5898   );
5899 END;
5900 PROCEDURE Update_Attribute (
5901         p_api_version                   IN   NUMBER
5902        ,p_application_id                IN   NUMBER
5903        ,p_attr_group_type               IN   VARCHAR2
5904        ,p_attr_group_name               IN   VARCHAR2
5905        ,p_internal_name                 IN   VARCHAR2
5906        ,p_display_name                  IN   VARCHAR2
5907        ,p_description                   IN   VARCHAR2
5908        ,p_sequence                      IN   NUMBER
5909        ,p_required                      IN   VARCHAR2
5910        ,p_searchable                    IN   VARCHAR2
5911        ,p_read_only_flag                 IN   VARCHAR2   --DEFAULT 'N' add by geguo
5912        ,p_column                        IN   VARCHAR2
5913        ,p_value_set_id                  IN   NUMBER     DEFAULT G_MISS_NUM
5914        ,p_info_1                        IN   VARCHAR2   DEFAULT NULL
5915        ,p_default_value                 IN   VARCHAR2
5916        ,p_unique_key_flag               IN   VARCHAR2   DEFAULT NULL
5917        ,p_enabled                       IN   VARCHAR2
5918        ,p_display                       IN   VARCHAR2
5919        ,p_control_level                 IN   NUMBER     DEFAULT -1
5920        ,p_attribute_code                IN   VARCHAR2   DEFAULT G_MISS_CHAR
5921        ,p_view_in_hierarchy_code        IN   VARCHAR2   DEFAULT G_MISS_CHAR
5922        ,p_edit_in_hierarchy_code        IN   VARCHAR2   DEFAULT G_MISS_CHAR
5923        ,p_customization_level           IN   VARCHAR2   DEFAULT G_MISS_CHAR
5924        ,p_owner                         IN   NUMBER     DEFAULT NULL
5925        ,p_lud                           IN   DATE       DEFAULT SYSDATE
5926        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
5927        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
5928        ,p_is_nls_mode                   IN   VARCHAR2   DEFAULT FND_API.G_FALSE
5929        ,p_uom_class                     IN   VARCHAR2   DEFAULT G_MISS_CHAR
5930        ,x_return_status                 OUT NOCOPY VARCHAR2
5931        ,x_errorcode                     OUT NOCOPY NUMBER
5932        ,x_msg_count                     OUT NOCOPY NUMBER
5933        ,x_msg_data                      OUT NOCOPY VARCHAR2
5934 ) IS
5935 
5936     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Attribute';
5937 
5938     --we don't use l_api_version yet, but eventually we might:
5939     --if we change required parameters, version goes from n.x to (n+1).x
5940     --if we change optional parameters, version goes from x.n to x.(n+1)
5941     l_api_version            CONSTANT NUMBER := 1.0;
5942 
5943     l_sequence               NUMBER;
5944     l_min_seq           NUMBER;
5945     l_was_searchable         EGO_FND_DF_COL_USGS_EXT.search_flag%TYPE;
5946     l_view_in_hierarchy_code EGO_FND_DF_COL_USGS_EXT.view_in_hierarchy_code%TYPE;
5947     l_edit_in_hierarchy_code EGO_FND_DF_COL_USGS_EXT.edit_in_hierarchy_code%TYPE;
5948     l_customization_level    EGO_FND_DF_COL_USGS_EXT.customization_level%TYPE;
5949     l_attribute_code         EGO_FND_DF_COL_USGS_EXT.attribute_code%TYPE;
5950     l_uom_class              EGO_FND_DF_COL_USGS_EXT.uom_class%TYPE;
5951     l_value_set_id           FND_DESCR_FLEX_COLUMN_USAGES.flex_value_set_id%TYPE;
5952     l_is_column_indexed      VARCHAR2(1);
5953     l_is_chg_column_indexed  VARCHAR2(1);
5954     l_table_name             VARCHAR2(100);
5955     l_chg_table_name         VARCHAR2(30);
5956     l_data_type_is_trans_text BOOLEAN;
5957     l_valid_uom_column       VARCHAR2(300);
5958     l_col_width              NUMBER;
5959     l_data_type_code         VARCHAR2(2);
5960     l_multi_row_flag         VARCHAR2(2);
5961     l_read_only_flag          VARCHAR2(1);
5962 
5963     e_attr_dup_seq_error     EXCEPTION;
5964     e_first_attr_cbox        EXCEPTION;
5965     e_uom_not_allowed        EXCEPTION;
5966     e_default_value_len_err  EXCEPTION;
5967 
5968 
5969   BEGIN
5970     -- Standard start of API savepoint
5971     IF FND_API.To_Boolean(p_commit) THEN
5972       SAVEPOINT Update_Attribute_PUB;
5973     END IF;
5974 
5975     -- Check for call compatibility
5976     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
5977                                         l_api_name, G_PKG_NAME)
5978     THEN
5979       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5980     END IF;
5981     -- Initialize message list even though we don't currently use it
5982     IF FND_API.To_Boolean(p_init_msg_list) THEN
5983       FND_MSG_PUB.Initialize;
5984     END IF;
5985 
5986     -----------------------------------
5987     -- get the attribute details -- ego specific
5988     -----------------------------------
5989     BEGIN
5990       SELECT SEARCH_FLAG, view_in_hierarchy_code, edit_in_hierarchy_code,
5991              customization_level, attribute_code, uom_class, read_only_flag
5992         INTO l_was_searchable, l_view_in_hierarchy_code, l_edit_in_hierarchy_code,
5993              l_customization_level, l_attribute_code, l_uom_class, l_read_only_flag
5994         FROM EGO_FND_DF_COL_USGS_EXT
5995        WHERE APPLICATION_ID = p_application_id
5996          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
5997          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
5998          AND APPLICATION_COLUMN_NAME = p_column;
5999     EXCEPTION
6000       WHEN OTHERS THEN
6001         l_was_searchable := NULL;
6002         l_view_in_hierarchy_code := NULL;
6003         l_edit_in_hierarchy_code := NULL;
6004         l_customization_level := NULL;
6005         l_attribute_code := NULL;
6006         l_uom_class := NULL;
6007         l_read_only_flag := NULL; --add by geguo
6008     END;
6009 
6010     IF (p_view_in_hierarchy_code IS NULL OR
6011         p_view_in_hierarchy_code <> G_MISS_CHAR) THEN
6012       l_view_in_hierarchy_code := p_view_in_hierarchy_code;
6013     END IF;
6014     IF (p_edit_in_hierarchy_code IS NULL OR
6015         p_edit_in_hierarchy_code <> G_MISS_CHAR) THEN
6016       l_edit_in_hierarchy_code := p_edit_in_hierarchy_code;
6017     END IF;
6018     IF (p_customization_level IS NULL OR
6019         p_customization_level <> G_MISS_CHAR) THEN
6020       l_customization_level := p_customization_level;
6021     END IF;
6022     IF (p_attribute_code IS NULL OR
6023         p_attribute_code <> G_MISS_CHAR) THEN
6024       l_attribute_code := p_attribute_code;
6025     END IF;
6026     IF (p_uom_class IS NULL OR
6027         p_uom_class <> G_MISS_CHAR) THEN
6028       l_uom_class := p_uom_class;
6029     END IF;
6030     --add by geguo
6031     IF (p_read_only_flag IS NULL OR
6032         p_read_only_flag <> G_MISS_CHAR) THEN
6033       l_read_only_flag := p_read_only_flag;
6034     END IF;
6035     -----------------------------------
6036     -- get the attribute details -- fnd specific
6037     -----------------------------------
6038     BEGIN
6039       SELECT flex_value_set_id
6040       INTO l_value_set_id
6041       FROM FND_DESCR_FLEX_COLUMN_USAGES
6042       WHERE APPLICATION_ID = p_application_id
6043         AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6044         AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
6045         AND END_USER_COLUMN_NAME = p_internal_name;
6046     EXCEPTION
6047       WHEN OTHERS THEN
6048         l_value_set_id := NULL;
6049     END;
6050 
6051     IF (p_value_set_id IS NULL OR
6052         p_value_set_id <> G_MISS_NUM) THEN
6053       l_value_set_id := p_value_set_id;
6054     END IF;
6055 
6056     IF (FND_API.To_Boolean(p_is_nls_mode)) THEN
6057 
6058       -- We do this IF check this way so that if p_is_nls_mode is NULL,
6059       -- we still update the non-trans tables (i.e., we treat NULL as 'F')
6060       NULL;
6061 
6062     ELSE
6063 
6064       -- We only update this information if we are NOT in NLS mode
6065       -- (i.e., we don't update it if we are in NLS mode)
6066 
6067       -- Make sure updated sequence does not already exist
6068       SELECT COLUMN_SEQ_NUM
6069         INTO l_sequence
6070         FROM FND_DESCR_FLEX_COLUMN_USAGES
6071        WHERE APPLICATION_ID = p_application_id
6072          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6073          AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
6074          AND END_USER_COLUMN_NAME = p_internal_name;
6075 
6076       IF (l_sequence <> NVL(p_sequence, l_sequence)) THEN
6077         -- If the sequence is being updated to a NEW non-null value,
6078         -- check for uniqueness
6079 
6080         SELECT COUNT(*)
6081           INTO l_sequence
6082           FROM FND_DESCR_FLEX_COLUMN_USAGES
6083          WHERE APPLICATION_ID = p_application_id
6084            AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6085            AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name
6086            AND COLUMN_SEQ_NUM = p_sequence;
6087 
6088         IF (l_sequence > 0) THEN
6089           RAISE e_attr_dup_seq_error;
6090         ELSE
6091           l_sequence := p_sequence;
6092         END IF;
6093 
6094       END IF;
6095 
6096       IF (p_display = EGO_EXT_FWK_PUB.G_CHECKBOX_DISP_TYPE
6097           OR p_display =EGO_EXT_FWK_PUB.G_RADIO_DISP_TYPE ) THEN --bugFix:5292226
6098 
6099         SELECT MULTI_ROW
6100           INTO l_multi_row_flag
6101           FROM EGO_FND_DSC_FLX_CTX_EXT
6102          WHERE APPLICATION_ID = p_application_id
6103            AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6104            AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name;
6105 
6106         IF (l_multi_row_flag = 'Y') THEN
6107 
6108           SELECT MIN(COLUMN_SEQ_NUM)
6109             INTO l_min_seq
6110             FROM FND_DESCR_FLEX_COLUMN_USAGES
6111            WHERE APPLICATION_ID = p_application_id
6112              AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6113              AND DESCRIPTIVE_FLEX_CONTEXT_Code = p_attr_group_name;
6114 
6115           IF (p_sequence <= l_min_seq) THEN
6116             RAISE e_first_attr_cbox;
6117           END IF;
6118 
6119         END IF;
6120 
6121       END IF;
6122 
6123       -----------------------------------------------------------
6124       -- Moved out of the searchable block               --
6125       -- as we need table name for UOM column check also --
6126       -----------------------------------------------------------
6127       --added for BUGFIX:4547918
6128       SELECT DATA_TYPE
6129         INTO l_data_type_code
6130         FROM EGO_FND_DF_COL_USGS_EXT
6131        WHERE APPLICATION_ID = p_application_id
6132          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6133          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
6134          AND APPLICATION_COLUMN_NAME = p_column;
6135 
6136       IF (l_data_type_code = 'A' ) THEN
6137         l_data_type_is_trans_text := TRUE;
6138       ELSE
6139         l_data_type_is_trans_text := FALSE;
6140       END IF;
6141 
6142 --      l_data_type_is_trans_text := (SUBSTR(p_column,1,11) = 'TL_EXT_ATTR');
6143       -- end BUGFIX:4547918
6144 
6145       IF (l_data_type_is_trans_text) THEN
6146         l_table_name := Get_TL_Table_Name(p_application_id
6147                                          ,p_attr_group_type);
6148       l_chg_table_name:=Get_Attr_Changes_TL_Table(p_application_id => p_application_id
6149                                        ,p_attr_group_type => p_attr_group_type);--for the pending table
6150 
6151       ELSE
6152         l_table_name := Get_Table_Name(p_application_id
6153                                       ,p_attr_group_type);
6154       l_chg_table_name:=Get_Attr_Changes_B_Table(p_application_id => p_application_id
6155                                        ,p_attr_group_type => p_attr_group_type);--for the pending table
6156 
6157       END IF;
6158 
6159       -----------------------------------------------------------
6160       -- If the Attribute is being made searchable and there's --
6161       -- not already an index on this column, we create one    --
6162       -----------------------------------------------------------
6163 
6164       IF (p_searchable = 'Y') THEN
6165 
6166 --        l_data_type_is_trans_text := (SUBSTR(p_column,1,11) = 'TL_EXT_ATTR');
6167 /***
6168 TO DO: right now we aren't using FND_COLUMNS's TRANSLATE_FLAG column, but we
6169        should be, and we should use that flag to determine if the Attr is TransText
6170        ...or else we should see which table this column's in, but that's an
6171        expensive query, I'd guess
6172 ***/
6173 
6174         IF (l_was_searchable IS NULL OR
6175             l_was_searchable <> p_searchable) THEN
6176 
6177           l_is_column_indexed := Is_Column_Indexed(
6178                                    p_column_name     => p_column
6179                                   ,p_table_name      => l_table_name
6180                                   ,p_application_id  => p_application_id
6181                                   ,p_attr_group_type => p_attr_group_type
6182                                  );
6183 
6184 --for checking whether the column in Pending table is indexed.
6185         l_is_chg_column_indexed := Is_Column_Indexed(p_column_name     => p_column
6186                                                 ,p_table_name      => l_chg_table_name
6187                                                 ,p_application_id  => p_application_id
6188                                                 ,p_attr_group_type => p_attr_group_type);
6189 
6190           END IF;
6191           IF ((l_is_column_indexed <> 'Y') OR (l_is_chg_column_indexed <> 'Y'))  THEN
6192 
6193         l_is_column_indexed :=Create_Index_For_DBCol(p_application_id => p_application_id
6194                                                      ,p_attr_group_type => p_attr_group_type
6195                                                      ,p_attr_group_name => p_attr_group_name
6196                                                      ,p_table_name => l_table_name
6197                                                      ,p_chg_table_name => l_chg_table_name
6198                                                      ,p_is_column_indexed => l_is_column_indexed
6199                                                      ,p_is_chg_column_indexed => l_is_chg_column_indexed
6200                                                      ,p_column => p_column
6201                                                      ,p_is_table_translatable =>l_data_type_is_trans_text);
6202           END IF;--IF((l_is_column_indexed <> 'Y') OR (l_is_chg_column_indexed <> 'Y'))
6203      END IF;
6204 
6205   -----------------------------------------------------------------------------------
6206     -- If the UOM Class is not null we need to make sure that we have             --
6207     -- a corresponding database column in user workbench                          --
6208     -- to store the UOM Code                                                      --
6209     -- bug 3875730                                                                --
6210  -----------------------------------------------------------------------------------
6211 
6212      IF(p_uom_class IS NOT  NULL) THEN
6213         l_valid_uom_column := check_Uom_Column_Exists(p_column , l_table_name );
6214 
6215         IF l_valid_uom_column IS NULL THEN
6216           RAISE e_uom_not_allowed;
6217         ELSIF l_valid_uom_column <> '1' THEN
6218 
6219           l_valid_uom_column := check_Uom_Col_In_Use ( p_application_id
6220                                                       ,p_attr_group_type
6221                                                       ,p_attr_group_name
6222                                                       ,p_internal_name
6223                                                       ,l_valid_uom_column
6224                                                      );
6225 
6226           IF l_valid_uom_column IS NOT NULL THEN
6227             RAISE e_uom_not_allowed;
6228           END IF ;
6229 
6230         END IF ;
6231 
6232       END IF ;
6233 
6234       SELECT WIDTH
6235         INTO l_col_width
6236         FROM FND_COLUMNS
6237        WHERE COLUMN_NAME = p_column
6238          AND TABLE_ID = (SELECT TABLE_ID
6239                            FROM FND_TABLES
6240                           WHERE TABLE_NAME = l_table_name);
6241 
6242       IF ( ((SUBSTR(p_column,1,11) = 'TL_EXT_ATTR') OR
6243             (SUBSTR(p_column,1,10) = 'C_EXT_ATTR')) AND
6244             LENGTH(p_default_value) >  l_col_width )THEN
6245         RAISE e_default_value_len_err;
6246 
6247       END IF;
6248 
6249 
6250       UPDATE FND_DESCR_FLEX_COLUMN_USAGES
6251          SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
6252              LAST_UPDATE_DATE = p_lud,
6253              LAST_UPDATE_LOGIN = g_current_login_id,
6254              COLUMN_SEQ_NUM = NVL(l_sequence, COLUMN_SEQ_NUM),
6255              ENABLED_FLAG = NVL(p_enabled, ENABLED_FLAG),
6256              REQUIRED_FLAG = NVL(p_required, REQUIRED_FLAG),
6257              DISPLAY_FLAG = NVL(p_display, DISPLAY_FLAG),
6258              FLEX_VALUE_SET_ID = l_value_set_id,
6259              DEFAULT_VALUE = p_default_value
6260        WHERE APPLICATION_ID =  p_application_id
6261          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6262          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
6263          AND APPLICATION_COLUMN_NAME = p_column;
6264 
6265       UPDATE EGO_FND_DF_COL_USGS_EXT
6266          SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
6267              LAST_UPDATE_DATE = p_lud,
6268              LAST_UPDATE_LOGIN = g_current_login_id,
6269              INFO_1 = p_info_1,
6270              SEARCH_FLAG = NVL(p_searchable, SEARCH_FLAG),
6271              CONTROL_LEVEL = decode(p_control_level, -1, CONTROL_LEVEL, p_control_level),
6272              ATTRIBUTE_CODE = l_attribute_code,
6273              VIEW_IN_HIERARCHY_CODE = l_view_in_hierarchy_code, -- update or keep the same by default?
6274              EDIT_IN_HIERARCHY_CODE = l_edit_in_hierarchy_code, -- update or keep the same by default?
6275              UOM_CLASS = l_uom_class -- Bug: 3525490
6276             ,CUSTOMIZATION_LEVEL = l_customization_level
6277             ,UNIQUE_KEY_FLAG = NVL(p_unique_key_flag, UNIQUE_KEY_FLAG)--to update the unique key in case of multi row attrgrp.
6278             ,READ_ONLY_FLAG = NVL(l_read_only_flag, 'N')
6279        WHERE APPLICATION_ID = p_application_id
6280          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6281          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
6282          AND APPLICATION_COLUMN_NAME = p_column;
6283 
6284     END IF;
6285 
6286     -- We update the TL information whether or not we're in NLS mode
6287     UPDATE FND_DESCR_FLEX_COL_USAGE_TL
6288        SET LAST_UPDATED_BY = NVL(p_owner, g_current_user_id),
6289            LAST_UPDATE_DATE = p_lud,
6290            LAST_UPDATE_LOGIN = g_current_login_id,
6291            FORM_LEFT_PROMPT = p_display_name,
6292            FORM_ABOVE_PROMPT = p_display_name,
6293            DESCRIPTION = p_description,
6294            SOURCE_LANG = USERENV('LANG')
6295      WHERE APPLICATION_ID = p_application_id
6296        AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6297        AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
6298        AND APPLICATION_COLUMN_NAME = p_column
6299        --AND LANGUAGE = USERENV('LANG');
6300       AND USERENV('LANG') in (LANGUAGE , SOURCE_LANG);
6301 
6302     -- Standard check of p_commit
6303     IF FND_API.To_Boolean(p_commit) THEN
6304       COMMIT WORK;
6305     END IF;
6306 
6307     x_return_status := FND_API.G_RET_STS_SUCCESS;
6308 
6309   EXCEPTION
6310 
6311     WHEN e_default_value_len_err THEN
6312       IF FND_API.To_Boolean(p_commit) THEN
6313         ROLLBACK TO Update_Attribute_PUB;
6314       END IF;
6315       x_return_status := FND_API.G_RET_STS_ERROR;
6316       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_DEFAULT_VAL_LEN_ERR');
6317       FND_MESSAGE.Set_Token('ATTR_MAX_LENGTH', l_col_width);
6318       FND_MSG_PUB.Add;
6319       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6320                                ,p_count   => x_msg_count
6321                                ,p_data    => x_msg_data);
6322 
6323     WHEN e_attr_dup_seq_error THEN
6324       IF FND_API.To_Boolean(p_commit) THEN
6325         ROLLBACK TO Update_Attribute_PUB;
6326       END IF;
6327       x_return_status := FND_API.G_RET_STS_ERROR;
6328       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_UP_ATTR_DUP_SEQ_ERR');
6329       FND_MSG_PUB.Add;
6330       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6331                                ,p_count   => x_msg_count
6332                                ,p_data    => x_msg_data);
6333     WHEN e_uom_not_allowed THEN
6334       IF FND_API.TO_BOOLEAN(p_commit) THEN
6335         ROLLBACK TO Update_Attribute_PUB;
6336       END IF;
6337       x_return_status :=  FND_API.G_RET_STS_ERROR;
6338       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_ATTR_UOM_COL_ERR');
6339       FND_MSG_PUB.Add;
6340       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6341                                 ,p_count   => x_msg_count
6342                                 ,p_data    => x_msg_data);
6343 
6344 
6345     WHEN e_first_attr_cbox THEN--bugFix:5292226
6346       IF FND_API.To_Boolean(p_commit) THEN
6347         ROLLBACK TO Update_Attribute_PUB;
6348       END IF;
6349       x_return_status :=  FND_API.G_RET_STS_ERROR;
6350       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_MR_FIRST_ATTR_CBOX_ERR');
6351       FND_MSG_PUB.Add;
6352       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6353                                 ,p_count   => x_msg_count
6354                                 ,p_data    => x_msg_data);
6355 
6356     WHEN OTHERS THEN
6357       IF FND_API.To_Boolean(p_commit) THEN
6358         ROLLBACK TO Update_Attribute_PUB;
6359       END IF;
6360       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6361 
6362       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
6363       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
6364       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
6365       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
6366       FND_MSG_PUB.Add;
6367       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
6368                                ,p_count   => x_msg_count
6369                                ,p_data    => x_msg_data);
6370 
6371 END Update_Attribute;
6372 
6373 ----------------------------------------------------------------------
6374 
6375 PROCEDURE Delete_Attribute (
6376         p_api_version                   IN   NUMBER
6377        ,p_application_id                IN   NUMBER
6378        ,p_attr_group_type               IN   VARCHAR2
6379        ,p_attr_group_name               IN   VARCHAR2
6380        ,p_attr_name                     IN   VARCHAR2
6381        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
6382        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
6383        ,x_return_status                 OUT NOCOPY VARCHAR2
6384        ,x_errorcode                     OUT NOCOPY NUMBER
6385        ,x_msg_count                     OUT NOCOPY NUMBER
6386        ,x_msg_data                      OUT NOCOPY VARCHAR2
6387 ) IS
6388 
6389     l_api_name               CONSTANT VARCHAR2(30)  := 'Delete_Attribute';
6390 
6391     --we don't use l_api_version yet, but eventually we might:
6392     --if we change required parameters, version goes from n.x to (n+1).x
6393     --if we change optional parameters, version goes from x.n to x.(n+1)
6394     l_api_version            CONSTANT NUMBER := 1.0;
6395 
6396     l_assocs_exist           BOOLEAN;
6397     l_token_table            ERROR_HANDLER.Token_Tbl_Type;
6398 
6399   BEGIN
6400 
6401     -- Check for call compatibility
6402     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
6403                                         l_api_name, G_PKG_NAME)
6404     THEN
6405       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6406     END IF;
6407     -- Initialize message list even though we don't currently use it
6408     IF FND_API.To_Boolean(p_init_msg_list) THEN
6409       FND_MSG_PUB.Initialize;
6410     END IF;
6411 
6412     l_assocs_exist := Check_Associations_Exist(p_application_id,
6413                                                p_attr_group_type,
6414                                                p_attr_group_name);
6415 
6416     IF (l_assocs_exist) THEN
6417 
6418       x_return_status := FND_API.G_RET_STS_ERROR;
6419 
6420       -- We need to select the translatable tokens for our error message --
6421       l_token_table(1).TOKEN_NAME := 'ATTR_DISP_NAME';
6422       SELECT TL.FORM_LEFT_PROMPT
6423         INTO l_token_table(1).TOKEN_VALUE
6424         FROM FND_DESCR_FLEX_COL_USAGE_TL  TL
6425             ,FND_DESCR_FLEX_COLUMN_USAGES FL_COL
6426        WHERE FL_COL.APPLICATION_ID = p_application_id
6427          AND FL_COL.DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6428          AND FL_COL.DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
6429          AND FL_COL.END_USER_COLUMN_NAME = p_attr_name
6430          AND FL_COL.APPLICATION_ID = TL.APPLICATION_ID
6431          AND FL_COL.DESCRIPTIVE_FLEXFIELD_NAME = TL.DESCRIPTIVE_FLEXFIELD_NAME
6432          AND FL_COL.DESCRIPTIVE_FLEX_CONTEXT_CODE = TL.DESCRIPTIVE_FLEX_CONTEXT_CODE
6433          AND FL_COL.APPLICATION_COLUMN_NAME = TL.APPLICATION_COLUMN_NAME
6434          AND TL.LANGUAGE = USERENV('LANG');
6435 
6436       l_token_table(2).TOKEN_NAME := 'ATTR_GRP_NAME';
6437       SELECT DESCRIPTIVE_FLEX_CONTEXT_NAME
6438         INTO l_token_table(2).TOKEN_VALUE
6439         FROM FND_DESCR_FLEX_CONTEXTS_TL
6440        WHERE APPLICATION_ID = p_application_id
6441          AND DESCRIPTIVE_FLEXFIELD_NAME = p_attr_group_type
6442          AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_attr_group_name
6443          AND LANGUAGE = USERENV('LANG');
6444 
6445       ERROR_HANDLER.Add_Error_Message(
6446         p_message_name                  => 'EGO_EF_ASSOCS_EXIST2'
6447        ,p_application_id                => 'EGO'
6448        ,p_token_tbl                     => l_token_table
6449        ,p_message_type                  => FND_API.G_RET_STS_ERROR
6450        ,p_addto_fnd_stack               => G_ADD_ERRORS_TO_FND_STACK
6451       );
6452 
6453       x_msg_count := 1;
6454       ERROR_HANDLER.Get_Message(x_message_text => x_msg_data
6455                                ,x_entity_index => G_DUMMY_ENTITY_INDEX
6456                                ,x_entity_id    => G_DUMMY_ENTITY_ID
6457                                ,x_message_type => G_DUMMY_MESSAGE_TYPE);
6458 
6459     ELSE
6460 
6461       Delete_Attribute_Internal(p_application_id, p_attr_group_type, p_attr_group_name,
6462                                 p_attr_name, p_commit, x_return_status,
6463                                 x_errorcode, x_msg_count, x_msg_data);
6464 
6465     END IF;
6466 END Delete_Attribute;
6467 
6468 ----------------------------------------------------------------------
6469 
6470                        --------------------
6471                        -- Value Set APIs --
6472                        --------------------
6473 
6474 ----------------------------------------------------------------------
6475  /* Changes for PIM for TElco Feature */
6476 
6477 /*procedure to get the effective version number of value set based on passed dates*/
6478 PROCEDURE get_version_number(
6479              p_api_version          IN NUMBER
6480             ,p_value_set_id         IN NUMBER
6481             ,p_start_effective_date IN TIMESTAMP
6482             ,p_creation_date        IN TIMESTAMP
6483             ,p_version_number       OUT NOCOPY  NUMBER
6484             ,x_return_status        OUT NOCOPY VARCHAR2
6485 ) IS
6486 
6487   l_version_seq_id NUMBER;
6488 
6489 BEGIN
6490 BEGIN
6491     SELECT version_seq_id INTO l_version_seq_id
6492     FROM ego_flex_valueset_version_b
6493     WHERE start_active_date < p_start_effective_date
6494           AND ( end_active_date > p_start_effective_date
6495           OR end_active_date IS  NULL ) AND  last_update_date < p_creation_date
6496           AND flex_value_set_id = p_value_set_id AND version_seq_id <> 0 ;
6497 EXCEPTION WHEN No_Data_Found THEN
6498    BEGIN
6499    SELECT version_seq_id INTO l_version_seq_id
6500    FROM ego_flex_valueset_version_b
6501    WHERE start_active_date < p_start_effective_date
6502           AND last_update_date =(SELECT Min(last_update_date)  from  ego_flex_valueset_version_b
6503    WHERE flex_value_set_id = p_value_set_id AND version_seq_id <> 0
6504          AND last_update_date > p_creation_date )
6505          AND  flex_value_set_id = p_value_set_id AND version_seq_id <> 0     ;
6506   EXCEPTION
6507    WHEN OTHERS THEN
6508          l_version_seq_id :=NULL ;
6509   END;
6510 END;
6511     p_version_number :=  l_version_seq_id ;
6512     x_return_status:='S'    ;
6513 END  get_version_number;
6514 
6515 
6516 
6517 /* Procedure is to release a draft of value set.   */
6518 
6519 PROCEDURE RELEASE_VALUE_SET_VERSION(
6520                    p_api_version        IN NUMBER
6521                   ,p_value_set_id       IN NUMBER
6522                   ,p_description        IN VARCHAR2
6523                   ,p_start_date         IN TIMESTAMP
6524                   ,p_version_seq_id     IN NUMBER
6525                   ,x_return_status      OUT NOCOPY VARCHAR2
6526                   ,x_msg_count          OUT NOCOPY VARCHAR2
6527                   ,x_msg_data            OUT NOCOPY varchar2
6528 )
6529 IS
6530 
6531       l_future_effective            BOOLEAN ;
6532       l_relver_end_active_date       DATE ;
6533       l_version_seq_id               NUMBER;
6534       l_max_version_seq_id           NUMBER  ;
6535       L_DUP_REC                      NUMBER;
6536       L_SAME_REL_DATE                NUMBER;
6537       l_min_start_active_date       DATE ;
6538 
6539       CURSOR compareReleaseDates
6540       IS
6541             SELECT start_active_date ,end_active_date,version_seq_id
6542             FROM ego_flex_valueset_version_b
6543             WHERE flex_value_set_id =  p_value_set_id AND version_seq_id  <> 0 ;
6544       rect_t compareReleaseDates%rowtype;
6545       CURSOR copyDuplicateRow
6546       IS
6547       SELECT flex_value_id,SEQUENCE
6548       FROM EGO_FLEX_VALUE_VERSION_B
6549       WHERE  flex_value_set_id =  p_value_set_id AND version_seq_id = 0;
6550       rec_duplicateRow  copyDuplicateRow % ROWTYPE;
6551 
6552  BEGIN
6553       l_max_version_seq_id := p_version_seq_id -1 ;
6554       /*Validating whether the draft has changed from the previous released version.
6555       If not we are not going to release version and returning from the procedure with error message*/
6556 IF(l_max_version_seq_id > 0) THEN
6557 
6558 SELECT COUNT(*) INTO L_DUP_REC FROM
6559 (
6560    (SELECT FLEX_VALUE_ID,SEQUENCE FROM EGO_FLEX_VALUE_VERSION_B
6561     WHERE FLEX_VALUE_SET_ID = P_VALUE_SET_ID AND VERSION_SEQ_ID=0
6562     MINUS
6563     SELECT FLEX_VALUE_ID,SEQUENCE FROM EGO_FLEX_VALUE_VERSION_B
6564     WHERE FLEX_VALUE_SET_ID = P_VALUE_SET_ID AND VERSION_SEQ_ID=L_MAX_VERSION_SEQ_ID)
6565 
6566 UNION
6567 
6568   (SELECT FLEX_VALUE_ID,SEQUENCE FROM EGO_FLEX_VALUE_VERSION_B
6569    WHERE FLEX_VALUE_SET_ID = P_VALUE_SET_ID AND VERSION_SEQ_ID=L_MAX_VERSION_SEQ_ID
6570    MINUS
6571    SELECT FLEX_VALUE_ID,SEQUENCE FROM EGO_FLEX_VALUE_VERSION_B
6572    WHERE FLEX_VALUE_SET_ID = P_VALUE_SET_ID AND VERSION_SEQ_ID=0)
6573 )  ;
6574 
6575 IF(L_DUP_REC = 0)   THEN
6576    x_msg_count :=1;
6577    x_msg_data := 'ValidationError';
6578    x_return_status := 'F';
6579    RETURN ;
6580 END IF  ;
6581 END IF ;
6582 /* Validation ends. */
6583 /* Validating whether value set is already released on the date */
6584 
6585   SELECT COUNT(*) INTO  L_SAME_REL_DATE FROM EGO_FLEX_VALUESET_VERSION_B
6586                  WHERE FLEX_VALUE_SET_ID = P_VALUE_SET_ID AND
6587                   ( START_ACTIVE_DATE=  P_START_DATE OR END_ACTIVE_DATE = P_START_DATE)
6588                     AND VERSION_SEQ_ID <>0;
6589 
6590     IF(L_SAME_REL_DATE>0) THEN
6591           x_msg_count :=1;
6592           x_msg_data := 'SameRelDateError';
6593           x_return_status := 'F';
6594          RETURN ;
6595     END IF ;
6596 
6597 
6598       OPEN    compareReleaseDates;
6599       LOOP
6600       FETCH compareReleaseDates INTO  rect_t;
6601       EXIT  when compareReleaseDates%NOTFOUND;
6602   /* Setting Value for l_future_effective.It means if l_future_effective is true than the
6603 releasing version  Start active date  falls in between the already released version start active date and
6604 end active date. */
6605       IF p_start_date >= rect_t.start_active_date
6606       AND ( p_start_date <= rect_t.end_active_date OR rect_t.end_active_date IS NULL)
6607       THEN
6608             l_future_effective := TRUE;
6609             l_version_seq_id := rect_t.version_seq_id ;
6610             l_relver_end_active_date :=   rect_t.end_active_date  ;
6611       EXIT;
6612       END IF ;
6613       END LOOP;
6614     CLOSE compareReleaseDates;
6615 
6616  IF(l_future_effective) THEN
6617     UPDATE  EGO_FLEX_VALUESET_VERSION_B
6618     SET END_ACTIVE_DATE =p_start_date -1/(24*60*60) ,
6619          LAST_UPDATED_BY= FND_GLOBAL.PARTY_ID,
6620          LAST_UPDATE_DATE = SYSDATE,
6621         LAST_UPDATE_LOGIN = FND_GLOBAL.LOGIN_ID
6622     WHERE FLEX_VALUE_SET_ID = p_value_set_id AND VERSION_SEQ_ID = l_version_seq_id;
6623 
6624      /* Creating record for the newly releasing version.Here end date is the start date of
6625 the  released version(releasing version start date lies in between
6626      the start date and end date of released version) */
6627     INSERT INTO EGO_FLEX_VALUESET_VERSION_B
6628     (FLEX_VALUE_SET_ID, VERSION_SEQ_ID,
6629     DESCRIPTION, START_ACTIVE_DATE,END_ACTIVE_DATE, CREATED_BY,CREATION_DATE,
6630     LAST_UPDATED_BY,last_update_date,last_update_login)
6631     VALUES (p_value_set_id, p_version_seq_id,
6632     p_description, p_start_date,l_relver_end_active_date,fnd_global.party_id,
6633     SYSDATE,fnd_global.party_id,SYSDATE,
6634     fnd_global.login_id)   ;
6635       /* Creating record for the draft row .*/
6636     INSERT INTO EGO_FLEX_VALUESET_VERSION_B  (FLEX_VALUE_SET_ID, VERSION_SEQ_ID,
6637     CREATED_BY,CREATION_DATE,
6638     LAST_UPDATED_BY,last_update_date,last_update_login) VALUES (p_value_set_id, 0,
6639     fnd_global.party_id,SYSDATE,fnd_global.party_id,SYSDATE,
6640     fnd_global.login_id)  ;
6641 ELSE
6642       SELECT Min(start_active_date ) INTO   l_min_start_active_date
6643        FROM  EGO_FLEX_VALUESET_VERSION_B WHERE   FLEX_VALUE_SET_ID =  p_value_set_id  ;
6644 
6645 /* Updating end date of already released version with the start date(less one second)
6646 of newly releasing version*/
6647 
6648        IF (p_version_seq_id > 1 AND (l_min_start_active_date < p_start_date)) THEN
6649        UPDATE EGO_FLEX_VALUESET_VERSION_B SET END_ACTIVE_DATE =(p_start_date- 1/(24*60*60)),
6650        version_seq_id = l_max_version_seq_id ,
6651         LAST_UPDATED_BY= FND_GLOBAL.PARTY_ID,
6652          LAST_UPDATE_DATE = SYSDATE,
6653          LAST_UPDATE_LOGIN = FND_GLOBAL.LOGIN_ID
6654        WHERE FLEX_VALUE_SET_ID =  p_value_set_id AND (start_active_date =( SELECT Max(start_active_date )
6655        FROM  EGO_FLEX_VALUESET_VERSION_B WHERE   FLEX_VALUE_SET_ID =  p_value_set_id) )  ;
6656         END IF   ;
6657 
6658  /* Creating record for the draft row .*/
6659        INSERT INTO EGO_FLEX_VALUESET_VERSION_B  (FLEX_VALUE_SET_ID, VERSION_SEQ_ID,
6660         CREATED_BY,CREATION_DATE,
6661         LAST_UPDATED_BY,last_update_date,last_update_login) VALUES (p_value_set_id, 0,
6662         fnd_global.party_id,SYSDATE,fnd_global.party_id,SYSDATE,
6663         fnd_global.login_id) ;
6664 
6665      /* Creating record for the newly releasing version*/
6666       INSERT INTO EGO_FLEX_VALUESET_VERSION_B  (FLEX_VALUE_SET_ID, VERSION_SEQ_ID,
6667       DESCRIPTION, START_ACTIVE_DATE,CREATED_BY,CREATION_DATE,
6668       LAST_UPDATED_BY,last_update_date,last_update_login) VALUES (p_value_set_id,p_version_seq_id,
6669       p_description, p_start_date,fnd_global.party_id,SYSDATE,fnd_global.party_id,SYSDATE,
6670       fnd_global.login_id) ;
6671    /* below condition is only true if the start date of version getting release is less than the min(start date)
6672    of released version*/
6673       IF(p_start_date< l_min_start_active_date)  THEN
6674          UPDATE EGO_FLEX_VALUESET_VERSION_B SET END_ACTIVE_DATE =(l_min_start_active_date -
6675 1/(24*60*60) ),LAST_UPDATED_BY= FND_GLOBAL.PARTY_ID,
6676          LAST_UPDATE_DATE = SYSDATE,
6677          LAST_UPDATE_LOGIN = FND_GLOBAL.LOGIN_ID
6678        WHERE FLEX_VALUE_SET_ID =  p_value_set_id AND start_active_date = p_start_date;
6679       END IF ;
6680  END IF ;
6681 
6682   COMMIT;
6683    OPEN copyDuplicateRow   ;
6684    LOOP
6685    FETCH     copyDuplicateRow INTO   rec_duplicateRow  ;
6686    EXIT WHEN copyDuplicateRow%NOTFOUND ;
6687 
6688    UPDATE EGO_FLEX_VALUE_VERSION_B SET   VERSION_SEQ_ID =P_VERSION_SEQ_ID ,
6689                                          LAST_UPDATED_BY= FND_GLOBAL.PARTY_ID,
6690                                          LAST_UPDATE_DATE = SYSDATE,
6691                                          LAST_UPDATE_LOGIN = FND_GLOBAL.LOGIN_ID
6692    WHERE FLEX_VALUE_SET_ID = P_VALUE_SET_ID AND  VERSION_SEQ_ID = 0 AND FLEX_VALUE_ID
6693     = REC_DUPLICATEROW.FLEX_VALUE_ID;
6694 
6695    INSERT INTO EGO_FLEX_VALUE_VERSION_B (FLEX_VALUE_SET_ID,FLEX_VALUE_ID,VERSION_SEQ_ID
6696    ,SEQUENCE,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN)
6697    VALUES(P_VALUE_SET_ID,REC_DUPLICATEROW.FLEX_VALUE_ID,0,REC_DUPLICATEROW.SEQUENCE,
6698    FND_GLOBAL.PARTY_ID,SYSDATE,FND_GLOBAL.PARTY_ID,SYSDATE,FND_GLOBAL.LOGIN_ID);
6699 
6700    INSERT INTO EGO_FLEX_VALUE_VERSION_TL (FLEX_VALUE_ID,VERSION_SEQ_ID,LAST_UPDATE_DATE,LAST_UPDATED_BY,
6701   CREATION_DATE,CREATED_BY,LAST_UPDATE_LOGIN,DESCRIPTION,FLEX_VALUE_MEANING,LANGUAGE,SOURCE_LANG)
6702            SELECT FLEX_VALUE_ID,P_VERSION_SEQ_ID,SYSDATE,FND_GLOBAL.PARTY_ID,SYSDATE,FND_GLOBAL.PARTY_ID,
6703            FND_GLOBAL.LOGIN_ID,DESCRIPTION,FLEX_VALUE_MEANING,LANGUAGE,SOURCE_LANG FROM
6704 EGO_FLEX_VALUE_VERSION_TL WHERE FLEX_VALUE_ID = REC_DUPLICATEROW.FLEX_VALUE_ID AND VERSION_SEQ_ID=0 ;
6705 
6706    END LOOP ;
6707    CLOSE copyDuplicateRow;
6708       x_return_status:='S';
6709    COMMIT;
6710   EXCEPTION
6711   WHEN OTHERS THEN
6712       x_return_status := NULL;
6713  END RELEASE_VALUE_SET_VERSION;
6714 
6715 
6716 
6717 
6718 
6719 /* Procedure is used to revert the Draft of value set version to an Earlier Released version. */
6720 
6721 PROCEDURE REVERT_TO_AN_EARLIER_VERSION(
6722             p_api_version       IN NUMBER
6723            ,p_value_set_id      IN NUMBER
6724            ,p_version_number    IN NUMBER
6725            ,x_return_status     OUT NOCOPY VARCHAR2
6726            ,x_msg_count         OUT NOCOPY number
6727            ,x_msg_data          OUT NOCOPY VARCHAR2
6728 )
6729 
6730 IS
6731 
6732 
6733 CURSOR revert_draft
6734 IS
6735     SELECT flex_value_id,SEQUENCE
6736     FROM ego_flex_value_version_b
6737     WHERE version_seq_id = p_version_number AND flex_value_set_id = p_value_set_id;
6738 rect_t   revert_draft%rowtype;
6739 
6740 BEGIN
6741 
6742 
6743 
6744 DELETE FROM  EGO_FLEX_VALUE_VERSION_TL WHERE VERSION_SEQ_ID =0 AND FLEX_VALUE_ID IN
6745             (SELECT FLEX_VALUE_ID FROM EGO_FLEX_VALUE_VERSION_B  WHERE FLEX_VALUE_SET_ID =P_VALUE_SET_ID
6746              AND VERSION_SEQ_ID = 0)   ;
6747 
6748 DELETE  FROM EGO_FLEX_VALUE_VERSION_B
6749         WHERE FLEX_VALUE_SET_ID =P_VALUE_SET_ID AND VERSION_SEQ_ID = 0;
6750 
6751 
6752 
6753 OPEN revert_draft;
6754 LOOP
6755 FETCH revert_draft INTO rect_t;
6756 EXIT WHEN  revert_draft%notfound ;
6757 INSERT INTO EGO_FLEX_VALUE_VERSION_B(FLEX_VALUE_SET_ID,FLEX_VALUE_ID
6758                                     ,VERSION_SEQ_ID,SEQUENCE,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
6759                                      LAST_UPDATE_DATE,LAST_UPDATE_LOGIN)
6760           VALUES (P_VALUE_SET_ID,RECT_T.FLEX_VALUE_ID,0,RECT_T.SEQUENCE,FND_GLOBAL.PARTY_ID,
6761                   SYSDATE,FND_GLOBAL.PARTY_ID,SYSDATE,FND_GLOBAL.LOGIN_ID );
6762 
6763 
6764 END LOOP;
6765 CLOSE revert_draft;
6766 
6767 
6768 INSERT INTO EGO_FLEX_VALUE_VERSION_TL (FLEX_VALUE_ID,VERSION_SEQ_ID,LAST_UPDATE_DATE,LAST_UPDATED_BY,
6769                                        CREATION_DATE,CREATED_BY,LAST_UPDATE_LOGIN,DESCRIPTION,FLEX_VALUE_MEANING,LANGUAGE,SOURCE_LANG)
6770                               SELECT FLEX_VALUE_ID,0,SYSDATE,FND_GLOBAL.PARTY_ID,SYSDATE,FND_GLOBAL.PARTY_ID,
6771                                       FND_GLOBAL.LOGIN_ID,DESCRIPTION,FLEX_VALUE_MEANING,LANGUAGE,SOURCE_LANG FROM EGO_FLEX_VALUE_VERSION_TL
6772                              WHERE VERSION_SEQ_ID = P_VERSION_NUMBER AND FLEX_VALUE_ID IN
6773                                    (SELECT FLEX_VALUE_ID FROM EGO_FLEX_VALUE_VERSION_B
6774                                      WHERE  FLEX_VALUE_SET_ID = P_VALUE_SET_ID AND VERSION_SEQ_ID =  P_VERSION_NUMBER);
6775  x_return_status :='S';
6776  COMMIT;
6777 
6778 EXCEPTION
6779 WHEN OTHERS THEN
6780  x_return_status := NULL;
6781 END REVERT_TO_AN_EARLIER_VERSION;
6782 
6783 
6784 --Procedure to convert non versioned value set to an versioned value set.
6785 
6786 PROCEDURE CONVERT_TO_VERSIONED_VALUE_SET(
6787             p_api_version       IN NUMBER
6788            ,p_value_set_id      IN NUMBER
6789            ,p_description       IN VARCHAR2
6790            ,x_return_status     OUT NOCOPY VARCHAR2
6791            ,x_msg_count         OUT NOCOPY number
6792            ,x_msg_data          OUT NOCOPY VARCHAR2
6793 )
6794 
6795 IS
6796         l_created_by    VARCHAR2(20)    ;
6797 BEGIN
6798      --Inserting party id instead of user id .
6799       SELECT  PERSON_PARTY_ID INTO  L_CREATED_BY FROM FND_USER WHERE  USER_ID
6800        =( SELECT CREATED_BY  FROM FND_FLEX_VALUE_SETS WHERE  FLEX_VALUE_SET_ID =  P_VALUE_SET_ID)  ;
6801 
6802      --Inserting the new record in EGO_FLEX_VALUESET_VERSION_B for making versioned value set.
6803        INSERT INTO EGO_FLEX_VALUESET_VERSION_B(FLEX_VALUE_SET_ID,VERSION_SEQ_ID,DESCRIPTION
6804                   ,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN)
6805       VALUES (P_VALUE_SET_ID, 0, P_DESCRIPTION,L_CREATED_BY,SYSDATE,FND_GLOBAL.PARTY_ID,SYSDATE,
6806       FND_GLOBAL.LOGIN_ID);
6807          --Inserting the new record in EGO_OBJECT_LOCK for Locking versioned value set agains username.
6808       INSERT INTO EGO_OBJECT_LOCK (LOCK_ID,OBJECT_NAME,PK1_VALUE,LOCKING_PARTY_ID,LOCK_FLAG,
6809                                    CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN)
6810                                     VALUES
6811                                   (EGO_OBJECT_LOCK_S.NEXTVAL,'EGO_VALUE_SET',P_VALUE_SET_ID,FND_GLOBAL.PARTY_ID,'L',
6812                                   FND_GLOBAL.LOGIN_ID,SYSDATE,FND_GLOBAL.LOGIN_ID,SYSDATE,FND_GLOBAL.LOGIN_ID)   ;
6813    --Clearing out the start date and end of values in fnd_flex_values because we are considering all the
6814    -- enabled values for this value set.
6815    UPDATE FND_FLEX_VALUES SET START_DATE_ACTIVE = NULL ,END_DATE_ACTIVE= NULL
6816            WHERE FLEX_VALUE_SET_ID= P_VALUE_SET_ID AND ENABLED_FLAG='Y';
6817     --Creating the record for values in EGO_FLEX_VALUE_VERSION_B table
6818    INSERT INTO EGO_FLEX_VALUE_VERSION_B (FLEX_VALUE_SET_ID, FLEX_VALUE_ID,SEQUENCE,
6819     VERSION_SEQ_ID,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN)
6820      SELECT  P_VALUE_SET_ID, A.FLEX_VALUE_ID, B.DISP_SEQUENCE,0,A.CREATED_BY,SYSDATE,
6821             FND_GLOBAL.PARTY_ID,SYSDATE,FND_GLOBAL.LOGIN_ID
6822             FROM FND_FLEX_VALUES A,  EGO_VS_VALUES_DISP_ORDER  B
6823             WHERE
6824               A.FLEX_VALUE_SET_ID = P_VALUE_SET_ID
6825               AND A.ENABLED_FLAG='Y'
6826               AND  B.VALUE_SET_VALUE_ID = A.FLEX_VALUE_ID    ;
6827 
6828       --Creating the record for values in EGO_FLEX_VALUE_VERSION_tl table
6829     INSERT INTO EGO_FLEX_VALUE_VERSION_TL (FLEX_VALUE_ID,DESCRIPTION,VERSION_SEQ_ID,LAST_UPDATE_DATE,LAST_UPDATED_BY,
6830                                             CREATION_DATE,CREATED_BY,LAST_UPDATE_LOGIN,FLEX_VALUE_MEANING,LANGUAGE,SOURCE_LANG
6831     ) SELECT A.FLEX_VALUE_ID,B.DESCRIPTION ,0,SYSDATE,FND_GLOBAL.PARTY_ID,SYSDATE,FND_GLOBAL.PARTY_ID,FND_GLOBAL.LOGIN_ID,
6832             B.FLEX_VALUE_MEANING,B.LANGUAGE,USERENV('LANG') FROM EGO_FLEX_VALUE_VERSION_B A,
6833                  FND_FLEX_VALUES_TL B
6834                  WHERE  A.FLEX_VALUE_SET_ID = P_VALUE_SET_ID  AND
6835                  A.VERSION_SEQ_ID = 0 AND A.FLEX_VALUE_ID = B.FLEX_VALUE_ID;
6836         x_return_status := 'S';
6837           COMMIT;
6838        EXCEPTION WHEN OTHERS
6839       THEN
6840            x_return_status := NULL;
6841 
6842 END CONVERT_TO_VERSIONED_VALUE_SET;
6843 
6844 
6845 
6846 
6847 
6848 
6849 /* Wrapper Procedure for Create_Value_Set method.
6850 Procedure can be used for create Versioned and non versioned Value set.
6851 This method will include PIM 4 Telco functionality. */
6852  PROCEDURE Create_Value_Set (
6853         p_api_version                   IN   NUMBER
6854 --       ,p_application_id                IN   NUMBER
6855        ,p_value_set_name                IN   VARCHAR2
6856        ,p_description                   IN   VARCHAR2
6857        ,p_format_code                   IN   VARCHAR2
6858        ,p_maximum_size                  IN   NUMBER     DEFAULT 0
6859        ,p_maximum_value                 IN   VARCHAR2
6860        ,p_minimum_value                 IN   VARCHAR2
6861        ,p_long_list_flag                IN   VARCHAR2
6862        ,p_validation_code               IN   VARCHAR2
6863        ,p_owner                         IN   NUMBER
6864        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
6865        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
6866        ,x_value_set_id                  OUT NOCOPY NUMBER
6867        ,x_return_status                 OUT NOCOPY VARCHAR2
6868 --       ,x_errorcode                     OUT NOCOPY NUMBER
6869        ,x_msg_count                     OUT NOCOPY NUMBER
6870        ,x_msg_data                      OUT NOCOPY VARCHAR2
6871        ,p_versioning_enabled            IN  VARCHAR2
6872 ) IS
6873 
6874 
6875 BEGIN
6876 
6877   EGO_EXT_FWK_PUB.Create_Value_Set(
6878         p_api_version                   => p_api_version
6879        ,p_value_set_name                => p_value_set_name
6880        ,p_description                   => p_description
6881        ,p_format_code                   => p_format_code
6882        ,p_maximum_size                  => p_maximum_size
6883        ,p_maximum_value                 => p_maximum_value
6884        ,p_minimum_value                 => p_minimum_value
6885        ,p_long_list_flag                => p_long_list_flag
6886        ,p_validation_code               => p_validation_code
6887        ,p_owner                         => p_owner
6888        ,p_init_msg_list                 => p_init_msg_list
6889        ,p_commit                        => p_commit
6890        ,x_return_status                  => x_return_status
6891        ,x_value_set_id                  => x_value_set_id
6892        ,x_msg_count                     => x_msg_count
6893        ,x_msg_data                      => x_msg_data
6894 
6895     )  ;
6896 
6897 
6898 
6899     ------------------------------------------------------------------------------------------------------
6900     --  P4T Specific logic
6901     --  If Value Set was created successfully , create the version records in EGO tables
6902 
6903     IF ( x_return_status = 'S' AND p_versioning_enabled ='true' ) THEN
6904       Insert into EGO_FLEX_VALUESET_VERSION_B
6905         (flex_value_set_id,version_seq_id,description
6906         ,created_by,creation_date,last_updated_by,last_update_date,last_update_login)
6907       VALUES (x_value_set_id, 0, p_description,FND_GLOBAL.party_id,SYSDATE,FND_GLOBAL.party_id,SYSDATE,
6908       FND_GLOBAL.login_id);
6909 
6910 
6911       INSERT INTO ego_object_lock (LOCK_ID,OBJECT_NAME,PK1_VALUE,locking_party_id,lock_flag,
6912       created_by,creation_date,last_updated_by,last_update_date,last_update_login)  VALUES
6913       (EGO_OBJECT_LOCK_S.nextval,'EGO_VALUE_SET',x_value_set_id,FND_GLOBAL.party_id,'L',FND_GLOBAL.login_id,SYSDATE,
6914         FND_GLOBAL.login_id,SYSDATE,FND_GLOBAL.login_id)   ;
6915     END IF;
6916     ------------------------------------------------------------------------------------------------------
6917 END Create_Value_Set;
6918 
6919 PROCEDURE Create_Value_Set (
6920         p_api_version                   IN   NUMBER
6921 --       ,p_application_id                IN   NUMBER
6922        ,p_value_set_name                IN   VARCHAR2
6923        ,p_description                   IN   VARCHAR2
6924        ,p_format_code                   IN   VARCHAR2
6925        ,p_maximum_size                  IN   NUMBER     DEFAULT 0
6926        ,p_maximum_value                 IN   VARCHAR2
6927        ,p_minimum_value                 IN   VARCHAR2
6928        ,p_long_list_flag                IN   VARCHAR2
6929        ,p_validation_code               IN   VARCHAR2
6930        ,p_owner                         IN   NUMBER
6931        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
6932        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
6933        ,x_value_set_id                  OUT NOCOPY NUMBER
6934        ,x_return_status                 OUT NOCOPY VARCHAR2
6935 --       ,x_errorcode                     OUT NOCOPY NUMBER
6936        ,x_msg_count                     OUT NOCOPY NUMBER
6937        ,x_msg_data                      OUT NOCOPY VARCHAR2
6938 ) IS
6939 
6940     l_api_name               VARCHAR2(30);
6941 
6942     --we don't use l_api_version yet, but eventually we might:
6943     --if we change required parameters, version goes from n.x to (n+1).x
6944     --if we change optional parameters, version goes from x.n to x.(n+1)
6945     l_api_version            NUMBER := 1.0;
6946 
6947 --    l_add_where_clause       VARCHAR2(1000);
6948     l_owner                  NUMBER;
6949     l_maximum_size           NUMBER;
6950     l_format_code            FND_FLEX_VALUE_SETS.FORMAT_TYPE%TYPE;
6951     l_validation_code        FND_LOOKUP_VALUES.LOOKUP_CODE%TYPE;
6952     l_maximum_value          FND_FLEX_VALUE_SETS.MAXIMUM_VALUE%TYPE;
6953     l_minimum_value          FND_FLEX_VALUE_SETS.MINIMUM_VALUE%TYPE;
6954 --    l_Sysdate                DATE := Sysdate;
6955 
6956     l_owner_name             VARCHAR2(40):='ANONYMOUS';
6957   BEGIN
6958 
6959     l_api_name     := 'Create_Value_Set';
6960     l_api_version  := 1.0;
6961     code_debug(' Started '||l_api_name ||' with params ');
6962     code_debug('p_value_set_name - '|| p_value_set_name||' p_description - '||p_description);
6963     code_debug('p_maximum_size - '|| p_maximum_size||' p_maximum_value - '||p_maximum_value||' p_minimum_value - '||p_minimum_value);
6964     code_debug('p_format_code - '|| p_format_code||' p_validation_code - '||p_validation_code||' p_long_list_flag - '||p_long_list_flag);
6965     -- Standard start of API savepoint
6966     IF FND_API.To_Boolean(p_commit) THEN
6967       SAVEPOINT Create_Value_Set_PUB;
6968     END IF;
6969 
6970     -- Initialize message list even though we don't currently use it
6971     IF FND_API.To_Boolean(p_init_msg_list) THEN
6972       FND_MSG_PUB.Initialize;
6973     END IF;
6974 
6975     -- Check for call compatibility
6976     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
6977                                         l_api_name, G_PKG_NAME)
6978     THEN
6979       RAISE FND_API.G_EXC_ERROR;
6980     END IF;
6981 
6982     IF (p_owner IS NULL OR p_owner = -1) THEN
6983       l_owner := g_current_user_id;
6984     ELSE
6985       l_owner := p_owner;
6986     END IF;
6987 
6988     IF (p_maximum_size IS NULL) THEN
6989       l_maximum_size := 0;
6990     ELSE
6991       l_maximum_size := p_maximum_size;
6992     END IF;
6993 
6994     IF (p_validation_code IS NULL) THEN
6995       l_validation_code := G_NONE_VALIDATION_CODE;
6996     ELSE
6997       l_validation_code := p_validation_code;
6998     END IF;
6999 
7000     IF (p_format_code = G_TRANS_TEXT_DATA_TYPE) THEN
7001       -- this should never occur after
7002       l_format_code := G_CHAR_DATA_TYPE;
7003       l_validation_code := G_TRANS_IND_VALIDATION_CODE;
7004     ELSE
7005       l_format_code:= NVL(p_format_code,G_CHAR_DATA_TYPE);
7006     END IF;
7007 
7008     -- bug 4137720 trim extra spaces
7009     IF l_format_code <> G_CHAR_DATA_TYPE THEN
7010       IF (p_maximum_value IS NOT NULL) THEN
7011         l_maximum_value := TRIM(p_maximum_value);
7012       ELSE
7013         l_maximum_value := NULL;
7014       END IF;
7015       IF (p_minimum_value IS NOT NULL) THEN
7016         l_minimum_value := TRIM(p_minimum_value);
7017       ELSE
7018         l_minimum_value := NULL;
7019       END IF;
7020     ELSE
7021       l_maximum_value := p_maximum_value;
7022       l_minimum_value := p_minimum_value;
7023     END IF;
7024 
7025 --    l_add_where_clause := 'where lookup_type =''EGO_EF_'||
7026 --                          p_value_set_name||'_TYPE'' AND language = userenv(''LANG'')';
7027 
7028     FND_FLEX_VAL_API.Set_Session_Mode('customer_data');
7029 --Bug No:5292701 :START
7030    /* IF (l_validation_code = G_NONE_VALIDATION_CODE) THEN
7031     code_debug(l_api_name ||' FND_FLEX_VAL_API.Create_Valueset_None ');
7032       FND_FLEX_VAL_API.Create_Valueset_None(
7033         VALUE_SET_NAME                  => p_value_set_name
7034        ,DESCRIPTION                     => p_description
7035        ,SECURITY_AVAILABLE              => 'N'
7036        ,ENABLE_LONGLIST                 => p_long_list_flag
7037        ,FORMAT_TYPE                     => l_format_code
7038        ,MAXIMUM_SIZE                    => l_maximum_size
7039        ,PRECISION                       => null
7040        ,NUMBERS_ONLY                    => 'N'
7041        ,UPPERCASE_ONLY                  => 'N'
7042        ,RIGHT_JUSTIFY_ZERO_FILL         => 'N'
7043        ,MIN_VALUE                       => l_minimum_value
7044        ,MAX_VALUE                       => l_maximum_value
7045       );
7046 
7047     ELSIF (l_validation_code IN (G_INDEPENDENT_VALIDATION_CODE,G_TRANS_IND_VALIDATION_CODE) ) THEN
7048     code_debug(l_api_name ||' FND_FLEX_VAL_API.create_valueset_independent ');
7049       FND_FLEX_VAL_API.create_valueset_independent(
7050         value_set_name                  => p_value_set_name
7051        ,description                     => p_description
7052        ,security_available              => 'N'
7053        ,enable_longlist                 => p_long_list_flag
7054        ,format_type                     => l_format_code
7055        ,maximum_size                    => l_maximum_size
7056        ,precision                       => null
7057        ,numbers_only                    => 'N'
7058        ,uppercase_only                  => 'N'
7059        ,right_justify_zero_fill         => 'N'
7060        ,min_value                       => l_minimum_value
7061        ,max_value                       => l_maximum_value
7062         );
7063       IF l_validation_code =  G_TRANS_IND_VALIDATION_CODE THEN
7064         UPDATE fnd_flex_value_sets
7065         SET validation_type = l_validation_code
7066         WHERE flex_value_set_name = p_value_set_name;
7067       END IF;
7068     ELSIF (l_validation_code = G_TABLE_VALIDATION_CODE) THEN
7069     code_debug(l_api_name ||' FND_FLEX_VAL_API.Create_Valueset_Table ');
7070       --
7071       -- as the table information is mandatory using the API
7072       -- we are creating a value set with validation type as NONE
7073       -- and then changing the validation_code flag
7074       --
7075       FND_FLEX_VAL_API.Create_Valueset_None(
7076         VALUE_SET_NAME                  => p_value_set_name
7077        ,DESCRIPTION                     => p_description
7078        ,SECURITY_AVAILABLE              => 'N'
7079        ,ENABLE_LONGLIST                 => p_long_list_flag
7080        ,FORMAT_TYPE                     => l_format_code
7081        ,MAXIMUM_SIZE                    => l_maximum_size
7082        ,PRECISION                       => null
7083        ,NUMBERS_ONLY                    => 'N'
7084        ,UPPERCASE_ONLY                  => 'N'
7085        ,RIGHT_JUSTIFY_ZERO_FILL         => 'N'
7086        ,MIN_VALUE                       => l_minimum_value
7087        ,MAX_VALUE                       => l_maximum_value
7088       );
7089       UPDATE fnd_flex_value_sets
7090       SET validation_type = l_validation_code
7091       WHERE flex_value_set_name = p_value_set_name;
7092     END IF;*/
7093 --Bug No:5292701
7094     BEGIN
7095       SELECT USER_NAME INTO l_owner_name
7096       FROM FND_USER
7097       WHERE USER_ID = l_owner;
7098     EXCEPTION
7099        WHEN NO_DATA_FOUND THEN
7100         NULL;
7101     END;
7102 
7103       fnd_flex_loader_apis.up_value_set
7104       (
7105         p_upload_phase                 => 'BEGIN'
7106        ,p_upload_mode                   =>'non-MLS'
7107        ,p_flex_value_set_name          =>p_value_set_name
7108        ,p_owner                        =>l_owner_name
7109        ,p_validation_type              =>p_validation_code
7110        ,p_protected_flag               =>'N'
7111        ,p_security_enabled_flag        =>'N'
7112        ,p_longlist_flag                =>p_long_list_flag
7113        ,p_format_type                  =>l_format_code
7114        ,p_maximum_size                 =>l_maximum_size
7115        ,p_number_precision             =>''
7116        ,p_alphanumeric_allowed_flag    =>'Y'
7117        ,p_uppercase_only_flag          =>'N'
7118        ,p_numeric_mode_enabled_flag    =>'N'
7119        ,p_minimum_value                =>l_minimum_value
7120        ,p_maximum_value                =>l_maximum_value
7121        ,p_parent_flex_value_set_name   =>''
7122        ,p_dependant_default_value      =>''
7123        ,p_dependant_default_meaning    =>''
7124        ,p_description                  =>p_description
7125        );
7126       fnd_flex_loader_apis.up_value_set
7127       (
7128         p_upload_phase                 => 'END'
7129        ,p_upload_mode                   =>'non-MLS'
7130        ,p_flex_value_set_name          =>p_value_set_name
7131        ,p_owner                        =>l_owner_name
7132        ,p_validation_type              =>p_validation_code
7133        ,p_protected_flag               =>'N'
7134        ,p_security_enabled_flag        =>'N'
7135        ,p_longlist_flag                =>p_long_list_flag
7136        ,p_format_type                  =>l_format_code
7137        ,p_maximum_size                 =>l_maximum_size
7138        ,p_number_precision             =>''
7139        ,p_alphanumeric_allowed_flag    =>'Y'
7140        ,p_uppercase_only_flag          =>'N'
7141        ,p_numeric_mode_enabled_flag    =>'N'
7142        ,p_minimum_value                =>l_minimum_value
7143        ,p_maximum_value                =>l_maximum_value
7144        ,p_parent_flex_value_set_name   =>''
7145        ,p_dependant_default_value      =>''
7146        ,p_dependant_default_meaning    =>''
7147        ,p_description                  =>p_description
7148        );
7149 
7150 --Bug No:5292701 :END
7151 
7152     SELECT flex_value_set_id
7153       INTO x_value_set_id
7154       FROM fnd_flex_value_sets
7155      WHERE flex_value_set_name = p_value_set_name;
7156 
7157     -- Standard check of p_commit
7158     IF FND_API.To_Boolean(p_commit) THEN
7159       COMMIT WORK;
7160     END IF;
7161 
7162     x_return_status := FND_API.G_RET_STS_SUCCESS;
7163 
7164   EXCEPTION
7165     WHEN FND_API.G_EXC_ERROR THEN
7166     code_debug(l_api_name ||' EXCEPTION - FND_API.G_EXC_ERROR ');
7167       IF FND_API.To_Boolean( p_commit ) THEN
7168         ROLLBACK TO Create_Value_Set_PUB;
7169       END IF;
7170       x_return_status := FND_API.G_RET_STS_ERROR;
7171       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7172                                ,p_count   => x_msg_count
7173                                ,p_data    => x_msg_data);
7174     WHEN OTHERS THEN
7175     code_debug(l_api_name ||' EXCEPTION - OTHERS '||SQLERRM);
7176       IF FND_API.To_Boolean( p_commit ) THEN
7177         ROLLBACK TO Create_Value_Set_PUB;
7178       END IF;
7179       x_msg_data := fnd_message.get();
7180       IF x_msg_data IS NULL THEN
7181         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7182         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
7183         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
7184         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
7185         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM||' '||FND_FLEX_DSC_API.Message());
7186         FND_MSG_PUB.Add;
7187         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7188                                  ,p_count   => x_msg_count
7189                                  ,p_data    => x_msg_data);
7190       ELSE
7191         x_return_status := FND_API.G_RET_STS_ERROR;
7192         x_msg_count := 1;
7193       END IF;
7194 END Create_Value_Set;
7195 
7196 
7197 /*-----------------------------------------------------------------------------
7198 
7199   DESCRIPTION
7200     Creates a child value set
7201 
7202   PARAMETERS
7203     See below.
7204 
7205   NOTES
7206     (-) When calling this procedure from the java layer, leave the
7207         child_vs_value_ids as NULL. Persistence of these values is
7208         is handled separately.
7209 
7210 -----------------------------------------------------------------------------*/
7211 PROCEDURE Create_Child_Value_Set (
7212         p_api_version                   IN   NUMBER     := 1.0
7213        ,p_value_set_name                IN   VARCHAR2   -- Child Value Set Name
7214        ,p_description                   IN   VARCHAR2
7215        ,p_parent_vs_id                  IN   NUMBER
7216        ,p_owner                         IN   NUMBER
7217        ,child_vs_value_ids              IN   EGO_VALUE_SET_VALUE_IDS := NULL
7218                                            -- collection of value set value IDs
7219        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
7220        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
7221        ,x_child_vs_id                   OUT NOCOPY NUMBER -- child value set ID
7222        ,x_return_status                 OUT NOCOPY VARCHAR2
7223        ,x_msg_count                     OUT NOCOPY NUMBER
7224        ,x_msg_data                      OUT NOCOPY VARCHAR2
7225 ) IS
7226     l_api_name                VARCHAR2(30);
7227     l_parent_vs_row           ego_value_sets_v%ROWTYPE;
7228     l_maximum_size            ego_value_sets_v.maximum_size%TYPE;
7229     l_format_code             ego_value_sets_v.format_code%TYPE;
7230     l_minimum_value           ego_value_sets_v.minimum_value%TYPE;
7231     l_maximum_value           ego_value_sets_v.maximum_value%TYPE;
7232     l_long_list_flag          ego_value_sets_v.longlist_flag%TYPE;
7233     l_owner                   NUMBER;
7234     l_return_status_inf       VARCHAR2(1);
7235     l_inf_where_clause        VARCHAR2(1000);
7236     l_id_column_name          fnd_flex_validation_tables.id_column_name%TYPE;
7237     l_id_column_type          fnd_flex_validation_tables.id_column_type%TYPE;
7238     l_value_column_name       fnd_flex_validation_tables.value_column_name%TYPE;
7239     l_value_column_type       fnd_flex_validation_tables.value_column_type%TYPE;
7240 
7241   BEGIN
7242 
7243   -- For Debugging
7244   l_api_name      := 'Create_Child_Value_Set';
7245   code_debug(' Started '                || l_api_name           ||
7246              ' with params:'            ||
7247              ' p_value_set_name - '     || p_value_set_name     ||
7248              ' p_description - '        || p_description        ||
7249              ' p_parent_vs_id - '       || p_parent_vs_id       );
7250 
7251   -- Standard start of API savepoint
7252   IF FND_API.To_Boolean(p_commit) THEN
7253     SAVEPOINT Create_Child_Value_Set_PUB;
7254   END IF;
7255 
7256   code_debug('Current user ID is ' || g_current_user_id);
7257 
7258   --
7259   -- Get the Parent Value Set
7260   --
7261   SELECT *
7262   INTO   l_parent_vs_row
7263   FROM   ego_value_sets_v
7264   WHERE  value_set_id = p_parent_vs_id;
7265 
7266   -- Inherit all necessary properties from the parent value set initially.
7267   -- Later we'll override them with what has been passed to this procedure, if
7268   -- legal.
7269   l_maximum_size   := l_parent_vs_row.maximum_size;
7270   l_format_code    := l_parent_vs_row.format_code;
7271   l_minimum_value  := l_parent_vs_row.minimum_value;
7272   l_maximum_value  := l_parent_vs_row.maximum_value;
7273   l_long_list_flag := l_parent_vs_row.longlist_flag;
7274 
7275   -- Get the owner from the session info
7276   IF (p_owner IS NULL OR p_owner = -1) THEN
7277     l_owner := g_current_user_id;
7278   ELSE
7279     l_owner := p_owner;
7280   END IF;
7281 
7282   ----------------------------------------------------------------------------
7283   -- Create the value set header and get the value set id                   --
7284   ----------------------------------------------------------------------------
7285 
7286    Create_Value_Set (
7287         p_api_version                   => p_api_version
7288        ,p_value_set_name                => p_value_set_name
7289        ,p_description                   => p_description
7290        ,p_format_code                   => l_format_code
7291        ,p_maximum_size                  => l_maximum_size
7292        ,p_maximum_value                 => l_maximum_value
7293        ,p_minimum_value                 => l_minimum_value
7294        ,p_long_list_flag                => l_long_list_flag
7295        ,p_validation_code               => G_TABLE_VALIDATION_CODE
7296        ,p_owner                         => l_owner
7297        ,p_init_msg_list                 => p_init_msg_list
7298        ,p_commit                        => p_commit
7299        ,x_value_set_id                  => x_child_vs_id
7300                                       -- Child Value Set ID that gets generated
7301        ,x_return_status                 => x_return_status
7302        ,x_msg_count                     => x_msg_count
7303        ,x_msg_data                      => x_msg_data
7304   );
7305 
7306   -- check the return status
7307   IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7308     code_debug('Create_Child_Value_Set(): Child value set header creation failed.');
7309   END IF;
7310 
7311   code_debug('Create_Child_Value_Set(): New Child Value Set ID is ' || x_child_vs_id);
7312   code_debug('Create_Child_Value_Set(): Parent Value Set ID is ' || p_parent_vs_id);
7313   code_debug('Create_Child_Value_Set(): OWNER is ' || p_owner);
7314 
7315   ----------------------------------------------------------------------------
7316   -- Capture the parent-child relationship by inserting a row into          --
7317   -- EGO_VALUE_SET_EXT.                                                     --
7318   ----------------------------------------------------------------------------
7319 
7320   INSERT INTO ego_value_set_ext (value_set_id, parent_value_set_id,
7321     created_by, creation_date,  last_updated_by, last_update_date,
7322     last_update_login)
7323   VALUES (x_child_vs_id, p_parent_vs_id, l_owner, SYSDATE, l_owner, SYSDATE,
7324     g_current_login_id );
7325 
7326   ----------------------------------------------------------------------------
7327   -- Insert into EGO_VS_VALUES_DISP_ORDER                                   --
7328   ----------------------------------------------------------------------------
7329 
7330   -- NOTE: This is not used when creating a child VS from the UI. Only when
7331   -- using the PL/SQL API directly.
7332 
7333   IF child_vs_value_ids IS NOT NULL THEN
7334     FOR i IN child_vs_value_ids.FIRST .. child_vs_value_ids.LAST
7335     LOOP
7336       code_debug('Current value is ' || child_vs_value_ids(i));
7337       code_debug('i: ' || i);
7338 
7339       -- Remember, we specify which of the EXISTING value set values (from the parent value
7340       -- set) are to become members of the child value set. No new values are
7341       -- created.
7342 
7343       INSERT INTO ego_vs_values_disp_order (value_set_value_id, value_set_id,
7344         disp_sequence, created_by, creation_date, last_updated_by,
7345         last_update_date, last_update_login)
7346       VALUES (child_vs_value_ids(i),  x_child_vs_id, i, l_owner, SYSDATE, l_owner,
7347               SYSDATE, g_current_login_id);
7348 
7349     END LOOP;
7350   END IF;
7351 
7352   ----------------------------------------------------------------------------
7353   -- Insert into FND_FLEX_VALIDATION_TABLES                                 --
7354   ----------------------------------------------------------------------------
7355 
7356   l_return_status_inf := FND_API.G_FALSE;
7357 
7358   -- The condition to obtain the correct subset of VS values from
7359   -- EGO_VS_VALUES_DISP_ORDER
7360   l_inf_where_clause :=
7361     'vsv.FLEX_VALUE_ID = do.value_set_value_id                 AND ' ||
7362     'do.value_set_id   = ' || x_child_vs_id  || '              AND ' ||
7363     'vsv.value_set_id  = ' || p_parent_vs_id || '              AND ' ||
7364     --
7365     -------------------------- BEGIN Bug Fix 6016429 -------------------------
7366     --
7367     -- We need conditions that ensure only enabled values
7368     -- show up in the USER level UI pages. The 3 criteria for displaying it
7369     -- to the user are:
7370     --
7371     --   (1) The value should be enabled
7372     --
7373     'vsv.ENABLED_CODE  = ''Y''                                 AND ' ||
7374     --   (2) The start date must be in the past
7375     --
7376     '('                                                              ||
7377     ' (vsv.start_date IS NOT NULL AND vsv.start_date   <= SYSDATE) ' ||
7378     ' OR '                                                           ||
7379     ' (vsv.start_date IS NULL) '                                     ||
7380     ') '                                                             ||
7381                                                               'AND ' ||
7382     --   (3) The end date must be in the present or future
7383     --
7384     '( '                                                             ||
7385     ' (vsv.end_date   IS NOT NULL AND vsv.end_date     >= SYSDATE) ' ||
7386     ' OR '                                                           ||
7387     ' (vsv.end_date   IS NULL) '                                     ||
7388 
7389       ------------------------ BEGIN Bug Fix 6148833 -------------------------
7390       --                                                                    --
7391       -- There must be a space before the ORDER BY, otherwise the order by  --
7392       -- removal pattern matching that takes place later will fail.         --
7393       --                                                                    --
7394     ') '                                                             ||
7395       ------------------------ END Bug Fix 6148833 ---------------------------
7396 
7397     -------------------------- END Bug Fix 6016429 ---------------------------
7398 
7399     'ORDER BY do.disp_sequence';
7400 
7401   -- SSARNOBA: As an experiment to fix 6194774, try editing the data type of the
7402   -- value set directly in the table FND_FLEX_VALIDATION_TABLES and then retry
7403   -- the search
7404 
7405   -- Bug fix 6319734 - convert the SELECT clause expressions if necessary.
7406   Build_Child_VS_Select_Exprs (
7407      p_parent_vs_row           => l_parent_vs_row
7408    , x_id_column_type          => l_id_column_type
7409    , x_value_column_type       => l_value_column_type
7410    , x_id_column_name          => l_id_column_name
7411    , x_value_column_name       => l_value_column_name
7412   );
7413 
7414   Insert_Value_Set_Table_Inf (
7415       p_api_version                      => p_api_version
7416     , p_value_set_id                     => x_child_vs_id
7417     , p_table_application_id             => 431
7418     , p_table_name                       => 'EGO_VALUE_SET_VALUES_V vsv , EGO_VS_VALUES_DISP_ORDER do'
7419     , p_value_column_name                => l_value_column_name
7420     , p_value_column_type                => l_value_column_type
7421     , p_value_column_size                => 150
7422     , p_meaning_column_name              => 'vsv.DESCRIPTION'  --Bug 13242028
7423     , p_meaning_column_type              => G_CHAR_DATA_TYPE   --Bug 13242028
7424     , p_meaning_column_size              => 150                --Bug 13242028
7425     , p_id_column_name                   => l_id_column_name
7426     , p_id_column_type                   => l_id_column_type
7427     , p_id_column_size                   => 150
7428     , p_where_order_by                   => l_inf_where_clause
7429     , p_additional_columns               => ''
7430     , p_owner                            => l_owner
7431     , p_init_msg_list                    => p_init_msg_list
7432     , p_commit                           => p_commit
7433     , x_return_status                    => l_return_status_inf
7434     , x_msg_count                        => x_msg_count
7435     , x_msg_data                         => x_msg_data
7436   );
7437 
7438   -- check the return status
7439   IF ( l_return_status_inf <> FND_API.G_RET_STS_SUCCESS AND
7440        x_return_status = FND_API.G_RET_STS_SUCCESS ) THEN
7441 
7442     -- Nothing had gone wrong until now, so set the global
7443     -- return status to the most recent one.
7444     x_return_status := l_return_status_inf;
7445     code_debug('Create_Child_Value_Set(): Insert into FND_FLEX_VALIDATION_TABLES failed.');
7446     RAISE FND_API.G_EXC_ERROR;
7447 
7448   END IF;
7449 
7450   IF FND_API.To_Boolean(p_commit) THEN
7451     COMMIT WORK;
7452   END IF;
7453 
7454   x_return_status := FND_API.G_RET_STS_SUCCESS;
7455 
7456   EXCEPTION
7457     WHEN FND_API.G_EXC_ERROR THEN
7458       IF FND_API.TO_BOOLEAN(p_commit) THEN
7459         ROLLBACK TO Create_Child_Value_Set_PUB;
7460       END IF;
7461       x_return_status := FND_API.G_RET_STS_ERROR;
7462 
7463     WHEN OTHERS THEN
7464       IF FND_API.To_Boolean( p_commit ) THEN
7465         ROLLBACK TO Create_Child_Value_Set_PUB;
7466       END IF;
7467       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7468 
7469       code_debug('SQL_ERR_MSG ' || SQLERRM);
7470 
7471       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
7472       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
7473       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
7474       FND_MSG_PUB.Add;
7475       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7476                                ,p_count   => x_msg_count
7477                                ,p_data    => x_msg_data);
7478 
7479 
7480       code_debug('END Create_Child_Value_Set');
7481 
7482 
7483 END Create_Child_Value_Set;
7484 
7485 
7486 /*-----------------------------------------------------------------------------
7487 
7488   DESCRIPTION
7489     Deletes a child value set
7490 
7491   PARAMETERS
7492     See below.
7493 
7494 -----------------------------------------------------------------------------*/
7495 PROCEDURE Delete_Child_Value_Set (
7496         p_api_version                   IN   NUMBER
7497        ,p_application_id                IN   NUMBER
7498        ,p_child_vs_id                   IN   NUMBER
7499        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
7500        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
7501        ,x_return_status                 OUT NOCOPY VARCHAR2
7502        ,x_errorcode                     OUT NOCOPY NUMBER
7503        ,x_msg_count                     OUT NOCOPY NUMBER
7504        ,x_msg_data                      OUT NOCOPY VARCHAR2
7505 )
7506 IS
7507 BEGIN
7508 
7509   ----------------------------------------------------------------------------
7510   -- Delete from fnd_flex_value_sets                                        --
7511   ----------------------------------------------------------------------------
7512   delete from FND_FLEX_VALUE_SETS where flex_value_set_id = p_child_vs_id;
7513 
7514 
7515   ----------------------------------------------------------------------------
7516   -- Delete from EGO_VALUE_SET_EXT                                          --
7517   ----------------------------------------------------------------------------
7518   delete from ego_value_set_ext where VALUE_SET_ID = p_child_vs_id;
7519 
7520   ----------------------------------------------------------------------------
7521   -- Delete from EGO_VS_VALUES_DISP_ORDER                                   --
7522   ----------------------------------------------------------------------------
7523   delete from ego_vs_values_disp_order where VALUE_SET_ID = p_child_vs_id;
7524 
7525     x_return_status :=  FND_API.G_RET_STS_SUCCESS;
7526 
7527   EXCEPTION
7528   WHEN OTHERS THEN
7529       x_return_status :=  FND_API.G_RET_STS_ERROR;
7530 
7531 END Delete_Child_Value_Set;
7532 
7533 
7534 PROCEDURE Update_Value_Set (
7535         p_api_version                   IN   NUMBER
7536        ,p_value_set_id                  IN   NUMBER
7537        ,p_description                   IN   VARCHAR2
7538        ,p_format_code                   IN   VARCHAR2
7539        ,p_maximum_size                  IN   NUMBER
7540        ,p_maximum_value                 IN   VARCHAR2
7541        ,p_minimum_value                 IN   VARCHAR2
7542        ,p_long_list_flag                IN   FND_FLEX_VALUE_SETS.LONGLIST_FLAG%TYPE
7543                                                                     -- VARCHAR2
7544        ,p_validation_code               IN   VARCHAR2
7545        ,p_owner                         IN   NUMBER     DEFAULT NULL
7546        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
7547        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
7548        ,x_return_status                 OUT NOCOPY VARCHAR2
7549 --       ,x_errorcode                     OUT NOCOPY NUMBER
7550        ,x_msg_count                     OUT NOCOPY NUMBER
7551        ,x_msg_data                      OUT NOCOPY VARCHAR2
7552        ,x_versioned_vs                    OUT NOCOPY VARCHAR2
7553 
7554 ) IS
7555 
7556     l_api_name               VARCHAR2(30);
7557     --we don't use l_api_version yet, but eventually we might:
7558     --if we change required parameters, version goes from n.x to (n+1).x
7559     --if we change optional parameters, version goes from x.n to x.(n+1)
7560     l_api_version            NUMBER;
7561 
7562     l_maximum_size           NUMBER;
7563     l_Sysdate                DATE;
7564     l_OPDXcheck_dummy        VARCHAR(2);
7565     l_owner                  NUMBER;
7566 
7567     l_format_code            FND_FLEX_VALUE_SETS.FORMAT_TYPE%TYPE;
7568     l_maximum_value          FND_FLEX_VALUE_SETS.MAXIMUM_VALUE%TYPE;
7569     l_minimum_value          FND_FLEX_VALUE_SETS.MINIMUM_VALUE%TYPE;
7570 
7571     l_value_set_rec          EGO_VALUE_SETS_V%ROWTYPE;
7572     --changes FOR P4T
7573     isVersionedVS    NUMBER ;
7574 
7575   BEGIN
7576 
7577     l_api_name    := 'Update_Value_Set';
7578     l_api_version := 1.0;
7579     l_Sysdate     := SYSDATE;
7580 
7581     -- Standard start of API savepoint
7582     IF FND_API.To_Boolean(p_commit) THEN
7583       SAVEPOINT Update_Value_Set_PUB;
7584     END IF;
7585 
7586     -- Initialize message list even though we don't currently use it
7587     IF FND_API.To_Boolean(p_init_msg_list) THEN
7588       FND_MSG_PUB.Initialize;
7589     END IF;
7590 
7591     -- Check for call compatibility
7592     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
7593                                         l_api_name, G_PKG_NAME)
7594     THEN
7595       RAISE FND_API.G_EXC_ERROR;
7596     END IF;
7597 
7598     IF (p_owner IS NULL OR p_owner = -1) THEN
7599       l_owner := g_current_user_id;
7600     ELSE
7601       l_owner := p_owner;
7602     END IF;
7603 
7604     IF p_maximum_size IS NULL THEN
7605       l_maximum_size := 0;
7606     ELSE
7607       l_maximum_size := p_maximum_size;
7608     END IF;
7609 
7610     IF (p_format_code    = G_TRANS_TEXT_DATA_TYPE) THEN
7611       -- this should never occur after
7612       l_format_code     := G_CHAR_DATA_TYPE;
7613     ELSE
7614       l_format_code     := NVL(p_format_code,G_CHAR_DATA_TYPE);
7615     END IF;
7616 
7617     -- bug 4137720 trim extra spaces
7618     IF l_format_code <> G_CHAR_DATA_TYPE THEN
7619       IF (p_maximum_value IS NOT NULL) THEN
7620         l_maximum_value := TRIM(p_maximum_value);
7621       ELSE
7622         l_maximum_value := NULL;
7623       END IF;
7624       IF (p_minimum_value IS NOT NULL) THEN
7625         l_minimum_value := TRIM(p_minimum_value);
7626       ELSE
7627         l_minimum_value := NULL;
7628       END IF;
7629     ELSE
7630       l_maximum_value   := p_maximum_value;
7631       l_minimum_value   := p_minimum_value;
7632     END IF;
7633 
7634     -- API not available in FND for updation
7635     -- logged bug 3957430 against FND
7636     UPDATE FND_FLEX_VALUE_SETS
7637        SET DESCRIPTION       = p_description,
7638            LONGLIST_FLAG     = p_long_list_flag,
7639            MINIMUM_VALUE     = l_minimum_value,
7640            MAXIMUM_VALUE     = l_maximum_value,
7641            MAXIMUM_SIZE      = l_maximum_size,
7642            LAST_UPDATED_BY   = l_owner,
7643            LAST_UPDATE_DATE  = l_Sysdate,
7644            LAST_UPDATE_LOGIN = g_current_login_id
7645      WHERE FLEX_VALUE_SET_ID = p_value_set_id;
7646 
7647     --------------------------------------------------------------------------
7648     --                  Update all the child value sets                     --
7649     --------------------------------------------------------------------------
7650 
7651     -- Even though there is strong consistency between child and parent long
7652     -- list display types, it is still necessary to maintain a separate value
7653     -- for the child? It is not sufficient for the child value set's long list
7654     -- display type to be obtained from the parent value set since we do not
7655     -- always distinguish between parent and child value sets (e.g. the user
7656     -- UI rather than the setup workbench UI).
7657 
7658     --
7659     -- REASON FOR SUB-OPTIMAL SYNTAX
7660     --
7661     -- Unfortunately, we cannot use a single update statement on all rows
7662     -- where the ego_value_sets_v.value_set_id is in the list of child value
7663     -- ids. While we can obtain a collection of child value IDs:
7664     --
7665     --   EXECUTE IMMEDIATE
7666     --     'SELECT value_set_id FROM ego_value_sets_v ' ||
7667     --     'WHERE parent_value_set_id = p_value_set_id'
7668     --   BULK COLLECT INTO child_value_set_ids;
7669     --
7670     -- we cannot use it in a SQL Update statement like this:
7671     --
7672     --   UPDATE fnd_flex_value_sets
7673     --   SET    longlist_flag = p_long_list_flag
7674     --   WHERE  flex_value_set_id IN TABLE (child_value_set_ids);
7675     --
7676     -- because the collection's data type
7677     -- is user-defined. We will get a PLS-00642 error since the collection
7678     -- type is locally defined (in the function or the package, as opposed
7679     -- to globally). The SQL compiler cannot determine type safety. Only
7680     -- the PL/SQL compiler can, hence the need for a less efficient
7681     -- cursor approach.
7682 
7683     <<child_value_set_ids_loop>>
7684     FOR l_value_set_rec IN
7685      (SELECT *
7686       FROM   ego_value_sets_v
7687       WHERE  parent_value_set_id = p_value_set_id)
7688     LOOP
7689 
7690       -- Update the long list display type
7691       UPDATE fnd_flex_value_sets
7692       SET    longlist_flag = p_long_list_flag
7693       WHERE  flex_value_set_id = l_value_set_rec.value_set_id;
7694 
7695       -- dbms_output.put_line(' ' || l_value_set_rec.value_set_id);
7696     END LOOP child_value_set_ids_loop;
7697 
7698 
7699     -- Standard check of p_commit
7700     IF FND_API.To_Boolean(p_commit) THEN
7701       COMMIT WORK;
7702     END IF;
7703 
7704     x_return_status := FND_API.G_RET_STS_SUCCESS;
7705    --changes for P4t begin
7706     SELECT Count(*) INTO isVersionedVS FROM ego_flex_valueset_version_b
7707     WHERE flex_value_set_id = p_value_set_id    ;
7708     IF(isVersionedVS > 0) THEN
7709         x_versioned_vs := 'true';
7710     END IF   ;
7711    --changes for P4t complete
7712   EXCEPTION
7713     WHEN FND_API.G_EXC_ERROR THEN
7714       IF FND_API.To_Boolean( p_commit ) THEN
7715         ROLLBACK TO Update_Value_Set_PUB;
7716       END IF;
7717       x_return_status := FND_API.G_RET_STS_ERROR;
7718       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7719                                ,p_count   => x_msg_count
7720                                ,p_data    => x_msg_data);
7721 
7722     WHEN OTHERS THEN
7723       IF FND_API.To_Boolean( p_commit ) THEN
7724         ROLLBACK TO Update_Value_Set_PUB;
7725       END IF;
7726       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7727 
7728       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
7729       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
7730       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
7731       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
7732       FND_MSG_PUB.Add;
7733       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7734                                ,p_count   => x_msg_count
7735                                ,p_data    => x_msg_data);
7736 
7737 END Update_Value_Set;
7738 
7739 
7740 /*-----------------------------------------------------------------------------
7741 
7742   DESCRIPTION
7743     Updates a child value set
7744 
7745   PARAMETERS
7746     See below.
7747 
7748   NOTES
7749     (-) Old child value set IDs get erased.
7750     (-) The value set name cannot be altered after creation.
7751     (-) The 'created' fields will not retain the old data. The fact that the
7752         value set values are recreated every time becomes apparent when \
7753         viewing these fields.
7754 
7755 -----------------------------------------------------------------------------*/
7756 
7757 PROCEDURE Update_Child_Value_Set (
7758         p_api_version                   IN   NUMBER
7759        ,p_value_set_id                  IN   NUMBER
7760        ,p_description                   IN   VARCHAR2
7761        ,p_format_code                   IN   VARCHAR2
7762        ,p_owner                         IN   NUMBER     DEFAULT NULL
7763        ,child_vs_value_ids              IN   EGO_VALUE_SET_VALUE_IDS
7764        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
7765        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
7766        ,x_return_status                 OUT NOCOPY VARCHAR2
7767        ,x_msg_count                     OUT NOCOPY NUMBER
7768        ,x_msg_data                      OUT NOCOPY VARCHAR2
7769 ) IS
7770   l_vs_value_count                      NUMBER;
7771   l_api_name                            VARCHAR2(30);
7772   l_parent_vs_row                       ego_value_sets_v%ROWTYPE;
7773   l_validation_code                     FND_LOOKUP_VALUES.LOOKUP_CODE%TYPE;
7774   l_vs_value_disp_orders                EGO_VS_VALUES_DISP_ORDER_TBL
7775                                             := ego_vs_values_disp_order_tbl();
7776   x_versioned_vs                         NUMBER :=NULL ;
7777 BEGIN
7778 
7779   -- For Debugging
7780   l_api_name      := 'Update_Child_Value_Set';
7781   code_debug(' Started '                || l_api_name           ||
7782              ' with params:'            ||
7783              ' p_value_set_id - '       || p_value_set_id       ||
7784              ' p_description - '        || p_description        );
7785 
7786   -- Standard start of API savepoint
7787   IF FND_API.To_Boolean(p_commit) THEN
7788     SAVEPOINT Update_Child_Value_Set_PUB;
7789   END IF;
7790 
7791 
7792   ----------------------------------------------------------------------------
7793   -- Get unchanged (thus unspecified) but mandatory properties from parent  --
7794   ----------------------------------------------------------------------------
7795 
7796   SELECT pvs.*
7797   INTO   l_parent_vs_row
7798   FROM   ego_value_sets_v vs, ego_value_sets_v pvs
7799   WHERE  vs.parent_value_set_id = pvs.value_set_id
7800    AND   vs.value_set_id = p_value_set_id;
7801 
7802   l_validation_code := l_parent_vs_row.validation_code_admin;
7803 
7804   -- Make sure the validation type is independent or translatable independent.
7805   IF (l_validation_code <> G_INDEPENDENT_VALIDATION_CODE AND
7806       l_validation_code <> G_TRANS_IND_VALIDATION_CODE) THEN
7807       RAISE FND_API.G_EXC_ERROR;
7808   END IF;
7809 
7810 
7811   ----------------------------------------------------------------------------
7812   --                    Update the value set header                         --
7813   ----------------------------------------------------------------------------
7814 
7815   Update_Value_Set (
7816         p_api_version                   => p_api_version
7817        ,p_value_set_id                  => p_value_set_id
7818        ,p_description                   => p_description
7819        ,p_format_code                   => l_parent_vs_row.format_code
7820        ,p_maximum_size                  => l_parent_vs_row.maximum_size
7821        ,p_maximum_value                 => l_parent_vs_row.maximum_value
7822        ,p_minimum_value                 => l_parent_vs_row.minimum_value
7823        ,p_long_list_flag                => l_parent_vs_row.longlist_flag
7824        ,p_validation_code               => l_parent_vs_row.validation_code_admin
7825        ,p_owner                         => p_owner
7826        ,p_init_msg_list                 => p_init_msg_list
7827        ,p_commit                        => p_commit
7828        ,x_return_status                 => x_return_status
7829        ,x_msg_count                     => x_msg_count
7830        ,x_msg_data                      => x_msg_data
7831        --changes for p4t begin
7832       , x_versioned_vs                   => x_versioned_vs
7833        --changes for p4t ends
7834   );
7835 
7836 
7837   -- Nothing to update in EGO_VALUE_SET_EXT (because the parent-child
7838   -- relationship cannot be modified)
7839 
7840   ----------------------------------------------------------------------------
7841   --                    Update EGO_VS_VALUES_DISP_ORDER                     --
7842   ----------------------------------------------------------------------------
7843 
7844   -- Create a collection for the new child VS values' rows
7845 
7846   FOR i IN child_vs_value_ids.FIRST .. child_vs_value_ids.LAST
7847   LOOP
7848     code_debug('Current value is ' || child_vs_value_ids(i));
7849     code_debug('i: ' || i);
7850 
7851     l_vs_value_count := 0;
7852     SELECT COUNT(*) INTO l_vs_value_count
7853     FROM ego_vs_values_disp_order
7854     WHERE value_set_value_id = child_vs_value_ids(i)
7855       AND value_set_id = p_value_set_id;
7856 
7857     -- Add an extra space onto the array
7858     l_vs_value_disp_orders.extend();
7859 
7860     IF (l_vs_value_count > 0) THEN         -- value already existed in child VS
7861       -- Add a row to the collection of new value sets, with the new 'update' attributes
7862       -- copy the old creation info
7863       -- SSARNOBA: I'm not even sure if this is needed
7864 
7865       -- Bug 12382454 : Start
7866       -- select * instead of selecting individual columns
7867       /*
7868       SELECT
7869           value_set_value_id                               -- VALUE_SET_VALUE_ID
7870         , value_set_id                                     -- VALUE_SET_ID
7871         , i                                                -- DISP_SEQUENCE
7872         , created_by                                       -- CREATED_BY
7873         , creation_date                                    -- CREATION_DATE
7874         , p_owner                                          -- LAST_UPDATED_BY
7875         , SYSDATE                                          -- LAST_UPDATE_DATE
7876         , g_current_login_id                               -- LAST_UPDATE_LOGIN
7877         */
7878       SELECT *
7879       /* Bug 12382454 : End */
7880       INTO l_vs_value_disp_orders(i)
7881       FROM ego_vs_values_disp_order
7882       WHERE value_set_value_id = child_vs_value_ids(i) and
7883             value_set_id = p_value_set_id;
7884 
7885       -- Bug 12382454 : Start
7886       -- Override the below values with new values.
7887       l_vs_value_disp_orders(i).DISP_SEQUENCE := i;
7888       l_vs_value_disp_orders(i).LAST_UPDATED_BY := p_owner;
7889       l_vs_value_disp_orders(i).LAST_UPDATE_DATE := SYSDATE;
7890       l_vs_value_disp_orders(i).LAST_UPDATE_LOGIN := g_current_login_id;
7891       -- Bug 12382454 : End
7892     ELSE
7893       -- Add a row to the collection of new value sets
7894       -- with new creation info.
7895 
7896       -- Bug 12382454 : Start
7897       -- Instead of using the select query, will assign the values to individual fields of the record.
7898       l_vs_value_disp_orders(i).VALUE_SET_VALUE_ID := child_vs_value_ids(i);
7899       l_vs_value_disp_orders(i).VALUE_SET_ID := p_value_set_id;
7900       l_vs_value_disp_orders(i).DISP_SEQUENCE := i;
7901       l_vs_value_disp_orders(i).CREATED_BY := p_owner;
7902       l_vs_value_disp_orders(i).CREATION_DATE := SYSDATE;
7903       l_vs_value_disp_orders(i).LAST_UPDATED_BY := p_owner;
7904       l_vs_value_disp_orders(i).LAST_UPDATE_DATE := SYSDATE;
7905       l_vs_value_disp_orders(i).LAST_UPDATE_LOGIN := g_current_login_id;
7906 
7907       /*
7908       SELECT
7909           child_vs_value_ids(i)                            -- VALUE_SET_VALUE_ID
7910         , p_value_set_id                                   -- VALUE_SET_ID
7911         , i                                                -- DISP_SEQUENCE
7912         , p_owner                                          -- CREATED_BY
7913         , SYSDATE                                          -- CREATION_DATE
7914         , p_owner                                          -- LAST_UPDATED_BY
7915         , SYSDATE                                          -- LAST_UPDATE_DATE
7916         , g_current_login_id                               -- LAST_UPDATE_LOGIN
7917       INTO l_vs_value_disp_orders(i)
7918       FROM dual;
7919       */
7920       -- Bug 12382454 : End
7921     END IF;
7922   END LOOP;
7923 
7924   -- Delete all the existing values from the child VS
7925   DELETE FROM ego_vs_values_disp_order
7926   WHERE value_set_id = p_value_set_id;
7927 
7928   -- Insert the new values for the child VS from the collection
7929   FORALL j IN l_vs_value_disp_orders.FIRST ..
7930               l_vs_value_disp_orders.LAST
7931     INSERT INTO ego_vs_values_disp_order
7932     VALUES l_vs_value_disp_orders(j);
7933   -- END FORALL
7934 
7935 
7936   x_return_status := FND_API.G_RET_STS_SUCCESS;
7937 
7938   EXCEPTION
7939     WHEN OTHERS THEN
7940       IF FND_API.To_Boolean( p_commit ) THEN
7941         ROLLBACK TO Update_Child_Value_Set_PUB;
7942       END IF;
7943       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7944 
7945       code_debug('SQL_ERR_MSG ' || SQLERRM);
7946 
7947       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
7948       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
7949       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
7950       FND_MSG_PUB.Add;
7951       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
7952                                ,p_count   => x_msg_count
7953                                ,p_data    => x_msg_data);
7954 
7955 END;
7956 
7957 ----------------------------------------------------------------------
7958 
7959 PROCEDURE Insert_Value_Set_Table_Inf (
7960         p_api_version                   IN   NUMBER
7961        ,p_value_set_id                  IN   NUMBER
7962        ,p_table_application_id          IN   NUMBER
7963        ,p_table_name                    IN   VARCHAR2
7964        ,p_value_column_name             IN   VARCHAR2
7965        ,p_value_column_type             IN   VARCHAR2
7966        ,p_value_column_size             IN   NUMBER
7967        ,p_meaning_column_name           IN   VARCHAR2
7968        ,p_meaning_column_type           IN   VARCHAR2
7969        ,p_meaning_column_size           IN   NUMBER
7970        ,p_id_column_name                IN   VARCHAR2
7971        ,p_id_column_type                IN   VARCHAR2
7972        ,p_id_column_size                IN   NUMBER
7973        ,p_where_order_by                IN   VARCHAR2
7974        ,p_additional_columns            IN   VARCHAR2
7975        ,p_owner                         IN   NUMBER     DEFAULT NULL
7976        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
7977        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
7978        ,x_return_status                 OUT NOCOPY VARCHAR2
7979        ,x_msg_count                     OUT NOCOPY NUMBER
7980        ,x_msg_data                      OUT NOCOPY VARCHAR2
7981 ) IS
7982 
7983     l_api_name               VARCHAR2(30);
7984     --we don't use l_api_version yet, but eventually we might:
7985     --if we change required parameters, version goes from n.x to (n+1).x
7986     --if we change optional parameters, version goes from x.n to x.(n+1)
7987     l_api_version            NUMBER;
7988     l_Sysdate                DATE;
7989     l_owner                  NUMBER;
7990     l_where_order_by         VARCHAR(2000);
7991 
7992   BEGIN
7993 
7994     l_api_name      := 'Insert_Value_Set_Table_Inf';
7995     l_api_version   := 1.0;
7996     l_Sysdate       := SYSDATE;
7997     code_debug(l_api_name ||' start ');
7998 
7999     -- Standard start of API savepoint
8000     IF FND_API.To_Boolean(p_commit) THEN
8001       SAVEPOINT Insert_Value_Set_Table_Inf_PUB;
8002     END IF;
8003 
8004     -- Initialize message list even though we don't currently use it
8005     IF FND_API.To_Boolean(p_init_msg_list) THEN
8006       FND_MSG_PUB.Initialize;
8007     END IF;
8008 
8009     -- Check for call compatibility
8010     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
8011                                         l_api_name, G_PKG_NAME)
8012     THEN
8013       RAISE FND_API.G_EXC_ERROR;
8014     END IF;
8015 
8016     IF (p_owner IS NULL OR p_owner = -1) THEN
8017       l_owner := g_current_user_id;
8018     ELSE
8019       l_owner := p_owner;
8020     END IF;
8021 
8022     ---------------------- BEGIN Bug fix 6148833 -----------------------------
8023 
8024     -- Since we can't modify IN function arguments, we have to make a copy
8025     -- of the clause.
8026     l_where_order_by         := p_where_order_by;
8027 
8028     -- Insert a space before an ORDER BY clause, so that
8029     -- order by elimination takes place for inner query blocks.
8030     Insert_Order_By_Space (
8031       p_where_order_by       => l_where_order_by
8032     );
8033 
8034     ---------------------- END Bug fix 6148833 -------------------------------
8035 
8036     code_debug(l_api_name ||' inserting data into fnd_flex_validation_tables ');
8037     INSERT INTO fnd_flex_validation_tables
8038     (
8039         FLEX_VALUE_SET_ID
8040        ,APPLICATION_TABLE_NAME
8041        ,VALUE_COLUMN_NAME
8042        ,VALUE_COLUMN_TYPE
8043        ,VALUE_COLUMN_SIZE
8044        ,COMPILED_ATTRIBUTE_COLUMN_NAME
8045        ,ENABLED_COLUMN_NAME
8046        ,HIERARCHY_LEVEL_COLUMN_NAME
8047        ,START_DATE_COLUMN_NAME
8048        ,END_DATE_COLUMN_NAME
8049        ,SUMMARY_ALLOWED_FLAG
8050        ,SUMMARY_COLUMN_NAME
8051        ,ID_COLUMN_NAME
8052        ,ID_COLUMN_TYPE
8053        ,ID_COLUMN_SIZE
8054        ,MEANING_COLUMN_NAME
8055        ,MEANING_COLUMN_TYPE
8056        ,MEANING_COLUMN_SIZE
8057        ,TABLE_APPLICATION_ID
8058        ,ADDITIONAL_WHERE_CLAUSE
8059        ,ADDITIONAL_QUICKPICK_COLUMNS
8060        ,CREATED_BY
8061        ,CREATION_DATE
8062        ,LAST_UPDATED_BY
8063        ,LAST_UPDATE_DATE
8064        ,LAST_UPDATE_LOGIN
8065     )
8066     VALUES
8067     (
8068         p_value_set_id          --FLEX_VALUE_SET_ID
8069        ,p_table_name            --APPLICATION_TABLE_NAME
8070        ,p_value_column_name     --VALUE_COLUMN_NAME
8071        ,p_value_column_type     --VALUE_COLUMN_TYPE
8072        ,p_value_column_size     --VALUE_COLUMN_SIZE
8073 --       ,p_value_column_name     --COMPILED_ATTRIBUTE_COLUMN_NAME
8074        ,'NULL'                    --COMPILED_ATTRIBUTE_COLUMN_NAME
8075 --       ,'Y'                     --ENABLED_COLUMN_NAME
8076        ,'''Y'''                 --ENABLED_COLUMN_NAME
8077        ,'NULL'                  --HIERARCHY_LEVEL_COLUMN_NAME
8078 --       ,'START_DATE_COLUMN_NAME' --START_DATE_COLUMN_NAME
8079 --       ,'END_DATE_COLUMN_NAME'   --END_DATE_COLUMN_NAME
8080        ,'TO_DATE(NULL)'         --START_DATE_COLUMN_NAME
8081        ,'TO_DATE(NULL)'         --END_DATE_COLUMN_NAME
8082        ,'N'                     --SUMMARY_ALLOWED_FLAG
8083        ,'''N'''                 --SUMMARY_COLUMN_NAME
8084        ,p_id_column_name        --ID_COLUMN_NAME
8085        ,p_id_column_type        --ID_COLUMN_SIZE
8086        ,p_id_column_size        --ID_COLUMN_TYPE
8087        ,p_meaning_column_name   --MEANING_COLUMN_NAME
8088        ,p_meaning_column_type   --MEANING_COLUMN_TYPE
8089        ,p_meaning_column_size   --MEANING_COLUMN_SIZE
8090        ,p_table_application_id  --TABLE_APPLICATION_ID
8091        ,l_where_order_by        --ADDITIONAL_WHERE_CLAUSE
8092        ,''                      --ADDITIONAL_QUICKPICK_COLUMNS
8093        ,l_owner                 --CREATED_BY
8094        ,l_Sysdate               --CREATION_DATE
8095        ,l_owner                 --LAST_UPDATED_BY
8096        ,l_Sysdate               --LAST_UPDATE_DATE
8097        ,g_current_login_id      --LAST_UPDATE_LOGIN
8098     );
8099 
8100     code_debug(l_api_name ||' inserting data into fnd_flex_validation_tables COMPLETED ');
8101     -- Standard check of p_commit
8102     IF FND_API.To_Boolean(p_commit) THEN
8103       COMMIT WORK;
8104     END IF;
8105 
8106     x_return_status := FND_API.G_RET_STS_SUCCESS;
8107 
8108   EXCEPTION
8109     WHEN FND_API.G_EXC_ERROR THEN
8110       code_debug(l_api_name ||' EXCEPTION desired ');
8111       IF FND_API.To_Boolean(p_commit) THEN
8112         ROLLBACK TO Insert_Value_Set_Table_Inf_PUB;
8113       END IF;
8114       x_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
8115       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8116                                ,p_count   => x_msg_count
8117                                ,p_data    => x_msg_data);
8118     WHEN OTHERS THEN
8119       code_debug(l_api_name ||' EXCEPTION  OTHERS '|| SQLERRM);
8120       IF FND_API.To_Boolean(p_commit) THEN
8121         ROLLBACK TO Insert_Value_Set_Table_Inf_PUB;
8122       END IF;
8123       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8124 
8125       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
8126       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
8127       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
8128       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
8129       FND_MSG_PUB.Add;
8130       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8131                                ,p_count   => x_msg_count
8132                                ,p_data    => x_msg_data);
8133 
8134 END Insert_Value_Set_table_Inf;
8135 
8136 ----------------------------------------------------------------------
8137 
8138 PROCEDURE Update_Value_Set_Table_Inf (
8139         p_api_version                   IN   NUMBER
8140        ,p_value_set_id                  IN   NUMBER
8141        ,p_table_application_id          IN   NUMBER
8142        ,p_table_name                    IN   VARCHAR2
8143        ,p_value_column_name             IN   VARCHAR2
8144        ,p_value_column_type             IN   VARCHAR2
8145        ,p_value_column_size             IN   NUMBER
8146        ,p_meaning_column_name           IN   VARCHAR2
8147        ,p_meaning_column_type           IN   VARCHAR2
8148        ,p_meaning_column_size           IN   NUMBER
8149        ,p_id_column_name                IN   VARCHAR2
8150        ,p_id_column_type                IN   VARCHAR2
8151        ,p_id_column_size                IN   NUMBER
8152        ,p_where_order_by                IN   VARCHAR2
8153        ,p_additional_columns            IN   VARCHAR2
8154        ,p_owner                         IN   NUMBER     DEFAULT NULL
8155        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8156        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8157        ,x_return_status                 OUT NOCOPY VARCHAR2
8158        ,x_msg_count                     OUT NOCOPY NUMBER
8159        ,x_msg_data                      OUT NOCOPY VARCHAR2
8160 ) IS
8161 
8162     l_api_name               VARCHAR2(30);
8163     --we don't use l_api_version yet, but eventually we might:
8164     --if we change required parameters, version goes from n.x to (n+1).x
8165     --if we change optional parameters, version goes from x.n to x.(n+1)
8166     l_api_version            NUMBER;
8167     l_Sysdate                DATE;
8168     l_owner                  NUMBER;
8169     l_where_order_by         VARCHAR(2000);
8170 
8171   BEGIN
8172 
8173     l_api_name      := 'Update_Value_Set_Table_Inf';
8174     l_api_version   := 1.0;
8175     l_Sysdate       := SYSDATE;
8176 
8177     code_debug(l_api_name ||' start ');
8178     -- Standard start of API savepoint
8179     IF FND_API.To_Boolean(p_commit) THEN
8180       SAVEPOINT Update_Value_Set_Table_Inf_PUB;
8181     END IF;
8182 
8183     -- Initialize message list even though we don't currently use it
8184     IF FND_API.To_Boolean(p_init_msg_list) THEN
8185       FND_MSG_PUB.Initialize;
8186     END IF;
8187 
8188     -- Check for call compatibility
8189     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
8190                                         l_api_name, G_PKG_NAME)
8191     THEN
8192       RAISE FND_API.G_EXC_ERROR;
8193     END IF;
8194 
8195     IF (p_owner IS NULL OR p_owner = -1) THEN
8196       l_owner := g_current_user_id;
8197     ELSE
8198       l_owner := p_owner;
8199     END IF;
8200 
8201     ---------------------- BEGIN Bug fix 6148833 -----------------------------
8202 
8203     -- Since we can't modify IN function arguments, we have to make a copy
8204     -- of the clause.
8205     l_where_order_by         := p_where_order_by;
8206 
8207     -- Insert a space before an ORDER BY clause, so that
8208     -- order by elimination takes place for inner query blocks.
8209     Insert_Order_By_Space (
8210       p_where_order_by       => l_where_order_by
8211     );
8212 
8213     ---------------------- END Bug fix 6148833 -------------------------------
8214 
8215     code_debug(l_api_name ||' calling update fnd_flex_validation_tables ');
8216     -- no API available from fnd logged bug 3957430
8217     UPDATE FND_FLEX_VALIDATION_TABLES
8218        SET APPLICATION_TABLE_NAME = p_table_name,
8219            VALUE_COLUMN_NAME = p_value_column_name,
8220            VALUE_COLUMN_TYPE = p_value_column_type,
8221            VALUE_COLUMN_SIZE = p_value_column_size,
8222 --           COMPILED_ATTRIBUTE_COLUMN_NAME = p_value_column_name,
8223 --           ENABLED_COLUMN_NAME = 'Y',
8224 --           HIERARCHY_LEVEL_COLUMN_NAME = 'Y',
8225 --           START_DATE_COLUMN_NAME = 'START_DATE_COLUMN_NAME',
8226 --           END_DATE_COLUMN_NAME  = 'END_DATE_COLUMN_NAME',
8227 --           SUMMARY_ALLOWED_FLAG = 'N',
8228 --           SUMMARY_COLUMN_NAME = 'N',
8229            ID_COLUMN_NAME = p_id_column_name,
8230            ID_COLUMN_SIZE = p_id_column_size,
8231            ID_COLUMN_TYPE = p_id_column_type,
8232            MEANING_COLUMN_NAME = p_meaning_column_name,
8233            MEANING_COLUMN_SIZE = p_meaning_column_size,
8234            MEANING_COLUMN_TYPE = p_meaning_column_type,
8235            TABLE_APPLICATION_ID = p_table_application_id,
8236            ADDITIONAL_WHERE_CLAUSE = l_where_order_by,
8237 --           ADDITIONAL_QUICKPICK_COLUMNS = '',
8238            LAST_UPDATED_BY = l_owner,
8239            LAST_UPDATE_DATE = l_Sysdate,
8240            LAST_UPDATE_LOGIN = g_current_login_id
8241      WHERE FLEX_VALUE_SET_ID = p_value_set_id;
8242 
8243     code_debug(l_api_name ||' calling update fnd_flex_validation_tables COMPLETED ');
8244     -- Standard check of p_commit
8245     IF FND_API.To_Boolean(p_commit) THEN
8246       COMMIT WORK;
8247     END IF;
8248 
8249     x_return_status := FND_API.G_RET_STS_SUCCESS;
8250 
8251   EXCEPTION
8252     WHEN FND_API.G_EXC_ERROR THEN
8253       code_debug(l_api_name ||' EXCEPTION desired ');
8254       IF FND_API.To_Boolean(p_commit) THEN
8255         ROLLBACK TO Update_Value_Set_Table_Inf_PUB;
8256       END IF;
8257       x_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
8258       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8259                                ,p_count   => x_msg_count
8260                                ,p_data    => x_msg_data);
8261     WHEN OTHERS THEN
8262       code_debug(l_api_name ||' EXCEPTION  OTHERS '|| SQLERRM);
8263       IF FND_API.To_Boolean(p_commit) THEN
8264         ROLLBACK TO Update_Value_Set_Table_Inf_PUB;
8265       END IF;
8266       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8267 
8268       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
8269       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
8270       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
8271       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
8272       FND_MSG_PUB.Add;
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 
8277 END Update_Value_Set_table_Inf;
8278 
8279 ----------------------------------------------------------------------
8280 
8281                     --------------------------
8282                     -- Value Set Value APIs --
8283                     --------------------------
8284 
8285 ----------------------------------------------------------------------
8286 PROCEDURE Create_Value_Set_Val (
8287         p_api_version                   IN   NUMBER
8288        ,p_value_set_name                IN   VARCHAR2
8289        ,p_internal_name                 IN   VARCHAR2
8290        ,p_display_name                  IN   VARCHAR2
8291        ,p_description                   IN   VARCHAR2
8292        ,p_sequence                      IN   NUMBER
8293        ,p_start_date                    IN   DATE
8294        ,p_end_date                      IN   DATE
8295        ,p_enabled                       IN   VARCHAR2
8296        ,p_owner                         IN   NUMBER     DEFAULT NULL
8297        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8298        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8299        ,x_return_status                 OUT NOCOPY VARCHAR2
8300        ,x_msg_count                     OUT NOCOPY NUMBER
8301        ,x_msg_data                      OUT NOCOPY VARCHAR2
8302        ,x_is_versioned                  OUT NOCOPY VARCHAR2
8303        ,x_valueSetId                      OUT NOCOPY VARCHAR2
8304 
8305 ) IS
8306 
8307 
8308 
8309 
8310     l_api_name               VARCHAR2(30);
8311     --we don't use l_api_version yet, but eventually we might:
8312     --if we change required parameters, version goes from n.x to (n+1).x
8313     --if we change optional parameters, version goes from x.n to x.(n+1)
8314     l_api_version            NUMBER;
8315     l_storage_value          VARCHAR2(32767);
8316 
8317     l_flex_value_id          FND_FLEX_VALUES.flex_value_id%TYPE;
8318 --    l_Sysdate                DATE;
8319     l_rowid                  VARCHAR2(100);
8320     l_owner                  NUMBER;
8321     x_flex_Value_Set_Id       FND_FLEX_VALUE_SETS.flex_value_set_id%TYPE  ;
8322     VersionedValueSet    NUMBER ;
8323      L_VALUE_EXIST        NUMBER;
8324 
8325 
8326 BEGIN
8327     SELECT FLEX_VALUE_SET_ID INTO
8328     X_FLEX_VALUE_SET_ID FROM FND_FLEX_VALUE_SETS WHERE FLEX_VALUE_SET_NAME = P_VALUE_SET_NAME ;
8329 
8330    SELECT COUNT(*) INTO L_VALUE_EXIST FROM FND_FLEX_VALUES WHERE FLEX_VALUE_SET_ID = X_FLEX_VALUE_SET_ID
8331    AND FLEX_VALUE = P_INTERNAL_NAME ;
8332 
8333   IF(L_VALUE_EXIST < 1 ) THEN
8334 
8335         EGO_EXT_FWK_PUB.Create_Value_Set_Val(
8336         p_api_version                   =>  p_api_version
8337        ,p_value_set_name                => p_value_set_name
8338        ,p_internal_name                => p_internal_name
8339        ,p_display_name                  => p_display_name
8340        ,p_description                   => p_description
8341        ,p_sequence                       =>p_sequence
8342        ,p_start_date                   =>p_start_date
8343        ,p_end_date                     => p_end_date
8344        ,p_enabled                       => p_enabled
8345        ,p_owner                         =>p_owner
8346        ,p_init_msg_list                =>p_init_msg_list
8347        ,p_commit                       =>  p_commit
8348        ,x_return_status                  =>x_return_status
8349        ,x_msg_count                    => x_msg_count
8350        ,x_msg_data                      => x_msg_data
8351         );
8352 
8353 
8354        COMMIT;
8355         END IF ;
8356 
8357      IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8358       RAISE FND_API.G_EXC_ERROR;
8359 
8360 
8361     END IF;
8362 
8363     SELECT count (*) INTO VersionedValueSet FROM EGO_FLEX_VALUESET_VERSION_B WHERE
8364     FLEX_VALUE_SET_ID = x_flex_Value_Set_Id ;
8365 
8366        x_valueSetId := x_flex_Value_Set_Id;
8367 
8368     IF  VersionedValueSet >= 1 THEN
8369 
8370 
8371 
8372     SELECT FLEX_VALUE_ID INTO l_flex_value_id FROM FND_FLEX_VALUES
8373     WHERE FLEX_VALUE_SET_ID = x_flex_Value_Set_Id AND FLEX_VALUE like p_internal_name  ;
8374 
8375 
8376     INSERT INTO EGO_FLEX_VALUE_VERSION_B (FLEX_VALUE_SET_ID, FLEX_VALUE_ID, VERSION_SEQ_ID,
8377     sequence,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,LAST_UPDATE_DATE,LAST_UPDATE_LOGIN)
8378     VALUES (x_flex_Value_Set_Id, l_flex_value_id,0,p_sequence,fnd_global.party_id,SYSDATE,
8379      fnd_global.party_id,SYSDATE,fnd_global.login_id);
8380 
8381 
8382    INSERT INTO EGO_FLEX_VALUE_VERSION_TL (FLEX_VALUE_ID,VERSION_SEQ_ID,LAST_UPDATE_DATE,LAST_UPDATED_BY,
8383     CREATION_DATE,CREATED_BY,LAST_UPDATE_LOGIN,DESCRIPTION,FLEX_VALUE_MEANING,LANGUAGE,
8384     SOURCE_LANG
8385   ) SELECT
8386     L_FLEX_VALUE_ID,0,SYSDATE,FND_GLOBAL.PARTY_ID,SYSDATE,FND_GLOBAL.PARTY_ID,FND_GLOBAL.LOGIN_ID,
8387     P_DESCRIPTION,P_DISPLAY_NAME,L.LANGUAGE_CODE,USERENV('LANG')
8388      FROM FND_LANGUAGES L
8389      WHERE L.INSTALLED_FLAG IN ('I', 'B' )   ;
8390 
8391      x_is_versioned :='true';
8392      x_return_status := FND_API.G_RET_STS_SUCCESS;
8393 
8394       COMMIT;
8395     END IF    ;
8396 END Create_Value_Set_Val;
8397 
8398 PROCEDURE Create_Value_Set_Val (
8399         p_api_version                   IN   NUMBER
8400        ,p_value_set_name                IN   VARCHAR2
8401        ,p_internal_name                 IN   VARCHAR2
8402        ,p_display_name                  IN   VARCHAR2
8403        ,p_description                   IN   VARCHAR2
8404        ,p_sequence                      IN   NUMBER
8405        ,p_start_date                    IN   DATE
8406        ,p_end_date                      IN   DATE
8407        ,p_enabled                       IN   VARCHAR2
8408        ,p_owner                         IN   NUMBER     DEFAULT NULL
8409        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8410        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8411        ,x_return_status                 OUT NOCOPY VARCHAR2
8412        ,x_msg_count                     OUT NOCOPY NUMBER
8413        ,x_msg_data                      OUT NOCOPY VARCHAR2
8414 
8415 ) IS
8416 
8417 
8418     l_api_name               VARCHAR2(30);
8419     --we don't use l_api_version yet, but eventually we might:
8420     --if we change required parameters, version goes from n.x to (n+1).x
8421     --if we change optional parameters, version goes from x.n to x.(n+1)
8422     l_api_version            NUMBER;
8423     l_storage_value          VARCHAR2(32767);
8424 
8425     l_flex_value_id          FND_FLEX_VALUES.flex_value_id%TYPE;
8426 --    l_Sysdate                DATE;
8427     l_rowid                  VARCHAR2(100);
8428     l_owner                  NUMBER;
8429     flex_Value_Set_Id       FND_FLEX_VALUE_SETS.flex_value_set_id%TYPE  ;
8430     VersionedValueSet    NUMBER ;
8431 
8432 
8433   BEGIN
8434 
8435 
8436     l_api_name      := 'Create_Value_Set_Val';
8437     l_api_version   := 1.0;
8438 
8439     -- Standard start of API savepoint
8440     IF FND_API.To_Boolean(p_commit) THEN
8441       SAVEPOINT Create_Value_Set_Val_PUB;
8442     END IF;
8443 
8444     -- Initialize message list even though we don't currently use it
8445     IF FND_API.To_Boolean(p_init_msg_list) THEN
8446       FND_MSG_PUB.Initialize;
8447     END IF;
8448 
8449     -- Check for call compatibility
8450     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
8451                                         l_api_name, G_PKG_NAME)
8452     THEN
8453       RAISE FND_API.G_EXC_ERROR;
8454     END IF;
8455 
8456     IF (p_owner IS NULL OR p_owner = -1) THEN
8457       l_owner := g_current_user_id;
8458     ELSE
8459       l_owner := p_owner;
8460     END IF;
8461 
8462 /***
8463     INSERT INTO fnd_lookup_values
8464     (
8465         LOOKUP_TYPE
8466        ,LANGUAGE
8467        ,LOOKUP_CODE
8468        ,MEANING
8469        ,DESCRIPTION
8470        ,ENABLED_FLAG
8471        ,START_DATE_ACTIVE
8472        ,END_DATE_ACTIVE
8473        ,SOURCE_LANG
8474        ,SECURITY_GROUP_ID
8475        ,VIEW_APPLICATION_ID
8476        ,TERRITORY_CODE
8477        ,ATTRIBUTE_CATEGORY
8478        ,ATTRIBUTE1
8479        ,ATTRIBUTE2
8480        ,ATTRIBUTE3
8481        ,ATTRIBUTE4
8482        ,ATTRIBUTE5
8483        ,ATTRIBUTE6
8484        ,ATTRIBUTE7
8485        ,ATTRIBUTE8
8486        ,ATTRIBUTE9
8487        ,ATTRIBUTE10
8488        ,ATTRIBUTE11
8489        ,ATTRIBUTE12
8490        ,ATTRIBUTE13
8491        ,ATTRIBUTE14
8492        ,ATTRIBUTE15
8493        ,TAG
8494        ,CREATED_BY
8495        ,CREATION_DATE
8496        ,LAST_UPDATED_BY
8497        ,LAST_UPDATE_DATE
8498        ,LAST_UPDATE_LOGIN
8499     )
8500     SELECT
8501        'EGO_EF_'||p_value_set_name||'_TYPE' --LOOKUP_TYPE
8502        ,L.LANGUAGE_CODE         --LANGUAGE
8503        ,p_internal_name         --LOOKUP_CODE
8504        ,p_display_name          --MEANING
8505        ,p_description           --DESCRIPTION
8506        ,p_enabled               --ENABLED_FLAG
8507        ,p_start_date            --START_DATE_ACTIVE
8508        ,p_end_date              --END_DATE_ACTIVE
8509        ,USERENV('LANG')         --SOURCE_LANG
8510        ,0                       --SECURITY_GROUP_ID
8511        ,p_application_id        --VIEW_APPLICATION_ID
8512        ,''                      --TERRITORY_CODE
8513        ,''                      --ATTRIBUTE_CATEGORY
8514        ,''                      --ATTRIBUTE1
8515        ,''                      --ATTRIBUTE2
8516        ,''                      --ATTRIBUTE3
8517        ,''                      --ATTRIBUTE4
8518        ,''                      --ATTRIBUTE5
8519        ,''                      --ATTRIBUTE6
8520        ,''                      --ATTRIBUTE7
8521        ,''                      --ATTRIBUTE8
8522        ,''                      --ATTRIBUTE9
8523        ,''                      --ATTRIBUTE10
8524        ,''                      --ATTRIBUTE11
8525        ,''                      --ATTRIBUTE12
8526        ,''                      --ATTRIBUTE13
8527        ,''                      --ATTRIBUTE14
8528        ,''                      --ATTRIBUTE15
8529        ,to_char(p_sequence)     --TAG
8530        ,g_current_user_id       --CREATED_BY
8531        ,l_Sysdate               --CREATION_DATE
8532        ,g_current_user_id       --LAST_UPDATED_BY
8533        ,l_Sysdate               --LAST_UPDATE_DATE
8534        ,g_current_login_id      --LAST_UPDATE_LOGIN
8535     FROM FND_LANGUAGES  L
8536     WHERE L.INSTALLED_FLAG in ('I', 'B');
8537 ***/
8538 
8539 
8540       Process_Value_Set_Val (
8541         p_transaction_type      => 'CREATE'
8542        ,p_value_set_name        => p_value_set_name
8543        ,p_internal_name         => p_internal_name
8544        ,p_display_name          => p_display_name
8545        ,p_description           => p_description
8546        ,p_sequence              => p_sequence
8547        ,p_start_date            => p_start_date
8548        ,p_end_date              => p_end_date
8549        ,p_enabled               => p_enabled
8550        ,p_owner                 => l_owner
8551        ,x_return_status         => x_return_status
8552        );
8553 
8554 
8555     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8556       RAISE FND_API.G_EXC_ERROR;
8557 
8558     END IF;
8559 
8560 
8561     IF FND_API.To_Boolean(p_commit) THEN
8562       COMMIT WORK;
8563     END IF;
8564 
8565     x_return_status := FND_API.G_RET_STS_SUCCESS;
8566 
8567   EXCEPTION
8568     WHEN FND_API.G_EXC_ERROR THEN
8569       code_debug( l_api_name || ' EXCEPTION - FND_API.G_EXC_ERROR ');
8570       IF FND_API.To_Boolean(p_commit) THEN
8571         ROLLBACK TO Create_Value_Set_Val_PUB;
8572       END IF;
8573       x_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
8574       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8575                                ,p_count   => x_msg_count
8576                                ,p_data    => x_msg_data);
8577     WHEN OTHERS THEN
8578       code_debug( l_api_name || ' EXCEPTION - OTHERS ');
8579       code_debug (l_api_name|| sqlerrm );
8580       IF FND_API.To_Boolean(p_commit) THEN
8581         ROLLBACK TO Create_Value_Set_Val_PUB;
8582       END IF;
8583       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8584 
8585       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
8586       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
8587       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
8588       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
8589       FND_MSG_PUB.Add;
8590       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8591                                ,p_count   => x_msg_count
8592                                ,p_data    => x_msg_data);
8593 
8594 END Create_Value_Set_Val;
8595 
8596 ----------------------------------------------------------------------
8597 
8598 PROCEDURE Update_Value_Set_Val (
8599         p_api_version                   IN   NUMBER
8600        ,p_value_set_name                IN   VARCHAR2
8601        ,p_internal_name                 IN   VARCHAR2
8602        ,p_display_name                  IN   VARCHAR2
8603        ,p_description                   IN   VARCHAR2
8604        ,p_sequence                      IN   NUMBER
8605        ,p_start_date                    IN   DATE
8606        ,p_end_date                      IN   DATE
8607        ,p_enabled                       IN   VARCHAR2
8608        ,p_owner                         IN   NUMBER     DEFAULT NULL
8609        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
8610        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
8611        ,x_return_status                 OUT NOCOPY VARCHAR2
8612        ,x_msg_count                     OUT NOCOPY NUMBER
8613        ,x_msg_data                      OUT NOCOPY VARCHAR2
8614        ,x_is_versioned                  OUT NOCOPY VARCHAR2
8615          ,x_valueSetId                    OUT NOCOPY VARCHAR2
8616 
8617 
8618 ) IS
8619 
8620     l_api_name               VARCHAR2(30);
8621     --we don't use l_api_version yet, but eventually we might:
8622     --if we change required parameters, version goes from n.x to (n+1).x
8623     --if we change optional parameters, version goes from x.n to x.(n+1)
8624     l_api_version            NUMBER;
8625     l_owner                  NUMBER;
8626     l_value_set_id      FND_FLEX_VALUE_SETS.flex_value_set_id%TYPE  ;
8627     l_values_count           NUMBER;
8628      l_flex_value_id     fnd_flex_values.flex_value_id%type;
8629   BEGIN
8630 
8631     l_api_name      := 'Update_Value_Set_Val';
8632     l_api_version   := 1.0;
8633 
8634     -- Standard start of API savepoint
8635     IF FND_API.To_Boolean(p_commit) THEN
8636       SAVEPOINT Update_Value_Set_Val_PUB;
8637     END IF;
8638 
8639     -- Initialize message list even though we don't currently use it
8640     IF FND_API.To_Boolean(p_init_msg_list) THEN
8641       FND_MSG_PUB.Initialize;
8642     END IF;
8643 
8644     -- Check for call compatibility
8645     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
8646                                         l_api_name, G_PKG_NAME)
8647     THEN
8648       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8649     END IF;
8650 
8651     IF (p_owner IS NULL OR p_owner = -1) THEN
8652       l_owner := g_current_user_id;
8653     ELSE
8654       l_owner := p_owner;
8655     END IF;
8656 /***
8657     l_lookup_type := 'EGO_EF_'||p_value_set_name||'_TYPE';
8658 
8659     UPDATE FND_LOOKUP_VALUES
8660        SET MEANING = p_display_name,
8661            DESCRIPTION = p_description,
8662            ENABLED_FLAG = p_enabled,
8663            START_DATE_ACTIVE = p_start_date,
8664            END_DATE_ACTIVE = p_end_date,
8665            TAG = TO_CHAR(p_sequence),
8666            LAST_UPDATED_BY = g_current_user_id,
8667            LAST_UPDATE_DATE = l_Sysdate,
8668            LAST_UPDATE_LOGIN = g_current_login_id,
8669            SOURCE_LANG = USERENV('LANG')
8670      WHERE LOOKUP_TYPE = l_lookup_type
8671        AND LOOKUP_CODE = p_internal_name
8672        AND VIEW_APPLICATION_ID = p_application_id
8673        --AND LANGUAGE = USERENV('LANG');
8674        AND USERENV('LANG') IN (LANGUAGE, SOURCE_LANG);
8675 ***/
8676  SELECT flex_value_set_id INTO l_value_set_id   FROM fnd_flex_value_sets
8677         WHERE flex_value_set_name = p_value_set_name;
8678 
8679   SELECT flex_value_id INTO l_flex_value_id FROM fnd_flex_values
8680       WHERE flex_value_set_id =  l_value_set_id AND flex_value = p_internal_name;
8681 
8682 
8683      Process_Value_Set_Val (
8684         p_transaction_type      => 'UPDATE'
8685        ,p_value_set_name        => p_value_set_name
8686        ,p_internal_name         => p_internal_name
8687        ,p_display_name          => p_display_name
8688        ,p_description           => p_description
8689        ,p_sequence              => p_sequence
8690        ,p_start_date            => p_start_date
8691        ,p_end_date              => p_end_date
8692        ,p_enabled               => p_enabled
8693        ,p_owner                 => l_owner
8694        ,x_return_status         => x_return_status
8695        );
8696     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8697       RAISE FND_API.G_EXC_ERROR;
8698 
8699 
8700      /*P4T changes begin. */
8701 
8702     ELSE
8703 
8704         SELECT COUNT(*) INTO  L_VALUES_COUNT  FROM EGO_FLEX_VALUESET_VERSION_B WHERE FLEX_VALUE_SET_ID = L_VALUE_SET_ID;
8705        IF(l_values_count > 0 )    THEN
8706          UPDATE ego_flex_value_version_b SET SEQUENCE =  p_sequence
8707          WHERE version_seq_id = 0 AND flex_value_set_id = l_value_set_id AND flex_value_id = l_flex_value_id  ;
8708 
8709        UPDATE  EGO_FLEX_VALUE_VERSION_TL SET DESCRIPTION = P_DESCRIPTION,
8710         FLEX_VALUE_MEANING = P_DISPLAY_NAME , SOURCE_LANG = USERENV('LANG'),LAST_UPDATE_DATE =SYSDATE,
8711         LAST_UPDATED_BY = FND_GLOBAL.PARTY_ID,LAST_UPDATE_LOGIN = FND_GLOBAL.LOGIN_ID
8712         WHERE FLEX_VALUE_ID = L_FLEX_VALUE_ID AND VERSION_SEQ_ID = 0 AND USERENV('LANG') IN (LANGUAGE, SOURCE_LANG);
8713 
8714          x_is_versioned :='true';
8715          x_valueSetId :=   l_value_set_id;
8716          -- Bug 9803134
8717 
8718     END IF ;
8719     -- Bug 9803134
8720     x_valueSetId :=   l_value_set_id;
8721 
8722    END IF ;
8723     -- Standard check of p_commit
8724     IF FND_API.To_Boolean(p_commit) THEN
8725       COMMIT WORK;
8726     END IF;
8727 
8728     x_return_status := FND_API.G_RET_STS_SUCCESS;
8729 
8730   EXCEPTION
8731     WHEN FND_API.G_EXC_ERROR THEN
8732       code_debug( l_api_name || ' EXCEPTION - FND_API.G_EXC_ERROR ');
8733       IF FND_API.To_Boolean(p_commit) THEN
8734         ROLLBACK TO Update_Value_Set_Val_PUB;
8735       END IF;
8736       x_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
8737       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8738                                ,p_count   => x_msg_count
8739                                ,p_data    => x_msg_data);
8740     WHEN OTHERS THEN
8741       code_debug( l_api_name || ' EXCEPTION - OTHERS ');
8742       code_debug (l_api_name|| sqlerrm );
8743       IF FND_API.To_Boolean(p_commit) THEN
8744         ROLLBACK TO Update_Value_Set_Val_PUB;
8745       END IF;
8746       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8747 
8748       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
8749       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
8750       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
8751       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
8752       FND_MSG_PUB.Add;
8753       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
8754                                ,p_count   => x_msg_count
8755                                ,p_data    => x_msg_data);
8756 
8757 END Update_Value_Set_Val;
8758 
8759 
8760 PROCEDURE Translate_Value_Set_Val
8761        (p_api_version           IN   NUMBER
8762        ,p_value_set_name        IN   VARCHAR2
8763        ,p_internal_name         IN   VARCHAR2
8764        ,p_display_name          IN   VARCHAR2
8765        ,p_description           IN   VARCHAR2
8766        ,p_last_update_date      IN   VARCHAR2
8767        ,p_last_updated_by       IN   NUMBER
8768        ,p_init_msg_list         IN   VARCHAR2
8769        ,p_commit                IN   VARCHAR2
8770        ,x_return_status         OUT  NOCOPY  VARCHAR2
8771        ,x_msg_count             OUT  NOCOPY  NUMBER
8772        ,x_msg_data              OUT  NOCOPY  VARCHAR2
8773        ) IS
8774     l_flex_value_id      fnd_flex_values.flex_value_id%TYPE;
8775     l_value_set_id       fnd_flex_values.flex_value_set_id%TYPE;
8776     l_validation_type    fnd_flex_value_sets.validation_type%TYPE;
8777 
8778     l_vsv_row            fnd_flex_values%ROWTYPE;
8779     l_vsvtl_row          fnd_flex_values_tl%ROWTYPE;
8780 
8781     CURSOR c_get_vs_details (cp_value_set_id IN  NUMBER) IS
8782     SELECT vsvtl.last_updated_by, vsvtl.last_update_date
8783     FROM FND_FLEX_VALUES vsv, FND_FLEX_VALUES_TL vsvtl
8784     WHERE vsv.flex_value_set_id = cp_value_set_id
8785     AND   vsv.flex_value = p_internal_name
8786     AND   vsv.flex_value_id = vsvtl.flex_value_id
8787     AND  USERENV('LANG') IN (language, source_lang);
8788 
8789 
8790     l_last_update_login  fnd_flex_values.last_update_login%TYPE;
8791     l_last_update_date   fnd_flex_values.last_update_date%TYPE;
8792     l_last_updated_by    fnd_flex_values.last_updated_by%TYPE;
8793 
8794 BEGIN
8795   SELECT vs.flex_value_set_id, vs.validation_type
8796   INTO l_value_set_id, l_validation_type
8797   FROM FND_FLEX_VALUE_SETS vs
8798   WHERE vs.flex_value_set_name = p_value_set_name;
8799 
8800   IF l_validation_type = G_TRANS_IND_VALIDATION_CODE THEN
8801 
8802     OPEN c_get_vs_details (cp_value_set_id => l_value_set_id);
8803     FETCH c_get_vs_details INTO  l_last_updated_by, l_last_update_date;
8804     CLOSE c_get_vs_details;
8805 
8806     l_last_update_login := FND_GLOBAL.Login_Id;
8807 
8808     IF (fnd_load_util.upload_test(p_last_updated_by
8809                                  ,p_last_update_date
8810                                  ,l_last_updated_by
8811                                  ,l_last_update_date
8812                                  ,NULL)) THEN
8813       SELECT vsv.*
8814       INTO l_vsv_row
8815       FROM FND_FLEX_VALUES vsv
8816       WHERE vsv.flex_value_set_id = l_value_set_id
8817       AND   vsv.flex_value = p_internal_name;
8818 
8819       FND_FLEX_VALUES_PKG.UPDATE_ROW
8820         (x_flex_value_id            => l_vsv_row.flex_value_id
8821         ,x_attribute_sort_order     => l_vsv_row.attribute_sort_order
8822         ,x_flex_value_set_id        => l_value_set_id
8823         ,x_flex_value               => p_internal_name
8824         ,x_enabled_flag             => l_vsv_row.enabled_flag
8825         ,x_summary_flag             => l_vsv_row.summary_flag
8826         ,x_start_date_active        => l_vsv_row.start_date_active
8827         ,x_end_date_active          => l_vsv_row.end_date_active
8828         ,x_parent_flex_value_low    => l_vsv_row.parent_flex_value_low
8829         ,x_parent_flex_value_high   => l_vsv_row.parent_flex_value_high
8830         ,x_structured_hierarchy_level => l_vsv_row.structured_hierarchy_level
8831         ,x_hierarchy_level            => l_vsv_row.hierarchy_level
8832         ,x_compiled_value_attributes  => l_vsv_row.compiled_value_attributes
8833         ,x_value_category             => l_vsv_row.value_category
8834         ,x_attribute1                 => l_vsv_row.attribute1
8835         ,x_attribute2                 => l_vsv_row.attribute2
8836         ,x_attribute3                 => l_vsv_row.attribute3
8837         ,x_attribute4                 => l_vsv_row.attribute4
8838         ,x_attribute5                 => l_vsv_row.attribute5
8839         ,x_attribute6                 => l_vsv_row.attribute6
8840         ,x_attribute7                 => l_vsv_row.attribute7
8841         ,x_attribute8                 => l_vsv_row.attribute8
8842         ,x_attribute9                 => l_vsv_row.attribute9
8843         ,x_attribute10                => l_vsv_row.attribute10
8844         ,x_attribute11                => l_vsv_row.attribute11
8845         ,x_attribute12                => l_vsv_row.attribute12
8846         ,x_attribute13                => l_vsv_row.attribute13
8847         ,x_attribute14                => l_vsv_row.attribute14
8848         ,x_attribute15                => l_vsv_row.attribute15
8849         ,x_attribute16                => l_vsv_row.attribute16
8850         ,x_attribute17                => l_vsv_row.attribute17
8851         ,x_attribute18                => l_vsv_row.attribute18
8852         ,x_attribute19                => l_vsv_row.attribute19
8853         ,x_attribute20                => l_vsv_row.attribute20
8854         ,x_attribute21                => l_vsv_row.attribute21
8855         ,x_attribute22                => l_vsv_row.attribute22
8856         ,x_attribute23                => l_vsv_row.attribute23
8857         ,x_attribute24                => l_vsv_row.attribute24
8858         ,x_attribute25                => l_vsv_row.attribute25
8859         ,x_attribute26                => l_vsv_row.attribute26
8860         ,x_attribute27                => l_vsv_row.attribute27
8861         ,x_attribute28                => l_vsv_row.attribute28
8862         ,x_attribute29                => l_vsv_row.attribute29
8863         ,x_attribute30                => l_vsv_row.attribute30
8864         ,x_attribute31                => l_vsv_row.attribute31
8865         ,x_attribute32                => l_vsv_row.attribute32
8866         ,x_attribute33                => l_vsv_row.attribute33
8867         ,x_attribute34                => l_vsv_row.attribute34
8868         ,x_attribute35                => l_vsv_row.attribute35
8869         ,x_attribute36                => l_vsv_row.attribute36
8870         ,x_attribute37                => l_vsv_row.attribute37
8871         ,x_attribute38                => l_vsv_row.attribute38
8872         ,x_attribute39                => l_vsv_row.attribute39
8873         ,x_attribute40                => l_vsv_row.attribute40
8874         ,x_attribute41                => l_vsv_row.attribute41
8875         ,x_attribute42                => l_vsv_row.attribute42
8876         ,x_attribute43                => l_vsv_row.attribute43
8877         ,x_attribute44                => l_vsv_row.attribute44
8878         ,x_attribute45                => l_vsv_row.attribute45
8879         ,x_attribute46                => l_vsv_row.attribute46
8880         ,x_attribute47                => l_vsv_row.attribute47
8881         ,x_attribute48                => l_vsv_row.attribute48
8882         ,x_attribute49                => l_vsv_row.attribute49
8883         ,x_attribute50                => l_vsv_row.attribute50
8884         ,x_flex_value_meaning         => p_display_name
8885         ,x_description                => p_description
8886         ,x_last_update_date           => SYSDATE
8887         ,x_last_updated_by            => p_last_updated_by
8888         ,x_last_update_login          => l_last_update_login);
8889     END IF;
8890   END IF;
8891   x_return_status  := 'S';
8892 EXCEPTION
8893   WHEN OTHERS THEN
8894    x_return_status  := 'E';
8895    x_msg_data       := SQLERRM;
8896 END Translate_Value_Set_Val;
8897 
8898 ----------------------------------------------------------------------
8899 
8900 FUNCTION has_flex_binding (cp_value_set_id  IN  NUMBER)
8901 RETURN VARCHAR2 IS
8902 -- T if Value Set Table has flex binding in where clause
8903 -- F if flex binding is not present.
8904   l_return_status   VARCHAR2(1);
8905   l_dummy_number    NUMBER;
8906 BEGIN
8907   l_return_status := FND_API.G_FALSE;
8908   l_dummy_number := INSTR(get_vs_table_where_clause(cp_value_set_id),':$FLEX$.');
8909   IF NVL(l_dummy_number,0) <> 0 THEN
8910     l_return_status := FND_API.G_TRUE;
8911   END IF;
8912   RETURN l_return_status;
8913 EXCEPTION
8914   WHEN OTHERS THEN
8915     RETURN l_return_status;
8916 END has_flex_binding;
8917 
8918 ---------------------------------------------------------------------
8919 -- Requirement:   bug: 3542670
8920 --
8921 -- Function: To check whether the value set is editable
8922 --           Returns T if valueset is editable
8923 --           Returns F if valueset is not editable
8924 -- Parameters:
8925 --         IN
8926 --  p_value_set_id  : value set id
8927 --        OUT
8928 --  NONE
8929 --
8930 ---------------------------------------------------------------------
8931 FUNCTION  is_vs_editable (cp_value_set_id  IN  NUMBER)
8932 RETURN VARCHAR2 IS
8933 -- T is VS is editable
8934 -- F if VS is not editable.
8935   l_return_status   VARCHAR2(1);
8936   l_vs_row          fnd_flex_value_sets%ROWTYPE;
8937 BEGIN
8938   l_return_status := FND_API.G_TRUE;
8939   SELECT *
8940   INTO l_vs_row
8941   FROM fnd_flex_value_sets
8942   WHERE flex_value_set_id = cp_value_set_id;
8943 
8944   IF  l_vs_row.created_by IN (1,2)
8945       OR
8946       l_vs_row.security_enabled_flag <> 'N'
8947       OR
8948       (l_vs_row.format_type = 'C'
8949          AND
8950          (  l_vs_row.alphanumeric_allowed_flag = 'N'
8951             OR
8952             l_vs_row.uppercase_only_flag = 'Y'
8953             OR
8954             l_vs_row.numeric_mode_enabled_flag = 'Y'
8955          )
8956       )
8957       THEN
8958     l_return_status := FND_API.G_FALSE;
8959   END IF;
8960   RETURN l_return_status;
8961 EXCEPTION
8962   WHEN OTHERS THEN
8963     RETURN FND_API.G_FALSE;
8964 END is_vs_editable;
8965 
8966 ---------------------------------------------------------------------
8967 -- Requirement:   bug: 3542670
8968 --
8969 -- Function: To check whether the value set value is editable
8970 --           Returns T if valueset value is editable
8971 --           Returns F if valueset value is not editable
8972 -- Parameters:
8973 --         IN
8974 --  p_value_set_id  : value set id
8975 --        OUT
8976 --  NONE
8977 --
8978 ---------------------------------------------------------------------
8979 FUNCTION  is_vs_value_editable (cp_vs_value_id  IN  NUMBER)
8980 RETURN VARCHAR2 IS
8981 -- T is VS Value is editable
8982 -- F if VS Value is not editable.
8983   l_return_status   VARCHAR2(1);
8984 
8985   l_vsv_created_by            fnd_flex_values.created_by%TYPE;
8986   l_vs_created_by             fnd_flex_values.created_by%TYPE;
8987   l_vs_format_type            fnd_flex_value_sets.format_type%TYPE;
8988   l_vs_validation_type        fnd_flex_value_sets.validation_type%TYPE;
8989   l_vs_alpha_numeric_allowed  fnd_flex_value_sets.alphanumeric_allowed_flag%TYPE;
8990   l_vs_uppercase_only         fnd_flex_value_sets.uppercase_only_flag%TYPE;
8991   l_vs_numeric_mode_enabled   fnd_flex_value_sets.numeric_mode_enabled_flag%TYPE;
8992   l_vs_security_enabled       fnd_flex_value_sets.security_enabled_flag%TYPE;
8993 
8994 BEGIN
8995 
8996   l_return_status := FND_API.G_TRUE;
8997   SELECT a.created_by, b.format_type, b.validation_type,
8998          b.alphanumeric_allowed_flag, b.uppercase_only_flag,
8999          b.numeric_mode_enabled_flag, b.security_enabled_flag, b.created_by
9000   INTO l_vsv_created_by, l_vs_format_type, l_vs_validation_type,
9001        l_vs_alpha_numeric_allowed, l_vs_uppercase_only,
9002        l_vs_numeric_mode_enabled, l_vs_security_enabled, l_vs_created_by
9003   FROM fnd_flex_values a, fnd_flex_value_sets b
9004   WHERE a.flex_value_id = cp_vs_value_id
9005     AND a.flex_value_set_id = b.flex_value_set_id;
9006 
9007   IF  l_vsv_created_by IN (1,2)
9008       OR
9009       l_vs_created_by  IN (1,2)
9010       OR
9011       l_vs_security_enabled <> 'N'
9012       OR
9013       (l_vs_format_type = 'C'
9014          AND
9015          (  l_vs_alpha_numeric_allowed = 'N'
9016             OR
9017             l_vs_uppercase_only = 'Y'
9018             OR
9019             l_vs_numeric_mode_enabled = 'Y'
9020          )
9021       )
9022       THEN
9023     l_return_status := FND_API.G_FALSE;
9024   END IF;
9025   RETURN l_return_status;
9026 EXCEPTION
9027   WHEN OTHERS THEN
9028     RETURN FND_API.G_FALSE;
9029 END is_vs_value_editable;
9030 
9031 ---------------------------------------------------------------------
9032 -- Requirement:   bug: 3542670
9033 --
9034 -- Function: To process the value set display sequence
9035 --           If the display_sequence is same as value_set_value_id,
9036 --           then record is not stored in EGO_VS_VALUES_DISP_ORDER
9037 --           else a record is stored in EGO_VS_VALUES_DISP_ORDER
9038 -- Parameters:
9039 --         IN
9040 --  p_transaction_type    : CREATE,UPDATE
9041 --  p_value_set_id        : value_set_id takes precedence over value_set_name
9042 --                          if both the parameters are passed
9043 --  p_value_set_name      : value set name
9044 --  p_value_set_value_id  : value set value id takes precedence over
9045 --                          value set value if both the parameters are passed
9046 --  p_value_set_value     : value set value
9047 --  p_sequence            : sequence to be stored
9048 --  p_init_msg_list       :
9049 --  p_commit              :
9050 --        OUT
9051 --  x_return_status                 OUT NOCOPY VARCHAR2
9052 --  x_msg_count                     OUT NOCOPY NUMBER
9053 --  x_msg_data                      OUT NOCOPY VARCHAR2
9054 --
9055 ---------------------------------------------------------------------
9056 PROCEDURE process_vs_value_sequence
9057        (p_api_version                   IN   NUMBER
9058        ,p_transaction_type              IN   VARCHAR2
9059        ,p_value_set_id                  IN   NUMBER    DEFAULT NULL
9060        ,p_value_set_name                IN   VARCHAR2  DEFAULT NULL
9061        ,p_value_set_value_id            IN   NUMBER    DEFAULT NULL
9062        ,p_value_set_value               IN   VARCHAR2  DEFAULT NULL
9063        ,p_sequence                      IN   NUMBER
9064        ,p_owner                         IN   NUMBER     DEFAULT NULL
9065        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9066        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9067        ,x_return_status                 OUT NOCOPY VARCHAR2
9068        ,x_msg_count                     OUT NOCOPY NUMBER
9069        ,x_msg_data                      OUT NOCOPY VARCHAR2
9070        ) IS
9071 
9072   l_api_name      VARCHAR2(30);
9073   l_api_version   NUMBER;
9074   l_value_set_value_id     fnd_flex_values.flex_value_id%TYPE;
9075   l_value_set_id           fnd_flex_value_sets.flex_value_set_id%TYPE;
9076   l_sequence               EGO_VS_VALUES_DISP_ORDER.disp_sequence%TYPE;
9077   l_invalid_params         BOOLEAN;
9078   l_create_sequence        BOOLEAN;
9079   l_update_sequence        BOOLEAN;
9080   l_Sysdate                DATE;
9081   l_owner                  NUMBER;
9082 
9083   CURSOR c_get_disp_sequence (cp_flex_value_id  IN  NUMBER,cp_flex_id IN NUMBER) is
9084     SELECT disp_sequence
9085     FROM ego_vs_values_disp_order
9086     WHERE value_set_value_id = cp_flex_value_id
9087     AND value_set_id = cp_flex_id;
9088 
9089 BEGIN
9090   l_api_name := 'process_vs_value_sequence';
9091   l_api_version := 1.0;
9092 
9093   IF FND_API.To_Boolean( p_commit ) THEN
9094    SAVEPOINT PROCESS_VS_VALUE_SEQUENCE_SP;
9095   END IF;
9096 
9097   --
9098   -- Initialize message list
9099   --
9100   IF FND_API.To_Boolean(p_init_msg_list) THEN
9101     FND_MSG_PUB.Initialize;
9102   END IF;
9103 
9104   code_debug(l_api_name||' msg pub initialized ' );
9105   --
9106   --Standard checks
9107   --
9108   IF NOT FND_API.Compatible_API_Call (l_api_version
9109                                      ,p_api_version
9110                                      ,l_api_name
9111                                      ,g_pkg_name) THEN
9112         code_debug (l_api_name ||' invalid api version ');
9113     RAISE FND_API.G_EXC_ERROR;
9114   END IF;
9115 
9116   IF (p_owner IS NULL OR p_owner = -1) THEN
9117     l_owner := g_current_user_id;
9118   ELSE
9119     l_owner := p_owner;
9120   END IF;
9121 
9122   l_invalid_params := FALSE;
9123   IF (  p_sequence IS NULL
9124         OR
9125         ( p_value_set_value_id IS NULL
9126           AND
9127           (p_value_set_value IS NULL OR (p_value_set_name IS NULL AND p_value_set_id IS NULL))
9128         )
9129      ) THEN
9130     l_invalid_params := TRUE;
9131   ELSE
9132     IF p_value_set_value_id IS NOT NULL THEN
9133       BEGIN
9134         SELECT flex_value_id, flex_value_set_id
9135         INTO l_value_set_value_id, l_value_set_id
9136         FROM fnd_flex_values
9137         WHERE flex_value_id = p_value_set_value_id;
9138       EXCEPTION
9139         WHEN OTHERS THEN
9140           l_invalid_params := TRUE;
9141       END;
9142     ELSE
9143       BEGIN
9144         SELECT a.flex_value_id, a.flex_value_set_id
9145         INTO l_value_set_value_id, l_value_set_id
9146         FROM fnd_flex_values a, fnd_flex_value_sets b
9147         WHERE a.flex_value_set_id = b.flex_value_set_id
9148           AND a.flex_value = p_value_set_value
9149           AND (b.flex_value_set_id = p_value_set_id OR b.flex_value_set_name = p_value_set_name);
9150       EXCEPTION
9151         WHEN OTHERS THEN
9152           l_invalid_params := TRUE;
9153       END;
9154     END IF;
9155   END IF;
9156 
9157   IF l_invalid_params THEN
9158     fnd_message.Set_Name(G_APP_NAME, 'EGO_API_INVALID_PARAMS');
9159     fnd_message.Set_Token(G_PKG_NAME_TOKEN, G_PKG_NAME);
9160     fnd_message.Set_Token(G_API_NAME_TOKEN, l_api_name);
9161     FND_MSG_PUB.Add;
9162     RAISE FND_API.G_EXC_ERROR;
9163   END IF;
9164 
9165 
9166   l_create_sequence := FALSE;
9167   l_update_sequence := FALSE;
9168 
9169   --
9170   -- Fix for bug#12660306
9171   --
9172   OPEN c_get_disp_sequence (cp_flex_value_id => l_value_set_value_id,
9173                             cp_flex_id =>  l_value_set_id);
9174 
9175   FETCH c_get_disp_sequence INTO l_sequence;
9176   IF c_get_disp_sequence%NOTFOUND THEN
9177     IF p_sequence <> l_value_set_value_id THEN
9178       l_create_sequence := TRUE;
9179     END IF;
9180   ELSE
9181     IF l_sequence <> p_sequence THEN
9182       l_update_sequence := TRUE;
9183     END IF;
9184   END IF;
9185 
9186     l_Sysdate  := SYSDATE;
9187   IF l_create_sequence THEN
9188     INSERT INTO EGO_VS_VALUES_DISP_ORDER
9189       (value_set_value_id
9190       ,value_set_id
9191       ,disp_sequence
9192       ,created_by
9193       ,creation_date
9194       ,last_updated_by
9195       ,last_update_date
9196       ,last_update_login)
9197     VALUES
9198       (l_value_set_value_id
9199       ,l_value_set_id
9200       ,p_sequence
9201       ,l_owner
9202       ,l_Sysdate
9203       ,l_owner
9204       ,l_Sysdate
9205       ,G_CURRENT_LOGIN_ID);
9206   END IF;
9207 
9208   IF l_update_sequence THEN
9209     --
9210     -- Fix for bug#12660306
9211     --
9212     UPDATE EGO_VS_VALUES_DISP_ORDER
9213     SET disp_sequence = p_sequence
9214       ,last_updated_by = l_owner
9215       ,last_update_date = l_sysdate
9216       ,last_update_login = G_CURRENT_LOGIN_ID
9217     WHERE value_set_value_id = l_value_set_value_id
9218     AND value_set_id = l_value_set_id;
9219   END IF;
9220 
9221   IF FND_API.To_Boolean( p_commit ) THEN
9222     COMMIT WORK;
9223   END IF;
9224   x_return_status := FND_API.G_RET_STS_SUCCESS;
9225 
9226 EXCEPTION
9227    WHEN FND_API.G_EXC_ERROR THEN
9228       IF FND_API.To_Boolean( p_commit ) THEN
9229         ROLLBACK TO  PROCESS_VS_VALUE_SEQUENCE_SP;
9230       END IF;
9231       x_return_status := FND_API.G_RET_STS_ERROR;
9232       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9233                                ,p_count   => x_msg_count
9234                                ,p_data    => x_msg_data);
9235     WHEN OTHERS THEN
9236       IF FND_API.To_Boolean( p_commit ) THEN
9237         ROLLBACK TO  PROCESS_VS_VALUE_SEQUENCE_SP;
9238       END IF;
9239 
9240 END process_vs_value_sequence;
9241 
9242 ----------------------------------------------------------------------
9243 
9244                   -----------------------------
9245                   -- Object Association APIs --
9246                   -----------------------------
9247 
9248 ----------------------------------------------------------------------
9249 
9250 PROCEDURE Create_Association (
9251         p_api_version                   IN   NUMBER
9252        ,p_association_id                IN   NUMBER DEFAULT NULL
9253        ,p_object_id                     IN   NUMBER
9254        ,p_classification_code           IN   VARCHAR2
9255        ,p_data_level                    IN   VARCHAR2
9256        ,p_attr_group_id                 IN   NUMBER
9257        ,p_enabled_flag                  IN   VARCHAR2
9258        ,p_view_privilege_id             IN   NUMBER     --ignored for now
9259        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
9260        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9261        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9262        ,x_association_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_Association';
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_attr_group_id          NUMBER;
9277     l_Sysdate                DATE := Sysdate;
9278     l_existing_datalevel     VARCHAR2(30);
9279     l_attr_disp_name         VARCHAR2(80);
9280     l_data_level_name        VARCHAR2(80);
9281 
9282     e_data_level_mismatch_error EXCEPTION;
9283     e_variant_assocs_excep    EXCEPTION;
9284     l_variant_exist_count    NUMBER;
9285     l_dyn_sql                     VARCHAR2(1000);
9286     l_style_exists                VARCHAR2(1);
9287     l_attr_count           NUMBER;
9288 
9289     l_dummy_number  NUMBER;
9290     l_variant_flag        VARCHAR2(1);
9291 
9292     CURSOR data_level_merge (cp_attr_group_id IN NUMBER
9293                             ,cp_classification_code  IN VARCHAR2) IS
9294     SELECT attr_grp_dl.data_level_id data_level_id, dl_meta.data_level_name data_level_name
9295     FROM   ego_data_level_b dl_meta, ego_attr_group_dl attr_grp_dl
9296     WHERE attr_grp_dl.data_level_id = dl_meta.data_level_id
9297       AND attr_grp_dl.attr_group_id = cp_attr_group_id
9298       AND NOT EXISTS
9299         (SELECT 1
9300           FROM EGO_OBJ_AG_ASSOCS_B
9301           WHERE classification_code = p_classification_code
9302             AND attr_group_id = cp_attr_group_id
9303             AND data_level_id = dl_meta.data_level_id
9304         );
9305 
9306     cursor_rec   data_level_merge%ROWTYPE;
9307 
9308 
9309   BEGIN
9310 
9311     -- Standard start of API savepoint
9312     IF FND_API.To_Boolean(p_commit) THEN
9313       SAVEPOINT Create_Association_PUB;
9314     END IF;
9315 
9316     -- Check for call compatibility
9317     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
9318                                         l_api_name, G_PKG_NAME)
9319     THEN
9320       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9321     END IF;
9322     -- Initialize message list even though we don't currently use it
9323     IF FND_API.To_Boolean(p_init_msg_list) THEN
9324       FND_MSG_PUB.Initialize;
9325     END IF;
9326 
9327     --Checking if the variant attribute group trying to be associated has attributes in it, if not raise exception
9328     SELECT Nvl(VARIANT, 'N')
9329     INTO l_variant_flag
9330     FROM EGO_ATTR_GROUPS_V WHERE ATTR_GROUP_ID = p_attr_group_id;
9331 
9332     SELECT Count(1)
9333     INTO l_attr_count
9334     FROM EGO_ATTR_GROUPS_V AGV, EGO_ATTRS_V AV
9335     WHERE AGV.APPLICATION_ID = AV.APPLICATION_ID
9336     AND AGV.ATTR_GROUP_TYPE = AV.ATTR_GROUP_TYPE
9337     AND AGV.ATTR_GROUP_NAME = AV.ATTR_GROUP_NAME
9338     AND AGV.ATTR_GROUP_ID = p_attr_group_id;
9339 
9340     IF(l_attr_count = 0 AND l_variant_flag = 'Y') THEN
9341        Fnd_Message.Set_Name (application  => 'EGO',
9342                             name         => 'EGO_EF_NO_ATTR_EXIST'
9343                            );
9344         FND_MSG_PUB.Add;
9345         RAISE e_variant_assocs_excep;
9346     END IF;
9347 
9348     -- SSARNOBA: Why do we have this SELECT INTO statement? We're not using
9349     -- l_variant_exist_count anywhere.
9350     SELECT COUNT(*)
9351     INTO l_variant_exist_count
9352     FROM EGO_OBJ_ATTR_GRP_ASSOCS_V
9353     WHERE OBJECT_ID = p_object_id
9354     AND CLASSIFICATION_CODE = p_classification_code
9355     AND VARIANT = 'Y'
9356     AND EXISTS (SELECT 'X'
9357                          FROM EGO_ATTR_GROUPS_V AGV
9358                          WHERE AGV.ATTR_GROUP_ID = p_attr_group_id
9359                          AND AGV.VARIANT = 'Y');
9360 
9361     -- special handling for variant attribute groups
9362     BEGIN
9363       SELECT OBJECT_ID
9364       INTO l_dummy_number
9365       FROM FND_OBJECTS
9366       WHERE OBJECT_ID = p_object_id
9367       AND OBJ_NAME = 'EGO_ITEM';
9368 
9369       --
9370       -- Bug 12775527. Optimize the style item check flow.
9371       -- Execute style item check only if its a variant.
9372       -- Also removing the usage of unnecessary dynamic SQL.
9373       -- sreharih. Wed Jul 20 12:45:15 PDT 2011
9374       --
9375       IF(l_dummy_number IS NOT NULL AND l_variant_flag='Y') THEN
9376           l_style_exists := EGO_STYLE_SKU_ITEM_PVT.IsStyle_Item_Exist_For_ICC(p_classification_code);
9377       END IF;
9378 
9379     EXCEPTION
9380       WHEN OTHERS THEN
9381         NULL;
9382     END;
9383 
9384 
9385     --EXECUTE IMMEDIATE l_dyn_sql;
9386     IF(l_style_exists = 'T' AND l_variant_flag = 'Y') THEN
9387         Fnd_Message.Set_Name (application  => 'EGO',
9388                             name         => 'EGO_VARIANT_STYLE_EXIST'
9389                            );
9390         FND_MSG_PUB.Add;
9391         RAISE e_variant_assocs_excep;
9392     END IF;
9393 
9394     --l_existing_datalevel := Get_Associated_Datalevel(p_object_id, p_attr_group_id);
9395 
9396     --IF ((l_existing_datalevel IS NOT NULL) AND (l_existing_datalevel <> p_data_level)) THEN
9397      -- RAISE e_data_level_mismatch_error;
9398     --END IF;
9399 
9400 
9401     --if association id is not provided, get association id from sequence
9402     --IF( p_association_id IS NULL ) THEN
9403       --SELECT EGO_ASSOCS_S.NEXTVAL INTO x_association_id FROM DUAL;
9404     --ELSE
9405     IF(p_association_id IS NOT NULL AND p_association_id > 0) THEN
9406       x_association_id := p_association_id;
9407     END IF;
9408 
9409     IF(x_association_id IS NOT NULL) THEN
9410       -- used only for the creation of single association
9411       -- it is assumed that when the user is passing p_association_id , it is for a single association record
9412       INSERT INTO EGO_OBJ_AG_ASSOCS_B
9413       (
9414           ASSOCIATION_ID
9415          ,OBJECT_ID
9416          ,CLASSIFICATION_CODE
9417          ,DATA_LEVEL
9418          ,ATTR_GROUP_ID
9419          ,ENABLED_FLAG
9420          ,DATA_LEVEL_ID
9421          ,VIEW_PRIVILEGE_ID
9422          ,EDIT_PRIVILEGE_ID
9423          ,CREATION_DATE
9424          ,CREATED_BY
9425          ,LAST_UPDATE_DATE
9426          ,LAST_UPDATED_BY
9427          ,LAST_UPDATE_LOGIN
9428       )
9429       VALUES
9430       (
9431           x_association_id
9432          ,p_object_id
9433          ,p_classification_code
9434          ,p_data_level
9435          ,p_attr_group_id
9436          ,p_enabled_flag
9437          ,(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)
9438          ,p_view_privilege_id
9439          ,p_edit_privilege_id
9440          ,l_Sysdate
9441          ,g_current_user_id
9442          ,l_Sysdate
9443          ,g_current_user_id
9444          ,g_current_login_id
9445       )  ;
9446     ELSE
9447 
9448         -- merge is used here to create association for all the data levels of an AG
9449         -- when all the data levels are to be associated, p_association_id is passed NULL
9450         OPEN data_level_merge(p_attr_group_id, p_classification_code);
9451         LOOP
9452           FETCH data_level_merge INTO cursor_rec;
9453           EXIT WHEN data_level_merge%NOTFOUND;
9454 
9455           INSERT INTO EGO_OBJ_AG_ASSOCS_B
9456           (
9457             ASSOCIATION_ID,
9458             OBJECT_ID,
9459             CLASSIFICATION_CODE,
9460             DATA_LEVEL,
9461             ATTR_GROUP_ID,
9462             ENABLED_FLAG,
9463             DATA_LEVEL_ID,
9464             CREATION_DATE,
9465             CREATED_BY,
9466             LAST_UPDATE_DATE,
9467             LAST_UPDATED_BY,
9468             LAST_UPDATE_LOGIN
9469           )
9470           VALUES
9471           (
9472                EGO_ASSOCS_S.NEXTVAL,
9473                p_object_id,
9474                p_classification_code,
9475                cursor_rec.data_level_name,
9476                p_attr_group_id,
9477                p_enabled_flag,
9478                cursor_rec.data_level_id,
9479                l_Sysdate,
9480                g_current_user_id,
9481                l_Sysdate,
9482                g_current_user_id,
9483                g_current_login_id
9484           );
9485 
9486 
9487 
9488 
9489        END LOOP;
9490        CLOSE data_level_merge;
9491 
9492     END IF;
9493 
9494     -- Standard check of p_commit
9495     IF FND_API.To_Boolean(p_commit) THEN
9496       COMMIT WORK;
9497     END IF;
9498 
9499 
9500     x_return_status := FND_API.G_RET_STS_SUCCESS;
9501 
9502   EXCEPTION
9503 
9504     WHEN e_data_level_mismatch_error THEN
9505       IF FND_API.To_Boolean(p_commit) THEN
9506         ROLLBACK TO Create_Association_PUB;
9507       END IF;
9508 
9509       x_return_status := FND_API.G_RET_STS_ERROR;
9510 
9511 
9512       l_attr_disp_name := Get_Attr_Group_DispName(p_attr_group_id);
9513 
9514       l_data_level_name := Get_Data_Level_DispName(l_existing_datalevel);
9515 
9516 
9517       Fnd_Message.Set_Name (application  => 'EGO',
9518                             name         => 'EGO_EF_DL_MISMATCH_ERR'
9519                            );
9520 
9521       Fnd_Message.Set_Token ( token  => 'ATTR_GROUP'
9522                              , value =>  l_attr_disp_name
9523                              , translate   => false
9524                             );
9525 
9526 
9527       Fnd_Message.Set_Token ( token  => 'DATA_LEVEL'
9528                               , value =>  l_data_level_name
9529                               , translate   => false
9530                             );
9531 
9532       x_msg_data := Fnd_Message.Get;
9533 
9534     WHEN e_variant_assocs_excep THEN
9535       IF FND_API.To_Boolean(p_commit) THEN
9536         ROLLBACK TO Create_Association_PUB;
9537       END IF;
9538       x_return_status := FND_API.G_RET_STS_ERROR;
9539       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9540                                ,p_count   => x_msg_count
9541                                ,p_data    => x_msg_data);
9542 
9543 
9544 
9545     WHEN OTHERS THEN
9546       CLOSE data_level_merge; --closing the error in case the cursor errors out
9547 
9548       IF FND_API.To_Boolean(p_commit) THEN
9549         ROLLBACK TO Create_Association_PUB;
9550       END IF;
9551       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9552 
9553       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9554       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9555       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9556       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9557       FND_MSG_PUB.Add;
9558       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9559                                ,p_count   => x_msg_count
9560                                ,p_data    => x_msg_data);
9561 
9562 END Create_Association;
9563 
9564 ----------------------------------------------------------------------
9565 
9566 PROCEDURE Create_Association (
9567         p_api_version                   IN   NUMBER
9568        ,p_association_id                IN   NUMBER DEFAULT NULL
9569        ,p_object_id                     IN   NUMBER
9570        ,p_classification_code           IN   VARCHAR2
9571        ,p_data_level                    IN   VARCHAR2
9572        ,p_application_id                IN   NUMBER
9573        ,p_attr_group_type               IN   VARCHAR2
9574        ,p_attr_group_name               IN   VARCHAR2
9575        ,p_enabled_flag                  IN   VARCHAR2
9576        ,p_view_privilege_id             IN   NUMBER     --ignored for now
9577        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
9578        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9579        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9580        ,x_association_id                OUT NOCOPY NUMBER
9581        ,x_return_status                 OUT NOCOPY VARCHAR2
9582        ,x_errorcode                     OUT NOCOPY NUMBER
9583        ,x_msg_count                     OUT NOCOPY NUMBER
9584        ,x_msg_data                      OUT NOCOPY VARCHAR2
9585 ) IS
9586 
9587     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Association';
9588 
9589     l_attr_group_id          NUMBER;
9590 
9591   BEGIN
9592 
9593     -- Standard start of API savepoint
9594     IF FND_API.To_Boolean(p_commit) THEN
9595       SAVEPOINT Create_Association_PUB;
9596     END IF;
9597 
9598     l_attr_group_id := Get_Attr_Group_Id_From_PKs(p_application_id
9599                                                  ,p_attr_group_type
9600                                                  ,p_attr_group_name);
9601 
9602     IF l_attr_group_id IS NULL THEN
9603       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9604     END IF;
9605 
9606     EGO_EXT_FWK_PUB.Create_Association(
9607         p_api_version                   => p_api_version
9608        ,p_association_id                => p_association_id
9609        ,p_object_id                     => p_object_id
9610        ,p_classification_code           => p_classification_code
9611        ,p_data_level                    => p_data_level
9612        ,p_attr_group_id                 => l_attr_group_id
9613        ,p_enabled_flag                  => p_enabled_flag
9614        ,p_view_privilege_id             => p_view_privilege_id
9615        ,p_edit_privilege_id             => p_edit_privilege_id
9616        ,p_init_msg_list                 => p_init_msg_list
9617        ,p_commit                        => p_commit
9618        ,x_association_id                => x_association_id
9619        ,x_return_status                 => x_return_status
9620        ,x_errorcode                     => x_errorcode
9621        ,x_msg_count                     => x_msg_count
9622        ,x_msg_data                      => x_msg_data
9623     );
9624 
9625     -- Standard check of p_commit
9626     IF FND_API.To_Boolean(p_commit) THEN
9627       COMMIT WORK;
9628     END IF;
9629 
9630   EXCEPTION
9631     WHEN OTHERS THEN
9632       IF FND_API.To_Boolean(p_commit) THEN
9633         ROLLBACK TO Create_Association_PUB;
9634       END IF;
9635       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9636 
9637       IF l_attr_group_id IS NULL THEN
9638         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAttrGroupIDFoundForPKs';
9639       ELSE
9640         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9641         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9642         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9643         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9644         FND_MSG_PUB.Add;
9645         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9646                                  ,p_count   => x_msg_count
9647                                  ,p_data    => x_msg_data);
9648       END IF;
9649 
9650 END Create_Association;
9651 
9652 ----------------------------------------------------------------------
9653 
9654 PROCEDURE Create_Association (
9655         p_api_version                   IN   NUMBER
9656        ,p_object_name                   IN   VARCHAR2
9657        ,p_classification_code           IN   VARCHAR2
9658        ,p_data_level                    IN   VARCHAR2
9659        ,p_application_id                IN   NUMBER
9660        ,p_attr_group_type               IN   VARCHAR2
9661        ,p_attr_group_name               IN   VARCHAR2
9662        ,p_enabled_flag                  IN   VARCHAR2
9663        ,p_view_privilege_id             IN   NUMBER     --ignored for now
9664        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
9665        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9666        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9667        ,x_association_id                OUT NOCOPY NUMBER
9668        ,x_return_status                 OUT NOCOPY VARCHAR2
9669        ,x_errorcode                     OUT NOCOPY NUMBER
9670        ,x_msg_count                     OUT NOCOPY NUMBER
9671        ,x_msg_data                      OUT NOCOPY VARCHAR2
9672 ) IS
9673 
9674     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Association';
9675 
9676     l_object_id              NUMBER;
9677 
9678   BEGIN
9679 
9680     -- Standard start of API savepoint
9681     IF FND_API.To_Boolean(p_commit) THEN
9682       SAVEPOINT Create_Association_PUB;
9683     END IF;
9684 
9685     l_object_id := Get_Object_Id_From_Name(p_object_name);
9686     IF l_object_id IS NULL THEN
9687       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9688     END IF;
9689 
9690     EGO_EXT_FWK_PUB.Create_Association(
9691         p_api_version                   => p_api_version
9692        ,p_object_id                     => l_object_id
9693        ,p_classification_code           => p_classification_code
9694        ,p_data_level                    => p_data_level
9695        ,p_application_id                => p_application_id
9696        ,p_attr_group_type               => p_attr_group_type
9697        ,p_attr_group_name               => p_attr_group_name
9698        ,p_enabled_flag                  => p_enabled_flag
9699        ,p_view_privilege_id             => p_view_privilege_id
9700        ,p_edit_privilege_id             => p_edit_privilege_id
9701        ,p_init_msg_list                 => p_init_msg_list
9702        ,p_commit                        => p_commit
9703        ,x_association_id                => x_association_id
9704        ,x_return_status                 => x_return_status
9705        ,x_errorcode                     => x_errorcode
9706        ,x_msg_count                     => x_msg_count
9707        ,x_msg_data                      => x_msg_data
9708     );
9709 
9710     -- Standard check of p_commit
9711     IF FND_API.To_Boolean(p_commit) THEN
9712       COMMIT WORK;
9713     END IF;
9714 
9715   EXCEPTION
9716     WHEN OTHERS THEN
9717       IF FND_API.To_Boolean(p_commit) THEN
9718         ROLLBACK TO Create_Association_PUB;
9719       END IF;
9720       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9721 
9722       IF l_object_id IS NULL THEN
9723         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoObjectIdForObjectName';
9724       ELSE
9725         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9726         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9727         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9728         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9729         FND_MSG_PUB.Add;
9730         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9731                                  ,p_count   => x_msg_count
9732                                  ,p_data    => x_msg_data);
9733       END IF;
9734 
9735 END Create_Association;
9736 
9737 ----------------------------------------------------------------------
9738 
9739 -- definition for case when caller has ASSOCIATION_ID
9740 PROCEDURE Update_Association (
9741         p_api_version                   IN   NUMBER
9742        ,p_association_id                IN   NUMBER
9743        ,p_enabled_flag                  IN   VARCHAR2
9744        ,p_view_privilege_id             IN   NUMBER     --ignored for now
9745        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
9746        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9747        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9748        ,x_return_status                 OUT NOCOPY VARCHAR2
9749        ,x_errorcode                     OUT NOCOPY NUMBER
9750        ,x_msg_count                     OUT NOCOPY NUMBER
9751        ,x_msg_data                      OUT NOCOPY VARCHAR2
9752 ) IS
9753 
9754     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Association';
9755 
9756     --we don't use l_api_version yet, but eventually we might:
9757     --if we change required parameters, version goes from n.x to (n+1).x
9758     --if we change optional parameters, version goes from x.n to x.(n+1)
9759     l_api_version            CONSTANT NUMBER := 1.0;
9760 
9761     l_Sysdate                DATE := Sysdate;
9762 
9763   BEGIN
9764 
9765     -- Standard start of API savepoint
9766     IF FND_API.To_Boolean(p_commit) THEN
9767       SAVEPOINT Update_Association_PUB;
9768     END IF;
9769 
9770     -- Check for call compatibility
9771     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
9772                                         l_api_name, G_PKG_NAME)
9773     THEN
9774       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9775     END IF;
9776     -- Initialize message list even though we don't currently use it
9777     IF FND_API.To_Boolean(p_init_msg_list) THEN
9778       FND_MSG_PUB.Initialize;
9779     END IF;
9780 
9781     --bug 5513610
9782     /*DELETE FROM EGO_PAGE_ENTRIES_B
9783      WHERE ASSOCIATION_ID = p_association_id;*/
9784 
9785     UPDATE EGO_OBJ_AG_ASSOCS_B
9786        SET ENABLED_FLAG = p_enabled_flag,
9787            VIEW_PRIVILEGE_ID = p_view_privilege_id,
9788            EDIT_PRIVILEGE_ID = p_edit_privilege_id,
9789            LAST_UPDATE_DATE = l_Sysdate,
9790            LAST_UPDATED_BY = g_current_user_id,
9791            LAST_UPDATE_LOGIN = g_current_login_id
9792      WHERE ASSOCIATION_ID = p_association_id;
9793 
9794     -- Standard check of p_commit
9795     IF FND_API.To_Boolean(p_commit) THEN
9796       COMMIT WORK;
9797     END IF;
9798 
9799     x_return_status := FND_API.G_RET_STS_SUCCESS;
9800 
9801   EXCEPTION
9802     WHEN OTHERS THEN
9803       IF FND_API.To_Boolean(p_commit) THEN
9804         ROLLBACK TO Update_Association_PUB;
9805       END IF;
9806       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9807 
9808       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9809       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9810       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9811       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9812       FND_MSG_PUB.Add;
9813       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9814                                ,p_count   => x_msg_count
9815                                ,p_data    => x_msg_data);
9816 
9817 END Update_Association;
9818 
9819 ----------------------------------------------------------------------
9820 
9821 -- definition for case when caller doesn't have ASSOCIATION_ID but has ATTR_GROUP_ID
9822 PROCEDURE Update_Association (
9823         p_api_version                   IN   NUMBER
9824        ,p_object_id                     IN   NUMBER
9825        ,p_classification_code           IN   VARCHAR2
9826        ,p_attr_group_id                 IN   NUMBER
9827        ,p_enabled_flag                  IN   VARCHAR2
9828        ,p_view_privilege_id             IN   NUMBER     --ignored for now
9829        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
9830        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9831        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9832        ,x_return_status                 OUT NOCOPY VARCHAR2
9833        ,x_errorcode                     OUT NOCOPY NUMBER
9834        ,x_msg_count                     OUT NOCOPY NUMBER
9835        ,x_msg_data                      OUT NOCOPY VARCHAR2
9836 ) IS
9837 
9838     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Association';
9839 
9840     l_association_id         NUMBER;
9841 
9842   BEGIN
9843 
9844     -- Standard start of API savepoint
9845     IF FND_API.To_Boolean(p_commit) THEN
9846       SAVEPOINT Update_Association_PUB;
9847     END IF;
9848 
9849     l_association_id := Get_Association_Id_From_PKs(p_object_id
9850                                                    ,p_classification_code
9851                                                    ,p_attr_group_id);
9852     IF l_association_id IS NULL THEN
9853       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9854     END IF;
9855 
9856     EGO_EXT_FWK_PUB.Update_Association(
9857         p_api_version                   => p_api_version
9858        ,p_association_id                => l_association_id
9859        ,p_enabled_flag                  => p_enabled_flag
9860        ,p_view_privilege_id             => p_view_privilege_id
9861        ,p_edit_privilege_id             => p_edit_privilege_id
9862        ,p_init_msg_list                 => p_init_msg_list
9863        ,p_commit                        => p_commit
9864        ,x_return_status                 => x_return_status
9865        ,x_errorcode                     => x_errorcode
9866        ,x_msg_count                     => x_msg_count
9867        ,x_msg_data                      => x_msg_data
9868     );
9869 
9870     -- Standard check of p_commit
9871     IF FND_API.To_Boolean(p_commit) THEN
9872       COMMIT WORK;
9873     END IF;
9874 
9875   EXCEPTION
9876     WHEN OTHERS THEN
9877       IF FND_API.To_Boolean(p_commit) THEN
9878         ROLLBACK TO Update_Association_PUB;
9879       END IF;
9880       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9881 
9882       IF l_association_id IS NULL THEN
9883         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAssocFound';
9884       ELSE
9885         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9886         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9887         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9888         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9889         FND_MSG_PUB.Add;
9890         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9891                                  ,p_count   => x_msg_count
9892                                  ,p_data    => x_msg_data);
9893       END IF;
9894 
9895 END Update_Association;
9896 
9897 ----------------------------------------------------------------------
9898 
9899 -- definition for case when caller doesn't have ASSOCIATION_ID or ATTR_GROUP_ID
9900 PROCEDURE Update_Association (
9901         p_api_version                   IN   NUMBER
9902        ,p_object_id                     IN   NUMBER
9903        ,p_classification_code           IN   VARCHAR2
9904        ,p_application_id                IN   NUMBER
9905        ,p_attr_group_type               IN   VARCHAR2
9906        ,p_attr_group_name               IN   VARCHAR2
9907        ,p_enabled_flag                  IN   VARCHAR2
9908        ,p_view_privilege_id             IN   NUMBER     --ignored for now
9909        ,p_edit_privilege_id             IN   NUMBER     --ignored for now
9910        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9911        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9912        ,x_return_status                 OUT NOCOPY VARCHAR2
9913        ,x_errorcode                     OUT NOCOPY NUMBER
9914        ,x_msg_count                     OUT NOCOPY NUMBER
9915        ,x_msg_data                      OUT NOCOPY VARCHAR2
9916 ) IS
9917 
9918     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Association';
9919 
9920     l_attr_group_id          NUMBER;
9921     l_association_id         NUMBER;
9922 
9923   BEGIN
9924 
9925     -- Standard start of API savepoint
9926     IF FND_API.To_Boolean(p_commit) THEN
9927       SAVEPOINT Update_Association_PUB;
9928     END IF;
9929 
9930     l_attr_group_id := Get_Attr_Group_Id_From_PKs(p_application_id
9931                                                  ,p_attr_group_type
9932                                                  ,p_attr_group_name);
9933 
9934     IF l_attr_group_id IS NULL THEN
9935       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9936     END IF;
9937 
9938     l_association_id := Get_Association_Id_From_PKs(p_object_id
9939                                                    ,p_classification_code
9940                                                    ,l_attr_group_id);
9941     IF l_association_id IS NULL THEN
9942       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9943     END IF;
9944 
9945     EGO_EXT_FWK_PUB.Update_Association(
9946         p_api_version                   => p_api_version
9947        ,p_association_id                => l_association_id
9948        ,p_enabled_flag                  => p_enabled_flag
9949        ,p_view_privilege_id             => p_view_privilege_id
9950        ,p_edit_privilege_id             => p_edit_privilege_id
9951        ,p_init_msg_list                 => p_init_msg_list
9952        ,p_commit                        => p_commit
9953        ,x_return_status                 => x_return_status
9954        ,x_errorcode                     => x_errorcode
9955        ,x_msg_count                     => x_msg_count
9956        ,x_msg_data                      => x_msg_data
9957     );
9958 
9959     -- Standard check of p_commit
9960     IF FND_API.To_Boolean(p_commit) THEN
9961       COMMIT WORK;
9962     END IF;
9963 
9964   EXCEPTION
9965     WHEN OTHERS THEN
9966       IF FND_API.To_Boolean(p_commit) THEN
9967         ROLLBACK TO Update_Association_PUB;
9968       END IF;
9969       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9970 
9971       IF l_attr_group_id IS NULL THEN
9972         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAttrGroupIDFoundForPKs';
9973       ELSIF l_association_id IS NULL THEN
9974         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAssocFound';
9975       ELSE
9976         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
9977         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
9978         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
9979         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
9980         FND_MSG_PUB.Add;
9981         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
9982                                  ,p_count   => x_msg_count
9983                                  ,p_data    => x_msg_data);
9984       END IF;
9985 
9986 END Update_Association;
9987 
9988 ----------------------------------------------------------------------
9989 
9990 PROCEDURE Delete_Association (
9991         p_api_version                   IN   NUMBER
9992        ,p_association_id                IN   NUMBER
9993        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
9994        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
9995        ,p_force                         IN   VARCHAR2   :=  fnd_api.g_FALSE
9996        ,x_return_status                 OUT NOCOPY VARCHAR2
9997        ,x_errorcode                     OUT NOCOPY NUMBER
9998        ,x_msg_count                     OUT NOCOPY NUMBER
9999        ,x_msg_data                      OUT NOCOPY VARCHAR2
10000 ) IS
10001 
10002     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Association';
10003 
10004     --we don't use l_api_version yet, but eventually we might:
10005     --if we change required parameters, version goes FROM n.x to (n+1).x
10006     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10007     l_api_version            CONSTANT NUMBER := 1.0;
10008 
10009     ---------------------------------------------------------------------------
10010     -- Type for tracking deletion-constraint checks for Associations with    --
10011     -- various objects; we start with entries for Item, Change, and Projects --
10012     ---------------------------------------------------------------------------
10013     TYPE LOCAL_DEL_ASSOC_CHECK_REC IS RECORD
10014     (
10015         OBJECT_NAME                          VARCHAR2(30)
10016        ,PACKAGE_AND_PROCEDURE                VARCHAR2(60)
10017     );
10018 
10019     TYPE LOCAL_DEL_ASSOC_CHECK_TABLE IS TABLE OF LOCAL_DEL_ASSOC_CHECK_REC
10020       INDEX BY BINARY_INTEGER;
10021 
10022     l_dummy_rec              LOCAL_DEL_ASSOC_CHECK_REC;
10023     l_del_assoc_table        LOCAL_DEL_ASSOC_CHECK_TABLE;
10024     l_association_row        EGO_OBJ_ATTR_GRP_ASSOCS_V%ROWTYPE;
10025     l_del_assoc_check_index  NUMBER;
10026     l_is_ok_to_delete        BOOLEAN := TRUE;
10027     l_api_to_call            VARCHAR2(999);
10028 
10029     CURSOR get_assoc_records (cp_association_id  IN  NUMBER) IS
10030       SELECT *
10031         FROM EGO_OBJ_ATTR_GRP_ASSOCS_V
10032        WHERE (object_id, classification_code, attr_group_id) IN
10033                (SELECT object_id, classification_code, attr_group_id
10034                 FROM ego_obj_ag_assocs_b
10035                 where association_id = cp_association_id);
10036 
10037   BEGIN
10038     code_debug(l_api_name||' started for association '||p_association_id);
10039     -- Standard start of API savepoint
10040     IF FND_API.To_Boolean(p_commit) THEN
10041       SAVEPOINT Delete_Association_PUB;
10042     END IF;
10043 
10044     -- Check for call compatibility
10045     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10046                                         l_api_name, G_PKG_NAME)
10047     THEN
10048       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10049     END IF;
10050     -- Initialize message list even though we don't currently use it
10051     IF FND_API.To_Boolean(p_init_msg_list) THEN
10052       FND_MSG_PUB.Initialize;
10053     END IF;
10054 
10055     --if p_force is true, skip all deletion checks
10056     IF( p_force = fnd_api.g_TRUE ) THEN
10057       code_debug(l_api_name||' deleting association forcefully ');
10058       --delete association blindly
10059       FOR cr IN get_assoc_records(cp_association_id => p_association_id) LOOP
10060         code_debug(l_api_name||' deleting association forcefully for assoc : '||cr.association_id);
10061         DELETE FROM EGO_OBJ_AG_ASSOCS_B
10062          WHERE association_id = cr.association_id;
10063       END LOOP;
10064       l_is_ok_to_delete := TRUE;
10065     ELSE
10066 
10067       -- First, initialize the delete-constraint table
10068       l_dummy_rec.OBJECT_NAME := 'EGO_ITEM';
10069       l_dummy_rec.PACKAGE_AND_PROCEDURE := 'EGO_ITEM_CATALOG_PUB.Check_Delete_AttrGroup_Assoc';
10070       l_del_assoc_table(1) := l_dummy_rec;
10071 
10072       l_dummy_rec.OBJECT_NAME := 'PA_PROJECTS';
10073       l_dummy_rec.PACKAGE_AND_PROCEDURE := 'PA_USER_ATTR_PUB.Check_Delete_Assoc_Ok';
10074       l_del_assoc_table(2) := l_dummy_rec;
10075 
10076       l_dummy_rec.OBJECT_NAME := 'ENG_CHANGE';
10077       l_dummy_rec.PACKAGE_AND_PROCEDURE := 'EGO_CHANGE_USER_ATTRS_PUB.Check_Delete_Associations'; --Bug 3070807
10078       l_del_assoc_table(3) := l_dummy_rec;
10079 
10080       l_dummy_rec.OBJECT_NAME := 'ENG_CHANGE_LINE';
10081       l_dummy_rec.PACKAGE_AND_PROCEDURE := 'EGO_CHANGE_USER_ATTRS_PUB.Check_Delete_Associations'; --Bug 3070807
10082       l_del_assoc_table(4) := l_dummy_rec;
10083 
10084       l_api_to_call := NULL;
10085       FOR cr IN get_assoc_records(cp_association_id => p_association_id) LOOP
10086 
10087         code_debug(l_api_name||' obj : '||cr.object_name||' assoc id : '||cr.association_id
10088         ||' class code: '||cr.classification_code||' data level: '|| cr.data_level_int_name);
10089 
10090         -- Next, find and call any delete-constraint procedures provided
10091         l_del_assoc_check_index := l_del_assoc_table.FIRST;
10092         WHILE (l_del_assoc_check_index <= l_del_assoc_table.LAST AND l_api_to_call IS NULL) LOOP
10093           IF (l_del_assoc_table(l_del_assoc_check_index).OBJECT_NAME = cr.OBJECT_NAME AND
10094               l_del_assoc_table(l_del_assoc_check_index).PACKAGE_AND_PROCEDURE IS NOT NULL) THEN
10095             l_api_to_call := l_del_assoc_table(l_del_assoc_check_index).PACKAGE_AND_PROCEDURE;
10096           END IF;
10097           l_del_assoc_check_index := l_del_assoc_table.NEXT(l_del_assoc_check_index);
10098         END LOOP;
10099 
10100         IF l_api_to_call IS NOT NULL THEN
10101 
10102           DECLARE
10103             l_dynamic_sql    VARCHAR2(700);
10104             l_ok_to_delete   VARCHAR2(1) := fnd_api.G_FALSE;
10105           BEGIN
10106             code_debug(l_api_name||' calling '||l_api_to_call);
10107             l_dynamic_sql := 'BEGIN ' ||
10108                    l_api_to_call ||
10109                    '( ' ||
10110                    ' p_api_version         => 1.0  '||
10111                    ',p_association_id      => :1   '||
10112                    ',p_classification_code => :2   '||
10113                    ',p_data_level          => :3   '||
10114                    ',p_attr_group_id       => :4   '||
10115                    ',p_application_id      => :5   '||
10116                    ',p_attr_group_type     => :6   '||
10117                    ',p_attr_group_name     => :7   '||
10118                    ',p_enabled_code        => :8   '||
10119                    ',x_ok_to_delete        => :9   '||
10120                    ',x_return_status       => :10  '||
10121                    ',x_errorcode           => :11  '||
10122                    ',x_msg_count           => :12  '||
10123                    ',x_msg_data            => :13  '||
10124                    '); END;';
10125             EXECUTE IMMEDIATE l_dynamic_sql USING IN cr.association_id,
10126                                                   IN cr.classification_code,
10127                                                   IN cr.data_level_int_name,
10128                                                   IN cr.attr_group_id,
10129                                                   IN cr.application_id,
10130                                                   IN cr.attr_group_type,
10131                                                   IN cr.attr_group_name,
10132                                                   IN cr.enabled_code,
10133                                                   OUT l_ok_to_delete,
10134                                                   OUT x_return_status,
10135                                                   OUT x_errorcode,
10136                                                   OUT x_msg_count,
10137                                                   OUT x_msg_data;
10138 
10139             IF (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
10140               l_is_ok_to_delete := FND_API.To_Boolean(l_ok_to_delete);
10141             ELSE
10142               l_is_ok_to_delete := FALSE;
10143             END IF;
10144           EXCEPTION
10145             WHEN OTHERS THEN
10146               code_debug(l_api_name||' EXCEPTION from check '||x_msg_data);
10147 
10148               IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
10149                 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
10150               END IF;
10151               l_is_ok_to_delete := FALSE;
10152           END;
10153         ELSE
10154           l_is_ok_to_delete := TRUE;
10155         END IF;
10156 
10157         -- Finally, if we passed all checks, delete the records
10158         IF (l_is_ok_to_delete) THEN
10159           code_debug(l_api_name||' deleting association as conditions are met for assoc :'||cr.association_id);
10160           DELETE FROM EGO_PAGE_ENTRIES_B
10161           WHERE ASSOCIATION_ID = cr.association_id;
10162 
10163           DELETE FROM EGO_OBJ_AG_ASSOCS_B
10164           WHERE ASSOCIATION_ID = cr.association_id;
10165         ELSE
10166           code_debug(l_api_name||' CANNOT delete as prod specific conditions are not met for :'||cr.association_id);
10167           EXIT;
10168         END IF;
10169 
10170       END LOOP;
10171 
10172     END IF; --check p_force
10173 
10174 
10175     IF (l_is_ok_to_delete) THEN
10176       -- Standard check of p_commit
10177       IF FND_API.To_Boolean(p_commit) THEN
10178         COMMIT WORK;
10179       END IF;
10180       x_return_status := FND_API.G_RET_STS_SUCCESS;
10181     ELSE
10182       IF FND_API.To_Boolean(p_commit) THEN
10183         ROLLBACK TO Delete_Association_PUB;
10184       END IF;
10185       x_return_status := FND_API.G_RET_STS_ERROR;
10186     END IF;
10187     code_debug(l_api_name||' setting return status as '||x_return_status);
10188 
10189   EXCEPTION
10190     WHEN OTHERS THEN
10191       code_debug(l_api_name||' EXCEPTION : '||SQLERRM);
10192       IF FND_API.To_Boolean(p_commit) THEN
10193         ROLLBACK TO Delete_Association_PUB;
10194       END IF;
10195       IF get_assoc_records%ISOPEN THEN
10196         CLOSE get_assoc_records;
10197       END IF;
10198       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10199 
10200       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10201       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10202       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10203       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10204       FND_MSG_PUB.Add;
10205       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10206                                ,p_count   => x_msg_count
10207                                ,p_data    => x_msg_data);
10208 
10209 END Delete_Association;
10210 
10211 ----------------------------------------------------------------------
10212 
10213 
10214                  -------------------------------
10215                  -- Attribute Group Page APIs --
10216                  -------------------------------
10217 
10218 ----------------------------------------------------------------------
10219 
10220 PROCEDURE Create_Page (
10221         p_api_version                   IN   NUMBER
10222        ,p_page_id                       IN   NUMBER DEFAULT NULL
10223        ,p_object_id                     IN   NUMBER
10224        ,p_classification_code           IN   VARCHAR2
10225        ,p_data_level                    IN   VARCHAR2
10226        ,p_internal_name                 IN   VARCHAR2
10227        ,p_display_name                  IN   VARCHAR2
10228        ,p_description                   IN   VARCHAR2
10229        ,p_sequence                      IN   NUMBER
10230        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10231        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10232        ,x_page_id                       OUT NOCOPY NUMBER
10233        ,x_return_status                 OUT NOCOPY VARCHAR2
10234        ,x_errorcode                     OUT NOCOPY NUMBER
10235        ,x_msg_count                     OUT NOCOPY NUMBER
10236        ,x_msg_data                      OUT NOCOPY VARCHAR2
10237 ) IS
10238 
10239     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Page';
10240 
10241     --we don't use l_api_version yet, but eventually we might:
10242     --if we change required parameters, version goes FROM n.x to (n+1).x
10243     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10244     l_api_version            CONSTANT NUMBER := 1.0;
10245 
10246     l_Sysdate                DATE := Sysdate;
10247 
10248   BEGIN
10249 
10250     -- Standard start of API savepoint
10251     IF FND_API.To_Boolean(p_commit) THEN
10252       SAVEPOINT Create_Page_PUB;
10253     END IF;
10254 
10255     -- Check for call compatibility
10256     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10257                                         l_api_name, G_PKG_NAME)
10258     THEN
10259       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10260     END IF;
10261     -- Initialize message list even though we don't currently use it
10262     IF FND_API.To_Boolean(p_init_msg_list) THEN
10263       FND_MSG_PUB.Initialize;
10264     END IF;
10265 
10266     --if page id is not provided, get page id from sequence
10267     IF( p_page_id IS NULL ) THEN
10268       SELECT EGO_PAGES_S.NEXTVAL INTO x_page_id FROM DUAL;
10269     ELSE
10270       x_page_id := p_page_id;
10271     END IF;
10272 
10273     INSERT INTO EGO_PAGES_B
10274     (
10275         PAGE_ID
10276        ,OBJECT_ID
10277        ,CLASSIFICATION_CODE
10278        ,DATA_LEVEL
10279        ,INTERNAL_NAME
10280        ,SEQUENCE
10281        ,CREATION_DATE
10282        ,CREATED_BY
10283        ,LAST_UPDATE_DATE
10284        ,LAST_UPDATED_BY
10285        ,LAST_UPDATE_LOGIN
10286     )
10287     VALUES
10288     (
10289         x_page_id
10290        ,p_object_id
10291        ,p_classification_code
10292        ,p_data_level
10293        ,p_internal_name
10294        ,p_sequence
10295        ,l_Sysdate
10296        ,g_current_user_id
10297        ,l_Sysdate
10298        ,g_current_user_id
10299        ,g_current_login_id
10300     );
10301 
10302     INSERT INTO EGO_PAGES_TL
10303     (
10304         PAGE_ID
10305        ,DISPLAY_NAME
10306        ,DESCRIPTION
10307        ,LANGUAGE
10308        ,SOURCE_LANG
10309        ,CREATION_DATE
10310        ,CREATED_BY
10311        ,LAST_UPDATE_DATE
10312        ,LAST_UPDATED_BY
10313        ,LAST_UPDATE_LOGIN
10314     )
10315     SELECT
10316         x_page_id
10317        ,p_display_name
10318        ,p_description
10319        ,L.LANGUAGE_CODE
10320        ,USERENV('LANG')
10321        ,l_Sysdate
10322        ,g_current_user_id
10323        ,l_Sysdate
10324        ,g_current_user_id
10325        ,g_current_login_id
10326     FROM FND_LANGUAGES L
10327     WHERE L.INSTALLED_FLAG in ('I', 'B');
10328 
10329     -- Standard check of p_commit
10330     IF FND_API.To_Boolean(p_commit) THEN
10331       COMMIT WORK;
10332     END IF;
10333 
10334     x_return_status := FND_API.G_RET_STS_SUCCESS;
10335 
10336   EXCEPTION
10337     WHEN OTHERS THEN
10338       IF FND_API.To_Boolean(p_commit) THEN
10339         ROLLBACK TO Create_Page_PUB;
10340       END IF;
10341       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10342 
10343       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10344       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10345       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10346       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10347       FND_MSG_PUB.Add;
10348       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10349                                ,p_count   => x_msg_count
10350                                ,p_data    => x_msg_data);
10351 
10352 END Create_Page;
10353 
10354 ----------------------------------------------------------------------
10355 
10356 PROCEDURE Update_Page (
10357         p_api_version                   IN   NUMBER
10358        ,p_page_id                       IN   NUMBER
10359        ,p_internal_name                 IN   VARCHAR2
10360        ,p_display_name                  IN   VARCHAR2
10361        ,p_description                   IN   VARCHAR2
10362        ,p_sequence                      IN   NUMBER
10363        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10364        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10365        ,p_is_nls_mode                   IN   VARCHAR2   DEFAULT FND_API.G_FALSE
10366        ,x_return_status                 OUT NOCOPY VARCHAR2
10367        ,x_errorcode                     OUT NOCOPY NUMBER
10368        ,x_msg_count                     OUT NOCOPY NUMBER
10369        ,x_msg_data                      OUT NOCOPY VARCHAR2
10370 ) IS
10371 
10372     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Page';
10373 
10374     --we don't use l_api_version yet, but eventually we might:
10375     --if we change required parameters, version goes FROM n.x to (n+1).x
10376     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10377     l_api_version            CONSTANT NUMBER := 1.0;
10378 
10379     l_Sysdate            DATE := Sysdate;
10380 
10381   BEGIN
10382 
10383     -- Standard start of API savepoint
10384     IF FND_API.To_Boolean(p_commit) THEN
10385       SAVEPOINT Update_Page_PUB;
10386     END IF;
10387 
10388     -- Check for call compatibility
10389     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10390                                         l_api_name, G_PKG_NAME)
10391     THEN
10392       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10393     END IF;
10394     -- Initialize message list even though we don't currently use it
10395     IF FND_API.To_Boolean(p_init_msg_list) THEN
10396       FND_MSG_PUB.Initialize;
10397     END IF;
10398 
10399     IF (FND_API.To_Boolean(p_is_nls_mode)) THEN
10400 
10401       -- We do this IF check this way so that if p_is_nls_mode is NULL,
10402       -- we still update the non-trans table (i.e., we treat NULL as 'F')
10403       NULL;
10404 
10405     ELSE
10406 
10407       -- We only update this information if we are NOT in NLS mode
10408       -- (i.e., we don't update it if we are in NLS mode)
10409       UPDATE EGO_PAGES_B
10410          SET INTERNAL_NAME = p_internal_name,
10411              SEQUENCE = p_sequence,
10412              LAST_UPDATED_BY = g_current_user_id,
10413              LAST_UPDATE_DATE = l_Sysdate,
10414              LAST_UPDATE_LOGIN = g_current_login_id
10415        WHERE PAGE_ID = p_page_id;
10416 
10417     END IF;
10418 
10419     -- We update the TL information whether or not we're in NLS mode
10420     UPDATE EGO_PAGES_TL
10421        SET DISPLAY_NAME = p_display_name,
10422            DESCRIPTION = p_description,
10423            LAST_UPDATED_BY = g_current_user_id,
10424            LAST_UPDATE_DATE = l_Sysdate,
10425            LAST_UPDATE_LOGIN = g_current_login_id,
10426            SOURCE_LANG   = USERENV('LANG')
10427      WHERE PAGE_ID = p_page_id
10428        -- AND LANGUAGE = USERENV('LANG');
10429          AND USERENV('LANG') in ( LANGUAGE , SOURCE_LANG);
10430 
10431     -- Standard check of p_commit
10432     IF FND_API.To_Boolean(p_commit) THEN
10433       COMMIT WORK;
10434     END IF;
10435 
10436     x_return_status := FND_API.G_RET_STS_SUCCESS;
10437 
10438   EXCEPTION
10439     WHEN OTHERS THEN
10440       IF FND_API.To_Boolean(p_commit) THEN
10441         ROLLBACK TO Update_Page_PUB;
10442       END IF;
10443       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10444 
10445       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10446       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10447       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10448       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10449       FND_MSG_PUB.Add;
10450       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10451                                ,p_count   => x_msg_count
10452                                ,p_data    => x_msg_data);
10453 
10454 
10455 END Update_Page;
10456 
10457 ----------------------------------------------------------------------
10458 
10459 PROCEDURE Update_Page (
10460         p_api_version                   IN   NUMBER
10461        ,p_object_id                     IN   NUMBER
10462        ,p_classification_code           IN   VARCHAR2
10463        ,p_data_level                    IN   VARCHAR2
10464        ,p_old_internal_name             IN   VARCHAR2
10465        ,p_new_internal_name             IN   VARCHAR2
10466        ,p_display_name                  IN   VARCHAR2
10467        ,p_description                   IN   VARCHAR2
10468        ,p_sequence                      IN   NUMBER
10469        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10470        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10471        ,x_return_status                 OUT NOCOPY VARCHAR2
10472        ,x_errorcode                     OUT NOCOPY NUMBER
10473        ,x_msg_count                     OUT NOCOPY NUMBER
10474        ,x_msg_data                      OUT NOCOPY VARCHAR2
10475 ) IS
10476 
10477     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Page';
10478 
10479     l_page_id                NUMBER;
10480     l_new_internal_name      VARCHAR2(150);
10481 
10482   BEGIN
10483 
10484     -- Standard start of API savepoint
10485     IF FND_API.To_Boolean(p_commit) THEN
10486       SAVEPOINT Update_Page_PUB;
10487     END IF;
10488 
10489     l_page_id := Get_Page_Id_From_PKs(p_object_id
10490                                      ,p_classification_code
10491                                      ,p_old_internal_name);
10492     IF l_page_id IS NULL THEN
10493       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10494     END IF;
10495 
10496     -- If caller hasn't passed in a new internal name, we keep the old one
10497     IF p_new_internal_name IS NULL OR p_new_internal_name = '' THEN
10498       l_new_internal_name := p_old_internal_name;
10499     ELSE
10500       l_new_internal_name := p_new_internal_name;
10501     END IF;
10502 
10503     EGO_EXT_FWK_PUB.Update_Page(
10504         p_api_version                   => p_api_version
10505        ,p_page_id                       => l_page_id
10506        ,p_internal_name                 => l_new_internal_name
10507        ,p_display_name                  => p_display_name
10508        ,p_description                   => p_description
10509        ,p_sequence                      => p_sequence
10510        ,p_init_msg_list                 => p_init_msg_list
10511        ,p_commit                        => p_commit
10512        ,x_return_status                 => x_return_status
10513        ,x_errorcode                     => x_errorcode
10514        ,x_msg_count                     => x_msg_count
10515        ,x_msg_data                      => x_msg_data
10516     );
10517 
10518     -- Standard check of p_commit
10519     IF FND_API.To_Boolean(p_commit) THEN
10520       COMMIT WORK;
10521     END IF;
10522 
10523   EXCEPTION
10524     WHEN OTHERS THEN
10525       IF FND_API.To_Boolean(p_commit) THEN
10526         ROLLBACK TO Update_Page_PUB;
10527       END IF;
10528       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10529 
10530       IF l_page_id IS NULL THEN
10531         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoPageFound';
10532       ELSE
10533         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10534         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10535         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10536         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10537         FND_MSG_PUB.Add;
10538         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10539                                  ,p_count   => x_msg_count
10540                                  ,p_data    => x_msg_data);
10541 
10542       END IF;
10543 
10544 END Update_Page;
10545 
10546 ----------------------------------------------------------------------
10547 
10548 PROCEDURE Delete_Page (
10549         p_api_version                   IN   NUMBER
10550        ,p_page_id                       IN   NUMBER
10551        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10552        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10553        ,x_return_status                 OUT NOCOPY VARCHAR2
10554        ,x_errorcode                     OUT NOCOPY NUMBER
10555        ,x_msg_count                     OUT NOCOPY NUMBER
10556        ,x_msg_data                      OUT NOCOPY VARCHAR2
10557 ) IS
10558 
10559     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Page';
10560 
10561     --we don't use l_api_version yet, but eventually we might:
10562     --if we change required parameters, version goes FROM n.x to (n+1).x
10563     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10564     l_api_version            CONSTANT NUMBER := 1.0;
10565 
10566   BEGIN
10567 
10568     -- Standard start of API savepoint
10569     IF FND_API.To_Boolean(p_commit) THEN
10570       SAVEPOINT Delete_Page_PUB;
10571     END IF;
10572 
10573     -- Check for call compatibility
10574     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10575                                         l_api_name, G_PKG_NAME)
10576     THEN
10577       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10578     END IF;
10579     -- Initialize message list even though we don't currently use it
10580     IF FND_API.To_Boolean(p_init_msg_list) THEN
10581       FND_MSG_PUB.Initialize;
10582     END IF;
10583 
10584     DELETE FROM EGO_PAGE_ENTRIES_B
10585      WHERE PAGE_ID = p_page_id;
10586 
10587     DELETE FROM EGO_PAGES_B
10588      WHERE PAGE_ID = p_page_id;
10589 
10590     DELETE FROM EGO_PAGES_TL
10591      WHERE PAGE_ID = p_page_id;
10592 
10593     -- Standard check of p_commit
10594     IF FND_API.To_Boolean(p_commit) THEN
10595       COMMIT WORK;
10596     END IF;
10597 
10598     x_return_status := FND_API.G_RET_STS_SUCCESS;
10599 
10600   EXCEPTION
10601     WHEN OTHERS THEN
10602       IF FND_API.To_Boolean(p_commit) THEN
10603         ROLLBACK TO Delete_Page_PUB;
10604       END IF;
10605       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10606 
10607       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10608       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10609       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10610       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10611       FND_MSG_PUB.Add;
10612       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10613                                ,p_count   => x_msg_count
10614                                ,p_data    => x_msg_data);
10615 
10616 
10617 END Delete_Page;
10618 
10619 ----------------------------------------------------------------------
10620 
10621 PROCEDURE Delete_Page (
10622         p_api_version                   IN   NUMBER
10623        ,p_object_id                     IN   NUMBER
10624        ,p_classification_code           IN   VARCHAR2
10625        ,p_internal_name                 IN   VARCHAR2
10626        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10627        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10628        ,x_return_status                 OUT NOCOPY VARCHAR2
10629        ,x_errorcode                     OUT NOCOPY NUMBER
10630        ,x_msg_count                     OUT NOCOPY NUMBER
10631        ,x_msg_data                      OUT NOCOPY VARCHAR2
10632 ) IS
10633 
10634     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Page';
10635 
10636     l_page_id                NUMBER;
10637 
10638   BEGIN
10639 
10640     -- Standard start of API savepoint
10641     IF FND_API.To_Boolean(p_commit) THEN
10642       SAVEPOINT Delete_Page_PUB;
10643     END IF;
10644 
10645     l_page_id := Get_Page_Id_From_PKs(p_object_id
10646                                      ,p_classification_code
10647                                      ,p_internal_name);
10648     IF l_page_id IS NULL THEN
10649       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10650     END IF;
10651 
10652     EGO_EXT_FWK_PUB.Delete_Page(
10653         p_api_version                   => p_api_version
10654        ,p_page_id                       => l_page_id
10655        ,p_init_msg_list                 => p_init_msg_list
10656        ,p_commit                        => p_commit
10657        ,x_return_status                 => x_return_status
10658        ,x_errorcode                     => x_errorcode
10659        ,x_msg_count                     => x_msg_count
10660        ,x_msg_data                      => x_msg_data
10661     );
10662 
10663     -- Standard check of p_commit
10664     IF FND_API.To_Boolean(p_commit) THEN
10665       COMMIT WORK;
10666     END IF;
10667 
10668   EXCEPTION
10669     WHEN OTHERS THEN
10670       IF FND_API.To_Boolean(p_commit) THEN
10671         ROLLBACK TO Delete_Page_PUB;
10672       END IF;
10673       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10674 
10675       IF l_page_id IS NULL THEN
10676         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoPageFound';
10677       ELSE
10678         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10679         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10680         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10681         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10682         FND_MSG_PUB.Add;
10683         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10684                                  ,p_count   => x_msg_count
10685                                  ,p_data    => x_msg_data);
10686 
10687       END IF;
10688 
10689 END Delete_Page;
10690 
10691 ----------------------------------------------------------------------
10692 
10693 -- A "group by" function for SQL queries
10694 FUNCTION Group_Page_Regions (
10695         p_association_id                IN   NUMBER
10696        ,p_object_id                     IN   NUMBER
10697        ,p_object_name                   IN   VARCHAR2
10698        ,p_classification_code           IN   VARCHAR2
10699        ,p_data_level                    IN   VARCHAR2
10700        ,p_application_id                IN   NUMBER
10701        ,p_attr_group_type               IN   VARCHAR2
10702        ,p_attr_group_name               IN   VARCHAR2
10703        ,p_attr_group_disp_name          IN   VARCHAR2
10704        ,p_attr_group_description        IN   VARCHAR2
10705        ,p_enabled_code                  IN   VARCHAR2
10706 )
10707 RETURN VARCHAR2
10708 IS
10709 
10710     l_page_region_disp_name VARCHAR2(240);
10711     l_page_region_list      VARCHAR2(4000) := '';/* Increased the length from 2400 to 4000*/
10712 
10713     /*Changed the query for performance reason
10714     CURSOR page_region_csr (cp_association_id IN NUMBER) IS
10715     SELECT PAGE_DISPLAY_NAME
10716       FROM EGO_PAGE_ENTRIES_V
10717      WHERE ASSOCIATION_ID = cp_association_id;*/
10718 
10719 
10720    CURSOR page_region_csr (cp_association_id IN NUMBER) IS
10721        select display_name PAGE_DISPLAY_NAME from ego_pages_v
10722    where page_id in (select page_id from ego_page_entries_b
10723    where ASSOCIATION_ID = cp_association_id);
10724 
10725 
10726   BEGIN
10727 
10728     FOR page_region_rec IN page_region_csr(p_association_id)
10729     LOOP
10730       l_page_region_list := l_page_region_list || page_region_rec.PAGE_DISPLAY_NAME || ', ';
10731     END LOOP;
10732 
10733     --Joseph : We need to Keep LENGTHB instead of LENGTH for Multi-Byte Language Support.
10734     IF (LENGTHB(l_page_region_list) > 0) THEN
10735       -- strip off the trailing ', '
10736       l_page_region_list := SUBSTRB(l_page_region_list, 1, LENGTHB(l_page_region_list) - LENGTHB(', '));
10737     ELSE
10738       l_page_region_list := NULL;
10739     END IF;
10740     RETURN l_page_region_list;
10741 
10742 END;
10743 
10744 ----------------------------------------------------------------------
10745 
10746                       ---------------------
10747                       -- Page Entry APIs --
10748                       ---------------------
10749 
10750 ----------------------------------------------------------------------
10751 
10752 PROCEDURE Create_Page_Entry (
10753         p_api_version                   IN   NUMBER
10754        ,p_page_id                       IN   NUMBER
10755        ,p_association_id                IN   NUMBER
10756        ,p_sequence                      IN   NUMBER
10757        ,p_classification_code           IN   VARCHAR2
10758        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10759        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10760        ,x_return_status                 OUT NOCOPY VARCHAR2
10761        ,x_errorcode                     OUT NOCOPY NUMBER
10762        ,x_msg_count                     OUT NOCOPY NUMBER
10763        ,x_msg_data                      OUT NOCOPY VARCHAR2
10764 ) IS
10765 
10766     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Page_Entry';
10767 
10768     --we don't use l_api_version yet, but eventually we might:
10769     --if we change required parameters, version goes FROM n.x to (n+1).x
10770     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10771     l_api_version            CONSTANT NUMBER := 1.0;
10772 
10773     l_Sysdate                DATE := Sysdate;
10774 
10775   BEGIN
10776 
10777     -- Standard start of API savepoint
10778     IF FND_API.To_Boolean(p_commit) THEN
10779       SAVEPOINT Create_Page_Entry_PUB;
10780     END IF;
10781 
10782     -- Check for call compatibility
10783     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10784                                         l_api_name, G_PKG_NAME)
10785     THEN
10786       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10787     END IF;
10788     -- Initialize message list even though we don't currently use it
10789     IF FND_API.To_Boolean(p_init_msg_list) THEN
10790       FND_MSG_PUB.Initialize;
10791     END IF;
10792 
10793     INSERT INTO EGO_PAGE_ENTRIES_B
10794     (
10795         PAGE_ID
10796        ,ASSOCIATION_ID
10797        ,SEQUENCE
10798        ,CLASSIFICATION_CODE
10799        ,CREATION_DATE
10800        ,CREATED_BY
10801        ,LAST_UPDATE_DATE
10802        ,LAST_UPDATED_BY
10803        ,LAST_UPDATE_LOGIN
10804     )
10805     VALUES
10806     (
10807         p_page_id
10808        ,p_association_id
10809        ,p_sequence
10810        ,p_classification_code
10811        ,l_Sysdate
10812        ,g_current_user_id
10813        ,l_Sysdate
10814        ,g_current_user_id
10815        ,g_current_login_id
10816     );
10817 
10818     -- Standard check of p_commit
10819     IF FND_API.To_Boolean(p_commit) THEN
10820       COMMIT WORK;
10821     END IF;
10822 
10823     x_return_status := FND_API.G_RET_STS_SUCCESS;
10824 
10825   EXCEPTION
10826     WHEN DUP_VAL_ON_INDEX THEN
10827       IF FND_API.To_Boolean(p_commit) THEN
10828         ROLLBACK TO Create_Page_Entry_PUB;
10829       END IF;
10830       x_return_status := FND_API.G_RET_STS_ERROR;
10831       DECLARE
10832         l_ag_disp_name       VARCHAR2(80);
10833         l_page_disp_name     VARCHAR2(240);
10834         l_class_meaning      VARCHAR2(1000);
10835       BEGIN
10836         SELECT A.ATTR_GROUP_DISP_NAME
10837               ,PE.PAGE_DISPLAY_NAME
10838               ,EGO_EXT_FWK_PUB.Get_Class_Meaning(A.OBJECT_ID, PE.CLASSIFICATION_CODE)
10839           INTO l_ag_disp_name
10840               ,l_page_disp_name
10841               ,l_class_meaning
10842           FROM EGO_OBJ_ATTR_GRP_ASSOCS_V A,
10843                EGO_PAGE_ENTRIES_V PE
10844          WHERE A.ASSOCIATION_ID = PE.ASSOCIATION_ID
10845            AND PE.PAGE_ID = p_page_id
10846            AND PE.ASSOCIATION_ID = p_association_id;
10847 
10848         FND_MESSAGE.Set_Name('EGO', 'EGO_EF_AG_ALREADY_IN_PAGE');
10849         FND_MESSAGE.Set_Token('AG_NAME', l_ag_disp_name);
10850         FND_MESSAGE.Set_Token('PAGE_NAME', l_page_disp_name);
10851         FND_MESSAGE.Set_Token('CLASS_MEANING', l_class_meaning);
10852         FND_MSG_PUB.Add;
10853         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10854                                  ,p_count   => x_msg_count
10855                                  ,p_data    => x_msg_data);
10856 --ego_ef_test_pub.insert_into_ego_err_msgs(x_msg_data);
10857       ------------------------------------------------------------------
10858       -- If anything went wrong with our user-friend error reporting, --
10859       -- just resort to the unexpected error reporting behavior.      --
10860       ------------------------------------------------------------------
10861       EXCEPTION
10862         WHEN OTHERS THEN
10863           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10864 
10865           FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10866           FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10867           FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10868           FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10869           FND_MSG_PUB.Add;
10870           FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10871                                    ,p_count   => x_msg_count
10872                                    ,p_data    => x_msg_data);
10873       END;
10874 
10875     WHEN OTHERS THEN
10876       IF FND_API.To_Boolean(p_commit) THEN
10877         ROLLBACK TO Create_Page_Entry_PUB;
10878       END IF;
10879       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10880 
10881       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10882       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10883       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10884       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10885       FND_MSG_PUB.Add;
10886       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10887                                ,p_count   => x_msg_count
10888                                ,p_data    => x_msg_data);
10889 
10890 
10891 END Create_Page_Entry;
10892 
10893 ----------------------------------------------------------------------
10894 
10895 PROCEDURE Update_Page_Entry (
10896         p_api_version                   IN   NUMBER
10897        ,p_page_id                       IN   NUMBER
10898        ,p_new_association_id            IN   NUMBER --2995435: Doesnt update association id
10899        ,p_old_association_id            IN   NUMBER --2995435: Doesnt update association id
10900        ,p_sequence                      IN   NUMBER
10901        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
10902        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
10903        ,x_return_status                 OUT NOCOPY VARCHAR2
10904        ,x_errorcode                     OUT NOCOPY NUMBER
10905        ,x_msg_count                     OUT NOCOPY NUMBER
10906        ,x_msg_data                      OUT NOCOPY VARCHAR2
10907 ) IS
10908 
10909     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Page_Entry';
10910 
10911     --we don't use l_api_version yet, but eventually we might:
10912     --if we change required parameters, version goes FROM n.x to (n+1).x
10913     --if we change optional parameters, version goes FROM x.n to x.(n+1)
10914     l_api_version            CONSTANT NUMBER := 1.0;
10915 
10916     l_Sysdate                DATE := Sysdate;
10917 
10918   BEGIN
10919 
10920     -- Standard start of API savepoint
10921     IF FND_API.To_Boolean(p_commit) THEN
10922       SAVEPOINT Update_Page_Entry_PUB;
10923     END IF;
10924 
10925     -- Check for call compatibility
10926     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
10927                                         l_api_name, G_PKG_NAME)
10928     THEN
10929       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10930     END IF;
10931     -- Initialize message list even though we don't currently use it
10932     IF FND_API.To_Boolean(p_init_msg_list) THEN
10933       FND_MSG_PUB.Initialize;
10934     END IF;
10935 
10936     UPDATE EGO_PAGE_ENTRIES_B
10937        SET SEQUENCE            = p_sequence,
10938            ASSOCIATION_ID      = p_new_association_id, --2995435: Doesnt update association id
10939            LAST_UPDATED_BY     = g_current_user_id,
10940            LAST_UPDATE_DATE    = l_Sysdate,
10941            LAST_UPDATE_LOGIN   = g_current_login_id
10942      WHERE PAGE_ID             = p_page_id
10943        AND ASSOCIATION_ID      = p_old_association_id;
10944 
10945     -- Standard check of p_commit
10946     IF FND_API.To_Boolean(p_commit) THEN
10947       COMMIT WORK;
10948     END IF;
10949 
10950     x_return_status := FND_API.G_RET_STS_SUCCESS;
10951 
10952   EXCEPTION
10953     WHEN DUP_VAL_ON_INDEX THEN
10954       IF FND_API.To_Boolean(p_commit) THEN
10955         ROLLBACK TO Update_Page_Entry_PUB;
10956       END IF;
10957       x_return_status := FND_API.G_RET_STS_ERROR;
10958       DECLARE
10959         l_ag_disp_name       VARCHAR2(80);
10960         l_page_disp_name     VARCHAR2(240);
10961         l_class_meaning      VARCHAR2(1000);
10962       BEGIN
10963         SELECT A.ATTR_GROUP_DISP_NAME
10964               ,PE.PAGE_DISPLAY_NAME
10965               ,EGO_EXT_FWK_PUB.Get_Class_Meaning(A.OBJECT_ID, PE.CLASSIFICATION_CODE)
10966           INTO l_ag_disp_name
10967               ,l_page_disp_name
10968               ,l_class_meaning
10969           FROM EGO_OBJ_ATTR_GRP_ASSOCS_V A,
10970                EGO_PAGE_ENTRIES_V PE
10971          WHERE A.ASSOCIATION_ID = PE.ASSOCIATION_ID
10972            AND PE.PAGE_ID = p_page_id
10973            AND PE.ASSOCIATION_ID = p_new_association_id;
10974 
10975         FND_MESSAGE.Set_Name('EGO', 'EGO_EF_AG_ALREADY_IN_PAGE');
10976         FND_MESSAGE.Set_Token('AG_NAME', l_ag_disp_name);
10977         FND_MESSAGE.Set_Token('PAGE_NAME', l_page_disp_name);
10978         FND_MESSAGE.Set_Token('CLASS_MEANING', l_class_meaning);
10979         FND_MSG_PUB.Add;
10980         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10981                                  ,p_count   => x_msg_count
10982                                  ,p_data    => x_msg_data);
10983 
10984       ------------------------------------------------------------------
10985       -- If anything went wrong with our user-friend error reporting, --
10986       -- just resort to the unexpected error reporting behavior.      --
10987       ------------------------------------------------------------------
10988       EXCEPTION
10989         WHEN OTHERS THEN
10990           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10991 
10992           FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
10993           FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
10994           FND_MESSAGE.Set_Token('API_NAME', l_api_name);
10995           FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
10996           FND_MSG_PUB.Add;
10997           FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
10998                                    ,p_count   => x_msg_count
10999                                    ,p_data    => x_msg_data);
11000       END;
11001 
11002     WHEN OTHERS THEN
11003       IF FND_API.To_Boolean(p_commit) THEN
11004         ROLLBACK TO Update_Page_Entry_PUB;
11005       END IF;
11006       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11007 
11008       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11009       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11010       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11011       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11012       FND_MSG_PUB.Add;
11013       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11014                                ,p_count   => x_msg_count
11015                                ,p_data    => x_msg_data);
11016 
11017 
11018 END Update_Page_Entry;
11019 
11020 ----------------------------------------------------------------------
11021 
11022 PROCEDURE Delete_Page_Entry (
11023         p_api_version                   IN   NUMBER
11024        ,p_page_id                       IN   NUMBER
11025        ,p_association_id                IN   NUMBER
11026        ,p_classification_code           IN   VARCHAR2
11027        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11028        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11029        ,x_return_status                 OUT NOCOPY VARCHAR2
11030        ,x_errorcode                     OUT NOCOPY NUMBER
11031        ,x_msg_count                     OUT NOCOPY NUMBER
11032        ,x_msg_data                      OUT NOCOPY VARCHAR2
11033 ) IS
11034 
11035     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Page_Entry';
11036 
11037     --we don't use l_api_version yet, but eventually we might:
11038     --if we change required parameters, version goes FROM n.x to (n+1).x
11039     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11040     l_api_version            CONSTANT NUMBER := 1.0;
11041 
11042   BEGIN
11043 
11044     -- Standard start of API savepoint
11045     IF FND_API.To_Boolean(p_commit) THEN
11046       SAVEPOINT Delete_Page_Entry_PUB;
11047     END IF;
11048 
11049     -- Check for call compatibility
11050     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11051                                         l_api_name, G_PKG_NAME)
11052     THEN
11053       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11054     END IF;
11055     -- Initialize message list even though we don't currently use it
11056     IF FND_API.To_Boolean(p_init_msg_list) THEN
11057       FND_MSG_PUB.Initialize;
11058     END IF;
11059 
11060  --Bug 3871440
11061     DELETE FROM EGO_PAGE_ENTRIES_B
11062      WHERE PAGE_ID = p_page_id
11063        AND ASSOCIATION_ID = p_association_id
11064        AND CLASSIFICATION_CODE = p_classification_code;
11065 
11066     -- Standard check of p_commit
11067     IF FND_API.To_Boolean(p_commit) THEN
11068       COMMIT WORK;
11069     END IF;
11070 
11071     x_return_status := FND_API.G_RET_STS_SUCCESS;
11072 
11073   EXCEPTION
11074     WHEN OTHERS THEN
11075       IF FND_API.To_Boolean(p_commit) THEN
11076         ROLLBACK TO Delete_Page_Entry_PUB;
11077       END IF;
11078       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11079 
11080       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11081       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11082       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11083       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11084       FND_MSG_PUB.Add;
11085       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11086                                ,p_count   => x_msg_count
11087                                ,p_data    => x_msg_data);
11088 
11089 
11090 END Delete_Page_Entry;
11091 
11092 ----------------------------------------------------------------------
11093 
11094                        -------------------
11095                        -- Function APIs --
11096                        -------------------
11097 
11098 ----------------------------------------------------------------------
11099 
11100 PROCEDURE Create_Function (
11101         p_api_version                   IN   NUMBER
11102        ,p_internal_name                 IN   VARCHAR2
11103        ,p_function_type                 IN   VARCHAR2
11104        ,p_function_info_1               IN   VARCHAR2
11105        ,p_function_info_2               IN   VARCHAR2
11106        ,p_display_name                  IN   VARCHAR2
11107        ,p_description                   IN   VARCHAR2
11108        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11109        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11110        ,x_function_id                   OUT NOCOPY NUMBER
11111        ,x_return_status                 OUT NOCOPY VARCHAR2
11112        ,x_errorcode                     OUT NOCOPY NUMBER
11113        ,x_msg_count                     OUT NOCOPY NUMBER
11114        ,x_msg_data                      OUT NOCOPY VARCHAR2
11115 ) IS
11116 
11117     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Function';
11118 
11119     --we don't use l_api_version yet, but eventually we might:
11120     --if we change required parameters, version goes FROM n.x to (n+1).x
11121     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11122     l_api_version            CONSTANT NUMBER := 1.0;
11123 
11124     l_Sysdate                DATE := Sysdate;
11125 
11126   BEGIN
11127 
11128     -- Standard start of API savepoint
11129     IF FND_API.To_Boolean(p_commit) THEN
11130       SAVEPOINT Create_Function_PUB;
11131     END IF;
11132 
11133     -- Check for call compatibility
11134     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11135                                         l_api_name, G_PKG_NAME)
11136     THEN
11137       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11138     END IF;
11139     -- Initialize message list even though we don't currently use it
11140     IF FND_API.To_Boolean(p_init_msg_list) THEN
11141       FND_MSG_PUB.Initialize;
11142     END IF;
11143 
11144     SELECT EGO_FUNCTIONS_S.NEXTVAL INTO x_function_id FROM DUAL;
11145 
11146     INSERT INTO EGO_FUNCTIONS_B
11147     (
11148         FUNCTION_ID
11149        ,INTERNAL_NAME
11150        ,FUNCTION_TYPE
11151        ,FUNCTION_INFO_1
11152        ,FUNCTION_INFO_2
11153        ,LAST_UPDATE_DATE
11154        ,LAST_UPDATED_BY
11155        ,CREATION_DATE
11156        ,CREATED_BY
11157        ,LAST_UPDATE_LOGIN
11158     )
11159     VALUES
11160     (
11161         x_function_id
11162        ,p_internal_name
11163        ,p_function_type
11164        ,p_FUNCTION_INFO_1
11165        ,p_FUNCTION_INFO_2
11166        ,l_Sysdate
11167        ,g_current_user_id
11168        ,l_Sysdate
11169        ,g_current_user_id
11170        ,g_current_login_id
11171     );
11172 
11173     INSERT INTO EGO_FUNCTIONS_TL
11174     (
11175         FUNCTION_ID
11176        ,DISPLAY_NAME
11177        ,DESCRIPTION
11178        ,LANGUAGE
11179        ,SOURCE_LANG
11180        ,LAST_UPDATE_DATE
11181        ,LAST_UPDATED_BY
11182        ,CREATION_DATE
11183        ,CREATED_BY
11184        ,LAST_UPDATE_LOGIN
11185     )
11186     SELECT
11187         x_function_id
11188        ,p_display_name
11189        ,p_description
11190        ,L.LANGUAGE_CODE
11191        ,USERENV('LANG')
11192        ,l_Sysdate
11193        ,g_current_user_id
11194        ,l_Sysdate
11195        ,g_current_user_id
11196        ,g_current_login_id
11197     FROM FND_LANGUAGES L
11198     WHERE L.INSTALLED_FLAG in ('I', 'B');
11199 
11200     -- Standard check of p_commit
11201     IF FND_API.To_Boolean(p_commit) THEN
11202       COMMIT WORK;
11203     END IF;
11204 
11205     x_return_status := FND_API.G_RET_STS_SUCCESS;
11206 
11207   EXCEPTION
11208     WHEN OTHERS THEN
11209       IF FND_API.To_Boolean(p_commit) THEN
11210         ROLLBACK TO Create_Function_PUB;
11211       END IF;
11212       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11213 
11214       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11215       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11216       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11217       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11218       FND_MSG_PUB.Add;
11219       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11220                                ,p_count   => x_msg_count
11221                                ,p_data    => x_msg_data);
11222 
11223 
11224 END Create_Function;
11225 
11226 ----------------------------------------------------------------------
11227 
11228 PROCEDURE Update_Function (
11229         p_api_version                   IN   NUMBER
11230        ,p_function_id                   IN   NUMBER
11231        ,p_internal_name                 IN   VARCHAR2
11232        ,p_function_info_1               IN   VARCHAR2
11233        ,p_function_info_2               IN   VARCHAR2
11234        ,p_display_name                  IN   VARCHAR2
11235        ,p_description                   IN   VARCHAR2
11236        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11237        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11238        ,x_return_status                 OUT NOCOPY VARCHAR2
11239        ,x_errorcode                     OUT NOCOPY NUMBER
11240        ,x_msg_count                     OUT NOCOPY NUMBER
11241        ,x_msg_data                      OUT NOCOPY VARCHAR2
11242 ) IS
11243 
11244     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Function';
11245 
11246     --we don't use l_api_version yet, but eventually we might:
11247     --if we change required parameters, version goes FROM n.x to (n+1).x
11248     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11249     l_api_version            CONSTANT NUMBER := 1.0;
11250 
11251     l_Sysdate            DATE                    := Sysdate;
11252 
11253   BEGIN
11254 
11255     -- Standard start of API savepoint
11256     IF FND_API.To_Boolean(p_commit) THEN
11257       SAVEPOINT Update_Function_PUB;
11258     END IF;
11259 
11260     -- Check for call compatibility
11261     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11262                                         l_api_name, G_PKG_NAME)
11263     THEN
11264       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11265     END IF;
11266     -- Initialize message list even though we don't currently use it
11267     IF FND_API.To_Boolean(p_init_msg_list) THEN
11268       FND_MSG_PUB.Initialize;
11269     END IF;
11270 
11271     UPDATE EGO_FUNCTIONS_B
11272     SET
11273       INTERNAL_NAME     = p_internal_name
11274     , FUNCTION_INFO_1   = p_FUNCTION_INFO_1
11275     , FUNCTION_INFO_2   = p_FUNCTION_INFO_2
11276     , LAST_UPDATE_DATE  = l_Sysdate
11277     , LAST_UPDATED_BY   = g_current_user_id
11278     , LAST_UPDATE_LOGIN = g_current_login_id
11279 
11280     WHERE
11281     FUNCTION_ID = p_function_id;
11282 
11283     UPDATE EGO_FUNCTIONS_TL
11284     SET
11285       DISPLAY_NAME      = p_display_name
11286     , DESCRIPTION       = p_description
11287     , LAST_UPDATE_DATE  = l_Sysdate
11288     , LAST_UPDATED_BY   = g_current_user_id
11289     , LAST_UPDATE_LOGIN = g_current_login_id
11290     , SOURCE_LANG   = USERENV('LANG')
11291     WHERE
11292     -- FUNCTION_ID = p_function_id AND LANGUAGE = USERENV('LANG');
11293      FUNCTION_ID = p_function_id AND USERENV('LANG') IN (LANGUAGE ,SOURCE_LANG );
11294 
11295     -- Standard check of p_commit
11296     IF FND_API.To_Boolean(p_commit) THEN
11297       COMMIT WORK;
11298     END IF;
11299 
11300     x_return_status := FND_API.G_RET_STS_SUCCESS;
11301 
11302   EXCEPTION
11303     WHEN OTHERS THEN
11304       IF FND_API.To_Boolean(p_commit) THEN
11305         ROLLBACK TO Update_Function_PUB;
11306       END IF;
11307       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11308 
11309       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11310       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11311       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11312       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11313       FND_MSG_PUB.Add;
11314       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11315                                ,p_count   => x_msg_count
11316                                ,p_data    => x_msg_data);
11317 
11318 
11319 END Update_Function;
11320 
11321 ----------------------------------------------------------------------
11322 
11323 PROCEDURE Delete_Function (
11324         p_api_version                   IN   NUMBER
11325        ,p_function_id                   IN   NUMBER
11326        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11327        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11328        ,x_return_status                 OUT NOCOPY VARCHAR2
11329        ,x_errorcode                     OUT NOCOPY NUMBER
11330        ,x_msg_count                     OUT NOCOPY NUMBER
11331        ,x_msg_data                      OUT NOCOPY VARCHAR2
11332 ) IS
11333 
11334     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Function';
11335 
11336     --we don't use l_api_version yet, but eventually we might:
11337     --if we change required parameters, version goes FROM n.x to (n+1).x
11338     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11339     l_api_version            CONSTANT NUMBER := 1.0;
11340 
11341     l_function_use_count     NUMBER;
11342     l_delete_error_flag      VARCHAR2(1) := 'N';
11343     l_Sysdate                DATE := Sysdate;
11344 
11345   BEGIN
11346 
11347     -- Standard start of API savepoint
11348     IF FND_API.To_Boolean(p_commit) THEN
11349       SAVEPOINT Delete_Function_PUB;
11350     END IF;
11351 
11352     -- Check for call compatibility
11353     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11354                                         l_api_name, G_PKG_NAME)
11355     THEN
11356       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11357     END IF;
11358     -- Initialize message list even though we don't currently use it
11359     IF FND_API.To_Boolean(p_init_msg_list) THEN
11360       FND_MSG_PUB.Initialize;
11361     END IF;
11362 
11363     -- If a Function is in use by any Actions, it cannot be deleted.
11364     -- We check function_id, prompt_function_id and visibility_func_id
11365     -- to make sure the Function we're trying to delete isn't in use.
11366 
11367     SELECT count(*)
11368       INTO l_function_use_count
11369       FROM EGO_ACTIONS_B
11370      WHERE FUNCTION_ID = p_function_id;
11371     IF (l_function_use_count > 0)
11372     THEN
11373       l_delete_error_flag := 'Y';
11374       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11375     END IF;
11376 
11377     SELECT count(*)
11378       INTO l_function_use_count
11379       FROM EGO_ACTION_DISPLAYS_B
11380      WHERE PROMPT_FUNCTION_ID = p_function_id;
11381     IF (l_function_use_count > 0)
11382     THEN
11383       l_delete_error_flag := 'Y';
11384       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11385     END IF;
11386 
11387     SELECT count(*)
11388       INTO l_function_use_count
11389       FROM EGO_ACTION_DISPLAYS_B
11390      WHERE VISIBILITY_FUNC_ID = p_function_id;
11391     IF (l_function_use_count > 0)
11392     THEN
11393       l_delete_error_flag := 'Y';
11394       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11395     END IF;
11396 
11397     DELETE FROM EGO_FUNCTIONS_B
11398     WHERE
11399     FUNCTION_ID = p_function_id;
11400 
11401     DELETE FROM EGO_FUNCTIONS_TL
11402     WHERE
11403     FUNCTION_ID = p_function_id;
11404 
11405     -- Standard check of p_commit
11406     IF FND_API.To_Boolean(p_commit) THEN
11407       COMMIT WORK;
11408     END IF;
11409 
11410     x_return_status := FND_API.G_RET_STS_SUCCESS;
11411 
11412   EXCEPTION
11413     WHEN OTHERS THEN
11414       IF FND_API.To_Boolean(p_commit) THEN
11415         ROLLBACK TO Delete_Function_PUB;
11416       END IF;
11417       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11418 
11419       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11420       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11421       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11422       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11423       FND_MSG_PUB.Add;
11424       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11425                                ,p_count   => x_msg_count
11426                                ,p_data    => x_msg_data);
11427 
11428 
11429       IF (l_delete_error_flag = 'Y') THEN
11430         -- Let the calling API know that this Function is being used
11431         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' FunctionInUse';
11432       END IF;
11433 
11434 END Delete_Function;
11435 
11436 ----------------------------------------------------------------------
11437 
11438                ------------------------------------
11439                -- Action AND Action Display APIs --
11440                ------------------------------------
11441 
11442 ----------------------------------------------------------------------
11443 
11444 PROCEDURE Create_Action (
11445         p_api_version                   IN   NUMBER
11446        ,p_object_id                     IN   NUMBER
11447        ,p_classification_code           IN   VARCHAR2
11448        ,p_attr_group_id                 IN   NUMBER   DEFAULT NULL
11449        ,p_sequence                      IN   NUMBER
11450        ,p_action_name                   IN   VARCHAR2
11451        ,p_description                   IN   VARCHAR2
11452        ,p_function_id                   IN   NUMBER
11453        ,p_enable_key_attrs              IN   VARCHAR2  DEFAULT NULL
11454        ,p_security_privilege_id         IN   NUMBER
11455        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11456        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11457        ,x_action_id                     OUT NOCOPY NUMBER
11458        ,x_return_status                 OUT NOCOPY VARCHAR2
11459        ,x_errorcode                     OUT NOCOPY NUMBER
11460        ,x_msg_count                     OUT NOCOPY NUMBER
11461        ,x_msg_data                      OUT NOCOPY VARCHAR2
11462 ) IS
11463 
11464     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action';
11465 
11466     --we don't use l_api_version yet, but eventually we might:
11467     --if we change required parameters, version goes FROM n.x to (n+1).x
11468     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11469     l_api_version            CONSTANT NUMBER := 1.0;
11470 
11471     l_Sysdate                DATE := Sysdate;
11472     l_validate               NUMBER;
11473 
11474     e_dup_action_seq_error   EXCEPTION;
11475     e_dup_action_name_error  EXCEPTION;
11476 
11477   BEGIN
11478 
11479     -- Standard start of API savepoint
11480     IF FND_API.To_Boolean(p_commit) THEN
11481       SAVEPOINT Create_Action_PUB;
11482     END IF;
11483 
11484     -- Check for call compatibility
11485     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11486                                         l_api_name, G_PKG_NAME)
11487     THEN
11488       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11489     END IF;
11490     -- Initialize message list even though we don't currently use it
11491     IF FND_API.To_Boolean(p_init_msg_list) THEN
11492       FND_MSG_PUB.Initialize;
11493     END IF;
11494 
11495     SELECT EGO_ACTIONS_S.NEXTVAL INTO x_action_id FROM DUAL;
11496 
11497     -- Ensure created action's name or sequence number do not
11498     -- match those of an action already associated with the
11499     -- classification/attribute pair.
11500 
11501     -- Validate sequence
11502     SELECT COUNT(*)
11503       INTO l_validate
11504       FROM EGO_ACTIONS_B
11505      WHERE SEQUENCE = p_sequence
11506        AND OBJECT_ID = p_object_id
11507        AND CLASSIFICATION_CODE = p_classification_code
11508        AND ATTR_GROUP_ID = p_attr_group_id;
11509 
11510     IF (l_validate > 0) THEN
11511       RAISE e_dup_action_seq_error;
11512     END IF;
11513 
11514     -- Validate name
11515     SELECT COUNT(*)
11516       INTO l_validate
11517       FROM EGO_ACTIONS_B
11518      WHERE ACTION_NAME = p_action_name
11519        AND OBJECT_ID = p_object_id
11520        AND CLASSIFICATION_CODE = p_classification_code
11521        AND ATTR_GROUP_ID = p_attr_group_id;
11522 
11523     IF (l_validate > 0) THEN
11524       RAISE e_dup_action_name_error;
11525     END IF;
11526 
11527 
11528     INSERT INTO EGO_ACTIONS_B
11529     (
11530         ACTION_ID
11531        ,OBJECT_ID
11532        ,CLASSIFICATION_CODE
11533        ,ATTR_GROUP_ID
11534        ,SEQUENCE
11535        ,ACTION_NAME
11536        ,FUNCTION_ID
11537        ,ENABLE_KEY_ATTRIBUTES
11538        ,SECURITY_PRIVILEGE_ID
11539        ,LAST_UPDATE_DATE
11540        ,LAST_UPDATED_BY
11541        ,CREATION_DATE
11542        ,CREATED_BY
11543        ,LAST_UPDATE_LOGIN
11544     )
11545     VALUES
11546     (
11547         x_action_id
11548        ,p_object_id
11549        ,p_classification_code
11550        ,p_attr_group_id
11551        ,p_sequence
11552        ,p_action_name
11553        ,p_function_id
11554        ,p_enable_key_attrs
11555        ,p_security_privilege_id
11556        ,l_Sysdate
11557        ,g_current_user_id
11558        ,l_Sysdate
11559        ,g_current_user_id
11560        ,g_current_login_id
11561     );
11562 
11563     INSERT INTO EGO_ACTIONS_TL
11564     (
11565         ACTION_ID
11566        ,DESCRIPTION
11567        ,LANGUAGE
11568        ,SOURCE_LANG
11569        ,LAST_UPDATE_DATE
11570        ,LAST_UPDATED_BY
11571        ,CREATION_DATE
11572        ,CREATED_BY
11573        ,LAST_UPDATE_LOGIN
11574     )
11575     SELECT
11576         x_action_id
11577        ,p_description
11578        ,L.LANGUAGE_CODE
11579        ,USERENV('LANG')
11580        ,l_Sysdate
11581        ,g_current_user_id
11582        ,l_Sysdate
11583        ,g_current_user_id
11584        ,g_current_login_id
11585 
11586     FROM FND_LANGUAGES L
11587     WHERE L.INSTALLED_FLAG in ('I', 'B');
11588 
11589     -- Standard check of p_commit
11590     IF FND_API.To_Boolean(p_commit) THEN
11591       COMMIT WORK;
11592     END IF;
11593 
11594     x_return_status := FND_API.G_RET_STS_SUCCESS;
11595     x_errorcode := 0;
11596 
11597   EXCEPTION
11598     WHEN e_dup_action_seq_error THEN
11599       IF FND_API.To_Boolean(p_commit) THEN
11600         ROLLBACK TO Create_Action_PUB;
11601       END IF;
11602       x_return_status := FND_API.G_RET_STS_ERROR;
11603       x_errorcode := 1;
11604       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ACTN_DUP_SEQ_ERR');
11605       FND_MSG_PUB.Add;
11606       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11607                                ,p_count   => x_msg_count
11608                                ,p_data    => x_msg_data);
11609 
11610     WHEN e_dup_action_name_error THEN
11611       IF FND_API.To_Boolean(p_commit) THEN
11612         ROLLBACK TO Create_Action_PUB;
11613       END IF;
11614       x_return_status := FND_API.G_RET_STS_ERROR;
11615       x_errorcode := 1;
11616       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CR_ACTN_DUP_NAME_ERR');
11617       FND_MSG_PUB.Add;
11618       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11619                                ,p_count   => x_msg_count
11620                                ,p_data    => x_msg_data);
11621 
11622     WHEN OTHERS THEN
11623       IF FND_API.To_Boolean(p_commit) THEN
11624         ROLLBACK TO Create_Action_PUB;
11625       END IF;
11626       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11627       x_errorcode := 1;
11628       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11629       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11630       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11631       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11632       FND_MSG_PUB.Add;
11633       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11634                                ,p_count   => x_msg_count
11635                                ,p_data    => x_msg_data);
11636 
11637 
11638 END Create_Action;
11639 
11640 ----------------------------------------------------------------------
11641 
11642 PROCEDURE Create_Action (
11643         p_api_version                   IN   NUMBER
11644        ,p_object_id                     IN   NUMBER
11645        ,p_classification_code           IN   VARCHAR2
11646        ,p_attr_grp_application_id       IN   NUMBER
11647        ,p_attr_group_type               IN   VARCHAR2
11648        ,p_attr_group_name               IN   VARCHAR2
11649        ,p_sequence                      IN   NUMBER
11650        ,p_action_name                   IN   VARCHAR2
11651        ,p_description                   IN   VARCHAR2
11652        ,p_function_id                   IN   NUMBER
11653        ,p_enable_key_attrs              IN   VARCHAR2  DEFAULT NULL
11654        ,p_security_privilege_id         IN   NUMBER
11655        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11656        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11657        ,x_action_id                     OUT NOCOPY NUMBER
11658        ,x_return_status                 OUT NOCOPY VARCHAR2
11659        ,x_errorcode                     OUT NOCOPY NUMBER
11660        ,x_msg_count                     OUT NOCOPY NUMBER
11661        ,x_msg_data                      OUT NOCOPY VARCHAR2
11662 ) IS
11663 
11664     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action';
11665 
11666     l_attr_group_id          NUMBER;
11667 
11668   BEGIN
11669 
11670     -- Standard start of API savepoint
11671     IF FND_API.To_Boolean(p_commit) THEN
11672       SAVEPOINT Create_Action_PUB;
11673     END IF;
11674 
11675     l_attr_group_id := Get_Attr_Group_Id_From_PKs(p_attr_grp_application_id
11676                                                  ,p_attr_group_type
11677                                                  ,p_attr_group_name);
11678     IF l_attr_group_id IS NULL THEN
11679       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11680     END IF;
11681 
11682     EGO_EXT_FWK_PUB.Create_Action(
11683         p_api_version                   => p_api_version
11684        ,p_object_id                     => p_object_id
11685        ,p_classification_code           => p_classification_code
11686        ,p_attr_group_id                 => l_attr_group_id
11687        ,p_sequence                      => p_sequence
11688        ,p_action_name                   => p_action_name
11689        ,p_description                   => p_description
11690        ,p_function_id                   => p_function_id
11691        ,p_security_privilege_id         => p_security_privilege_id
11692        ,p_init_msg_list                 => p_init_msg_list
11693        ,p_commit                        => p_commit
11694        ,x_action_id                     => x_action_id
11695        ,x_return_status                 => x_return_status
11696        ,x_errorcode                     => x_errorcode
11697        ,x_msg_count                     => x_msg_count
11698        ,x_msg_data                      => x_msg_data
11699     );
11700 
11701     -- Standard check of p_commit
11702     IF FND_API.To_Boolean(p_commit) THEN
11703       COMMIT WORK;
11704     END IF;
11705 
11706   EXCEPTION
11707     WHEN OTHERS THEN
11708       IF FND_API.To_Boolean(p_commit) THEN
11709         ROLLBACK TO Create_Action_PUB;
11710       END IF;
11711       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11712       x_errorcode := 1;
11713 
11714       IF l_attr_group_id IS NULL THEN
11715         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAttrGroupIDFoundForPKs';
11716       ELSE
11717         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11718         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11719         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11720         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11721         FND_MSG_PUB.Add;
11722         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11723                                  ,p_count   => x_msg_count
11724                                  ,p_data    => x_msg_data);
11725 
11726       END IF;
11727 
11728 END Create_Action;
11729 
11730 ----------------------------------------------------------------------
11731 
11732 PROCEDURE Update_Action (
11733         p_api_version                   IN   NUMBER
11734        ,p_action_id                     IN   NUMBER
11735        ,p_sequence                      IN   NUMBER
11736        ,p_action_name                   IN   VARCHAR2
11737        ,p_description                   IN   VARCHAR2
11738        ,p_function_id                   IN   NUMBER
11739        ,p_enable_key_attrs              IN   VARCHAR2 DEFAULT NULL
11740        ,p_security_privilege_id         IN   NUMBER
11741        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11742        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11743        ,x_return_status                 OUT NOCOPY VARCHAR2
11744        ,x_errorcode                     OUT NOCOPY NUMBER
11745        ,x_msg_count                     OUT NOCOPY NUMBER
11746        ,x_msg_data                      OUT NOCOPY VARCHAR2
11747 ) IS
11748 
11749     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Action';
11750 
11751     --we don't use l_api_version yet, but eventually we might:
11752     --if we change required parameters, version goes FROM n.x to (n+1).x
11753     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11754     l_api_version            CONSTANT NUMBER := 1.0;
11755 
11756     l_Sysdate                DATE := Sysdate;
11757     l_validate               NUMBER;
11758     l_old_function_id        NUMBER;
11759     l_mapping_count          NUMBER;
11760     l_mapped_obj_type        EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'A';
11761     l_object_id              NUMBER;
11762     l_classification_code    VARCHAR2(150);
11763     l_attr_group_id          NUMBER;
11764 
11765     e_dup_action_seq_error   EXCEPTION;
11766     e_dup_action_name_error  EXCEPTION;
11767 
11768   BEGIN
11769 
11770     -- Standard start of API savepoint
11771     IF FND_API.To_Boolean(p_commit) THEN
11772       SAVEPOINT Update_Action_PUB;
11773     END IF;
11774 
11775     -- Check for call compatibility
11776     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11777                                         l_api_name, G_PKG_NAME)
11778     THEN
11779       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11780     END IF;
11781     -- Initialize message list even though we don't currently use it
11782     IF FND_API.To_Boolean(p_init_msg_list) THEN
11783       FND_MSG_PUB.Initialize;
11784     END IF;
11785 
11786     -- Disallow changes that duplicate a preexisting action's sequence
11787     -- number or name in the classification/attribute group association.
11788 
11789     -- Retrieve type/classification/attribute group info.
11790     SELECT OBJECT_ID, CLASSIFICATION_CODE, ATTR_GROUP_ID
11791       INTO l_object_id, l_classification_code, l_attr_group_id
11792       FROM EGO_ACTIONS_B
11793     WHERE ACTION_ID = p_action_id;
11794 
11795     -- Validate sequence
11796     SELECT COUNT(*)
11797       INTO l_validate
11798       FROM EGO_ACTIONS_B
11799      WHERE SEQUENCE = p_sequence
11800        AND ACTION_ID <> p_action_id
11801        AND OBJECT_ID = l_object_id
11802        AND CLASSIFICATION_CODE = l_classification_code
11803        AND ATTR_GROUP_ID = l_attr_group_id;
11804 
11805     IF (l_validate > 0) THEN
11806       RAISE e_dup_action_seq_error;
11807     END IF;
11808 
11809     -- Validate name
11810     SELECT COUNT(*)
11811       INTO l_validate
11812       FROM EGO_ACTIONS_B
11813      WHERE ACTION_NAME = p_action_name
11814        AND ACTION_ID <> p_action_id
11815        AND OBJECT_ID = l_object_id
11816        AND CLASSIFICATION_CODE = l_classification_code
11817        AND ATTR_GROUP_ID = l_attr_group_id;
11818 
11819     IF (l_validate > 0) THEN
11820       RAISE e_dup_action_name_error;
11821     END IF;
11822 
11823 
11824     -- If the function_id is different and if there were
11825     -- Mappings for the old Function, we delete those Mappings.
11826 
11827     SELECT FUNCTION_ID
11828       INTO l_old_function_id
11829       FROM EGO_ACTIONS_B
11830      WHERE ACTION_ID = p_action_id;
11831 
11832     IF l_old_function_id <> p_function_id THEN
11833       SELECT COUNT(*)
11834         INTO l_mapping_count
11835         FROM EGO_MAPPINGS_B
11836        WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
11837          AND FUNCTION_ID = l_old_function_id
11838          AND MAPPED_OBJ_TYPE = l_mapped_obj_type;
11839 
11840       IF (l_mapping_count > 0) THEN
11841         EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_old_function_id,
11842                                             l_mapped_obj_type, p_action_id, null,
11843                                             null, x_return_status, x_errorcode,
11844                                             x_msg_count, x_msg_data);
11845       END IF;
11846     END IF;
11847 
11848     UPDATE EGO_ACTIONS_B
11849     SET
11850        SEQUENCE              = p_sequence
11851      , ACTION_NAME           = p_action_name
11852      , FUNCTION_ID           = p_function_id
11853      , SECURITY_PRIVILEGE_ID = p_security_privilege_id
11854      , LAST_UPDATE_DATE      = l_Sysdate
11855      , LAST_UPDATED_BY       = g_current_user_id
11856      , LAST_UPDATE_LOGIN     = g_current_login_id
11857      , ENABLE_KEY_ATTRIBUTES = p_enable_key_attrs
11858     WHERE
11859        ACTION_ID = p_action_id;
11860 
11861     UPDATE EGO_ACTIONS_TL
11862     SET
11863        DESCRIPTION       = p_description
11864      , LAST_UPDATE_DATE  = l_Sysdate
11865      , LAST_UPDATED_BY   = g_current_user_id
11866      , LAST_UPDATE_LOGIN = g_current_login_id
11867      , SOURCE_LANG  = USERENV('LANG')
11868     WHERE
11869       -- ACTION_ID = p_action_id AND LANGUAGE = USERENV('LANG');
11870       ACTION_ID = p_action_id AND USERENV('LANG') IN (LANGUAGE , SOURCE_LANG);
11871 
11872     -- Standard check of p_commit
11873     IF FND_API.To_Boolean(p_commit) THEN
11874       COMMIT WORK;
11875     END IF;
11876 
11877     x_return_status := FND_API.G_RET_STS_SUCCESS;
11878     x_errorcode := 0;
11879 
11880   EXCEPTION
11881     WHEN e_dup_action_seq_error THEN
11882       IF FND_API.To_Boolean(p_commit) THEN
11883         ROLLBACK TO Update_Action_PUB;
11884       END IF;
11885       x_return_status := FND_API.G_RET_STS_ERROR;
11886       x_errorcode := 1;
11887       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_UP_ACTN_DUP_SEQ_ERR');
11888       FND_MSG_PUB.Add;
11889       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11890                                ,p_count   => x_msg_count
11891                                ,p_data    => x_msg_data);
11892 
11893     WHEN e_dup_action_name_error THEN
11894       IF FND_API.To_Boolean(p_commit) THEN
11895         ROLLBACK TO Update_Action_PUB;
11896       END IF;
11897       x_return_status := FND_API.G_RET_STS_ERROR;
11898       x_errorcode := 1;
11899       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_UP_ACTN_DUP_NAME_ERR');
11900       FND_MSG_PUB.Add;
11901       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11902                                ,p_count   => x_msg_count
11903                                ,p_data    => x_msg_data);
11904 
11905     WHEN OTHERS THEN
11906       IF FND_API.To_Boolean(p_commit) THEN
11907         ROLLBACK TO Update_Action_PUB;
11908       END IF;
11909       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11910 
11911       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
11912       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
11913       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
11914       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
11915       FND_MSG_PUB.Add;
11916       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
11917                                ,p_count   => x_msg_count
11918                                ,p_data    => x_msg_data);
11919 
11920 
11921 END Update_Action;
11922 
11923 ----------------------------------------------------------------------
11924 
11925 PROCEDURE Delete_Action (
11926         p_api_version                   IN   NUMBER
11927        ,p_action_id                     IN   NUMBER
11928        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
11929        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
11930        ,x_return_status                 OUT NOCOPY VARCHAR2
11931        ,x_errorcode                     OUT NOCOPY NUMBER
11932        ,x_msg_count                     OUT NOCOPY NUMBER
11933        ,x_msg_data                      OUT NOCOPY VARCHAR2
11934 ) IS
11935 
11936     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Action';
11937 
11938     --we don't use l_api_version yet, but eventually we might:
11939     --if we change required parameters, version goes FROM n.x to (n+1).x
11940     --if we change optional parameters, version goes FROM x.n to x.(n+1)
11941     l_api_version            CONSTANT NUMBER := 1.0;
11942 
11943     l_function_id            NUMBER;
11944     l_mapping_count          NUMBER;
11945     l_mapped_obj_type        EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'A';
11946     --R12C
11947     l_visibility_count          NUMBER;
11948 
11949 
11950   BEGIN
11951 
11952     -- Standard start of API savepoint
11953     IF FND_API.To_Boolean(p_commit) THEN
11954       SAVEPOINT Delete_Action_PUB;
11955     END IF;
11956 
11957     -- Check for call compatibility
11958     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
11959                                         l_api_name, G_PKG_NAME)
11960     THEN
11961       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11962     END IF;
11963     -- Initialize message list even though we don't currently use it
11964     IF FND_API.To_Boolean(p_init_msg_list) THEN
11965       FND_MSG_PUB.Initialize;
11966     END IF;
11967 
11968     -- We get the Function ID before deleting the row so we can
11969     -- delete Mappings for the Function if necessary.
11970 
11971     SELECT FUNCTION_ID
11972       INTO l_function_id
11973       FROM EGO_ACTIONS_B
11974      WHERE ACTION_ID = p_action_id;
11975 
11976     DELETE FROM EGO_ACTIONS_B
11977     WHERE
11978     ACTION_ID = p_action_id;
11979 
11980     DELETE FROM EGO_ACTIONS_TL
11981     WHERE
11982     ACTION_ID = p_action_id;
11983 
11984     SELECT COUNT(*)
11985      INTO l_mapping_count
11986      FROM EGO_MAPPINGS_B
11987     WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
11988       AND FUNCTION_ID = l_function_id
11989       AND MAPPED_OBJ_TYPE = l_mapped_obj_type;
11990 
11991     IF (l_mapping_count > 0) THEN
11992       EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_function_id, l_mapped_obj_type,
11993                                           p_action_id, null, null, x_return_status,
11994                                           x_errorcode, x_msg_count, x_msg_data);
11995     END IF;
11996 
11997     --R12C Deleting the datalevel visibility from the EGO_ACTIONS_DL table.
11998         SELECT COUNT(*)
11999         INTO l_visibility_count
12000         FROM EGO_ACTIONS_DL
12001         WHERE ACTION_ID = p_action_id;
12002 code_debug ('ENTERED THE FUCNTION Delete_Action  l_visibility_count'||l_visibility_count);
12003 
12004     IF (l_visibility_count > 0) THEN
12005       Delete_Action_Data_Level(p_api_version,p_action_id,null, null, x_return_status,x_errorcode, x_msg_count, x_msg_data);
12006     END IF;
12007 
12008     -- Standard check of p_commit
12009     IF FND_API.To_Boolean(p_commit) THEN
12010       COMMIT WORK;
12011     END IF;
12012 
12013     x_return_status := FND_API.G_RET_STS_SUCCESS;
12014 
12015   EXCEPTION
12016     WHEN OTHERS THEN
12017       IF FND_API.To_Boolean(p_commit) THEN
12018         ROLLBACK TO Delete_Action_PUB;
12019       END IF;
12020       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12021 
12022       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12023       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12024       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12025       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12026       FND_MSG_PUB.Add;
12027       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12028                                ,p_count   => x_msg_count
12029                                ,p_data    => x_msg_data);
12030 
12031 
12032 END Delete_Action;
12033 
12034 ----------------------------------------------------------------------
12035 --R12C
12036 -- call this API to create an Visibilty information that is executed by a user action
12037 PROCEDURE Create_Action_Data_Level (
12038         p_api_version                   IN   NUMBER
12039        ,p_action_id                     IN   NUMBER
12040        ,p_data_level_id                  IN   NUMBER
12041        ,p_visibility_flag               IN   VARCHAR2 DEFAULT 'Y'
12042        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12043        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12044        ,x_return_status                 OUT NOCOPY VARCHAR2
12045        ,x_errorcode                     OUT NOCOPY NUMBER
12046        ,x_msg_count                     OUT NOCOPY NUMBER
12047        ,x_msg_data                      OUT NOCOPY VARCHAR2
12048 ) IS
12049 
12050     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Visibilty_DL';
12051 
12052     --we don't use l_api_version yet, but eventually we might:
12053     --if we change required parameters, version goes FROM n.x to (n+1).x
12054     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12055     l_api_version            CONSTANT NUMBER := 1.0;
12056 
12057     l_Sysdate                DATE := Sysdate;
12058 
12059   BEGIN
12060 
12061     -- Standard start of API savepoint
12062     IF FND_API.To_Boolean(p_commit) THEN
12063       SAVEPOINT Create_Visibilty_DL_PUB;
12064     END IF;
12065 
12066     -- Check for call compatibility
12067     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12068                                         l_api_name, G_PKG_NAME)
12069     THEN
12070       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12071     END IF;
12072     -- Initialize message list even though we don't currently use it
12073     IF FND_API.To_Boolean(p_init_msg_list) THEN
12074       FND_MSG_PUB.Initialize;
12075     END IF;
12076 
12077     INSERT INTO EGO_ACTIONS_DL
12078     (
12079         ACTION_ID
12080        ,DATA_LEVEL_ID
12081        ,VISIBILITY_FLAG
12082        ,LAST_UPDATE_DATE
12083        ,LAST_UPDATED_BY
12084        ,CREATION_DATE
12085        ,CREATED_BY
12086        ,LAST_UPDATE_LOGIN
12087     )
12088     VALUES
12089     (
12090        p_action_id
12091       ,p_data_level_id
12092       ,p_visibility_flag
12093       ,l_Sysdate
12094       ,g_current_user_id
12095       ,l_Sysdate
12096       ,g_current_user_id
12097       ,g_current_login_id
12098     );
12099 
12100     -- Standard check of p_commit
12101     IF FND_API.To_Boolean(p_commit) THEN
12102       COMMIT WORK;
12103     END IF;
12104 
12105     x_return_status := FND_API.G_RET_STS_SUCCESS;
12106 
12107   EXCEPTION
12108     WHEN OTHERS THEN
12109       IF FND_API.To_Boolean(p_commit) THEN
12110         ROLLBACK TO Create_Visibilty_DL_PUB;
12111       END IF;
12112       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12113 
12114       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12115       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12116       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12117       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12118       FND_MSG_PUB.Add;
12119       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12120                                ,p_count   => x_msg_count
12121                                ,p_data    => x_msg_data);
12122 END Create_Action_Data_Level;
12123 
12124 
12125 
12126 -- call this API to create an action that is executed by a user action
12127 PROCEDURE Create_Action_Display (
12128         p_api_version                   IN   NUMBER
12129        ,p_action_id                     IN   NUMBER
12130        ,P_EXEC_CODE                     IN   VARCHAR2  := 'U'
12131        ,p_display_style                 IN   VARCHAR2
12132        ,p_prompt_application_id         IN   NUMBER
12133        ,p_prompt_message_name           IN   VARCHAR2
12134        ,p_visibility_flag               IN   VARCHAR2
12135        ,p_prompt_function_id            IN   NUMBER
12136        ,p_visibility_func_id            IN   NUMBER
12137        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12138        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12139        ,x_return_status                 OUT NOCOPY VARCHAR2
12140        ,x_errorcode                     OUT NOCOPY NUMBER
12141        ,x_msg_count                     OUT NOCOPY NUMBER
12142        ,x_msg_data                      OUT NOCOPY VARCHAR2
12143 ) IS
12144 
12145     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action_Display';
12146 
12147     --we don't use l_api_version yet, but eventually we might:
12148     --if we change required parameters, version goes FROM n.x to (n+1).x
12149     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12150     l_api_version            CONSTANT NUMBER := 1.0;
12151 
12152     l_Sysdate                DATE := Sysdate;
12153 
12154   BEGIN
12155 
12156     -- Standard start of API savepoint
12157     IF FND_API.To_Boolean(p_commit) THEN
12158       SAVEPOINT Create_Action_Display_PUB;
12159     END IF;
12160 
12161     -- Check for call compatibility
12162     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12163                                         l_api_name, G_PKG_NAME)
12164     THEN
12165       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12166     END IF;
12167     -- Initialize message list even though we don't currently use it
12168     IF FND_API.To_Boolean(p_init_msg_list) THEN
12169       FND_MSG_PUB.Initialize;
12170     END IF;
12171 
12172     INSERT INTO EGO_ACTION_DISPLAYS_B
12173     (
12174         ACTION_ID
12175        ,EXECUTION_METHOD
12176        ,DISPLAY_STYLE
12177        ,PROMPT_APPLICATION_ID
12178        ,PROMPT_MESSAGE_NAME
12179        ,VISIBILITY_FLAG
12180        ,PROMPT_FUNCTION_ID
12181        ,VISIBILITY_FUNC_ID
12182        ,LAST_UPDATE_DATE
12183        ,LAST_UPDATED_BY
12184        ,CREATION_DATE
12185        ,CREATED_BY
12186        ,LAST_UPDATE_LOGIN
12187     )
12188     VALUES
12189     (
12190        p_action_id
12191       ,P_EXEC_CODE
12192       ,p_display_style
12193       ,p_prompt_application_id
12194       ,p_prompt_message_name
12195       ,p_visibility_flag
12196       ,p_prompt_function_id
12197       ,p_visibility_func_id
12198       ,l_Sysdate
12199       ,g_current_user_id
12200       ,l_Sysdate
12201       ,g_current_user_id
12202       ,g_current_login_id
12203     );
12204 
12205     -- Standard check of p_commit
12206     IF FND_API.To_Boolean(p_commit) THEN
12207       COMMIT WORK;
12208     END IF;
12209 
12210     x_return_status := FND_API.G_RET_STS_SUCCESS;
12211 
12212   EXCEPTION
12213     WHEN OTHERS THEN
12214       IF FND_API.To_Boolean(p_commit) THEN
12215         ROLLBACK TO Create_Action_Display_PUB;
12216       END IF;
12217       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12218 
12219       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12220       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12221       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12222       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12223       FND_MSG_PUB.Add;
12224       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12225                                ,p_count   => x_msg_count
12226                                ,p_data    => x_msg_data);
12227 
12228 
12229 END Create_Action_Display;
12230 
12231 ----------------------------------------------------------------------
12232 
12233 -- call this API to create an action that is executed by a trigger
12234 PROCEDURE Create_Action_Display (
12235         p_api_version                   IN   NUMBER
12236        ,p_action_id                     IN   NUMBER
12237        ,p_trigger_code                  IN   VARCHAR2
12238        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12239        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12240        ,x_return_status                 OUT NOCOPY VARCHAR2
12241        ,x_errorcode                     OUT NOCOPY NUMBER
12242        ,x_msg_count                     OUT NOCOPY NUMBER
12243        ,x_msg_data                      OUT NOCOPY VARCHAR2
12244 ) IS
12245 
12246     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action_Display';
12247 
12248     --we don't use l_api_version yet, but eventually we might:
12249     --if we change required parameters, version goes FROM n.x to (n+1).x
12250     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12251     l_api_version            CONSTANT NUMBER := 1.0;
12252 
12253     l_Sysdate                DATE := Sysdate;
12254 
12255   BEGIN
12256 
12257     -- Standard start of API savepoint
12258     IF FND_API.To_Boolean(p_commit) THEN
12259       SAVEPOINT Create_Action_Display_PUB;
12260     END IF;
12261 
12262     -- Check for call compatibility
12263     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12264                                         l_api_name, G_PKG_NAME)
12265     THEN
12266       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12267     END IF;
12268     -- Initialize message list even though we don't currently use it
12269     IF FND_API.To_Boolean(p_init_msg_list) THEN
12270       FND_MSG_PUB.Initialize;
12271     END IF;
12272 
12273     INSERT INTO EGO_ACTION_DISPLAYS_B
12274     (
12275         ACTION_ID
12276        ,EXECUTION_METHOD
12277        ,EXECUTION_TRIGGER
12278        ,LAST_UPDATE_DATE
12279        ,LAST_UPDATED_BY
12280        ,CREATION_DATE
12281        ,CREATED_BY
12282        ,LAST_UPDATE_LOGIN
12283     )
12284     VALUES
12285     (
12286        p_action_id
12287       ,'T'
12288       ,p_trigger_code
12289       ,l_Sysdate
12290       ,g_current_user_id
12291       ,l_Sysdate
12292       ,g_current_user_id
12293       ,g_current_login_id
12294     );
12295 
12296     -- Standard check of p_commit
12297     IF FND_API.To_Boolean(p_commit) THEN
12298       COMMIT WORK;
12299     END IF;
12300 
12301     x_return_status := FND_API.G_RET_STS_SUCCESS;
12302 
12303   EXCEPTION
12304     WHEN OTHERS THEN
12305       IF FND_API.To_Boolean(p_commit) THEN
12306         ROLLBACK TO Create_Action_Display_PUB;
12307       END IF;
12308       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12309 
12310       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12311       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12312       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12313       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12314       FND_MSG_PUB.Add;
12315       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12316                                ,p_count   => x_msg_count
12317                                ,p_data    => x_msg_data);
12318 
12319 
12320 END  Create_Action_Display;
12321 
12322 ----------------------------------------------------------------------
12323 
12324 -- call this API to update an action that is executed by a user action
12325 PROCEDURE Update_Action_Display (
12326         p_api_version                   IN   NUMBER
12327        ,p_action_id                     IN   NUMBER
12328        ,P_EXEC_CODE                     IN   VARCHAR2  := 'U'
12329        ,p_display_style                 IN   VARCHAR2
12330        ,p_prompt_application_id         IN   NUMBER
12331        ,p_prompt_message_name           IN   VARCHAR2
12332        ,p_visibility_flag               IN   VARCHAR2
12333        ,p_prompt_function_id            IN   NUMBER
12334        ,p_visibility_func_id            IN   NUMBER
12335        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12336        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12337        ,x_return_status                 OUT NOCOPY VARCHAR2
12338        ,x_errorcode                     OUT NOCOPY NUMBER
12339        ,x_msg_count                     OUT NOCOPY NUMBER
12340        ,x_msg_data                      OUT NOCOPY VARCHAR2
12341 ) IS
12342 
12343     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Action_Display';
12344 
12345     --we don't use l_api_version yet, but eventually we might:
12346     --if we change required parameters, version goes FROM n.x to (n+1).x
12347     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12348     l_api_version            CONSTANT NUMBER := 1.0;
12349 
12350     l_Sysdate                DATE := Sysdate;
12351     l_disp_check_count       NUMBER;
12352     l_old_prompt_func_id     NUMBER;
12353     l_old_vis_func_id        NUMBER;
12354     l_mapping_count          NUMBER;
12355     l_prompt_obj_type        EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'P';
12356     l_vis_obj_type           EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'V';
12357 
12358   BEGIN
12359 
12360     -- Standard start of API savepoint
12361     IF FND_API.To_Boolean(p_commit) THEN
12362       SAVEPOINT Update_Action_Display_PUB;
12363     END IF;
12364 
12365     -- Check for call compatibility
12366     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12367                                         l_api_name, G_PKG_NAME)
12368     THEN
12369       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12370     END IF;
12371     -- Initialize message list even though we don't currently use it
12372     IF FND_API.To_Boolean(p_init_msg_list) THEN
12373       FND_MSG_PUB.Initialize;
12374     END IF;
12375 
12376     -- Just in case caller is updating an Action that doesn't yet have a Display...
12377 
12378     SELECT COUNT(*)
12379       INTO l_disp_check_count
12380       FROM EGO_ACTION_DISPLAYS_B
12381      WHERE ACTION_ID = p_action_id;
12382 
12383     IF (l_disp_check_count = 0)
12384     THEN
12385     EGO_EXT_FWK_PUB.Create_Action_Display (
12386         p_api_version           => '1.0'
12387        ,p_action_id             => p_action_id
12388        ,p_display_style         => p_display_style
12389        ,p_prompt_application_id => p_prompt_application_id
12390        ,p_prompt_message_name   => p_prompt_message_name
12391        ,p_visibility_flag       => p_visibility_flag
12392        ,p_prompt_function_id    => p_prompt_function_id
12393        ,p_visibility_func_id    => p_visibility_func_id
12394        ,p_init_msg_list         => p_init_msg_list
12395        ,p_commit                => p_commit
12396        ,x_return_status         => x_return_status
12397        ,x_errorcode             => x_errorcode
12398        ,x_msg_count             => x_msg_count
12399        ,x_msg_data              => x_msg_data
12400     );
12401     ELSE
12402 
12403       -- If the function_id's are different, we delete Mappings.
12404 
12405       SELECT PROMPT_FUNCTION_ID
12406         INTO l_old_prompt_func_id
12407         FROM EGO_ACTION_DISPLAYS_B
12408        WHERE ACTION_ID = p_action_id;
12409 
12410       IF ((l_old_prompt_func_id IS NOT NULL)
12411       AND (l_old_prompt_func_id <> p_prompt_function_id)) THEN
12412         SELECT COUNT(*)
12413           INTO l_mapping_count
12414           FROM EGO_MAPPINGS_B
12415          WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
12416            AND FUNCTION_ID = l_old_prompt_func_id
12417            AND MAPPED_OBJ_TYPE = l_prompt_obj_type;
12418 
12419         IF (l_mapping_count > 0)
12420         THEN
12421           EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_old_prompt_func_id,
12422                                               l_prompt_obj_type, p_action_id, null,
12423                                               null, x_return_status, x_errorcode,
12424                                               x_msg_count, x_msg_data);
12425         END IF;
12426       END IF;
12427 
12428       SELECT VISIBILITY_FUNC_ID
12429       INTO l_old_vis_func_id
12430       FROM EGO_ACTION_DISPLAYS_B
12431       WHERE ACTION_ID = p_action_id;
12432 
12433       IF l_old_vis_func_id is not null AND l_old_vis_func_id <> p_visibility_func_id
12434       THEN
12435         SELECT COUNT(*)
12436         INTO l_mapping_count
12437         FROM EGO_MAPPINGS_B
12438         WHERE MAPPED_OBJ_PK1_VAL = to_char(p_action_id)
12439           AND FUNCTION_ID = l_old_vis_func_id
12440           AND MAPPED_OBJ_TYPE = l_vis_obj_type;
12441 
12442         IF (l_mapping_count > 0)
12443         THEN
12444           EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_old_vis_func_id,
12445                          l_vis_obj_type, p_action_id, null,
12446                          null, x_return_status, x_errorcode,
12447                          x_msg_count, x_msg_data);
12448         END IF;
12449       END IF;
12450 
12451       UPDATE EGO_ACTION_DISPLAYS_B
12452       SET
12453          EXECUTION_METHOD      = P_EXEC_CODE
12454         ,DISPLAY_STYLE         = p_display_style
12455         ,PROMPT_APPLICATION_ID = p_prompt_application_id
12456         ,PROMPT_MESSAGE_NAME   = p_prompt_message_name
12457         ,VISIBILITY_FLAG       = p_visibility_flag
12458         ,PROMPT_FUNCTION_ID    = p_prompt_function_id
12459         ,VISIBILITY_FUNC_ID    = p_visibility_func_id
12460         ,LAST_UPDATE_DATE      = l_Sysdate
12461         ,LAST_UPDATED_BY       = g_current_user_id
12462         ,LAST_UPDATE_LOGIN     = g_current_login_id
12463         ,EXECUTION_TRIGGER     = null
12464       WHERE
12465       ACTION_ID = p_action_id;
12466     END IF;
12467 
12468     -- Standard check of p_commit
12469     IF FND_API.To_Boolean(p_commit) THEN
12470       COMMIT WORK;
12471     END IF;
12472 
12473     x_return_status := FND_API.G_RET_STS_SUCCESS;
12474 
12475   EXCEPTION
12476     WHEN OTHERS THEN
12477       IF FND_API.To_Boolean(p_commit) THEN
12478         ROLLBACK TO Update_Action_Display_PUB;
12479       END IF;
12480       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12481 
12482       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12483       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12484       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12485       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12486       FND_MSG_PUB.Add;
12487       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12488                                ,p_count   => x_msg_count
12489                                ,p_data    => x_msg_data);
12490 
12491 
12492 END Update_Action_Display;
12493 
12494 ----------------------------------------------------------------------
12495 
12496 -- call this API to update an action that is executed by a trigger
12497 PROCEDURE Update_Action_Display (
12498         p_api_version                   IN   NUMBER
12499        ,p_action_id                     IN   NUMBER
12500        ,p_trigger_code                  IN   VARCHAR2
12501        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12502        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12503        ,x_return_status                 OUT NOCOPY VARCHAR2
12504        ,x_errorcode                     OUT NOCOPY NUMBER
12505        ,x_msg_count                     OUT NOCOPY NUMBER
12506        ,x_msg_data                      OUT NOCOPY VARCHAR2
12507 ) IS
12508 
12509     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Action_Display';
12510 
12511     --we don't use l_api_version yet, but eventually we might:
12512     --if we change required parameters, version goes FROM n.x to (n+1).x
12513     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12514     l_api_version            CONSTANT NUMBER := 1.0;
12515 
12516     l_Sysdate                DATE := Sysdate;
12517     l_disp_check_count       NUMBER;
12518     l_old_prompt_func_id     NUMBER;
12519     l_old_vis_func_id        NUMBER;
12520     l_mapping_count          NUMBER;
12521     l_prompt_obj_type        EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'P';
12522     l_vis_obj_type           EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'V';
12523 
12524   BEGIN
12525 
12526     -- Standard start of API savepoint
12527     IF FND_API.To_Boolean(p_commit) THEN
12528       SAVEPOINT Update_Action_Display_PUB;
12529     END IF;
12530 
12531     -- Check for call compatibility
12532     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12533                                         l_api_name, G_PKG_NAME)
12534     THEN
12535       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12536     END IF;
12537     -- Initialize message list even though we don't currently use it
12538     IF FND_API.To_Boolean(p_init_msg_list) THEN
12539       FND_MSG_PUB.Initialize;
12540     END IF;
12541 
12542     SELECT COUNT(*)
12543       INTO l_disp_check_count
12544       FROM EGO_ACTION_DISPLAYS_B
12545      WHERE ACTION_ID = p_action_id;
12546 
12547     IF (l_disp_check_count = 0) THEN
12548       EGO_EXT_FWK_PUB.Create_Action_Display
12549       (
12550         p_api_version           =>  '1.0'
12551        ,p_action_id             =>  p_action_id
12552        ,p_trigger_code          => p_trigger_code
12553        ,p_init_msg_list         =>  p_init_msg_list
12554        ,p_commit                =>  p_commit
12555        ,x_return_status         => x_return_status
12556        ,x_errorcode             =>  x_errorcode
12557        ,x_msg_count             =>  x_msg_count
12558        ,x_msg_data              =>  x_msg_data
12559       );
12560 
12561     ELSE
12562 
12563       -- If the Action execution is changed from a user Action to trigger
12564       -- then we need to delete Mappings for prompt, visibility function IDs.
12565 
12566       SELECT PROMPT_FUNCTION_ID
12567         INTO l_old_prompt_func_id
12568         FROM EGO_ACTION_DISPLAYS_B
12569        WHERE ACTION_ID = p_action_id;
12570 
12571       IF l_old_prompt_func_id IS NOT NULL THEN
12572         SELECT COUNT(*)
12573         INTO l_mapping_count
12574         FROM EGO_MAPPINGS_B
12575        WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
12576          AND FUNCTION_ID = l_old_prompt_func_id
12577          AND MAPPED_OBJ_TYPE = l_prompt_obj_type;
12578 
12579         IF (l_mapping_count > 0) THEN
12580          EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_old_prompt_func_id,
12581                                              l_prompt_obj_type, p_action_id, null,
12582                                              null, x_return_status, x_errorcode,
12583                                              x_msg_count, x_msg_data);
12584         END IF;
12585       END IF;
12586 
12587       SELECT VISIBILITY_FUNC_ID
12588       INTO l_old_vis_func_id
12589       FROM EGO_ACTION_DISPLAYS_B
12590       WHERE ACTION_ID = p_action_id;
12591 
12592       IF l_old_vis_func_id IS NOT NULL THEN
12593         SELECT COUNT(*)
12594           INTO l_mapping_count
12595           FROM EGO_MAPPINGS_B
12596          WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
12597            AND FUNCTION_ID = l_old_vis_func_id
12598            AND MAPPED_OBJ_TYPE = l_vis_obj_type;
12599 
12600         IF (l_mapping_count > 0) THEN
12601           EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_old_vis_func_id,
12602                                               l_vis_obj_type, p_action_id, null,
12603                                               null, x_return_status, x_errorcode,
12604                                               x_msg_count, x_msg_data);
12605         END IF;
12606       END IF;
12607 
12608       UPDATE EGO_ACTION_DISPLAYS_B
12609       SET
12610          EXECUTION_METHOD      = 'T'
12611         ,EXECUTION_TRIGGER     = p_trigger_code
12612         ,DISPLAY_STYLE         = NULL
12613         ,PROMPT_APPLICATION_ID = NULL
12614         ,PROMPT_MESSAGE_NAME   = NULL
12615         ,VISIBILITY_FLAG       = NULL
12616         ,PROMPT_FUNCTION_ID    = NULL
12617         ,VISIBILITY_FUNC_ID    = NULL
12618         ,LAST_UPDATE_DATE      = l_Sysdate
12619         ,LAST_UPDATED_BY       = g_current_user_id
12620         ,LAST_UPDATE_LOGIN     = g_current_login_id
12621       WHERE
12622       ACTION_ID = p_action_id;
12623 
12624     END IF;
12625 
12626 -----------------------------------
12627 
12628     -- Standard check of p_commit
12629     IF FND_API.To_Boolean(p_commit) THEN
12630       COMMIT WORK;
12631     END IF;
12632 
12633     x_return_status := FND_API.G_RET_STS_SUCCESS;
12634 
12635   EXCEPTION
12636     WHEN OTHERS THEN
12637       IF FND_API.To_Boolean(p_commit) THEN
12638         ROLLBACK TO Update_Action_Display_PUB;
12639       END IF;
12640       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12641 
12642       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12643       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12644       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12645       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12646       FND_MSG_PUB.Add;
12647       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12648                                ,p_count   => x_msg_count
12649                                ,p_data    => x_msg_data);
12650 
12651 
12652 END Update_Action_Display;
12653 
12654 ----------------------------------------------------------------------
12655 
12656 PROCEDURE Delete_Action_Display (
12657         p_api_version                   IN   NUMBER
12658        ,p_action_id                     IN   NUMBER
12659        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12660        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12661        ,x_return_status                 OUT NOCOPY VARCHAR2
12662        ,x_errorcode                     OUT NOCOPY NUMBER
12663        ,x_msg_count                     OUT NOCOPY NUMBER
12664        ,x_msg_data                      OUT NOCOPY VARCHAR2
12665 ) IS
12666 
12667     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Action';
12668 
12669     --we don't use l_api_version yet, but eventually we might:
12670     --if we change required parameters, version goes FROM n.x to (n+1).x
12671     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12672     l_api_version            CONSTANT NUMBER := 1.0;
12673 
12674     l_mapping_count          NUMBER;
12675     l_prompt_func_id         NUMBER;
12676     l_vis_func_id            NUMBER;
12677     l_prompt_obj_type        EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'P';
12678     l_vis_obj_type           EGO_MAPPINGS_B.MAPPED_OBJ_TYPE%TYPE := 'V';
12679 
12680   BEGIN
12681 
12682     -- Standard start of API savepoint
12683     IF FND_API.To_Boolean(p_commit) THEN
12684       SAVEPOINT Delete_Action_Display_PUB;
12685     END IF;
12686 
12687     -- Check for call compatibility
12688     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12689                                         l_api_name, G_PKG_NAME)
12690     THEN
12691       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12692     END IF;
12693     -- Initialize message list even though we don't currently use it
12694     IF FND_API.To_Boolean(p_init_msg_list) THEN
12695       FND_MSG_PUB.Initialize;
12696     END IF;
12697 
12698     -- We get the prompt and vis function IDs before we delete the row
12699     -- so we can also delete their function mappings, if necessary
12700 
12701     SELECT PROMPT_FUNCTION_ID
12702       INTO l_prompt_func_id
12703       FROM EGO_ACTION_DISPLAYS_B
12704      WHERE ACTION_ID = p_action_id;
12705 
12706     SELECT VISIBILITY_FUNC_ID
12707       INTO l_vis_func_id
12708       FROM EGO_ACTION_DISPLAYS_B
12709      WHERE ACTION_ID = p_action_id;
12710 
12711     -- Then we delete the row
12712 
12713     DELETE FROM EGO_ACTION_DISPLAYS_B
12714     WHERE ACTION_ID = p_action_id;
12715 
12716     -- Then we delete the mappings for the prompt and visibility
12717     -- functions for this action, if there are any
12718 
12719     SELECT COUNT(*)
12720       INTO l_mapping_count
12721       FROM EGO_MAPPINGS_B
12722      WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
12723        AND FUNCTION_ID = l_prompt_func_id
12724        AND MAPPED_OBJ_TYPE = l_prompt_obj_type;
12725 
12726     IF (l_mapping_count > 0) THEN
12727       EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_prompt_func_id,
12728                                           l_prompt_obj_type, p_action_id, null,
12729                                           null, x_return_status, x_errorcode,
12730                                           x_msg_count, x_msg_data);
12731     END IF;
12732 
12733     SELECT COUNT(*)
12734       INTO l_mapping_count
12735       FROM EGO_MAPPINGS_B
12736      WHERE MAPPED_OBJ_PK1_VAL = TO_CHAR(p_action_id)
12737        AND FUNCTION_ID = l_vis_func_id
12738        AND MAPPED_OBJ_TYPE = l_vis_obj_type;
12739 
12740     IF (l_mapping_count > 0) THEN
12741       EGO_EXT_FWK_PUB.Delete_Func_Mapping(p_api_version, l_vis_func_id,
12742                                           l_vis_obj_type, p_action_id, null,
12743                                           null, x_return_status, x_errorcode,
12744                                           x_msg_count, x_msg_data);
12745     END IF;
12746 
12747     -- Standard check of p_commit
12748     IF FND_API.To_Boolean(p_commit) THEN
12749       COMMIT WORK;
12750     END IF;
12751 
12752     x_return_status := FND_API.G_RET_STS_SUCCESS;
12753 
12754   EXCEPTION
12755     WHEN OTHERS THEN
12756       IF FND_API.To_Boolean(p_commit) THEN
12757         ROLLBACK TO Delete_Action_Display_PUB;
12758       END IF;
12759       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12760 
12761       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12762       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12763       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12764       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12765       FND_MSG_PUB.Add;
12766       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12767                                ,p_count   => x_msg_count
12768                                ,p_data    => x_msg_data);
12769 
12770 
12771 END Delete_Action_Display;
12772 
12773 ----------------------------------------------------------------------
12774 
12775                   -----------------------------
12776                   -- Function Parameter APIs --
12777                   -----------------------------
12778 
12779 ----------------------------------------------------------------------
12780 
12781 PROCEDURE Create_Function_Param (
12782         p_api_version                   IN   NUMBER
12783        ,p_function_id                   IN   NUMBER
12784        ,p_sequence                      IN   NUMBER
12785        ,p_internal_name                 IN   VARCHAR2
12786        ,p_data_type                     IN   VARCHAR2
12787        ,p_param_type                    IN   VARCHAR2
12788        ,p_display_name                  IN   VARCHAR2
12789        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12790        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12791        ,x_function_param_id             OUT NOCOPY NUMBER
12792        ,x_return_status                 OUT NOCOPY VARCHAR2
12793        ,x_errorcode                     OUT NOCOPY NUMBER
12794        ,x_msg_count                     OUT NOCOPY NUMBER
12795        ,x_msg_data                      OUT NOCOPY VARCHAR2
12796 ) IS
12797 
12798      l_api_name              CONSTANT VARCHAR2(30) := 'Create_Function_Param';
12799 
12800     --we don't use l_api_version yet, but eventually we might:
12801     --if we change required parameters, version goes FROM n.x to (n+1).x
12802     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12803     l_api_version            CONSTANT NUMBER := 1.0;
12804 
12805     l_Sysdate                DATE := Sysdate;
12806 
12807   BEGIN
12808 
12809     -- Standard start of API savepoint
12810     IF FND_API.To_Boolean(p_commit) THEN
12811       SAVEPOINT Create_Function_Param_PUB;
12812     END IF;
12813 
12814     -- Check for call compatibility
12815     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12816                                         l_api_name, G_PKG_NAME)
12817     THEN
12818       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12819     END IF;
12820     -- Initialize message list even though we don't currently use it
12821     IF FND_API.To_Boolean(p_init_msg_list) THEN
12822       FND_MSG_PUB.Initialize;
12823     END IF;
12824 
12825     SELECT EGO_FUNC_PARAMS_S.NEXTVAL INTO x_function_param_id FROM DUAL;
12826 
12827     INSERT INTO EGO_FUNC_PARAMS_B
12828     (
12829         FUNC_PARAM_ID
12830        ,FUNCTION_ID
12831        ,SEQUENCE
12832        ,INTERNAL_NAME
12833        ,DATA_TYPE
12834        ,PARAM_TYPE
12835        ,LAST_UPDATE_DATE
12836        ,LAST_UPDATED_BY
12837        ,CREATION_DATE
12838        ,CREATED_BY
12839        ,LAST_UPDATE_LOGIN
12840     )
12841     VALUES
12842     (
12843         x_function_param_id
12844        ,p_function_id
12845        ,p_sequence
12846        ,p_internal_name
12847        ,p_data_type
12848        ,p_param_type
12849        ,l_Sysdate
12850        ,g_current_user_id
12851        ,l_Sysdate
12852        ,g_current_user_id
12853        ,g_current_login_id
12854     );
12855 
12856     INSERT INTO EGO_FUNC_PARAMS_TL
12857     (
12858         FUNC_PARAM_ID
12859        ,DISPLAY_NAME
12860        ,LANGUAGE
12861        ,SOURCE_LANG
12862        ,LAST_UPDATE_DATE
12863        ,LAST_UPDATED_BY
12864        ,CREATION_DATE
12865        ,CREATED_BY
12866        ,LAST_UPDATE_LOGIN
12867     )
12868     SELECT
12869         x_function_param_id
12870        ,p_display_name
12871        ,L.LANGUAGE_CODE
12872        ,USERENV('LANG')
12873        ,l_Sysdate
12874        ,g_current_user_id
12875        ,l_Sysdate
12876        ,g_current_user_id
12877        ,g_current_login_id
12878     FROM FND_LANGUAGES L
12879     WHERE L.INSTALLED_FLAG in ('I', 'B');
12880 
12881     -- Standard check of p_commit
12882     IF FND_API.To_Boolean(p_commit) THEN
12883       COMMIT WORK;
12884     END IF;
12885 
12886     x_return_status := FND_API.G_RET_STS_SUCCESS;
12887 
12888   EXCEPTION
12889     WHEN OTHERS THEN
12890       IF FND_API.To_Boolean(p_commit) THEN
12891         ROLLBACK TO Create_Function_Param_PUB;
12892       END IF;
12893       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12894 
12895       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12896       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12897       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12898       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12899       FND_MSG_PUB.Add;
12900       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12901                                ,p_count   => x_msg_count
12902                                ,p_data    => x_msg_data);
12903 
12904 
12905 END Create_Function_Param;
12906 
12907 ----------------------------------------------------------------------
12908 
12909 PROCEDURE Update_Function_Param (
12910         p_api_version                   IN   NUMBER
12911        ,p_function_param_id             IN   NUMBER
12912        ,p_sequence                      IN   NUMBER
12913        ,p_internal_name                 IN   VARCHAR2
12914        ,p_display_name                  IN   VARCHAR2
12915        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
12916        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
12917        ,x_return_status                 OUT NOCOPY VARCHAR2
12918        ,x_errorcode                     OUT NOCOPY NUMBER
12919        ,x_msg_count                     OUT NOCOPY NUMBER
12920        ,x_msg_data                      OUT NOCOPY VARCHAR2
12921 ) IS
12922 
12923     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Function_Param';
12924 
12925     --we don't use l_api_version yet, but eventually we might:
12926     --if we change required parameters, version goes FROM n.x to (n+1).x
12927     --if we change optional parameters, version goes FROM x.n to x.(n+1)
12928     l_api_version            CONSTANT NUMBER := 1.0;
12929 
12930     l_Sysdate                DATE := Sysdate;
12931 
12932   BEGIN
12933 
12934     -- Standard start of API savepoint
12935     IF FND_API.To_Boolean(p_commit) THEN
12936       SAVEPOINT Update_Function_Param_PUB;
12937     END IF;
12938 
12939     -- Check for call compatibility
12940     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
12941                                         l_api_name, G_PKG_NAME)
12942     THEN
12943       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12944     END IF;
12945     -- Initialize message list even though we don't currently use it
12946     IF FND_API.To_Boolean(p_init_msg_list) THEN
12947       FND_MSG_PUB.Initialize;
12948     END IF;
12949 
12950     UPDATE EGO_FUNC_PARAMS_B
12951     SET
12952       SEQUENCE          = p_sequence
12953      ,INTERNAL_NAME     = p_internal_name
12954      ,LAST_UPDATE_DATE  = l_Sysdate
12955      ,LAST_UPDATED_BY   = g_current_user_id
12956      ,LAST_UPDATE_LOGIN = g_current_login_id
12957     WHERE
12958     FUNC_PARAM_ID = p_function_param_id;
12959 
12960     UPDATE EGO_FUNC_PARAMS_TL
12961     SET
12962       DISPLAY_NAME      = p_display_name
12963      ,LAST_UPDATE_DATE  = l_Sysdate
12964      ,LAST_UPDATED_BY   = g_current_user_id
12965      ,LAST_UPDATE_LOGIN = g_current_login_id
12966      ,SOURCE_LANG = USERENV('LANG')
12967     WHERE
12968     FUNC_PARAM_ID = p_function_param_id AND
12969     --userenv('LANG') = LANGUAGE;
12970     USERENV('LANG') IN ( LANGUAGE ,SOURCE_LANG );
12971 
12972     -- Standard check of p_commit
12973     IF FND_API.To_Boolean(p_commit) THEN
12974       COMMIT WORK;
12975     END IF;
12976 
12977     x_return_status := FND_API.G_RET_STS_SUCCESS;
12978 
12979   EXCEPTION
12980     WHEN OTHERS THEN
12981       IF FND_API.To_Boolean(p_commit) THEN
12982         ROLLBACK TO Update_Function_Param_PUB;
12983       END IF;
12984       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12985 
12986       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
12987       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
12988       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
12989       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
12990       FND_MSG_PUB.Add;
12991       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
12992                                ,p_count   => x_msg_count
12993                                ,p_data    => x_msg_data);
12994 
12995 
12996 END Update_Function_Param;
12997 
12998 ----------------------------------------------------------------------
12999 
13000 PROCEDURE Delete_Function_Param (
13001         p_api_version                   IN   NUMBER
13002        ,p_function_param_id             IN   NUMBER
13003        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13004        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13005        ,x_return_status                 OUT NOCOPY VARCHAR2
13006        ,x_errorcode                     OUT NOCOPY NUMBER
13007        ,x_msg_count                     OUT NOCOPY NUMBER
13008        ,x_msg_data                      OUT NOCOPY VARCHAR2
13009 ) IS
13010 
13011     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Function_Param';
13012 
13013     --we don't use l_api_version yet, but eventually we might:
13014     --if we change required parameters, version goes FROM n.x to (n+1).x
13015     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13016     l_api_version            CONSTANT NUMBER := 1.0;
13017 
13018     l_Sysdate                DATE := Sysdate;
13019 
13020   BEGIN
13021 
13022     -- Standard start of API savepoint
13023     IF FND_API.To_Boolean(p_commit) THEN
13024       SAVEPOINT Delete_Function_Param_PUB;
13025     END IF;
13026 
13027     -- Check for call compatibility
13028     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13029                                         l_api_name, G_PKG_NAME)
13030     THEN
13031       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13032     END IF;
13033     -- Initialize message list even though we don't currently use it
13034     IF FND_API.To_Boolean(p_init_msg_list) THEN
13035       FND_MSG_PUB.Initialize;
13036     END IF;
13037 
13038     DELETE FROM EGO_FUNC_PARAMS_B
13039     WHERE
13040     FUNC_PARAM_ID = p_function_param_id;
13041 
13042     DELETE FROM EGO_FUNC_PARAMS_TL
13043     WHERE
13044     FUNC_PARAM_ID = p_function_param_id;
13045 
13046     DELETE FROM EGO_MAPPINGS_B
13047     WHERE
13048     FUNC_PARAM_ID = p_function_param_id;
13049 
13050     -- Standard check of p_commit
13051     IF FND_API.To_Boolean(p_commit) THEN
13052       COMMIT WORK;
13053     END IF;
13054 
13055     x_return_status := FND_API.G_RET_STS_SUCCESS;
13056 
13057   EXCEPTION
13058     WHEN OTHERS THEN
13059       IF FND_API.To_Boolean(p_commit) THEN
13060         ROLLBACK TO Delete_Function_Param_PUB;
13061       END IF;
13062       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13063 
13064       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13065       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13066       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13067       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13068       FND_MSG_PUB.Add;
13069       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13070                                ,p_count   => x_msg_count
13071                                ,p_data    => x_msg_data);
13072 
13073 
13074 END Delete_Function_Param;
13075 
13076 ----------------------------------------------------------------------
13077 
13078                     -------------------------
13079                     -- Action Mapping APIs --
13080                     -------------------------
13081 
13082 ----------------------------------------------------------------------
13083 
13084 PROCEDURE Create_Mapping (
13085         p_api_version                   IN   NUMBER
13086        ,p_function_id                   IN   NUMBER
13087        ,p_mapped_obj_type               IN   VARCHAR2
13088        ,p_mapped_obj_pk1_value          IN   VARCHAR2
13089        ,p_func_param_id                 IN   NUMBER
13090        ,p_mapping_group_type            IN   VARCHAR2
13091        ,p_mapping_group_pk1             IN   VARCHAR2
13092        ,p_mapping_group_pk2             IN   VARCHAR2
13093        ,p_mapping_group_pk3             IN   VARCHAR2
13094        ,p_mapping_value                 IN   VARCHAR2
13095        ,p_mapped_uom_parameter          IN   VARCHAR2   :=  NULL
13096        ,p_value_uom_source              IN   VARCHAR2   :=  NULL
13097        ,p_fixed_uom                     IN   VARCHAR2   :=  NULL
13098        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13099        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13100        ,x_return_status                 OUT NOCOPY VARCHAR2
13101        ,x_errorcode                     OUT NOCOPY NUMBER
13102        ,x_msg_count                     OUT NOCOPY NUMBER
13103        ,x_msg_data                      OUT NOCOPY VARCHAR2
13104 ) IS
13105 
13106     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Mapping';
13107 
13108     --we don't use l_api_version yet, but eventually we might:
13109     --if we change required parameters, version goes FROM n.x to (n+1).x
13110     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13111     l_api_version            CONSTANT NUMBER := 1.0;
13112 
13113     l_Sysdate                DATE := Sysdate;
13114 
13115   BEGIN
13116 
13117     -- Standard start of API savepoint
13118     IF FND_API.To_Boolean(p_commit) THEN
13119       SAVEPOINT Create_Mapping_PUB;
13120     END IF;
13121 
13122     -- Check for call compatibility
13123     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13124                                         l_api_name, G_PKG_NAME)
13125     THEN
13126       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13127     END IF;
13128     -- Initialize message list even though we don't currently use it
13129     IF FND_API.To_Boolean(p_init_msg_list) THEN
13130       FND_MSG_PUB.Initialize;
13131     END IF;
13132 
13133     INSERT INTO EGO_MAPPINGS_B
13134     (
13135         FUNCTION_ID
13136        ,MAPPED_OBJ_TYPE
13137        ,MAPPED_OBJ_PK1_VAL
13138        ,FUNC_PARAM_ID
13139        ,MAPPED_TO_GROUP_TYPE
13140        ,MAPPED_TO_GROUP_PK1
13141        ,MAPPED_TO_GROUP_PK2
13142        ,MAPPED_TO_GROUP_PK3
13143        ,MAPPED_ATTRIBUTE
13144        ,MAPPED_UOM_PARAMETER
13145        ,VALUE_UOM_SOURCE
13146        ,FIXED_UOM
13147        ,LAST_UPDATE_DATE
13148        ,LAST_UPDATED_BY
13149        ,CREATION_DATE
13150        ,CREATED_BY
13151        ,LAST_UPDATE_LOGIN
13152     )
13153     VALUES
13154     (
13155         p_function_id
13156        ,p_mapped_obj_type
13157        ,p_mapped_obj_pk1_value
13158        ,p_func_param_id
13159        ,p_mapping_group_type
13160        ,p_mapping_group_pk1
13161        ,p_mapping_group_pk2
13162        ,p_mapping_group_pk3
13163        ,p_mapping_value
13164        ,p_mapped_uom_parameter
13165        ,p_value_uom_source
13166        ,p_fixed_uom
13167        ,l_Sysdate
13168        ,g_current_user_id
13169        ,l_Sysdate
13170        ,g_current_user_id
13171        ,g_current_login_id
13172     );
13173 
13174     -- Standard check of p_commit
13175     IF FND_API.To_Boolean(p_commit) THEN
13176       COMMIT WORK;
13177     END IF;
13178 
13179     x_return_status := FND_API.G_RET_STS_SUCCESS;
13180 
13181   EXCEPTION
13182     WHEN OTHERS THEN
13183       IF FND_API.To_Boolean(p_commit) THEN
13184         ROLLBACK TO Create_Mapping_PUB;
13185       END IF;
13186       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13187 
13188       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13189       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13190       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13191       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13192       FND_MSG_PUB.Add;
13193       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13194                                ,p_count   => x_msg_count
13195                                ,p_data    => x_msg_data);
13196 
13197 
13198 END Create_Mapping;
13199 
13200 ----------------------------------------------------------------------
13201 
13202 
13203 PROCEDURE Create_Mapping (
13204         p_api_version                   IN   NUMBER
13205        ,p_function_id                   IN   NUMBER
13206        ,p_mapped_obj_type               IN   VARCHAR2
13207        ,p_mapped_obj_pk1_value          IN   VARCHAR2
13208        ,p_func_param_id                 IN   NUMBER
13209        ,p_attr_group_id                 IN   NUMBER
13210        ,p_mapping_value                 IN   VARCHAR2
13211        ,p_mapped_uom_parameter          IN   VARCHAR2   :=  NULL
13212        ,p_value_uom_source              IN   VARCHAR2   :=  NULL
13213        ,p_fixed_uom                     IN   VARCHAR2   :=  NULL
13214        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13215        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13216        ,x_return_status                 OUT NOCOPY VARCHAR2
13217        ,x_errorcode                     OUT NOCOPY NUMBER
13218        ,x_msg_count                     OUT NOCOPY NUMBER
13219        ,x_msg_data                      OUT NOCOPY VARCHAR2
13220 ) IS
13221 
13222     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Mapping';
13223 
13224     l_application_id        NUMBER;
13225     l_attr_grp_type     VARCHAR2(40);
13226     l_attr_grp_name     VARCHAR2(30);
13227     l_mapping_group_type    VARCHAR2(30);
13228 
13229   BEGIN
13230 
13231     -- Standard start of API savepoint
13232     IF FND_API.TO_BOOLEAN(p_commit) THEN
13233       SAVEPOINT Create_Mapping_PUB;
13234     END IF;
13235 
13236     Get_Attr_Group_Comb_PKs(p_attr_group_id, l_application_id,l_attr_grp_type ,l_attr_grp_name  );
13237     IF l_application_id IS NULL THEN
13238       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13239     END IF;
13240     l_mapping_group_type := 'A';
13241     EGO_EXT_FWK_PUB.Create_Mapping(
13242         p_api_version                   => p_api_version
13243        ,p_function_id                   => p_function_id
13244        ,p_mapped_obj_type               => p_mapped_obj_type
13245        ,p_mapped_obj_pk1_value          => p_mapped_obj_pk1_value
13246        ,p_func_param_id                 => p_func_param_id
13247        ,p_mapping_group_type            => l_mapping_group_type
13248        ,p_mapping_group_pk1             => l_application_id
13249        ,p_mapping_group_pk2             => l_attr_grp_type
13250        ,p_mapping_group_pk3             => l_attr_grp_name
13251        ,p_mapping_value                 => p_mapping_value
13252        ,p_mapped_uom_parameter          => p_mapped_uom_parameter
13253        ,p_value_uom_source              => p_value_uom_source
13254        ,p_fixed_uom                     => p_fixed_uom
13255        ,p_init_msg_list                 => p_init_msg_list
13256        ,p_commit                        => p_commit
13257        ,x_return_status                 => x_return_status
13258        ,x_errorcode                     => x_errorcode
13259        ,x_msg_count                     => x_msg_count
13260        ,x_msg_data                      => x_msg_data
13261     );
13262 
13263     -- Standard check of p_commit
13264     IF FND_API.To_Boolean(p_commit) THEN
13265       COMMIT WORK;
13266     END IF;
13267 
13268   EXCEPTION
13269     WHEN OTHERS THEN
13270       IF FND_API.TO_BOOLEAN(p_commit) THEN
13271         ROLLBACK TO Create_Mapping_PUB;
13272       END IF;
13273       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13274 
13275       IF l_application_id IS NULL THEN
13276         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAttrGroupApplicationIDFoundForPKs';
13277       ELSE
13278         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13279         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13280         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13281         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13282         FND_MSG_PUB.Add;
13283         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13284                                  ,p_count   => x_msg_count
13285                                  ,p_data    => x_msg_data);
13286 
13287       END IF;
13288 
13289 END Create_Mapping;
13290 
13291 ----------------------------------------------------------------------
13292 
13293 PROCEDURE Update_Mapping (
13294         p_api_version                   IN   NUMBER
13295        ,p_function_id                   IN   NUMBER
13296        ,p_mapped_obj_type               IN   VARCHAR2
13297        ,p_mapped_obj_pk1_value          IN   VARCHAR2
13298        ,p_func_param_id                 IN   NUMBER
13299        ,p_mapping_group_type            IN   VARCHAR2
13300        ,p_mapping_group_pk1             IN   VARCHAR2
13301        ,p_mapping_group_pk2             IN   VARCHAR2
13302        ,p_mapping_group_pk3             IN   VARCHAR2
13303        ,p_mapping_value                 IN   VARCHAR2
13304        ,p_new_func_param_id             IN   NUMBER     :=  NULL
13305        ,p_new_mapping_group_pk1         IN   VARCHAR2   :=  NULL
13306        ,p_new_mapping_group_pk2         IN   VARCHAR2   :=  NULL
13307        ,p_new_mapping_group_pk3         IN   VARCHAR2   :=  NULL
13308        ,p_new_mapping_value             IN   VARCHAR2   :=  NULL
13309        ,p_mapped_uom_parameter          IN   VARCHAR2   :=  NULL
13310        ,p_value_uom_source              IN   VARCHAR2   :=  NULL
13311        ,p_fixed_uom                     IN   VARCHAR2   :=  NULL
13312        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13313        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13314        ,x_return_status                 OUT NOCOPY VARCHAR2
13315        ,x_errorcode                     OUT NOCOPY NUMBER
13316        ,x_msg_count                     OUT NOCOPY NUMBER
13317        ,x_msg_data                      OUT NOCOPY VARCHAR2
13318 ) IS
13319 
13320     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Mapping';
13321 
13322     --we don't use l_api_version yet, but eventually we might:
13323     --if we change required parameters, version goes FROM n.x to (n+1).x
13324     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13325     l_api_version            CONSTANT NUMBER := 1.0;
13326 
13327     l_Sysdate                DATE := Sysdate;
13328 
13329   BEGIN
13330 
13331     -- Standard start of API savepoint
13332     IF FND_API.To_Boolean(p_commit) THEN
13333       SAVEPOINT Update_Mapping_PUB;
13334     END IF;
13335 
13336     -- Check for call compatibility
13337     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13338                                         l_api_name, G_PKG_NAME)
13339     THEN
13340       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13341     END IF;
13342     -- Initialize message list even though we don't currently use it
13343     IF FND_API.To_Boolean(p_init_msg_list) THEN
13344       FND_MSG_PUB.Initialize;
13345     END IF;
13346 
13347     IF (p_new_mapping_group_pk1 IS NOT NULL AND
13348         p_new_mapping_group_pk2 IS NOT NULL AND
13349         p_new_mapping_group_pk3 IS NOT NULL AND
13350         p_new_mapping_value IS NOT NULL) THEN
13351 
13352       UPDATE EGO_MAPPINGS_B
13353       SET
13354          MAPPED_TO_GROUP_TYPE     = p_mapping_group_type
13355         ,MAPPED_TO_GROUP_PK1      = p_new_mapping_group_pk1
13356         ,MAPPED_TO_GROUP_PK2      = p_new_mapping_group_pk2
13357         ,MAPPED_TO_GROUP_PK3      = p_new_mapping_group_pk3
13358         ,MAPPED_ATTRIBUTE         = p_new_mapping_value
13359         ,MAPPED_UOM_PARAMETER     = p_mapped_uom_parameter
13360         ,VALUE_UOM_SOURCE         = p_value_uom_source
13361         ,FIXED_UOM                = p_fixed_uom
13362         ,FUNC_PARAM_ID            = NVL(p_new_func_param_id, p_func_param_id)
13363         ,LAST_UPDATE_DATE         = l_Sysdate
13364         ,LAST_UPDATED_BY          = g_current_user_id
13365         ,LAST_UPDATE_LOGIN        = g_current_login_id
13366       WHERE
13367          FUNCTION_ID = p_function_id AND
13368          MAPPED_OBJ_TYPE = p_mapped_obj_type AND
13369          MAPPED_OBJ_PK1_VAL = p_mapped_obj_pk1_value AND
13370          FUNC_PARAM_ID = p_func_param_id AND
13371          MAPPED_TO_GROUP_PK1 = p_mapping_group_pk1 AND
13372          MAPPED_TO_GROUP_PK2 = p_mapping_group_pk2 AND
13373          MAPPED_TO_GROUP_PK3 = p_mapping_group_pk3 AND
13374          MAPPED_ATTRIBUTE = p_mapping_value;
13375 
13376     ELSE
13377 
13378       UPDATE EGO_MAPPINGS_B
13379       SET
13380          MAPPED_TO_GROUP_TYPE     = p_mapping_group_type
13381         ,MAPPED_TO_GROUP_PK1      = p_mapping_group_pk1
13382         ,MAPPED_TO_GROUP_PK2      = p_mapping_group_pk2
13383         ,MAPPED_TO_GROUP_PK3      = p_mapping_group_pk3
13384         ,MAPPED_ATTRIBUTE         = p_mapping_value
13385         ,MAPPED_UOM_PARAMETER     = p_mapped_uom_parameter
13386         ,VALUE_UOM_SOURCE         = p_value_uom_source
13387         ,FIXED_UOM                = p_fixed_uom
13388         ,FUNC_PARAM_ID            = NVL(p_new_func_param_id, p_func_param_id)
13389         ,LAST_UPDATE_DATE         = l_Sysdate
13390         ,LAST_UPDATED_BY          = g_current_user_id
13391         ,LAST_UPDATE_LOGIN        = g_current_login_id
13392       WHERE
13393          FUNCTION_ID = p_function_id AND
13394          MAPPED_OBJ_TYPE = p_mapped_obj_type AND
13395          MAPPED_OBJ_PK1_VAL = p_mapped_obj_pk1_value AND
13396          FUNC_PARAM_ID = p_func_param_id;
13397 
13398     END IF;
13399 
13400     -- Standard check of p_commit
13401     IF FND_API.To_Boolean(p_commit) THEN
13402       COMMIT WORK;
13403     END IF;
13404 
13405     x_return_status := FND_API.G_RET_STS_SUCCESS;
13406 
13407   EXCEPTION
13408     WHEN OTHERS THEN
13409       IF FND_API.To_Boolean(p_commit) THEN
13410         ROLLBACK TO Update_Mapping_PUB;
13411       END IF;
13412       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13413 
13414       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13415       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13416       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13417       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13418       FND_MSG_PUB.Add;
13419       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13420                                ,p_count   => x_msg_count
13421                                ,p_data    => x_msg_data);
13422 
13423 
13424 END Update_Mapping;
13425 
13426 ----------------------------------------------------------------------
13427 
13428 
13429 
13430 PROCEDURE Update_Mapping (
13431         p_api_version                   IN   NUMBER
13432        ,p_function_id                   IN   NUMBER
13433        ,p_mapped_obj_type               IN   VARCHAR2
13434        ,p_mapped_obj_pk1_value          IN   VARCHAR2
13435        ,p_func_param_id                 IN   NUMBER
13436        ,p_attr_group_id                 IN   NUMBER
13437        ,p_mapping_value                 IN   VARCHAR2
13438        ,p_mapping_group_pk1             IN   VARCHAR2   :=  NULL
13439        ,p_mapping_group_pk2             IN   VARCHAR2   :=  NULL
13440        ,p_mapping_group_pk3             IN   VARCHAR2   :=  NULL
13441        ,p_new_func_param_id             IN   NUMBER     :=  NULL
13442        ,p_new_mapping_value             IN   VARCHAR2   :=  NULL
13443        ,p_mapped_uom_parameter          IN   VARCHAR2   :=  NULL
13444        ,p_value_uom_source              IN   VARCHAR2   :=  NULL
13445        ,p_fixed_uom                     IN   VARCHAR2   :=  NULL
13446        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13447        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13448        ,x_return_status                 OUT NOCOPY VARCHAR2
13449        ,x_errorcode                     OUT NOCOPY NUMBER
13450        ,x_msg_count                     OUT NOCOPY NUMBER
13451        ,x_msg_data                      OUT NOCOPY VARCHAR2
13452 ) IS
13453 
13454     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Mapping';
13455 
13456     l_application_id        NUMBER;
13457     l_attr_grp_type         VARCHAR2(40);
13458     l_attr_grp_name         VARCHAR2(30);
13459     l_mapping_group_type    VARCHAR2(30);
13460 
13461   BEGIN
13462 
13463     -- Standard start of API savepoint
13464     IF FND_API.TO_BOOLEAN(p_commit) THEN
13465       SAVEPOINT Update_Mapping_PUB;
13466     END IF;
13467 
13468     Get_Attr_Group_Comb_PKs(p_attr_group_id, l_application_id,l_attr_grp_type ,l_attr_grp_name);
13469     IF l_application_id IS NULL THEN
13470       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13471     END IF;
13472     l_mapping_group_type := 'A';
13473 
13474     EGO_EXT_FWK_PUB.Update_Mapping (
13475 
13476             p_api_version                   => p_api_version
13477            ,p_function_id                   => p_function_id
13478            ,p_mapped_obj_type               => p_mapped_obj_type
13479            ,p_mapped_obj_pk1_value          => p_mapped_obj_pk1_value
13480            ,p_func_param_id                 => p_func_param_id
13481            ,p_mapping_group_type            => l_mapping_group_type
13482            ,p_mapping_group_pk1             => p_mapping_group_pk1
13483            ,p_mapping_group_pk2             => p_mapping_group_pk2
13484            ,p_mapping_group_pk3             => p_mapping_group_pk3
13485            ,p_mapping_value                 => p_mapping_value
13486            ,p_new_mapping_group_pk1         => l_application_id
13487            ,p_new_mapping_group_pk2         => l_attr_grp_type
13488            ,p_new_mapping_group_pk3         => l_attr_grp_name
13489            ,p_new_mapping_value             => p_new_mapping_value
13490            ,p_new_func_param_id             => p_new_func_param_id
13491            ,p_mapped_uom_parameter          => p_mapped_uom_parameter
13492            ,p_value_uom_source              => p_value_uom_source
13493            ,p_fixed_uom                     => p_fixed_uom
13494            ,p_init_msg_list                 => p_init_msg_list
13495            ,p_commit                        => p_commit
13496            ,x_return_status                 => x_return_status
13497            ,x_errorcode                     => x_errorcode
13498            ,x_msg_count                     => x_msg_count
13499            ,x_msg_data                      => x_msg_data
13500     );
13501 
13502       -- Standard check of p_commit
13503     IF FND_API.To_Boolean(p_commit) THEN
13504       COMMIT WORK;
13505     END IF;
13506   EXCEPTION
13507     WHEN OTHERS THEN
13508       IF FND_API.TO_BOOLEAN(p_commit) THEN
13509         ROLLBACK TO Update_Mapping_PUB;
13510       END IF;
13511       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13512 
13513       IF l_application_id IS NULL THEN
13514         x_msg_data := 'Executing - '||G_PKG_NAME||'.'||l_api_name||' NoAttrGroupApplicationIDFoundForPKs';
13515       ELSE
13516         FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13517         FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13518         FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13519         FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13520         FND_MSG_PUB.Add;
13521         FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13522                                  ,p_count   => x_msg_count
13523                                  ,p_data    => x_msg_data);
13524 
13525       END IF;
13526 
13527 END Update_Mapping;
13528 
13529 ----------------------------------------------------------------------------
13530 
13531 -- call this API to delete all mappings for a given Action and Function
13532 PROCEDURE Delete_Func_Mapping (
13533         p_api_version                   IN   NUMBER
13534        ,p_function_id                   IN   NUMBER
13535        ,p_mapped_obj_type               IN   VARCHAR2
13536        ,p_mapped_obj_pk1_value          IN   VARCHAR2
13537        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13538        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13539        ,x_return_status                 OUT NOCOPY VARCHAR2
13540        ,x_errorcode                     OUT NOCOPY NUMBER
13541        ,x_msg_count                     OUT NOCOPY NUMBER
13542        ,x_msg_data                      OUT NOCOPY VARCHAR2
13543 ) IS
13544 
13545     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Func_Mapping';
13546 
13547     --we don't use l_api_version yet, but eventually we might:
13548     --if we change required parameters, version goes FROM n.x to (n+1).x
13549     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13550     l_api_version            CONSTANT NUMBER := 1.0;
13551 
13552   BEGIN
13553 
13554     -- Standard start of API savepoint
13555     IF FND_API.To_Boolean(p_commit) THEN
13556       SAVEPOINT Update_Mapping_PUB;
13557     END IF;
13558 
13559     -- Check for call compatibility
13560     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13561                                         l_api_name, G_PKG_NAME)
13562     THEN
13563       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13564     END IF;
13565     -- Initialize message list even though we don't currently use it
13566     IF FND_API.To_Boolean(p_init_msg_list) THEN
13567       FND_MSG_PUB.Initialize;
13568     END IF;
13569 
13570     DELETE FROM EGO_MAPPINGS_B
13571     WHERE
13572     FUNCTION_ID = p_function_id AND
13573     MAPPED_OBJ_TYPE = p_mapped_obj_type AND
13574     MAPPED_OBJ_PK1_VAL = p_mapped_obj_pk1_value;
13575 
13576     -- Standard check of p_commit
13577     IF FND_API.To_Boolean(p_commit) THEN
13578       COMMIT WORK;
13579     END IF;
13580 
13581     x_return_status := FND_API.G_RET_STS_SUCCESS;
13582 
13583   EXCEPTION
13584     WHEN OTHERS THEN
13585       IF FND_API.To_Boolean(p_commit) THEN
13586         ROLLBACK TO Delete_Func_Mapping_PUB;
13587       END IF;
13588       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13589 
13590       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13591       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13592       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13593       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13594       FND_MSG_PUB.Add;
13595       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13596                                ,p_count   => x_msg_count
13597                                ,p_data    => x_msg_data);
13598 
13599 
13600 END Delete_Func_Mapping;
13601 
13602 ----------------------------------------------------------------------
13603 
13604 -- call this API to delete an individual parameter mapping
13605 PROCEDURE Delete_Func_Param_Mapping (
13606         p_api_version                   IN   NUMBER
13607        ,p_function_id                   IN   NUMBER
13608        ,p_mapped_obj_type               IN   VARCHAR2
13609        ,p_mapped_obj_pk1_value          IN   VARCHAR2
13610        ,p_func_param_id                 IN   NUMBER
13611        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13612        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13613        ,x_return_status                 OUT NOCOPY VARCHAR2
13614        ,x_errorcode                     OUT NOCOPY NUMBER
13615        ,x_msg_count                     OUT NOCOPY NUMBER
13616        ,x_msg_data                      OUT NOCOPY VARCHAR2
13617 ) IS
13618 
13619     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Func_Param_Mapping';
13620 
13621     --we don't use l_api_version yet, but eventually we might:
13622     --if we change required parameters, version goes FROM n.x to (n+1).x
13623     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13624     l_api_version            CONSTANT NUMBER := 1.0;
13625 
13626   BEGIN
13627 
13628     -- Standard start of API savepoint
13629     IF FND_API.To_Boolean(p_commit) THEN
13630       SAVEPOINT Delete_Func_Param_Mapping_PUB;
13631     END IF;
13632 
13633     -- Check for call compatibility
13634     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13635                                         l_api_name, G_PKG_NAME)
13636     THEN
13637       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13638     END IF;
13639     -- Initialize message list even though we don't currently use it
13640     IF FND_API.To_Boolean(p_init_msg_list) THEN
13641       FND_MSG_PUB.Initialize;
13642     END IF;
13643 
13644     DELETE FROM EGO_MAPPINGS_B
13645     WHERE
13646     FUNCTION_ID = p_function_id AND
13647     MAPPED_OBJ_TYPE = p_mapped_obj_type AND
13648     MAPPED_OBJ_PK1_VAL = p_mapped_obj_pk1_value AND
13649     FUNC_PARAM_ID = p_func_param_id;
13650 
13651     -- Standard check of p_commit
13652     IF FND_API.To_Boolean(p_commit) THEN
13653       COMMIT WORK;
13654     END IF;
13655 
13656     x_return_status := FND_API.G_RET_STS_SUCCESS;
13657 
13658   EXCEPTION
13659     WHEN OTHERS THEN
13660       IF FND_API.TO_BOOLEAN(p_commit) THEN
13661         ROLLBACK TO Delete_Func_Param_Mapping_PUB;
13662       END IF;
13663       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13664 
13665       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13666       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13667       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13668       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13669       FND_MSG_PUB.Add;
13670       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13671                                ,p_count   => x_msg_count
13672                                ,p_data    => x_msg_data);
13673 
13674 
13675 END Delete_Func_Param_Mapping;
13676 
13677 ----------------------------------------------------------------------
13678 
13679                      -----------------------
13680                      -- Action Group APIs --
13681                      -----------------------
13682 
13683 ----------------------------------------------------------------------
13684 
13685 PROCEDURE Create_Action_Group (
13686         p_api_version                   IN   NUMBER
13687        ,p_object_id                     IN   NUMBER
13688        ,p_classification_code           IN   VARCHAR2
13689        ,p_sequence                      IN   NUMBER
13690        ,p_internal_name                 IN   VARCHAR2
13691        ,p_display_name                  IN   VARCHAR2
13692        ,p_description                   IN   VARCHAR2
13693        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13694        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13695        ,x_action_group_id               OUT NOCOPY NUMBER
13696        ,x_return_status                 OUT NOCOPY VARCHAR2
13697        ,x_errorcode                     OUT NOCOPY NUMBER
13698        ,x_msg_count                     OUT NOCOPY NUMBER
13699        ,x_msg_data                      OUT NOCOPY VARCHAR2
13700 ) IS
13701 
13702     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action_Group';
13703 
13704     --we don't use l_api_version yet, but eventually we might:
13705     --if we change required parameters, version goes FROM n.x to (n+1).x
13706     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13707     l_api_version            CONSTANT NUMBER := 1.0;
13708 
13709     l_Sysdate                DATE := Sysdate;
13710 
13711   BEGIN
13712 
13713     -- Standard start of API savepoint
13714     IF FND_API.To_Boolean(p_commit) THEN
13715       SAVEPOINT Create_Action_Group_PUB;
13716     END IF;
13717 
13718     -- Check for call compatibility
13719     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13720                                         l_api_name, G_PKG_NAME)
13721     THEN
13722       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13723     END IF;
13724     -- Initialize message list even though we don't currently use it
13725     IF FND_API.To_Boolean(p_init_msg_list) THEN
13726       FND_MSG_PUB.Initialize;
13727     END IF;
13728 
13729     SELECT EGO_ACTION_GROUPS_S.NEXTVAL INTO x_action_group_id FROM DUAL;
13730 
13731     INSERT INTO EGO_ACTION_GROUPS_B
13732     (
13733         ACTION_GROUP_ID
13734        ,OBJECT_ID
13735        ,CLASSIFICATION_CODE
13736        ,SEQUENCE
13737        ,INTERNAL_NAME
13738        ,LAST_UPDATE_DATE
13739        ,LAST_UPDATED_BY
13740        ,CREATION_DATE
13741        ,CREATED_BY
13742        ,LAST_UPDATE_LOGIN
13743     )
13744     VALUES
13745     (
13746         x_action_group_id
13747        ,p_object_id
13748        ,p_classification_code
13749        ,p_sequence
13750        ,p_internal_name
13751        ,l_Sysdate
13752        ,g_current_user_id
13753        ,l_Sysdate
13754        ,g_current_user_id
13755        ,g_current_login_id
13756     );
13757 
13758     INSERT INTO EGO_ACTION_GROUPS_TL
13759     (
13760         ACTION_GROUP_ID
13761        ,DISPLAY_NAME
13762        ,DESCRIPTION
13763        ,LANGUAGE
13764        ,SOURCE_LANG
13765        ,LAST_UPDATE_DATE
13766        ,LAST_UPDATED_BY
13767        ,CREATION_DATE
13768        ,CREATED_BY
13769        ,LAST_UPDATE_LOGIN
13770     )
13771     SELECT
13772         x_action_group_id
13773        ,p_display_name
13774        ,p_description
13775        ,L.LANGUAGE_CODE
13776        ,USERENV('LANG')
13777        ,l_Sysdate
13778        ,g_current_user_id
13779        ,l_Sysdate
13780        ,g_current_user_id
13781        ,g_current_login_id
13782 
13783     FROM FND_LANGUAGES L
13784     WHERE L.INSTALLED_FLAG in ('I', 'B');
13785 
13786     -- Standard check of p_commit
13787     IF FND_API.To_Boolean(p_commit) THEN
13788       COMMIT WORK;
13789     END IF;
13790 
13791     x_return_status := FND_API.G_RET_STS_SUCCESS;
13792 
13793   EXCEPTION
13794     WHEN OTHERS THEN
13795       IF FND_API.To_Boolean(p_commit) THEN
13796         ROLLBACK TO Create_Action_Group_PUB;
13797       END IF;
13798       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13799 
13800       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13801       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13802       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13803       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13804       FND_MSG_PUB.Add;
13805       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13806                                ,p_count   => x_msg_count
13807                                ,p_data    => x_msg_data);
13808 
13809 
13810 END Create_Action_Group;
13811 
13812 ----------------------------------------------------------------------
13813 
13814 PROCEDURE Update_Action_Group (
13815         p_api_version                   IN   NUMBER
13816        ,p_action_group_id               IN   NUMBER
13817        ,p_sequence                      IN   NUMBER
13818        ,p_internal_name                 IN   VARCHAR2
13819        ,p_display_name                  IN   VARCHAR2
13820        ,p_description                   IN   VARCHAR2
13821        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13822        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13823        ,x_return_status                 OUT NOCOPY VARCHAR2
13824        ,x_errorcode                     OUT NOCOPY NUMBER
13825        ,x_msg_count                     OUT NOCOPY NUMBER
13826        ,x_msg_data                      OUT NOCOPY VARCHAR2
13827 ) IS
13828 
13829     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Action_Group';
13830 
13831     --we don't use l_api_version yet, but eventually we might:
13832     --if we change required parameters, version goes FROM n.x to (n+1).x
13833     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13834     l_api_version            CONSTANT NUMBER := 1.0;
13835 
13836     l_Sysdate                DATE := Sysdate;
13837 
13838   BEGIN
13839 
13840     -- Standard start of API savepoint
13841     IF FND_API.To_Boolean(p_commit) THEN
13842       SAVEPOINT Update_Action_Group_PUB;
13843     END IF;
13844 
13845     -- Check for call compatibility
13846     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13847                                         l_api_name, G_PKG_NAME)
13848     THEN
13849       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13850     END IF;
13851     -- Initialize message list even though we don't currently use it
13852     IF FND_API.To_Boolean(p_init_msg_list) THEN
13853       FND_MSG_PUB.Initialize;
13854     END IF;
13855 
13856     UPDATE EGO_ACTION_GROUPS_B
13857     SET
13858        SEQUENCE              = p_sequence
13859      , INTERNAL_NAME         = p_internal_name
13860      , LAST_UPDATE_DATE      = l_Sysdate
13861      , LAST_UPDATED_BY       = g_current_user_id
13862      , LAST_UPDATE_LOGIN     = g_current_login_id
13863 
13864     WHERE
13865        ACTION_GROUP_ID = p_action_group_id;
13866 
13867     UPDATE EGO_ACTION_GROUPS_TL
13868     SET
13869        DESCRIPTION       = p_description
13870      , DISPLAY_NAME      = p_display_name
13871      , LAST_UPDATE_DATE  = l_Sysdate
13872      , LAST_UPDATED_BY   = g_current_user_id
13873      , LAST_UPDATE_LOGIN = g_current_login_id
13874      , SOURCE_LANG = USERENV('LANG')
13875 
13876     WHERE
13877        -- ACTION_GROUP_ID = p_action_group_id AND LANGUAGE = USERENV('LANG');
13878        ACTION_GROUP_ID = p_action_group_id AND USERENV('LANG') IN (LANGUAGE , SOURCE_LANG);
13879 
13880     -- Standard check of p_commit
13881     IF FND_API.To_Boolean(p_commit) THEN
13882       COMMIT WORK;
13883     END IF;
13884 
13885     x_return_status := FND_API.G_RET_STS_SUCCESS;
13886 
13887   EXCEPTION
13888     WHEN OTHERS THEN
13889       IF FND_API.TO_BOOLEAN(p_commit) THEN
13890         ROLLBACK TO Update_Action_Group_PUB;
13891       END IF;
13892       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13893 
13894       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13895       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13896       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13897       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13898       FND_MSG_PUB.Add;
13899       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13900                                ,p_count   => x_msg_count
13901                                ,p_data    => x_msg_data);
13902 
13903 
13904 END Update_Action_Group;
13905 
13906 ----------------------------------------------------------------------
13907 
13908 PROCEDURE Delete_Action_Group (
13909         p_api_version                   IN   NUMBER
13910        ,p_action_group_id               IN   NUMBER
13911        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13912        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13913        ,x_return_status                 OUT NOCOPY VARCHAR2
13914        ,x_errorcode                     OUT NOCOPY NUMBER
13915        ,x_msg_count                     OUT NOCOPY NUMBER
13916        ,x_msg_data                      OUT NOCOPY VARCHAR2
13917 ) IS
13918 
13919     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Action_Group';
13920 
13921     --we don't use l_api_version yet, but eventually we might:
13922     --if we change required parameters, version goes FROM n.x to (n+1).x
13923     --if we change optional parameters, version goes FROM x.n to x.(n+1)
13924     l_api_version            CONSTANT NUMBER := 1.0;
13925 
13926   BEGIN
13927 
13928     -- Standard start of API savepoint
13929     IF FND_API.To_Boolean(p_commit) THEN
13930       SAVEPOINT Delete_Action_Group_PUB;
13931     END IF;
13932 
13933     -- Check for call compatibility
13934     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
13935                                         l_api_name, G_PKG_NAME)
13936     THEN
13937       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13938     END IF;
13939     -- Initialize message list even though we don't currently use it
13940     IF FND_API.To_Boolean(p_init_msg_list) THEN
13941       FND_MSG_PUB.Initialize;
13942     END IF;
13943 
13944     -- If there are Actions in this Action Group, we delete their entries
13945     -- in the Action_Group_Entries table (but we don't delete the Actions).
13946     DELETE FROM EGO_ACTN_GRP_ENTRIES_B
13947     WHERE
13948     ACTION_GROUP_ID = p_action_group_id;
13949 
13950     DELETE FROM EGO_ACTION_GROUPS_B
13951     WHERE
13952     ACTION_GROUP_ID = p_action_group_id;
13953 
13954     DELETE FROM EGO_ACTION_GROUPS_TL
13955     WHERE
13956     ACTION_GROUP_ID = p_action_group_id;
13957 
13958     -- Standard check of p_commit
13959     IF FND_API.To_Boolean(p_commit) THEN
13960       COMMIT WORK;
13961     END IF;
13962 
13963     x_return_status := FND_API.G_RET_STS_SUCCESS;
13964 
13965   EXCEPTION
13966     WHEN OTHERS THEN
13967       IF FND_API.To_Boolean(p_commit) THEN
13968         ROLLBACK TO Delete_Action_Group_PUB;
13969       END IF;
13970       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13971 
13972       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
13973       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
13974       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
13975       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
13976       FND_MSG_PUB.Add;
13977       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
13978                                ,p_count   => x_msg_count
13979                                ,p_data    => x_msg_data);
13980 
13981 
13982 END Delete_Action_Group;
13983 
13984 ----------------------------------------------------------------------
13985 
13986                   -----------------------------
13987                   -- Action Group Entry APIs --
13988                   -----------------------------
13989 
13990 ----------------------------------------------------------------------
13991 
13992 PROCEDURE Create_Action_Group_Entry (
13993         p_api_version                   IN   NUMBER
13994        ,p_action_group_id               IN   NUMBER
13995        ,p_action_id                     IN   NUMBER
13996        ,p_sequence                      IN   NUMBER
13997        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
13998        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
13999        ,x_return_status                 OUT NOCOPY VARCHAR2
14000        ,x_errorcode                     OUT NOCOPY NUMBER
14001        ,x_msg_count                     OUT NOCOPY NUMBER
14002        ,x_msg_data                      OUT NOCOPY VARCHAR2
14003 ) IS
14004 
14005     l_api_name               CONSTANT VARCHAR2(30) := 'Create_Action_Group_Entry';
14006 
14007     --we don't use l_api_version yet, but eventually we might:
14008     --if we change required parameters, version goes FROM n.x to (n+1).x
14009     --if we change optional parameters, version goes FROM x.n to x.(n+1)
14010     l_api_version            CONSTANT NUMBER := 1.0;
14011 
14012     l_Sysdate                DATE := Sysdate;
14013     l_exist_action_count     NUMBER := 0;
14014 
14015   BEGIN
14016 
14017     -- Standard start of API savepoint
14018     IF FND_API.To_Boolean(p_commit) THEN
14019       SAVEPOINT Create_Action_Group_Entry_PUB;
14020     END IF;
14021 
14022     -- Check for call compatibility
14023     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
14024                                         l_api_name, G_PKG_NAME)
14025     THEN
14026       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14027     END IF;
14028     -- Initialize message list even though we don't currently use it
14029     IF FND_API.To_Boolean(p_init_msg_list) THEN
14030       FND_MSG_PUB.Initialize;
14031     END IF;
14032 
14033     SELECT COUNT(ACTION_ID)
14034       INTO l_exist_action_count
14035       FROM EGO_ACTN_GRP_ENTRIES_B
14036      WHERE ACTION_GROUP_ID = p_action_group_id
14037        AND ACTION_ID = p_action_id;
14038 
14039     IF (l_exist_action_count = 0) THEN
14040       INSERT INTO EGO_ACTN_GRP_ENTRIES_B
14041       (
14042         ACTION_GROUP_ID
14043        ,ACTION_ID
14044        ,SEQUENCE
14045        ,LAST_UPDATE_DATE
14046        ,LAST_UPDATED_BY
14047        ,CREATION_DATE
14048        ,CREATED_BY
14049        ,LAST_UPDATE_LOGIN
14050       )
14051       VALUES
14052       (
14053         p_action_group_id
14054        ,p_action_id
14055        ,p_sequence
14056        ,l_Sysdate
14057        ,g_current_user_id
14058        ,l_Sysdate
14059        ,g_current_user_id
14060        ,g_current_login_id
14061       );
14062     END IF;
14063 
14064     -- Standard check of p_commit
14065     IF FND_API.To_Boolean(p_commit) THEN
14066       COMMIT WORK;
14067     END IF;
14068 
14069     x_return_status := FND_API.G_RET_STS_SUCCESS;
14070 
14071   EXCEPTION
14072     WHEN OTHERS THEN
14073       IF FND_API.To_Boolean(p_commit) THEN
14074         ROLLBACK TO Create_Action_Group_Entry_PUB;
14075       END IF;
14076       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14077 
14078       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
14079       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
14080       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
14081       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
14082       FND_MSG_PUB.Add;
14083       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
14084                                ,p_count   => x_msg_count
14085                                ,p_data    => x_msg_data);
14086 
14087 
14088 END Create_Action_Group_Entry;
14089 
14090 ----------------------------------------------------------------------
14091 
14092 PROCEDURE Update_Action_Group_Entry (
14093         p_api_version                   IN   NUMBER
14094        ,p_action_group_id               IN   NUMBER
14095        ,p_action_id                     IN   NUMBER
14096        ,p_sequence                      IN   NUMBER
14097        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
14098        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
14099        ,x_return_status                 OUT NOCOPY VARCHAR2
14100        ,x_errorcode                     OUT NOCOPY NUMBER
14101        ,x_msg_count                     OUT NOCOPY NUMBER
14102        ,x_msg_data                      OUT NOCOPY VARCHAR2
14103 ) IS
14104 
14105     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Action_Group_Entry';
14106 
14107     --we don't use l_api_version yet, but eventually we might:
14108     --if we change required parameters, version goes FROM n.x to (n+1).x
14109     --if we change optional parameters, version goes FROM x.n to x.(n+1)
14110     l_api_version            CONSTANT NUMBER := 1.0;
14111 
14112     l_Sysdate                DATE := Sysdate;
14113     l_exist_action_count     NUMBER := 0;
14114 
14115   BEGIN
14116 
14117     -- Standard start of API savepoint
14118     IF FND_API.To_Boolean(p_commit) THEN
14119       SAVEPOINT Update_Action_Group_Entry_PUB;
14120     END IF;
14121 
14122     -- Check for call compatibility
14123     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
14124                                         l_api_name, G_PKG_NAME)
14125     THEN
14126       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14127     END IF;
14128     -- Initialize message list even though we don't currently use it
14129     IF FND_API.To_Boolean(p_init_msg_list) THEN
14130       FND_MSG_PUB.Initialize;
14131     END IF;
14132 
14133     UPDATE EGO_ACTN_GRP_ENTRIES_B
14134     SET SEQUENCE = p_sequence
14135   WHERE ACTION_GROUP_ID = p_action_group_id
14136     AND ACTION_ID = p_action_id;
14137 
14138     -- Standard check of p_commit
14139     IF FND_API.To_Boolean(p_commit) THEN
14140       COMMIT WORK;
14141     END IF;
14142 
14143     x_return_status := FND_API.G_RET_STS_SUCCESS;
14144 
14145   EXCEPTION
14146     WHEN OTHERS THEN
14147       IF FND_API.To_Boolean(p_commit) THEN
14148         ROLLBACK TO Update_Action_Group_Entry_PUB;
14149       END IF;
14150       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14151 
14152       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
14153       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
14154       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
14155       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
14156       FND_MSG_PUB.Add;
14157       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
14158                                ,p_count   => x_msg_count
14159                                ,p_data    => x_msg_data);
14160 
14161 
14162 END Update_Action_Group_Entry;
14163 
14164 ----------------------------------------------------------------------
14165 
14166 PROCEDURE Delete_Action_Group_Entry (
14167         p_api_version                   IN   NUMBER
14168        ,p_action_group_id               IN   NUMBER
14169        ,p_action_id                     IN   NUMBER
14170        ,p_init_msg_list                 IN   VARCHAR2   :=  fnd_api.g_FALSE
14171        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
14172        ,x_return_status                 OUT NOCOPY VARCHAR2
14173        ,x_errorcode                     OUT NOCOPY NUMBER
14174        ,x_msg_count                     OUT NOCOPY NUMBER
14175        ,x_msg_data                      OUT NOCOPY VARCHAR2
14176 ) IS
14177 
14178     l_api_name               CONSTANT VARCHAR2(30) := 'Delete_Action_Group_Entry';
14179 
14180     --we don't use l_api_version yet, but eventually we might:
14181     --if we change required parameters, version goes FROM n.x to (n+1).x
14182     --if we change optional parameters, version goes FROM x.n to x.(n+1)
14183     l_api_version            CONSTANT NUMBER := 1.0;
14184 
14185   BEGIN
14186 
14187     -- Standard start of API savepoint
14188     IF FND_API.To_Boolean(p_commit) THEN
14189       SAVEPOINT Update_Action_Group_Entry_PUB;
14190     END IF;
14191 
14192     -- Check for call compatibility
14193     IF NOT FND_API.Compatible_API_Call (l_api_version, p_api_version,
14194                                         l_api_name, G_PKG_NAME)
14195     THEN
14196       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14197     END IF;
14198     -- Initialize message list even though we don't currently use it
14199     IF FND_API.To_Boolean(p_init_msg_list) THEN
14200       FND_MSG_PUB.Initialize;
14201     END IF;
14202 
14203     DELETE FROM EGO_ACTN_GRP_ENTRIES_B
14204     WHERE
14205     ACTION_GROUP_ID = p_action_group_id AND
14206     ACTION_ID = p_action_id;
14207 
14208     -- Standard check of p_commit
14209     IF FND_API.To_Boolean(p_commit) THEN
14210       COMMIT WORK;
14211     END IF;
14212 
14213     x_return_status := FND_API.G_RET_STS_SUCCESS;
14214 
14215   EXCEPTION
14216     WHEN OTHERS THEN
14217       IF FND_API.To_Boolean(p_commit) THEN
14218         ROLLBACK TO Delete_Action_Group_Entry_PUB;
14219       END IF;
14220       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14221 
14222       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
14223       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
14224       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
14225       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
14226       FND_MSG_PUB.Add;
14227       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
14228                                ,p_count   => x_msg_count
14229                                ,p_data    => x_msg_data);
14230 
14231 
14232 END Delete_Action_Group_Entry;
14233 
14234 ----------------------------------------------------------------------
14235 
14236 PROCEDURE Add_Language_for_Action IS
14237 
14238   BEGIN
14239 
14240    delete from EGO_ACTIONS_TL T
14241       where not exists
14242         (select NULL
14243         from EGO_ACTIONS_B B
14244         where B.ACTION_ID = T.ACTION_ID
14245         );
14246 
14247       update EGO_ACTIONS_TL T set (
14248           DESCRIPTION
14249         ) = (select
14250           B.DESCRIPTION
14251         from EGO_ACTIONS_TL B
14252         where B.ACTION_ID = T.ACTION_ID
14253         and B.LANGUAGE = T.SOURCE_LANG)
14254       where (
14255           T.ACTION_ID,
14256           T.LANGUAGE
14257       ) in (select
14258           SUBT.ACTION_ID,
14259           SUBT.LANGUAGE
14260         from EGO_ACTIONS_TL SUBB, EGO_ACTIONS_TL SUBT
14261         where SUBB.ACTION_ID = SUBT.ACTION_ID
14262         and SUBB.LANGUAGE = SUBT.SOURCE_LANG
14263         and (SUBB.DESCRIPTION <> SUBT.DESCRIPTION
14264           or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
14265           or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
14266       ));
14267 
14268       insert into EGO_ACTIONS_TL (
14269         ACTION_ID,
14270         DESCRIPTION,
14271         CREATED_BY,
14272         CREATION_DATE,
14273         LAST_UPDATED_BY,
14274         LAST_UPDATE_DATE,
14275         LAST_UPDATE_LOGIN,
14276         LANGUAGE,
14277         SOURCE_LANG)
14278       select
14279         B.ACTION_ID,
14280         B.DESCRIPTION,
14281         B.CREATED_BY,
14282         B.CREATION_DATE,
14283         B.LAST_UPDATED_BY,
14284         B.LAST_UPDATE_DATE,
14285         B.LAST_UPDATE_LOGIN,
14286         L.LANGUAGE_CODE,
14287         B.SOURCE_LANG
14288       from EGO_ACTIONS_TL B, FND_LANGUAGES L
14289       where L.INSTALLED_FLAG in ('I', 'B')
14290       and B.LANGUAGE = userenv('LANG')
14291       and not exists
14292         (select NULL
14293         from EGO_ACTIONS_TL T
14294         where T.ACTION_ID = B.ACTION_ID
14295     and T.LANGUAGE = L.LANGUAGE_CODE);
14296 
14297 END Add_Language_for_Action;
14298 
14299 ----------------------------------------------------------------------
14300 
14301 
14302 PROCEDURE Add_Language_for_Action_Group IS
14303   BEGIN
14304 
14305    delete from EGO_ACTION_GROUPS_TL T
14306    where not exists
14307      (select NULL
14308      from EGO_ACTION_GROUPS_B B
14309      where B.ACTION_GROUP_ID = T.ACTION_GROUP_ID
14310      );
14311 
14312    update EGO_ACTION_GROUPS_TL T set (
14313        DISPLAY_NAME,
14314        DESCRIPTION
14315      ) = (select
14316        B.DISPLAY_NAME,
14317        B.DESCRIPTION
14318      from EGO_ACTION_GROUPS_TL B
14319      where B.ACTION_GROUP_ID = T.ACTION_GROUP_ID
14320      and B.LANGUAGE = T.SOURCE_LANG)
14321    where (
14322        T.ACTION_GROUP_ID,
14323        T.LANGUAGE
14324    ) in (select
14325        SUBT.ACTION_GROUP_ID,
14326        SUBT.LANGUAGE
14327      from EGO_ACTION_GROUPS_TL SUBB, EGO_ACTION_GROUPS_TL SUBT
14328      where SUBB.ACTION_GROUP_ID = SUBT.ACTION_GROUP_ID
14329      and SUBB.LANGUAGE = SUBT.SOURCE_LANG
14330      and (SUBB.DISPLAY_NAME <> SUBT.DISPLAY_NAME
14331        or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
14332        or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
14333        or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
14334    ));
14335 
14336    insert into EGO_ACTION_GROUPS_TL (
14337      ACTION_GROUP_ID,
14338      DISPLAY_NAME,
14339      DESCRIPTION,
14340      CREATED_BY,
14341      CREATION_DATE,
14342      LAST_UPDATED_BY,
14343      LAST_UPDATE_DATE,
14344      LAST_UPDATE_LOGIN,
14345      LANGUAGE,
14346      SOURCE_LANG
14347    ) select
14348      B.ACTION_GROUP_ID,
14349      B.DISPLAY_NAME,
14350      B.DESCRIPTION,
14351      B.CREATED_BY,
14352      B.CREATION_DATE,
14353      B.LAST_UPDATED_BY,
14354      B.LAST_UPDATE_DATE,
14355      B.LAST_UPDATE_LOGIN,
14356      L.LANGUAGE_CODE,
14357      B.SOURCE_LANG
14358    from EGO_ACTION_GROUPS_TL B, FND_LANGUAGES L
14359    where L.INSTALLED_FLAG in ('I', 'B')
14360    and B.LANGUAGE = userenv('LANG')
14361    and not exists
14362      (select NULL
14363      from EGO_ACTION_GROUPS_TL T
14364      where T.ACTION_GROUP_ID = B.ACTION_GROUP_ID
14365     and T.LANGUAGE = L.LANGUAGE_CODE);
14366 
14367 END Add_Language_for_Action_Group;
14368 
14369 ----------------------------------------------------------------------
14370 
14371 PROCEDURE Add_Language_for_Function IS
14372   BEGIN
14373 
14374   delete from EGO_FUNCTIONS_TL T
14375       where not exists
14376         (select NULL
14377         from EGO_FUNCTIONS_B B
14378         where B.FUNCTION_ID = T.FUNCTION_ID
14379         );
14380 
14381       update EGO_FUNCTIONS_TL T set (
14382           DISPLAY_NAME,
14383           DESCRIPTION
14384         ) = (select
14385           B.DISPLAY_NAME,
14386           B.DESCRIPTION
14387         from EGO_FUNCTIONS_TL B
14388         where B.FUNCTION_ID = T.FUNCTION_ID
14389         and B.LANGUAGE = T.SOURCE_LANG)
14390       where (
14391           T.FUNCTION_ID,
14392           T.LANGUAGE
14393       ) in (select
14394           SUBT.FUNCTION_ID,
14395           SUBT.LANGUAGE
14396         from EGO_FUNCTIONS_TL SUBB, EGO_FUNCTIONS_TL SUBT
14397         where SUBB.FUNCTION_ID = SUBT.FUNCTION_ID
14398         and SUBB.LANGUAGE = SUBT.SOURCE_LANG
14399         and (SUBB.DISPLAY_NAME <> SUBT.DISPLAY_NAME
14400           or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
14401           or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
14402           or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
14403       ));
14404 
14405       insert into EGO_FUNCTIONS_TL (
14406         CREATION_DATE,
14407         LAST_UPDATED_BY,
14408         LAST_UPDATE_DATE,
14409         LAST_UPDATE_LOGIN,
14410         CREATED_BY,
14411         FUNCTION_ID,
14412         DISPLAY_NAME,
14413         DESCRIPTION,
14414         LANGUAGE,
14415         SOURCE_LANG
14416       ) select
14417         B.CREATION_DATE,
14418         B.LAST_UPDATED_BY,
14419         B.LAST_UPDATE_DATE,
14420         B.LAST_UPDATE_LOGIN,
14421         B.CREATED_BY,
14422         B.FUNCTION_ID,
14423         B.DISPLAY_NAME,
14424         B.DESCRIPTION,
14425         L.LANGUAGE_CODE,
14426         B.SOURCE_LANG
14427       from EGO_FUNCTIONS_TL B, FND_LANGUAGES L
14428       where L.INSTALLED_FLAG in ('I', 'B')
14429       and B.LANGUAGE = userenv('LANG')
14430       and not exists
14431         (select NULL
14432         from EGO_FUNCTIONS_TL T
14433         where T.FUNCTION_ID = B.FUNCTION_ID
14434     and T.LANGUAGE = L.LANGUAGE_CODE);
14435 
14436 END Add_Language_for_Function;
14437 
14438 ----------------------------------------------------------------------
14439 
14440 PROCEDURE Add_Language_for_Func_Param IS
14441   BEGIN
14442 
14443   delete from EGO_FUNC_PARAMS_TL T
14444   where not exists
14445     (select NULL
14446     from EGO_FUNC_PARAMS_B B
14447     where B.FUNC_PARAM_ID = T.FUNC_PARAM_ID
14448     );
14449 
14450   update EGO_FUNC_PARAMS_TL T set (
14451       DISPLAY_NAME,
14452       DESCRIPTION
14453     ) = (select
14454       B.DISPLAY_NAME,
14455       B.DESCRIPTION
14456     from EGO_FUNC_PARAMS_TL B
14457     where B.FUNC_PARAM_ID = T.FUNC_PARAM_ID
14458     and B.LANGUAGE = T.SOURCE_LANG)
14459   where (
14460       T.FUNC_PARAM_ID,
14461       T.LANGUAGE
14462   ) in (select
14463       SUBT.FUNC_PARAM_ID,
14464       SUBT.LANGUAGE
14465     from EGO_FUNC_PARAMS_TL SUBB, EGO_FUNC_PARAMS_TL SUBT
14466     where SUBB.FUNC_PARAM_ID = SUBT.FUNC_PARAM_ID
14467     and SUBB.LANGUAGE = SUBT.SOURCE_LANG
14468     and (SUBB.DISPLAY_NAME <> SUBT.DISPLAY_NAME
14469       or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
14470       or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
14471       or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
14472   ));
14473 
14474   insert into EGO_FUNC_PARAMS_TL (
14475     FUNC_PARAM_ID,
14476     DISPLAY_NAME,
14477     DESCRIPTION,
14478     CREATED_BY,
14479     CREATION_DATE,
14480     LAST_UPDATED_BY,
14481     LAST_UPDATE_DATE,
14482     LAST_UPDATE_LOGIN,
14483     LANGUAGE,
14484     SOURCE_LANG
14485   ) select
14486     B.FUNC_PARAM_ID,
14487     B.DISPLAY_NAME,
14488     B.DESCRIPTION,
14489     B.CREATED_BY,
14490     B.CREATION_DATE,
14491     B.LAST_UPDATED_BY,
14492     B.LAST_UPDATE_DATE,
14493     B.LAST_UPDATE_LOGIN,
14494     L.LANGUAGE_CODE,
14495     B.SOURCE_LANG
14496   from EGO_FUNC_PARAMS_TL B, FND_LANGUAGES L
14497   where L.INSTALLED_FLAG in ('I', 'B')
14498   and B.LANGUAGE = userenv('LANG')
14499   and not exists
14500     (select NULL
14501     from EGO_FUNC_PARAMS_TL T
14502     where T.FUNC_PARAM_ID = B.FUNC_PARAM_ID
14503     and T.LANGUAGE = L.LANGUAGE_CODE);
14504 
14505 END Add_Language_for_Func_Param;
14506 
14507 ----------------------------------------------------------------------
14508 
14509 PROCEDURE Add_Language_for_Pages IS
14510   BEGIN
14511 
14512   delete from EGO_PAGES_TL T
14513   where not exists
14514     (select NULL
14515     from EGO_PAGES_B B
14516     where B.PAGE_ID = T.PAGE_ID
14517     );
14518 
14519   update EGO_PAGES_TL T set (
14520       DISPLAY_NAME,
14521       DESCRIPTION
14522     ) = (select
14523       B.DISPLAY_NAME,
14524       B.DESCRIPTION
14525     from EGO_PAGES_TL B
14526     where B.PAGE_ID = T.PAGE_ID
14527     and B.LANGUAGE = T.SOURCE_LANG)
14528   where (
14529       T.PAGE_ID,
14530       T.LANGUAGE
14531   ) in (select
14532       SUBT.PAGE_ID,
14533       SUBT.LANGUAGE
14534     from EGO_PAGES_TL SUBB, EGO_PAGES_TL SUBT
14535     where SUBB.PAGE_ID = SUBT.PAGE_ID
14536     and SUBB.LANGUAGE = SUBT.SOURCE_LANG
14537     and (SUBB.DISPLAY_NAME <> SUBT.DISPLAY_NAME
14538       or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
14539       or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
14540       or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
14541   ));
14542 
14543   insert into EGO_PAGES_TL (
14544     PAGE_ID,
14545     DISPLAY_NAME,
14546     DESCRIPTION,
14547     CREATED_BY,
14548     CREATION_DATE,
14549     LAST_UPDATED_BY,
14550     LAST_UPDATE_DATE,
14551     LAST_UPDATE_LOGIN,
14552     LANGUAGE,
14553     SOURCE_LANG
14554   ) select
14555     B.PAGE_ID,
14556     B.DISPLAY_NAME,
14557     B.DESCRIPTION,
14558     B.CREATED_BY,
14559     B.CREATION_DATE,
14560     B.LAST_UPDATED_BY,
14561     B.LAST_UPDATE_DATE,
14562     B.LAST_UPDATE_LOGIN,
14563     L.LANGUAGE_CODE,
14564     B.SOURCE_LANG
14565   from EGO_PAGES_TL B, FND_LANGUAGES L
14566   where L.INSTALLED_FLAG in ('I', 'B')
14567   and B.LANGUAGE = userenv('LANG')
14568   and not exists
14569     (select NULL
14570     from EGO_PAGES_TL T
14571     where T.PAGE_ID = B.PAGE_ID
14572     and T.LANGUAGE = L.LANGUAGE_CODE);
14573 
14574 END Add_Language_for_Pages;
14575 
14576 ----------------------------------------------------------------------
14577 
14578 PROCEDURE Add_Language_for_Data_level IS
14579 BEGIN
14580 
14581   DELETE FROM EGO_DATA_LEVEL_TL T
14582   WHERE NOT EXISTS
14583     (SELECT NULL
14584     FROM EGO_DATA_LEVEL_B B
14585     WHERE B.DATA_LEVEL_ID = T.DATA_LEVEL_ID
14586     );
14587 
14588   UPDATE EGO_DATA_LEVEL_TL T
14589   SET (USER_DATA_LEVEL_NAME
14590       )
14591       =
14592       (SELECT B.USER_DATA_LEVEL_NAME
14593        FROM EGO_DATA_LEVEL_TL B
14594        WHERE B.DATA_LEVEL_ID = T.DATA_LEVEL_ID
14595        AND B.LANGUAGE = T.SOURCE_LANG)
14596   WHERE (
14597       T.DATA_LEVEL_ID,
14598       T.LANGUAGE
14599          )
14600          IN
14601          (SELECT
14602             SUBT.DATA_LEVEL_ID,
14603             SUBT.LANGUAGE
14604           from EGO_DATA_LEVEL_TL SUBB, EGO_DATA_LEVEL_TL SUBT
14605           where SUBB.DATA_LEVEL_ID = SUBT.DATA_LEVEL_ID
14606           and SUBB.LANGUAGE = SUBT.SOURCE_LANG
14607           and SUBB.USER_DATA_LEVEL_NAME <> SUBT.USER_DATA_LEVEL_NAME
14608          );
14609 
14610   INSERT INTO EGO_DATA_LEVEL_TL (
14611     DATA_LEVEL_ID,
14612     USER_DATA_LEVEL_NAME,
14613     CREATED_BY,
14614     CREATION_DATE,
14615     LAST_UPDATED_BY,
14616     LAST_UPDATE_DATE,
14617     LAST_UPDATE_LOGIN,
14618     LANGUAGE,
14619     SOURCE_LANG
14620   ) select
14621     B.DATA_LEVEL_ID,
14622     B.USER_DATA_LEVEL_NAME,
14623     B.CREATED_BY,
14624     B.CREATION_DATE,
14625     B.LAST_UPDATED_BY,
14626     B.LAST_UPDATE_DATE,
14627     B.LAST_UPDATE_LOGIN,
14628     L.LANGUAGE_CODE,
14629     B.SOURCE_LANG
14630   from EGO_DATA_LEVEL_TL B, FND_LANGUAGES L
14631   where L.INSTALLED_FLAG in ('I', 'B')
14632   and B.LANGUAGE = userenv('LANG')
14633   and not exists
14634     (select NULL
14635     from EGO_DATA_LEVEL_TL T
14636     where T.DATA_LEVEL_ID = B.DATA_LEVEL_ID
14637     and T.LANGUAGE = L.LANGUAGE_CODE);
14638 
14639 END Add_Language_for_Data_level;
14640 
14641 ----------------------------------------------------------------------
14642 
14643 
14644 PROCEDURE Add_Language_for_Flex_value IS
14645 BEGIN
14646 
14647   DELETE FROM EGO_FLEX_VALUE_VERSION_TL T
14648   WHERE NOT EXISTS
14649     (SELECT NULL
14650     FROM EGO_FLEX_VALUE_VERSION_B B
14651     WHERE B.flex_value_id = T.flex_value_id
14652     );
14653 
14654   UPDATE EGO_FLEX_VALUE_VERSION_TL T
14655   SET (DESCRIPTION,
14656        FLEX_VALUE_MEANING
14657       )
14658       =
14659       (SELECT B.DESCRIPTION,
14660               B.FLEX_VALUE_MEANING
14661        FROM EGO_FLEX_VALUE_VERSION_TL B
14662        WHERE B.flex_value_id = T.flex_value_id
14663        AND B.LANGUAGE = T.SOURCE_LANG)
14664   WHERE (
14665       T.flex_value_id,
14666       T.LANGUAGE
14667          )
14668          IN
14669          (SELECT
14670             SUBT.flex_value_id,
14671             SUBT.LANGUAGE
14672           from EGO_FLEX_VALUE_VERSION_TL SUBB, EGO_FLEX_VALUE_VERSION_TL SUBT
14673           where SUBB.flex_value_id = SUBT.flex_value_id
14674           and SUBB.LANGUAGE = SUBT.SOURCE_LANG
14675           and ( SUBB.FLEX_VALUE_MEANING <> SUBT.FLEX_VALUE_MEANING
14676                 OR SUBB.DESCRIPTION <> SUBT.DESCRIPTION
14677                 OR (SUBB.DESCRIPTION IS NULL AND SUBT.DESCRIPTION IS  NOT  NULL )
14678                 OR (SUBB.DESCRIPTION IS NOT NULL AND SUBT.DESCRIPTION IS NULL)
14679               )
14680           );
14681 
14682 
14683 
14684   INSERT INTO EGO_FLEX_VALUE_VERSION_TL (
14685     FLEX_VALUE_ID,
14686     VERSION_SEQ_ID,
14687     LAST_UPDATE_DATE,
14688     LAST_UPDATED_BY,
14689     CREATION_DATE,
14690     CREATED_BY,
14691     LAST_UPDATE_LOGIN,
14692     DESCRIPTION,
14693     FLEX_VALUE_MEANING,
14694     LANGUAGE,
14695     SOURCE_LANG
14696   ) SELECT
14697     B.FLEX_VALUE_ID,
14698     B.VERSION_SEQ_ID,
14699     B.LAST_UPDATE_DATE,
14700     B.LAST_UPDATED_BY,
14701     B.CREATION_DATE,
14702     B.CREATED_BY,
14703     B.LAST_UPDATE_LOGIN,
14704     B.DESCRIPTION,
14705     B.FLEX_VALUE_MEANING,
14706     L.LANGUAGE_CODE,
14707     B.SOURCE_LANG
14708   FROM EGO_FLEX_VALUE_VERSION_TL B, FND_LANGUAGES L
14709   where L.INSTALLED_FLAG in ('I', 'B')
14710   and B.LANGUAGE = userenv('LANG')
14711   and not exists
14712     (select NULL
14713     from EGO_FLEX_VALUE_VERSION_TL T
14714     where T.flex_value_id = B.flex_value_id
14715     and T.LANGUAGE = L.LANGUAGE_CODE);
14716 
14717 END Add_Language_for_Flex_value;
14718 
14719 ----------------------------------------------------------------------
14720 
14721 
14722 
14723 PROCEDURE ADD_LANGUAGE (
14724        p_tl_table_name   IN   VARCHAR2
14725 ) IS
14726 
14727 BEGIN
14728 
14729   IF (p_tl_table_name = 'EGO_ACTIONS_TL') THEN
14730     Add_Language_for_Action;
14731   ELSIF (p_tl_table_name = 'EGO_ACTION_GROUPS_TL') THEN
14732     Add_Language_for_Action_Group;
14733   ELSIF (p_tl_table_name = 'EGO_FUNCTIONS_TL') THEN
14734     Add_Language_for_Function;
14735   ELSIF (p_tl_table_name = 'EGO_FUNC_PARAMS_TL') THEN
14736     Add_Language_for_Func_Param;
14737   ELSIF (p_tl_table_name = 'EGO_PAGES_TL') THEN
14738     Add_Language_for_Pages;
14739   ELSIF (p_tl_table_name = 'EGO_DATA_LEVEL_TL') THEN
14740     Add_Language_for_Data_level;
14741   ELSIF (p_tl_table_name = 'EGO_FLEX_VALUE_VERSION_TL') THEN
14742     Add_Language_for_Flex_Value;
14743   END IF;
14744 
14745 END ADD_LANGUAGE;
14746 
14747 ---------------------------------------------------------------------
14748 FUNCTION Return_Association_Existance
14749      (p_application_id   IN  NUMBER
14750      ,p_attr_group_type  IN  VARCHAR2
14751      ,p_attr_group_name  IN  VARCHAR2) RETURN VARCHAR2 IS
14752 --
14753 -- The function takes the application_id, attribute Group Type
14754 -- and Attribute Group Name and determines whether any associations
14755 -- are created for the attribute specified
14756 -- If there are any existing associations
14757 --       then 1 will be returned
14758 --       else 0 will be returned
14759 --
14760 
14761   check_association_existance  BOOLEAN := true;
14762 BEGIN
14763  check_association_existance := Check_Associations_Exist
14764                       (p_application_id   => p_application_id
14765                       ,p_attr_group_type  => p_attr_group_type
14766                       ,p_attr_group_name  => p_attr_group_name);
14767   IF check_association_existance THEN
14768     RETURN '1';
14769   ELSE
14770     RETURN '0';
14771   END IF;
14772 
14773   EXCEPTION
14774     WHEN OTHERS THEN
14775       return '1';
14776 END Return_Association_Existance;
14777 
14778 --------------------------------------------------------------------------
14779 
14780 PROCEDURE Update_AGV_Name(
14781      p_api_version                   IN   NUMBER
14782     ,p_application_id                IN   NUMBER
14783     ,p_attr_group_type               IN   VARCHAR2
14784     ,p_attr_group_name               IN   VARCHAR2
14785     ,p_agv_name                      IN   VARCHAR2
14786     ,p_init_msg_list                 IN   VARCHAR2   :=  FND_API.G_FALSE
14787     ,p_commit                        IN   VARCHAR2   :=  FND_API.G_FALSE
14788     ,x_return_status                 OUT NOCOPY VARCHAR2
14789     ,x_errorcode                     OUT NOCOPY NUMBER
14790     ,x_msg_count                     OUT NOCOPY NUMBER
14791     ,x_msg_data                      OUT NOCOPY VARCHAR2)
14792   IS
14793 
14794     -- Start OF comments
14795     -- API name  : Update_AGV_Name
14796     -- TYPE      : Public
14797     -- Pre-reqs  : None
14798     -- FUNCTION  : Update Table 'ego_fnd_dsc_flx_ctx_ext'
14799     --         for attribute View Name
14800     -- Version: Current Version 1.0
14801     -- Previous Version :  None
14802     --
14803     -- END OF comments
14804     fnd_apps_schema      VARCHAR2(30) := NULL;
14805         h_x                  BOOLEAN;
14806         h_status             VARCHAR2(2000);
14807             h_industry           VARCHAR2(2000);
14808 
14809 
14810   CURSOR c_check_agv_name (cp_agv_name  IN VARCHAR2
14811                           ,cp_application_id  IN NUMBER
14812                           ,cp_attr_group_type IN VARCHAR2
14813                           ,cp_attr_group_name IN VARCHAR2
14814                           ) IS
14815   SELECT agv_name
14816   FROM ego_fnd_dsc_flx_ctx_ext
14817   WHERE agv_name = cp_agv_name
14818     AND attr_group_id NOT IN
14819             (select attr_group_id
14820                from  ego_fnd_dsc_flx_ctx_ext
14821               where agv_name = cp_agv_name
14822                 AND application_id  = cp_application_id
14823                 AND descriptive_flexfield_name =  cp_attr_group_type
14824                 AND descriptive_flex_context_code =  cp_attr_group_name
14825              );
14826 
14827   CURSOR c_check_obj_name (cp_agv_name IN  VARCHAR2, cp_appl_id IN NUMBER) IS
14828   SELECT object_name
14829   FROM all_objects
14830   where object_name = cp_agv_name
14831   and owner in (EGO_EXT_FWK_PUB.Get_Application_Owner(cp_appl_id), EGO_EXT_FWK_PUB.Get_Oracle_UserName);
14832 
14833     l_api_version CONSTANT  NUMBER := 1.0 ;
14834     l_api_name    CONSTANT  VARCHAR (30) := 'Update_AGV_Name' ;
14835 
14836     l_dynamic_sql    VARCHAR2(100);
14837     l_agv_name       ego_fnd_dsc_flx_ctx_ext.agv_name%TYPE;
14838     l_temp_agv_name  ego_fnd_dsc_flx_ctx_ext.agv_name%TYPE;
14839 
14840   BEGIN
14841     -- Standard Start of API savepoint
14842     IF FND_API.To_Boolean( p_commit ) THEN
14843       SAVEPOINT   Update_AGV_Name ;
14844     END IF;
14845     -- Check for call compatibility.
14846     IF NOT FND_API.Compatible_API_Call( l_api_version ,
14847                     p_api_version ,
14848                     l_api_name ,
14849                     G_PKG_NAME
14850                        ) THEN
14851        RAISE FND_API.G_EXC_ERROR;
14852     END IF;
14853 
14854     -- Initialize API message list if necessary.
14855     -- Initialize message list if p_init_msg_list is set to TRUE.
14856     IF FND_API.to_Boolean( P_INIT_MSG_LIST ) THEN
14857       FND_MSG_PUB.initialize;
14858     END IF;
14859 
14860     -- Check If the view name is already present
14861     l_agv_name := UPPER(p_agv_name);
14862     OPEN c_check_agv_name (cp_agv_name        => l_agv_name
14863                           ,cp_application_id  => p_application_id
14864                           ,cp_attr_group_type => p_attr_group_type
14865                           ,cp_attr_group_name => p_attr_group_name
14866                           );
14867     FETCH c_check_agv_name INTO l_temp_agv_name;
14868     IF c_check_agv_name%FOUND THEN
14869       FND_MESSAGE.set_name('EGO','EGO_EF_NAME_EXTS');
14870       FND_MSG_PUB.add;
14871       RAISE FND_API.g_exc_error;
14872     END IF;
14873     CLOSE c_check_agv_name;
14874 
14875     -- the AGV Name is unique among the existing records
14876     -- check if the AGV Name is an already existing object
14877     OPEN c_check_obj_name (cp_agv_name => l_agv_name,
14878                            cp_appl_id => p_application_id);
14879     FETCH c_check_obj_name INTO l_temp_agv_name;
14880     IF c_check_obj_name%FOUND THEN
14881       FND_MESSAGE.set_name('EGO','EGO_EF_NAME_EXTS');
14882       FND_MSG_PUB.add;
14883       RAISE FND_API.g_exc_error;
14884     END IF;
14885     CLOSE c_check_obj_name;
14886 
14887     --Test with this dummy Query for the validity of the view name
14888     --It should not be a reserve word
14889     l_dynamic_sql := 'CREATE OR REPLACE VIEW '|| l_agv_name ||' AS SELECT * FROM DUAL';
14890 
14891     --bugfix 11907422 for 12.2 AD_DDL changes
14892     --EXECUTE IMMEDIATE l_dynamic_sql;
14893 
14894     h_x := FND_INSTALLATION.Get_App_Info('FND', h_status, h_industry, fnd_apps_schema);
14895 	--bug 12392423, hard code APPS
14896     AD_DDL.DO_DDL(fnd_apps_schema, 'APPS', AD_DDL.CREATE_VIEW,l_dynamic_sql, l_agv_name);
14897 
14898     -- Syalaman - Fix for bug 5911824
14899     -- Droping the dummy view created in above statement so that
14900     -- if any error occurs while creating the actual view, this
14901     -- dummy view should not exist in the database.
14902     l_dynamic_sql := 'DROP VIEW '|| l_agv_name;
14903 
14904     --bugfix 11907422 for 12.2 AD_DDL changes
14905    -- EXECUTE IMMEDIATE l_dynamic_sql;
14906    --bug 12392423, hard code APPS
14907      AD_DDL.DO_DDL(fnd_apps_schema, 'APPS', AD_DDL.DROP_VIEW,l_dynamic_sql,l_agv_name);
14908 
14909     -- End of fix for bug 5911824
14910 
14911 --
14912 -- As the method is called in validate, we should not update
14913 --
14914 --    -- Insert Attribute Group View name for the corresponding
14915 --    -- Attribute Group
14916 --    UPDATE ego_fnd_dsc_flx_ctx_ext
14917 --      SET agv_name             = l_agv_name,
14918 --          last_updated_by      = FND_GLOBAL.user_id,
14919 --          last_update_date     = SYSDATE,
14920 --          last_update_login    = FND_GLOBAL.login_id
14921 --    WHERE application_id                = p_application_id
14922 --      AND descriptive_flexfield_name    = p_attr_group_type
14923 --      AND descriptive_flex_context_code = p_attr_group_name ;
14924 --
14925     IF FND_API.To_Boolean(p_commit) THEN
14926       COMMIT WORK;
14927     END IF;
14928     x_return_status := FND_API.G_RET_STS_SUCCESS;
14929   EXCEPTION
14930     WHEN FND_API.G_EXC_ERROR THEN
14931       IF FND_API.To_Boolean( p_commit ) THEN
14932         ROLLBACK TO Update_AGV_Name;
14933       END IF;
14934       IF c_check_agv_name%ISOPEN THEN
14935         CLOSE c_check_agv_name;
14936       END IF;
14937       IF c_check_obj_name%ISOPEN THEN
14938         CLOSE c_check_obj_name;
14939       END IF;
14940       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
14941                                ,p_count   => x_msg_count
14942                                ,p_data    => x_msg_data);
14943       x_return_status := FND_API.G_RET_STS_ERROR;
14944     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
14945       IF FND_API.To_Boolean( p_commit ) THEN
14946         ROLLBACK TO Update_AGV_Name;
14947       END IF;
14948       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
14949                                ,p_count   => x_msg_count
14950                                ,p_data    => x_msg_data);
14951       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14952     WHEN OTHERS THEN
14953       IF FND_API.To_Boolean( p_commit ) THEN
14954         ROLLBACK TO Update_AGV_Name;
14955       END IF;
14956       IF c_check_agv_name%ISOPEN THEN
14957         CLOSE c_check_agv_name;
14958       END IF;
14959       IF c_check_obj_name%ISOPEN THEN
14960         CLOSE c_check_obj_name;
14961       END IF;
14962       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
14963                                ,p_count   => x_msg_count
14964                                ,p_data    => x_msg_data);
14965       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
14966 
14967   END Update_AGV_Name;
14968 
14969 ------------------------------------------------------------------------------------------
14970 -- This method will update the control level of an attribute in EGO_FND_DF_COL_USGS_EXT
14971 -- requires:  1) p_control_level is a valid control level
14972 --             as represented in lookup 'EGO_PC_CONTROL_LEVEL' in fnd_lookups
14973 --            2) p_application_column_name is not null and is a valid column name
14974 --            3) p_application_id is not null and is valid
14975 --            4) p_descriptive_flexfield_name corresponds to a valid attribute group type
14976 ------------------------------------------------------------------------------------------
14977 PROCEDURE Update_Attribute_Control_Level (
14978         p_api_version                   IN   NUMBER
14979        ,p_application_id                IN   NUMBER
14980        ,p_descriptive_flexfield_name    IN   VARCHAR2
14981        ,p_application_column_name       IN   VARCHAR2
14982        ,p_control_level                 IN   NUMBER
14983        ,p_init_msg_list                 IN   VARCHAR2   :=  FND_API.G_FALSE
14984        ,p_commit                        IN   VARCHAR2   :=  fnd_api.g_FALSE
14985        ,x_return_status                 OUT NOCOPY VARCHAR2
14986        ,x_msg_count                     OUT NOCOPY NUMBER
14987        ,x_msg_data                      OUT NOCOPY VARCHAR2
14988 ) IS
14989 
14990     l_api_name               CONSTANT VARCHAR2(30) := 'Update_Attribute_Control_Level';
14991     l_attr_id                NUMBER;
14992     l_control_level          VARCHAR2(30);
14993     e_control_level_invalid  EXCEPTION;
14994     e_no_attr_for_id_error   EXCEPTION;
14995 
14996   BEGIN
14997 
14998     -- Initialize API message list if necessary.
14999     -- Initialize message list if p_init_msg_list is set to TRUE.
15000     IF FND_API.to_Boolean( P_INIT_MSG_LIST ) THEN
15001       FND_MSG_PUB.initialize;
15002     END IF;
15003 
15004     -------------------------------------------------------------------------------------
15005     -- Make sure that the control level corresponds with either Master Level or Org Level
15006     -------------------------------------------------------------------------------------
15007     IF( p_control_level IS NULL ) THEN
15008       RAISE e_control_level_invalid;
15009     ELSE
15010      BEGIN
15011        select lookup_code into l_control_level from fnd_lookups
15012        where lookup_type = 'EGO_PC_CONTROL_LEVEL'
15013        and lookup_code = p_control_level;
15014 
15015       EXCEPTION
15016         WHEN NO_DATA_FOUND THEN
15017           RAISE e_control_level_invalid;
15018       END;
15019     END IF;
15020 
15021     -------------------------------------------------------------------------------------
15022     -- Make sure that application_id, descriptive_flexfield_name and application_column_name were passed in
15023     -- and correspond to a valid attribute id
15024     -------------------------------------------------------------------------------------
15025 
15026 
15027     IF (p_application_column_name IS NULL OR p_descriptive_flexfield_name IS NULL OR p_application_column_name IS NULL) THEN
15028       RAISE e_no_attr_for_id_error;
15029     ELSE
15030       BEGIN
15031 
15032         -- check if there exists any attributes to be updated
15033         select attr_id into l_attr_id
15034         from EGO_FND_DF_COL_USGS_EXT
15035         where application_id = p_application_id
15036         and descriptive_flexfield_name = p_descriptive_flexfield_name
15037         and application_column_name = p_application_column_name;
15038 
15039         -- change the control level for this attribute
15040         update EGO_FND_DF_COL_USGS_EXT
15041         set control_level = p_control_level
15042         where application_id = p_application_id
15043         and descriptive_flexfield_name = p_descriptive_flexfield_name
15044         and application_column_name = p_application_column_name;
15045 
15046       EXCEPTION
15047         WHEN NO_DATA_FOUND THEN
15048           RAISE e_no_attr_for_id_error;
15049       END;
15050     END IF;
15051 
15052 
15053 
15054     -- Standard check of p_commit
15055     IF FND_API.To_Boolean(p_commit) THEN
15056       COMMIT WORK;
15057     END IF;
15058 
15059     x_return_status := FND_API.G_RET_STS_SUCCESS;
15060 
15061 
15062   EXCEPTION
15063     WHEN e_control_level_invalid THEN
15064       x_return_status := FND_API.G_RET_STS_ERROR;
15065       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_CL_INVALID');
15066       FND_MSG_PUB.Add;
15067       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
15068                                ,p_count   => x_msg_count
15069                                ,p_data    => x_msg_data);
15070 
15071 
15072     WHEN e_no_attr_for_id_error THEN
15073       x_return_status := FND_API.G_RET_STS_ERROR;
15074       FND_MESSAGE.Set_Name('EGO', 'EGO_EF_NO_ATTR_FOUND');
15075       FND_MSG_PUB.Add;
15076       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
15077                                ,p_count   => x_msg_count
15078                                ,p_data    => x_msg_data);
15079 
15080 
15081 
15082     WHEN OTHERS THEN
15083       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
15084 
15085       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
15086       FND_MESSAGE.Set_Token('PKG_NAME', G_PKG_NAME);
15087       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
15088       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM||' '||FND_FLEX_DSC_API.Message());
15089       FND_MSG_PUB.Add;
15090       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
15091                                ,p_count   => x_msg_count
15092                                ,p_data    => x_msg_data);
15093 
15094   END Update_Attribute_Control_Level;
15095 ------------------------------------------------------------------------------------------
15096 -- Requirement:   bug: 3801472
15097 --
15098 -- Function: To return the attribute changes table for a given attribute group type.
15099 --           If the table is not defined, NULL is returned
15100 --
15101 -- Parameters:
15102 --         IN
15103 --  p_attr_group_type:  attribute_group_type
15104 --        OUT
15105 --  x_base_table     : base table for attribute_changes
15106 --  x_tl_table       : translatable table for attribute_changes
15107 --
15108 ------------------------------------------------------------------------------------------
15109 --
15110 PROCEDURE Get_Attr_Changes_Table (
15111    p_attr_group_type  IN  VARCHAR2
15112   ,x_base_table      OUT NOCOPY VARCHAR2
15113   ,x_tl_table        OUT NOCOPY VARCHAR2
15114   ) IS
15115 BEGIN
15116   -- currently all programs call this
15117   -- this need to be changed once we have decided
15118   -- where to store this meta data.
15119   IF p_attr_group_type = 'EGO_ITEMMGMT_GROUP' THEN
15120      x_base_table := 'EGO_ITEMS_ATTRS_CHANGES_B';
15121      x_tl_table   := 'EGO_ITEMS_ATTRS_CHANGES_TL';
15122    ELSE
15123     x_base_table := NULL;
15124     x_tl_table   := NULL;
15125 END IF;
15126 
15127   EXCEPTION
15128   WHEN OTHERS THEN
15129     x_base_table := NULL;
15130     x_tl_table   := NULL;
15131 END Get_Attr_Changes_Table;
15132 ------------------------------------------------------------------------------------------
15133 
15134 ------------------------------------------------------------------------------------------
15135 -- This function takes an object name and a classification code and returns the display --
15136 -- name belonging to the classification code.                                           --
15137 ------------------------------------------------------------------------------------------
15138 FUNCTION Convert_Class_Code_To_Name (
15139    p_object_name      IN VARCHAR2
15140   ,p_class_code       IN VARCHAR2
15141 ) RETURN VARCHAR2 IS
15142 
15143   l_ocv_name          VARCHAR2(30);
15144   l_class_name        VARCHAR2(40);
15145 
15146 BEGIN
15147   SELECT EXT_ATTR_OCV_NAME
15148     INTO l_ocv_name
15149     FROM EGO_FND_OBJECTS_EXT
15150    WHERE OBJECT_NAME = p_object_name;
15151 
15152   IF (p_class_code = '-1') THEN
15153     l_class_name := '-1';
15154   ELSE
15155     EXECUTE IMMEDIATE 'SELECT MEANING FROM '||l_ocv_name||' WHERE CODE = :code AND ROWNUM = 1'
15156        INTO l_class_name
15157       USING p_class_code;
15158 
15159   END IF;
15160 
15161   RETURN l_class_name;
15162 EXCEPTION
15163   WHEN OTHERS THEN
15164     RETURN NULL;
15165 END Convert_Class_Code_To_Name;
15166 
15167 ------------------------------------------------------------------------------------------
15168 -- This function takes an object name and a classification name and returns the         --
15169 -- classification code of the given classification name.                                --
15170 ------------------------------------------------------------------------------------------
15171 FUNCTION Convert_Name_To_Class_Code (
15172    p_object_name      IN VARCHAR2
15173   ,p_class_name       IN VARCHAR2
15174 ) RETURN VARCHAR2 IS
15175 
15176   l_ocv_name          VARCHAR2(30);
15177   l_class_code        VARCHAR2(40);
15178 
15179 BEGIN
15180   SELECT EXT_ATTR_OCV_NAME
15181     INTO l_ocv_name
15182     FROM EGO_FND_OBJECTS_EXT
15183    WHERE OBJECT_NAME = p_object_name;
15184 
15185   IF (p_class_name = '-1') THEN
15186     l_class_code := '-1';
15187   ELSE
15188     EXECUTE IMMEDIATE 'SELECT CODE FROM '||l_ocv_name||' WHERE MEANING = :name AND ROWNUM = 1'
15189        INTO l_class_code
15190       USING p_class_name;
15191 
15192   END IF;
15193 
15194   RETURN l_class_code;
15195 EXCEPTION
15196   WHEN OTHERS THEN
15197     RETURN NULL;
15198 END Convert_Name_To_Class_Code;
15199 
15200 -------------------------------------------------------------------------------------------
15201 -- This function calls the specified API, passing the specified attribute metadata, to   --
15202 -- determine whether the attribute is supported by application to which the API belongs. --
15203 -------------------------------------------------------------------------------------------
15204 FUNCTION Check_Supported_Attr_Usages (
15205         p_support_api                   IN   VARCHAR2
15206        ,p_application_id                IN   NUMBER
15207        ,p_attr_grp_type                 IN   VARCHAR2
15208        ,p_attr_grp_name                 IN   VARCHAR2
15209        ,p_attr_name                     IN   VARCHAR2
15210        ,p_data_level                    IN   VARCHAR2
15211        ,p_is_multi_row                  IN   VARCHAR2
15212        ,p_data_type                     IN   VARCHAR2
15213 ) RETURN VARCHAR2 IS
15214 
15215   l_ret_char_val                        VARCHAR2(1);
15216   l_string    VARCHAR2(10000);
15217 
15218 BEGIN
15219 
15220   EXECUTE IMMEDIATE
15221     'DECLARE ' ||
15222     '  l_metadata EGO_EXT_FWK_PUB.EGO_ATTR_USG_METADATA; ' ||
15223     '  l_api_ret_val VARCHAR2(1); ' ||
15224     'BEGIN ' ||
15225     '  l_api_ret_val := ''N''; ' ||
15226     '  l_metadata.application_id := :1; ' ||
15227     '  l_metadata.attr_grp_type := :2; ' ||
15228     '  l_metadata.attr_grp_name := :3; ' ||
15229     '  l_metadata.attr_name := :4; ' ||
15230     '  l_metadata.data_level := :5; ' ||
15231     '  l_metadata.is_multi_row := :6; ' ||
15232     '  l_metadata.data_type := :7; ' ||
15233     '  IF (' || p_support_api || '(l_metadata)) THEN ' ||
15234     '    l_api_ret_val := ''Y''; ' ||
15235     '  ELSE ' ||
15236     '    l_api_ret_val := ''N''; ' ||
15237     '  END IF; ' ||
15238     '  :8 := l_api_ret_val; ' ||
15239     'END;'
15240     USING IN p_application_id
15241          ,IN p_attr_grp_type
15242          ,IN p_attr_grp_name
15243          ,IN p_attr_name
15244          ,IN p_data_level
15245          ,IN p_is_multi_row
15246          ,IN p_data_type
15247          ,OUT l_ret_char_val;
15248 
15249   RETURN l_ret_char_val;
15250 
15251 EXCEPTION
15252 
15253   WHEN OTHERS THEN
15254     RETURN 'N';
15255 
15256 END Check_Supported_Attr_Usages;
15257 
15258 ------------------------------------------------------------------------------------------
15259 -- Function: To return the  pending transalatable table name  for a given attribute group type
15260 --  an the application id
15261 --           If the table is not defined, NULL is returned
15262 --
15263 -- Parameters:
15264 --         IN
15265 --  p_attr_group_type:  attribute_group_type
15266 --  p_attr_group_type      application_id
15267 --        OUT
15268 --  l_table_name     : translatable table for attribute_changes
15269 ------------------------------------------------------------------------------------------
15270 FUNCTION Get_Attr_Changes_TL_Table (
15271         p_application_id                IN   NUMBER
15272        ,p_attr_group_type               IN   VARCHAR2
15273 )
15274 RETURN VARCHAR2
15275 IS
15276 
15277     l_table_name             VARCHAR2(30);
15278     l_dynamic_sql            VARCHAR2(350);
15279 
15280   BEGIN
15281     l_dynamic_sql:='SELECT CHANGE_TL_TABLE_NAME'||
15282 '      FROM ENG_PENDING_CHANGE_CTX'||
15283 '     WHERE APPLICATION_ID = :1'||--p_application_id
15284 '    AND CHANGE_ATTRIBUTE_GROUP_TYPE =:2' ;--p_attr_group_type;
15285 
15286     EXECUTE IMMEDIATE l_dynamic_sql INTO l_table_name USING p_application_id
15287                                                             ,p_attr_group_type;
15288 
15289     RETURN l_table_name;
15290 
15291   EXCEPTION
15292     WHEN OTHERS THEN
15293       RETURN NULL;
15294 
15295 END Get_Attr_Changes_TL_Table;
15296 -------------------------------------------------------------------------------
15297 ------------------------------------------------------------------------------------------
15298 -- Function: To return the  pending base table name  for a given attribute group type
15299 --  an the application id
15300 --           If the table is not defined, NULL is returned
15301 --
15302 -- Parameters:
15303 --         IN
15304 --  p_attr_group_type:  attribute_group_type
15305 --  p_attr_group_type      application_id
15306 --        OUT
15307 --  l_table_name     : base table for attribute_changes
15308 ------------------------------------------------------------------------------------------
15309 FUNCTION Get_Attr_Changes_B_Table (
15310         p_application_id                IN   NUMBER
15311        ,p_attr_group_type               IN   VARCHAR2
15312 )
15313 RETURN VARCHAR2
15314 IS
15315 
15316     l_table_name             VARCHAR2(30);
15317     l_dynamic_sql            VARCHAR2(350);
15318 
15319   BEGIN
15320     l_dynamic_sql:='SELECT CHANGE_B_TABLE_NAME'||
15321 '      FROM ENG_PENDING_CHANGE_CTX'||
15322 '     WHERE APPLICATION_ID = :1'||--p_application_id
15323 '    AND CHANGE_ATTRIBUTE_GROUP_TYPE =:2' ;--p_attr_group_type;
15324 
15325     EXECUTE IMMEDIATE l_dynamic_sql INTO l_table_name USING p_application_id
15326                                                             ,p_attr_group_type;
15327     RETURN l_table_name;
15328 
15329   EXCEPTION
15330     WHEN OTHERS THEN
15331       RETURN NULL;
15332 END Get_Attr_Changes_B_Table;
15333 
15334 -----------------------------------------------------------------------------------------
15335 
15336 
15337 
15338 
15339 
15340 
15341 PROCEDURE Sync_Up_Attr_Metadata (
15342                                    p_source_ag_name      IN     VARCHAR2,
15343                                    p_source_ag_type      IN     VARCHAR2,
15344                                    p_source_appl_id      IN     VARCHAR2,
15345                                    p_target_ag_name      IN     VARCHAR2,
15346                                    p_target_ag_type      IN     VARCHAR2,
15347                                    p_target_appl_id      IN     VARCHAR2,
15348                                    x_return_status       OUT  NOCOPY  VARCHAR2,
15349                                    x_errorcode           OUT  NOCOPY  VARCHAR2,
15350                                    x_msg_count           OUT  NOCOPY  NUMBER,
15351                                    x_msg_data            OUT  NOCOPY  VARCHAR2
15352                                 )
15353 IS
15354 
15355  l_attr_Group_metadata_obj       EGO_ATTR_GROUP_METADATA_OBJ;
15356  l_attr_metadata_table           EGO_ATTR_METADATA_TABLE;
15357  l_return_status                 VARCHAR2(1);
15358  l_errorcode                     VARCHAR2(100);
15359  l_msg_count                     NUMBER;
15360  l_msg_data                      VARCHAR2(10000);
15361  l_col_name                      VARCHAR2(30);
15362 
15363 BEGIN
15364 
15365      l_attr_group_metadata_obj :=
15366           EGO_USER_ATTRS_COMMON_PVT.Get_Attr_Group_Metadata(
15367                                      p_application_id  => p_source_appl_id
15368                                     ,p_attr_group_type => p_source_ag_type
15369                                     ,p_attr_group_name => p_source_ag_name
15370                                     ,p_pick_from_cache => FALSE
15371                                    );
15372 
15373      IF (l_attr_group_metadata_obj IS NOT NULL ) THEN
15374        l_attr_metadata_table := l_attr_group_metadata_obj.attr_metadata_table;
15375      END IF;
15376 
15377      IF (l_attr_metadata_table IS NOT NULL) THEN
15378 
15379        FOR i IN l_attr_metadata_table.FIRST .. l_attr_metadata_table.LAST
15380        LOOP
15381 
15382           BEGIN
15383               SELECT APPLICATION_COLUMN_NAME
15384               INTO l_col_name
15385               FROM FND_DESCR_FLEX_COLUMN_USAGES
15386               WHERE APPLICATION_ID =  p_target_appl_id
15387                 AND DESCRIPTIVE_FLEXFIELD_NAME = p_target_ag_type
15388                 AND DESCRIPTIVE_FLEX_CONTEXT_CODE = p_target_ag_name
15389                 AND END_USER_COLUMN_NAME = l_attr_metadata_table(i).ATTR_NAME;
15390           EXCEPTION
15391            WHEN OTHERS THEN
15392              l_col_name := NULL;
15393           END;
15394 
15395           IF (l_col_name IS NOT NULL) THEN
15396 
15397             Update_Attribute (
15398                p_api_version              => 1.0
15399               ,p_application_id           => p_target_appl_id
15400               ,p_attr_group_type          => p_target_ag_type
15401               ,p_attr_group_name          => p_target_ag_name
15402               ,p_internal_name            => l_attr_metadata_table(i).ATTR_NAME
15403               ,p_display_name             => l_attr_metadata_table(i).ATTR_DISP_NAME
15404               ,p_description              => NULL
15405               ,p_sequence                 => l_attr_metadata_table(i).SEQUENCE
15406               ,p_required                 => l_attr_metadata_table(i).REQUIRED_FLAG
15407               ,p_searchable               => NULL
15408               ,p_column                   => l_col_name
15409               ,p_value_set_id             => l_attr_metadata_table(i).VALUE_SET_ID
15410               ,p_info_1                   => l_attr_metadata_table(i).INFO_1
15411               ,p_default_value            => l_attr_metadata_table(i).DEFAULT_VALUE
15412               ,p_enabled                  => NULL
15413               ,p_display                  => NULL
15414               ,p_view_in_hierarchy_code   => NULL
15415               ,p_edit_in_hierarchy_code   => NULL
15416               ,p_uom_class                => l_attr_metadata_table(i).UNIT_OF_MEASURE_CLASS
15417               ,x_return_status            => l_return_status
15418               ,x_errorcode                => l_errorcode
15419               ,x_msg_count                => l_msg_count
15420               ,x_msg_data                 => l_msg_data
15421               );
15422 
15423             x_msg_count := l_msg_count + NVL(x_msg_count,0);
15424             x_msg_data := x_msg_data || l_msg_data;
15425             x_errorcode := x_errorcode || l_errorcode;
15426 
15427             IF (x_return_status IS NULL) THEN
15428               x_return_status := l_return_status;
15429             END IF;
15430 
15431             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
15432                x_return_status := l_return_status;
15433             END IF;
15434 
15435          END IF;
15436 
15437        END LOOP;
15438 
15439      END IF;
15440 
15441 END Sync_Up_Attr_Metadata;
15442 
15443 --Method for concatenating DataLevels, R12C changes--
15444 FUNCTION Concat_Data_Level_DisplayNames (p_attr_grp_id IN NUMBER)
15445 RETURN VARCHAR2 IS
15446 
15447     CURSOR c_data_levels(p_attr_grp_id IN NUMBER) IS
15448     SELECT DL_TL.user_data_level_name  data_level_name
15449     FROM EGO_ATTR_GROUP_DL AG_DL, EGO_DATA_LEVEL_B DL_B, EGO_DATA_LEVEL_TL DL_TL
15450     WHERE AG_DL.data_level_id = DL_B.data_level_id
15451     AND DL_B.data_level_id = DL_TL.data_level_id
15452     AND UserEnv('LANG')=LANGUAGE
15453     AND AG_DL.attr_group_id = p_attr_grp_id;
15454 
15455     l_data_levels VARCHAR2(4000) := '';
15456 
15457  BEGIN
15458 
15459     FOR i IN c_data_levels(p_attr_grp_id) LOOP
15460     l_data_levels :=  l_data_levels || ',' || i.data_level_name;
15461     END LOOP;
15462     l_data_levels := SubStr(l_data_levels,2);
15463     RETURN l_data_levels;
15464 
15465  END;
15466 
15467  /*Procedure to delete the versioned value fron the draft of Versioned value set.*/
15468 PROCEDURE Delete_Value_Set_val(
15469           p_value_set_id IN NUMBER
15470           ,p_value_id    IN NUMBER
15471         ,x_return_status OUT NOCOPY VARCHAR2
15472 ) IS
15473 
15474     l_value_set_name             FND_FLEX_VALUE_SETS.flex_value_set_name%TYPE;
15475     l_flex_value_id              FND_FLEX_VALUES.flex_value_id%TYPE;
15476     l_internal_name              FND_FLEX_VALUES.FLEX_VALUE%TYPE;
15477     l_display_name               FND_FLEX_VALUES_TL.flex_value_meaning%TYPE;
15478     l_description                FND_FLEX_VALUES_TL.description%TYPE;
15479     l_start_date                 DATE;
15480     l_end_date                   DATE;
15481     l_enabled                    FND_FLEX_VALUES.ENABLED_FLAG%TYPE;
15482 
15483   BEGIN
15484   SELECT  FLEX_VALUE_SET_NAME INTO  L_VALUE_SET_NAME FROM FND_FLEX_VALUE_SETS
15485     WHERE FLEX_VALUE_SET_ID =  p_value_set_id    ;
15486   SELECT  FLEX_VALUE,FLEX_VALUE_MEANING,DESCRIPTION, START_DATE_ACTIVE,
15487           ENABLED_FLAG INTO l_internal_name,l_display_name,l_description,l_start_date,l_enabled
15488      FROM FND_FLEX_VALUES,FND_FLEX_VALUES_TL WHERE
15489            LANGUAGE = userenv('LANG') AND FND_FLEX_VALUES.FLEX_VALUE_ID = p_value_id
15490            AND FND_FLEX_VALUES_TL.FLEX_VALUE_ID = p_value_id  AND ROWNUM=1;
15491         FND_FLEX_VALUES_PKG.UPDATE_ROW
15492         (x_flex_value_id            => p_value_id
15493         ,x_attribute_sort_order     => NULL
15494         ,x_flex_value_set_id        => p_value_set_id
15495         ,x_flex_value               => l_internal_name
15496         ,x_enabled_flag             => l_enabled
15497         ,x_summary_flag             => 'N'
15498         ,x_start_date_active        => l_start_date
15499         ,x_end_date_active          => sysdate
15500         ,x_parent_flex_value_low    => NULL
15501         ,x_parent_flex_value_high   => NULL
15502         ,x_structured_hierarchy_level => NULL
15503         ,x_hierarchy_level            => NULL
15504         ,x_compiled_value_attributes  => NULL
15505         ,x_value_category             => NULL
15506         ,x_attribute1                 => NULL
15507         ,x_attribute2                 => NULL
15508         ,x_attribute3                 => NULL
15509         ,x_attribute4                 => NULL
15510         ,x_attribute5                 => NULL
15511         ,x_attribute6                 => NULL
15512         ,x_attribute7                 => NULL
15513         ,x_attribute8                 => NULL
15514         ,x_attribute9                 => NULL
15515         ,x_attribute10                => NULL
15516         ,x_attribute11                => NULL
15517         ,x_attribute12                => NULL
15518         ,x_attribute13                => NULL
15519         ,x_attribute14                => NULL
15520         ,x_attribute15                => NULL
15521         ,x_attribute16                => NULL
15522         ,x_attribute17                => NULL
15523         ,x_attribute18                => NULL
15524         ,x_attribute19                => NULL
15525         ,x_attribute20                => NULL
15526         ,x_attribute21                => NULL
15527         ,x_attribute22                => NULL
15528         ,x_attribute23                => NULL
15529         ,x_attribute24                => NULL
15530         ,x_attribute25                => NULL
15531         ,x_attribute26                => NULL
15532         ,x_attribute27                => NULL
15533         ,x_attribute28                => NULL
15534         ,x_attribute29                => NULL
15535         ,x_attribute30                => NULL
15536         ,x_attribute31                => NULL
15537         ,x_attribute32                => NULL
15538         ,x_attribute33                => NULL
15539         ,x_attribute34                => NULL
15540         ,x_attribute35                => NULL
15541         ,x_attribute36                => NULL
15542         ,x_attribute37                => NULL
15543         ,x_attribute38                => NULL
15544         ,x_attribute39                => NULL
15545         ,x_attribute40                => NULL
15546         ,x_attribute41                => NULL
15547         ,x_attribute42                => NULL
15548         ,x_attribute43                => NULL
15549         ,x_attribute44                => NULL
15550         ,x_attribute45                => NULL
15551         ,x_attribute46                => NULL
15552         ,x_attribute47                => NULL
15553         ,x_attribute48                => NULL
15554         ,x_attribute49                => NULL
15555         ,x_attribute50                => NULL
15556         ,x_flex_value_meaning         => l_display_name
15557         ,x_description                => l_description
15558         ,x_last_update_date           => sysdate
15559         ,x_last_updated_by            => fnd_global.party_id
15560         ,x_last_update_login          => G_CURRENT_LOGIN_ID);
15561 
15562   DELETE EGO_FLEX_VALUE_VERSION_B WHERE FLEX_VALUE_ID = p_value_id AND VERSION_SEQ_ID = 0  ;
15563   DELETE EGO_FLEX_VALUE_VERSION_TL WHERE FLEX_VALUE_ID = p_value_id AND VERSION_SEQ_ID = 0   ;
15564 
15565   x_return_status :='S';
15566 commit;
15567   EXCEPTION
15568   WHEN OTHERS THEN
15569     x_return_status :='F'  ;
15570 
15571 
15572   END  ;
15573 
15574 --------------------------------------------------------------------------------------------
15575 -- Execute_Function
15576 --------------------------------------------------------------------------------------------
15577 PROCEDURE Execute_Function(
15578                            p_Action_Id                     IN  Number
15579                           ,p_pk_col_value_pairs            IN   EGO_COL_NAME_VALUE_PAIR_ARRAY
15580                           ,p_dtlevel_col_value_pairs       IN   EGO_COL_NAME_VALUE_PAIR_ARRAY DEFAULT NULL
15581                           ,x_attributes_row_table          IN  OUT NOCOPY EGO_USER_ATTR_ROW_TABLE
15582                           ,x_attributes_data_table         IN  OUT NOCOPY EGO_USER_ATTR_DATA_TABLE
15583                           ,x_external_attrs_value_pairs    IN  OUT NOCOPY EGO_COL_NAME_VALUE_PAIR_TABLE
15584                           ,x_return_status                 OUT NOCOPY VARCHAR2
15585                           ,x_errorcode                     OUT NOCOPY NUMBER
15586                           ,x_msg_count                     OUT NOCOPY NUMBER
15587                           ,x_msg_data                      OUT NOCOPY VARCHAR2
15588                            ) IS
15589 
15590   CURSOR EGO_FUNC_CSR
15591   (
15592     v_function_id          IN   EGO_FUNCTIONS_V.FUNCTION_ID%TYPE
15593   ) IS
15594    SELECT *
15595      FROM (SELECT FUNCTION_ID,
15596                   INTERNAL_NAME,
15597                   DISPLAY_NAME,
15598                   DESCRIPTION,
15599                   FUNC_TYPE_CODE FUNCTION_TYPE,
15600                   FUNC_TYPE_MEANING,
15601                   FUNCTION_INFO_1,
15602                   FUNCTION_INFO_2
15603              FROM EGO_FUNCTIONS_V) QRSLT
15604     WHERE (FUNCTION_ID IN (v_function_id))
15605     ORDER BY DISPLAY_NAME;
15606 
15607   CURSOR EGO_ACTION_MAPPING_CSR
15608   (
15609     v_action_id          IN   EGO_ACTIONS_V.ACTION_ID%TYPE
15610   ) IS
15611    SELECT *
15612      FROM (SELECT MA.FUNCTION_ID FUNCTION_ID,
15613                   MA.MAPPED_OBJ_PK1_VAL MAPPED_OBJ_PK1_VAL,
15614                   MA.FUNC_PARAM_ID FUNC_PARAM_ID,
15615                   MA.MAPPED_OBJ_TYPE MAPPED_OBJ_TYPE,
15616                   MA.MAPPED_TO_GROUP_TYPE MAPPED_TO_GROUP_TYPE,
15617                   MA.MAPPED_TO_GROUP_PK1 MAPPED_TO_GROUP_PK1,
15618                   MA.MAPPED_TO_GROUP_PK2 MAPPED_TO_GROUP_PK2,
15619                   MA.MAPPED_TO_GROUP_PK3 MAPPED_TO_GROUP_PK3,
15620                   MA.MAPPED_ATTRIBUTE MAPPED_ATTRIBUTE,
15621                   MA.MAPPED_TO_GROUP_MEANING MAPPED_TO_GROUP_MEANING,
15622                   MA.MAPPED_UOM_PARAMETER MAPPED_UOM_PARAMETER,
15623                   MA.VALUE_UOM_SOURCE VALUE_UOM_SOURCE,
15624                   MA.FIXED_UOM FIXED_UOM,
15625                   (SELECT AGV.ATTR_GROUP_DISP_NAME
15626                      FROM EGO_ATTR_GROUPS_V AGV
15627                     WHERE AGV.APPLICATION_ID = MA.MAPPED_TO_GROUP_PK1
15628                       AND AGV.ATTR_GROUP_TYPE = MA.MAPPED_TO_GROUP_PK2
15629                       AND AGV.ATTR_GROUP_NAME = MA.MAPPED_TO_GROUP_PK3) ATTR_GROUP_DISP_NAME,
15630                   (SELECT AV.SEQUENCE
15631                      FROM EGO_ATTRS_V AV
15632                     WHERE AV.APPLICATION_ID = MA.MAPPED_TO_GROUP_PK1
15633                       AND AV.ATTR_GROUP_TYPE = MA.MAPPED_TO_GROUP_PK2
15634                       AND AV.ATTR_GROUP_NAME = MA.MAPPED_TO_GROUP_PK3
15635                       AND AV.ATTR_NAME = MA.MAPPED_ATTRIBUTE) SEQUENCE,
15636                   DECODE((SELECT AV.DISPLAY_CODE
15637                            FROM EGO_ATTRS_V AV
15638                           WHERE AV.APPLICATION_ID = MA.MAPPED_TO_GROUP_PK1
15639                             AND AV.ATTR_GROUP_TYPE = MA.MAPPED_TO_GROUP_PK2
15640                             AND AV.ATTR_GROUP_NAME = MA.MAPPED_TO_GROUP_PK3
15641                             AND AV.ATTR_NAME = MA.MAPPED_ATTRIBUTE),
15642                          'H',
15643                          TO_NUMBER(NULL),
15644                          1) HIDDEN_FILTER
15645              FROM EGO_MAPPINGS_V MA) QRSLT
15646     WHERE (MAPPED_OBJ_PK1_VAL IN (v_action_id))
15647     ORDER BY FUNC_PARAM_ID ASC;
15648 
15649   CURSOR EGO_FUNC_PARAMS_CSR
15650   (
15651     v_function_id          IN   EGO_FUNCTIONS_V.FUNCTION_ID%TYPE
15652   ) IS
15653    SELECT FP.FUNC_PARAM_ID,
15654           FP.FUNCTION_ID,
15655           FP.SEQUENCE,
15656           FP.INTERNAL_NAME,
15657           FP.DISPLAY_NAME,
15658           FP.DESCRIPTION,
15659           FP.DATA_TYPE_CODE,
15660           FP.DATA_TYPE_MEANING,
15661           FP.FUNC_TYPE_CODE,
15662           FP.FUNC_TYPE_MEANING,
15663           FP.PARAM_TYPE_CODE,
15664           FP.PARAM_TYPE_MEANING,
15665           MA.MAPPED_TO_GROUP_TYPE
15666      FROM EGO_FUNC_PARAMS_V FP, EGO_MAPPINGS_V MA
15667     WHERE (FP.FUNCTION_ID IN (v_function_id)
15668            AND FP.FUNCTION_ID = MA.FUNCTION_ID
15669            AND FP.FUNC_PARAM_ID = MA.FUNC_PARAM_ID
15670            AND MA.MAPPED_OBJ_PK1_VAL = p_Action_Id)
15671     ORDER BY FP.FUNC_PARAM_ID ASC;
15672 
15673   CURSOR EGO_ACTION_CSR
15674   (
15675     v_action_id      IN   EGO_ACTIONS_V.ACTION_ID%TYPE
15676   ) IS
15677    SELECT *
15678      FROM (SELECT EAV.ACTION_ID,
15679                   EAV.OBJECT_ID,
15680                   EAV.CLASSIFICATION_CODE,
15681                   EAV.OBJ_NAME,
15682                   EAV.OBJ_DISP_NAME,
15683                   EAV.ATTR_GRP_APPLICATION_ID,
15684                   EAV.ATTR_GROUP_TYPE,
15685                   EAV.ATTR_GROUP_NAME,
15686                   EAV.ATTR_GROUP_DISP_NAME,
15687                   EAV.SEQUENCE,
15688                   EAV.ACTION_NAME,
15689                   EAV.DESCRIPTION,
15690                   EAV.FUNCTION_ID,
15691                   EAV.FUNC_DISPLAY_NAME,
15692                   EAV.SECURITY_PRIVILEGE_ID,
15693                   EAV.SECURITY_PRIVILEGE_NAME,
15694                   FFF.FUNCTION_NAME,
15695                   EAV.ATTR_GROUP_ID,
15696                   EAV.ENABLE_KEY_ATTRIBUTES
15697              FROM EGO_ACTIONS_V EAV, FND_FORM_FUNCTIONS FFF
15698             WHERE EAV.SECURITY_PRIVILEGE_ID = FFF.FUNCTION_ID(+)
15699               AND classification_code IN
15700                   (SELECT classification_code
15701                      FROM ego_obj_attr_grp_assocs_v
15702                     WHERE attr_group_id = EAV.ATTR_GROUP_ID)) QRSLT
15703     WHERE ACTION_ID = v_action_id
15704     ORDER BY FUNCTION_ID ASC;
15705 
15706   TYPE LOCAL_ACTION_MAPPING_TABLE IS TABLE OF EGO_ACTION_MAPPING_CSR%ROWTYPE;
15707   TYPE LOCAL_FUNCTION_PARAM_TABLE IS TABLE OF EGO_FUNC_PARAMS_CSR%ROWTYPE;
15708 
15709   l_action_rec         EGO_ACTION_CSR%ROWTYPE;
15710   l_function_rec       EGO_FUNC_CSR%ROWTYPE;
15711   l_action_mapping_rec EGO_ACTION_MAPPING_CSR%ROWTYPE;
15712   l_function_param_rec EGO_FUNC_PARAMS_CSR%ROWTYPE;
15713   l_function_id        EGO_ACTIONS_V.function_id%TYPE;
15714 
15715   l_action_mapping_table LOCAL_ACTION_MAPPING_TABLE := new LOCAL_ACTION_MAPPING_TABLE();
15716   l_function_param_table LOCAL_FUNCTION_PARAM_TABLE := new LOCAL_FUNCTION_PARAM_TABLE();
15717 
15718   l_attr_name       VARCHAR2(30);
15719   l_func_param_name VARCHAR2(30);
15720 
15721   l_sql             VARCHAR2(20000);
15722 
15723   v_cursor          INTEGER;
15724   l_boolean         BOOLEAN;
15725   l_dummy           NUMBER;
15726 
15727   l_null_n          NUMBER := NULL;
15728   l_null_c          VARCHAR2(1) := NULL;
15729   l_null_d          DATE   := NULL;
15730   l_dummy_str       VARCHAR2(30) := '';
15731 
15732   l_api_name        VARCHAR2(30) := 'Execution_Function';
15733   l_action_name     l_action_rec.ACTION_NAME%TYPE;
15734 
15735   no_action_founded_exception   EXCEPTION;
15736   no_function_founded_exception EXCEPTION;
15737   func_params_mapping_exception EXCEPTION;
15738   bad_uda_row_info              EXCEPTION;
15739   bad_uda_data_row_identifier   EXCEPTION;
15740   no_data_found_for_param_bind   EXCEPTION;
15741 BEGIN
15742   x_return_status := FND_API.G_RET_STS_SUCCESS;
15743 
15744   --Check if x_attributes_data_table and x_attributes_row_table have correct Row_Identifier.
15745   FOR i IN x_attributes_data_table.FIRST .. x_attributes_data_table.LAST LOOP
15746     IF x_attributes_data_table(i).ROW_IDENTIFIER <> x_attributes_row_table(x_attributes_row_table.FIRST).ROW_IDENTIFIER THEN
15747       RAISE bad_uda_data_row_identifier;
15748     END IF;
15749   END LOOP;
15750 
15751   ----------------------------------------------------
15752   --Get the Action definition, Initialize l_action_rec
15753   ----------------------------------------------------
15754   OPEN EGO_ACTION_CSR(v_action_id => p_Action_Id);
15755   FETCH EGO_ACTION_CSR INTO l_action_rec;
15756   IF EGO_ACTION_CSR%NOTFOUND THEN
15757     RAISE no_action_founded_exception;
15758   ELSE
15759     l_function_id := l_action_rec.FUNCTION_ID;
15760     code_debug ('EGO_EXT_FWK_PUB.Execute_Function - Function Id is '||l_function_id);
15761   END IF;
15762   CLOSE EGO_ACTION_CSR;
15763 
15764   -------------------------------------------------------------
15765   --Get action mapping info, initialize l_action_mapping_table
15766   -------------------------------------------------------------
15767   FOR r_action_mapping_rec IN EGO_ACTION_MAPPING_CSR(v_action_id => p_Action_Id)
15768   LOOP
15769     EXIT WHEN EGO_ACTION_MAPPING_CSR%NOTFOUND;
15770     --Validation
15771     --For all mapped user-defined attrs, the belonging Application Id, AG type and AG name should be the same as in x_attributes_row_table
15772     IF r_action_mapping_rec.MAPPED_TO_GROUP_TYPE = 'A' THEN
15773       IF x_attributes_row_table(x_attributes_row_table.FIRST).ATTR_GROUP_APP_ID <> r_action_mapping_rec.MAPPED_TO_GROUP_PK1
15774          OR x_attributes_row_table(x_attributes_row_table.FIRST).ATTR_GROUP_TYPE <> r_action_mapping_rec.MAPPED_TO_GROUP_PK2
15775          OR x_attributes_row_table(x_attributes_row_table.FIRST).ATTR_GROUP_NAME <> r_action_mapping_rec.MAPPED_TO_GROUP_PK3 THEN
15776          RAISE bad_uda_row_info;
15777 
15778       END IF;
15779     END IF;
15780     --Initialization
15781     l_action_mapping_table.extend();
15782     l_action_mapping_table(l_action_mapping_table.LAST) := r_action_mapping_rec;
15783   END LOOP;
15784   code_debug ('EGO_EXT_FWK_PUB.Execute_Function - There are '|| l_action_mapping_table.COUNT || ' attr mappings');
15785 
15786   --------------------------------------------------------
15787   --Get the Function definition, Initialize l_function_rec
15788   --------------------------------------------------------
15789   OPEN EGO_FUNC_CSR(v_function_id => l_function_id);
15790   FETCH EGO_FUNC_CSR INTO l_function_rec;
15791   IF EGO_FUNC_CSR%NOTFOUND THEN
15792     RAISE no_function_founded_exception;
15793   END IF;
15794   CLOSE EGO_FUNC_CSR;
15795 
15796   -----------------------------------------------------------------
15797   --Get function parameters info, initialize l_function_param_table
15798   -----------------------------------------------------------------
15799   FOR r_function_rec IN EGO_FUNC_PARAMS_CSR(v_function_id => l_function_id)
15800   LOOP
15801     EXIT WHEN EGO_FUNC_PARAMS_CSR%NOTFOUND;
15802     l_function_param_table.extend();
15803     l_function_param_table(l_function_param_table.LAST) := r_function_rec;
15804   END LOOP;
15805   code_debug ('EGO_EXT_FWK_PUB.Execute_Function - There are '|| l_function_param_table.COUNT || ' function parameters');
15806 
15807   --Check if the Action <=> Function Mapping is correct or not
15808   IF l_action_mapping_table.COUNT <> l_function_param_table.COUNT THEN
15809     RAISE func_params_mapping_exception;
15810   END IF;
15811 
15812   ----------------------------------------------------------------------
15813   -- Construct the SQL BODY for User Defined Function without Value Bind
15814   ----------------------------------------------------------------------
15815 
15816   --'!@#' is place holder for RETURN PARAM
15817   l_sql := 'BEGIN ' ||'!@#'|| l_function_rec.FUNCTION_INFO_1 || '.' || l_function_rec.FUNCTION_INFO_2 || '(';
15818   FOR i IN l_function_param_table.FIRST .. l_function_param_table.LAST
15819   LOOP
15820     l_function_param_rec := l_function_param_table(i);
15821     l_func_param_name    := l_function_param_rec.INTERNAL_NAME;
15822     IF l_function_param_rec.PARAM_TYPE_CODE <> 'R' THEN
15823       l_sql := l_sql || l_func_param_name || ' => :' || l_func_param_name;
15824       l_sql := l_sql || ', ';
15825     ELSE
15826 
15827       l_sql := REPLACE(l_sql, '!@#', ':ret := ');
15828     END IF;
15829   END LOOP;
15830   l_sql := REPLACE(l_sql, '!@#', '');
15831 
15832   IF substr(l_sql, -2, 2) = ', ' THEN
15833     l_sql := substr(l_sql,1,length(l_sql)-2);
15834   END IF;
15835   l_sql := l_sql || '); END;';
15836 
15837 
15838   code_debug ('EGO_EXT_FWK_PUB.Execute_Function - Constructed SQL statement is: ' || l_sql);
15839 
15840   -----------------------------------------
15841   -- Parse constructed SQL
15842   -----------------------------------------
15843   v_cursor := DBMS_SQL.OPEN_CURSOR;
15844   DBMS_SQL.PARSE(v_cursor, l_sql, DBMS_SQL.NATIVE);
15845 
15846 
15847   -----------------------------------------
15848   -- Bind Variable for the constructed SQL
15849   -----------------------------------------
15850 
15851   FOR i IN l_function_param_table.FIRST .. l_function_param_table.LAST
15852   LOOP
15853     l_boolean := FALSE;
15854     l_function_param_rec := l_function_param_table(i);
15855     l_func_param_name    := l_function_param_rec.INTERNAL_NAME;
15856     --l_function_param_table should have the same sorting seq with l_action_mapping_table by FUNC_PARAM_ID ASC
15857     IF l_function_param_table(i).FUNC_PARAM_ID <> l_action_mapping_table(i).FUNC_PARAM_ID THEN
15858       RAISE func_params_mapping_exception;
15859     END IF;
15860 
15861     l_attr_name := l_action_mapping_table(i).MAPPED_ATTRIBUTE;
15862 
15863     code_debug ('EGO_EXT_FWK_PUB.Execute_Function - l_func_param_name:l_attr_name => '||l_func_param_name||':'||l_attr_name);
15864 
15865     ------------------------------------------------------------------
15866     -- Check the value of l_function_param_rec.MAPPED_TO_GROUP_TYPE --
15867     --   1. A : an Attribute Group value.                           --
15868     --   2. P : an Object Primary Key value.                        --
15869     --   3. D : another of the Object attribute values.             --
15870     --   4. E : external attribute value.                           --
15871     ------------------------------------------------------------------
15872 
15873     IF l_function_param_rec.MAPPED_TO_GROUP_TYPE = 'A' THEN
15874       FOR j IN x_attributes_data_table.FIRST .. x_attributes_data_table.LAST
15875       LOOP
15876         IF x_attributes_data_table(j).ATTR_NAME = l_attr_name THEN
15877           IF l_function_param_rec.PARAM_TYPE_CODE IN ('I', 'O', 'B') THEN
15878             --Check the data type for current attr/param
15879             IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
15880               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, x_attributes_data_table(j).ATTR_VALUE_STR,32767);
15881               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(varchar2): '||l_func_param_name||', VALUE: '||x_attributes_data_table(j).ATTR_VALUE_STR);
15882             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
15883               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, x_attributes_data_table(j).ATTR_VALUE_NUM);
15884               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(number): '||l_func_param_name||', VALUE: '||x_attributes_data_table(j).ATTR_VALUE_NUM);
15885             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
15886               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, x_attributes_data_table(j).ATTR_VALUE_DATE);
15887               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(date): '||l_func_param_name||', VALUE: '||x_attributes_data_table(j).ATTR_VALUE_DATE);
15888             END IF;
15889 
15890           ELSIF l_function_param_rec.PARAM_TYPE_CODE = 'R' THEN
15891             IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
15892               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', x_attributes_data_table(j).ATTR_VALUE_STR, 32767);
15893               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--return--PARAM(varchar2): '||l_func_param_name||', VALUE: '|| x_attributes_data_table(j).ATTR_VALUE_STR);
15894             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
15895               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', x_attributes_data_table(j).ATTR_VALUE_NUM);
15896               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--return--PARAM(number): '||l_func_param_name||', VALUE: '||x_attributes_data_table(j).ATTR_VALUE_NUM);
15897             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
15898               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', x_attributes_data_table(j).ATTR_VALUE_DATE);
15899               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--return--PARAM(date): '||l_func_param_name||', VALUE: '||x_attributes_data_table(j).ATTR_VALUE_DATE);
15900             END IF;
15901           END IF;
15902           --Found value for current paramenter, so exit loop
15903           l_boolean := TRUE;
15904           EXIT;
15905 
15906         END IF;
15907       END LOOP;
15908 
15909     ELSIF l_function_param_rec.MAPPED_TO_GROUP_TYPE = 'E' THEN
15910     --Indicating "External Attributes"
15911       IF x_external_attrs_value_pairs.COUNT > 0 THEN
15912       FOR j IN x_external_attrs_value_pairs.FIRST .. x_external_attrs_value_pairs.LAST
15913       LOOP
15914         IF x_external_attrs_value_pairs(j).NAME = l_attr_name THEN
15915           IF l_function_param_rec.PARAM_TYPE_CODE IN ('I', 'O', 'B') THEN
15916             --Check the data type for current attr/param
15917             IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
15918               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, x_external_attrs_value_pairs(j).VALUE,32767);
15919               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(varchar2): '||l_func_param_name||', VALUE: '||x_external_attrs_value_pairs(j).VALUE);
15920             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
15921               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, x_external_attrs_value_pairs(j).VALUE);
15922               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(number): '||l_func_param_name||', VALUE: '||x_external_attrs_value_pairs(j).VALUE);
15923             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
15924               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, x_external_attrs_value_pairs(j).VALUE);
15925               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(date): '||l_func_param_name||', VALUE: '||x_external_attrs_value_pairs(j).VALUE);
15926             END IF;
15927 
15928           ELSIF l_function_param_rec.PARAM_TYPE_CODE = 'R' THEN
15929             IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
15930               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', x_external_attrs_value_pairs(j).VALUE, 32767);
15931               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--return--PARAM(varchar2): '||l_func_param_name||', VALUE: '|| x_external_attrs_value_pairs(j).VALUE);
15932             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
15933               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', x_external_attrs_value_pairs(j).VALUE);
15934               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--return--PARAM(number): '||l_func_param_name||', VALUE: '||x_external_attrs_value_pairs(j).VALUE);
15935             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
15936               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', x_external_attrs_value_pairs(j).VALUE);
15937               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--return--PARAM(date): '||l_func_param_name||', VALUE: '||x_external_attrs_value_pairs(j).VALUE);
15938             END IF;
15939           END IF;
15940           --Found value for current paramenter, so exit loop
15941           l_boolean := TRUE;
15942           EXIT;
15943 
15944         END IF;
15945       END LOOP;
15946       END IF;
15947     ELSIF l_function_param_rec.MAPPED_TO_GROUP_TYPE = 'P' THEN
15948     --Indicating "Primary Keys", such as Inventory_item_id, Organization_id etc.
15949       FOR j IN p_pk_col_value_pairs.FIRST .. p_pk_col_value_pairs.LAST
15950       LOOP
15951         IF p_pk_col_value_pairs(j).NAME = l_attr_name THEN
15952           IF l_function_param_rec.PARAM_TYPE_CODE IN ('I', 'O', 'B') THEN
15953             --Check the data type for current attr/param
15954             IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
15955               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, p_pk_col_value_pairs(j).VALUE,32767);
15956               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(varchar2): '||l_func_param_name||', VALUE: '||p_pk_col_value_pairs(j).VALUE);
15957             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
15958               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, p_pk_col_value_pairs(j).VALUE);
15959               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(number): '||l_func_param_name||', VALUE: '||p_pk_col_value_pairs(j).VALUE);
15960             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
15961               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, p_pk_col_value_pairs(j).VALUE);
15962               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(date): '||l_func_param_name||', VALUE: '||p_pk_col_value_pairs(j).VALUE);
15963             END IF;
15964 
15965           ELSIF l_function_param_rec.PARAM_TYPE_CODE = 'R' THEN
15966             IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
15967               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', p_pk_col_value_pairs(j).VALUE, 32767);
15968               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--return--PARAM(varchar2): '||l_func_param_name||', VALUE: '|| p_pk_col_value_pairs(j).VALUE);
15969             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
15970               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', p_pk_col_value_pairs(j).VALUE);
15971               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--return--PARAM(number): '||l_func_param_name||', VALUE: '||p_pk_col_value_pairs(j).VALUE);
15972             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
15973               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', p_pk_col_value_pairs(j).VALUE);
15974               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--return--PARAM(date): '||l_func_param_name||', VALUE: '||p_pk_col_value_pairs(j).VALUE);
15975             END IF;
15976           END IF;
15977           --Found value for current paramenter, so exit loop
15978           l_boolean := TRUE;
15979           EXIT;
15980 
15981         END IF;
15982       END LOOP;
15983     ELSIF l_function_param_rec.MAPPED_TO_GROUP_TYPE = 'D' THEN
15984     --Indicating "Data Level Primary Keys", such as Revision_id etc.
15985       FOR j IN p_dtlevel_col_value_pairs.FIRST .. p_dtlevel_col_value_pairs.LAST
15986       LOOP
15987         IF p_dtlevel_col_value_pairs(j).NAME = l_attr_name THEN
15988           IF l_function_param_rec.PARAM_TYPE_CODE IN ('I', 'O', 'B') THEN
15989             --Check the data type for current attr/param
15990             IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
15991               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, p_dtlevel_col_value_pairs(j).VALUE,32767);
15992               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(varchar2): '||l_func_param_name||', VALUE: '||p_dtlevel_col_value_pairs(j).VALUE);
15993             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
15994               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, p_dtlevel_col_value_pairs(j).VALUE);
15995               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(number): '||l_func_param_name||', VALUE: '||p_dtlevel_col_value_pairs(j).VALUE);
15996             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
15997               DBMS_SQL.BIND_VARIABLE(v_cursor, ''||l_func_param_name, p_dtlevel_col_value_pairs(j).VALUE);
15998               code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND--PARAM(date): '||l_func_param_name||', VALUE: '||p_dtlevel_col_value_pairs(j).VALUE);
15999             END IF;
16000 
16001           ELSIF l_function_param_rec.PARAM_TYPE_CODE = 'R' THEN
16002             IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
16003               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', p_dtlevel_col_value_pairs(j).VALUE, 32767);
16004               code_debug ('BIND--return--PARAM(varchar2): '||l_func_param_name||', VALUE: '|| p_dtlevel_col_value_pairs(j).VALUE);
16005             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
16006               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', p_dtlevel_col_value_pairs(j).VALUE);
16007               code_debug ('BIND--return--PARAM(number): '||l_func_param_name||', VALUE: '||p_dtlevel_col_value_pairs(j).VALUE);
16008             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
16009               DBMS_SQL.BIND_VARIABLE(v_cursor, 'ret', p_dtlevel_col_value_pairs(j).VALUE);
16010               code_debug ('BIND--return--PARAM(date): '||l_func_param_name||', VALUE: '||p_dtlevel_col_value_pairs(j).VALUE);
16011             END IF;
16012           END IF;
16013           --Found value for current paramenter, so exit loop
16014           l_boolean := TRUE;
16015           EXIT;
16016 
16017         END IF;
16018       END LOOP;
16019     END IF;
16020 
16021     IF NOT l_boolean THEN
16022       --ONLY bind null value for type "A"&"INPUT" params.
16023       IF l_function_param_rec.PARAM_TYPE_CODE = 'I' AND l_function_param_rec.MAPPED_TO_GROUP_TYPE = 'A' THEN
16024         IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
16025           DBMS_SQL.BIND_VARIABLE(v_cursor, ':'||l_func_param_name, l_null_c);
16026         ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
16027           DBMS_SQL.BIND_VARIABLE(v_cursor, ':'||l_func_param_name, l_null_n);
16028         ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
16029           DBMS_SQL.BIND_VARIABLE(v_cursor, ':'||l_func_param_name, l_null_d);
16030         END IF;
16031         code_debug ('EGO_EXT_FWK_PUB.Execute_Function - BIND NULL VALUE FOR PARAM: ' || l_func_param_name);
16032       ELSE
16033         RAISE no_data_found_for_param_bind;
16034       END IF;
16035     END IF;
16036   END LOOP;
16037 
16038   --code_debug ('EGO_EXT_FWK_PUB.Execute_Function - CHECK POINT 1');
16039 
16040   -----------------------------------------
16041   -- Execute the Dynamic SQL using DBMS_SQL
16042   -----------------------------------------
16043   l_dummy := DBMS_SQL.EXECUTE(v_cursor);
16044   --code_debug ('EGO_EXT_FWK_PUB.Execute_Function - CHECK POINT 2, l_dummy:' || l_dummy);
16045 
16046   -----------------------------------------
16047   -- Retrieve the value of OUTPUT parameter
16048   -----------------------------------------
16049   FOR i IN l_function_param_table.FIRST .. l_function_param_table.LAST
16050   LOOP
16051     --l_function_param_table should have the same sorting seq with l_action_mapping_table by FUNC_PARAM_ID ASC
16052     IF l_function_param_table(i).FUNC_PARAM_ID <> l_action_mapping_table(i).FUNC_PARAM_ID THEN
16053       --RAISE;
16054       NULL;
16055     END IF;
16056     l_function_param_rec := l_function_param_table(i);
16057     l_func_param_name    := l_function_param_rec.INTERNAL_NAME;
16058     l_attr_name := l_action_mapping_table(i).MAPPED_ATTRIBUTE;
16059 
16060     IF l_function_param_rec.MAPPED_TO_GROUP_TYPE = 'A' THEN
16061     --Indicating Attribute Groups values.
16062       FOR j IN x_attributes_data_table.FIRST .. x_attributes_data_table.LAST
16063       LOOP
16064         IF x_attributes_data_table(j).ATTR_NAME = l_attr_name THEN
16065           --For OUTPUT, INPUT/OUTPUT, RETURN parameters
16066           IF l_function_param_table(i).PARAM_TYPE_CODE IN ('O', 'B') THEN
16067             --code_debug ('EGO_EXT_FWK_PUB.Execute_Function - CHECK POINT 3');
16068             IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
16069               DBMS_SQL.VARIABLE_VALUE(v_cursor, ''||l_func_param_name, x_attributes_data_table(j).ATTR_VALUE_STR);
16070             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
16071               DBMS_SQL.VARIABLE_VALUE(v_cursor, ''||l_func_param_name, x_attributes_data_table(j).ATTR_VALUE_NUM);
16072             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
16073               DBMS_SQL.VARIABLE_VALUE(v_cursor, ''||l_func_param_name, x_attributes_data_table(j).ATTR_VALUE_DATE);
16074             END IF;
16075           ELSIF l_function_param_table(i).PARAM_TYPE_CODE = 'R' THEN
16076             IF l_function_param_rec.DATA_TYPE_CODE = 'V' THEN
16077               DBMS_SQL.VARIABLE_VALUE(v_cursor, 'ret', x_attributes_data_table(j).ATTR_VALUE_STR);
16078             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'N' THEN
16079               DBMS_SQL.VARIABLE_VALUE(v_cursor, 'ret', x_attributes_data_table(j).ATTR_VALUE_NUM);
16080             ELSIF l_function_param_rec.DATA_TYPE_CODE = 'D' THEN
16081               DBMS_SQL.VARIABLE_VALUE(v_cursor, 'ret', x_attributes_data_table(j).ATTR_VALUE_DATE);
16082             END IF;
16083           END IF;
16084           EXIT;
16085 
16086         END IF;
16087       END LOOP;--x_attributes_data_table
16088     ELSIF l_function_param_rec.MAPPED_TO_GROUP_TYPE = 'E' THEN
16089     --Indicating "External Attributes"
16090       FOR j IN x_external_attrs_value_pairs.FIRST .. x_external_attrs_value_pairs.LAST
16091       LOOP
16092         IF x_external_attrs_value_pairs(j).NAME = l_attr_name THEN
16093           --For OUTPUT, INPUT/OUTPUT, RETURN parameters
16094           IF l_function_param_table(i).PARAM_TYPE_CODE IN ('O', 'B') THEN
16095             DBMS_SQL.VARIABLE_VALUE(v_cursor, ''||l_func_param_name, x_external_attrs_value_pairs(j).VALUE);
16096           ELSIF l_function_param_table(i).PARAM_TYPE_CODE = 'R' THEN
16097             DBMS_SQL.VARIABLE_VALUE(v_cursor, 'ret', x_external_attrs_value_pairs(j).VALUE);
16098           END IF;
16099           EXIT;
16100         END IF;
16101       END LOOP;--x_external_attrs_value_pairs
16102 
16103       --ONLY MAPPED_TO_AG_TYPE A and E can be used as OUTPUT/RESULT Param.
16104     END IF;
16105 
16106   END LOOP;--l_function_param_table
16107   DBMS_SQL.CLOSE_CURSOR(v_cursor);
16108 
16109   EXCEPTION
16110 
16111     WHEN no_action_founded_exception   THEN
16112       x_return_status := FND_API.G_RET_STS_ERROR;
16113       FND_MESSAGE.Set_Name('EGO', 'EGO_ACTION_ERROR');
16114       FND_MESSAGE.Set_Token('ACTION_NAME', nvl(l_action_name, l_action_rec.ACTION_ID));
16115       FND_MESSAGE.Set_Token('ERR_MSG', 'No such action definition founded');
16116       FND_MSG_PUB.Add;
16117       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
16118                                ,p_count   => x_msg_count
16119                                ,p_data    => x_msg_data);
16120 
16121     WHEN no_function_founded_exception THEN
16122       x_return_status := FND_API.G_RET_STS_ERROR;
16123       FND_MESSAGE.Set_Name('EGO', 'EGO_ACTION_ERROR');
16124       FND_MESSAGE.Set_Token('ACTION_NAME', l_action_name);
16125       FND_MESSAGE.Set_Token('ERR_MSG', 'No such function definition founded');
16126       FND_MSG_PUB.Add;
16127       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
16128                                ,p_count   => x_msg_count
16129                                ,p_data    => x_msg_data);
16130 
16131     WHEN func_params_mapping_exception THEN
16132       x_return_status := FND_API.G_RET_STS_ERROR;
16133       FND_MESSAGE.Set_Name('EGO', 'EGO_ACTION_ERROR');
16134       FND_MESSAGE.Set_Token('ACTION_NAME', l_action_name);
16135       FND_MESSAGE.Set_Token('ERR_MSG', 'Function parameters is not compatible with action attr mapping');
16136       FND_MSG_PUB.Add;
16137       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
16138                                ,p_count   => x_msg_count
16139                                ,p_data    => x_msg_data);
16140 
16141     WHEN bad_uda_row_info              THEN
16142       x_return_status := FND_API.G_RET_STS_ERROR;
16143       FND_MESSAGE.Set_Name('EGO', 'EGO_ACTION_ERROR');
16144       FND_MESSAGE.Set_Token('ACTION_NAME', l_action_name);
16145       FND_MESSAGE.Set_Token('ERR_MSG', 'Wrong x_attributes_row_table data, please check!');
16146       FND_MSG_PUB.Add;
16147       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
16148                                ,p_count   => x_msg_count
16149                                ,p_data    => x_msg_data);
16150 
16151     WHEN bad_uda_data_row_identifier   THEN
16152       x_return_status := FND_API.G_RET_STS_ERROR;
16153       FND_MESSAGE.Set_Name('EGO', 'EGO_ACTION_ERROR');
16154       FND_MESSAGE.Set_Token('ACTION_NAME', l_action_name);
16155       FND_MESSAGE.Set_Token('ERR_MSG', 'Incompatible x_attributes_row_table and x_attributes_data_table Row_Identifier');
16156       FND_MSG_PUB.Add;
16157       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
16158                                ,p_count   => x_msg_count
16159                                ,p_data    => x_msg_data);
16160 
16161     WHEN no_data_found_for_param_bind   THEN
16162       x_return_status := FND_API.G_RET_STS_ERROR;
16163       FND_MESSAGE.Set_Name('EGO', 'EGO_ACTION_ERROR');
16164       FND_MESSAGE.Set_Token('ACTION_NAME', l_action_name);
16165       FND_MESSAGE.Set_Token('ERR_MSG', 'Not all output/return type function params assigned');
16166       FND_MSG_PUB.Add;
16167       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
16168                                ,p_count   => x_msg_count
16169                                ,p_data    => x_msg_data);
16170 
16171     WHEN OTHERS THEN
16172       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
16173 
16174       FND_MESSAGE.Set_Name('EGO', 'EGO_PLSQL_ERR');
16175       FND_MESSAGE.Set_Token('PKG_NAME', 'EGO_EXT_FWK_PUB');
16176       FND_MESSAGE.Set_Token('API_NAME', l_api_name);
16177       FND_MESSAGE.Set_Token('SQL_ERR_MSG', SQLERRM);
16178       FND_MSG_PUB.Add;
16179       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE
16180                                ,p_count   => x_msg_count
16181                                ,p_data    => x_msg_data);
16182 
16183 END;
16184   -----------------------------------------------------------
16185     --BugFix 10103483 : API for deleting Attribute Group View--
16186   -----------------------------------------------------------
16187    PROCEDURE Delete_Attr_Group_Views(p_view_name IN VARCHAR2)
16188     IS
16189     obj_name VARCHAR2(30) ;
16190     l_drop_sql    VARCHAR2(100);
16191     CURSOR C iS
16192     SELECT object_name
16193     FROM SYS.all_objects
16194     WHERE object_name = p_view_name
16195     AND Upper(object_type)='VIEW';
16196 
16197     fnd_apps_schema      VARCHAR2(30) := NULL;
16198     h_status             VARCHAR2(2000);
16199     h_industry           VARCHAR2(2000);
16200     h_x                  BOOLEAN;
16201 
16202      BEGIN
16203        OPEN c;
16204        FETCH c INTO obj_name;
16205        IF c%FOUND THEN
16206          l_drop_sql := 'DROP VIEW '|| obj_name;
16207 
16208     --bugfix 11907422 for 12.2 AD_DDL changes
16209     --EXECUTE IMMEDIATE l_drop_sql;
16210 
16211           h_x := FND_INSTALLATION.Get_App_Info('FND', h_status, h_industry, fnd_apps_schema);
16212 --bug 12392423, hard code APPS as second parameter
16213    AD_DDL.DO_DDL(fnd_apps_schema,'APPS', AD_DDL.DROP_VIEW,l_drop_sql,obj_name);
16214          COMMIT;
16215          END IF;
16216        CLOSE c;
16217     END Delete_Attr_Group_Views;
16218 
16219 
16220 ------------------------------------------------------------------------------------------
16221 -- METHOD :METHOD TO CHECK FOR VIEW IS PRESENT OR NOT,
16222 -- IF NOT PRESENT UPDATE AGV_NAME IN EGO_FND_DSC_FLX_CTX_EXT WITH NULL
16223 -- PARAMETER :  ATTRIBUTE GROUP ID
16224 ------------------------------------------------------------------------------------------
16225 
16226 PROCEDURE Check_Attr_Group_View(p_attr_grp_id IN NUMBER)
16227     IS
16228     obj_name VARCHAR2(30) ;
16229     atg_view_name VARCHAR2(30) ;
16230     view_name VARCHAR2(30) ;
16231 
16232     CURSOR csr1 IS
16233       SELECT AGV_NAME
16234       FROM EGO_FND_DSC_FLX_CTX_EXT
16235       WHERE attr_group_id = p_attr_grp_id ;
16236 
16237     CURSOR csr2 IS
16238       SELECT object_name
16239       FROM SYS.all_objects
16240       WHERE object_name = view_name
16241       AND UPPER(object_type)='VIEW';
16242 
16243     CURSOR csr3 iS
16244        SELECT AGV_NAME
16245        FROM EGO_FND_DSC_FLX_CTX_EXT
16246        WHERE UPPER(agv_name) LIKE view_name ;
16247 
16248      BEGIN
16249        OPEN csr1;
16250        FETCH csr1 INTO view_name;
16251        OPEN csr2;
16252        FETCH csr2 INTO obj_name;
16253        OPEN csr3;
16254        FETCH csr3 INTO atg_view_name;
16255 
16256        IF (view_name IS NOT NULL) THEN
16257 
16258        IF csr2%NOTFOUND THEN
16259 
16260 
16261         IF csr3%FOUND  THEN
16262 
16263         UPDATE EGO_FND_DSC_FLX_CTX_EXT SET  AGV_NAME = NULL WHERE Upper(AGV_NAME) = atg_view_name ;
16264         COMMIT ;
16265 
16266          END IF;
16267          CLOSE csr3;
16268         END IF;
16269        CLOSE csr2;
16270        END IF;
16271        CLOSE csr1;
16272 END Check_Attr_Group_View;
16273 
16274 END EGO_EXT_FWK_PUB;