DBA Data[Home] [Help]

PACKAGE BODY: APPS.INV_ITEM_CATEGORY_PUB

Source


1 PACKAGE BODY INV_ITEM_CATEGORY_PUB AS
2 /* $Header: INVPCATB.pls 120.12.12020000.2 2012/07/09 08:11:32 asugandh ship $ */
3 
4 
5 G_PKG_NAME      CONSTANT VARCHAR2(30):= 'INV_ITEM_CATEGORY_PUB';
6 G_INVENTORY_APP_ID CONSTANT NUMBER := 401;
7 G_INVENTORY_APP_SHORT_NAME CONSTANT VARCHAR2(3) := 'INV';
8 G_CAT_FLEX_CODE CONSTANT VARCHAR2(4) := 'MCAT';
9 
10 -- Used by the Preprocess_Category_Rec procedure
11 G_INSERT CONSTANT NUMBER := 1;
12 G_UPDATE CONSTANT NUMBER := 2;
13 
14 -- ---------------------------------------------------------------------
15 -- ---------------------------------------------------------------------
16 -- For debugging purposes.
17    PROCEDURE mdebug(msg IN varchar2)
18     IS
19     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
20     BEGIN
21 --      dbms_output.put_line(msg);
22 --      FND_FILE.PUT_LINE(FND_FILE.LOG, msg);
23     null;
24 --     inv_debug(msg);
25    END mdebug;
26 
27   ----------------------------------------------------------------------------
28   -- validate_category_set_id
29   -- Bug: 3093555
30   -- Supporting method to validate category_set_id
31   ----------------------------------------------------------------------------
32   FUNCTION validate_category_set_id
33                   (p_category_set_id   IN  NUMBER
34                   ,x_hierarchy_enabled OUT NOCOPY VARCHAR2)
35     RETURN BOOLEAN IS
36     -- Start OF comments
37     -- API name    : validate_category_set_id
38     -- TYPE        : Private
39     -- Called From : Create_Valid_Category
40     -- Pre-reqs    : None
41     -- FUNCTION    : Validates whether the category_set_id passed
42     --               returns TRUE if the category_set_id is valid
43     --               returns FALSE if the category_set_id is invalid
44     --               returns the hierarchy through the out parameter
45     --
46     -- END OF comments
47   l_hierarchy_enabled  mtl_category_sets_b.hierarchy_enabled%TYPE := NULL;
48   BEGIN
49     IF p_category_set_id IS NULL THEN
50       RETURN FALSE;
51     END IF;
52     SELECT hierarchy_enabled INTO l_hierarchy_enabled
53     FROM mtl_category_sets_b
54     WHERE category_set_id = p_category_set_id;
55     IF (SQL%FOUND) THEN
56       x_hierarchy_enabled := l_hierarchy_enabled;
57     END IF;
58     RETURN TRUE;
59   EXCEPTION
60     WHEN OTHERS THEN
61       x_hierarchy_enabled := NULL;
62       RETURN FALSE;
63   END validate_category_set_id;
64 
65   ----------------------------------------------------------------------------
66   -- validate_category_id
67   -- Bug: 3093555
68   -- Supporting method to validate category_id
69   ----------------------------------------------------------------------------
70   FUNCTION validate_category_id (p_category_id       IN NUMBER
71                                 ,p_category_set_id   IN NUMBER)
72     RETURN BOOLEAN IS
73     -- Start OF comments
74     -- API name    : validate_category_id
75     -- TYPE        : Private
76     -- Called From : Create_Valid_Category, Update_valid_category
77     -- Pre-reqs    : None
78     -- FUNCTION    : Validates whether the category_id passed
79     --               returns TRUE if the category_id is valid
80     --               returns FALSE if the category_id is invalid
81     --
82     -- END OF comments
83 
84   CURSOR c_validate_category_id (cp_category_id  IN NUMBER
85                                 ,cp_cat_set_id   IN NUMBER) IS
86   SELECT cat.category_id
87   FROM   mtl_categories_b cat, mtl_category_sets_b cat_set
88   WHERE  cat_set.category_set_id = cp_cat_set_id
89     AND  cat_set.structure_id = cat.structure_id
90     AND  cat.category_id  = cp_category_id
91     AND  ((cat.enabled_flag = 'Y'
92     -- do not display today's records
93           AND  TRUNC(NVL(cat.disable_date,SYSDATE+1)) > TRUNC(SYSDATE)
94           )
95           OR NVL(g_eni_upgarde_flag,'N') = 'Y' --Added for ENI 11.5.10 Upgrade
96          )
97      ;
98 
99   l_category_id mtl_categories_b.category_id%TYPE;
100 
101   BEGIN
102     OPEN c_validate_category_id (cp_category_id => p_category_id
103                                 ,cp_cat_set_id  => p_category_set_id);
104     FETCH c_validate_category_id INTO l_category_id;
105     IF c_validate_category_id%FOUND THEN
106       CLOSE c_validate_category_id;
107       RETURN TRUE;
108     ELSE
109       CLOSE c_validate_category_id;
110       RETURN FALSE;
111     END IF;
112   EXCEPTION
113     WHEN OTHERS THEN
114       IF c_validate_category_id%ISOPEN THEN
115         CLOSE c_validate_category_id;
116       END IF;
117       RETURN FALSE;
118   END validate_category_id;
119 
120   ----------------------------------------------------------------------------
121   -- valid_category_set_record
122   -- Bug: 3093555
123   -- Supporting method to validate record in mtl_category_set_valid_cats
124   ----------------------------------------------------------------------------
125   FUNCTION valid_category_set_record (p_category_set_id  IN  NUMBER
126                                      ,p_category_id       IN NUMBER)
127     RETURN BOOLEAN IS
128     -- Start OF comments
129     -- API name    : valid_category_set_record
130     -- TYPE        : Private
131     -- Called From : Delete_Valid_Category, Update_valid_category
132     -- Pre-reqs    : None
133     -- FUNCTION    : Validates whether the record exists in
134     --                  mtl_category_set_valid_cats
135     --               returns TRUE if record exists
136     --               returns FALSE if record does not exist
137     --
138     -- END OF comments
139   l_category_id mtl_categories_b.category_id%TYPE;
140 
141   BEGIN
142     SELECT category_id
143     INTO l_category_id
144     FROM mtl_category_set_valid_cats
145     WHERE category_id = p_category_id
146       AND category_set_id = p_category_set_id;
147     IF (SQL%FOUND) THEN
148       RETURN TRUE;
149     ELSE
150       RETURN FALSE;
151     END IF;
152   EXCEPTION
153     WHEN OTHERS THEN
154       RETURN FALSE;
155   END valid_category_set_record;
156 
157   ----------------------------------------------------------------------------
158   -- get_category_set_type
159   -- Bug: 5219692
160   -- Supporting method to validate record in mtl_category_set_valid_cats
161   -- Function is similar to valid_category_set_record
162   -- Returns FALSE if the row does not exist
163   ----------------------------------------------------------------------------
164   FUNCTION get_category_set_type (p_category_set_id  IN  NUMBER
165                                  ,p_category_id      IN  NUMBER
166                                  ,x_hrchy_enabled    OUT NOCOPY VARCHAR2)
167     RETURN BOOLEAN IS
168     -- Start OF comments
169     -- FUNCTION    : Validates whether the record exists in
170     --                  mtl_category_set_valid_cats
171     --               returns TRUE if record exists
172     --               returns FALSE if record does not exist
173     --               Also populates the out variable with
174     --               value of column hierarchy_enabled
175     --
176     -- END OF comments
177   l_category_id       mtl_categories_b.category_id%TYPE;
178 
179   BEGIN
180     SELECT csv.category_id, cs.hierarchy_enabled
181     INTO l_category_id, x_hrchy_enabled
182     FROM mtl_category_set_valid_cats csv
183         ,mtl_category_sets_b         cs
184     WHERE csv.category_id     = p_category_id
185       AND csv.category_set_id = p_category_set_id
186       AND cs.category_set_id  = csv.category_set_id;
187     IF (SQL%FOUND) THEN
188       RETURN TRUE;
189     ELSE
190       RETURN FALSE;
191     END IF;
192   EXCEPTION
193     WHEN OTHERS THEN
194       RETURN FALSE;
195   END get_category_set_type;
196 
197 
198   ----------------------------------------------------------------------------
199   -- validate_parent_category_id
200   -- Bug: 3093555
201   -- Supporting method to validate parent_category_id
202   ----------------------------------------------------------------------------
203   FUNCTION validate_category_set_params
204         (p_validation_type    IN  NUMBER
205         ,p_category_set_id    IN  NUMBER
206         ,p_category_id        IN  NUMBER
207         ,p_parent_category_id IN  NUMBER
208         ,p_calling_api        IN  VARCHAR2
209         )
210     RETURN BOOLEAN IS
211     -- Start OF comments
212     -- API name    : validate_category_set_params
213     -- TYPE        : Private
214     -- Called From : Create_Valid_Category, Update_valid_category
215     -- Pre-reqs    : None
216     -- FUNCTION    : Validates whether the passed parameters are valid
217     --               returns TRUE if all the parameters are valid
218     --               returns FALSE if any of the parameters are invalid
219     --
220     -- END OF comments
221   l_api_name           VARCHAR2(30) := 'Validate Params';
222   l_count              NUMBER;
223   l_valid              BOOLEAN := TRUE;
224   l_def_category_id    mtl_category_sets_b.default_category_id%TYPE;
225   l_debug              NUMBER := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
226   l_hierarchy_enabled  mtl_category_sets_b.hierarchy_enabled%TYPE := NULL;
227   l_loop_may_occur     BOOLEAN := FALSE;
228   l_category_id        mtl_categories_b.category_id%TYPE;
229 
230   CURSOR c_check_loops (cp_parent_category_id IN NUMBER
231                        ,cp_category_set_id    IN NUMBER) IS
232   SELECT category_id
233   FROM  mtl_category_set_valid_cats
234   WHERE category_set_id = cp_category_set_id
235   CONNECT BY prior category_id = parent_category_id
236   START WITH parent_category_id = cp_parent_category_id;
237 
238   CURSOR c_get_default_category_id (cp_category_set_id  IN  NUMBER
239                                    ,cp_category_id      IN  NUMBER) IS
240   SELECT default_category_id
241   FROM  mtl_category_sets_b cat_sets
242   WHERE cat_sets.category_set_id = cp_category_set_id
243     AND cat_sets.default_category_id = cp_category_id;
244 
245   CURSOR c_check_item_assocs  (cp_category_set_id  IN  NUMBER
246                               ,cp_category_id      IN  NUMBER) IS
247   SELECT category_id
248   FROM mtl_item_categories
249   WHERE category_id = cp_category_id
250     AND category_set_id = cp_category_set_id
251     AND rownum = 1;
252 
253   BEGIN
254     IF l_debug = 1 THEN
255       mdebug('Validate Params: Tracing...1 ');
256     END IF;
257     --
258     -- all params must be present
259     --
260     IF (p_category_set_id  IS NULL OR  p_category_id IS NULL) THEN
261       IF l_debug = 1 THEN
262         mdebug('Validate Params: Missing reqd parameter');
263       END IF;
264       l_valid := FALSE;
265       fnd_message.set_name('INV','INV_MISSING_REQUIRED_PARAMETER');
266       fnd_msg_pub.ADD;
267       RAISE fnd_api.g_EXC_ERROR;
268     END IF;
269     IF l_debug = 1 THEN
270       mdebug('Validate Params: Required params passed. ');
271     END IF;
272     --
273     -- the category_id and parent category id must not be same
274     --
275     IF (p_category_id = p_parent_category_id) THEN
276       l_valid := FALSE;
277       IF l_debug = 1 THEN
278         mdebug('Validate Params: Same Parent and Category Set Id');
279       END IF;
280       fnd_message.set_name('INV','INV_SAME_CATEGORY_SETS');
281       fnd_msg_pub.ADD;
282       RAISE fnd_api.g_EXC_ERROR;
283     END IF;
284     IF l_debug = 1 THEN
285       mdebug('Validate Params: Parent and Child category ids are diff');
286     END IF;
287     IF p_validation_type = G_INSERT THEN
288       IF l_debug = 1 THEN
289         mdebug('Validate Params: check for Insert ');
290       END IF;
291       --
292       -- check whether the category_id is valid
293       --
294       IF NOT validate_category_id
295                  (p_category_id => p_category_id
296                  ,p_category_set_id => p_category_set_id) THEN
297         l_valid := FALSE;
298         IF l_debug = 1 THEN
299           mdebug('Validate Params: Invalid Category Id');
300         END IF;
301         fnd_message.set_name('INV','INV_INVALID_PARAMETER');
302         fnd_message.set_token('PARAM_NAME', 'CATEGORY_ID');
303         fnd_message.set_token('PROGRAM_NAME', G_PKG_NAME||'.'||p_calling_api);
304         fnd_msg_pub.ADD;
305         RAISE fnd_api.g_EXC_ERROR;
306       END IF;
307       IF l_debug = 1 THEN
308         mdebug('Validate Params: Category Id is valid for insert');
309       END IF;
310     ELSIF p_validation_type = G_UPDATE THEN
311       IF l_debug = 1 THEN
312         mdebug('Validate Params: check for Update ');
313       END IF;
314       --
315       -- The record must exist in mtl_category_set_valid_cats
316       --
317       IF NOT valid_category_set_record (p_category_set_id => p_category_set_id
318                                        ,p_category_id     => p_category_id) THEN
319 
320         l_valid := FALSE;
321         IF l_debug = 1 THEN
322           mdebug('Validate Params: Record not available for update');
323         END IF;
324         fnd_message.set_name('INV','INV_CATEGORY_UNAVAIL_UPDATE');
325         fnd_msg_pub.ADD;
326         RAISE fnd_api.g_EXC_ERROR;
327       END IF;
328       IF l_debug = 1 THEN
329         mdebug('Validate Params: Record exists in mtl_category_set_valid_cats ');
330       END IF;
331       --
332       -- The new parent category should not create any hierarchical loops
333       -- to be validated for Update only
334       -- the new parent, should not be amongst the
335       -- children of the current category id
336       l_loop_may_occur := FALSE;
337       FOR cr in c_check_loops
338                 (cp_parent_category_id => p_category_id
339                 ,cp_category_set_id    => p_category_set_id) LOOP
340         IF cr.category_id = p_parent_category_id THEN
341           l_loop_may_occur := TRUE;
342           EXIT;
343         END IF;
344       END LOOP;
345       IF l_loop_may_occur THEN
346         l_valid := FALSE;
347         IF l_debug = 1 THEN
348           mdebug('Validate Params: You might create loops!! ');
349         END IF;
350         fnd_message.set_name('INV','INV_CATEGORY_LOOPS_ERR');
351         fnd_msg_pub.ADD;
352         RAISE fnd_api.g_EXC_ERROR;
353       END IF;
354       IF l_debug = 1 THEN
355         mdebug('Validate Params: No loops after updation ');
356       END IF;
357     END IF;
358     --
359     -- check whether the passed category set id is valid
360     --
361     IF validate_category_set_id
362                    (p_category_set_id   => p_category_set_id
363                    ,x_hierarchy_enabled => l_hierarchy_enabled) THEN
364       -- category_set_id is valid, check for hierarchy enabled
365       IF (NVL(l_hierarchy_enabled, 'N') = 'Y') THEN
366         -- category is hierarchy enabled.
367         IF p_parent_category_id IS NULL THEN
368           -- not mandatory to pass.
369           l_valid := TRUE;
370           IF l_debug = 1 THEN
371             mdebug('Validate Params: User wishes to create a leaf node ');
372           END IF;
373 --          fnd_message.set_name('INV','INV_MISSING_PARENT_CAT');
374 --          fnd_msg_pub.ADD;
375 --          RAISE fnd_api.g_EXC_ERROR;
376         ELSE
377           --
378           -- check whether the parent category id is valid
379           --
380           IF NOT validate_category_id
381                  (p_category_id => p_parent_category_id
382                  ,p_category_set_id => p_category_set_id) THEN
383             l_valid := FALSE;
384             IF l_debug = 1 THEN
385               mdebug('Validate Params: Invalid Parent Category Id');
386             END IF;
387             fnd_message.set_name('INV','INV_INVALID_PARAMETER');
388             fnd_message.set_token('PARAM_NAME', 'PARENT_CATEGORY_ID');
389             fnd_message.set_token('PROGRAM_NAME',
390                                    G_PKG_NAME||'.'||p_calling_api);
391             fnd_msg_pub.ADD;
392             RAISE fnd_api.g_EXC_ERROR;
393           END IF;
394           IF l_debug = 1 THEN
395             mdebug('Validate Params: Parent category id is valid in mtl_categories_b ');
396           END IF;
397           --
398           -- the parent category cannot be the default category
399           --
400           OPEN c_get_default_category_id (cp_category_set_id => p_category_set_id
401                                          ,cp_category_id => p_parent_category_id);
402           FETCH c_get_default_category_id INTO l_def_category_id;
403           IF c_get_default_category_id%NOTFOUND THEN
404             l_def_category_id := NULL;
405           END IF;
406           CLOSE c_get_default_category_id;
407           IF l_def_category_id IS NULL THEN
408             IF l_debug = 1 THEN
409               mdebug('Validate Params: Parent category id is NOT default cat ');
410             END IF;
411             -- the parent category id is not the default category
412             -- check for any items associations to the prospective parent category id
413             OPEN c_check_item_assocs (cp_category_set_id  => p_category_set_id
414                                      ,cp_category_id      => p_parent_category_id);
415             FETCH c_check_item_assocs INTO l_category_id;
416             IF c_check_item_assocs%NOTFOUND THEN
417               l_category_id := NULL;
418             END IF;
419             CLOSE c_check_item_assocs;
420             IF l_category_id IS NULL THEN
421               -- no items associated
422               -- perfect to be associated as parent category
423               IF l_debug = 1 THEN
424                 mdebug('Validate Params: Parent category id is valid ');
425               END IF;
426               l_valid := TRUE;
427             ELSE
428               -- child node (items associated). we cannot make this parent
429               l_valid := FALSE;
430               IF l_debug = 1 THEN
431                 mdebug('Validate Params: Items attached, cannot be parent ');
432               END IF;
433               fnd_message.set_name('INV','INV_INVALID_PARAMETER');
434               fnd_message.set_token('PARAM_NAME', 'PARENT_CATEGORY_ID');
435               fnd_message.set_token('PROGRAM_NAME',
436                       G_PKG_NAME||'.'||p_calling_api);
437               fnd_msg_pub.ADD;
438             END IF; -- l_count = 0
439           ELSE
440             -- the passed parent is the default category id
441             l_valid := FALSE;
442             IF l_debug = 1 THEN
443               mdebug('Validate Params: Cannot take parent as default category id ');
444             END IF;
445             fnd_message.set_name('INV','INV_DEFAULT_CATEGORY_ADD_ERR');
446             fnd_msg_pub.ADD;
447           END IF; -- l_coount = 0
448         END IF; -- p_parent_category_id IS NULL
449       ELSE
450         -- category hierarchy is disabled
451         IF p_parent_category_id IS NOT NULL THEN
452           -- parent category_id should not be passed
453           l_valid := FALSE;
454           IF l_debug = 1 THEN
455             mdebug('Validate Params: Do not pass Parent Category Id ');
456           END IF;
457           fnd_message.set_name('INV','INV_UNWANTED_PARENT_CAT');
458           fnd_msg_pub.ADD;
459         ELSE
460           -- parent category_id should be NULL
461           IF l_debug = 1 THEN
462             mdebug('Validate Params: Parent category id is null for hierarchy disabled ');
463           END IF;
464           l_valid := TRUE;
465         END IF;
466       END IF; -- hierarchy enabled.
467     ELSE
468       l_valid := FALSE;
469       IF l_debug = 1 THEN
470         mdebug('Validate Params: Invalid Category Set Id');
471       END IF;
472       fnd_message.set_name('INV','INV_INVALID_PARAMETER');
473       fnd_message.set_token('PARAM_NAME', 'CATEGORY_SET_ID');
474       fnd_message.set_token('PROGRAM_NAME', G_PKG_NAME||'.'||p_calling_api);
475       fnd_msg_pub.ADD;
476     END IF;
477     IF l_debug = 1 THEN
478       mdebug('Validate Params: Returning without exceptions');
479     END IF;
480     RETURN  l_valid;
481   EXCEPTION
482     WHEN OTHERS THEN
483       IF c_check_loops%ISOPEN THEN
484         CLOSE c_check_loops;
485       END IF;
486       IF c_get_default_category_id%ISOPEN THEN
487         CLOSE c_get_default_category_id;
488       END IF;
489       IF c_check_item_assocs%ISOPEN THEN
490         CLOSE c_check_item_assocs;
491       END IF;
492       IF l_debug = 1 THEN
493         mdebug('Validate Params: Exception Raised');
494       END IF;
495       RETURN FALSE;
496   END validate_category_set_params;
497 
498    -- Environment setting.
499    -- Call this procedure internally to Test the proper updation of
500    -- Created_By, Last_Updated_By, Last_Update_Login etc., columns
501 /*
502    PROCEDURE Apps_Initialize
503     IS
504     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
505     BEGIN
506         -- To set the APPS Environment context through PL/SQL.
507        fnd_global.apps_initialize(1068, 20634, 401);
508        IF (l_debug = 1) THEN
509           mdebug('User ID :'||to_char(FND_GLOBAL.user_id));
510           mdebug('User NAME :'||FND_GLOBAL.user_name);
511           mdebug('Login ID :'||to_char(FND_GLOBAL.login_id));
512           mdebug('Prog Appl ID :'||to_char(FND_GLOBAL.prog_appl_id));
513           mdebug('Application Name :'||FND_GLOBAL.application_name);
514           mdebug('Language :'||FND_GLOBAL.current_language);
515           mdebug('And many more...');
516        END IF;
517    END Apps_Initialize;
518      */
519 
520 
521    FUNCTION  To_Boolchar
522       (
523          p_bool        IN   BOOLEAN
524       )
525       RETURN  VARCHAR2
526       IS
527         l_api_name  CONSTANT  VARCHAR2(30)  :=  'To_Boolchar' ;
528     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
529       BEGIN
530 
531         IF ( p_bool = TRUE ) THEN
532            RETURN fnd_api.g_TRUE ;
533         ELSIF ( p_bool = FALSE ) THEN
534            RETURN fnd_api.g_FALSE ;
535         ELSE
536            NULL;
537         END IF;
538 
539    END To_Boolchar;
540 
541 
542   --  To check for invalid values in the record according to the operation is
543   --  INSERT or UPDATE, and report Errors appropriately.
544   --  Preprocess_Category_Rec
545   ----------------------------------------------------------------------------
546   PROCEDURE Preprocess_Category_Rec
547   (
548     p_operation        IN   NUMBER,
549     p_category_rec     IN   INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE,
550     x_category_rec     OUT  NOCOPY INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE
551 
552    ) IS
553 
554   l_category_rec INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE;
555   l_flexstr_exists   VARCHAR2(1);
556 
557   CURSOR get_structure_id(p_structure_code VARCHAR) IS
558         SELECT id_flex_num
559         FROM fnd_id_flex_structures
560         WHERE application_id = G_INVENTORY_APP_ID
561         AND id_flex_code = G_CAT_FLEX_CODE
562         AND id_flex_structure_code = p_structure_code
563         AND enabled_flag = 'Y';
564 
565   CURSOR get_category_structure_id(p_category_id NUMBER) IS
566         SELECT structure_id
567         FROM mtl_categories_b
568         WHERE category_id = p_category_id;
569 
570   CURSOR validate_structure_id(p_structure_id VARCHAR) IS
571         SELECT 'x'
572         FROM fnd_id_flex_structures
573         WHERE application_id = G_INVENTORY_APP_ID
574         AND id_flex_code = G_CAT_FLEX_CODE
575         AND id_flex_num = p_structure_id
576         AND enabled_flag = 'Y';
577 
578   CURSOR category_rec_cursor(p_category_id NUMBER) IS
579     SELECT
580         --category_id,
581         --structure_id,
582         description,
583         attribute_category,
584         summary_flag,
585         enabled_flag,
586         start_date_active,
587         end_date_active,
588         disable_date,
589         web_status,--Bug: 2430879
590         supplier_enabled_flag,--Bug: 2645153
591         segment1,
592         segment2,
593         segment3,
594         segment4,
595         segment5,
596         segment6,
597         segment7,
598         segment8,
599         segment9,
600         segment10,
601         segment11,
602         segment12,
603         segment13,
604         segment14,
605         segment15,
606         segment16,
607         segment17,
608         segment18,
609         segment19,
610         segment20,
611         attribute1,
612         attribute2,
613         attribute3,
614         attribute4,
615         attribute5,
616         attribute6,
617         attribute7,
618         attribute8,
619         attribute9,
620         attribute10,
621         attribute11,
622         attribute12,
623         attribute13,
624         attribute14,
625         attribute15
626         --last_update_date,
627         --last_updated_by,
628         --creation_date,
629         --created_by,
630         --last_update_login
631         FROM mtl_categories_vl
632         WHERE category_id = p_category_id;
633 
634     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
635     l_product_str_id  NUMBER;  -- Bug 5474569
636   BEGIN
637         x_category_rec.category_id       := p_category_rec.category_id;
638         x_category_rec.structure_id      := p_category_rec.structure_id;
639         x_category_rec.structure_code    := p_category_rec.structure_code;
640         x_category_rec.attribute_category:= p_category_rec.attribute_category;
641         x_category_rec.description       := p_category_rec.description;
642         x_category_rec.summary_flag      := p_category_rec.summary_flag;
643         x_category_rec.enabled_flag      := p_category_rec.enabled_flag;
644         x_category_rec.start_date_active := p_category_rec.start_date_active;
645         x_category_rec.end_date_active   := p_category_rec.end_date_active;
646         x_category_rec.disable_date      := p_category_rec.disable_date;
647         x_category_rec.web_status        := p_category_rec.web_status;  --Bug: 2430879
648         x_category_rec.supplier_enabled_flag := p_category_rec.supplier_enabled_flag;  --Bug: 2645153
649 
650         x_category_rec.segment1  := p_category_rec.segment1 ;
651         x_category_rec.segment2  := p_category_rec.segment2 ;
652         x_category_rec.segment3  := p_category_rec.segment3 ;
653         x_category_rec.segment4  := p_category_rec.segment4 ;
654         x_category_rec.segment5  := p_category_rec.segment5 ;
655         x_category_rec.segment6  := p_category_rec.segment6 ;
656         x_category_rec.segment7  := p_category_rec.segment7 ;
657         x_category_rec.segment8  := p_category_rec.segment8 ;
658         x_category_rec.segment9  := p_category_rec.segment9 ;
659         x_category_rec.segment10 := p_category_rec.segment10;
660         x_category_rec.segment11 := p_category_rec.segment11;
661         x_category_rec.segment12 := p_category_rec.segment12;
662         x_category_rec.segment13 := p_category_rec.segment13;
663         x_category_rec.segment14 := p_category_rec.segment14;
664         x_category_rec.segment15 := p_category_rec.segment15;
665         x_category_rec.segment16 := p_category_rec.segment16;
666         x_category_rec.segment17 := p_category_rec.segment17;
667         x_category_rec.segment18 := p_category_rec.segment18;
668         x_category_rec.segment19 := p_category_rec.segment19;
669         x_category_rec.segment20 := p_category_rec.segment20;
670 
671         x_category_rec.attribute1  := p_category_rec.attribute1 ;
672         x_category_rec.attribute2  := p_category_rec.attribute2 ;
673         x_category_rec.attribute3  := p_category_rec.attribute3 ;
674         x_category_rec.attribute4  := p_category_rec.attribute4 ;
675         x_category_rec.attribute5  := p_category_rec.attribute5 ;
676         x_category_rec.attribute6  := p_category_rec.attribute6 ;
677         x_category_rec.attribute7  := p_category_rec.attribute7 ;
678         x_category_rec.attribute8  := p_category_rec.attribute8 ;
679         x_category_rec.attribute9  := p_category_rec.attribute9 ;
680         x_category_rec.attribute10 := p_category_rec.attribute10;
681         x_category_rec.attribute11 := p_category_rec.attribute11;
682         x_category_rec.attribute12 := p_category_rec.attribute12;
683         x_category_rec.attribute13 := p_category_rec.attribute13;
684         x_category_rec.attribute14 := p_category_rec.attribute14;
685         x_category_rec.attribute15 := p_category_rec.attribute15;
686 
687        /* Bug 5474569 Start Get structure_id of PRODUCT_CATEGORIES*/
688         OPEN get_structure_id('PRODUCT_CATEGORIES');
689         FETCH get_structure_id INTO l_product_str_id;
690 
691         IF (get_structure_id%NOTFOUND) THEN
692              fnd_message.set_name('INV','FLEX-NO MAIN KEY FLEX DEF');
693              fnd_message.set_token('ROUTINE', 'Preprocess_Category_Rec');
694              fnd_msg_pub.ADD;
695              IF (l_debug = 1) THEN
696    		mdebug('ERR: No Product Categories structure');
697 		END IF;
698                 CLOSE  get_structure_id;
699                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
700 	     END IF;
701         CLOSE  get_structure_id;
702         /* Bug 5474569 End  */
703 
704         IF (p_operation = G_INSERT) THEN
705 
706 /* The following code is not needed.
707            IF  (x_category_rec.category_id = g_MISS_NUM OR
708                x_category_rec.category_id IS NOT NULL) THEN
709                  x_category_rec.category_id := NULL;
710                  IF (l_debug = 1) THEN
711                  mdebug('Ignoring the Category Id value for Insert');
712                  END IF;
713            END IF;
714 */
715            IF x_category_rec.description = g_MISS_CHAR THEN
716               x_category_rec.description := NULL;
717            END IF;
718 
719            IF (x_category_rec.structure_id = g_MISS_NUM OR
720                x_category_rec.structure_id IS NULL) AND
721               ( x_category_rec.structure_code = g_MISS_CHAR OR
722                x_category_rec.structure_code IS NULL) THEN
723                 fnd_message.set_name('INV','INV_FLEX_STRUCTURE_REQ');
724                 fnd_msg_pub.ADD;
725                 IF (l_debug = 1) THEN
726                 mdebug('Flex Structure Information needed');
727                 END IF;
728                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
729            END IF;
730 
731            IF (x_category_rec.structure_id = g_MISS_NUM OR
732                x_category_rec.structure_id IS NULL) AND
733               (x_category_rec.structure_code <> g_MISS_CHAR AND
734                 x_category_rec.structure_code IS NOT NULL) THEN
735              OPEN get_structure_id(x_category_rec.structure_code);
736              FETCH get_structure_id INTO x_category_rec.structure_id;
737                 IF (l_debug = 1) THEN
738                 mdebug('Flex Structure: '||To_char(x_category_rec.structure_id));
739                 END IF;
740 
741              IF (get_structure_id%NOTFOUND) THEN
742                 fnd_message.set_name('INV','FLEX-NO MAIN KEY FLEX DEF');
743                 fnd_message.set_token('ROUTINE', 'Preprocess_Category_Rec');
744                 fnd_msg_pub.ADD;
745                 IF (l_debug = 1) THEN
746                 mdebug('ERR: Invalid Flex Structure information provided');
747                 END IF;
748                 CLOSE  get_structure_id;
749                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
750              END IF;
751              CLOSE  get_structure_id;
752            END IF;
753 
754            IF (x_category_rec.structure_id <> g_MISS_NUM AND
755                x_category_rec.structure_id IS NOT NULL) THEN
756              OPEN validate_structure_id(x_category_rec.structure_id);
757              FETCH validate_structure_id INTO l_flexstr_exists;
758              IF (validate_structure_id%NOTFOUND) THEN
759                 fnd_message.set_name('INV','FLEX-NO MAIN KEY FLEX DEF');
760                 fnd_message.set_token('ROUTINE', 'Preprocess_Category_Rec');
761                 fnd_msg_pub.ADD;
762                 IF (l_debug = 1) THEN
763                 mdebug('Invalid Flex Structure information provided');
764                 END IF;
765                 CLOSE  validate_structure_id;
766                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
767              END IF;
768              CLOSE  validate_structure_id;
769            END IF;
770 --Bug: 2645153
771            Validate_iProcurements_flags(x_category_rec);
772 
773            /* Bug 5474569 Start */
774 	     if (l_product_str_id <> x_category_rec.structure_id and
775 	         nvl(x_category_rec.summary_flag, 'N' ) = 'Y' ) then
776                   fnd_message.set_name('INV','INV_CAT_SUM_FLAG_ERR');
777                   fnd_msg_pub.ADD;
778 		  RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
779 	     end if;
780            /* Bug 5474569 End */
781 
782            IF x_category_rec.attribute_category = g_MISS_CHAR THEN
783               x_category_rec.attribute_category := NULL;
784            END IF;
785 
786            IF x_category_rec.summary_flag = g_MISS_CHAR THEN
787               x_category_rec.summary_flag := g_NO;
788            END IF;
789 
790            IF x_category_rec.enabled_flag = g_MISS_CHAR THEN
791               x_category_rec.enabled_flag := g_YES;
792            END IF;
793 
794            IF x_category_rec.start_date_active = g_MISS_DATE THEN
795               x_category_rec.start_date_active := NULL;
796            END IF;
797 
798            IF x_category_rec.end_date_active = g_MISS_DATE THEN
799               x_category_rec.end_date_active := NULL;
800            END IF;
801 
802            IF x_category_rec.disable_date = g_MISS_DATE THEN
803               x_category_rec.disable_date := NULL;
804            END IF;
805 --Bug: 2430879 added if condition
806 /**
807            IF x_category_rec.web_status = g_MISS_CHAR THEN
808               x_category_rec.web_status := g_NO;
809            END IF;
810 **/
811 
812            IF x_category_rec.segment1 = g_MISS_CHAR THEN
813               x_category_rec.segment1 := NULL;
814            END IF;
815 
816            IF x_category_rec.segment2 = g_MISS_CHAR THEN
817               x_category_rec.segment2 := NULL;
818            END IF;
819 
820            IF x_category_rec.segment3 = g_MISS_CHAR THEN
821               x_category_rec.segment3 := NULL;
822            END IF;
823 
824            IF x_category_rec.segment4 = g_MISS_CHAR THEN
825               x_category_rec.segment4 := NULL;
826            END IF;
827 
828            IF x_category_rec.segment5 = g_MISS_CHAR THEN
829               x_category_rec.segment5 := NULL;
830            END IF;
831 
832            IF x_category_rec.segment6 = g_MISS_CHAR THEN
833               x_category_rec.segment6 := NULL;
834            END IF;
835 
836            IF x_category_rec.segment7 = g_MISS_CHAR THEN
837               x_category_rec.segment7 := NULL;
838            END IF;
839 
840            IF x_category_rec.segment8 = g_MISS_CHAR THEN
841               x_category_rec.segment8 := NULL;
842            END IF;
843 
844            IF x_category_rec.segment9 = g_MISS_CHAR THEN
845               x_category_rec.segment9 := NULL;
846            END IF;
847 
848            IF x_category_rec.segment10 = g_MISS_CHAR THEN
849               x_category_rec.segment10 := NULL;
850            END IF;
851 
852            IF x_category_rec.segment11 = g_MISS_CHAR THEN
853               x_category_rec.segment11 := NULL;
854            END IF;
855 
856            IF x_category_rec.segment12 = g_MISS_CHAR THEN
857               x_category_rec.segment12 := NULL;
858            END IF;
859 
860            IF x_category_rec.segment13 = g_MISS_CHAR THEN
861               x_category_rec.segment13 := NULL;
862            END IF;
863 
864            IF x_category_rec.segment14 = g_MISS_CHAR THEN
865               x_category_rec.segment14 := NULL;
866            END IF;
867 
868            IF x_category_rec.segment15 = g_MISS_CHAR THEN
869               x_category_rec.segment15 := NULL;
870            END IF;
871 
872            IF x_category_rec.segment16 = g_MISS_CHAR THEN
873               x_category_rec.segment16 := NULL;
874            END IF;
875 
876            IF x_category_rec.segment17 = g_MISS_CHAR THEN
877               x_category_rec.segment17 := NULL;
878            END IF;
879 
880            IF x_category_rec.segment18 = g_MISS_CHAR THEN
881               x_category_rec.segment18 := NULL;
882            END IF;
883 
884            IF x_category_rec.segment19 = g_MISS_CHAR THEN
885               x_category_rec.segment19 := NULL;
886            END IF;
887 
888            IF x_category_rec.segment20 = g_MISS_CHAR THEN
889               x_category_rec.segment20 := NULL;
890            END IF;
891 
892            IF x_category_rec.attribute1 = g_MISS_CHAR THEN
893               x_category_rec.attribute1 := NULL;
894            END IF;
895 
896            IF x_category_rec.attribute2 = g_MISS_CHAR THEN
897               x_category_rec.attribute2 := NULL;
898            END IF;
899 
900            IF x_category_rec.attribute3 = g_MISS_CHAR THEN
901               x_category_rec.attribute3 := NULL;
902            END IF;
903 
904            IF x_category_rec.attribute4 = g_MISS_CHAR THEN
905               x_category_rec.attribute4 := NULL;
906            END IF;
907 
908            IF x_category_rec.attribute5 = g_MISS_CHAR THEN
909               x_category_rec.attribute5 := NULL;
910            END IF;
911 
912            IF x_category_rec.attribute6 = g_MISS_CHAR THEN
913               x_category_rec.attribute6 := NULL;
914            END IF;
915 
916            IF x_category_rec.attribute7 = g_MISS_CHAR THEN
917               x_category_rec.attribute7 := NULL;
918            END IF;
919 
920            IF x_category_rec.attribute8 = g_MISS_CHAR THEN
921               x_category_rec.attribute8 := NULL;
922            END IF;
923 
924            IF x_category_rec.attribute9 = g_MISS_CHAR THEN
925               x_category_rec.attribute9 := NULL;
926            END IF;
927 
928            IF x_category_rec.attribute10 = g_MISS_CHAR THEN
929               x_category_rec.attribute10 := NULL;
930            END IF;
931 
932            IF x_category_rec.attribute11 = g_MISS_CHAR THEN
933               x_category_rec.attribute11 := NULL;
934            END IF;
935 
936            IF x_category_rec.attribute12 = g_MISS_CHAR THEN
937               x_category_rec.attribute12 := NULL;
938            END IF;
939 
940            IF x_category_rec.attribute13 = g_MISS_CHAR THEN
941               x_category_rec.attribute13 := NULL;
942            END IF;
943 
944            IF x_category_rec.attribute14 = g_MISS_CHAR THEN
945               x_category_rec.attribute14 := NULL;
946            END IF;
947 
948            IF x_category_rec.attribute15 = g_MISS_CHAR THEN
949               x_category_rec.attribute15 := NULL;
950            END IF;
951 
952         END IF;  --IF (p_operation = G_INSERT) THEN
953 
954         -- Update operation.
955         IF (p_operation = G_UPDATE) THEN
956 
957            IF (x_category_rec.category_id = g_MISS_NUM OR
958                x_category_rec.category_id IS NULL) THEN
959                  fnd_message.set_name('INV','INV_NO_CATEGORY');
960                  fnd_msg_pub.ADD;
961                  IF (l_debug = 1) THEN
962                  mdebug('Category Id needed for Update');
963                  END IF;
964                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
965            END IF;
966 
967            IF (x_category_rec.structure_id = g_MISS_NUM OR
968                x_category_rec.structure_id IS NULL) AND
969               ( x_category_rec.structure_code = g_MISS_CHAR OR
970                x_category_rec.structure_code IS NULL) THEN
971              OPEN get_category_structure_id(x_category_rec.category_id);
972              FETCH get_category_structure_id INTO x_category_rec.structure_id;
973              IF (get_category_structure_id%NOTFOUND) THEN
974                 fnd_message.set_name('INV','FLEX-NO MAIN KEY FLEX DEF');
975                 fnd_message.set_token('ROUTINE', 'Preprocess_Category_Rec');
976                 fnd_msg_pub.ADD;
977                 IF (l_debug = 1) THEN
978                 mdebug('Invalid Flex Structure information provided');
979                 END IF;
980                 CLOSE  get_category_structure_id;
981                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
982              END IF;
983              CLOSE  get_category_structure_id;
984 /*
985                 fnd_message.set_name('INV','INV_FLEX_STRUCTURE_REQ');
986                 fnd_msg_pub.ADD;
987                 IF (l_debug = 1) THEN
988                 mdebug('Flex Structure Information needed');
989                 END IF;
990                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
991 */
992            END IF;
993 
994            IF (x_category_rec.structure_id = g_MISS_NUM OR
995                x_category_rec.structure_id IS NULL) AND
996               (x_category_rec.structure_code <> g_MISS_CHAR OR
997                 x_category_rec.structure_code IS NOT NULL) THEN
998              OPEN get_structure_id(x_category_rec.structure_code);
999              FETCH get_structure_id INTO x_category_rec.structure_id;
1000              IF (get_structure_id%NOTFOUND) THEN
1001                 fnd_message.set_name('INV','FLEX-NO MAIN KEY FLEX DEF');
1002                 fnd_message.set_token('ROUTINE', 'Preprocess_Category_Rec');
1003                 fnd_msg_pub.ADD;
1004                 IF (l_debug = 1) THEN
1005                 mdebug('Invalid Flex Structure information provided');
1006                 END IF;
1007                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
1008              END IF;
1009              CLOSE  get_structure_id;
1010            END IF;
1011 
1012 --Bug: 2645153
1013            Validate_iProcurements_flags(x_category_rec);
1014 
1015            /* Bug 5474569 Start */
1016 	     if (l_product_str_id <> x_category_rec.structure_id and
1017 	         nvl(x_category_rec.summary_flag, 'N' ) = 'Y' ) then
1018                   fnd_message.set_name('INV','INV_CAT_SUM_FLAG_ERR');
1019                   fnd_msg_pub.ADD;
1020                   RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
1021 	     end if;
1022            /* Bug 5474569 End */
1023 
1024            /* Before further processing we get the info. from Database */
1025              OPEN category_rec_cursor(x_category_rec.category_id);
1026              FETCH category_rec_cursor INTO
1027                 l_category_rec.description,
1028                 l_category_rec.attribute_category,
1029                 l_category_rec.summary_flag,
1030                 l_category_rec.enabled_flag,
1031                 l_category_rec.start_date_active,
1032                 l_category_rec.end_date_active,
1033                 l_category_rec.disable_date,
1034                 l_category_rec.web_status,--Bug: 2430879 5134913
1035                 l_category_rec.supplier_enabled_flag,--Bug: 2645153 5134913
1036                 l_category_rec.segment1,
1037                 l_category_rec.segment2,
1038                 l_category_rec.segment3,
1039                 l_category_rec.segment4,
1040                 l_category_rec.segment5,
1041                 l_category_rec.segment6,
1042                 l_category_rec.segment7,
1043                 l_category_rec.segment8,
1044                 l_category_rec.segment9,
1045                 l_category_rec.segment10,
1046                 l_category_rec.segment11,
1047                 l_category_rec.segment12,
1048                 l_category_rec.segment13,
1049                 l_category_rec.segment14,
1050                 l_category_rec.segment15,
1051                 l_category_rec.segment16,
1052                 l_category_rec.segment17,
1053                 l_category_rec.segment18,
1054                 l_category_rec.segment19,
1055                 l_category_rec.segment20,
1056                 l_category_rec.attribute1,
1057                 l_category_rec.attribute2,
1058                 l_category_rec.attribute3,
1059                 l_category_rec.attribute4,
1060                 l_category_rec.attribute5,
1061                 l_category_rec.attribute6,
1062                 l_category_rec.attribute7,
1063                 l_category_rec.attribute8,
1064                 l_category_rec.attribute9,
1065                 l_category_rec.attribute10,
1066                 l_category_rec.attribute11,
1067                 l_category_rec.attribute12,
1068                 l_category_rec.attribute13,
1069                 l_category_rec.attribute14,
1070                 l_category_rec.attribute15;
1071 
1072              IF (category_rec_cursor%NOTFOUND) THEN
1073                 fnd_message.set_name('INV','INV_VALID_CAT');
1074                 fnd_msg_pub.ADD;
1075                 IF (l_debug = 1) THEN
1076                 mdebug('Invalid Category Id provided');
1077                 END IF;
1078                 CLOSE category_rec_cursor;
1079                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
1080              END IF;
1081              CLOSE category_rec_cursor;
1082 
1083            IF x_category_rec.description = g_MISS_CHAR THEN
1084               x_category_rec.description := l_category_rec.description;
1085            END IF;
1086 
1087            IF x_category_rec.attribute_category = g_MISS_CHAR THEN
1088               x_category_rec.attribute_category := l_category_rec.attribute_category;
1089            END IF;
1090 
1091            IF x_category_rec.summary_flag = g_MISS_CHAR THEN
1092               x_category_rec.summary_flag := l_category_rec.summary_flag;
1093            END IF;
1094 
1095            IF x_category_rec.enabled_flag = g_MISS_CHAR THEN
1096               x_category_rec.enabled_flag := l_category_rec.enabled_flag;
1097            END IF;
1098 
1099            IF x_category_rec.start_date_active = g_MISS_DATE THEN
1100               x_category_rec.start_date_active := l_category_rec.start_date_active;
1101            END IF;
1102 
1103            IF x_category_rec.end_date_active = g_MISS_DATE THEN
1104               x_category_rec.end_date_active := l_category_rec.end_date_active;
1105            END IF;
1106 
1107            IF x_category_rec.disable_date = g_MISS_DATE THEN
1108               x_category_rec.disable_date := l_category_rec.disable_date;
1109            END IF;
1110 /*Bug: 4494727 Commenting out the following IF condition
1111 --Bug: 2430879 Added If condition
1112            IF x_category_rec.web_status = g_MISS_CHAR THEN
1113               x_category_rec.web_status := l_category_rec.web_status;
1114            END IF;
1115 --Bug: 2645153 Added If condition
1116 */
1117            IF x_category_rec.supplier_enabled_flag = g_MISS_CHAR THEN
1118               x_category_rec.supplier_enabled_flag := l_category_rec.supplier_enabled_flag;
1119            END IF;
1120 
1121            IF x_category_rec.segment1 = g_MISS_CHAR THEN
1122               x_category_rec.segment1 := l_category_rec.segment1;
1123            END IF;
1124 
1125            IF x_category_rec.segment2 = g_MISS_CHAR THEN
1126               x_category_rec.segment2 := l_category_rec.segment2;
1127            END IF;
1128 
1129            IF x_category_rec.segment3 = g_MISS_CHAR THEN
1130               x_category_rec.segment3 := l_category_rec.segment3;
1131            END IF;
1132 
1133            IF x_category_rec.segment4 = g_MISS_CHAR THEN
1134               x_category_rec.segment4 := l_category_rec.segment4;
1135            END IF;
1136 
1137            IF x_category_rec.segment5 = g_MISS_CHAR THEN
1138               x_category_rec.segment5 := l_category_rec.segment5;
1139            END IF;
1140 
1141            IF x_category_rec.segment6 = g_MISS_CHAR THEN
1142               x_category_rec.segment6 := l_category_rec.segment6;
1143            END IF;
1144 
1145            IF x_category_rec.segment7 = g_MISS_CHAR THEN
1146               x_category_rec.segment7 := l_category_rec.segment7;
1147            END IF;
1148 
1149            IF x_category_rec.segment8 = g_MISS_CHAR THEN
1150               x_category_rec.segment8 := l_category_rec.segment8;
1151            END IF;
1152 
1153            IF x_category_rec.segment9 = g_MISS_CHAR THEN
1154               x_category_rec.segment9 := l_category_rec.segment9;
1155            END IF;
1156 
1157            IF x_category_rec.segment10 = g_MISS_CHAR THEN
1158               x_category_rec.segment10 := l_category_rec.segment10;
1159            END IF;
1160 
1161            IF x_category_rec.segment11 = g_MISS_CHAR THEN
1162               x_category_rec.segment11 := l_category_rec.segment11;
1163            END IF;
1164 
1165            IF x_category_rec.segment12 = g_MISS_CHAR THEN
1166               x_category_rec.segment12 := l_category_rec.segment12;
1167            END IF;
1168 
1169            IF x_category_rec.segment13 = g_MISS_CHAR THEN
1170               x_category_rec.segment13 := l_category_rec.segment13;
1171            END IF;
1172 
1173            IF x_category_rec.segment14 = g_MISS_CHAR THEN
1174               x_category_rec.segment14 := l_category_rec.segment14;
1175            END IF;
1176 
1177            IF x_category_rec.segment15 = g_MISS_CHAR THEN
1178               x_category_rec.segment15 := l_category_rec.segment15;
1179            END IF;
1180 
1181            IF x_category_rec.segment16 = g_MISS_CHAR THEN
1182               x_category_rec.segment16 := l_category_rec.segment16;
1183            END IF;
1184 
1185            IF x_category_rec.segment17 = g_MISS_CHAR THEN
1186               x_category_rec.segment17 := l_category_rec.segment17;
1187            END IF;
1188 
1189            IF x_category_rec.segment18 = g_MISS_CHAR THEN
1190               x_category_rec.segment18 := l_category_rec.segment18;
1191            END IF;
1192 
1193            IF x_category_rec.segment19 = g_MISS_CHAR THEN
1194               x_category_rec.segment19 := l_category_rec.segment19;
1195            END IF;
1196 
1197            IF x_category_rec.segment20 = g_MISS_CHAR THEN
1198               x_category_rec.segment20 := l_category_rec.segment20;
1199            END IF;
1200 
1201            IF x_category_rec.attribute1 = g_MISS_CHAR THEN
1202               x_category_rec.attribute1 := l_category_rec.attribute1;
1203            END IF;
1204 
1205            IF x_category_rec.attribute2 = g_MISS_CHAR THEN
1206               x_category_rec.attribute2 := l_category_rec.attribute2;
1207            END IF;
1208 
1209            IF x_category_rec.attribute3 = g_MISS_CHAR THEN
1210               x_category_rec.attribute3 := l_category_rec.attribute3;
1211            END IF;
1212 
1213            IF x_category_rec.attribute4 = g_MISS_CHAR THEN
1214               x_category_rec.attribute4 := l_category_rec.attribute4;
1215            END IF;
1216 
1217            IF x_category_rec.attribute5 = g_MISS_CHAR THEN
1218               x_category_rec.attribute5 := l_category_rec.attribute5;
1219            END IF;
1220 
1221            IF x_category_rec.attribute6 = g_MISS_CHAR THEN
1222               x_category_rec.attribute6 := l_category_rec.attribute6;
1223            END IF;
1224 
1225            IF x_category_rec.attribute7 = g_MISS_CHAR THEN
1226               x_category_rec.attribute7 := l_category_rec.attribute7;
1227            END IF;
1228 
1229            IF x_category_rec.attribute8 = g_MISS_CHAR THEN
1230               x_category_rec.attribute8 := l_category_rec.attribute8;
1231            END IF;
1232 
1233            IF x_category_rec.attribute9 = g_MISS_CHAR THEN
1234               x_category_rec.attribute9 := l_category_rec.attribute9;
1235            END IF;
1236 
1237            IF x_category_rec.attribute10 = g_MISS_CHAR THEN
1238               x_category_rec.attribute10 := l_category_rec.attribute10;
1239            END IF;
1240 
1241            IF x_category_rec.attribute11 = g_MISS_CHAR THEN
1242               x_category_rec.attribute11 := l_category_rec.attribute11;
1243            END IF;
1244 
1245            IF x_category_rec.attribute12 = g_MISS_CHAR THEN
1246               x_category_rec.attribute12 := l_category_rec.attribute12;
1247            END IF;
1248 
1249            IF x_category_rec.attribute13 = g_MISS_CHAR THEN
1250               x_category_rec.attribute13 := l_category_rec.attribute13;
1251            END IF;
1252 
1253            IF x_category_rec.attribute14 = g_MISS_CHAR THEN
1254               x_category_rec.attribute14 := l_category_rec.attribute14;
1255            END IF;
1256 
1257            IF x_category_rec.attribute15 = g_MISS_CHAR THEN
1258               x_category_rec.attribute15 := l_category_rec.attribute15;
1259            END IF;
1260 
1261         END IF;  --IF (p_operation = G_UPDATE) THEN
1262 
1263 
1264   END Preprocess_Category_Rec;
1265 
1266 
1267   --
1268   -- Bug 13850442. Create_category allowing to create
1269   -- categories with disabled value from valueset.
1270   -- Adding new param for transaction type.
1271   -- sreharih. Wed Mar 21 13:22:46 PDT 2012
1272   --
1273   PROCEDURE ValueSet_Validate
1274   (
1275    p_structure_id        IN   NUMBER,
1276    p_concat_segs         IN   VARCHAR2,
1277    p_operation           IN   NUMBER -- added for 13850442
1278    ) IS
1279      l_success BOOLEAN;
1280      l_trim_str VARCHAR2(2000) ;
1281      l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1282 
1283   BEGIN
1284     l_success  :=   fnd_flex_keyval.validate_segs(
1285                  operation  => 'CHECK_SEGMENTS',
1286                  appl_short_name => G_INVENTORY_APP_SHORT_NAME,
1287                  key_flex_code => G_CAT_FLEX_CODE,
1288                  structure_number => p_structure_id,
1289                  concat_segments => p_concat_segs
1290                  );
1291 
1292   --
1293   -- Bug 13850442. Create_category allowing to create
1294   -- categories with disabled value from valueset.
1295   -- Adding condition to suppress the valueset check
1296   -- only for update scenario. This is a quick fix.
1297   -- We must get rid off hardcoded msg and this logic.
1298   -- sreharih. Wed Mar 21 13:22:46 PDT 2012
1299   --
1300 
1301 
1302 --Bug: 2445444 modified If condition
1303         IF (l_success OR
1304             ( NOT l_success AND p_operation = G_UPDATE AND -- added for 13850442
1305              (INSTR(FND_FLEX_KEYVAL.error_message,'has been disabled.')> 0 OR
1306               INSTR(FND_FLEX_KEYVAL.error_message,'has expired.')> 0 OR
1307               INSTR(FND_FLEX_KEYVAL.error_message,'This combination is disabled')>0))) THEN
1308        NULL;
1309     ELSE
1310        l_trim_str := FND_FLEX_KEYVAL.error_message;
1311        fnd_message.set_name('FND','FLEX-SSV EXCEPTION');
1312        fnd_message.set_token('MSG', 'Value set validation error in ValueSet_Validate()');
1313        fnd_msg_pub.ADD;
1314        IF (l_debug = 1) THEN
1315           mdebug('ValueSet Validation Error : '||l_trim_str);
1316        END IF;
1317 
1318        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1319     END IF;
1320   END ValueSet_Validate;
1321 
1322    ----------------------------------------------------------------------------
1323   PROCEDURE Flex_Validate
1324   (
1325    p_operation        IN   NUMBER,
1326    p_category_rec     IN  INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE
1327    ) IS
1328      l_category_id NUMBER;
1329      l_structure_id NUMBER;
1330      l_success BOOLEAN;
1331      l_concat_segs VARCHAR2(2000) ;
1332      l_n_segments NUMBER ;
1333      l_segment_array FND_FLEX_EXT.SegmentArray;
1334      l_delim VARCHAR2(10);
1335      l_indx        NUMBER;
1336 
1337      CURSOR segment_count(p_structure_id NUMBER) IS
1338         SELECT count(segment_num)
1339         FROM fnd_id_flex_segments
1340         WHERE application_id = G_INVENTORY_APP_ID
1341         AND id_flex_code = G_CAT_FLEX_CODE
1342         AND id_flex_num = p_structure_id
1343         AND (enabled_flag = 'Y' OR NVL(g_eni_upgarde_flag,'N') = 'Y');-- Added for 11.5.10 ENI Upgrade
1344 
1345      --Bug: 3893482
1346      CURSOR c_get_segments(cp_flex_num NUMBER) IS
1347         SELECT application_column_name,rownum
1348         FROM   fnd_id_flex_segments
1349         WHERE  application_id = 401
1350           AND  id_flex_code   = 'MCAT'
1351           AND  id_flex_num    = cp_flex_num
1352           AND  enabled_flag   = 'Y'
1353         ORDER BY segment_num ASC;
1354 
1355     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1356   BEGIN
1357         l_structure_id := p_category_rec.structure_id;
1358 
1359         OPEN segment_count(l_structure_id);
1360         FETCH segment_count INTO l_n_segments;
1361         IF (segment_count%NOTFOUND) THEN
1362            IF (l_debug = 1) THEN
1363               mdebug('The Number of segments not found');
1364            END IF;
1365         END IF;
1366         CLOSE segment_count;
1367         IF (l_debug = 1) THEN
1368         mdebug('Tracing....4');
1369         END IF;
1370 
1371 
1372         l_delim  := fnd_flex_ext.get_delimiter(G_INVENTORY_APP_SHORT_NAME,
1373                                                G_CAT_FLEX_CODE,
1374                                                l_structure_id);
1375         IF l_delim is NULL then
1376            fnd_message.set_name('OFA','FA_BUDGET_NO_SEG_DELIM');
1377            fnd_msg_pub.ADD;
1378            IF (l_debug = 1) THEN
1379            mdebug('Delimiter is NULL...Error');
1380            END IF;
1381            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1382         END IF;
1383 
1384         --Start: 3893482
1385         l_indx := 1;
1386         FOR c_segments in c_get_segments(l_structure_id) LOOP
1387           IF c_segments.application_column_name = 'SEGMENT1' THEN
1388              l_segment_array(l_indx):= p_category_rec.segment1;
1389           ELSIF c_segments.application_column_name = 'SEGMENT2' THEN
1390              l_segment_array(l_indx):= p_category_rec.segment2;
1391           ELSIF c_segments.application_column_name = 'SEGMENT3' THEN
1392              l_segment_array(l_indx):= p_category_rec.segment3;
1393           ELSIF c_segments.application_column_name = 'SEGMENT4' THEN
1394              l_segment_array(l_indx):= p_category_rec.segment4;
1395           ELSIF c_segments.application_column_name = 'SEGMENT5' THEN
1396              l_segment_array(l_indx):= p_category_rec.segment5;
1397           ELSIF c_segments.application_column_name = 'SEGMENT6' THEN
1398              l_segment_array(l_indx):= p_category_rec.segment6;
1399           ELSIF c_segments.application_column_name = 'SEGMENT7' THEN
1400              l_segment_array(l_indx):= p_category_rec.segment7;
1401           ELSIF c_segments.application_column_name = 'SEGMENT8' THEN
1402              l_segment_array(l_indx):= p_category_rec.segment8;
1403           ELSIF c_segments.application_column_name = 'SEGMENT9' THEN
1404              l_segment_array(l_indx):= p_category_rec.segment9;
1405           ELSIF c_segments.application_column_name = 'SEGMENT10' THEN
1406              l_segment_array(l_indx):= p_category_rec.segment10;
1407           ELSIF c_segments.application_column_name = 'SEGMENT11' THEN
1408              l_segment_array(l_indx):= p_category_rec.segment11;
1409           ELSIF c_segments.application_column_name = 'SEGMENT12' THEN
1410              l_segment_array(l_indx):= p_category_rec.segment12;
1411           ELSIF c_segments.application_column_name = 'SEGMENT13' THEN
1412              l_segment_array(l_indx):= p_category_rec.segment13;
1413           ELSIF c_segments.application_column_name = 'SEGMENT14' THEN
1414              l_segment_array(l_indx):= p_category_rec.segment14;
1415           ELSIF c_segments.application_column_name = 'SEGMENT15' THEN
1416              l_segment_array(l_indx):= p_category_rec.segment15;
1417           ELSIF c_segments.application_column_name = 'SEGMENT16' THEN
1418              l_segment_array(l_indx):= p_category_rec.segment16;
1419           ELSIF c_segments.application_column_name = 'SEGMENT17' THEN
1420              l_segment_array(l_indx):= p_category_rec.segment17;
1421           ELSIF c_segments.application_column_name = 'SEGMENT18' THEN
1422              l_segment_array(l_indx):= p_category_rec.segment18;
1423           ELSIF c_segments.application_column_name = 'SEGMENT19' THEN
1424              l_segment_array(l_indx):= p_category_rec.segment19;
1425           ELSIF c_segments.application_column_name = 'SEGMENT20' THEN
1426              l_segment_array(l_indx):= p_category_rec.segment20;
1427           END IF;
1428           l_indx := l_indx+1;
1429         END LOOP;
1430         --End: 3893482
1431 
1432         /*
1433         l_segment_array(1) := p_category_rec.segment1 ;
1434         l_segment_array(2) := p_category_rec.segment2 ;
1435         l_segment_array(3) := p_category_rec.segment3 ;
1436         l_segment_array(4) := p_category_rec.segment4 ;
1437         l_segment_array(5) := p_category_rec.segment5 ;
1438         l_segment_array(6) := p_category_rec.segment6 ;
1439         l_segment_array(7) := p_category_rec.segment7 ;
1440         l_segment_array(8) := p_category_rec.segment8 ;
1441         l_segment_array(9) := p_category_rec.segment9 ;
1442         l_segment_array(10):= p_category_rec.segment10;
1443         l_segment_array(11):= p_category_rec.segment11;
1444         l_segment_array(12):= p_category_rec.segment12;
1445         l_segment_array(13):= p_category_rec.segment13;
1446         l_segment_array(14):= p_category_rec.segment14;
1447         l_segment_array(15):= p_category_rec.segment15;
1448         l_segment_array(16):= p_category_rec.segment16;
1449         l_segment_array(17):= p_category_rec.segment17;
1450         l_segment_array(18):= p_category_rec.segment18;
1451         l_segment_array(19):= p_category_rec.segment19;
1452         l_segment_array(20):= p_category_rec.segment20;
1453         */
1454 
1455         IF (l_debug = 1) THEN
1456         mdebug('Tracing....5');
1457         END IF;
1458 
1459 
1460         l_concat_segs :=fnd_flex_ext.concatenate_segments(l_n_segments,
1461                                                           l_segment_array,
1462                                                           l_delim);
1463 
1464         IF (l_debug = 1) THEN
1465         mdebug('Delim       : '||l_delim);
1466         mdebug('Flex code   : '||G_CAT_FLEX_CODE);
1467         mdebug('struct#     : '||l_structure_id);
1468         mdebug('# of segs   : '||to_char(l_n_segments));
1469         mdebug('Concat segs : '||l_concat_segs);
1470         END IF;
1471 
1472         l_success  :=   fnd_flex_keyval.validate_segs(
1473                                 operation  => 'FIND_COMBINATION',
1474                                 appl_short_name => G_INVENTORY_APP_SHORT_NAME,
1475                                 key_flex_code => G_CAT_FLEX_CODE,
1476                                 structure_number => l_structure_id,
1477                                 concat_segments => l_concat_segs
1478                                 );
1479 --Bug: 2445444 modified If condition
1480         IF (l_success OR
1481             ( NOT l_success AND
1482              (INSTR(FND_FLEX_KEYVAL.error_message,'has been disabled.')> 0 OR
1483               INSTR(FND_FLEX_KEYVAL.error_message,'has expired.')> 0 OR
1484               INSTR(FND_FLEX_KEYVAL.error_message,'This combination is disabled')> 0
1485              )
1486            AND (p_operation = G_UPDATE))) THEN
1487            IF (p_operation = G_INSERT) THEN
1488 
1489                fnd_message.set_name('INV','INV_NEW_ENT');
1490                fnd_message.set_token('TOKEN', 'Category Segment Combination');
1491                fnd_msg_pub.ADD;
1492                IF (l_debug = 1) THEN
1493                mdebug('CCID already exists => '|| To_char(FND_FLEX_KEYVAL.combination_id));
1494                END IF;
1495                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1496 
1497            ELSIF (p_operation = G_UPDATE) THEN
1498               IF (FND_FLEX_KEYVAL.combination_id <>
1499                                    p_category_rec.category_id) THEN
1500                 fnd_message.set_name('INV','INV_NEW_ENT');
1501                 fnd_message.set_token('TOKEN', 'Category segment combination. Specified Combination used by another Category.');
1502                 fnd_msg_pub.ADD;
1503                 IF (l_debug = 1) THEN
1504                    mdebug( 'Code combination already used for another category');
1505                 END IF;
1506                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1507               ELSE
1508                  ValueSet_Validate(l_structure_id, l_concat_segs, p_operation);  -- added p_operation for 13850442
1509                  IF (l_debug = 1) THEN
1510                  mdebug('Updating CCID/Category_Id  => '|| To_char(FND_FLEX_KEYVAL.combination_id));
1511                  END IF;
1512               END IF;
1513            ELSE -- neither insert nor update
1514               NULL;
1515            END IF;
1516        ELSE -- (l_success = FALSE)
1517            IF (p_operation = G_INSERT) THEN
1518                ValueSet_Validate(l_structure_id, l_concat_segs, p_operation); -- added p_operation for 13850442
1519                IF (l_debug = 1) THEN
1520                mdebug('Combination new. Creating Category....');
1521                END IF;
1522 
1523               /* -------------------------------------------------------
1524                The COMBINATION need not be created using this.
1525                Calling procedure will take care of inserting record.
1526                Since the COMBINATION_ID is Category_Id, just verifying if the
1527                comb. exists through fnd_flex_keyval.validate_segs(FIND_COMB..)
1528                call and inserting directly in database through Table Handler
1529                would be enough. The folllowing could be used as alternative.
1530 
1531                l_success  :=   fnd_flex_keyval.validate_segs(
1532                                operation  => 'CREATE_COMBINATION',
1533                                appl_short_name => G_INVENTORY_APP_SHORT_NAME,
1534                                key_flex_code => G_CAT_FLEX_CODE,
1535                                structure_number => l_structure_id,
1536                                concat_segments => l_concat_segs
1537                                );
1538                IF (l_debug = 1) THEN
1539                mdebug('The CCID : '||To_char(FND_FLEX_KEYVAL.combination_id));
1540                mdebug('Error : '||FND_FLEX_KEYVAL.error_message);
1541                END IF;
1542                --------------------------------------------------------- */
1543 
1544            ELSIF (p_operation = G_UPDATE) THEN
1545               fnd_message.set_name('INV','INV_VALID_CAT');
1546               fnd_msg_pub.ADD;
1547               IF (l_debug = 1) THEN
1548               mdebug('Trying to update a non-existant ROW');
1549               END IF;
1550              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1551 
1552            ELSE -- neither insert nor update
1553               NULL;
1554            END IF;
1555       END IF;
1556 
1557           --mdebug('Error : '||FND_FLEX_KEYVAL.error_message);
1558   END Flex_Validate;
1559 
1560   -- 1. Create_Category
1561   ----------------------------------------------------------------------------
1562   PROCEDURE Create_Category
1563   (
1564     p_api_version      IN   NUMBER ,
1565     p_init_msg_list    IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
1566     p_commit           IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
1567     x_return_status    OUT  NOCOPY VARCHAR2 ,
1568     x_errorcode        OUT  NOCOPY NUMBER,
1569     x_msg_count        OUT  NOCOPY NUMBER ,
1570     x_msg_data         OUT  NOCOPY VARCHAR2 ,
1571     p_category_rec     IN  INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE,
1572     x_category_id      OUT   NOCOPY NUMBER
1573   )
1574   IS
1575     -- Start OF comments
1576     -- API name  : Create_Category
1577     -- TYPE      : Public
1578     -- Pre-reqs  : None
1579     -- FUNCTION  : Create a category.
1580     --
1581     -- Version: Current Version 0.1
1582     -- Previous Version :  None
1583     -- Notes  :
1584     --
1585     -- END OF comments
1586 
1587      l_api_name              CONSTANT VARCHAR2(30)      := 'Create_Category';
1588      -- On addition of any Required parameters the major version needs
1589      -- to change i.e. for eg. 1.X to 2.X.
1590      -- On addition of any Optional parameters the minor version needs
1591      -- to change i.e. for eg. X.6 to X.7.
1592 
1593      l_api_version           CONSTANT NUMBER    := 1.0;
1594      l_row_count             NUMBER;
1595 
1596      -- General variables
1597      l_category_rec     INV_ITEM_CATEGORY_PUB.category_rec_type;
1598      l_category_id NUMBER;
1599      l_success BOOLEAN; --boolean for descr. flex valiation
1600      l_row_id VARCHAR2(20);
1601      l_sys_date DATE := Sysdate;
1602 
1603      CURSOR new_category_id IS
1604         SELECT mtl_categories_s.nextval
1605         FROM dual;
1606     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1607   BEGIN
1608         -- Standard Start of API savepoint
1609         SAVEPOINT       Create_Category_PUB;
1610 
1611         -- Check for call compatibility.
1612         IF NOT FND_API.Compatible_API_Call (l_api_version,
1613                                             p_api_version,
1614                                             l_api_name,
1615                                             G_PKG_NAME)
1616         THEN
1617                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1618         END IF;
1619         -- Initialize API message list if necessary.
1620         -- Initialize message list if p_init_msg_list is set to TRUE.
1621         IF FND_API.to_Boolean( p_init_msg_list ) THEN
1622                 FND_MSG_PUB.initialize;
1623         END IF;
1624 
1625         IF (l_debug = 1) THEN
1626         mdebug('Tracing....1');
1627         END IF;
1628 
1629         -- To set the APPS Environment context through PL/SQL.
1630         -- Apps_Initialize();
1631 
1632         -- To process the Input record for any invalid values provided.
1633         Preprocess_Category_Rec(G_INSERT, p_category_rec, l_category_rec) ;
1634         Flex_Validate(G_INSERT, l_category_rec);
1635 
1636         -- Category_Id is always created from sequence.
1637         OPEN new_category_id;
1638         FETCH new_category_id INTO l_category_id;
1639         IF (new_category_id%NOTFOUND) THEN
1640            IF (l_debug = 1) THEN
1641               mdebug('Dubious error with the MTL_CATEGORIES_S sequence');
1642            END IF;
1643         END IF;
1644         CLOSE new_category_id;
1645 
1646         /* Need for Descriptive Flex validation
1647 
1648         l_attribute_category := l_category_rec.attribute_category;
1649         l_attribute1  := l_category_rec.attribute1 ;
1650         l_attribute2  := l_category_rec.attribute2 ;
1651         l_attribute3  := l_category_rec.attribute3 ;
1652         l_attribute4  := l_category_rec.attribute4 ;
1653         l_attribute5  := l_category_rec.attribute5 ;
1654         l_attribute6  := l_category_rec.attribute6 ;
1655         l_attribute7  := l_category_rec.attribute7 ;
1656         l_attribute8  := l_category_rec.attribute8 ;
1657         l_attribute9  := l_category_rec.attribute9 ;
1658         l_attribute10 := l_category_rec.attribute10;
1659         l_attribute11 := l_category_rec.attribute11;
1660         l_attribute12 := l_category_rec.attribute12;
1661         l_attribute13 := l_category_rec.attribute13;
1662         l_attribute14 := l_category_rec.attribute14;
1663         l_attribute15 := l_category_rec.attribute15;
1664          */
1665 
1666           --Final call for insertion.
1667             MTL_CATEGORIES_PKG.Insert_Row(
1668               X_ROWID                =>   l_row_id,   -- OUT variable
1669               X_CATEGORY_ID          =>   l_category_id, -- gen from seq.
1670               X_DESCRIPTION          =>   l_category_rec.description,
1671               X_STRUCTURE_ID         =>   l_category_rec.structure_id,
1672               X_DISABLE_DATE         =>   l_category_rec.disable_date,
1673               X_WEB_STATUS           =>   l_category_rec.web_status,--Bug: 2430879
1674               X_SUPPLIER_ENABLED_FLAG =>  l_category_rec.supplier_enabled_flag,--Bug: 2645153
1675               X_SEGMENT1             =>   l_category_rec.segment1 ,
1676               X_SEGMENT2             =>   l_category_rec.segment2 ,
1677               X_SEGMENT3             =>   l_category_rec.segment3 ,
1678               X_SEGMENT4             =>   l_category_rec.segment4 ,
1679               X_SEGMENT5             =>   l_category_rec.segment5 ,
1680               X_SEGMENT6             =>   l_category_rec.segment6 ,
1681               X_SEGMENT7             =>   l_category_rec.segment7 ,
1682               X_SEGMENT8             =>   l_category_rec.segment8 ,
1683               X_SEGMENT9             =>   l_category_rec.segment9 ,
1684               X_SEGMENT10            =>   l_category_rec.segment10 ,
1685               X_SEGMENT11            =>   l_category_rec.segment11 ,
1686               X_SEGMENT12            =>   l_category_rec.segment12 ,
1687               X_SEGMENT13            =>   l_category_rec.segment13 ,
1688               X_SEGMENT14            =>   l_category_rec.segment14 ,
1689               X_SEGMENT15            =>   l_category_rec.segment15 ,
1690               X_SEGMENT16            =>   l_category_rec.segment16 ,
1691               X_SEGMENT17            =>   l_category_rec.segment17 ,
1692               X_SEGMENT18            =>   l_category_rec.segment18 ,
1693               X_SEGMENT19            =>   l_category_rec.segment19 ,
1694               X_SEGMENT20            =>   l_category_rec.segment20 ,
1695               X_SUMMARY_FLAG         =>   l_category_rec.summary_flag,
1696               X_ENABLED_FLAG         =>   l_category_rec.enabled_flag,
1697               X_START_DATE_ACTIVE    =>   l_category_rec.start_date_active,
1698               X_END_DATE_ACTIVE      =>   l_category_rec.end_date_active,
1699               X_ATTRIBUTE_CATEGORY   =>   l_category_rec.attribute_category,
1700               X_ATTRIBUTE1           =>   l_category_rec.attribute1 ,
1701               X_ATTRIBUTE2           =>   l_category_rec.attribute2 ,
1702               X_ATTRIBUTE3           =>   l_category_rec.attribute3 ,
1703               X_ATTRIBUTE4           =>   l_category_rec.attribute4 ,
1704               X_ATTRIBUTE5           =>   l_category_rec.attribute5 ,
1705               X_ATTRIBUTE6           =>   l_category_rec.attribute6 ,
1706               X_ATTRIBUTE7           =>   l_category_rec.attribute7 ,
1707               X_ATTRIBUTE8           =>   l_category_rec.attribute8 ,
1708               X_ATTRIBUTE9           =>   l_category_rec.attribute9 ,
1709               X_ATTRIBUTE10          =>   l_category_rec.attribute10,
1710               X_ATTRIBUTE11          =>   l_category_rec.attribute11,
1711               X_ATTRIBUTE12          =>   l_category_rec.attribute12,
1712               X_ATTRIBUTE13          =>   l_category_rec.attribute13,
1713               X_ATTRIBUTE14          =>   l_category_rec.attribute14,
1714               X_ATTRIBUTE15          =>   l_category_rec.attribute15,
1715               X_LAST_UPDATE_DATE     =>   l_sys_date,
1716               X_LAST_UPDATED_BY      =>   fnd_global.user_id,
1717               X_CREATION_DATE        =>   l_sys_date,
1718               X_CREATED_BY           =>   fnd_global.user_id,
1719               X_LAST_UPDATE_LOGIN    =>   fnd_global.login_id
1720               );
1721 
1722               IF (l_debug = 1) THEN
1723               mdebug('Created New CCID/Category_ID : '|| l_category_id);
1724               END IF;
1725               -- assigning the created value to the return OUT value
1726               x_category_id := l_category_id;
1727 
1728           IF (l_debug = 1) THEN
1729           mdebug('Tracing....10');
1730           END IF;
1731 
1732         -- Standard check of p_commit.
1733         IF FND_API.To_Boolean( p_commit ) THEN
1734                 COMMIT WORK;
1735         END IF;
1736 
1737         x_return_status := FND_API.G_RET_STS_SUCCESS;
1738         -- Standard call to get message count and if count is 1,
1739         -- get message info.
1740         -- The client will directly display the x_msg_data (which is already
1741         -- translated) if the x_msg_count = 1;
1742         -- Else i.e if  x_msg_count > 1, client will call the FND_MSG_PUB.Get
1743         -- Server-side procedure to access the messages, and consolidate them
1744         -- and display (or) to display one message after another.
1745         IF (l_debug = 1) THEN
1746         mdebug('Tracing....11');
1747         END IF;
1748         FND_MSG_PUB.Count_And_Get
1749                 (       p_count        =>      x_msg_count,
1750                         p_data         =>      x_msg_data
1751                 );
1752     EXCEPTION
1753     WHEN FND_API.G_EXC_ERROR THEN
1754          IF (l_debug = 1) THEN
1755             mdebug('Ending : Returning ERROR');
1756          END IF;
1757                 ROLLBACK TO Create_Category_PUB;
1758                 x_return_status := FND_API.G_RET_STS_ERROR;
1759                 FND_MSG_PUB.Count_And_Get
1760                 (       p_count        =>      x_msg_count,
1761                         p_data         =>      x_msg_data
1762                 );
1763         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1764                 ROLLBACK TO Create_Category_PUB;
1765        IF (l_debug = 1) THEN
1766           mdebug('Ending : Returning UNEXPECTED ERROR');
1767        END IF;
1768                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1769                 FND_MSG_PUB.Count_And_Get
1770                 (       p_count        =>      x_msg_count,
1771                         p_data         =>      x_msg_data
1772                 );
1773         WHEN OTHERS THEN
1774                 ROLLBACK TO Create_Category_PUB;
1775        IF (l_debug = 1) THEN
1776           mdebug('Ending : Returning UNEXPECTED ERROR');
1777        END IF;
1778                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1779                 IF      FND_MSG_PUB.Check_Msg_Level
1780                         (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1781                 THEN
1782                         FND_MSG_PUB.Add_Exc_Msg
1783                         (       G_PKG_NAME          ,
1784                                 l_api_name
1785                         );
1786                 END IF;
1787                 FND_MSG_PUB.Count_And_Get
1788                 (       p_count        =>      x_msg_count,
1789                         p_data         =>      x_msg_data
1790                 );
1791 
1792   END Create_Category;
1793   ----------------------------------------------------------------------------
1794 
1795 
1796   -- 2. Update_Category
1797   ----------------------------------------------------------------------------
1798   PROCEDURE Update_Category
1799   (
1800     p_api_version      IN   NUMBER ,
1801     p_init_msg_list    IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
1802     p_commit           IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
1803     x_return_status    OUT  NOCOPY VARCHAR2 ,
1804     x_errorcode        OUT  NOCOPY NUMBER,
1805     x_msg_count        OUT  NOCOPY NUMBER ,
1806     x_msg_data         OUT  NOCOPY VARCHAR2 ,
1807     p_category_rec     IN   INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE
1808   )
1809     IS
1810 
1811     -- Start OF comments
1812     -- API name  : Update_Category
1813     -- TYPE      : Public
1814     -- Pre-reqs  : None
1815     -- FUNCTION  : Update a category.
1816     --
1817     -- Version: Current Version 0.1
1818     -- Previous Version :  None
1819     -- Notes  : Stub Version
1820     --
1821     -- END OF comments
1822      l_api_name              CONSTANT VARCHAR2(30)      := 'Update_Category';
1823      -- On addition of any Required parameters the major version needs
1824      -- to change i.e. for eg. 1.X to 2.X.
1825      -- On addition of any Optional parameters the minor version needs
1826      -- to change i.e. for eg. X.6 to X.7.
1827      l_api_version           CONSTANT NUMBER    := 1.0;
1828      l_row_count             NUMBER;
1829 
1830      -- General variables
1831      l_category_rec     INV_ITEM_CATEGORY_PUB.category_rec_type;
1832      l_success BOOLEAN; --boolean for descr. flex valiation
1833 
1834 
1835     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
1836   BEGIN
1837         -- Standard Start of API savepoint
1838         SAVEPOINT       Update_Category_PUB;
1839 
1840 
1841         IF NOT FND_API.Compatible_API_Call (l_api_version,
1842                                                 p_api_version   ,
1843                                                 l_api_name      ,
1844                                                 G_PKG_NAME)
1845         THEN
1846                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1847         END IF;
1848         -- Initialize API message list if necessary.
1849         -- Initialize message list if p_init_msg_list is set to TRUE.
1850         IF FND_API.to_Boolean( p_init_msg_list ) THEN
1851                 FND_MSG_PUB.initialize;
1852         END IF;
1853 
1854         IF (l_debug = 1) THEN
1855         mdebug('Tracing....1');
1856         END IF;
1857 
1858         -- To process the Input record for any invalid values provided.
1859         Preprocess_Category_Rec(G_UPDATE, p_category_rec, l_category_rec) ;
1860         Flex_Validate(G_UPDATE, l_category_rec);
1861 
1862 
1863         /* Need for Descriptive Flex validation
1864 
1865         l_attribute_category := l_category_rec.attribute_category;
1866         l_attribute1  := l_category_rec.attribute1 ;
1867         l_attribute2  := l_category_rec.attribute2 ;
1868         l_attribute3  := l_category_rec.attribute3 ;
1869         l_attribute4  := l_category_rec.attribute4 ;
1870         l_attribute5  := l_category_rec.attribute5 ;
1871         l_attribute6  := l_category_rec.attribute6 ;
1872         l_attribute7  := l_category_rec.attribute7 ;
1873         l_attribute8  := l_category_rec.attribute8 ;
1874         l_attribute9  := l_category_rec.attribute9 ;
1875         l_attribute10 := l_category_rec.attribute10;
1876         l_attribute11 := l_category_rec.attribute11;
1877         l_attribute12 := l_category_rec.attribute12;
1878         l_attribute13 := l_category_rec.attribute13;
1879         l_attribute14 := l_category_rec.attribute14;
1880         l_attribute15 := l_category_rec.attribute15;
1881          */
1882 
1883 
1884         --Final call for insertion.
1885         MTL_CATEGORIES_PKG.Update_Row(
1886               X_CATEGORY_ID          =>   l_category_rec.category_id,
1887               X_DESCRIPTION          =>   l_category_rec.description,
1888               X_STRUCTURE_ID         =>   l_category_rec.structure_id,
1889               X_DISABLE_DATE         =>   l_category_rec.disable_date,
1890               X_WEB_STATUS           =>   l_category_rec.web_status,--Bug: 2430879
1891               X_SUPPLIER_ENABLED_FLAG =>  l_category_rec.supplier_enabled_flag,--Bug: 2645153
1892               X_SEGMENT1             =>   l_category_rec.segment1 ,
1893               X_SEGMENT2             =>   l_category_rec.segment2 ,
1894               X_SEGMENT3             =>   l_category_rec.segment3 ,
1895               X_SEGMENT4             =>   l_category_rec.segment4 ,
1896               X_SEGMENT5             =>   l_category_rec.segment5 ,
1897               X_SEGMENT6             =>   l_category_rec.segment6 ,
1898               X_SEGMENT7             =>   l_category_rec.segment7 ,
1899               X_SEGMENT8             =>   l_category_rec.segment8 ,
1900               X_SEGMENT9             =>   l_category_rec.segment9 ,
1901               X_SEGMENT10            =>   l_category_rec.segment10 ,
1902               X_SEGMENT11            =>   l_category_rec.segment11 ,
1903               X_SEGMENT12            =>   l_category_rec.segment12 ,
1904               X_SEGMENT13            =>   l_category_rec.segment13 ,
1905               X_SEGMENT14            =>   l_category_rec.segment14 ,
1906               X_SEGMENT15            =>   l_category_rec.segment15 ,
1907               X_SEGMENT16            =>   l_category_rec.segment16 ,
1908               X_SEGMENT17            =>   l_category_rec.segment17 ,
1909               X_SEGMENT18            =>   l_category_rec.segment18 ,
1910               X_SEGMENT19            =>   l_category_rec.segment19 ,
1911               X_SEGMENT20            =>   l_category_rec.segment20 ,
1912               X_SUMMARY_FLAG         =>   l_category_rec.summary_flag,
1913               X_ENABLED_FLAG         =>   l_category_rec.enabled_flag,
1914               X_START_DATE_ACTIVE    =>   l_category_rec.start_date_active,
1915               X_END_DATE_ACTIVE      =>   l_category_rec.end_date_active,
1916               X_ATTRIBUTE_CATEGORY   =>   l_category_rec.attribute_category,
1917               X_ATTRIBUTE1           =>   l_category_rec.attribute1 ,
1918               X_ATTRIBUTE2           =>   l_category_rec.attribute2 ,
1919               X_ATTRIBUTE3           =>   l_category_rec.attribute3 ,
1920               X_ATTRIBUTE4           =>   l_category_rec.attribute4 ,
1921               X_ATTRIBUTE5           =>   l_category_rec.attribute5 ,
1922               X_ATTRIBUTE6           =>   l_category_rec.attribute6 ,
1923               X_ATTRIBUTE7           =>   l_category_rec.attribute7 ,
1924               X_ATTRIBUTE8           =>   l_category_rec.attribute8 ,
1925               X_ATTRIBUTE9           =>   l_category_rec.attribute9 ,
1926               X_ATTRIBUTE10          =>   l_category_rec.attribute10,
1927               X_ATTRIBUTE11          =>   l_category_rec.attribute11,
1928               X_ATTRIBUTE12          =>   l_category_rec.attribute12,
1929               X_ATTRIBUTE13          =>   l_category_rec.attribute13,
1930               X_ATTRIBUTE14          =>   l_category_rec.attribute14,
1931               X_ATTRIBUTE15          =>   l_category_rec.attribute15,
1932               X_LAST_UPDATE_DATE     =>   sysdate,
1933               X_LAST_UPDATED_BY      =>   fnd_global.user_id,
1934               X_LAST_UPDATE_LOGIN    =>   fnd_global.login_id
1935               );
1936 
1937            IF (l_debug = 1) THEN
1938            mdebug('Updated Category: '||To_char(l_category_rec.category_id));
1939            END IF;
1940 
1941         IF (l_debug = 1) THEN
1942         mdebug('Update_Category:: Tracing....10');
1943         END IF;
1944 
1945           -- Standard check of p_commit.
1946         IF FND_API.To_Boolean( p_commit ) THEN
1947                 COMMIT WORK;
1948         END IF;
1949 
1950         x_return_status := FND_API.G_RET_STS_SUCCESS;
1951         -- Standard call to get message count and if count is 1,
1952         -- get message info.
1953         -- The client will directly display the x_msg_data (which is already
1954         -- translated) if the x_msg_count = 1;
1955         -- Else i.e if  x_msg_count > 1, client will call the FND_MSG_PUB.Get
1956         -- Server-side procedure to access the messages, and consolidate them
1957         -- and display (or) to display one message after another.
1958         FND_MSG_PUB.Count_And_Get
1959                 (       p_count        =>      x_msg_count,
1960                         p_data         =>      x_msg_data
1961                 );
1962      EXCEPTION
1963         WHEN FND_API.G_EXC_ERROR THEN
1964                 ROLLBACK TO Update_Category_PUB;
1965                 x_return_status := FND_API.G_RET_STS_ERROR;
1966                 FND_MSG_PUB.Count_And_Get
1967                 (       p_count        =>      x_msg_count,
1968                         p_data         =>      x_msg_data
1969                 );
1970         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1971                 ROLLBACK TO Update_Category_PUB;
1972                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1973                 FND_MSG_PUB.Count_And_Get
1974                 (       p_count        =>      x_msg_count,
1975                         p_data         =>      x_msg_data
1976                 );
1977         WHEN OTHERS THEN
1978                 ROLLBACK TO Update_Category_PUB;
1979                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1980                 IF      FND_MSG_PUB.Check_Msg_Level
1981                         (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1982                 THEN
1983                         FND_MSG_PUB.Add_Exc_Msg
1984                         (       G_PKG_NAME          ,
1985                                 l_api_name
1986                         );
1987                 END IF;
1988                 FND_MSG_PUB.Count_And_Get
1989                 (       p_count        =>      x_msg_count,
1990                         p_data         =>      x_msg_data
1991                 );
1992 
1993 
1994 
1995   END Update_Category;
1996   ----------------------------------------------------------------------------
1997 
1998 
1999   -- 3. Update_Category_Description
2000   ----------------------------------------------------------------------------
2001   PROCEDURE Update_Category_Description
2002   (
2003     p_api_version      IN   NUMBER ,
2004     p_init_msg_list    IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
2005     p_commit           IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
2006     x_return_status    OUT  NOCOPY VARCHAR2 ,
2007     x_errorcode        OUT  NOCOPY NUMBER,
2008     x_msg_count        OUT  NOCOPY NUMBER ,
2009     x_msg_data         OUT  NOCOPY VARCHAR2 ,
2010     p_category_id      IN   NUMBER,
2011     p_description      IN   VARCHAR2
2012     -- deleted as this can be picked up from the environment.
2013     --p_language         IN   VARCHAR2
2014   )
2015   IS
2016     -- Start OF comments
2017     -- API name  : Update_Category_Description
2018     -- TYPE      : Public
2019     -- Pre-reqs  : None
2020     -- FUNCTION  : Update a category description in the specified language.
2021     --
2022     -- Version: Current Version 0.1
2023     -- Previous Version :  None
2024     -- Notes  : Stub Version
2025     -- END OF comments
2026      l_api_name              CONSTANT VARCHAR2(30)      := 'Update_Category_Description';
2027      -- On addition of any Required parameters the major version needs
2028      -- to change i.e. for eg. 1.X to 2.X.
2029      -- On addition of any Optional parameters the minor version needs
2030      -- to change i.e. for eg. X.6 to X.7.
2031      l_api_version           CONSTANT NUMBER    := 1.0;
2032      l_row_count             NUMBER;
2033     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
2034   BEGIN
2035         -- Standard Start of API savepoint
2036         SAVEPOINT       Update_Category_Desc_PUB;
2037 
2038 
2039         -- Check for call compatibility.
2040         IF NOT FND_API.Compatible_API_Call (l_api_version,
2041                                                 p_api_version   ,
2042                                                 l_api_name      ,
2043                                                 G_PKG_NAME)
2044         THEN
2045                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2046         END IF;
2047         -- Initialize API message list if necessary.
2048         -- Initialize message list if p_init_msg_list is set to TRUE.
2049         IF FND_API.to_Boolean( p_init_msg_list ) THEN
2050                 FND_MSG_PUB.initialize;
2051         END IF;
2052 
2053         UPDATE mtl_categories_tl
2054         SET
2055              description = p_description,
2056              last_update_date = Sysdate,
2057              last_updated_by = fnd_global.user_id,
2058              last_update_login = fnd_global.login_id,
2059              source_lang = userenv('LANG')
2060          WHERE  category_id = p_category_id
2061         AND  userenv('LANG') IN (language, source_lang) ;
2062 
2063         IF (sql%notfound) THEN
2064             fnd_message.set_name('INV','INV_VALID_CAT');
2065             fnd_msg_pub.ADD;
2066             IF (l_debug = 1) THEN
2067             mdebug('Trying to Update a non-existant Category.');
2068             END IF;
2069             RAISE NO_DATA_FOUND;
2070         END IF;
2071 
2072           -- Standard check of p_commit.
2073         IF FND_API.To_Boolean( p_commit ) THEN
2074                 COMMIT WORK;
2075         END IF;
2076 
2077         x_return_status := FND_API.G_RET_STS_SUCCESS;
2078         -- Standard call to get message count and if count is 1,
2079         -- get message info.
2080         -- The client will directly display the x_msg_data (which is already
2081         -- translated) if the x_msg_count = 1;
2082         -- Else i.e if  x_msg_count > 1, client will call the FND_MSG_PUB.Get
2083         -- Server-side procedure to access the messages, and consolidate them
2084         -- and display (or) to display one message after another.
2085         FND_MSG_PUB.Count_And_Get
2086                 (       p_count        =>      x_msg_count,
2087                         p_data         =>      x_msg_data
2088                 );
2089 
2090   EXCEPTION
2091     WHEN FND_API.G_EXC_ERROR THEN
2092                 ROLLBACK TO Update_Category_Desc_PUB;
2093                 x_return_status := FND_API.G_RET_STS_ERROR;
2094                 FND_MSG_PUB.Count_And_Get
2095                 (       p_count        =>      x_msg_count,
2096                         p_data         =>      x_msg_data
2097                 );
2098         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2099                 ROLLBACK TO Update_Category_Desc_PUB;
2100                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2101                 FND_MSG_PUB.Count_And_Get
2102                 (       p_count        =>      x_msg_count,
2103                         p_data         =>      x_msg_data
2104                 );
2105         WHEN OTHERS THEN
2106                 ROLLBACK TO Update_Category_Desc_PUB;
2107                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2108                 IF      FND_MSG_PUB.Check_Msg_Level
2109                         (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2110                 THEN
2111                         FND_MSG_PUB.Add_Exc_Msg
2112                         (       G_PKG_NAME          ,
2113                                 l_api_name
2114                         );
2115                 END IF;
2116                 FND_MSG_PUB.Count_And_Get
2117                 (       p_count        =>      x_msg_count,
2118                         p_data         =>      x_msg_data
2119                 );
2120 
2121   END Update_Category_Description;
2122   ----------------------------------------------------------------------------
2123 
2124   -- 4. Delete_Category
2125   ----------------------------------------------------------------------------
2126 -- ----------------------------------------------------------------------
2127 -- Deletion of categories is not supported.
2128 -- ----------------------------------------------------------------------
2129 
2130   PROCEDURE Delete_Category
2131   (
2132     p_api_version      IN   NUMBER ,
2133     p_init_msg_list    IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
2134     p_commit           IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
2135     x_return_status    OUT  NOCOPY VARCHAR2 ,
2136     x_errorcode        OUT  NOCOPY NUMBER,
2137     x_msg_count        OUT  NOCOPY NUMBER ,
2138     x_msg_data         OUT  NOCOPY VARCHAR2 ,
2139     p_category_id      IN   NUMBER
2140   )
2141   IS
2142     -- Start OF comments
2143     -- API name  : Delete_Category
2144     -- TYPE      : Public
2145     -- Pre-reqs  : None
2146     -- FUNCTION  : Delete a category.
2147     --
2148     -- Version: Current Version 0.1
2149     -- Previous Version :  None
2150     -- Notes  : Stub Version
2151     --
2152     -- END OF comments
2153      l_api_name              CONSTANT VARCHAR2(30)      := 'Delete_Category';
2154      -- On addition of any Required parameters the major version needs
2155      -- to change i.e. for eg. 1.X to 2.X.
2156      -- On addition of any Optional parameters the minor version needs
2157      -- to change i.e. for eg. X.6 to X.7.
2158      l_api_version           CONSTANT NUMBER    := 1.0;
2159      l_row_count             NUMBER;
2160      l_category_assignment_exists VARCHAR(1);
2161      l_default_category_exists    VARCHAR(1);
2162      l_valid_category_exists      VARCHAR(1);
2163 
2164      CURSOR category_assignment_exists(p_category_id NUMBER) IS
2165        SELECT 'x'
2166        FROM dual
2167          WHERE exists
2168          ( SELECT category_id
2169            FROM mtl_item_categories
2170            WHERE category_id = p_category_id
2171            );
2172 
2173      CURSOR default_category_exists(p_category_id NUMBER) IS
2174        SELECT 'x'
2175        FROM dual
2176          WHERE exists
2177          ( SELECT default_category_id
2178            FROM mtl_category_sets_b
2179            WHERE default_category_id = p_category_id
2180            );
2181 
2182 
2183      CURSOR valid_category_exists(p_category_id NUMBER) IS
2184        SELECT 'x'
2185        FROM dual
2186          WHERE exists
2187          ( SELECT category_id
2188            FROM mtl_category_set_valid_cats
2189            WHERE category_id = p_category_id
2190            );
2191 
2192 
2193     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
2194   BEGIN
2195         -- Standard Start of API savepoint
2196         SAVEPOINT       Delete_Category_PUB;
2197 
2198         -- Check for call compatibility.
2199         IF NOT FND_API.Compatible_API_Call (l_api_version,
2200                                                 p_api_version   ,
2201                                                 l_api_name      ,
2202                                                 G_PKG_NAME)
2203         THEN
2204                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2205         END IF;
2206         -- Initialize API message list if necessary.
2207         -- Initialize message list if p_init_msg_list is set to TRUE.
2208         IF FND_API.to_Boolean( p_init_msg_list ) THEN
2209                 FND_MSG_PUB.initialize;
2210         END IF;
2211 
2212         OPEN category_assignment_exists(p_category_id);
2213         FETCH category_assignment_exists INTO l_category_assignment_exists;
2214         IF (category_assignment_exists%NOTFOUND) THEN
2215            IF (l_debug = 1) THEN
2216               mdebug('Can Delete: Category not part of any Category Assignment');
2217            END IF;
2218         END IF;
2219         CLOSE category_assignment_exists;
2220         IF (l_category_assignment_exists = 'x') THEN
2221           fnd_message.set_name('INV','INV_CATEGORY_ASSIGNED');
2222           fnd_msg_pub.ADD;
2223           IF (l_debug = 1) THEN
2224           mdebug('Cannot delete: Category part of a Category Assignment');
2225           END IF;
2226           RAISE FND_API.G_EXC_ERROR;
2227         END IF;
2228 
2229         OPEN default_category_exists(p_category_id);
2230         FETCH default_category_exists INTO l_default_category_exists;
2231         IF (default_category_exists%NOTFOUND) THEN
2232            IF (l_debug = 1) THEN
2233               mdebug('Can Delete: Category not a default category');
2234            END IF;
2235         END IF;
2236         CLOSE default_category_exists;
2237         IF (l_default_category_exists = 'x') THEN
2238           fnd_message.set_name('INV','INV_CATEGORY_DEFAULT');
2239           fnd_msg_pub.ADD;
2240          IF (l_debug = 1) THEN
2241          mdebug('Cannot delete: Category specified is a default category to one of the Category Sets.');
2242          END IF;
2243          RAISE FND_API.G_EXC_ERROR;
2244         END IF;
2245 
2246         OPEN valid_category_exists(p_category_id);
2247         FETCH  valid_category_exists INTO l_valid_category_exists;
2248         IF (valid_category_exists%NOTFOUND) THEN
2249            IF (l_debug = 1) THEN
2250               mdebug('Can Delete: Category not part of a Valid category set');
2251            END IF;
2252         END IF;
2253         CLOSE valid_category_exists;
2254         IF (l_valid_category_exists = 'x') THEN
2255           fnd_message.set_name('INV','INV_CATEGORY_IN_USE');
2256           fnd_msg_pub.ADD;
2257          IF (l_debug = 1) THEN
2258          mdebug('Cannot delete: Category specified is part of a valid category set');
2259          END IF;
2260          RAISE FND_API.G_EXC_ERROR;
2261         END IF;
2262 
2263         delete from mtl_categories_tl
2264         where  category_id = p_category_id ;
2265 
2266         if (sql%notfound) then
2267           fnd_message.set_name('INV','INV_VALID_CAT');
2268           fnd_msg_pub.ADD;
2269           IF (l_debug = 1) THEN
2270              mdebug('Trying to delete non-existant Category Id from MTL_CATEGORIES_TL.');
2271           END IF;
2272           RAISE NO_DATA_FOUND;
2273         end if;
2274 
2275         delete from mtl_categories_b
2276         where  category_id = p_category_id ;
2277 
2278         if (sql%notfound) then
2279           fnd_message.set_name('INV','INV_VALID_CAT');
2280           fnd_msg_pub.ADD;
2281           IF (l_debug = 1) THEN
2282              mdebug('Trying to delete non-existant Category Id from MTL_CATEGORIES_B.');
2283           END IF;
2284           RAISE NO_DATA_FOUND;
2285         end if;
2286 
2287         IF (l_debug = 1) THEN
2288            mdebug('Category deleted successfully: '||p_category_id);
2289         END IF;
2290         -- Standard check of p_commit.
2291         IF FND_API.To_Boolean( p_commit ) THEN
2292                 COMMIT WORK;
2293         END IF;
2294 
2295         x_return_status := FND_API.G_RET_STS_SUCCESS;
2296         -- Standard call to get message count and if count is 1,
2297         -- get message info.
2298         -- The client will directly display the x_msg_data (which is already
2299         -- translated) if the x_msg_count = 1;
2300         -- Else i.e if  x_msg_count > 1, client will call the FND_MSG_PUB.Get
2301         -- Server-side procedure to access the messages, and consolidate them
2302         -- and display (or) to display one message after another.
2303         FND_MSG_PUB.Count_And_Get
2304                 (       p_count        =>      x_msg_count,
2305                         p_data         =>      x_msg_data
2306                 );
2307 EXCEPTION
2308     WHEN FND_API.G_EXC_ERROR THEN
2309                 ROLLBACK TO Delete_Category_PUB;
2310                 x_return_status := FND_API.G_RET_STS_ERROR;
2311                 FND_MSG_PUB.Count_And_Get
2312                 (       p_count        =>      x_msg_count,
2313                         p_data         =>      x_msg_data
2314                 );
2315         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2316                 ROLLBACK TO Delete_Category_PUB;
2317                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2318                 FND_MSG_PUB.Count_And_Get
2319                 (       p_count        =>      x_msg_count,
2320                         p_data         =>      x_msg_data
2321                 );
2322         WHEN OTHERS THEN
2323                 ROLLBACK TO Delete_Category_PUB;
2324                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2325                 IF      FND_MSG_PUB.Check_Msg_Level
2326                         (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2327                 THEN
2328                         FND_MSG_PUB.Add_Exc_Msg
2329                         (       G_PKG_NAME          ,
2330                                 l_api_name
2331                         );
2332                 END IF;
2333                 FND_MSG_PUB.Count_And_Get
2334                 (       p_count        =>      x_msg_count,
2335                         p_data         =>      x_msg_data
2336                 );
2337 
2338 
2339   END Delete_Category;
2340 
2341   ----------------------------------------------------------------------------
2342 
2343   -- 5. Create_Category_Assignment
2344   --  Bug: 2451359, All the validations are taken care in the Pvt pkg,so
2345   --  Calling private pkg instead.
2346   ----------------------------------------------------------------------------
2347   PROCEDURE Create_Category_Assignment
2348   (
2349     p_api_version       IN   NUMBER,
2350     p_init_msg_list     IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
2351     p_commit            IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
2352     x_return_status     OUT  NOCOPY VARCHAR2,
2353     x_errorcode         OUT  NOCOPY NUMBER,
2354     x_msg_count         OUT  NOCOPY NUMBER,
2355     x_msg_data          OUT  NOCOPY VARCHAR2,
2356     p_category_id       IN   NUMBER,
2357     p_category_set_id   IN   NUMBER,
2358     p_inventory_item_id IN   NUMBER,
2359     p_organization_id   IN   NUMBER
2360   )
2361   IS
2362     -- Start OF comments
2363     -- API name  : Create_Category_Assignment
2364     -- TYPE      : Public
2365     -- Pre-reqs  : None
2366     -- FUNCTION  : Create an item category assignment.
2367     --
2368     -- Version: Current Version 0.1
2369     -- Previous Version :  None
2370     -- Notes  : Stub Version
2371     --
2372     -- END OF comments
2373      l_api_name              CONSTANT VARCHAR2(30)      := 'Create_Category_Assignment';
2374      -- On addition of any Required parameters the major version needs
2375      -- to change i.e. for eg. 1.X to 2.X.
2376      -- On addition of any Optional parameters the minor version needs
2377      -- to change i.e. for eg. X.6 to X.7.
2378      l_api_version           CONSTANT NUMBER := 1.0;
2379 
2380     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
2381   BEGIN
2382 
2383         -- Standard Start of API savepoint
2384         SAVEPOINT       Create_Category_Assignment_PUB;
2385 
2386         -- Check for call compatibility.
2387         IF NOT FND_API.Compatible_API_Call (l_api_version,
2388                                                 p_api_version   ,
2389                                                 l_api_name      ,
2390                                                 G_PKG_NAME)
2391         THEN
2392              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2393         END IF;
2394         -- Initialize API message list if necessary.
2395         -- Initialize message list if p_init_msg_list is set to TRUE.
2396         IF FND_API.to_Boolean( p_init_msg_list ) THEN
2397                 FND_MSG_PUB.initialize;
2398         END IF;
2399         INV_ITEM_MSG.set_Message_Mode('PLSQL');
2400 
2401         IF FND_MSG_PUB.Check_Msg_Level
2402           (FND_MSG_PUB.G_MSG_LVL_SUCCESS)
2403         THEN
2404          INV_ITEM_MSG.set_Message_Level(INV_ITEM_MSG.g_Level_Warning);
2405         END IF;
2406 
2407         INV_ITEM_CATEGORY_PVT.Create_Category_Assignment
2408         (
2409            p_api_version        => p_api_version
2410         ,  p_init_msg_list      => p_init_msg_list
2411         ,  p_commit             => p_commit
2412         ,  p_validation_level   => INV_ITEM_CATEGORY_PVT.g_VALIDATE_ALL
2413         ,  p_inventory_item_id  => p_inventory_item_id
2414         ,  p_organization_id    => p_organization_id
2415         ,  p_category_set_id    => p_category_set_id
2416         ,  p_category_id        => p_category_id
2417         ,  x_return_status      => x_return_status
2418         ,  x_msg_count          => x_msg_count
2419         ,  x_msg_data           => x_msg_data
2420         );
2421 
2422        --add by geguo business event enhancement 8351807
2423        BEGIN
2424 
2425          IF (l_debug = 1) THEN
2426              mdebug('begin Raise EGO_WF_WRAPPER_PVT.G_ITEM_CAT_ASSIGN_EVENT business event');
2427          END IF;
2428          IF (x_return_status = fnd_api.g_RET_STS_SUCCESS) THEN
2429 
2430            INV_ITEM_EVENTS_PVT.Raise_Events (
2431              p_commit             => FND_API.To_Boolean(p_commit)
2432              ,p_event_name        => 'EGO_WF_WRAPPER_PVT.G_ITEM_CAT_ASSIGN_EVENT'
2433              ,p_dml_type          => 'CREATE'
2434              ,p_inventory_item_id => p_inventory_item_id
2435              ,p_organization_id   => p_organization_id
2436              ,p_category_set_id   => p_category_set_id
2437              ,p_category_id       => p_category_id
2438              ,p_old_category_id   => null
2439              );
2440          END IF;
2441          IF (l_debug = 1) THEN
2442              mdebug('end Raise EGO_WF_WRAPPER_PVT.G_ITEM_CAT_ASSIGN_EVENT business event');
2443          END IF;
2444 
2445          EXCEPTION
2446            WHEN OTHERS THEN
2447              IF (l_debug = 1) THEN
2448                mdebug('error occured when Raise EGO_WF_WRAPPER_PVT.G_ITEM_CAT_ASSIGN_EVENT business event');
2449              END IF;
2450        END;
2451         --mdebug('Create_Category_Assignment: Done!!');
2452           -- Standard check of p_commit.
2453         IF FND_API.To_Boolean( p_commit ) THEN
2454                 COMMIT WORK;
2455         END IF;
2456 
2457       INV_ITEM_MSG.Write_List;
2458       FND_MSG_PUB.Count_And_Get
2459                 (       p_count        =>      x_msg_count,
2460                         p_data         =>      x_msg_data
2461                 );
2462 
2463 EXCEPTION
2464     WHEN FND_API.G_EXC_ERROR THEN
2465                 ROLLBACK TO Create_Category_Assignment_PUB;
2466                 x_return_status := FND_API.G_RET_STS_ERROR;
2467                 FND_MSG_PUB.Count_And_Get
2468                 (       p_count        =>      x_msg_count,
2469                         p_data         =>      x_msg_data
2470                 );
2471         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2472                 ROLLBACK TO Create_Category_Assignment_PUB;
2473                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2474                 FND_MSG_PUB.Count_And_Get
2475                 (       p_count        =>      x_msg_count,
2476                         p_data         =>      x_msg_data
2477                 );
2478         WHEN OTHERS THEN
2479                 ROLLBACK TO Create_Category_Assignment_PUB;
2480                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2481                 IF      FND_MSG_PUB.Check_Msg_Level
2482                         (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2483                 THEN
2484                         FND_MSG_PUB.Add_Exc_Msg
2485                         (       G_PKG_NAME          ,
2486                                 l_api_name
2487                         );
2488                 END IF;
2489                 FND_MSG_PUB.Count_And_Get
2490                 (       p_count        =>      x_msg_count,
2491                         p_data         =>      x_msg_data
2492                 );
2493 
2494   END Create_Category_Assignment;
2495   ----------------------------------------------------------------------------
2496 
2497 
2498   -- 6. Delete_Category_Assignment
2499   ----------------------------------------------------------------------------
2500   PROCEDURE Delete_Category_Assignment
2501   (
2502     p_api_version       IN   NUMBER,
2503     p_init_msg_list     IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
2504     p_commit            IN   VARCHAR2 DEFAULT FND_API.G_FALSE,
2505     x_return_status     OUT  NOCOPY VARCHAR2,
2506     x_errorcode         OUT  NOCOPY NUMBER,
2507     x_msg_count         OUT  NOCOPY NUMBER,
2508     x_msg_data          OUT  NOCOPY VARCHAR2,
2509     p_category_id       IN   NUMBER,
2510     p_category_set_id   IN   NUMBER,
2511     p_inventory_item_id IN   NUMBER,
2512     p_organization_id   IN   NUMBER
2513   )
2514   IS
2515     -- Start OF comments
2516     -- API name  : Delete_Category_Assignment
2517     -- TYPE      : Public
2518     -- Pre-reqs  : None
2519     -- FUNCTION  : Delete an item category assignment.
2520     --
2521     -- Version: Current Version 0.1
2522     -- Previous Version :  None
2523     -- Notes  : Stub Version
2524     --
2525     -- END OF comments
2526      l_api_name              CONSTANT VARCHAR2(30)      := 'Delete_Category_Assignment';
2527      -- On addition of any Required parameters the major version needs
2528      -- to change i.e. for eg. 1.X to 2.X.
2529      -- On addition of any Optional parameters the minor version needs
2530      -- to change i.e. for eg. X.6 to X.7.
2531      l_api_version           CONSTANT NUMBER    := 1.0;
2532      l_row_count             NUMBER;
2533     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
2534   BEGIN
2535         -- Standard Start of API savepoint
2536         SAVEPOINT       Delete_Category_Assignment_PUB;
2537 
2538         -- Check for call compatibility.
2539         IF NOT FND_API.Compatible_API_Call (l_api_version,
2540                                                 p_api_version   ,
2541                                                 l_api_name      ,
2542                                                 G_PKG_NAME)
2543         THEN
2544                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2545         END IF;
2546         -- Initialize API message list if necessary.
2547         -- Initialize message list if p_init_msg_list is set to TRUE.
2548         IF FND_API.to_Boolean( p_init_msg_list ) THEN
2549                 FND_MSG_PUB.initialize;
2550         END IF;
2551 --Added code for bug 2527058
2552         INV_ITEM_MSG.set_Message_Mode('PLSQL');
2553 
2554         IF FND_MSG_PUB.Check_Msg_Level
2555           (FND_MSG_PUB.G_MSG_LVL_SUCCESS)
2556         THEN
2557          INV_ITEM_MSG.set_Message_Level(INV_ITEM_MSG.g_Level_Warning);
2558         END IF;
2559 
2560         INV_ITEM_CATEGORY_PVT.Delete_Category_Assignment
2561         (
2562            p_api_version        => p_api_version
2563         ,  p_init_msg_list      => p_init_msg_list
2564         ,  p_commit             => p_commit
2565         ,  p_inventory_item_id  => p_inventory_item_id
2566         ,  p_organization_id    => p_organization_id
2567         ,  p_category_set_id    => p_category_set_id
2568         ,  p_category_id        => p_category_id
2569         ,  x_return_status      => x_return_status
2570         ,  x_msg_count          => x_msg_count
2571         ,  x_msg_data           => x_msg_data
2572         );
2573 
2574 /*      IF (l_debug = 1) THEN
2575         mdebug('Delete_Category_Assignment: Tracing...1');
2576         END IF;
2577 
2578         DELETE FROM mtl_item_categories
2579         WHERE category_set_id = p_category_set_id
2580           AND organization_id = p_organization_id
2581           AND inventory_item_id =  p_inventory_item_id
2582           AND category_id = p_category_id;
2583 
2584         IF (SQL%NOTFOUND) THEN
2585            IF (l_debug = 1) THEN
2586            mdebug('The specified Category Assignment not found');
2587            END IF;
2588            RAISE NO_DATA_FOUND;
2589         END IF;
2590 */
2591 --Ended code for bug 2527058
2592         IF (l_debug = 1) THEN
2593         mdebug('Delete_Category_Assignment: Done!!');
2594         END IF;
2595 
2596        --add by geguo business event enhancement 8351807
2597        BEGIN
2598          IF (l_debug = 1) THEN
2599              mdebug('begin Raise EGO_WF_WRAPPER_PVP.G_ITEM_CAT_ASSIGN_EVENT business event');
2600          END IF;
2601 
2602          dbms_output.put_line('return status: '|| x_return_status);
2603          IF (x_return_status = fnd_api.g_RET_STS_SUCCESS) THEN
2604            INV_ITEM_EVENTS_PVT.Raise_Events (
2605              p_commit             => FND_API.To_Boolean(p_commit)
2606              ,p_event_name        => 'EGO_WF_WRAPPER_PVT.G_ITEM_CAT_ASSIGN_EVENT'
2607              ,p_dml_type          => 'DELETE'
2608              ,p_inventory_item_id => p_inventory_item_id
2609              ,p_organization_id   => p_organization_id
2610              ,p_category_set_id   => p_category_set_id
2611              ,p_category_id       => p_category_id
2612              ,p_old_category_id   => null    --add by geguo.
2613              );
2614          END IF;
2615          IF (l_debug = 1) THEN
2616              mdebug('end Raise EGO_WF_WRAPPER_PVP.G_ITEM_CAT_ASSIGN_EVENT business event');
2617          END IF;
2618 
2619          EXCEPTION
2620            WHEN OTHERS THEN
2621              IF (l_debug = 1) THEN
2622                mdebug('error occured when Raise EGO_WF_WRAPPER_PVT.G_ITEM_CAT_ASSIGN_EVENT business event');
2623              END IF;
2624        END;
2625 
2626       -- Standard check of p_commit.
2627         IF FND_API.To_Boolean( p_commit ) THEN
2628                 COMMIT WORK;
2629         END IF;
2630 
2631 --      x_return_status := FND_API.G_RET_STS_SUCCESS;
2632         INV_ITEM_MSG.Write_List;
2633         -- Standard call to get message count and if count is 1,
2634         -- get message info.
2635         -- The client will directly display the x_msg_data (which is already
2636         -- translated) if the x_msg_count = 1;
2637         -- Else i.e if  x_msg_count > 1, client will call the FND_MSG_PUB.Get
2638         -- Server-side procedure to access the messages, and consolidate them
2639         -- and display (or) to display one message after another.
2640         FND_MSG_PUB.Count_And_Get
2641                 (       p_count        =>      x_msg_count,
2642                         p_data         =>      x_msg_data
2643                 );
2644 EXCEPTION
2645     WHEN FND_API.G_EXC_ERROR THEN
2646                 ROLLBACK TO Delete_Category_Assignment_PUB;
2647                 x_return_status := FND_API.G_RET_STS_ERROR;
2648                 FND_MSG_PUB.Count_And_Get
2649                 (       p_count        =>      x_msg_count,
2650                         p_data         =>      x_msg_data
2651                 );
2652         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2653                 ROLLBACK TO Delete_Category_Assignment_PUB;
2654                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2655                 FND_MSG_PUB.Count_And_Get
2656                 (       p_count        =>      x_msg_count,
2657                         p_data         =>      x_msg_data
2658                 );
2659         WHEN OTHERS THEN
2660                 ROLLBACK TO Delete_Category_Assignment_PUB;
2661                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2662                 IF      FND_MSG_PUB.Check_Msg_Level
2663                         (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2664                 THEN
2665                         FND_MSG_PUB.Add_Exc_Msg
2666                         (       G_PKG_NAME          ,
2667                                 l_api_name
2668                         );
2669                 END IF;
2670                 FND_MSG_PUB.Count_And_Get
2671                 (       p_count        =>      x_msg_count,
2672                         p_data         =>      x_msg_data
2673                 );
2674 
2675   END Delete_Category_Assignment;
2676   -----------------------------------------------------------------------------
2677   -- 7. Get_Category_Rec_Type
2678   ----------------------------------------------------------------------------
2679   FUNCTION Get_Category_Rec_Type
2680     RETURN INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE IS
2681     l_category_rec_type INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE ;
2682     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
2683   BEGIN
2684     RETURN l_category_rec_type;
2685   END;
2686 
2687   -----------------------------------------------------------------------------
2688   -- 8. Validate_iProcurements_flags
2689   --Bug: 2645153 validating structure and iProcurement flags
2690   ----------------------------------------------------------------------------
2691   PROCEDURE Validate_iProcurements_flags
2692   (
2693     x_category_rec  IN INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE
2694    ) IS
2695 
2696   l_po_structure_id NUMBER;
2697   --Bug: 2645153 added coide to get purchasing category structure id
2698   CURSOR get_po_structure_id IS
2699     SELECT STRUCTURE_ID
2700      FROM MTL_CATEGORY_SETS MCS,
2701           MTL_DEFAULT_CATEGORY_SETS MDCS
2702      WHERE  FUNCTIONAL_AREA_ID = 2
2703       AND    MCS.CATEGORY_SET_ID = MDCS.CATEGORY_SET_ID;
2704 
2705     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
2706    BEGIN
2707         IF (l_debug = 1) THEN
2708         mdebug('checking supplier enabled flag information provided'|| x_category_rec.supplier_enabled_flag);
2709         END IF;
2710 	   /* Bug 11787356. Comment out following IF condition. We should allow 'Y', 'N' and NULL as the values of SUPPLIER_ENABLED_FLAG.
2711            IF x_category_rec.supplier_enabled_flag NOT IN (g_YES,g_MISS_CHAR) THEN -- g_NO is modifed to g_YES for bug#6278190
2712                 fnd_message.set_name('INV','INV_NOT_VALID_FLAG');
2713                 fnd_message.set_token('COLUMN_NAME', 'SUPPLIER_ENABLED_FLAG');
2714                 fnd_msg_pub.ADD;
2715                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
2716                 IF (l_debug = 1) THEN
2717                 mdebug('Invalid supplier enabled flag information provided');
2718                 END IF;
2719            END IF;*/
2720         IF (l_debug = 1) THEN
2721         mdebug('checking web status flag information provided');
2722         END IF;
2723 /*Bug: 4494727 Commenting out the following IF condition
2724            IF x_category_rec.web_status NOT IN (g_YES,g_MISS_CHAR)  THEN
2725                 fnd_message.set_name('INV','INV_NOT_VALID_FLAG');
2726                 fnd_message.set_token('COLUMN_NAME', 'WEB_STATUS');
2727                 fnd_msg_pub.ADD;
2728                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
2729                 IF (l_debug = 1) THEN
2730                 mdebug('Invalid web status flag information provided');
2731                 END IF;
2732            END IF;
2733 */
2734            IF  (x_category_rec.supplier_enabled_flag = g_NO) --OR  Bug: 4494727
2735 --                (x_category_rec.web_status = g_YES)
2736            THEN
2737              OPEN get_po_structure_id;
2738              FETCH get_po_structure_id INTO l_po_structure_id;
2739              IF (get_po_structure_id%NOTFOUND) THEN
2740                 fnd_message.set_name('INV','INV_NO_DEFAULT_CSET');
2741                 fnd_msg_pub.ADD;
2742                 IF (l_debug = 1) THEN
2743                 mdebug('No Default purchasing category set  provided');
2744                 END IF;
2745                 CLOSE  get_po_structure_id;
2746                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
2747              ELSE
2748               IF (l_po_structure_id <> x_category_rec.structure_id) THEN
2749                IF  (x_category_rec.supplier_enabled_flag = g_NO) THEN
2750                 fnd_message.set_name('INV','INV_SUP_ENABLED_PO_CAT_ONLY');
2751                 fnd_msg_pub.ADD;
2752                END IF;
2753 /*Bug: 4494727      Commenting out the following IF condition
2754                IF  (x_category_rec.web_status = g_YES) THEN
2755                 fnd_message.set_name('INV','INV_CAT_ENABLED_PO_CAT_ONLY');
2756                 fnd_msg_pub.ADD;
2757                END IF;
2758 */
2759                 IF (l_debug = 1) THEN
2760                    mdebug('Only purchasing cat can be viewable by supplier');
2761                 END IF;
2762                 CLOSE  get_po_structure_id;
2763                 RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
2764               END IF;
2765              END IF;
2766              CLOSE  get_po_structure_id;
2767           END IF; --if flag = 'Y'
2768  END Validate_iProcurements_flags;
2769 
2770   ----------------------------------------------------------------------------
2771   -- 9.  Create Valid Category
2772   -- Bug: 3093555
2773   -- API to create a valid Category in Category Sets
2774   ----------------------------------------------------------------------------
2775   PROCEDURE Create_Valid_Category(
2776     p_api_version         IN  NUMBER,
2777     p_init_msg_list       IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
2778     p_commit              IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
2779     p_category_set_id     IN  NUMBER,
2780     p_category_id         IN  NUMBER,
2781     p_parent_category_id  IN  NUMBER,
2782     x_return_status       OUT  NOCOPY VARCHAR2,
2783     x_errorcode           OUT  NOCOPY NUMBER,
2784     x_msg_count           OUT  NOCOPY NUMBER,
2785     x_msg_data            OUT  NOCOPY VARCHAR2
2786   ) IS
2787     -- Start OF comments
2788     -- API name  : Create_Valid_Category
2789     -- TYPE      : Public
2790     -- Pre-reqs  : None
2791     -- FUNCTION  : Create a record in mtl_category_set_valid_cats.
2792     --
2793     -- Version: Current Version 1.0
2794     -- Previous Version :  None
2795     -- Notes  : Stub Version
2796     --
2797     -- END OF comments
2798     l_api_name    CONSTANT VARCHAR2(30)  := 'Create_Valid_Category';
2799     -- On addition of any Required parameters the major version needs
2800     -- to change i.e. for eg. 1.X to 2.X.
2801     -- On addition of any Optional parameters the minor version needs
2802     -- to change i.e. for eg. X.6 to X.7.
2803     l_api_version CONSTANT NUMBER         := 1.0;
2804     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
2805     -- who column variables
2806     l_user_id        mtl_category_set_valid_cats.created_by%TYPE;
2807     l_login_id       mtl_category_set_valid_cats.last_update_login%TYPE;
2808     l_request_id     mtl_category_set_valid_cats.request_id%TYPE;
2809     l_prog_appl_id   mtl_category_set_valid_cats.program_application_id%TYPE;
2810     l_program_id     mtl_category_set_valid_cats.program_id%TYPE;
2811   BEGIN
2812     IF l_debug = 1 THEN
2813       mdebug('Create_Valid_Category: Tracing...1');
2814     END IF;
2815     -- Standard Start of API savepoint
2816     IF FND_API.To_Boolean( p_commit ) THEN
2817       SAVEPOINT    Create_Valid_Category_PUB;
2818     END IF;
2819     -- Check for call compatibility.
2820     IF NOT FND_API.Compatible_API_Call (l_api_version,
2821                                         p_api_version,
2822                                         l_api_name,
2823                                         G_PKG_NAME) THEN
2824     IF l_debug = 1 THEN
2825       mdebug('Create_Valid_Category: Invalid API Call');
2826     END IF;
2827       RAISE FND_API.g_EXC_ERROR;
2828     END IF;
2829     -- Initialize API message list if necessary.
2830     -- Initialize message list if p_init_msg_list is set to TRUE.
2831     IF FND_API.to_Boolean( p_init_msg_list ) THEN
2832       FND_MSG_PUB.initialize;
2833     END IF;
2834     IF validate_category_set_params
2835         (p_validation_type    => G_INSERT
2836         ,p_category_set_id    => p_category_set_id
2837         ,p_category_id        => p_category_id
2838         ,p_parent_category_id => p_parent_category_id
2839         ,p_calling_api        => l_api_name
2840         ) THEN
2841       IF l_debug = 1 THEN
2842         mdebug('Create_Valid_Category: Inserting data into category sets ');
2843       END IF;
2844       l_user_id  := fnd_global.user_id;
2845       l_login_id := fnd_global.login_id;
2846       IF l_login_id = -1 THEN
2847         l_login_id := fnd_global.conc_login_id;
2848       END IF;
2849       l_request_id         := fnd_global.conc_request_id;
2850       l_prog_appl_id       := fnd_global.prog_appl_id;
2851       l_program_id         := fnd_global.conc_program_id;
2852       INSERT INTO mtl_category_set_valid_cats
2853         ( category_set_id
2854         , category_id
2855         , parent_category_id
2856         , created_by
2857         , creation_date
2858         , last_updated_by
2859         , last_update_date
2860         , last_update_login
2861         , request_id
2862         , program_application_id
2863         , program_id
2864         , program_update_date
2865         )
2866       VALUES
2867         ( p_category_set_id
2868         , p_category_id
2869         , p_parent_category_id
2870         , l_user_id
2871         , SYSDATE
2872         , l_user_id
2873         , SYSDATE
2874         , l_login_id
2875         , l_request_id
2876         , l_prog_appl_id
2877         , l_program_id
2878         , SYSDATE
2879       );
2880     ELSE
2881       -- passed parameters are invalid
2882       RAISE FND_API.G_EXC_ERROR;
2883     END IF;
2884 
2885     -- Standard check of p_commit.
2886     IF FND_API.To_Boolean( p_commit ) THEN
2887       COMMIT WORK;
2888     END IF;
2889 
2890     x_return_status := FND_API.G_RET_STS_SUCCESS;
2891     -- Standard call to get message count and if count is 1,
2892     -- get message info.
2893     -- The client will directly display the x_msg_data (which is already
2894     -- translated) if the x_msg_count = 1;
2895     -- Else i.e if  x_msg_count > 1, client will call the FND_MSG_PUB.Get
2896     -- Server-side procedure to access the messages, and consolidate them
2897     -- and display (or) to display one message after another.
2898     FND_MSG_PUB.Count_And_Get
2899         (       p_count        =>      x_msg_count,
2900                 p_data         =>      x_msg_data
2901         );
2902 
2903   EXCEPTION
2904     WHEN FND_API.G_EXC_ERROR THEN
2905         IF l_debug = 1 THEN
2906           mdebug('Create_Valid_Category: Apps Exception raised');
2907         END IF;
2908         IF FND_API.To_Boolean( p_commit ) THEN
2909           ROLLBACK TO Create_Valid_Category_PUB;
2910         END IF;
2911         x_return_status := FND_API.G_RET_STS_ERROR;
2912         FND_MSG_PUB.Count_And_Get
2913         (       p_count        =>      x_msg_count,
2914                 p_data         =>      x_msg_data
2915         );
2916     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2917         IF l_debug = 1 THEN
2918           mdebug('Create_Valid_Category: Apps Unexpected Error');
2919         END IF;
2920         IF FND_API.To_Boolean( p_commit ) THEN
2921           ROLLBACK TO Create_Valid_Category_PUB;
2922         END IF;
2923         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2924         FND_MSG_PUB.Count_And_Get
2925         (       p_count        =>      x_msg_count,
2926                 p_data         =>      x_msg_data
2927         );
2928     WHEN OTHERS THEN
2929         IF l_debug = 1 THEN
2930           mdebug('Create_Valid_Category: Exception -- OTHERS ');
2931         END IF;
2932         IF FND_API.To_Boolean( p_commit ) THEN
2933           ROLLBACK TO Create_Valid_Category_PUB;
2934         END IF;
2935         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2936         IF      FND_MSG_PUB.Check_Msg_Level
2937                 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2938         THEN
2939           FND_MSG_PUB.Add_Exc_Msg
2940           (     G_PKG_NAME          ,
2941                 l_api_name
2942           );
2943         END IF;
2944         FND_MSG_PUB.Count_And_Get
2945         (       p_count        =>      x_msg_count,
2946                 p_data         =>      x_msg_data
2947         );
2948   END Create_Valid_Category;
2949 
2950   ----------------------------------------------------------------------------
2951   -- 10.  Update Category
2952   -- Bug: 3093555
2953   -- API to update a valid Category
2954   ----------------------------------------------------------------------------
2955   PROCEDURE Update_Valid_Category(
2956     p_api_version         IN  NUMBER,
2957     p_init_msg_list       IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
2958     p_commit              IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
2959     p_category_set_id     IN  NUMBER,
2960     p_category_id         IN  NUMBER,
2961     p_parent_category_id  IN  NUMBER,
2962     x_return_status       OUT  NOCOPY VARCHAR2,
2963     x_errorcode           OUT  NOCOPY NUMBER,
2964     x_msg_count           OUT  NOCOPY NUMBER,
2965     x_msg_data            OUT  NOCOPY VARCHAR2
2966   ) IS
2967     -- Start OF comments
2968     -- API name  : Update_Valid_Category
2969     -- TYPE      : Public
2970     -- Pre-reqs  : None
2971     -- FUNCTION  : Update record in mtl_category_set_valid_cats.
2972     --
2973     -- Version: Current Version 1.0
2974     -- Previous Version :  None
2975     -- Notes  : Stub Version
2976     --
2977     -- END OF comments
2978     l_api_name    CONSTANT VARCHAR2(30)  := 'Update_Valid_Category';
2979     -- On addition of any Required parameters the major version needs
2980     -- to change i.e. for eg. 1.X to 2.X.
2981     -- On addition of any Optional parameters the minor version needs
2982     -- to change i.e. for eg. X.6 to X.7.
2983     l_api_version CONSTANT NUMBER         := 1.0;
2984     l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
2985     l_user_id        mtl_category_set_valid_cats.created_by%TYPE;
2986     l_login_id       mtl_category_set_valid_cats.last_update_login%TYPE;
2987   BEGIN
2988     IF l_debug = 1 THEN
2989       mdebug('Update_Valid_Category: Tracing...1');
2990     END IF;
2991     -- Standard Start of API savepoint
2992     IF FND_API.To_Boolean( p_commit ) THEN
2993       SAVEPOINT    Update_Valid_Category_PUB;
2994     END IF;
2995     -- Check for call compatibility.
2996     IF NOT FND_API.Compatible_API_Call (l_api_version,
2997                                         p_api_version,
2998                                         l_api_name,
2999                                         G_PKG_NAME) THEN
3000       IF l_debug = 1 THEN
3001         mdebug('Update_Valid_Category: Invalid API call');
3002       END IF;
3003       RAISE FND_API.g_EXC_ERROR;
3004     END IF;
3005     -- Initialize API message list if necessary.
3006     -- Initialize message list if p_init_msg_list is set to TRUE.
3007     IF FND_API.to_Boolean( p_init_msg_list ) THEN
3008       FND_MSG_PUB.initialize;
3009     END IF;
3010 
3011     IF validate_category_set_params
3012         (p_validation_type    => G_UPDATE
3013         ,p_category_set_id    => p_category_set_id
3014         ,p_category_id        => p_category_id
3015         ,p_parent_category_id => p_parent_category_id
3016         ,p_calling_api        => l_api_name
3017         ) THEN
3018       l_user_id  := fnd_global.user_id;
3019       l_login_id := fnd_global.login_id;
3020       IF l_login_id = -1 THEN
3021         l_login_id := fnd_global.conc_login_id;
3022       END IF;
3023       IF l_debug = 1 THEN
3024         mdebug('Update_Valid_Category: About to update the category record');
3025       END IF;
3026       UPDATE  mtl_category_set_valid_cats
3027       SET parent_category_id = p_parent_category_id
3028          ,last_updated_by    = l_user_id
3029          ,last_update_date   = SYSDATE
3030          ,last_update_login  = l_login_id
3031       WHERE category_set_id = p_category_set_id
3032        AND category_id = p_category_id;
3033       IF (SQL%NOTFOUND) THEN
3034         IF l_debug = 1 THEN
3035           mdebug('Update_Valid_Category: Record not available for update');
3036         END IF;
3037         fnd_message.set_name('INV','INV_CATEGORY_UNAVAIL_UPDATE');
3038         fnd_msg_pub.ADD;
3039         RAISE fnd_api.g_EXC_UNEXPECTED_ERROR;
3040       END IF;
3041     ELSE
3042       -- passed parameters are invalid
3043       RAISE FND_API.G_EXC_ERROR;
3044     END IF;
3045     -- Standard check of p_commit.
3046     IF FND_API.To_Boolean( p_commit ) THEN
3047       COMMIT WORK;
3048     END IF;
3049 
3050     x_return_status := FND_API.G_RET_STS_SUCCESS;
3051     -- Standard call to get message count and if count is 1,
3052     -- get message info.
3053     -- The client will directly display the x_msg_data (which is already
3054     -- translated) if the x_msg_count = 1;
3055     -- Else i.e if  x_msg_count > 1, client will call the FND_MSG_PUB.Get
3056     -- Server-side procedure to access the messages, and consolidate them
3057     -- and display (or) to display one message after another.
3058     FND_MSG_PUB.Count_And_Get
3059         (       p_count        =>      x_msg_count,
3060                 p_data         =>      x_msg_data
3061         );
3062 
3063   EXCEPTION
3064     WHEN FND_API.G_EXC_ERROR THEN
3065         IF l_debug = 1 THEN
3066           mdebug('Update_Valid_Category: Apps Exception raised');
3067         END IF;
3068         IF FND_API.To_Boolean( p_commit ) THEN
3069           ROLLBACK TO Update_Valid_Category_PUB;
3070         END IF;
3071         x_return_status := FND_API.G_RET_STS_ERROR;
3072         FND_MSG_PUB.Count_And_Get
3073         (       p_count        =>      x_msg_count,
3074                 p_data         =>      x_msg_data
3075         );
3076     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3077         IF l_debug = 1 THEN
3078           mdebug('Update_Valid_Category: Apps Unexpected Error');
3079         END IF;
3080         IF FND_API.To_Boolean( p_commit ) THEN
3081           ROLLBACK TO Update_Valid_Category_PUB;
3082         END IF;
3083         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3084         FND_MSG_PUB.Count_And_Get
3085         (       p_count        =>      x_msg_count,
3086                 p_data         =>      x_msg_data
3087         );
3088     WHEN OTHERS THEN
3089         IF l_debug = 1 THEN
3090           mdebug('Update_Valid_Category: Exception -- OTHERS ');
3091         END IF;
3092         IF FND_API.To_Boolean( p_commit ) THEN
3093           ROLLBACK TO Update_Valid_Category_PUB;
3094         END IF;
3095         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3096         IF      FND_MSG_PUB.Check_Msg_Level
3097                 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
3098         THEN
3099                 FND_MSG_PUB.Add_Exc_Msg
3100                 (       G_PKG_NAME          ,
3101                         l_api_name
3102                 );
3103         END IF;
3104         FND_MSG_PUB.Count_And_Get
3105         (       p_count        =>      x_msg_count,
3106                 p_data         =>      x_msg_data
3107         );
3108   END Update_Valid_Category;
3109 
3110   ----------------------------------------------------------------------------
3111   -- 11.  Delete Category
3112   -- Bug: 3093555
3113   -- API to Delete a valid Category
3114   ----------------------------------------------------------------------------
3115   PROCEDURE Delete_Valid_Category(
3116     p_api_version         IN  NUMBER,
3117     p_init_msg_list       IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
3118     p_commit              IN  VARCHAR2 DEFAULT FND_API.G_FALSE,
3119     p_category_set_id     IN  NUMBER,
3120     p_category_id         IN  NUMBER,
3121     x_return_status       OUT  NOCOPY VARCHAR2,
3122     x_errorcode           OUT  NOCOPY NUMBER,
3123     x_msg_count           OUT  NOCOPY NUMBER,
3124     x_msg_data            OUT  NOCOPY VARCHAR2
3125   ) IS
3126     -- Start OF comments
3127     -- API name  : Delete_Valid_Category
3128     -- TYPE      : Public
3129     -- Pre-reqs  : None
3130     -- FUNCTION  : Delete the record from mtl_category_set_valid_cats.
3131     --
3132     -- Version: Current Version 1.0
3133     -- Previous Version :  None
3134     -- Notes  : Stub Version
3135     --
3136     -- END OF comments
3137     l_api_name    CONSTANT VARCHAR2(30)  := 'Delete_Valid_Category';
3138     -- On addition of any Required parameters the major version needs
3139     -- to change i.e. for eg. 1.X to 2.X.
3140     -- On addition of any Optional parameters the minor version needs
3141     -- to change i.e. for eg. X.6 to X.7.
3142     l_api_version CONSTANT NUMBER         := 1.0;
3143     l_count        NUMBER;
3144     l_debug        NUMBER := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
3145     l_description  mtl_categories_vl.description%TYPE;
3146     l_category_id  mtl_category_set_valid_cats.category_id%TYPE;
3147     l_def_category_id    mtl_category_sets_b.default_category_id%TYPE;
3148     l_hrchy_enabled   mtl_category_sets_b.hierarchy_enabled%TYPE;
3149 
3150     CURSOR c_get_cat_desc (cp_category_id IN  NUMBER) IS
3151     SELECT description
3152     FROM mtl_categories_vl
3153     WHERE category_id =  cp_category_id;
3154 
3155     --Added for bug 5219692
3156     CURSOR c_get_items_in_cat (cp_category_id      IN  NUMBER
3157                               ,cp_category_set_id  IN NUMBER) IS
3158     SELECT category_id
3159     FROM   mtl_item_categories item_cat
3160     WHERE  item_cat.category_id     = cp_category_id
3161       AND  item_cat.category_set_id = cp_category_set_id
3162       AND rownum = 1;
3163 
3164     CURSOR c_get_items_in_cat_hrchy (cp_category_id      IN  NUMBER
3165                               ,cp_category_set_id  IN NUMBER) IS
3166     SELECT valid_cats.category_id
3167     FROM   mtl_category_set_valid_cats  valid_cats
3168     WHERE EXISTS
3169         (SELECT 'X'
3170          FROM   mtl_item_categories item_cat
3171          WHERE  item_cat.category_id = valid_cats.category_id
3172            AND  item_cat.category_set_id = cp_category_set_id
3173         )
3174     CONNECT BY PRIOR
3175            valid_cats.category_id = valid_cats.parent_category_id
3176        AND valid_cats.category_set_id =  cp_category_set_id
3177     START WITH
3178            valid_cats.category_id = cp_category_id
3179        AND category_set_id = cp_category_set_id
3180     AND rownum = 1;
3181 
3182    --Added for bug 5219692
3183    CURSOR c_check_default_cat (cp_category_id  IN  NUMBER
3184                               ,cp_category_set_id IN NUMBER) IS
3185    SELECT cat_sets.default_category_id
3186    FROM   mtl_category_sets_b cat_sets
3187    WHERE cat_sets.category_set_id        = p_category_set_id
3188      AND cat_sets.default_category_id    = p_category_id
3189      AND NVL(cat_sets.validate_flag,'N') = 'Y';
3190 
3191    CURSOR c_check_default_cat_hrchy (cp_category_id  IN  NUMBER
3192                                     ,cp_category_set_id IN NUMBER) IS
3193    SELECT cat_sets.default_category_id
3194    FROM   mtl_category_sets_b cat_sets
3195    WHERE cat_sets.category_set_id = p_category_set_id
3196      AND EXISTS
3197         (SELECT 'X'
3198          FROM   mtl_category_set_valid_cats check_cats
3199          WHERE  check_cats.category_id = cat_sets.default_category_id
3200          CONNECT BY PRIOR
3201                 check_cats.category_id = check_cats.parent_category_id
3202             AND check_cats.category_set_id = cp_category_set_id
3203          START WITH
3204                 check_cats.category_id = cp_category_id
3205             AND check_cats.category_set_id = cp_category_set_id
3206         )
3207     AND NVL(cat_sets.validate_flag,'N') = 'Y';
3208 
3209 
3210   BEGIN
3211     IF l_debug = 1 THEN
3212       mdebug('Delete_Valid_Category: Tracing...1');
3213     END IF;
3214     -- Standard Start of API savepoint
3215     IF FND_API.To_Boolean( p_commit ) THEN
3216       SAVEPOINT    Delete_Valid_Category_PUB;
3217     END IF;
3218     -- Check for call compatibility.
3219     IF NOT FND_API.Compatible_API_Call (l_api_version,
3220                                         p_api_version,
3221                                         l_api_name,
3222                                         G_PKG_NAME) THEN
3223       IF l_debug = 1 THEN
3224         mdebug('Delete_Valid_Category: Invalid API call');
3225       END IF;
3226       RAISE FND_API.G_EXC_ERROR;
3227     END IF;
3228     -- Initialize API message list if necessary.
3229     -- Initialize message list if p_init_msg_list is set to TRUE.
3230     IF FND_API.to_Boolean( p_init_msg_list ) THEN
3231       FND_MSG_PUB.initialize;
3232     END IF;
3233 
3234     IF (p_category_set_id  IS NULL OR  p_category_id IS NULL) THEN
3235       IF l_debug = 1 THEN
3236         mdebug('Delete_Valid_Category: Mandatory parameters missing');
3237       END IF;
3238       fnd_message.set_name('INV','INV_MISSING_REQUIRED_PARAMETER');
3239       fnd_msg_pub.ADD;
3240       RAISE fnd_api.G_EXC_ERROR;
3241     END IF;
3242 
3243     IF NOT get_category_set_type(p_category_set_id => p_category_set_id
3244                                 ,p_category_id     => p_category_id
3245 				,x_hrchy_enabled   => l_hrchy_enabled) THEN
3246       IF l_debug = 1 THEN
3247         mdebug('Delete_Valid_Category: Record not available for deletion');
3248       END IF;
3249       fnd_message.set_name('INV','INV_CATEGORY_UNAVAIL_DELETE');
3250       fnd_msg_pub.ADD;
3251       RAISE fnd_api.g_EXC_ERROR;
3252     END IF;
3253 
3254     -- check if the user tries to delete default cateogy of the category set
3255     IF UPPER(l_hrchy_enabled) = 'Y' THEN
3256        OPEN c_check_default_cat_hrchy (cp_category_id => p_category_id
3257                                       ,cp_category_set_id => p_category_set_id);
3258        FETCH c_check_default_cat_hrchy INTO l_def_category_id;
3259        IF c_check_default_cat_hrchy%NOTFOUND THEN
3260          l_def_category_id := NULL;
3261        END IF;
3262        CLOSE c_check_default_cat_hrchy;
3263     ELSE
3264        OPEN c_check_default_cat(cp_category_id => p_category_id
3265                                ,cp_category_set_id => p_category_set_id);
3266        FETCH c_check_default_cat INTO l_def_category_id;
3267        IF c_check_default_cat%NOTFOUND THEN
3268          l_def_category_id := NULL;
3269        END IF;
3270        CLOSE c_check_default_cat;
3271     END IF;
3272 
3273     IF l_def_category_id IS NOT NULL THEN
3274       -- default category is in the hierarchy
3275       IF l_debug = 1 THEN
3276         mdebug('Delete_Valid_Category: Cannot delete default category');
3277       END IF;
3278       OPEN c_get_cat_desc (cp_category_id => l_def_category_id);
3279       FETCH c_get_cat_desc INTO l_description;
3280       IF c_get_cat_desc%NOTFOUND THEN
3281         l_description := NULL;
3282       END IF;
3283       fnd_message.set_name('INV','INV_DELETE_DEF_CAT_ERR');
3284       fnd_message.set_token('CATEGORY_NAME', l_description);
3285       fnd_msg_pub.ADD;
3286       RAISE fnd_api.G_EXC_ERROR;
3287     END IF;
3288 
3289     -- check if there are any items associated to the category / category set
3290     IF UPPER(l_hrchy_enabled) = 'Y' THEN
3291        OPEN c_get_items_in_cat_hrchy (cp_category_id     => p_category_id
3292                                      ,cp_category_set_id => p_category_set_id);
3293        FETCH c_get_items_in_cat_hrchy INTO l_category_id;
3294        IF c_get_items_in_cat_hrchy%NOTFOUND THEN
3295          l_category_id := NULL;
3296        END IF;
3297        CLOSE c_get_items_in_cat_hrchy;
3298     ELSE
3299        OPEN c_get_items_in_cat (cp_category_id     => p_category_id
3300                                ,cp_category_set_id => p_category_set_id);
3301        FETCH c_get_items_in_cat INTO l_category_id;
3302        IF c_get_items_in_cat%NOTFOUND THEN
3303          l_category_id := NULL;
3304        END IF;
3305       CLOSE c_get_items_in_cat;
3306     END IF;
3307 
3308     IF l_category_id IS NULL THEN
3309       IF l_debug = 1 THEN
3310         mdebug('Delete_Valid_Category: No items associated! Delete now');
3311       END IF;
3312 
3313       IF UPPER(l_hrchy_enabled) = 'Y' THEN
3314          DELETE mtl_category_set_valid_cats delete_cats
3315          WHERE category_set_id = p_category_set_id
3316            AND EXISTS
3317              (SELECT 'X'
3318               FROM  mtl_category_set_valid_cats
3319               WHERE category_id = delete_cats.category_id
3320               CONNECT BY PRIOR category_id = parent_category_id
3321                      AND category_set_id = p_category_set_id
3322               START WITH category_id = p_category_id
3323                     AND category_set_id = p_category_set_id
3324              );
3325        ELSE --Added else part for bug 5219692
3326          DELETE mtl_category_set_valid_cats delete_cats
3327          WHERE category_set_id = p_category_set_id
3328 	   AND category_id     = p_category_id;
3329 
3330        END IF;
3331     ELSE
3332       IF l_debug = 1 THEN
3333         mdebug('Delete_Valid_Category: Items ASSOCIATED!! ');
3334       END IF;
3335       OPEN c_get_cat_desc (cp_category_id => l_def_category_id);
3336       FETCH c_get_cat_desc INTO l_description;
3337       IF c_get_cat_desc%NOTFOUND THEN
3338         l_description := NULL;
3339       END IF;
3340       fnd_message.set_name('INV','INV_CATEGORY_ITEMS_EXIST');
3341       fnd_message.set_token('CATEGORY_NAME', l_description);
3342       fnd_msg_pub.ADD;
3343       RAISE FND_API.G_EXC_ERROR;
3344     END IF;
3345 
3346     -- Standard check of p_commit.
3347     IF FND_API.To_Boolean( p_commit ) THEN
3348       COMMIT WORK;
3349     END IF;
3350 
3351     x_return_status := FND_API.G_RET_STS_SUCCESS;
3352     -- Standard call to get message count and if count is 1,
3353     -- get message info.
3354     -- The client will directly display the x_msg_data (which is already
3355     -- translated) if the x_msg_count = 1;
3356     -- Else i.e if  x_msg_count > 1, client will call the FND_MSG_PUB.Get
3357     -- Server-side procedure to access the messages, and consolidate them
3358     -- and display (or) to display one message after another.
3359     FND_MSG_PUB.Count_And_Get
3360         (       p_count        =>      x_msg_count,
3361                 p_data         =>      x_msg_data
3362         );
3363 
3364   EXCEPTION
3365     WHEN FND_API.G_EXC_ERROR THEN
3366         IF l_debug = 1 THEN
3367           mdebug('Delete_Valid_Category: Apps Exception raised');
3368         END IF;
3369         IF FND_API.To_Boolean( p_commit ) THEN
3370           ROLLBACK TO Delete_Valid_Category_PUB;
3371         END IF;
3372         x_return_status := FND_API.G_RET_STS_ERROR;
3373         FND_MSG_PUB.Count_And_Get
3374         (       p_count        =>      x_msg_count,
3375                 p_data         =>      x_msg_data
3376         );
3377     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3378         IF l_debug = 1 THEN
3379           mdebug('Delete_Valid_Category: Apps Unexpected Error');
3380         END IF;
3381         IF FND_API.To_Boolean( p_commit ) THEN
3382           ROLLBACK TO Delete_Valid_Category_PUB;
3383         END IF;
3384         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3385         FND_MSG_PUB.Count_And_Get
3386         (       p_count        =>      x_msg_count,
3387                 p_data         =>      x_msg_data
3388         );
3389     WHEN OTHERS THEN
3390         IF l_debug = 1 THEN
3391           mdebug('Delete_Valid_Category: Exception -- OTHERS ');
3392         END IF;
3393         IF FND_API.To_Boolean( p_commit ) THEN
3394           ROLLBACK TO Delete_Valid_Category_PUB;
3395         END IF;
3396         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3397         IF c_get_items_in_cat%ISOPEN THEN
3398           CLOSE c_get_items_in_cat;
3399         END IF;
3400         IF      FND_MSG_PUB.Check_Msg_Level
3401                 (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
3402         THEN
3403                 FND_MSG_PUB.Add_Exc_Msg
3404                 (       G_PKG_NAME          ,
3405                         l_api_name
3406                 );
3407         END IF;
3408         FND_MSG_PUB.Count_And_Get
3409         (       p_count        =>      x_msg_count,
3410                 p_data         =>      x_msg_data
3411         );
3412   END Delete_Valid_Category;
3413 
3414   ----------------------------------------------------------------------------
3415   --  12. Process_dml_on_row
3416   --  Bug: 5023883, Create/Update/Delete to the EGO tables
3417   ----------------------------------------------------------------------------
3418   PROCEDURE Process_Dml_On_Row
3419   (
3420     p_api_version         IN  NUMBER,
3421     p_category_set_id     IN  NUMBER,
3422     p_category_id         IN  NUMBER,
3423     p_mode                IN  VARCHAR2,
3424     x_return_status       OUT  NOCOPY VARCHAR2,
3425     x_errorcode           OUT  NOCOPY NUMBER,
3426     x_msg_count           OUT  NOCOPY NUMBER,
3427     x_msg_data            OUT  NOCOPY VARCHAR2
3428    ) IS
3429 
3430     l_pk_column_name_value_pairs   EGO_COL_NAME_VALUE_PAIR_ARRAY;
3431     l_data_column_name_value_pairs EGO_COL_NAME_VALUE_PAIR_ARRAY;
3432     l_attr_group_id                NUMBER;
3433 
3434    BEGIN
3435 
3436      /*Initialize the PK column array and the attribute data array */
3437       l_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3438                           EGO_COL_NAME_VALUE_PAIR_OBJ('CATEGORY_SET_ID',
3439 						      p_category_set_id));
3440 
3441       l_data_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
3442                            EGO_COL_NAME_VALUE_PAIR_OBJ('CATEGORY_ID', p_category_id));
3443 
3444       EGO_USER_ATTRS_DATA_PVT.Perform_DML_On_Row(
3445                    p_api_version                  => 1.0
3446                   ,p_object_name                 => 'EGO_CATEGORY_SET'
3447                   ,p_application_id              => 431
3448                   ,p_attr_group_type             => 'EGO_PRODUCT_CATEGORY_SET'
3449                   ,p_attr_group_name             => 'SalesAndMarketing'
3450                   ,p_pk_column_name_value_pairs  => l_pk_column_name_value_pairs
3451                   ,p_class_code_name_value_pairs => NULL
3452                   ,p_data_level_name_value_pairs => l_data_column_name_value_pairs
3453                   ,p_attr_name_value_pairs       => null
3454 		  ,p_mode                        => p_mode
3455                   ,p_use_def_vals_on_insert      => FND_API.G_TRUE
3456 		  ,x_return_status               => x_return_status
3457                   ,x_errorcode                   => x_errorcode
3458                   ,x_msg_count                   => x_msg_count
3459                   ,x_msg_data                    => x_msg_data );
3460    EXCEPTION
3461 
3462       WHEN OTHERS THEN
3463         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3464         x_msg_data := 'Executing - '||G_PKG_NAME||'.Process_Dml_On_Row '||SQLERRM;
3465 
3466    END Process_Dml_On_Row;
3467 
3468    --* Procedure Update_Category_Assignment added for Bug #3991044
3469    ----------------------------------------------------------------------------
3470    -- 13.  Update Category Assignment
3471    -- Bug: 3991044
3472    -- API to Update a valid Item Category Assignment
3473    -- All the validations are taken care in the Pvt pkg,
3474    -- so calling private pkg instead.
3475    ----------------------------------------------------------------------------
3476    PROCEDURE Update_Category_Assignment
3477    (
3478      p_api_version       IN   NUMBER,
3479      p_init_msg_list     IN   VARCHAR2 ,
3480      p_commit            IN   VARCHAR2 ,
3481      p_category_id       IN   NUMBER,
3482      p_old_category_id   IN   NUMBER,
3483      p_category_set_id   IN   NUMBER,
3484      p_inventory_item_id IN   NUMBER,
3485      p_organization_id   IN   NUMBER,
3486      x_return_status     OUT  NOCOPY VARCHAR2,
3487      x_errorcode         OUT  NOCOPY NUMBER,
3488      x_msg_count         OUT  NOCOPY NUMBER,
3489      x_msg_data          OUT  NOCOPY VARCHAR2
3490    )
3491    IS
3492      -- Start OF comments
3493      -- API name  : Delete_Category_Assignment
3494      -- TYPE      : Public
3495      -- Pre-reqs  : None
3496      -- FUNCTION  : Delete an item category assignment.
3497      --
3498      -- Version: Current Version 0.1
3499      -- Previous Version :  None
3500      -- Notes  : Stub Version
3501      --
3502      -- END OF comments
3503       l_api_name                     CONSTANT VARCHAR2(30)      := 'Update_Category_Assignment';
3504       -- On addition of any Required parameters the major version needs
3505       -- to change i.e. for eg. 1.X to 2.X.
3506       -- On addition of any Optional parameters the minor version needs
3507       -- to change i.e. for eg. X.6 to X.7.
3508       l_api_version           CONSTANT NUMBER   := 1.0;
3509       l_row_count            NUMBER;
3510      l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
3511    BEGIN
3512         -- Standard Start of API savepoint
3513       SAVEPOINT Update_Category_Assignment_PUB;
3514 
3515         -- Check for call compatibility.
3516       IF NOT FND_API.Compatible_API_Call (l_api_version,
3517                                                 p_api_version   ,
3518                                                 l_api_name      ,
3519                                                 G_PKG_NAME)
3520         THEN
3521                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3522       END IF;
3523         -- Initialize API message list if necessary.
3524         -- Initialize message list if p_init_msg_list is set to TRUE.
3525       IF FND_API.to_Boolean( p_init_msg_list ) THEN
3526         FND_MSG_PUB.initialize;
3527       END IF;
3528 
3529          INV_ITEM_MSG.set_Message_Mode('PLSQL');
3530 
3531       IF FND_MSG_PUB.Check_Msg_Level
3532           (FND_MSG_PUB.G_MSG_LVL_SUCCESS)
3533         THEN
3534           INV_ITEM_MSG.set_Message_Level(INV_ITEM_MSG.g_Level_Warning);
3535       END IF;
3536 
3537          INV_ITEM_CATEGORY_PVT.Update_Category_Assignment
3538          (
3539            p_api_version        => p_api_version
3540         ,  p_init_msg_list      => p_init_msg_list
3541         ,  p_commit             => p_commit
3542         ,  p_inventory_item_id  => p_inventory_item_id
3543         ,  p_organization_id    => p_organization_id
3544         ,  p_category_set_id    => p_category_set_id
3545         ,  p_category_id        => p_category_id
3546         ,  p_old_category_id    => p_old_category_id
3547         ,  x_return_status      => x_return_status
3548         ,  x_msg_count          => x_msg_count
3549         ,  x_msg_data           => x_msg_data
3550         );
3551 
3552 
3553       IF (l_debug = 1) THEN
3554            mdebug('Update_Category_Assignment: Done!!');
3555       END IF;
3556 
3557       --add by geguo business event enhancement 8351807
3558       BEGIN
3559          IF (l_debug = 1) THEN
3560             mdebug('begin Raise EGO_WF_WRAPPER_PVT.G_ITEM_CAT_ASSIGN_EVENT business event');
3561          END IF;
3562          IF (x_return_status = fnd_api.g_RET_STS_SUCCESS) THEN
3563            INV_ITEM_EVENTS_PVT.Raise_Events (
3564              p_commit             => FND_API.To_Boolean(p_commit)
3565              ,p_event_name        => 'EGO_WF_WRAPPER_PVT.G_ITEM_CAT_ASSIGN_EVENT'
3566              ,p_dml_type          => 'UPDATE'
3567              ,p_inventory_item_id => p_inventory_item_id
3568              ,p_organization_id   => p_organization_id
3569              ,p_category_set_id   => p_category_set_id
3570              ,p_category_id       => p_category_id
3571              ,p_old_category_id   => p_old_category_id
3572              );
3573          END IF;
3574 
3575          IF (l_debug = 1) THEN
3576              mdebug('end Raise EGO_WF_WRAPPER_PVT.G_ITEM_CAT_ASSIGN_EVENT business event');
3577          END IF;
3578 
3579          EXCEPTION
3580            WHEN OTHERS THEN
3581              IF (l_debug = 1) THEN
3582                mdebug('error occured when Raise EGO_WF_WRAPPER_PVT.G_ITEM_CAT_ASSIGN_EVENT business event');
3583              END IF;
3584        END;
3585          -- Standard check of p_commit.
3586       IF FND_API.To_Boolean( p_commit ) THEN
3587                 COMMIT WORK;
3588       END IF;
3589 
3590 ---    Bug 6272365 Start
3591 ---      x_return_status := FND_API.G_RET_STS_SUCCESS;
3592 	INV_ITEM_MSG.Write_List;
3593 ---    Bug 6272365 End
3594       -- Standard call to get message count and if count is 1,
3595       -- get message info.
3596       -- The client will directly display the x_msg_data (which is already
3597       -- translated) if the x_msg_count = 1;
3598       -- Else i.e if  x_msg_count > 1, client will call the FND_MSG_PUB.Get
3599       -- Server-side procedure to access the messages, and consolidate them
3600       -- and display (or) to display one message after another.
3601       FND_MSG_PUB.Count_And_Get
3602                 (       p_count        =>      x_msg_count,
3603                         p_data         =>      x_msg_data
3604                 );
3605       EXCEPTION
3606         WHEN FND_API.G_EXC_ERROR THEN
3607                 ROLLBACK TO Update_Category_Assignment_PUB;
3608                 x_return_status := FND_API.G_RET_STS_ERROR;
3609                 FND_MSG_PUB.Count_And_Get
3610                 (       p_count        =>      x_msg_count,
3611                         p_data         =>      x_msg_data
3612                 );
3613         WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3614                 ROLLBACK TO Update_Category_Assignment_PUB;
3615                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3616                 FND_MSG_PUB.Count_And_Get
3617                 (       p_count        =>      x_msg_count,
3618                         p_data         =>      x_msg_data
3619                 );
3620         WHEN OTHERS THEN
3621                 ROLLBACK TO Update_Category_Assignment_PUB;
3622                 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3623                 IF      FND_MSG_PUB.Check_Msg_Level
3624                         (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
3625                 THEN
3626                         FND_MSG_PUB.Add_Exc_Msg
3627                         (       G_PKG_NAME          ,
3628                                 l_api_name
3629                         );
3630                 END IF;
3631                 FND_MSG_PUB.Count_And_Get
3632                 (       p_count        =>      x_msg_count,
3633                         p_data         =>      x_msg_data
3634                 );
3635 
3636    END Update_Category_Assignment;
3637    --* End of code for Bug #3991044
3638 
3639   /* Add this procedure by geguo for bug 8547305 */
3640   PROCEDURE Get_Category_Id_From_Cat_Rec(
3641     p_category_rec     IN   INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE,
3642     x_category_id      OUT  NOCOPY NUMBER,
3643     x_return_status    OUT  NOCOPY VARCHAR2,
3644     x_msg_data         OUT  NOCOPY VARCHAR2
3645   )IS
3646      l_category_rec INV_ITEM_CATEGORY_PUB.CATEGORY_REC_TYPE;
3647      l_category_id NUMBER;
3648      l_structure_id NUMBER;
3649      l_success BOOLEAN;
3650      l_concat_segs VARCHAR2(2000) ;
3651      l_n_segments NUMBER ;
3652      l_segment_array FND_FLEX_EXT.SegmentArray;
3653      l_delim VARCHAR2(10);
3654      l_indx        NUMBER;
3655      l_msg_text    VARCHAR2(1000);
3656 
3657      CURSOR segment_count(p_structure_id NUMBER) IS
3658         SELECT count(segment_num)
3659         FROM fnd_id_flex_segments
3660         WHERE application_id = G_INVENTORY_APP_ID
3661         AND id_flex_code = G_CAT_FLEX_CODE
3662         AND id_flex_num = p_structure_id
3663         AND (enabled_flag = 'Y' OR NVL(g_eni_upgarde_flag,'N') = 'Y');-- Added for 11.5.10 ENI Upgrade
3664 
3665      CURSOR c_get_segments(cp_flex_num NUMBER) IS
3666         SELECT application_column_name,rownum
3667         FROM   fnd_id_flex_segments
3668         WHERE  application_id = 401
3669           AND  id_flex_code   = 'MCAT'
3670           AND  id_flex_num    = cp_flex_num
3671           AND  enabled_flag   = 'Y'
3672         ORDER BY segment_num ASC;
3673 
3674      l_debug number := NVL(FND_PROFILE.VALUE('INV_DEBUG_TRACE'),0);
3675 
3676   BEGIN
3677     --Pre-Process the passed in category record.
3678     Preprocess_Category_Rec(G_INSERT, p_category_rec, l_category_rec) ;
3679 
3680     l_structure_id := l_category_rec.structure_id;
3681     OPEN segment_count(l_structure_id);
3682     FETCH segment_count INTO l_n_segments;
3683     IF (segment_count%NOTFOUND) THEN
3684        IF (l_debug = 1) THEN
3685           mdebug('The Number of segments not found');
3686        END IF;
3687     END IF;
3688     CLOSE segment_count;
3689 
3690     l_delim  := fnd_flex_ext.get_delimiter(G_INVENTORY_APP_SHORT_NAME,
3691                                            G_CAT_FLEX_CODE,
3692                                            l_structure_id);
3693     IF l_delim is NULL then
3694        fnd_message.set_name('OFA','FA_BUDGET_NO_SEG_DELIM');
3695        fnd_msg_pub.ADD;
3696        IF (l_debug = 1) THEN
3697          mdebug('Delimiter is NULL...Error');
3698        END IF;
3699        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3700     END IF;
3701 
3702     l_indx := 1;
3703     FOR c_segments in c_get_segments(l_structure_id) LOOP
3704       IF c_segments.application_column_name = 'SEGMENT1' THEN
3705          l_segment_array(l_indx):= l_category_rec.segment1;
3706       ELSIF c_segments.application_column_name = 'SEGMENT2' THEN
3707          l_segment_array(l_indx):= l_category_rec.segment2;
3708       ELSIF c_segments.application_column_name = 'SEGMENT3' THEN
3709          l_segment_array(l_indx):= l_category_rec.segment3;
3710       ELSIF c_segments.application_column_name = 'SEGMENT4' THEN
3711          l_segment_array(l_indx):= l_category_rec.segment4;
3712       ELSIF c_segments.application_column_name = 'SEGMENT5' THEN
3713          l_segment_array(l_indx):= l_category_rec.segment5;
3714       ELSIF c_segments.application_column_name = 'SEGMENT6' THEN
3715          l_segment_array(l_indx):= l_category_rec.segment6;
3716       ELSIF c_segments.application_column_name = 'SEGMENT7' THEN
3717          l_segment_array(l_indx):= l_category_rec.segment7;
3718       ELSIF c_segments.application_column_name = 'SEGMENT8' THEN
3719          l_segment_array(l_indx):= l_category_rec.segment8;
3720       ELSIF c_segments.application_column_name = 'SEGMENT9' THEN
3721          l_segment_array(l_indx):= l_category_rec.segment9;
3722       ELSIF c_segments.application_column_name = 'SEGMENT10' THEN
3723          l_segment_array(l_indx):= l_category_rec.segment10;
3724       ELSIF c_segments.application_column_name = 'SEGMENT11' THEN
3725          l_segment_array(l_indx):= l_category_rec.segment11;
3726       ELSIF c_segments.application_column_name = 'SEGMENT12' THEN
3727          l_segment_array(l_indx):= l_category_rec.segment12;
3728       ELSIF c_segments.application_column_name = 'SEGMENT13' THEN
3729          l_segment_array(l_indx):= l_category_rec.segment13;
3730       ELSIF c_segments.application_column_name = 'SEGMENT14' THEN
3731          l_segment_array(l_indx):= l_category_rec.segment14;
3732       ELSIF c_segments.application_column_name = 'SEGMENT15' THEN
3733          l_segment_array(l_indx):= l_category_rec.segment15;
3734       ELSIF c_segments.application_column_name = 'SEGMENT16' THEN
3735          l_segment_array(l_indx):= l_category_rec.segment16;
3736       ELSIF c_segments.application_column_name = 'SEGMENT17' THEN
3737          l_segment_array(l_indx):= l_category_rec.segment17;
3738       ELSIF c_segments.application_column_name = 'SEGMENT18' THEN
3739          l_segment_array(l_indx):= l_category_rec.segment18;
3740       ELSIF c_segments.application_column_name = 'SEGMENT19' THEN
3741          l_segment_array(l_indx):= l_category_rec.segment19;
3742       ELSIF c_segments.application_column_name = 'SEGMENT20' THEN
3743          l_segment_array(l_indx):= l_category_rec.segment20;
3744       END IF;
3745       l_indx := l_indx+1;
3746     END LOOP;
3747 
3748     l_concat_segs :=fnd_flex_ext.concatenate_segments(l_n_segments,
3749                                                       l_segment_array,
3750                                                       l_delim);
3751 
3752     IF (l_debug = 1) THEN
3753       mdebug('Delim       : '||l_delim);
3754       mdebug('Flex code   : '||G_CAT_FLEX_CODE);
3755       mdebug('struct#     : '||l_structure_id);
3756       mdebug('# of segs   : '||to_char(l_n_segments));
3757       mdebug('Concat segs : '||l_concat_segs);
3758     END IF;
3759 
3760     l_success  :=   fnd_flex_keyval.validate_segs(
3761                             operation  => 'FIND_COMBINATION',
3762                             appl_short_name => G_INVENTORY_APP_SHORT_NAME,
3763                             key_flex_code => G_CAT_FLEX_CODE,
3764                             structure_number => l_structure_id,
3765                             concat_segments => l_concat_segs
3766                             );
3767     IF l_success THEN
3768       x_return_status := FND_API.G_RET_STS_SUCCESS;
3769       x_category_id := FND_FLEX_KEYVAL.combination_id;
3770     ELSE
3771 
3772       x_msg_data := FND_FLEX_KEYVAL.error_message;
3773       FND_MESSAGE.Set_Name('FND','FLEX-NO DYNAMIC INSERTS');
3774       l_msg_text := FND_MESSAGE.Get();
3775 
3776       IF (INSTR(x_msg_data,l_msg_text) > 0) THEN
3777         x_return_status := FND_API.G_RET_STS_SUCCESS;
3778         x_category_id := -1;
3779       ELSE
3780         x_return_status := FND_API.G_RET_STS_ERROR;
3781       END IF;
3782 
3783     END IF;
3784   EXCEPTION
3785     WHEN OTHERS THEN
3786       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3787       x_msg_data := 'Executing - '||G_PKG_NAME||'.get_category_id_from_cat_rec: '||SQLERRM;
3788 
3789   END Get_Category_Id_From_Cat_Rec;
3790 
3791 
3792 END INV_ITEM_CATEGORY_PUB;