DBA Data[Home] [Help]

PACKAGE BODY: APPS.ENI_UPGRADE_VSET

Source


1 PACKAGE BODY ENI_UPGRADE_VSET AS
2 /* $Header: ENIVSTUB.pls 120.0 2005/05/26 19:34:16 appldev noship $  */
3 
4 g_catset_id     NUMBER;
5 g_struct_id     NUMBER;
6 g_value_set_id  NUMBER;
7 g_default_cat_id NUMBER;
8 
9 FUNCTION ENI_VALIDATE_SETUP return NUMBER IS
10 
11   l_cnt          NUMBER;
12   l_report_error NUMBER;
13   l_catg         VARCHAR2(40);
14 
15   -- this cursor selects all records with more than one parent
16   -- in the value set hierarchy
17   CURSOR C_DUP IS
18     SELECT CHILD_CODE, COUNT(PARENT_CODE) COUNT
19     FROM ENI_VSET_HRCHY_TEMP
20     WHERE HRCHY_FLAG = 'Y'
21     GROUP BY CHILD_CODE
22     HAVING COUNT(PARENT_CODE) > 1;
23 
24   -- Cursor that selects all parent categories having item assignments
25 
26   CURSOR c_parent_item_assgn(g_struct_id NUMBER, g_catset_id NUMBER) IS
27     SELECT B.SEGMENT1, COUNT(INVENTORY_ITEM_ID) NUMBER_ITEMS
28     FROM MTL_ITEM_CATEGORIES A, MTL_CATEGORIES_B B, ENI_VSET_HRCHY_TEMP C
29     WHERE A.CATEGORY_SET_ID = g_catset_id
30       AND A.CATEGORY_ID = b.category_id
31       AND B.STRUCTURE_ID = g_struct_id
32       AND B.SEGMENT1 = C.PARENT_CODE
33       AND C.HRCHY_FLAG = 'Y'
34     GROUP BY B.SEGMENT1;
35 
36  -- Cursor that selects all nodes in the value set whose corresponding
37  -- categories do not exist
38 
39   CURSOR c_new_nodes(g_struct_id NUMBER) IS
40     SELECT CHILD_CODE FROM ENI_VSET_HRCHY_TEMP
41     WHERE HRCHY_FLAG = 'Y'
42     MINUS
43     SELECT SEGMENT1 FROM MTL_CATEGORIES_B
44     WHERE STRUCTURE_ID = g_struct_id;
45 
46 BEGIN
47 
48   -- Check for multiple parent
49 
50   FND_FILE.PUT_LINE(FND_FILE.LOG, '');
51   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Checking if any nodes have multiple parents');
52   FND_FILE.PUT_LINE(FND_FILE.LOG, '----------------------------------------- ');
53   FND_FILE.PUT_LINE(FND_FILE.LOG, 'ERROR : CATEGORIES WITH MULTIPLE PARENTS');
54   FND_FILE.PUT_LINE(FND_FILE.LOG, '----------------------------------------- ');
55   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Category Code');
56   FND_FILE.PUT_LINE(FND_FILE.LOG, '--------------');
57 
58   l_cnt := 0;
59 
60   FOR i IN C_DUP LOOP
61     FND_FILE.PUT_LINE(FND_FILE.LOG, i.child_code);
62     l_cnt := 1;
63   END LOOP;
64   IF l_cnt = 0 THEN
65     FND_FILE.PUT_LINE(FND_FILE.LOG,' --- None --- ');
66   ELSE
67     l_report_error := 1;
68   END IF;
69 
70   -- Check for item assignments
71 
72   l_cnt := 0;
73     FND_FILE.PUT_LINE(FND_FILE.LOG, '');
74     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Checking for any parent nodes having item assignments');
75     FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------ ');
76     FND_FILE.PUT_LINE(FND_FILE.LOG, 'ERROR : PARENT CATEGORIES WITH ITEM ASSIGNMENTS');
77     FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------ ');
78     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Category Code ');
79     FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------- ');
80 
81   FOR i in c_parent_item_assgn(g_struct_id, g_catset_id) LOOP
82     FND_FILE.PUT_LINE(FND_FILE.LOG, i.segment1);
83     l_cnt := 1;
84   END LOOP;
85   IF l_cnt = 0 THEN
86     FND_FILE.PUT_LINE(FND_FILE.LOG,' --- None --- ');
87   ELSE
88     l_report_error := 1;
89   END IF;
90 
91   -- Report any categories which is a parent node in the value set
92   -- hierarchy but is also a default category of the default category
93   -- set. This will not be allowed:
94 
95   FND_FILE.PUT_LINE(FND_FILE.LOG, '');
96   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Checking if default category lies outside the hierarchy');
97   FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------ ');
98   FND_FILE.PUT_LINE(FND_FILE.LOG, 'ERROR : DEFAULT CATEGORY IS NOT UNDER THE TOP NODE');
99   FND_FILE.PUT_LINE(FND_FILE.LOG,'IN THE VALUE SET, IT WILL BE PLACED AS AS INDEPENDENT');
100   FND_FILE.PUT_LINE(FND_FILE.LOG,'TOP LEVEL CATEGORY');
101   FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------ ');
102   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Category Code ');
103   FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------- ');
104 
105   BEGIN
106     SELECT A.segment1 INTO l_catg
107     FROM mtl_categories_B A,
108          mtl_category_sets_b B    -- ,ENI_VSET_HRCHY_TEMP C
109     WHERE A.category_id = B.default_category_id
110       AND A.structure_id = B.structure_id
111       AND B.CATEGORY_SET_ID = g_catset_id
112       AND NOT EXISTS (SELECT child_code FROM eni_vset_hrchy_temp
113                        WHERE child_code = a.segment1
114                          AND hrchy_flag = 'Y');
115 
116     FND_FILE.PUT_LINE(FND_FILE.LOG, l_catg);
117 
118   EXCEPTION
119     WHEN NO_DATA_FOUND THEN
120       FND_FILE.PUT_LINE(FND_FILE.LOG, ' --- None --- ');
121   END;
122 
123 
124   FND_FILE.PUT_LINE(FND_FILE.LOG, '');
125   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Checking if any parent node is specified as default category');
126 
127   FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------ ');
128   FND_FILE.PUT_LINE(FND_FILE.LOG, 'ERROR : DEFAULT CATEGORY CANNOT BE CONVERTED TO A PARENT ');
129   FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------ ');
130   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Category Code ');
131   FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------- ');
132 
133   BEGIN
134     SELECT a.segment1 INTO l_catg
135     FROM mtl_categories_b a,
136          mtl_category_sets_b b, eni_vset_hrchy_temp c
137     WHERE a.category_id = b.default_category_id
138       AND a.structure_id = b.structure_id
139       AND b.category_set_id = g_catset_id
140       AND a.segment1 = c.parent_code
141       AND c.hrchy_flag = 'Y'
142       AND ROWNUM = 1;
143 
144     FND_FILE.PUT_LINE(FND_FILE.LOG, l_catg);
145 
146   EXCEPTION
147     WHEN NO_DATA_FOUND THEN
148       FND_FILE.PUT_LINE(FND_FILE.LOG, ' --- None --- ');
149   END;
150 
151   -- Report any categories that is new in the value set and should be
152   -- created
153   l_cnt := 0;
154   FND_FILE.PUT_LINE(FND_FILE.LOG, '');
155   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Checking for new nodes in the value set hierarchy');
156   FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------------------------------ ');
157   FND_FILE.PUT_LINE(FND_FILE.LOG, 'ERROR: NEW NODES IN THE VALUE SET THAT DO NOT HAVE CORRESPONDING CATEGORIES');
158   FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------------------------------ ');
159   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Flex Values');
160   FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------- ');
161 
162   FOR i in c_new_nodes(g_struct_id) LOOP
163     FND_FILE.PUT_LINE(FND_FILE.LOG, i.child_code);
164     l_cnt := 1;
165   END LOOP;
166 
167   IF l_cnt = 0 THEN
168     FND_FILE.PUT_LINE(FND_FILE.LOG,' --- None --- ');
169   ELSE
170     FND_FILE.PUT_LINE(FND_FILE.LOG,'Please run concurrent program: Create item categories from value set to create categories for the new nodes');
171     l_report_error := 1;
172   END IF;
173 
174   RETURN l_report_error;
175 END ENI_VALIDATE_SETUP;
176 
177 
178 PROCEDURE UPDATE_CATSET_FROM_VSET (
179     errbuf            OUT NOCOPY VARCHAR2,
180     retcode           OUT NOCOPY VARCHAR2,
181     p_top_node        IN VARCHAR2,
182     p_validation_mode IN VARCHAR2) IS
183 
184   l_cnt           NUMBER;
185   l_error         BOOLEAN;
186   l_insert        NUMBER;
187   l_update        NUMBER;
188   l_catg          NUMBER;
189   l_catg_id       NUMBER;
190 
191   l_return_status  VARCHAR2(2000);
192   l_errorcode      NUMBER;
193   l_msg_count      NUMBER;
194   l_msg_data       VARCHAR2(15000);
195   l_msg_index_out  VARCHAR2(10000);
196   l_data           VARCHAR2(10000);
197   l_schema         VARCHAR2(10);
198 
199   -- Cursor that indicates all categories those are to be deleted
200   -- from valid cats. These categories do not fall below the top node
201   -- and do not have item assignments
202 
203   CURSOR c_out_hrchy(g_struct_id NUMBER, g_catset_id NUMBER) IS
204   SELECT segment1, a.category_id, b.category_set_id
205   FROM mtl_categories_b a, mtl_category_set_valid_cats b, mtl_category_sets_b c
206   WHERE a.structure_id = g_struct_id
207     AND b.category_set_id = g_catset_id
208     AND a.category_id = b.category_id
209     AND a.structure_id = c.structure_id
210     AND b.category_set_id = c.category_set_id
211     AND a.category_id <> c.default_category_id
212     AND a.category_id NOT IN (SELECT category_id
213                               FROM mtl_item_categories
214                               WHERE category_id = a.category_id
215                                 AND category_set_id = b.category_set_id
216                                 AND ROWNUM = 1)
217     AND NOT EXISTS(SELECT child_code FROM eni_vset_hrchy_temp
218                    WHERE a.segment1 = child_code
219                      AND hrchy_flag = 'Y'
220                      AND child_code <> p_top_node);
221 
222   -- Cursor that indicates the categories that do not fall under the
223   -- top node but has item assignments. These categories will
224   -- remain as stray categories under the product catalog
225 
226   CURSOR c_stray_catg(g_struct_id NUMBER, g_catset_id NUMBER) IS
227   SELECT segment1, a.category_id --, b.category_set_id
228     FROM mtl_categories_b a
229    WHERE structure_id = g_struct_id
230      AND EXISTS (SELECT 'X' FROM mtl_item_categories b
231                   WHERE a.category_id = b.category_id
232                    AND b.category_set_id = g_catset_id)
233      AND NOT EXISTS(SELECT child_code FROM eni_vset_hrchy_temp
234                     WHERE A.segment1 = child_code
235                       AND hrchy_flag = 'Y')
236      AND p_validation_mode = 'Y';
237 
238   -- This Cursor will only run when validation mode = 'N'. This
239   -- will update all nodes that have item assignments to a standalone
240   -- node i.e. where parent_id is null. The last part of union all
241   -- will select default_category if it doesnt have any item assignment
242   -- Bug 3779274
243 
244 
245   CURSOR c_item_assign(g_struct_id NUMBER, g_catset_id NUMBER) IS
246    SELECT a.category_id, a.segment1, flag
247      FROM (
248            SELECT a.category_id, segment1, 1 flag -- create in valid cats
249              FROM mtl_categories_b a
250             WHERE a.structure_id = g_struct_id
251               AND NOT EXISTS(
252                     SELECT child_code FROM eni_vset_hrchy_temp
253                     WHERE hrchy_flag = 'Y'
254                       AND child_code = a.segment1)
255                           AND NOT EXISTS(
256                               SELECT category_id FROM mtl_category_set_valid_cats
257                               WHERE a.category_id = category_id
258                                 AND category_set_id = g_catset_id)
259             UNION ALL
260             SELECT a.category_id, b.segment1, 2 flag  -- update in valid cats
261               FROM mtl_category_set_valid_cats a, mtl_categories_b b
262              WHERE a.category_set_id = g_catset_id
263                AND a.category_id = b.category_id
264                AND b.structure_id = g_struct_id
265                -- AND NOT EXISTS(
266                --    SELECT child_code FROM eni_vset_hrchy_temp
267                --     WHERE hrchy_flag = 'Y'
268                --       AND child_code = b.segment1)
269             ) a
270             WHERE EXISTS(
271                 SELECT category_id FROM mtl_item_categories b
272                  WHERE a.category_id = b.category_id
273                    AND b.category_set_id = g_catset_id)
274      UNION ALL
275          SELECT category_id, segment1,2 flag
276          FROM
277          	mtl_categories_b
278          WHERE
279 		category_id = g_default_cat_id
280 	 	AND NOT EXISTS (
281 			    SELECT b.category_id
282 			    FROM
283 		                mtl_item_categories b
284 		        WHERE b.category_id = g_default_cat_id
285 		        AND ROWNUM = 1
286 		 );
287 
288   -- SELECT SEGMENT1, A.CATEGORY_ID, B.CATEGORY_SET_ID
289   --   FROM MTL_CATEGORIES_B A, MTL_CATEGORY_SET_VALID_CATS B
290   --  WHERE STRUCTURE_ID = g_struct_id
291   --    AND B.CATEGORY_SET_ID = g_catset_id
292   --    AND A.CATEGORY_ID = B.CATEGORY_ID
293    --   AND A.CATEGORY_ID IN (SELECT CATEGORY_ID
294    --                         FROM MTL_ITEM_CATEGORIES
295    --                         WHERE CATEGORY_ID = A.CATEGORY_ID
296    --                           AND CATEGORY_SET_ID = B.CATEGORY_SET_ID
297    --                           AND ROWNUM = 1)
298    --   AND p_validation_mode = 'N';
299 
300    CURSOR c_check_temp(segment VARCHAR2) IS
301    SELECT 1 exist_flag FROM DUAL
302     WHERE NOT EXISTS(SELECT child_code
303                        FROM eni_vset_hrchy_temp
304                       WHERE child_code = segment
305                         AND hrchy_flag = 'Y'
306                         AND rownum = 1)
307       AND p_validation_mode = 'N';
308 
309   -- Cursor to select all the new nodes defined in the value set
310   -- hierarchy (Insert into valid cats) + all the nodes that have
311   -- been moved in the hierarchy (update in valid cats)
312 
313    CURSOR C_INS_UPD(l_catg number) IS
314     SELECT
315       v.category_id            VSET_CHILD_ID,
316       v.segment1               VSET_CHILD_CODE,
317       DECODE(v1.category_id,l_catg,NULL, v1.category_id)  VSET_PARENT_ID,
318       h.category_id            CAT_CHILD_ID,
319       h.parent_category_id     CAT_PARENT_ID,
320       g_catset_id              CATEGORY_SET_ID
321     FROM eni_vset_hrchy_temp f, mtl_categories_b v,
322          mtl_categories_b v1, mtl_category_set_valid_cats h
323     WHERE v.structure_id = g_struct_id
324       AND v1.structure_id(+) = g_struct_id
325       AND f.child_code = v.segment1
326       AND f.parent_code = v1.segment1(+)
327       AND f.hrchy_flag = 'Y'
328       AND h.category_set_id(+) = g_catset_id
329       AND h.category_id(+) = v.category_id
330       AND V.segment1 <> p_top_node;
331 
332 BEGIN
333 
334   l_error:= FALSE;
335   l_schema := 'ENI';
336 
337   -- Validating structure
338   l_error := ENI_VALUESET_CATEGORY.ENI_VALIDATE_STRUCTURE;
339 
340   IF l_error THEN
341      errbuf:= 'ERROR: in structure/ segment validation';
342      FND_FILE.PUT_LINE(FND_FILE.LOG,'ERROR: in structure/ segment validation');
343      retcode := 2;
344      RAISE_APPLICATION_ERROR(-20009, 'ERROR: in structure/ segment validation');
345   END IF;
346 
347   -- Get category set associated with the Product Functional Area
348   g_catset_id := ENI_DENORM_HRCHY.GET_CATEGORY_SET_ID;
349 
350   -- Get the value set that is associated with the structure
351   g_value_set_id := ENI_VALUESET_CATEGORY.GET_FLEX_VALUE_SET_ID('401','MCAT',g_catset_id);
352 
353   IF g_value_set_id IS NULL THEN
354       errbuf := 'ERROR: There is no value set associated with the default category set structure. Aborting....';
355       FND_FILE.PUT_LINE(FND_FILE.LOG,'ERROR: There is no value set associated with the default category set structure. ');
356       retcode := 2;
357       RAISE_APPLICATION_ERROR(-20009, 'Error: No value set is associated with the structure');
358   END IF;
359 
360   -- Get structure id for the default category set for Product FA
361 
362   SELECT STRUCTURE_ID,DEFAULT_CATEGORY_ID INTO g_struct_id,g_default_cat_id
363   FROM MTL_CATEGORY_SETS_B
364   WHERE CATEGORY_SET_ID = g_catset_id;
365 
366   -- Call Validate_structure from this procedure to do all the
367   -- validations. If everything is alright then move ahead.
368 
369   -- populating the entire value set into the temp table
370   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Truncating the temp table ... ');
371   EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || l_schema || '.ENI_VSET_HRCHY_TEMP';
372 
373   INSERT INTO ENI_VSET_HRCHY_TEMP(
374     CHILD_CODE,
375     PARENT_CODE,
376     HRCHY_FLAG)
377   SELECT
378     FLEX_VALUE         CHILD_CODE,
379     PARENT_FLEX_VALUE  PARENT_CODE,
380     'N'
381   FROM FND_FLEX_VALUE_CHILDREN_V
382   WHERE FLEX_VALUE_SET_ID = g_value_set_id
383     AND FLEX_VALUE <> p_top_node
384   UNION ALL
385   SELECT p_top_node, NULL, 'N' FROM DUAL;
386 
387    -- populating the hierarchy from only the top node down
388    -- into the temp table
389 
390   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Populating hierarchy in temp table under the top node');
391 
392   INSERT INTO ENI_VSET_HRCHY_TEMP (
393     CHILD_CODE,
394     PARENT_CODE,
395     HRCHY_FLAG)
396   SELECT CHILD_CODE, PARENT_CODE, 'Y'
397   FROM ENI_VSET_HRCHY_TEMP H
398   CONNECT BY PRIOR CHILD_CODE = PARENT_CODE
399   START WITH CHILD_CODE = p_top_node;
400 
401   FND_FILE.PUT_LINE(FND_FILE.LOG, 'Rows inserted: ' || sql%rowcount);
402 
403   COMMIT;
404 
405   IF p_validation_mode = 'Y' THEN
406 
407     FND_FILE.PUT_LINE(FND_FILE.LOG, ' ');
408     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Running in Validation Mode');
409     FND_FILE.PUT_LINE(FND_FILE.LOG, ' ');
410 
411     -- Calling function to validate setup. Erroring out if any error
412     -- is reported.
413     l_cnt := ENI_VALIDATE_SETUP;
414 
415     -- Report any categories that will be removed from the category set
416     -- as they do not exist in the value set hierarchy
417 
418     l_cnt := 0;
419     FND_FILE.PUT_LINE(FND_FILE.LOG, '');
420     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Checking for categories that do not exist in the value set hierarchy');
421     FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------------------------------ ');
422     FND_FILE.PUT_LINE(FND_FILE.LOG, 'INFORMATION: THE FOLLOWING CATEGORIES ARE NOT UNDER THE TOP NODE ');
423     FND_FILE.PUT_LINE(FND_FILE.LOG,'IN THE VALUE SET AND HAVE NO ITEM ASSIGNMENTS, HENCE WILL BE REMOVED');
424     FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------------------------------------------------------------- ');
425     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Category Code ');
426     FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------- ');
427 
428     FOR i in c_out_hrchy(g_struct_id, g_catset_id) LOOP
429       FND_FILE.PUT_LINE(FND_FILE.LOG, i.SEGMENT1);
430       l_cnt := 1;
431     END LOOP;
432     IF l_cnt = 0 THEN
433       FND_FILE.PUT_LINE(FND_FILE.LOG,' --- None --- ');
434     END IF;
435 
436 
437     -- Report any categories that will be left in the valid cats table
438     -- as stray categories. These categories have item assignments
439 
440     l_cnt := 0;
441     FND_FILE.PUT_LINE(FND_FILE.LOG, '');
442     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Checking for categories that do not exist in the value set hierarchy but has item assignments');
443     FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------------------------------ ');
444   FND_FILE.PUT_LINE(FND_FILE.LOG, 'INFORMATION: THE FOLLOWING CATEGORIES ARE NOT UNDER THE ');
445   FND_FILE.PUT_LINE(FND_FILE.LOG,'TOP NODE IN THE VALUE SET BUT HAS ITEM ASSIGNMENTS.');
446     FND_FILE.PUT_LINE(FND_FILE.LOG, 'HENCE WILL BE PLACED AS INDEPENDENT TOP LEVEL CATEGORIES');
447     FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------------------------------ ');
448     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Category Code ');
449     FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------- ');
450 
451     FOR i in c_stray_catg(g_struct_id, g_catset_id) LOOP
452       FND_FILE.PUT_LINE(FND_FILE.LOG, i.SEGMENT1);
453       l_cnt := 1;
454     END LOOP;
455     IF l_cnt = 0 THEN
456       FND_FILE.PUT_LINE(FND_FILE.LOG,' --- None --- ');
457     END IF;
458 
459   ELSIF p_validation_mode = 'N' then
460 
461     FND_FILE.PUT_LINE(FND_FILE.LOG, ' ');
462     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Running in Upgrade Mode');
463     FND_FILE.PUT_LINE(FND_FILE.LOG, ' ');
464 
465     -- Calling function to validate hierarchy setup.
466     -- Error out if setup fails
467 
468     l_cnt := ENI_VALIDATE_SETUP;
469 
470     IF l_cnt = 1 THEN
471       errbuf := 'ERROR: Setup Error. Aborting....';
472       retcode := 2;
473       RAISE_APPLICATION_ERROR(-20009, 'Setup/ Data Error');
474     END IF;
475 
476 
477     -- Update all the nodes that do not belong in the hierarchy
478     -- but has item assignments. These nodes will not be deleted
479     -- but will be made as standalone nodes. To do this, the
480     -- parent_id of the node will be set to null.
481     -- If there are other categories that have item assignments
482     -- as well but do not belong in mtl valid cats, then those
483     -- categories will be created as a standalone node in the
484     -- valid categories table
485     FND_FILE.PUT_LINE(FND_FILE.LOG, '');
486     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Checking for categories that do not exist in the value set hierarchy but has item assignments');
487     FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------------------------------ ');
488     FND_FILE.PUT_LINE(FND_FILE.LOG, 'INFORMATION: CATEGORIES NOT UNDER THE TOP NODE BUT HAS ITEM ');
489     FND_FILE.PUT_LINE(FND_FILE.LOG, 'ASSIGNMENTS. WILL REMAIN AS INDEPENDENT TOP LEVEL CATEGORIES');
490     FND_FILE.PUT_LINE(FND_FILE.LOG, '------------------------------------------------------------------ ');
491     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Category Code ');
492     FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------- ');
493 
494     FOR i IN c_item_assign(g_struct_id, g_catset_id) LOOP
495 
496       IF i.flag = 1 THEN
497 
498         INV_ITEM_CATEGORY_PVT.Create_Valid_Category(
499           p_api_version        => 1,
500           p_category_set_id    => g_catset_id,
501           p_category_id        => i.category_id,
502           p_parent_category_id => null,
503           x_return_status      => l_return_status,
504           x_errorcode          => l_errorcode,
505           x_msg_count          => l_msg_count,
506           x_msg_data           => l_msg_data
507         );
508 
509       ELSE
510 
511         INV_ITEM_CATEGORY_PVT.Update_Valid_Category(
512         p_api_version        => 1,
513         p_category_set_id    => g_catset_id,
514         p_category_id        => i.category_id,
515         p_parent_category_id => null,
516         x_return_status      => l_return_status,
517         x_errorcode          => l_errorcode,
518         x_msg_count          => l_msg_count,
519         x_msg_data           => l_msg_data
520         );
521 
522       END IF;
523 
524 
525       IF l_return_status <> 'S' THEN
526         FND_MSG_PUB.Get(p_msg_index=>fnd_msg_pub.G_LAST, p_encoded=>FND_API.G_FALSE, p_msg_index_out=>l_msg_index_out, p_data=>l_data);
527         FND_FILE.PUT_LINE(FND_FILE.LOG, 'Error while updating category: '||to_char(i.category_id)||' from product hierarchy');
528         FND_FILE.PUT_LINE(FND_FILE.LOG, 'ERROR: '||l_data);
529         errbuf := 'Error :' || l_data;
530         retcode := 2;
531         goto end_block;
532       ELSE
533 
534         -- The following loop will only execute when a node is
535         -- has item assignments but is not in the hierarchy under
536         -- the top node
537 
538          FOR j IN c_check_temp(i.segment1) LOOP
539            FND_FILE.PUT_LINE(FND_FILE.LOG, i.SEGMENT1);
540          END LOOP;
541 
542       END IF;
543     END LOOP;
544 
545     l_cnt := 0;
546     FOR i IN c_out_hrchy(g_struct_id, g_catset_id) LOOP
547 
548       if l_cnt = 0 then
549          -- After the nodes with item assignments are updated as standalone
550          -- the remaining nodes in the branch can be deleted (similar to the
551          -- UI behaviour). Here we will delete records from product hierarchy,
552          -- which are not a part of VB hierarchy, starting from the top node.
553 
554          FND_FILE.PUT_LINE(FND_FILE.LOG, '');
555          FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------------------------------------------------------------');
556          FND_FILE.PUT_LINE(FND_FILE.LOG, 'DELETED CATEGORIES: Removing categories from the default category ');
557          FND_FILE.PUT_LINE(FND_FILE.LOG, 'set, which no longer belongs under the top node');
558          FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------------------------------------------------------------');
559 
560          FND_FILE.PUT_LINE(FND_FILE.LOG, 'Category Code');
561          FND_FILE.PUT_LINE(FND_FILE.LOG, '--------------');
562 
563          l_cnt := 1;
564       END IF;
565 
566       -- The foll. SQL is written to prevent the Delete_valid_category
567       -- API from failing. The way the Delete API works is, when a
568       -- parent node is passed as a category id, it will delete itself
569       -- and all its children under it. So, next time when we pass the
570       -- children's category id, the API will fail since by then the
571       -- child has already been deleted.
572 
573       SELECT COUNT(CATEGORY_ID) INTO l_catg
574       FROM MTL_CATEGORY_SET_VALID_CATS
575       WHERE CATEGORY_SET_ID = i.CATEGORY_SET_ID
576         AND CATEGORY_ID = i.CATEGORY_ID;
577 
578       IF l_catg <> 0 THEN
579 
580         INV_ITEM_CATEGORY_PUB.Delete_Valid_Category(
581           p_api_version        => 1,
582           p_category_set_id    => i.category_set_id,
583           p_category_id        => i.category_id,
584           x_return_status      => l_return_status,
585           x_errorcode          => l_errorcode,
586           x_msg_count          => l_msg_count,
587           x_msg_data           => l_msg_data
588         );
589 
590         IF l_return_status <> 'S' THEN
591           FND_MSG_PUB.Get(p_msg_index=>fnd_msg_pub.G_LAST, p_encoded=>FND_API.G_FALSE, p_msg_index_out=>l_msg_index_out, p_data=>l_data);
592           FND_FILE.PUT_LINE(FND_FILE.LOG, 'Error while deleting '||to_char(i.category_id)||' from product hierarchy');
593           FND_FILE.PUT_LINE(FND_FILE.LOG, 'ERROR: '||l_data);
594           errbuf := 'Error :' || l_data;
595           retcode := 2;
596           goto end_block;
597         ELSE
598           FND_FILE.PUT_LINE(FND_FILE.LOG, i.SEGMENT1);
599         END IF;
600       END IF;
601     END LOOP;
602 
603     IF l_cnt = 0 THEN
604        FND_FILE.PUT_LINE(FND_FILE.LOG, '--- None ---');
605     END IF;
606 
607     -- inserting new categories, which do not exist
608     -- under the default category set. The cursor would
609     -- also update if the parent-child relationship in the
610     -- hierarchy has changed
611 
612     l_insert := 0;
613     l_update := 0;
614     l_catg := 0;
615 
616     -- Getting the category id for the top node
617     SELECT category_id INTO l_catg
618       FROM mtl_categories_b
619      WHERE structure_id = g_struct_id
620        AND segment1 = p_top_node;
621 
622     FOR i IN C_INS_UPD(l_catg) LOOP
623 
624       -- if the top node is the parent, then update it will null
625       -- This is based on the new requirement where the top node
626       -- should not be brought into the hierarchy
627 
628       -- IF (i.vset_parent_id = l_catg) THEN
629       --    l_catg_id := '';
630       -- ELSE
631       --    l_catg_id := i.vset_parent_id;
632       -- END IF;
633 
634       IF i.cat_child_id IS NULL THEN
635         IF l_insert = 0 THEN
636           FND_FILE.PUT_LINE(FND_FILE.LOG, '');
637           FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------------------------------------------------------------');
638           FND_FILE.PUT_LINE(FND_FILE.LOG, 'NEW CATEGORIES: Creating category under the default category set');
639           FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------------------------------------------------------------');
640 
641           FND_FILE.PUT_LINE(FND_FILE.LOG, 'Category Code');
642           FND_FILE.PUT_LINE(FND_FILE.LOG, '--------------');
643 
644           l_insert := 1;
645         END IF;
646 
647 
648         INV_ITEM_CATEGORY_PVT.Create_Valid_Category(
649           p_api_version        => 1,
650           p_category_set_id    => i.category_set_id,
651           p_category_id        => i.vset_child_id,
652           p_parent_category_id => i.vset_parent_id,
653           x_return_status      => l_return_status,
654           x_errorcode          => l_errorcode,
655           x_msg_count          => l_msg_count,
656           x_msg_data           => l_msg_data
657         );
658 
659         IF l_return_status <> 'S' THEN
660           FND_MSG_PUB.Get(p_msg_index=>fnd_msg_pub.G_LAST, p_encoded=>FND_API.G_FALSE, p_msg_index_out=>l_msg_index_out, p_data=>l_data);
661           FND_FILE.PUT_LINE(FND_FILE.LOG, 'Error while inserting '||i.vset_child_code||' into product hierarchy');
662           FND_FILE.PUT_LINE(FND_FILE.LOG, 'ERROR: '||l_data);
663           errbuf := 'ERROR :' || l_data;
664           retcode := 2;
665           goto end_block;
666         ELSE
667           FND_FILE.PUT_LINE(FND_FILE.LOG, i.vset_child_code);
668         END IF;
669 
670       -- Will update the parent-child relationship in
671       -- mtl_category_set_valid_cats table if such a change
672       -- is detected
673       ELSIF NVL(i.vset_parent_id, -1) <> NVL(i.cat_parent_id, -1) THEN
674         IF l_update = 0 then
675            FND_FILE.PUT_LINE(FND_FILE.LOG, '');
676            FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------------------------------------------------------------');
677            FND_FILE.PUT_LINE(FND_FILE.LOG, 'UPDATED CATEGORIES: Updating categories with the new parent-child relationship in the value set');
678            FND_FILE.PUT_LINE(FND_FILE.LOG, '-------------------------------------------------------------------');
679 
680            FND_FILE.PUT_LINE(FND_FILE.LOG, 'Category Code');
681            FND_FILE.PUT_LINE(FND_FILE.LOG, '--------------');
682 
683            l_update := 1;
684 
685         END IF;
686 
687 
688         INV_ITEM_CATEGORY_PVT.Update_Valid_Category(
689           p_api_version        => 1,
690           p_category_set_id    => i.category_set_id,
691           p_category_id        => i.vset_child_id,
692           p_parent_category_id => i.vset_parent_id,
693           x_return_status      => l_return_status,
694           x_errorcode          => l_errorcode,
695           x_msg_count          => l_msg_count,
696           x_msg_data           => l_msg_data
697         );
698 
699         IF l_return_status <> 'S' THEN
700           FND_MSG_PUB.Get(p_msg_index=>fnd_msg_pub.G_LAST, p_encoded=>FND_API.G_FALSE, p_msg_index_out=>l_msg_index_out, p_data=>l_data);
701           FND_FILE.PUT_LINE(FND_FILE.LOG, 'Error while updating '||i.vset_child_code||' of product hierarchy');
702           FND_FILE.PUT_LINE(FND_FILE.LOG, 'ERROR: '||l_data);
703           errbuf := 'ERROR :' || l_data;
704           retcode := 2;
705           goto end_block;
706         ELSE
707           FND_FILE.PUT_LINE(FND_FILE.LOG, i.vset_child_code);
708         END IF;
709 
710       END IF; -- IF i.cat_child_id IS NULL THEN
711     END LOOP;
712 
713   END IF; -- IF Validation_mode = 'N' THEN
714 
715   <<end_block>>
716   NULL;
717 
718 EXCEPTION
719   WHEN  NO_DATA_FOUND THEN
720     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Error: No Data Found. Transaction will be rolled back');
721     errbuf := 'No data found ' || sqlerrm;
722     retcode := 2;
723     ROLLBACK;
724     RAISE;
725   WHEN OTHERS THEN
726     FND_FILE.PUT_LINE(FND_FILE.LOG,'Error: ' || sqlerrm || '. Transaction will be rolled back');
727     errbuf := 'Error :' || sqlerrm;
728     retcode := 2;
729     ROLLBACK;
730     RAISE;
731 END;
732 
733 END ENI_UPGRADE_VSET;