DBA Data[Home] [Help]

PACKAGE BODY: APPS.CZ_NETWORK_API_PUB

Source


1 PACKAGE BODY cz_network_api_pub AS
2 /*  $Header: czntapib.pls 120.9 2006/10/19 17:03:35 qmao ship $    */
3 ------------------------------------------------------------------------------------------
4 -- model_type/model_instantiation_type
5 NETWORK CONSTANT VARCHAR2(1) := 'N';
6 
7 -- mtl_system_items.config_model_type
8 NETWORK_CONTAINER_MODEL  CONSTANT VARCHAR2(1) := 'N';
9 
10 -- component_instance_type
11 ROOT  CONSTANT VARCHAR2(1) := 'R';
12 INSTANCE_ROOT CONSTANT VARCHAR2(1) := 'I';
13 INCLUDED CONSTANT VARCHAR2(1) := 'T';
14 
15 
16 NO_PARENT_VALUE         CONSTANT PLS_INTEGER := -1;
17 INSTANTIABLE            CONSTANT PLS_INTEGER := 4;
18 PS_NODE_TYPE_REFERENCE  CONSTANT PLS_INTEGER := 263;
19 NO_FLAG                 CONSTANT VARCHAR2(1) := '0';
20 YES_FLAG                CONSTANT VARCHAR2(1) := '1';
21 
22 type VARCHAR2_TBL_TYPE is table of VARCHAR2(1200);
23 
24 ----declaration used for grouping instances and keyed by inv item id
25 TYPE container_model_rec_type IS RECORD
26 (
27  inventory_item_id    NUMBER,
28  organization_id      NUMBER,
29  config_item_id         NUMBER
30 );
31 TYPE container_model_tbl_type IS TABLE OF container_model_rec_type INDEX BY BINARY_INTEGER;
32 
33 TYPE container_config_rec_type IS RECORD
34 (
35  inventory_item_id    NUMBER,
36  config_hdr_id    NUMBER,
37  config_rev_nbr    NUMBER
38 );
39 TYPE container_config_tbl_type IS TABLE OF container_config_rec_type INDEX BY BINARY_INTEGER;
40 
41 G_INCOMPATIBLE_API   EXCEPTION;
42 
43 -----declaration for debug message table
44 v_msg_tbl CZ_DEBUG_PUB.msg_text_list ;
45 
46 -------function that extracts the config err msg from xml
47 FUNCTION get_terminate_msg(p_str IN LONG) RETURN VARCHAR2
48 IS
49   l_start_tag       VARCHAR2(20) := '<message_text>';
50   l_end_tag         VARCHAR2(20) := '</message_text>';
51   l_start_msg       VARCHAR2(2000);
52   l_start_instr  NUMBER;
53   l_end_instr    NUMBER;
54   l_str_len    NUMBER;
55 
56 BEGIN
57   l_start_instr := INSTR(p_str,l_start_tag);
58   l_str_len     := LENGTH(p_str);
59   l_start_msg   := SUBSTR(p_str,l_start_instr);
60   l_start_msg   := SUBSTR(l_start_msg,15,l_str_len);
61   l_end_instr   := INSTR(l_start_msg,l_end_tag);
62   l_start_msg   := SUBSTR(l_start_msg,1,l_end_instr-1);
63   l_start_msg   := SUBSTR(l_start_msg,1,2000);
64   RETURN l_start_msg;
65 EXCEPTION
66   WHEN OTHERS THEN
67     l_start_msg := SUBSTR(p_str,1,2000);
68     RETURN l_start_msg;
69 END get_terminate_msg;
70 
71 ----procedure that populates debug messages
72 PROCEDURE populate_debug_message(p_msg     IN VARCHAR2,
73                                  p_caller  IN VARCHAR2,
74                                  p_sqlcode IN NUMBER)
75 IS
76   l_caller cz_db_logs.caller%TYPE;
77 
78 BEGIN
79   IF (p_caller IS NULL) THEN
80     l_caller := 'CZ_NETWORK_API';
81   ELSE
82     l_caller := p_caller;
83   END IF;
84   CZ_DEBUG_PUB.populate_debug_message(p_msg,p_caller,NVL(p_sqlcode,0),v_msg_tbl);
85 END populate_debug_message;
86 ------------------------------------------------------------------------
87 -----procedure that writes messages to the FND stack
88 PROCEDURE set_fnd_message(inMessageName IN VARCHAR2,
89                           inToken1 IN VARCHAR2 DEFAULT NULL, inValue1 IN VARCHAR2 DEFAULT NULL,
90                           inToken2 IN VARCHAR2 DEFAULT NULL, inValue2 IN VARCHAR2 DEFAULT NULL,
91                           inToken3 IN VARCHAR2 DEFAULT NULL, inValue3 IN VARCHAR2 DEFAULT NULL,
92                           inToken4 IN VARCHAR2 DEFAULT NULL, inValue4 IN VARCHAR2 DEFAULT NULL,
93                           inToken5 IN VARCHAR2 DEFAULT NULL, inValue5 IN VARCHAR2 DEFAULT NULL,
94                           inToken6 IN VARCHAR2 DEFAULT NULL, inValue6 IN VARCHAR2 DEFAULT NULL
95                          )
96 IS
97 
98 BEGIN
99   FND_MESSAGE.SET_NAME('CZ', inMessageName);
100   IF (inToken1 IS NOT NULL) THEN
101     FND_MESSAGE.SET_TOKEN(inToken1, inValue1);
102   END IF;
103 
104   IF (inToken2 IS NOT NULL) THEN
105     FND_MESSAGE.SET_TOKEN(inToken2, inValue2);
106   END IF;
107 
108   IF (inToken3 IS NOT NULL) THEN
109     FND_MESSAGE.SET_TOKEN(inToken3, inValue3);
110   END IF;
111 
112   IF (inToken4 IS NOT NULL) THEN
113     FND_MESSAGE.SET_TOKEN(inToken4, inValue4);
114   END IF;
115 
116   IF (inToken5 IS NOT NULL) THEN
117     FND_MESSAGE.SET_TOKEN(inToken5, inValue5);
118   END IF;
119 
120   IF (inToken6 IS NOT NULL) THEN
121     FND_MESSAGE.SET_TOKEN(inToken6, inValue6);
122   END IF;
123 
124   FND_MSG_PUB.ADD;
125 END set_fnd_message;
126 
127 -------------------------------------------------------------------------
128 -------calling applications default publication parameters to G_MISS_DATE, G_MISS_CHAR etc
129 -------In  such cases default the parameter to NULL.
130 ----default pb applicability parameters to NULL if no values are passed in
131 PROCEDURE default_pb_parameters(p_appl_param_rec IN OUT NOCOPY CZ_API_PUB.appl_param_rec_type,
132                                 x_return_status  IN OUT NOCOPY VARCHAR2)
133 IS
134   APPLID_NOT_FOUND EXCEPTION;
135 
136 BEGIN
137 
138   x_return_status := FND_API.G_RET_STS_SUCCESS;
139 
140   IF (p_appl_param_rec.config_creation_date = FND_API.G_MISS_DATE) THEN
141     p_appl_param_rec.config_creation_date := NULL;
142   END IF;
143 
144   IF (p_appl_param_rec.config_model_lookup_date = FND_API.G_MISS_DATE) THEN
145     p_appl_param_rec.config_model_lookup_date := NULL;
146   END IF;
147 
148   IF (p_appl_param_rec.config_effective_date = FND_API.G_MISS_DATE) THEN
149     p_appl_param_rec.config_effective_date := NULL;
150   END IF;
151 
152   IF (p_appl_param_rec.usage_name = FND_API.G_MISS_CHAR) THEN
153     p_appl_param_rec.usage_name := NULL;
154   END IF;
155 
156   IF (p_appl_param_rec.publication_mode = FND_API.G_MISS_CHAR) THEN
157     p_appl_param_rec.publication_mode := NULL;
158   END IF;
159 
160   IF (p_appl_param_rec.language = FND_API.G_MISS_CHAR) THEN
161     p_appl_param_rec.language := NULL;
162   END IF;
163 
164   IF ( (p_appl_param_rec.calling_application_id = FND_API.G_MISS_NUM) OR (p_appl_param_rec.calling_application_id IS NULL) ) THEN
165     RAISE APPLID_NOT_FOUND;
166   END IF;
167 EXCEPTION
168   WHEN APPLID_NOT_FOUND THEN
169     x_return_status := FND_API.G_RET_STS_ERROR;
170     set_fnd_message('CZ_NET_APPL_ID_ISNULL',null,null,null,null);
171   WHEN OTHERS THEN
172     x_return_status := FND_API.G_RET_STS_ERROR;
173 END default_pb_parameters;
174 -----------------------------------------------------------------------
175 ----procedure that sets the the return status to error
176 ----and populates the error message stack
177 PROCEDURE set_error_message(p_err_code  IN OUT NOCOPY VARCHAR2,
178                             p_msg_count IN OUT NOCOPY NUMBER,
179                             p_msg_data  IN OUT NOCOPY VARCHAR2,
180                             p_err_msg   IN VARCHAR2)
181 IS
182 
183 BEGIN
184   p_err_code := FND_API.G_RET_STS_ERROR;
185   fnd_msg_pub.count_and_get(p_count => p_msg_count,p_data  => p_msg_data);
186   populate_debug_message(p_err_msg,NULL,NULL);
187   CZ_DEBUG_PUB.insert_into_logs(v_msg_tbl);
188 END set_error_message;
189 
190 ---------------------------------------------------------------------------
191 ----procedure that deletes the saved configurations
192 PROCEDURE delete_configuration(p_config_model_tbl IN cz_api_pub.config_model_tbl_type)
193 IS
194   PRAGMA AUTONOMOUS_TRANSACTION;
195   l_err_buf   VARCHAR2(2000);
196   l_msg_data  VARCHAR2(2000);
197   l_msg_count NUMBER;
198   l_err_code  VARCHAR2(30);
199   l_usage_exists   NUMBER;
200   l_error_message  VARCHAR2(2000);
201   l_Return_value   NUMBER;
202 
203 BEGIN
204   IF (p_config_model_tbl.COUNT > 0) THEN
205     FOR I IN p_config_model_tbl.FIRST..p_config_model_tbl.LAST
206     LOOP
207       -- this needs to change to call cz_cf_api.delete_configuration
208       cz_cf_api.delete_configuration(p_config_model_tbl(i).config_hdr_id,
209                                      p_config_model_tbl(i).config_rev_nbr,
210                                      l_usage_exists,
211                                      l_error_message,
212                                      l_Return_value);
213       IF (l_Return_value <> 1) THEN
214         l_err_buf := CZ_UTILS.GET_TEXT('CZ_NET_API_DEL_CFG_ERR','ConfigHdrId',
215             p_config_model_tbl(i).config_hdr_id,'ConfigRevNbr',p_config_model_tbl(i).config_rev_nbr);
216       END IF;
217     END LOOP;
218   END IF;
219 EXCEPTION
220   WHEN OTHERS THEN
221     l_err_buf := CZ_UTILS.GET_TEXT('CZ_NET_API_DEL_CONFIG_ERR');
222     set_error_message(l_err_code,l_msg_count,l_msg_data,l_err_buf);
223     set_error_message(l_err_code,l_msg_count,l_msg_data,'delete config err');
224 END delete_configuration;
225 ---------------------------------------------------------------------------
226 ----procedure that retrieves the model instantiation type and
227 ----component instance type for a config hdr and rev nbr
228 PROCEDURE get_header_types(p_config_hdr_id  IN NUMBER,
229                            p_config_rev_nbr IN NUMBER,
230                            x_model_instantiation_type OUT NOCOPY VARCHAR2,
231                            x_component_instance_type  OUT NOCOPY VARCHAR2)
232 IS
233 
234 BEGIN
235   SELECT model_instantiation_type,
236          component_instance_type
237     INTO x_model_instantiation_type,
238          x_component_instance_type
239   FROM   cz_config_hdrs
240   WHERE  cz_config_hdrs.config_hdr_id  = p_config_hdr_id
241   AND    cz_config_hdrs.config_rev_nbr = p_config_rev_nbr;
242 EXCEPTION
243   WHEN OTHERS THEN
244      x_model_instantiation_type := '0';
245      x_component_instance_type  := '0';
246 END get_header_types;
247 
248 --------------------------------------------------------------------------
249 ----procedure that retrieves the root inventory item id and organization id for a
250 ----given config_hdr_id and rev nbr
251 procedure get_root_bom_config_item(p_config_hdr_id     IN  NUMBER,
252                                    p_config_rev_nbr    IN  NUMBER,
253                                    x_inventory_item_id OUT NOCOPY  NUMBER,
254                                    x_organization_id   OUT NOCOPY  NUMBER,
255                                    x_config_item_id    OUT NOCOPY   NUMBER)
256 IS
257 
258 BEGIN
259   SELECT config_item_id, inventory_item_id, organization_id
260     INTO x_config_item_id, x_inventory_item_id, x_organization_id
261   FROM  cz_config_items
262   WHERE config_hdr_id  = p_config_hdr_id
263   AND   config_rev_nbr = p_config_rev_nbr
264   AND   deleted_flag   = '0'
265   AND   inventory_item_id IS NOT NULL
266   START WITH (parent_config_item_id IS NULL OR parent_config_item_id = -1)
267     AND config_hdr_id = p_config_hdr_id AND config_rev_nbr = p_config_rev_nbr
268   CONNECT BY PRIOR inventory_item_id IS NULL
269     AND parent_config_item_id = PRIOR config_item_id
270     AND config_hdr_id = p_config_hdr_id AND config_rev_nbr = p_config_rev_nbr;
271 EXCEPTION
272   WHEN OTHERS THEN
273     x_inventory_item_id := -1;
274     x_organization_id   := -1;
275 END get_root_bom_config_item;
276 
277 --------------------------------------------------------------------------
278 PROCEDURE get_container_header(p_config_hdr_id     NUMBER,
279                                p_config_rev_nbr    NUMBER,
280                                x_container_hdr_id  OUT NOCOPY NUMBER,
281                                x_container_rev_nbr OUT NOCOPY NUMBER)
282 IS
283 
284 BEGIN
285   ----get container header
286   SELECT config_hdr_id, config_rev_nbr
287     INTO x_container_hdr_id, x_container_rev_nbr
288   FROM   cz_config_items
289   WHERE  cz_config_items.instance_hdr_id  = p_config_hdr_id
290   AND    cz_config_items.instance_rev_nbr = p_config_rev_nbr
291   AND    cz_config_items.deleted_flag = '0'
292   AND    ROWNUM < 2;
293 EXCEPTION
294   WHEN OTHERS THEN
295     x_container_hdr_id  := -1;
296     x_container_rev_nbr := -1;
297 END get_container_header;
298 
299 --------------------------------------------------------------------------
300 PROCEDURE check_if_item_exists(p_inv_item_id IN NUMBER,
301                                p_org_id      IN NUMBER,
302                                container_model_tbl IN container_model_tbl_type,
303                                x_out_index   OUT NOCOPY NUMBER,
304                                x_flag     OUT NOCOPY BOOLEAN)
305 IS
306 
307 BEGIN
308   x_flag := FALSE;
309   x_out_index := 0;
310   IF (container_model_tbl.COUNT > 0) THEN
311     FOR I IN container_model_tbl.FIRST..container_model_tbl.LAST
312     LOOP
313       IF ( (container_model_tbl(i).inventory_item_id = p_inv_item_id) AND
314            (container_model_tbl(i).organization_id = p_org_id) ) THEN
315         x_flag := TRUE;
316         x_out_index := i;
317       END IF;
318     END LOOP;
319   END IF;
320 EXCEPTION
321   WHEN OTHERS THEN
322     x_flag := FALSE;
323 END check_if_item_exists;
324 
325 -------------------------------------------------------------------------
326 PROCEDURE validate_org_id(container_model_tbl IN container_model_tbl_type,
327                           x_flag OUT NOCOPY BOOLEAN)
328 IS
329   prev_org_id  NUMBER;
330 
331 BEGIN
332   x_flag := TRUE;
333   IF (container_model_tbl.COUNT > 0) THEN
334     FOR I IN container_model_tbl.FIRST..container_model_tbl.LAST
335     LOOP
336       prev_org_id := container_model_tbl(i).organization_id;
337       IF (i <> container_model_tbl.COUNT) THEN
338         IF (prev_org_id <> container_model_tbl(i+1).organization_id) THEN
339           x_flag := FALSE;
340           EXIT;
341         END IF;
342       END IF;
343     END LOOP;
344   END IF;
345 EXCEPTION
346   WHEN OTHERS THEN
347     x_flag := FALSE;
348 END validate_org_id;
349 
350 -------------------------------------------------------------------------
351 ------procedure that sets the deltas to 0 for the new configuration
352 ------after a call is made to copy configuration
353 PROCEDURE reset_config_delta (p_config_hdr_id  IN NUMBER,
354                               p_config_rev_nbr IN NUMBER)
355 IS
356 
357 BEGIN
358   UPDATE cz_config_items
359   SET    config_delta = 0
360   WHERE  config_hdr_id = p_config_hdr_id
361   AND    config_rev_nbr = p_config_rev_nbr;
362 END reset_config_delta ;
363 
364 --------------------------------------------------------------------------
365 PROCEDURE write_dummy_config(p_inventory_id    IN NUMBER,
366                              p_inst_hdr_id_tbl IN container_config_tbl_type,
367                              x_dummy_hdr_id    OUT NOCOPY NUMBER)
368 IS
369 
370 --These values do not really matter. We only provide them because corresponding columns
371 --are not null.
372 
373 ANY_USAGE_ID          CONSTANT NUMBER      := -1;
374 NETWORK               CONSTANT VARCHAR2(1) := 'N';
375 ROOT                  CONSTANT VARCHAR2(1) := 'R';
376 INPUTTTYPECODE        CONSTANT NUMBER      := 7;
377 
378 TYPE t_local_number_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
379 
380 l_inst_header_id_tbl  t_local_number_tbl;
381 l_input_id_tbl        t_local_number_tbl;
382 
383 BEGIN
384 
385    SELECT cz_config_hdrs_s.NEXTVAL INTO x_dummy_hdr_id FROM DUAL;
386 
387    FOR i IN 1..p_inst_hdr_id_tbl.COUNT LOOP
388 
389      IF(p_inst_hdr_id_tbl(i).inventory_item_id = p_inventory_id)THEN
390 
391        l_inst_header_id_tbl(l_inst_header_id_tbl.COUNT + 1) := p_inst_hdr_id_tbl(i).config_hdr_id;
392        l_input_id_tbl(l_inst_header_id_tbl.COUNT) := l_inst_header_id_tbl.COUNT;
393      END IF;
394    END LOOP;
395 
396    INSERT INTO cz_config_hdrs ( config_hdr_id
397                               , config_rev_nbr
398                               , name
399                               , desc_text
400                               , effective_usage_id
401                               , deleted_flag
402                               , config_delta_spec
403                               , component_instance_type
404                               , model_instantiation_type
405                               , has_failures
406                               )
407                       VALUES  ( x_dummy_hdr_id
408                               , 1
409                               , 'generate/add_to_config_tree'
410                               , 'generate/add_to_config_tree'
411                               , ANY_USAGE_ID
412                               , '0'
413 			      , 0
414 			      , ROOT
415 			      , NETWORK
416                               , 0
417                               );
418 
419    FORALL i IN 1..l_inst_header_id_tbl.COUNT
420      INSERT INTO cz_config_contents_v ( config_hdr_id
421                                       , config_rev_nbr
422                                       , config_input_id
423                                       , input_seq
424                                       , input_type_code
425                                       , input_num_val
426                                       , item_num_val
427                                       , config_item_id
428                                       , item_type_code
429                                       , instance_hdr_id
430                                       , instance_rev_nbr
431                                       , component_instance_type
432                                       , config_delta
433                                       )
434                                VALUES ( x_dummy_hdr_id
435                                       , 1
436                                       , l_input_id_tbl(i)
437                                       , l_input_id_tbl(i)
438                                       , INPUTTTYPECODE
439                                       , l_inst_header_id_tbl(i)
440                                       , l_inst_header_id_tbl(i)
441                                       , -1 * l_input_id_tbl(i)
442                                       , -1
443                                       , x_dummy_hdr_id
444                                       , 1
445                                       , 'R'
446                                       , 0
447                                       );
448 END write_dummy_config;
449 
450 --------------------------------------------------------------------------
451 PROCEDURE delete_dummy_config(p_dummy_hdr_id IN NUMBER)
452 IS
453 
454 v_cfg_delete     cz_db_settings.value%TYPE;
455 
456 BEGIN
457 
458     -----delete based on setting in cz_db_settings
459     BEGIN
460         SELECT value INTO v_cfg_delete
461           FROM cz_db_settings
462          WHERE setting_id = 'BatchValConfigInputDelete';
463     EXCEPTION
464       WHEN OTHERS THEN
465           v_cfg_delete := 'NO';
466     END;
467 
468     IF(v_cfg_delete <> 'YES')THEN
469 
470       DELETE FROM cz_config_contents_v WHERE config_hdr_id = p_dummy_hdr_id
471          AND config_rev_nbr = 1;
472 
473       DELETE FROM cz_config_hdrs WHERE config_hdr_id = p_dummy_hdr_id
474          AND config_rev_nbr = 1;
475     END IF;
476 END delete_dummy_config;
477 
478 --------------------------------------------------------------------------
479 ------procedure that creates the init msg
480 PROCEDURE create_hdr_xml( p_inventory_id      IN NUMBER,
481                           p_organization_id   IN NUMBER,
482                           p_config_hdr_id     IN NUMBER,
483                           p_config_rev_nbr    IN NUMBER,
484                           p_dummy_header_id   IN NUMBER,
485                           p_appl_params       IN CZ_API_PUB.appl_param_rec_type,
486                           p_tree_copy_mode    IN VARCHAR2,
487                           p_valid_context     IN VARCHAR2,
488                           x_xml_hdr           OUT NOCOPY VARCHAR2 )
489 IS
490 
491 TYPE param_name_type IS TABLE OF VARCHAR2(30)INDEX BY BINARY_INTEGER;
492 TYPE param_value_type IS TABLE OF VARCHAR2(200)INDEX BY BINARY_INTEGER;
493 param_name  param_name_type;
494 param_value param_value_type;
495 
496 l_rec_index BINARY_INTEGER;
497 
498 l_database_id                     VARCHAR2(100);
499 l_save_config_behavior            VARCHAR2(30):= CZ_API_PUB.G_NEW_REVISION_COPY_MODE;
500 l_ui_type                         VARCHAR2(30):= null;
501 l_msg_behavior                    VARCHAR2(30):= 'brief';
502 l_context_org_id                  VARCHAR2(80);
503 l_inventory_item_id               VARCHAR2(80);
504 l_config_header_id                VARCHAR2(80);
505 l_config_rev_nbr                  VARCHAR2(80);
506 l_model_quantity                  VARCHAR2(80);
507 l_count                           NUMBER;
508 
509 -- message related
510 l_xml_hdr                         VARCHAR2(32767):= '<initialize>';
511 l_dummy                           VARCHAR2(500) := NULL;
512 l_return_status                   VARCHAR2(1)   := FND_API.G_RET_STS_SUCCESS;
513 
514 BEGIN
515   ---- now set the values from model_rec and org_id
516   l_context_org_id     := to_char(p_organization_id);
517   l_inventory_item_id     := to_char(p_inventory_id);
518   l_config_header_id      := to_char(p_config_hdr_id);
519   l_config_rev_nbr        := to_char(p_config_rev_nbr);
520 
521   -- profiles and env. variables.
522   l_database_id           := fnd_web_config.database_id;
523 
524   -- set param_names
525   param_name(1)  := 'database_id';
526   param_name(2)  := 'context_org_id';
527   param_name(3)  := 'config_creation_date';
528   param_name(4)  := 'calling_application_id';
529   param_name(5)  := 'responsibility_id';
530   param_name(6)  := 'model_id';
531   param_name(7)  := 'config_header_id';
532   param_name(8)  := 'config_rev_nbr';
533   param_name(9)  := 'config_effective_date';
534   param_name(10) := 'save_config_behavior';
535   param_name(11) := 'ui_type';
536   param_name(12) := 'language';
537   param_name(13) := 'terminate_msg_behavior';
538   param_name(14) := 'model_quantity';
539   param_name(15) := 'icx_session_ticket';
540   param_name(16) := 'publication_mode';
541   param_name(17) := 'usage_name';
542   param_name(18) := 'sbm_flag';
543   param_name(19) := 'validation_context';
544   param_name(20) := 'suppress_baseline_errors';
545 
546   l_count := 20;
547 
548   -- set param values
549   param_value(1)  := l_database_id;
550   param_value(2)  := l_context_org_id;
551   param_value(3)  := to_char(sysdate,'MM-DD-YYYY-HH24-MI-SS');
552   param_value(4)  := p_appl_params.calling_application_id;
553   param_value(5)  := fnd_profile.value('RESP_ID');
554   param_value(6)  := l_inventory_item_id;
555   param_value(7)  := l_config_header_id;
556   param_value(8)  := l_config_rev_nbr;
557 
558   -- config_effective_date should have LONG DATE FORMAT --
559   param_value(9)  := to_char(p_appl_params.config_effective_date,'MM-DD-YYYY-HH24-MI-SS');
560 
561   IF (p_tree_copy_mode = CZ_API_PUB.G_NEW_HEADER_COPY_MODE) THEN
562     l_save_config_behavior := 'new_config';
563   ELSIF (p_tree_copy_mode = CZ_API_PUB.G_NEW_REVISION_COPY_MODE) THEN
564     l_save_config_behavior := 'new_revision';
565   END IF;
566 
567   param_value(10) := l_save_config_behavior;
568   param_value(11) := l_ui_type;
569   param_value(12) := p_appl_params.language;
570   param_value(13) := l_msg_behavior;
571   param_value(14) := l_model_quantity;
572   param_value(15) := cz_cf_api.icx_session_ticket;
573   param_value(16) := p_appl_params.publication_mode;
574   param_value(17) := p_appl_params.usage_name;
575   param_value(18) := 'TRUE';
576 
577   IF (p_valid_context = 'I') THEN
578     param_value(19) := 'INSTALLED';
579   ELSIF (p_valid_context = 'P') THEN
580     param_value(19) := 'PENDING_OR_INSTALLED';
581   ELSE
582     param_value(19) := 'I';
583   END IF;
584   param_value(20) := 'TRUE';
585 
586   l_rec_index := 1;
587   LOOP
588     ----- ex : <param name="config_header_id">1890</param>
589     IF (param_value(l_rec_index) IS NOT NULL) THEN
590       l_dummy :=  '<param name='||'"'||param_name(l_rec_index)||'"'||'>'|| param_value(l_rec_index)||'</param>';
591       l_xml_hdr := l_xml_hdr || l_dummy;
592     END IF;
593     l_dummy := NULL;
594     l_rec_index := l_rec_index + 1;
595     EXIT WHEN l_rec_index > l_count;
596   END LOOP;
597 
598   -- add termination tags
599   l_xml_hdr := l_xml_hdr || '</initialize>';
600 
601   --add the config instance section
602   l_xml_hdr := l_xml_hdr ||
603      '<config_instance>' ||
604         '<config_header_id>' || TO_CHAR(p_dummy_header_id) || '</config_header_id>' ||
605         '<config_rev_nbr>1</config_rev_nbr>' ||
606      '</config_instance>';
607 
608   l_xml_hdr := REPLACE(l_xml_hdr, ' ' , '+');
609   x_xml_hdr := l_xml_hdr;
610 
611   ----added for debugging
612   populate_debug_message(l_xml_hdr,'CREATE_HDR_XML',NULL);
613 
614 EXCEPTION
615   WHEN OTHERS THEN
616     ----is error to be logged ? if so what ?
617     RAISE;
618 END create_hdr_xml;
619 
620 --------------------------------------------------------------------------
621 PROCEDURE  parse_output_xml(p_xml                IN  LONG,
622                             x_config_header_id   OUT NOCOPY NUMBER,
623                             x_config_rev_nbr     OUT NOCOPY NUMBER,
624                             x_return_status      OUT NOCOPY VARCHAR2)
625 IS
626 
627 CURSOR messages(p_config_hdr_id NUMBER, p_config_rev_nbr NUMBER) IS
628                   SELECT constraint_type , message
629                   FROM   cz_config_messages
630                   WHERE  config_hdr_id = p_config_hdr_id
631                   AND    config_rev_nbr = p_config_rev_nbr;
632 l_exit_start_tag        VARCHAR2(20) := '<EXIT>';
633 l_exit_end_tag          VARCHAR2(20) := '</EXIT>';
634 l_exit_start_pos        NUMBER;
635 l_exit_end_pos          NUMBER;
636 l_config_header_id_start_tag  VARCHAR2(20) := '<CONFIG_HEADER_ID>';
637 l_config_header_id_end_tag    VARCHAR2(20) := '</CONFIG_HEADER_ID>';
638 l_config_header_id_start_pos  NUMBER;
639 l_config_header_id_end_pos    NUMBER;
640 l_config_rev_nbr_start_tag    VARCHAR2(20) := '<CONFIG_REV_NBR>';
641 l_config_rev_nbr_end_tag      VARCHAR2(20) := '</CONFIG_REV_NBR>';
642 l_config_rev_nbr_start_pos    NUMBER;
643 l_config_rev_nbr_end_pos      NUMBER;
644 l_message_text_start_tag      VARCHAR2(20) := '<MESSAGE_TEXT>';
645 l_message_text_end_tag        VARCHAR2(20) := '</MESSAGE_TEXT>';
646 l_message_text_start_pos      NUMBER;
647 l_message_text_end_pos        NUMBER;
648 l_message_type_start_tag      VARCHAR2(20) := '<MESSAGE_TYPE>';
649 l_message_type_end_tag        VARCHAR2(20) := '</MESSAGE_TYPE>';
650 l_message_type_start_pos      NUMBER;
651 l_message_type_end_pos        NUMBER;
652 l_exit                        VARCHAR(20);
653 l_config_header_id            NUMBER;
654 l_config_rev_nbr              NUMBER;
655 l_message_text                VARCHAR2(2000);
656 l_message_type                VARCHAR2(200);
657 l_list_price                  NUMBER;
658 l_selection_line_id           NUMBER;
659 l_valid_config                VARCHAR2(10);
660 l_complete_config             VARCHAR2(10);
661 l_header_id                   NUMBER;
662 l_line_id                     NUMBER ;
663 l_return_status               VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
664 l_return_status_del           VARCHAR2(1);
665 l_msg                         VARCHAR2(2000);
666 l_msg_data                    VARCHAR2(2000);
667 l_msg_count                   NUMBER;
668 l_constraint                  VARCHAR2(16);
669 l_flag                        VARCHAR2(1) := 'N';
670 
671 BEGIN
672   l_exit_start_pos := INSTR(UPPER(p_xml), l_exit_start_tag,1, 1) + length(l_exit_start_tag);
673   l_exit_end_pos   := INSTR(UPPER(p_xml), l_exit_end_tag,1, 1) - 1;
674   l_exit           := SUBSTR(p_xml,l_exit_start_pos,l_exit_end_pos - l_exit_start_pos + 1);
675 
676   -- get the latest config_header_id, and rev_nbr to get
677   -- messages if any.
678   l_config_header_id_start_pos := INSTR(UPPER(p_xml), l_config_header_id_start_tag, 1, 1)+ length(l_config_header_id_start_tag);
679   l_config_header_id_end_pos   := INSTR(UPPER(p_xml), l_config_header_id_end_tag, 1, 1) - 1;
680   l_config_header_id  := to_number(SUBSTR(p_xml,l_config_header_id_start_pos,l_config_header_id_end_pos - l_config_header_id_start_pos + 1));
681 
682   l_config_rev_nbr_start_pos   := INSTR(UPPER(p_xml), l_config_rev_nbr_start_tag, 1, 1)+ length(l_config_rev_nbr_start_tag);
683   l_config_rev_nbr_end_pos     := INSTR(UPPER(p_xml), l_config_rev_nbr_end_tag, 1, 1) - 1;
684   l_config_rev_nbr    := to_number(SUBSTR(p_xml,l_config_rev_nbr_start_pos,l_config_rev_nbr_end_pos - l_config_rev_nbr_start_pos + 1));
685 
686   -----no need to check if valid_config or complete_config
687   ----fix for bug# 2937753
688   IF ( (l_exit is NULL) OR (UPPER(l_exit) = 'ERROR') ) THEN
689     RAISE FND_API.G_EXC_ERROR;
690   ELSE
691     -- if everything ok, set return values
692     x_return_status    := l_return_status;
693     x_config_header_id := l_config_header_id;
694     x_config_rev_nbr   := l_config_rev_nbr;
695   END IF;
696 EXCEPTION
697   WHEN FND_API.G_EXC_ERROR THEN
698     x_return_status := FND_API.G_RET_STS_ERROR;
699   WHEN OTHERS THEN
700     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
701 END Parse_output_xml;
702 
703 --------------------------------------------------------------------------
704 ----procedure that logs trace for network API
705 PROCEDURE trace_gen_config_trees (p_api_version        IN  NUMBER,
706                                   p_config_tbl         IN  CZ_API_PUB.config_tbl_type,
707                                   p_tree_copy_mode     IN  VARCHAR2,
708                                   p_appl_param_rec     IN  CZ_API_PUB.appl_param_rec_type,
709                                   p_validation_context IN  VARCHAR2,
710                                   p_config_model_tbl   IN OUT NOCOPY CZ_API_PUB.config_model_tbl_type,
711                                   p_return_status      IN OUT NOCOPY VARCHAR2)
712 IS
713 PRAGMA AUTONOMOUS_TRANSACTION;
714 TYPE trace_tbl IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
715 l_trace_tbl   trace_tbl ;
716 l_trace_count NUMBER := 0;
717 l_trace_value cz_db_settings.value%type;
718 
719 BEGIN
720   BEGIN
721     SELECT value
722     INTO   l_trace_value
723     FROM   cz_db_settings
724     WHERE  cz_db_settings.setting_id = 'NetworkApiTrace';
725   EXCEPTION
726     WHEN OTHERS THEN
727       l_trace_value := 'NO';
728   END;
729 
730   IF (l_trace_value = 'YES') THEN
731     l_trace_count := 1;
732     l_trace_tbl(l_trace_count) := 'Api version            : '||to_char(p_api_version);
733     l_trace_count := l_trace_count + 1;
734     l_trace_tbl(l_trace_count) := 'Tree copy mode         : '||p_tree_copy_mode;
735     l_trace_count := l_trace_count + 1;
736     l_trace_tbl(l_trace_count) := 'Publication applicability parameters';
737     l_trace_count := l_trace_count + 1;
738     l_trace_tbl(l_trace_count) := 'config_effective_date  : '||to_char(p_appl_param_rec.config_effective_date,'mm-dd-yyyy hh24:mi:ss');
739     l_trace_count := l_trace_count + 1;
740     l_trace_tbl(l_trace_count) := 'calling_application_id : '||to_char(p_appl_param_rec.calling_application_id);
741     l_trace_count := l_trace_count + 1;
742     l_trace_tbl(l_trace_count) := 'usage_name             : '||p_appl_param_rec.usage_name;
743     l_trace_count := l_trace_count + 1;
744     l_trace_tbl(l_trace_count) := 'publication_mode       : '||p_appl_param_rec.publication_mode;
745     l_trace_count := l_trace_count + 1;
746     l_trace_tbl(l_trace_count) := 'language               : '||p_appl_param_rec.language;
747     l_trace_count := l_trace_count + 1;
748     l_trace_tbl(l_trace_count) := 'Validation context     : '||p_validation_context;
749     l_trace_count := l_trace_count + 1;
750     l_trace_tbl(l_trace_count) := 'Input configs from calling application';
751 
752     IF (p_config_tbl.COUNT > 0) THEN
753       FOR I IN p_config_tbl.FIRST..p_config_tbl.LAST
754       LOOP
755         l_trace_count := l_trace_count + 1;
756         l_trace_tbl(l_trace_count) := 'Input config hdr id : '||to_char(p_config_tbl(i).config_hdr_id);
757         l_trace_count := l_trace_count + 1;
758         l_trace_tbl(l_trace_count) := 'Input config rev nbr: '||to_char(p_config_tbl(i).config_rev_nbr);
759       END LOOP;
760     END IF;
761 
762     l_trace_count := l_trace_count + 1;
763     l_trace_tbl(l_trace_count) := 'Output configs sent to calling application';
764 
765     IF (p_config_model_tbl.COUNT > 0) THEN
766       FOR I IN p_config_model_tbl.FIRST..p_config_model_tbl.LAST
767       LOOP
768         l_trace_count := l_trace_count + 1;
769         l_trace_tbl(l_trace_count) := 'Ouput  config hdr id  : '||to_char(p_config_model_tbl(i).config_hdr_id);
770         l_trace_count := l_trace_count + 1;
771         l_trace_tbl(l_trace_count) := 'Output config rev nbr : '||to_char(p_config_model_tbl(i).config_rev_nbr);
772         l_trace_count := l_trace_count + 1;
773         l_trace_tbl(l_trace_count) := 'Ouput  inv item id    : '||to_char(p_config_model_tbl(i).inventory_item_id);
774         l_trace_count := l_trace_count + 1;
775         l_trace_tbl(l_trace_count) := 'Output org id         : '||to_char(p_config_model_tbl(i).organization_id);
776         l_trace_count := l_trace_count + 1;
777         l_trace_tbl(l_trace_count) := 'Output config item id : '||to_char(p_config_model_tbl(i).config_item_id);
778         l_trace_count := l_trace_count + 1;
779       END LOOP;
780     END IF;
781 
782     l_trace_count := l_trace_count + 1;
783     l_trace_tbl(l_trace_count) := 'STATUS : '||p_return_status;
784 
785     IF (l_trace_tbl.COUNT > 0) THEN
786       FOR I IN l_trace_tbl.FIRST..l_trace_tbl.LAST
787       LOOP
788         insert into cz_db_logs (message,caller,logtime) values (l_trace_tbl(i),'CZNETAPI',sysdate);
789       END LOOP;
790       l_trace_tbl.DELETE;
791     END IF;
792   END IF;
793   COMMIT;
794 EXCEPTION
795   WHEN OTHERS THEN
796     ROLLBACK;
797 END trace_gen_config_trees;
798 
799 -------------------------------------------------------------------------
800 ----procedure that logs trace for network API
801 PROCEDURE trace_add_to_config_trees (p_api_version     IN  NUMBER,
802           p_inventory_item_id  IN  NUMBER,
803           p_organization_id    IN  NUMBER,
804           p_config_hdr_id      IN  NUMBER,
805           p_config_rev_nbr     IN  NUMBER,
806           p_instance_tbl       IN  CZ_API_PUB.config_tbl_type,
807           p_tree_copy_mode     IN  VARCHAR2,
808           p_appl_param_rec     IN  CZ_API_PUB.appl_param_rec_type,
809           p_validation_context IN  VARCHAR2,
810           x_config_model_rec   IN CZ_API_PUB.config_model_rec_type,
811           x_return_status      IN VARCHAR2,
812           x_msg_count          IN NUMBER,
813           x_msg_data           IN VARCHAR2)
814 IS
815 PRAGMA AUTONOMOUS_TRANSACTION;
816 TYPE trace_tbl IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
817 l_trace_tbl   trace_tbl ;
818 l_trace_count NUMBER := 0;
819 l_trace_value cz_db_settings.value%type;
820 
821 BEGIN
822   BEGIN
823     SELECT value
824     INTO   l_trace_value
825     FROM   cz_db_settings
826     WHERE  cz_db_settings.setting_id = 'NetworkApiTrace';
827   EXCEPTION
828     WHEN OTHERS THEN
829       l_trace_value := 'NO';
830   END;
831 
832   IF (l_trace_value = 'YES') THEN
833     l_trace_count := 1;
834     l_trace_tbl(l_trace_count) := 'Api version            : '||to_char(p_api_version);
835     l_trace_count := l_trace_count + 1;
836     l_trace_tbl(l_trace_count) := 'Tree copy mode         : '||p_tree_copy_mode;
837     l_trace_count := l_trace_count + 1;
838     l_trace_tbl(l_trace_count) := 'Publication applicability parameters';
839     l_trace_count := l_trace_count + 1;
840     l_trace_tbl(l_trace_count) := 'config_effective_date  : '||to_char(p_appl_param_rec.config_effective_date,'mm-dd-yyyy hh24:mi:ss');
841     l_trace_count := l_trace_count + 1;
842     l_trace_tbl(l_trace_count) := 'calling_application_id : '||to_char(p_appl_param_rec.calling_application_id);
843     l_trace_count := l_trace_count + 1;
844     l_trace_tbl(l_trace_count) := 'usage_name             : '||p_appl_param_rec.usage_name;
845     l_trace_count := l_trace_count + 1;
846     l_trace_tbl(l_trace_count) := 'publication_mode       : '||p_appl_param_rec.publication_mode;
847     l_trace_count := l_trace_count + 1;
848     l_trace_tbl(l_trace_count) := 'language               : '||p_appl_param_rec.language;
849     l_trace_count := l_trace_count + 1;
850     l_trace_tbl(l_trace_count) := 'Validation context     : '||p_validation_context;
851     l_trace_count := l_trace_count + 1;
852     l_trace_tbl(l_trace_count) := 'Input configs from calling application';
853 
854     IF (p_instance_tbl.COUNT > 0) THEN
855       FOR I IN p_instance_tbl.FIRST..p_instance_tbl.LAST
856       LOOP
857         l_trace_count := l_trace_count + 1;
858         l_trace_tbl(l_trace_count) := 'Input config hdr id : '||to_char(p_instance_tbl(i).config_hdr_id);
859         l_trace_count := l_trace_count + 1;
860         l_trace_tbl(l_trace_count) := 'Input config rev nbr: '||to_char(p_instance_tbl(i).config_rev_nbr);
861       END LOOP;
862     END IF;
863 
864     l_trace_count := l_trace_count + 1;
865     l_trace_tbl(l_trace_count) := 'Output configs sent to calling application';
866 
867     l_trace_count := l_trace_count + 1;
868     l_trace_tbl(l_trace_count) := 'Ouput  config hdr id  : '||to_char(nvl(x_config_model_rec.config_hdr_id,0));
869     l_trace_count := l_trace_count + 1;
870     l_trace_tbl(l_trace_count) := 'Output config rev nbr : '||to_char(nvl(x_config_model_rec.config_rev_nbr,0));
871     l_trace_count := l_trace_count + 1;
872     l_trace_tbl(l_trace_count) := 'Ouput  inv item id    : '||to_char(nvl(x_config_model_rec.inventory_item_id,0));
873     l_trace_count := l_trace_count + 1;
874     l_trace_tbl(l_trace_count) := 'Output org id         : '||to_char(nvl(x_config_model_rec.organization_id,0));
875     l_trace_count := l_trace_count + 1;
876     l_trace_tbl(l_trace_count) := 'Output config item id : '||to_char(nvl(x_config_model_rec.config_item_id,0));
877     l_trace_count := l_trace_count + 1;
878 
879     l_trace_count := l_trace_count + 1;
880     l_trace_tbl(l_trace_count) := 'STATUS : '||x_return_status;
881 
882     IF (l_trace_tbl.COUNT > 0) THEN
883       FOR I IN l_trace_tbl.FIRST..l_trace_tbl.LAST
884       LOOP
885         insert into cz_db_logs (message,caller,logtime) values (l_trace_tbl(i),'CZNETAPI',sysdate);
886       END LOOP;
887       l_trace_tbl.DELETE;
888     END IF;
889   END IF;
890   COMMIT;
891 EXCEPTION
892   WHEN OTHERS THEN
893     ROLLBACK;
894 END trace_add_to_config_trees;
895 
896 
897 ---------------------------------------------------------------------------
898 ---Start of comments
899 ---API name                 : generate_config_trees
900 ---Type          : Public
901 ---Pre-reqs                 : None
902 ---Function                 : generates config trees for a given set of config hdr ids and rev nbrs
903 ---Parameters               :
904 ---IN      : p_api_version        IN  NUMBER              Required
905 ---          p_config_tbl         IN  config_tbl_type     Required
906 ---          p_tree_copy_mode     IN  VARCHAR2            Required
907 ---          p_appl_param_rec     IN  appl_param_rec_type Required
908 ---          p_validation_context IN  VARCHAR2            Required
909 ---          p_validation_type    IN  VARCHAR2            valid values are :
910 ---                  CZ_API_PUB.INTERACTIVE, CZ_API_PUB.VALIDATE_RETURN
911 ---OUT     : x_return_status      OUT NOCOPY VARCHAR2
912 ---          x_msg_count          OUT NOCOPY NUMBER
913 ---          x_msg_data           OUT NOCOPY VARCHAR2
914 ---Version: Current version :1.0
915 ---End of comments
916 
917 PROCEDURE generate_config_trees(p_api_version        IN  NUMBER,
918                                 p_config_tbl         IN  CZ_API_PUB.config_tbl_type,
919                                 p_tree_copy_mode     IN  VARCHAR2,
920                                 p_appl_param_rec     IN  CZ_API_PUB.appl_param_rec_type,
921                                 p_validation_context IN  VARCHAR2,
922                                 p_validation_type    IN  VARCHAR2,
923                                 x_config_model_tbl   OUT NOCOPY CZ_API_PUB.config_model_tbl_type,
924                                 x_return_status      OUT NOCOPY VARCHAR2,
925                                 x_msg_count          OUT NOCOPY NUMBER,
926                                 x_msg_data           OUT NOCOPY VARCHAR2
927                                )
928 IS
929 PRAGMA AUTONOMOUS_TRANSACTION;
930 
931 l_api_name              CONSTANT VARCHAR2(30) := 'generate_config_trees';
932 l_api_version           CONSTANT NUMBER := 1.0;
933 l_config_hdr_id         cz_config_hdrs.config_hdr_id%TYPE;
934 l_config_rev_nbr        cz_config_hdrs.config_rev_nbr%TYPE;
935 l_main_config_hdr_id    cz_config_hdrs.config_hdr_id%TYPE;
936 l_main_config_rev_nbr   cz_config_hdrs.config_rev_nbr%TYPE;
937 l_inventory_item_id     cz_config_items.inventory_item_id%TYPE;
938 l_organization_id       cz_config_items.organization_id%TYPE;
939 l_config_item_id        cz_config_items.config_item_id%TYPE;
940 l_model_instantiation_type VARCHAR2(1);
941 l_component_instance_type  VARCHAR2(1);
942 container_model_tbl     container_model_tbl_type;
943 container_config_tbl    container_config_tbl_type;
944 exists_flag             BOOLEAN;
945 ORG_ID_FLAG             BOOLEAN;
946 inst_hdr_count          NUMBER := 0;
947 l_xml_hdr               VARCHAR2(32767);
948 l_batch_validate_msg    VARCHAR2(100);
949 v_config_hdr_id         NUMBER := 0;
950 v_config_rev_nbr        NUMBER := 0;
951 v_output_cfg_hdr_id     NUMBER := 0;
952 v_output_cfg_rev_nbr    NUMBER := 0;
953 v_valid_config          VARCHAR2(30);
954 v_complete_config       VARCHAR2(30);
955 l_copy_config_msg       VARCHAR2(2000);
956 config_input_list       cz_cf_api.cfg_input_list;
957 config_messages         cz_cf_api.cfg_output_pieces;
958 v_ouput_config_count    NUMBER := 0;
959 v_xml_str               LONG;
960 l_idx                   NUMBER;
961 inv_count               NUMBER := 0;
962 new_config_flag         VARCHAR2(1);
963 l_msg_count             NUMBER;
964 l_cp_msg_count          NUMBER;
965 l_msg_data              VARCHAR2(10000);
966 l_errbuf                VARCHAR2(2000);
967 l_copy_config_status    VARCHAR2(1);
968 validation_status       NUMBER;
969 v_parse_status          VARCHAR2(1);
970 l_validation_context    VARCHAR2(1);
971 l_url                   VARCHAR2(255);
972 l_orig_item_tbl         cz_api_pub.number_tbl_type;
973 l_new_item_tbl          cz_api_pub.number_tbl_type;
974 l_config_err_msg        VARCHAR2(2000);
975 l_dummy_config_hdr_id   NUMBER;
976 
977 NO_INPUT_RECORDS        EXCEPTION;
978 INPUT_TREE_MODE_NULL    EXCEPTION;
979 ORG_ID_EXCEP            EXCEPTION;
980 BATCH_VALID_FAILURE     EXCEPTION;
981 INVALID_CONTAINER_HDR   EXCEPTION;
982 INVALID_INV_ORG_ID      EXCEPTION;
983 INVALID_OUT_INV_ORG_ID  EXCEPTION;
984 INVALID_HEADER_TYPE     EXCEPTION;
985 INVALID_TREE_MODE_ERR   EXCEPTION;
986 INVALID_VALIDATION_TYPE EXCEPTION;
987 COPY_CONFIG_FAILURE_EXCEP EXCEPTION;
988 INVALID_HEADER_EXCEP    EXCEPTION;
989 BATCH_VALID_ERR         EXCEPTION;
990 PARSE_XML_ERROR         EXCEPTION;
991 INVALID_CONTEXT         EXCEPTION;
992 NO_VALIDATION_CONTEXT   EXCEPTION;
993 
994 BEGIN
995 
996   IF p_validation_type NOT IN(CZ_API_PUB.INTERACTIVE, CZ_API_PUB.VALIDATE_RETURN) THEN
997     RAISE INVALID_VALIDATION_TYPE;
998   END IF;
999 
1000   l_orig_item_tbl := cz_api_pub.NUMBER_TBL_TYPE();
1001   l_new_item_tbl  := cz_api_pub.NUMBER_TBL_TYPE();
1002 
1003   ----initialize return status to success
1004   x_return_status := FND_API.G_RET_STS_SUCCESS;
1005   fnd_msg_pub.initialize;
1006 
1007   ---check api version
1008   IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
1009     RAISE G_INCOMPATIBLE_API;
1010   END IF;
1011 
1012   ----verify that input array contains records
1013   IF (p_config_tbl.COUNT = 0) THEN
1014     RAISE NO_INPUT_RECORDS;
1015   END IF;
1016 
1017   ---verify that the input parameters are not null
1018   IF ( (p_tree_copy_mode IS NULL) OR (p_tree_copy_mode = FND_API.G_MISS_CHAR)) THEN
1019     RAISE INPUT_TREE_MODE_NULL;
1020   ELSIF (p_tree_copy_mode = CZ_API_PUB.G_NEW_HEADER_COPY_MODE) THEN
1021     new_config_flag := '0';
1022   ELSIF (p_tree_copy_mode = CZ_API_PUB.G_NEW_REVISION_COPY_MODE) THEN
1023     new_config_flag := '1';
1024   ELSE
1025     RAISE INVALID_TREE_MODE_ERR;
1026   END IF;
1027 
1028   ----verify validation context
1029   IF (p_validation_context IS NULL) THEN
1030     l_validation_context := NULL;
1031   ELSIF (p_validation_context = CZ_API_PUB.G_INSTALLED) THEN
1032     l_validation_context :=  CZ_API_PUB.G_INSTALLED;
1033   ELSIF (p_validation_context = CZ_API_PUB.G_PENDING_OR_INSTALLED) THEN
1034     l_validation_context := CZ_API_PUB.G_PENDING_OR_INSTALLED;
1035   ELSE
1036     RAISE INVALID_CONTEXT;
1037   END IF;
1038 
1039   container_model_tbl.DELETE;
1040   FOR configInstance IN p_config_tbl.FIRST..p_config_tbl.LAST
1041   LOOP
1042     IF (p_config_tbl(configInstance).config_hdr_id > 0) THEN
1043       l_config_hdr_id  := p_config_tbl(configInstance).config_hdr_id;
1044       l_config_rev_nbr := p_config_tbl(configInstance).config_rev_nbr;
1045       ----get header types
1046       get_header_types(l_config_hdr_id,l_config_rev_nbr,l_model_instantiation_type,l_component_instance_type);
1047 
1048       IF (l_model_instantiation_type = NETWORK) THEN
1049         IF (l_component_instance_type = INSTANCE_ROOT) THEN
1050           ----get container header
1051           get_container_header(l_config_hdr_id,l_config_rev_nbr,l_main_config_hdr_id,l_main_config_rev_nbr);
1052 
1053           ----if no container header is found raise exception
1054           IF ( (l_main_config_hdr_id = -1) OR (l_main_config_rev_nbr = -1) ) THEN
1055             RAISE INVALID_CONTAINER_HDR;
1056           END IF;
1057 
1058           ------get top inv item and org id
1059           get_root_bom_config_item(l_main_config_hdr_id,l_main_config_rev_nbr,l_inventory_item_id,l_organization_id,l_config_item_id);
1060 
1061           -----if no inv item id or org id is retrieved raise exception
1062           IF ( (l_inventory_item_id = -1) OR (l_organization_id = -1) ) THEN
1063             RAISE INVALID_INV_ORG_ID;
1064           END IF;
1065 
1066           ----check if the combination of inv item id and org id exists
1067           check_if_item_exists(l_inventory_item_id,l_organization_id,container_model_tbl,l_idx,exists_flag);
1068 
1069 
1070           ---if inv item and org id exists in the array then append instances else create a new rec
1071           inst_hdr_count := container_config_tbl.COUNT + 1;
1072           container_config_tbl(inst_hdr_count).inventory_item_id  := l_inventory_item_id;
1073           container_config_tbl(inst_hdr_count).config_hdr_id      := l_config_hdr_id;
1074           container_config_tbl(inst_hdr_count).config_rev_nbr     := l_config_rev_nbr;
1075           IF (NOT exists_flag) THEN
1076             inv_count      := container_model_tbl.COUNT + 1;
1077             inst_hdr_count := container_config_tbl.COUNT + 1;
1078             container_model_tbl(inv_count).inventory_item_id := l_inventory_item_id;
1079             container_model_tbl(inv_count).organization_id   := l_organization_id;
1080             container_model_tbl(inv_count).config_item_id    := l_config_item_id;
1081           END IF;
1082 
1083         ELSIF (l_component_instance_type = ROOT) THEN
1084           get_root_bom_config_item(l_config_hdr_id,l_config_rev_nbr,l_inventory_item_id,l_organization_id,l_config_item_id);
1085           v_config_hdr_id  := 0;
1086           v_config_rev_nbr := 0;
1087 
1088           CZ_CONFIG_API_PUB.copy_configuration(1.0,
1089                                                l_config_hdr_id,
1090                                                l_config_rev_nbr,
1091                                                p_tree_copy_mode,
1092                                                v_config_hdr_id,
1093                                                v_config_rev_nbr,
1094                                                l_orig_item_tbl,
1095                                                l_new_item_tbl,
1096                                                l_copy_config_status,
1097                                                l_cp_msg_count,
1098                                                l_copy_config_msg,
1099                                                NULL,
1100                                                NULL);
1101 
1102           IF (l_copy_config_status <> FND_API.G_RET_STS_SUCCESS) THEN
1103             RAISE COPY_CONFIG_FAILURE_EXCEP;
1104           ELSE
1105             reset_config_delta (v_config_hdr_id,v_config_hdr_id);
1106             v_ouput_config_count := x_config_model_tbl.COUNT + 1;
1107             x_config_model_tbl(v_ouput_config_count).config_hdr_id     := v_config_hdr_id;
1108             x_config_model_tbl(v_ouput_config_count).config_rev_nbr    := v_config_rev_nbr;
1109             x_config_model_tbl(v_ouput_config_count).inventory_item_id := l_inventory_item_id;
1110             x_config_model_tbl(v_ouput_config_count).organization_id   := l_organization_id;
1111             x_config_model_tbl(v_ouput_config_count).config_item_id    := l_config_item_id;
1112           END IF;
1113         ELSE
1114           RAISE INVALID_HEADER_TYPE;
1115         END IF; /* end if of l_component_instance_type = INSTANCE_ROOT */
1116       ELSE
1117         RAISE INVALID_HEADER_EXCEP;
1118       END IF; /* end if of l_model_instantiation_type = NETWORK */
1119     END IF;
1120   END LOOP;
1121 
1122   ---validate organization id in container_model_tbl
1123   ---if org ids are not the same then raise exception
1124   validate_org_id(container_model_tbl, org_id_flag);
1125   IF (NOT org_id_flag) THEN
1126     RAISE ORG_ID_EXCEP;
1127   END IF;
1128 
1129   -----batch validation for grouped network instances.
1130   IF (container_model_tbl.COUNT > 0) THEN
1131     FOR I IN container_model_tbl.FIRST..container_model_tbl.LAST
1132     LOOP
1133 
1134 
1135      BEGIN
1136        write_dummy_config ( container_model_tbl(i).inventory_item_id
1137                           , container_config_tbl
1138                           , l_dummy_config_hdr_id );
1139        COMMIT;
1140 
1141       create_hdr_xml( container_model_tbl(i).inventory_item_id,
1142                       container_model_tbl(i).organization_id,
1143                       null,
1144                       null,
1145                       l_dummy_config_hdr_id,
1146                       p_appl_param_rec,
1147                       p_tree_copy_mode,
1148                       l_validation_context,
1149                       l_xml_hdr);
1150 
1151       l_url := FND_PROFILE.VALUE('CZ_UIMGR_URL');
1152       config_messages.DELETE;
1153       cz_cf_api.validate(config_input_list,l_xml_hdr,config_messages,validation_status,l_url,p_validation_type);
1154 
1155      EXCEPTION
1156        WHEN OTHERS THEN
1157          delete_dummy_config ( l_dummy_config_hdr_id );
1158          COMMIT;
1159          RAISE;
1160      END;
1161 
1162      delete_dummy_config ( l_dummy_config_hdr_id );
1163      COMMIT;
1164 
1165       cz_debug_pub.get_batch_validate_message(validation_status,l_batch_validate_msg);
1166 
1167       IF (validation_status <> CZ_CF_API.CONFIG_PROCESSED) THEN
1168         RAISE BATCH_VALID_ERR;
1169       ELSE
1170         ----get config hdr id and config rev nbr from xml string
1171         IF (config_messages.COUNT > 0) THEN
1172           v_output_cfg_hdr_id := 0;
1173           v_xml_str := NULL;
1174 
1175           FOR xmlStr IN config_messages.FIRST..config_messages.LAST
1176           LOOP
1177             v_xml_str := v_xml_str||config_messages(xmlStr);
1178             populate_debug_message(config_messages(xmlStr),NULL,NULL);
1179           END LOOP;
1180         END IF;
1181 
1182         parse_output_xml (v_xml_str,
1183                           v_output_cfg_hdr_id,
1184                           v_output_cfg_rev_nbr,
1185                           v_parse_status);
1186 
1187         ----if error in parsing xml raise an exception
1188         IF (v_parse_status <> FND_API.G_RET_STS_SUCCESS) THEN
1189           RAISE PARSE_XML_ERROR;
1190         END IF;
1191 
1192         ---add the config hdr and rev to OUT NOCOPY put tbl
1193         IF (v_output_cfg_hdr_id > 0) THEN
1194           v_ouput_config_count := x_config_model_tbl.COUNT + 1;
1195           x_config_model_tbl(v_ouput_config_count).config_hdr_id  := v_output_cfg_hdr_id;
1196           x_config_model_tbl(v_ouput_config_count).config_rev_nbr := v_output_cfg_rev_nbr;
1197 
1198           ------get top inv item and org id
1199           get_root_bom_config_item(v_output_cfg_hdr_id,v_output_cfg_rev_nbr,l_inventory_item_id,l_organization_id,l_config_item_id);
1200 
1201           -----if no inv item id or org id is retrieved raise exception
1202           IF p_validation_type<>CZ_API_PUB.VALIDATE_RETURN AND
1203               ( l_inventory_item_id = -1 OR l_organization_id = -1 ) THEN
1204             RAISE INVALID_OUT_INV_ORG_ID;
1205           END IF;
1206 
1207           x_config_model_tbl(v_ouput_config_count).inventory_item_id := l_inventory_item_id;
1208           x_config_model_tbl(v_ouput_config_count).organization_id   := l_organization_id;
1209           x_config_model_tbl(v_ouput_config_count).config_item_id    := l_config_item_id;
1210         END IF;
1211       END IF;
1212     END LOOP;
1213   END IF;
1214 
1215   -----log messages for debugging
1216   populate_debug_message('Generation of config tree successful','CZ_NETWORK_API: '||to_char(sysdate, 'mm-dd-yyyy hh24:mi:ss'), 0);
1217   CZ_DEBUG_PUB.insert_into_logs(v_msg_tbl);
1218   trace_gen_config_trees (p_api_version,p_config_tbl,
1219                           p_tree_copy_mode,p_appl_param_rec,
1220                           p_validation_context,
1221                           x_config_model_tbl,
1222                           x_return_status);
1223   COMMIT;
1224 EXCEPTION
1225   WHEN G_INCOMPATIBLE_API THEN
1226     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_VERSION_ERR', 'CODEVERSION', l_api_version, 'VERSION', p_api_version);
1227     set_fnd_message('CZ_NET_API_VERSION_ERR','CODEVERSION',l_api_version, 'VERSION', p_api_version);
1228     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1229     COMMIT;
1230   WHEN INVALID_VALIDATION_TYPE THEN
1231     l_errbuf := CZ_UTILS.GET_TEXT('CZ_BV_INVALID_TYPE','TYPE',p_validation_type);
1232     set_fnd_message('CZ_BV_INVALID_TYPE','TYPE',p_validation_type);
1233     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1234     COMMIT;
1235   WHEN NO_INPUT_RECORDS THEN
1236     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_NO_INPUT_HDRS','TABLE','p_config_tbl','PROC',l_api_name );
1237     set_fnd_message('CZ_NET_API_NO_INPUT_HDRS','TABLE','p_config_tbl','PROC',l_api_name);
1238     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1239     COMMIT;
1240   WHEN INPUT_TREE_MODE_NULL THEN
1241     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_INVALID_TREE_MODE','MODE',p_tree_copy_mode,'PROC',l_api_name);
1242     set_fnd_message('CZ_NET_API_INVALID_TREE_MODE','MODE',p_tree_copy_mode,'PROC',l_api_name);
1243     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1244     COMMIT;
1245   WHEN NO_VALIDATION_CONTEXT THEN
1246     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_INVALID_VAL_CTX', 'CTX', p_validation_context);
1247     set_fnd_message('CZ_NET_API_INVALID_VAL_CTX','CTX', p_validation_context, null, null);
1248     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1249     COMMIT;
1250   WHEN INVALID_CONTEXT THEN
1251     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_INVALID_VAL_CTX', 'CTX', p_validation_context);
1252     set_fnd_message('CZ_NET_API_INVALID_VAL_CTX','CTX', p_validation_context, null, null);
1253     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1254     COMMIT;
1255   WHEN INVALID_CONTAINER_HDR THEN
1256     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_NO_SESSION_HDR','HDRID',l_config_hdr_id,'REV',l_config_rev_nbr);
1257     set_fnd_message('CZ_NET_API_NO_SESSION_HDR','HDRID',l_config_hdr_id,'REV',l_config_rev_nbr);
1258     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1259     delete_configuration(x_config_model_tbl);
1260     x_config_model_tbl.DELETE;
1261     COMMIT;
1262   WHEN INVALID_HEADER_TYPE THEN
1263     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_INVALID_INST_HDR',
1264               'modelInstType', l_model_instantiation_type,
1265               'compInstType' , l_component_instance_type,
1266               'Hdr',l_config_hdr_id,
1267               'Rev',l_config_rev_nbr);
1268     set_fnd_message('CZ_NET_API_INVALID_INST_HDR',
1269         'modelInstType', l_model_instantiation_type,
1270         'compInstType' , l_component_instance_type,
1271         'Hdr',l_config_hdr_id,
1272         'Rev',l_config_rev_nbr);
1273     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1274     delete_configuration(x_config_model_tbl);
1275     x_config_model_tbl.DELETE;
1276     COMMIT;
1277   WHEN INVALID_INV_ORG_ID THEN
1278     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_NO_INV_FOR_CFG_HDR','HDR',l_main_config_hdr_id,'REV',l_main_config_rev_nbr);
1279     set_fnd_message('CZ_NET_API_NO_INV_FOR_CFG_HDR','HDR',l_main_config_hdr_id,'REV',l_main_config_rev_nbr);
1280     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1281     delete_configuration(x_config_model_tbl);
1282     x_config_model_tbl.DELETE;
1283     COMMIT;
1284   WHEN INVALID_OUT_INV_ORG_ID THEN
1285     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_NO_INV_FOR_CFG_HDR','HDR',v_output_cfg_hdr_id,'REV',v_output_cfg_rev_nbr);
1286     set_fnd_message('CZ_NET_API_NO_INV_FOR_CFG_HDR','HDR',v_output_cfg_hdr_id,'REV',v_output_cfg_rev_nbr);
1287     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1288     IF x_config_model_tbl.COUNT>0 AND p_validation_type<>CZ_API_PUB.VALIDATE_RETURN THEN
1289       delete_configuration(x_config_model_tbl);
1290       x_config_model_tbl.DELETE;
1291     END IF;
1292     COMMIT;
1293   WHEN INVALID_TREE_MODE_ERR THEN
1294     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_INVALID_TREE_MODE','MODE',p_tree_copy_mode,'PROC',l_api_name);
1295     set_fnd_message('CZ_NET_API_INVALID_TREE_MODE','MODE',p_tree_copy_mode,'PROC',l_api_name);
1296     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1297     delete_configuration(x_config_model_tbl);
1298     x_config_model_tbl.DELETE;
1299     COMMIT;
1300   WHEN ORG_ID_EXCEP THEN
1301     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_DIFF_ORGS');
1302     set_fnd_message('CZ_NET_API_DIFF_ORGS',null,null, null, null);
1303     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1304     delete_configuration(x_config_model_tbl);
1305     x_config_model_tbl.DELETE;
1306     COMMIT;
1307   WHEN COPY_CONFIG_FAILURE_EXCEP THEN
1308     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_COPY_CONFIG_ERR', 'HDR',l_main_config_hdr_id,'REV',l_main_config_rev_nbr,'ERR',l_copy_config_msg);
1309     set_fnd_message('CZ_NET_API_COPY_CONFIG_ERR','HDR',l_main_config_hdr_id,'REV',l_main_config_rev_nbr,'ERR',l_copy_config_msg,null,null);
1310     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1311     delete_configuration(x_config_model_tbl);
1312     x_config_model_tbl.DELETE;
1313     COMMIT;
1314   WHEN INVALID_HEADER_EXCEP THEN
1315     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_NO_SESSION_HDR', 'HDR',l_config_hdr_id,'REV',l_config_rev_nbr);
1316     set_fnd_message('CZ_NET_API_NO_SESSION_HDR', 'HDR',l_config_hdr_id,'REV',l_config_rev_nbr);
1317     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1318     delete_configuration(x_config_model_tbl);
1319     x_config_model_tbl.DELETE;
1320     COMMIT;
1321   WHEN BATCH_VALID_ERR THEN
1322     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_BV_ERR', 'STATUS', l_batch_validate_msg);
1323     set_fnd_message('CZ_NET_API_BV_ERR', 'STATUS', l_batch_validate_msg,null,null);
1324     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1325     delete_configuration(x_config_model_tbl);
1326     x_config_model_tbl.DELETE;
1327     COMMIT;
1328   WHEN PARSE_XML_ERROR THEN
1329     l_config_err_msg := get_terminate_msg(v_xml_str);
1330     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_PARSE_BV_XML_ERR','Err',l_config_err_msg,1,2000);
1331     set_fnd_message('CZ_NET_API_PARSE_BV_XML_ERR', 'ERR', substr(v_xml_str,1,2000),null,null);
1332     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1333     delete_configuration(x_config_model_tbl);
1334     x_config_model_tbl.DELETE;
1335     COMMIT;
1336   WHEN OTHERS THEN
1337     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1338     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1339       FND_MSG_PUB.add_exc_msg(G_PKG_NAME,l_api_name);
1340     END IF;
1341     fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
1342     delete_configuration(x_config_model_tbl);
1343     x_config_model_tbl.DELETE;
1344     COMMIT;
1345 END generate_config_trees;
1346 
1347 ---------------------------------------------------------------------------
1348 ---Start of comments
1349 ---API name                 : generate_config_trees
1350 ---Type          : Public
1351 ---Pre-reqs                 : None
1352 ---Function                 : generates config trees for a given set of config hdr ids and rev nbrs
1353 ---Parameters               :
1354 ---IN      : p_api_version        IN  NUMBER              Required
1355 ---          p_config_tbl         IN  config_tbl_type     Required
1356 ---          p_tree_copy_mode     IN  VARCHAR2            Required
1357 ---          p_appl_param_rec     IN  appl_param_rec_type Required
1358 ---          p_validation_context IN  VARCHAR2            Required
1359 ---OUT     : x_return_status      OUT NOCOPY VARCHAR2
1360 ---          x_msg_count          OUT NOCOPY NUMBER
1361 ---          x_msg_data           OUT NOCOPY VARCHAR2
1362 ---Version: Current version :1.0
1363 ---End of comments
1364 
1365 PROCEDURE generate_config_trees(p_api_version        IN  NUMBER,
1366                                 p_config_tbl         IN  CZ_API_PUB.config_tbl_type,
1367                                 p_tree_copy_mode     IN  VARCHAR2,
1368                                 p_appl_param_rec     IN  CZ_API_PUB.appl_param_rec_type,
1369                                 p_validation_context IN  VARCHAR2,
1370                                 x_config_model_tbl   OUT NOCOPY CZ_API_PUB.config_model_tbl_type,
1371                                 x_return_status      OUT NOCOPY VARCHAR2,
1372                                 x_msg_count          OUT NOCOPY NUMBER,
1373                                 x_msg_data           OUT NOCOPY VARCHAR2
1374                                )
1375 IS
1376 BEGIN
1377 
1378   generate_config_trees(p_api_version        => p_api_version,
1379                         p_config_tbl         => p_config_tbl,
1380                         p_tree_copy_mode     => p_tree_copy_mode,
1381                         p_appl_param_rec     => p_appl_param_rec,
1382                         p_validation_context => p_validation_context,
1383                         p_validation_type    => CZ_API_PUB.INTERACTIVE,
1384                         x_config_model_tbl   => x_config_model_tbl,
1385                         x_return_status      => x_return_status,
1386                         x_msg_count          => x_msg_count,
1387                         x_msg_data           => x_msg_data
1388         );
1389 
1390 END generate_config_trees;
1391 
1392 ------------------------------------------------------------------------------------------------
1393 -----procedure adds instances to the saved configuration of a container model
1394 PROCEDURE add_to_config_tree (p_api_version     IN  NUMBER,
1395           p_inventory_item_id  IN  NUMBER,
1396           p_organization_id    IN  NUMBER,
1397           p_config_hdr_id      IN  NUMBER,
1398           p_config_rev_nbr     IN  NUMBER,
1399           p_instance_tbl       IN  CZ_API_PUB.config_tbl_type,
1400           p_tree_copy_mode     IN  VARCHAR2,
1401           p_appl_param_rec     IN  CZ_API_PUB.appl_param_rec_type,
1402           p_validation_context IN  VARCHAR2,
1403           x_config_model_rec   OUT NOCOPY CZ_API_PUB.config_model_rec_type,
1404           x_return_status      OUT NOCOPY VARCHAR2,
1405           x_msg_count          OUT NOCOPY NUMBER,
1406           x_msg_data           OUT NOCOPY VARCHAR2)
1407 IS
1408 PRAGMA AUTONOMOUS_TRANSACTION;
1409 
1410 l_api_name           CONSTANT VARCHAR2(30) := 'add_to_config_tree';
1411 l_api_version        CONSTANT NUMBER := 1.0;
1412 
1413 l_config_hdr_id      cz_config_hdrs.config_hdr_id%TYPE;
1414 l_config_rev_nbr     cz_config_hdrs.config_rev_nbr%TYPE;
1415 
1416 l_inventory_item_id     cz_config_items.inventory_item_id%TYPE;
1417 l_organization_id       cz_config_items.organization_id%TYPE;
1418 l_config_item_id        cz_config_items.config_item_id%TYPE;
1419 
1420 l_main_config_hdr_id    cz_config_hdrs.config_hdr_id%TYPE;
1421 l_main_config_rev_nbr   cz_config_hdrs.config_rev_nbr%TYPE;
1422 
1423 l_config_model_tbl      CZ_API_PUB.config_model_tbl_type;
1424 l_con_config_tbl        container_config_tbl_type;
1425 
1426 l_model_instantiation_type VARCHAR2(1);
1427 l_component_instance_type  VARCHAR2(1);
1428 
1429 config_input_list       cz_cf_api.cfg_input_list;
1430 config_messages         cz_cf_api.cfg_output_pieces;
1431 validation_status       NUMBER;
1432 l_batch_validate_msg    VARCHAR2(100);
1433 v_output_cfg_hdr_id     NUMBER := 0;
1434 v_output_cfg_rev_nbr    NUMBER := 0;
1435 v_valid_config          VARCHAR2(30);
1436 v_complete_config       VARCHAR2(30);
1437 
1438 l_xml_hdr               VARCHAR2(32767);
1439 
1440 v_config_hdr_id         NUMBER;
1441 v_config_rev_nbr        NUMBER;
1442 l_copy_config_msg       VARCHAR2(2000);
1443 
1444 v_ouput_config_count    NUMBER := 0;
1445 v_xml_str               LONG;
1446 l_idx                   NUMBER;
1447 new_config_flag         VARCHAR2(1);
1448 instance_hdr_count      NUMBER;
1449 
1450 l_msg_count             NUMBER;
1451 l_msg_data              VARCHAR2(10000);
1452 l_errbuf                VARCHAR2(2000);
1453 l_copy_config_status    NUMBER;
1454 v_parse_status          VARCHAR2(1);
1455 l_validation_context    VARCHAR2(1);
1456 l_url                   VARCHAR2(255);
1457 l_config_err_msg        VARCHAR2(2000);
1458 l_dummy_config_hdr_id   NUMBER;
1459 
1460 INPUT_TREE_MODE_NULL    EXCEPTION;
1461 BATCH_VALID_FAILURE     EXCEPTION;
1462 INVALID_CONTAINER_HDR   EXCEPTION;
1463 INVALID_INV_ORG_ID      EXCEPTION;
1464 GEN_CONFIG_TREE_ERR     EXCEPTION;
1465 INVALID_HEADER_TYPE     EXCEPTION;
1466 MODEL_ORG_EXCEP         EXCEPTION;
1467 BATCH_VALID_ERR         EXCEPTION;
1468 PARSE_XML_ERROR         EXCEPTION;
1469 NO_INPUT_RECORDS        EXCEPTION;
1470 INVALID_CONTEXT         EXCEPTION;
1471 INVALID_TREE_MODE_ERR   EXCEPTION;
1472 NO_VALIDATION_CONTEXT   EXCEPTION;
1473 
1474 BEGIN
1475   ----initialize return status to success
1476   x_return_status := FND_API.G_RET_STS_SUCCESS;
1477   fnd_msg_pub.initialize;
1478 
1479   ---check api version
1480   IF NOT FND_API.Compatible_API_Call(l_api_version,p_api_version,l_api_name,G_PKG_NAME) THEN
1481     RAISE G_INCOMPATIBLE_API;
1482   END IF;
1483 
1484   ---check if instance records are passed
1485   IF (p_instance_tbl.COUNT = 0) THEN
1486     RAISE NO_INPUT_RECORDS;
1487   END IF;
1488 
1489   ---verify that the input parameters are not null
1490   IF ( (p_tree_copy_mode IS NULL) OR (p_tree_copy_mode = FND_API.G_MISS_CHAR)) THEN
1491     RAISE INPUT_TREE_MODE_NULL;
1492   ELSIF (p_tree_copy_mode = CZ_API_PUB.G_NEW_HEADER_COPY_MODE) THEN
1493     new_config_flag := '0';
1494   ELSIF (p_tree_copy_mode = CZ_API_PUB.G_NEW_REVISION_COPY_MODE) THEN
1495     new_config_flag := '1';
1496   ELSE
1497     RAISE INVALID_TREE_MODE_ERR;
1498   END IF;
1499 
1500   ----verify validation context
1501   IF (p_validation_context IS NULL) THEN
1502     l_validation_context := NULL;
1503   ELSIF (p_validation_context = CZ_API_PUB.G_INSTALLED) THEN
1504     l_validation_context :=  CZ_API_PUB.G_INSTALLED;
1505   ELSIF (p_validation_context = CZ_API_PUB.G_PENDING_OR_INSTALLED) THEN
1506     l_validation_context := CZ_API_PUB.G_PENDING_OR_INSTALLED;
1507   ELSE
1508     RAISE INVALID_CONTEXT;
1509   END IF;
1510 
1511   ---validate instance headers
1512   ---this is not required as adding of a non-network instance is allowed
1513   IF (p_instance_tbl.COUNT > 0) THEN
1514     FOR configInstance IN p_instance_tbl.FIRST..p_instance_tbl.LAST
1515     LOOP
1516       l_config_hdr_id  := p_instance_tbl(configInstance).config_hdr_id;
1517       l_config_rev_nbr := p_instance_tbl(configInstance).config_rev_nbr;
1518 
1519       ----get header types
1520       get_header_types(l_config_hdr_id,l_config_rev_nbr,l_model_instantiation_type,l_component_instance_type);
1521 
1522       IF ( (l_model_instantiation_type <> NETWORK) OR (l_component_instance_type <> INSTANCE_ROOT) ) THEN
1523         RAISE INVALID_HEADER_TYPE;
1524       END IF;
1525     END LOOP;
1526   END IF;
1527 
1528   IF ( (p_config_hdr_id IS NOT NULL) AND (p_config_rev_nbr IS NOT NULL) ) THEN
1529     get_header_types(p_config_hdr_id,p_config_rev_nbr,l_model_instantiation_type,l_component_instance_type);
1530     IF ( (l_model_instantiation_type <> NETWORK) OR (l_component_instance_type <> ROOT) ) THEN
1531       RAISE INVALID_HEADER_TYPE;
1532     END IF;
1533 
1534     IF ( (p_inventory_item_id IS NOT NULL) AND (p_organization_id IS NOT NULL) ) THEN
1535       ------get top inv item and org id
1536       get_root_bom_config_item(p_config_hdr_id,p_config_rev_nbr,l_inventory_item_id,l_organization_id,l_config_item_id);
1537 
1538       -----if no inv item id or org id is retrieved raise exception
1539       IF ( (l_inventory_item_id = -1) OR (l_organization_id = -1) ) THEN
1540         RAISE INVALID_INV_ORG_ID;
1541       END IF;
1542 
1543       -----if OUT NOCOPY put inv id and org id are not equal to input model id and org id raise exception
1544       IF ( (l_inventory_item_id <> p_inventory_item_id) OR (l_organization_id <> p_organization_id) ) THEN
1545         RAISE MODEL_ORG_EXCEP;
1546       END IF;
1547     END IF; /* end if of (p_inventory_item_id IS NOT NULL) */
1548 
1549     ----initialize config array for creating xml hdr
1550     l_con_config_tbl.DELETE;
1551     IF (p_instance_tbl.COUNT > 0) THEN
1552       FOR inst IN p_instance_tbl.FIRST..p_instance_tbl.LAST
1553       LOOP
1554         instance_hdr_count := l_con_config_tbl.COUNT + 1;
1555         l_con_config_tbl(instance_hdr_count).inventory_item_id := p_inventory_item_id;
1556         l_con_config_tbl(instance_hdr_count).config_hdr_id     := p_instance_tbl(inst).config_hdr_id;
1557         l_con_config_tbl(instance_hdr_count).config_rev_nbr    := p_instance_tbl(inst).config_rev_nbr;
1558       END LOOP;
1559     END IF;
1560 
1561     BEGIN
1562       write_dummy_config ( p_inventory_item_id
1563                          , l_con_config_tbl
1564                          , l_dummy_config_hdr_id );
1565       COMMIT;
1566 
1567     -----create init message
1568     create_hdr_xml( p_inventory_item_id,
1569                     p_organization_id,
1570                     p_config_hdr_id,
1571                     p_config_rev_nbr,
1572                     l_dummy_config_hdr_id,
1573                     p_appl_param_rec,
1574                     p_tree_copy_mode,
1575                     l_validation_context,
1576                     l_xml_hdr);
1577 
1578     config_input_list.DELETE;
1579     l_url := FND_PROFILE.VALUE('CZ_UIMGR_URL');
1580     config_messages.DELETE;
1581     cz_cf_api.validate(config_input_list,l_xml_hdr,config_messages,validation_status,l_url,CZ_API_PUB.INTERACTIVE);
1582 
1583     EXCEPTION
1584       WHEN OTHERS THEN
1585         delete_dummy_config ( l_dummy_config_hdr_id );
1586         COMMIT;
1587         RAISE;
1588     END;
1589 
1590     delete_dummy_config ( l_dummy_config_hdr_id );
1591     COMMIT;
1592 
1593     cz_debug_pub.get_batch_validate_message(validation_status,l_batch_validate_msg);
1594 
1595     IF (validation_status <> CZ_CF_API.CONFIG_PROCESSED) THEN
1596       RAISE BATCH_VALID_ERR;
1597     ELSE
1598       ----get config hdr id and config rev nbr from xml string
1599       IF (config_messages.COUNT > 0) THEN
1600         v_output_cfg_hdr_id := 0;
1601         v_xml_str := NULL;
1602 
1603         FOR xmlStr IN config_messages.FIRST..config_messages.LAST
1604         LOOP
1605           v_xml_str := v_xml_str||config_messages(xmlStr);
1606         END LOOP;
1607       END IF;
1608 
1609       parse_output_xml (v_xml_str,
1610                         v_output_cfg_hdr_id,
1611                         v_output_cfg_rev_nbr,
1612                         v_parse_status);
1613 
1614       ----if error in parsing xml raise an exception
1615       IF (v_parse_status <> FND_API.G_RET_STS_SUCCESS) THEN
1616         RAISE PARSE_XML_ERROR;
1617       END IF;
1618 
1619       ---add the config hdr and rev to OUT NOCOPY put tbl
1620       IF (v_output_cfg_hdr_id > 0) THEN
1621         x_config_model_rec.config_hdr_id     := v_output_cfg_hdr_id;
1622         x_config_model_rec.config_rev_nbr    := v_output_cfg_rev_nbr;
1623         x_config_model_rec.inventory_item_id := p_inventory_item_id;
1624         x_config_model_rec.organization_id   := p_organization_id;
1625         x_config_model_rec.config_item_id    := l_config_item_id;
1626       END IF;
1627     END IF;  /* end if of validation_status <> CZ_CF_API.CONFIG_PROCESSED */
1628 
1629   ELSE  /* if p_config_hdr_id is NULL */
1630     ----generate config tree
1631     generate_config_trees(l_api_version,
1632                           p_instance_tbl,
1633                           p_tree_copy_mode,
1634                           p_appl_param_rec,
1635                           l_validation_context,
1636                           l_config_model_tbl,
1637                           x_return_status,
1638                           x_msg_count,
1639                           x_msg_data
1640                          );
1641 
1642     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1643       RAISE GEN_CONFIG_TREE_ERR;
1644     END IF;
1645 
1646     IF (l_config_model_tbl.COUNT > 1) THEN
1647       RAISE GEN_CONFIG_TREE_ERR;
1648     END IF;
1649 
1650     IF ( (p_inventory_item_id IS NOT NULL) AND (p_organization_id IS NOT NULL) ) THEN
1651       IF ( (p_inventory_item_id <> l_config_model_tbl(1).inventory_item_id)
1652         OR (p_organization_id <> l_config_model_tbl(1).organization_id) ) THEN
1653         RAISE MODEL_ORG_EXCEP;
1654       END IF;
1655     END IF;
1656 
1657     x_config_model_rec.config_hdr_id     := l_config_model_tbl(1).config_hdr_id;
1658     x_config_model_rec.config_rev_nbr    := l_config_model_tbl(1).config_rev_nbr;
1659     x_config_model_rec.inventory_item_id := l_config_model_tbl(1).inventory_item_id;
1660     x_config_model_rec.organization_id   := l_config_model_tbl(1).organization_id;
1661     x_config_model_rec.config_item_id    := l_config_model_tbl(1).config_item_id;
1662 
1663   END IF; /* end if of (p_config_hdr_id IS NOT NULL) */
1664   trace_add_to_config_trees (p_api_version,p_inventory_item_id,p_organization_id,p_config_hdr_id,p_config_rev_nbr
1665         ,p_instance_tbl,p_tree_copy_mode,p_appl_param_rec,p_validation_context,x_config_model_rec
1666         ,x_return_status,x_msg_count,x_msg_data);
1667   COMMIT;
1668 EXCEPTION
1669   WHEN G_INCOMPATIBLE_API THEN
1670     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_VERSION_ERR', 'CODEVERSION', l_api_version, 'VERSION', p_api_version);
1671     set_fnd_message('CZ_NET_API_VERSION_ERR','CODEVERSION',l_api_version, 'VERSION', p_api_version);
1672     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1673     COMMIT;
1674   WHEN NO_INPUT_RECORDS THEN
1675     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_NO_INPUT_HDRS','TABLE','p_instance_tbl','PROC',l_api_name );
1676     set_fnd_message('CZ_NET_API_NO_INPUT_HDRS','TABLE','p_instance_tbl','PROC',l_api_name);
1677     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1678     COMMIT;
1679   WHEN INVALID_HEADER_TYPE THEN
1680     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_INVALID_INST_HDR','modelInstType', l_model_instantiation_type,
1681               'compInstType',l_component_instance_type,'Hdr',l_config_hdr_id,
1682               'Rev',l_config_rev_nbr);
1683     set_fnd_message('CZ_NET_API_INVALID_INST_HDR','modelInstType', l_model_instantiation_type,
1684         'compInstType',l_component_instance_type,'Hdr',l_config_hdr_id,
1685         'Rev',l_config_rev_nbr);
1686     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1687     COMMIT;
1688   WHEN INVALID_CONTEXT THEN
1689     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_INVALID_VAL_CTX', 'CTX', p_validation_context);
1690     set_fnd_message('CZ_NET_API_INVALID_VAL_CTX','CTX',p_validation_context, null, null);
1691     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1692     COMMIT;
1693   WHEN NO_VALIDATION_CONTEXT THEN
1694     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_INVALID_VAL_CTX','CTX', p_validation_context);
1695     set_fnd_message('CZ_NET_API_INVALID_VAL_CTX','CTX', p_validation_context, null, null);
1696     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1697     COMMIT;
1698   WHEN INVALID_INV_ORG_ID THEN
1699     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_NO_INV_FOR_CFG_HDR', 'HDR',l_config_hdr_id,'REV',l_config_rev_nbr);
1700     set_fnd_message('CZ_NET_API_NO_INV_FOR_CFG_HDR','HDR',l_config_hdr_id,'REV',l_config_rev_nbr);
1701     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1702     COMMIT;
1703   WHEN MODEL_ORG_EXCEP THEN
1704     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_MODELID_ORGID_ERR',
1705               'ITEM1',l_inventory_item_id,
1706               'ORGID1',l_organization_id,
1707               'HDRID',p_config_hdr_id,
1708               'REVNBR',p_config_rev_nbr,
1709               'ITEM2',p_inventory_item_id,
1710               'ORGID2',p_organization_id);
1711     set_fnd_message('CZ_NET_API_MODELID_ORGID_ERR',
1712               'ITEM1', l_inventory_item_id,
1713               'ORGID1',l_organization_id,
1714               'HDRID', p_config_hdr_id,
1715               'REVNBR',p_config_rev_nbr,
1716               'ITEM2', p_inventory_item_id,
1717               'ORGID2',p_organization_id);
1718     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1719     COMMIT;
1720   WHEN BATCH_VALID_ERR THEN
1721     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_BV_ERR', 'STATUS', l_batch_validate_msg);
1722     set_fnd_message('CZ_NET_API_BV_ERR', 'STATUS', l_batch_validate_msg, null, null);
1723     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1724     COMMIT;
1725   WHEN PARSE_XML_ERROR THEN
1726     l_config_err_msg := get_terminate_msg(v_xml_str);
1727     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_PARSE_BV_XML_ERR','ERR',l_config_err_msg);
1728     set_fnd_message('CZ_NET_API_NO_CFG_HDR', 'ERR', substr(v_xml_str,1,2000),null,null);
1729     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1730     COMMIT;
1731   WHEN GEN_CONFIG_TREE_ERR THEN
1732     l_errbuf := CZ_UTILS.GET_TEXT('CZ_NET_API_TREE_GEN_ERR','HDR',l_config_hdr_id,'REV',l_config_rev_nbr);
1733     set_fnd_message('CZ_NET_API_TREE_GEN_ERR', 'HDR',l_config_hdr_id,'REV',l_config_rev_nbr);
1734     set_error_message(x_return_status,x_msg_count,x_msg_data,l_errbuf);
1735     COMMIT;
1736   WHEN OTHERS THEN
1737     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1738     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1739       FND_MSG_PUB.add_exc_msg(G_PKG_NAME,l_api_name);
1740     END IF;
1741     FND_MSG_PUB.count_and_get(NULL,x_msg_count,x_msg_data);
1742     COMMIT;
1743 END add_to_config_tree;
1744 
1745 -----------------------------------------------------------------------------
1746 -- API name:  is_container_pvt
1747 -- API type:  private
1748 -- Function:  Checks if a given model is a network container model
1749 -- Pre-Reqs:  input model is in cz schema
1750 
1751 FUNCTION is_container_pvt(p_model_id IN NUMBER)
1752   RETURN BOOLEAN
1753 
1754 IS
1755   l_model_type  cz_devl_projects.model_type%TYPE;
1756 
1757 BEGIN
1758 
1759   SELECT model_type INTO l_model_type
1760   FROM cz_devl_projects
1761   WHERE devl_project_id = p_model_id
1762   AND deleted_flag = NO_FLAG;
1763 
1764   RETURN (upper(l_model_type) = NETWORK);
1765 
1766 EXCEPTION
1767   WHEN OTHERS THEN
1768     RAISE;
1769 END is_container_pvt;
1770 
1771 -----------------------------------------------------------------------------
1772 -- API name:  get_contained_models_pvt
1773 -- API type:  private
1774 -- Function:  Retrieves all trackable and instantiable child models for a
1775 --            given network container model.
1776 
1777 procedure get_contained_models_pvt(p_model_id IN NUMBER
1778                                   ,p_inventory_item_id_tbl IN OUT NOCOPY CZ_API_PUB.number_tbl_type
1779                                   )
1780 IS
1781   l_model_id           NUMBER := p_model_id;
1782   l_reference_id       NUMBER;
1783   l_inventory_item_id  NUMBER := NULL;
1784   l_index              NUMBER := 0;
1785   l_count              NUMBER;
1786 
1787   CURSOR child_model_csr IS
1788     SELECT reference_id
1789     FROM cz_ps_nodes
1790     WHERE devl_project_id = l_model_id
1791       AND ps_node_type = PS_NODE_TYPE_REFERENCE
1792       AND deleted_flag = NO_FLAG;
1793 
1794 BEGIN
1795   FOR child_model_rec IN child_model_csr
1796   LOOP
1797     l_reference_id := child_model_rec.reference_id;
1798     BEGIN
1799       SELECT to_number(substr(orig_sys_ref, instr(orig_sys_ref, ':', -1, 1)+1))
1800         INTO l_inventory_item_id
1801       FROM   cz_ps_nodes
1802       WHERE  ps_node_id = l_reference_id
1803         AND  ib_trackable = YES_FLAG
1804         AND  deleted_flag = NO_FLAG;
1805 
1806       -- check if the model is already in array
1807       -- Note: if arrray size is big, use hashing insead of iteration
1808       l_index := 1;
1809       l_count := p_inventory_item_id_tbl.COUNT;
1810 
1811       WHILE (l_index <= l_count AND l_inventory_item_id <> p_inventory_item_id_tbl(l_index))
1812       LOOP
1813         l_index := l_index + 1;
1814       END LOOP;
1815 
1816       -- new entry
1817       IF (l_index > l_count) THEN
1818         p_inventory_item_id_tbl.extend(1);
1819         p_inventory_item_id_tbl(l_index) := l_inventory_item_id;
1820       END IF;
1821       l_inventory_item_id := NULL;
1822     EXCEPTION
1823       WHEN NO_DATA_FOUND THEN  -- not trackable, lookup further down the branch
1824         get_contained_models_pvt(l_reference_id, p_inventory_item_id_tbl);
1825     END;
1826   END LOOP;
1827 EXCEPTION
1828   WHEN OTHERS THEN
1829     RAISE;
1830 END get_contained_models_pvt;
1831 
1832 -----------------------------------------------------------------------------
1833 -- API name:  get_contained_models
1834 -- API type:  public
1835 -- Function:  Retrieves all possible enclosed trackable child models for the network
1836 --            container model specified by the input inventory_item_id and
1837 --            organization_id
1838 
1839 procedure get_contained_models(p_api_version        IN   NUMBER
1840                               ,p_inventory_item_id  IN   NUMBER
1841                               ,p_organization_id    IN   NUMBER
1842                               ,p_appl_param_rec     IN   CZ_API_PUB.appl_param_rec_type
1843                               ,x_model_tbl          OUT NOCOPY  CZ_API_PUB.number_tbl_type
1844                               ,x_return_status      OUT NOCOPY  VARCHAR2
1845                               ,x_msg_count          OUT NOCOPY  NUMBER
1846                               ,x_msg_data           OUT NOCOPY  VARCHAR2
1847                               )
1848 IS
1849   l_api_version  CONSTANT NUMBER := 1.0;
1850   l_api_name     CONSTANT VARCHAR2(30) := 'get_contained_models';
1851 
1852   l_config_creation_date      DATE := p_appl_param_rec.config_creation_date;
1853   l_config_model_lookup_date  DATE := p_appl_param_rec.config_model_lookup_date;
1854   l_config_effective_date     DATE := p_appl_param_rec.config_effective_date;
1855 
1856   l_model_id               NUMBER;
1857   l_inventory_item_id_tbl  CZ_API_PUB.number_tbl_type := cz_api_pub.NUMBER_TBL_TYPE();
1858   l_msg_data               VARCHAR2(2000);
1859   l_appl_param_rec         CZ_API_PUB.appl_param_rec_type;
1860 
1861 BEGIN
1862   x_return_status := FND_API.G_RET_STS_SUCCESS;
1863   fnd_msg_pub.initialize;
1864   x_model_tbl := cz_api_pub.NUMBER_TBL_TYPE();
1865   -- standard call to check for call compatibility
1866   IF (NOT FND_API.compatible_api_call(l_api_version
1867                                      ,p_api_version
1868                                      ,l_api_name
1869                                      ,G_PKG_NAME
1870                                      )) THEN
1871     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1872   END IF;
1873 
1874   ----default pb applicability parameters to NULL if no values are passed in
1875   l_appl_param_rec.config_creation_date     := p_appl_param_rec.config_creation_date;
1876   l_appl_param_rec.config_model_lookup_date := p_appl_param_rec.config_model_lookup_date;
1877   l_appl_param_rec.config_effective_date    := p_appl_param_rec.config_effective_date;
1878   l_appl_param_rec.calling_application_id   := p_appl_param_rec.calling_application_id;
1879   l_appl_param_rec.usage_name               := p_appl_param_rec.usage_name;
1880   l_appl_param_rec.publication_mode         := p_appl_param_rec.publication_mode;
1881   l_appl_param_rec.language                 := p_appl_param_rec.language;
1882 
1883   default_pb_parameters(l_appl_param_rec,x_return_status);
1884   IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1885     RAISE FND_API.G_EXC_ERROR;
1886   END IF;
1887 
1888   -- defaulting date values if not passed in
1889   cz_cf_api.default_new_cfg_dates(l_appl_param_rec.config_creation_date
1890                                  ,l_appl_param_rec.config_model_lookup_date
1891                                  ,l_appl_param_rec.config_effective_date
1892                                  );
1893 
1894   -- publication look up
1895   l_model_id := cz_cf_api.config_model_for_item
1896                               (p_inventory_item_id
1897                               ,p_organization_id
1898                               ,l_appl_param_rec.config_model_lookup_date
1899                               ,l_appl_param_rec.calling_application_id
1900                               ,l_appl_param_rec.usage_name
1901                               ,l_appl_param_rec.publication_mode
1902                               ,l_appl_param_rec.language
1903                               );
1904 
1905   -- in case of publication look up failure
1906   IF (l_model_id IS NULL) THEN
1907     fnd_message.set_name('CZ', 'CZ_NO_PUB_MODEL');
1908     fnd_message.set_token('inventory_item_id', p_inventory_item_id);
1909     fnd_message.set_token('organization', p_organization_id);
1910     fnd_msg_pub.add;
1911     RAISE FND_API.G_EXC_ERROR;
1912   END IF;
1913 
1914   -- must be a network container model
1915   IF (NOT is_container_pvt(l_model_id)) THEN
1916     fnd_message.set_name('CZ', 'CZ_NOT_CONTAINER_MODEL');
1917     fnd_message.set_token('model', l_model_id);
1918     fnd_msg_pub.add;
1919 
1920     RAISE FND_API.G_EXC_ERROR;
1921   END IF;
1922 
1923   get_contained_models_pvt(l_model_id, l_inventory_item_id_tbl);
1924   x_model_tbl := l_inventory_item_id_tbl;
1925 
1926   fnd_msg_pub.count_and_get(p_count => x_msg_count,
1927                             p_data  => x_msg_data);
1928 
1929 EXCEPTION
1930   WHEN FND_API.G_EXC_ERROR THEN
1931     x_return_status := FND_API.G_RET_STS_ERROR;
1932     fnd_msg_pub.count_and_get(p_count => x_msg_count,
1933                               p_data  => x_msg_data);
1934 
1935   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1936     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1937     fnd_msg_pub.count_and_get(p_count => x_msg_count,
1938                               p_data  => x_msg_data);
1939 
1940   WHEN OTHERS THEN
1941     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1942     IF fnd_msg_pub.check_msg_Level(fnd_msg_pub.G_MSG_LVL_UNEXP_ERROR) THEN
1943       fnd_msg_pub.add_exc_msg(G_PKG_NAME, l_api_name);
1944     END IF;
1945     fnd_msg_pub.count_and_get(p_count => x_msg_count,
1946                               p_data  => x_msg_data);
1947 
1948 END get_contained_models;
1949 
1950 -----------------------------------------------------------------------------
1951 -- API name:  is_container
1952 -- API type:  public
1953 -- Function:  Checks if a model specified by the top inventory_item_id and
1954 --            organization_id is a network container model.
1955 
1956 procedure is_container(p_api_version        IN   NUMBER
1957                       ,p_inventory_item_id  IN   NUMBER
1958                       ,p_organization_id    IN   NUMBER
1959                       ,p_appl_param_rec     IN   CZ_API_PUB.appl_param_rec_type
1960                       ,x_return_value       OUT NOCOPY  VARCHAR2
1961                       ,x_return_status      OUT NOCOPY  VARCHAR2
1962                       ,x_msg_count          OUT NOCOPY  NUMBER
1963                       ,x_msg_data           OUT NOCOPY  VARCHAR2
1964                       )
1965 IS
1966   l_api_version  CONSTANT NUMBER := 1.0;
1967   l_api_name     CONSTANT VARCHAR2(30) := 'is_container';
1968 BEGIN
1969   fnd_msg_pub.initialize;
1970 
1971   -- standard call to check for call compatibility
1972   IF (NOT FND_API.compatible_api_call(l_api_version
1973                                      ,p_api_version
1974                                      ,l_api_name
1975                                      ,G_PKG_NAME
1976                                      )) THEN
1977     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1978   END IF;
1979 
1980   SELECT DECODE(config_model_type, NETWORK_CONTAINER_MODEL, FND_API.G_TRUE, FND_API.G_FALSE)
1981     INTO x_return_value
1982   FROM mtl_system_items_b
1983   WHERE inventory_item_id = p_inventory_item_id AND organization_id = p_organization_id;
1984 
1985   x_return_status := FND_API.G_RET_STS_SUCCESS;
1986 
1987 EXCEPTION
1988   WHEN NO_DATA_FOUND THEN
1989     x_return_value := NULL;
1990     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1991     x_msg_count := 1;
1992     x_msg_data := 'The input inventory item ' || p_inventory_item_id || ' with organization ' ||
1993                   p_organization_id || ' does not exist';
1994 
1995   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1996     x_return_value := NULL;
1997     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1998     fnd_msg_pub.count_and_get(p_count => x_msg_count,
1999                               p_data  => x_msg_data);
2000 END is_container;
2001 
2002 ---------------------------------------------------------------------------
2003 -- API name:  is_configurable
2004 -- API type:  public
2005 -- Function:  Checks whether a config item is independently configurable
2006 
2007 procedure is_configurable(p_api_version     IN   NUMBER
2008                          ,p_config_hdr_id   IN   NUMBER
2009                          ,p_config_rev_nbr  IN   NUMBER
2010                          ,p_config_item_id  IN   NUMBER
2011                          ,x_return_value    OUT NOCOPY  VARCHAR2
2012                          ,x_return_status   OUT NOCOPY  VARCHAR2
2013                          ,x_msg_count       OUT NOCOPY  NUMBER
2014                          ,x_msg_data        OUT NOCOPY  VARCHAR2
2015                          )
2016 IS
2017   l_api_version  CONSTANT NUMBER := 1.0;
2018   l_api_name     CONSTANT VARCHAR2(30) := 'is_configurable';
2019 
2020   l_component_instance_type cz_config_items.component_instance_type%TYPE;
2021 
2022 BEGIN
2023   IF (NOT FND_API.compatible_api_call(l_api_version
2024                                      ,p_api_version
2025                                      ,l_api_name
2026                                      ,G_PKG_NAME
2027                                      )) THEN
2028     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2029   END IF;
2030 
2031   BEGIN
2032     SELECT component_instance_type INTO l_component_instance_type
2033     FROM cz_config_items
2034     WHERE config_hdr_id = p_config_hdr_id
2035       AND config_rev_nbr = p_config_rev_nbr
2036       AND config_item_id = p_config_item_id
2037       AND deleted_flag = NO_FLAG;
2038 
2039   EXCEPTION
2040     WHEN NO_DATA_FOUND THEN
2041       fnd_message.set_name('CZ','CZ_NO_CFG_ITEM');
2042       fnd_message.set_token('hdr_id','p_config_hdr_id');
2043       fnd_message.set_token('revision','p_config_hdr_id');
2044       fnd_message.set_token('item', p_config_item_id);
2045       fnd_msg_pub.add;
2046       RAISE FND_API.G_EXC_ERROR;
2047   END;
2048 
2049   IF (l_component_instance_type = INSTANCE_ROOT) THEN
2050     x_return_value := FND_API.G_TRUE;
2051   ELSE
2052     x_return_value := FND_API.G_FALSE;
2053   END IF;
2054 
2055   x_return_status := FND_API.G_RET_STS_SUCCESS;
2056   fnd_msg_pub.count_and_get(p_count => x_msg_count,
2057                             p_data  => x_msg_data);
2058 
2059 EXCEPTION
2060   WHEN FND_API.G_EXC_ERROR THEN
2061     x_return_status := FND_API.G_RET_STS_ERROR;
2062     fnd_msg_pub.count_and_get(p_count => x_msg_count,
2063                               p_data  => x_msg_data);
2064 
2065   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2066     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2067     fnd_msg_pub.count_and_get(p_count => x_msg_count,
2068                               p_data  => x_msg_data);
2069 
2070   WHEN OTHERS THEN
2071     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2072     IF fnd_msg_pub.check_msg_Level(fnd_msg_pub.G_MSG_LVL_UNEXP_ERROR) THEN
2073       fnd_msg_pub.add_exc_msg(G_PKG_NAME, l_api_name);
2074     END IF;
2075 
2076     fnd_msg_pub.count_and_get(p_count => x_msg_count,
2077                               p_data  => x_msg_data);
2078 
2079 END is_configurable;
2080 
2081 ------------------------------------------------------------------------
2082 -- API name:  is_rma_allowed
2083 -- API type:  public
2084 -- Function:  Checks if a configurable item instance can be split
2085 
2086 procedure is_rma_allowed(p_api_version     IN   NUMBER
2087                         ,p_config_hdr_id   IN   NUMBER
2088                         ,p_config_rev_nbr  IN   NUMBER
2089                         ,p_config_item_id  IN   NUMBER
2090                         ,x_return_value    OUT NOCOPY  VARCHAR2
2091                         ,x_return_status   OUT NOCOPY  VARCHAR2
2092                         ,x_msg_count       OUT NOCOPY  NUMBER
2093                         ,x_msg_data        OUT NOCOPY  VARCHAR2
2094                         )
2095 IS
2096   l_api_version  CONSTANT NUMBER := 1.0;
2097   l_api_name     CONSTANT VARCHAR2(30) := 'is_rma_allowed';
2098 
2099   l_model_instantiation_type cz_config_hdrs.model_instantiation_type%TYPE;
2100   l_component_instance_type  cz_config_hdrs.component_instance_type%TYPE;
2101 
2102 BEGIN
2103   IF (NOT FND_API.compatible_api_call(l_api_version
2104                                      ,p_api_version
2105                                      ,l_api_name
2106                                      ,G_PKG_NAME
2107                                      )) THEN
2108     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2109   END IF;
2110 
2111   get_header_types(p_config_hdr_id
2112                   ,p_config_rev_nbr
2113                   ,l_model_instantiation_type
2114                   ,l_component_instance_type
2115                   );
2116   IF (l_model_instantiation_type = NO_FLAG) THEN
2117     fnd_message.set_name('CZ','CZ_NO_CFG');
2118     fnd_message.set_token('hdr_id','p_config_hdr_id');
2119     fnd_message.set_token('revision','p_config_hdr_id');
2120     fnd_msg_pub.add;
2121     RAISE FND_API.G_EXC_ERROR;
2122   END IF;
2123 
2124   IF (l_model_instantiation_type <> NETWORK) THEN
2125     x_return_value := FND_API.G_TRUE;
2126   ELSE
2127     x_return_value := FND_API.G_FALSE;
2128   END IF;
2129 
2130   x_return_status := FND_API.G_RET_STS_SUCCESS;
2131   fnd_msg_pub.count_and_get(p_count => x_msg_count,
2132                             p_data  => x_msg_data);
2133 
2134 EXCEPTION
2135   WHEN FND_API.G_EXC_ERROR THEN
2136     x_return_status := FND_API.G_RET_STS_ERROR;
2137     fnd_msg_pub.count_and_get(p_count => x_msg_count,
2138                               p_data  => x_msg_data);
2139 
2140   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2141     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2142     fnd_msg_pub.count_and_get(p_count => x_msg_count,
2143                               p_data  => x_msg_data);
2144 
2145   WHEN OTHERS THEN
2146     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2147     IF fnd_msg_pub.check_msg_Level(fnd_msg_pub.G_MSG_LVL_UNEXP_ERROR) THEN
2148       fnd_msg_pub.add_exc_msg(G_PKG_NAME, l_api_name);
2149     END IF;
2150 
2151     fnd_msg_pub.count_and_get(p_count => x_msg_count,
2152                               p_data  => x_msg_data);
2153 
2154 END is_rma_allowed;
2155 
2156 ---------------------------------------------------------------------
2157 ------procedure that gets the root instance , component_instance_type = 'I'
2158 ------for the config_item_id that is passed in
2159 PROCEDURE get_root_instance(p_config_hdr_id   IN NUMBER,
2160                             p_config_rev_nbr  IN NUMBER,
2161                             p_config_item_id  IN NUMBER,
2162                             x_root_inst_changed OUT NOCOPY BOOLEAN)
2163 IS
2164 
2165 CURSOR config_sub_tree_cur IS
2166       SELECT component_instance_type,config_delta,ext_activated_flag
2167         FROM cz_config_items
2168        WHERE config_hdr_id = p_config_hdr_id
2169          AND config_rev_nbr  = p_config_rev_nbr
2170          AND deleted_flag    = NO_FLAG
2171       START WITH config_item_id = p_config_item_id
2172         AND config_hdr_id   = p_config_hdr_id
2173         AND config_rev_nbr  = p_config_rev_nbr
2174         AND deleted_flag    = NO_FLAG
2175       CONNECT BY PRIOR parent_config_item_id = config_item_id
2176         AND config_hdr_id  = p_config_hdr_id
2177         AND config_rev_nbr = p_config_rev_nbr
2178         AND deleted_flag   = NO_FLAG;
2179 
2180 l_component_instance_type cz_config_items.component_instance_type%TYPE;
2181 l_config_delta            cz_config_items.config_delta%TYPE;
2182 l_ext_activated_flag      cz_config_items.ext_activated_flag%TYPE;
2183 
2184 BEGIN
2185   x_root_inst_changed := FALSE;
2186   OPEN config_sub_tree_cur;
2187   LOOP
2188     FETCH config_sub_tree_cur
2189      INTO l_component_instance_type, l_config_delta, l_ext_activated_flag;
2190     EXIT WHEN config_sub_tree_cur%NOTFOUND;
2191     IF (l_component_instance_type = 'I') THEN
2192       EXIT;
2193     END IF;
2194   END LOOP;
2195   CLOSE config_sub_tree_cur;
2196 
2197   IF (l_component_instance_type = 'I') THEN
2198     IF ((l_config_delta <> 0) AND (l_ext_activated_flag <> '1')) THEN
2199       x_root_inst_changed := TRUE;
2200     END IF;
2201   ELSE
2202     x_root_inst_changed := FALSE;
2203   END IF;
2204 EXCEPTION
2205   WHEN OTHERS THEN
2206     IF (config_sub_tree_cur%ISOPEN) THEN
2207       CLOSE config_sub_tree_cur;
2208     END IF;
2209 END get_root_instance;
2210 -------------------------------------------
2211 -----procedure that retrieves the children of the config item id
2212 -----that has been passed in (for a config hdr and config rev)
2213 PROCEDURE get_child_items(p_config_hdr_id   IN NUMBER,
2214                           p_config_rev_nbr  IN NUMBER,
2215                           p_config_item_id  IN NUMBER,
2216                           x_child_config_tbl OUT NOCOPY CZ_API_PUB.number_tbl_type)
2217 
2218 IS
2219 
2220 BEGIN
2221   SELECT config_item_id BULK COLLECT INTO x_child_config_tbl
2222   FROM cz_config_items
2223   WHERE config_hdr_id = p_config_hdr_id AND config_rev_nbr = p_config_rev_nbr
2224     AND deleted_flag = NO_FLAG
2225   START WITH config_item_id = p_config_item_id
2226     AND config_hdr_id = p_config_hdr_id AND config_rev_nbr = p_config_rev_nbr
2227     AND deleted_flag = NO_FLAG
2228   CONNECT BY PRIOR config_item_id = parent_config_item_id
2229     AND config_hdr_id = p_config_hdr_id AND config_rev_nbr = p_config_rev_nbr
2230     AND deleted_flag = NO_FLAG;
2231 EXCEPTION
2232   WHEN NO_DATA_FOUND THEN
2233     ---the query returns no rows so ignore
2234     NULL;
2235   WHEN OTHERS THEN
2236     RAISE;
2237 END get_child_items;
2238 -----------------------------------------------------------------------------
2239 -- API name:  ext_deactivate_item
2240 -- API type:  public
2241 -- Function:  Externally deactivates an instance from CZ_CONFIG_DETAILS_V
2242 -- Note    :  Marks the specified config item and all of its child config items as
2243 --            externally deactivated. If any of those items has no other changes,
2244 --            they will be filtered OUT NOCOPY from the view CZ_CONFIG_DETAILS_V.
2245 
2246 procedure ext_deactivate_item(p_api_version     IN   NUMBER
2247                              ,p_config_hdr_id   IN   NUMBER
2248                              ,p_config_rev_nbr  IN   NUMBER
2249                              ,p_config_item_id  IN   NUMBER
2250                              ,x_return_status   OUT NOCOPY  VARCHAR2
2251                              ,x_msg_count       OUT NOCOPY  NUMBER
2252                              ,x_msg_data        OUT NOCOPY  VARCHAR2
2253                              )
2254 IS
2255   l_api_version  CONSTANT NUMBER := 1.0;
2256   l_api_name VARCHAR2(30) := 'ext_deactivate_item';
2257   l_ext_activated_flag  VARCHAR2(1);
2258   l_root_inst_changed   BOOLEAN;
2259   v_child_config_tbl    CZ_API_PUB.number_tbl_type;
2260   l_run_id      NUMBER;
2261   l_config_item_id   NUMBER;
2262   REMOVE_IB_ERR    EXCEPTION;
2263 
2264 BEGIN
2265   fnd_msg_pub.initialize;
2266   IF (NOT FND_API.compatible_api_call(l_api_version
2267                                      ,p_api_version
2268                                      ,l_api_name
2269                                      ,G_PKG_NAME
2270                                      ))  THEN
2271     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2272   END IF;
2273 
2274   -----get root instance for the config_item_id
2275   get_root_instance(p_config_hdr_id,
2276         p_config_rev_nbr,
2277         p_config_item_id,
2278         l_root_inst_changed);
2279 
2280   IF (l_root_inst_changed) THEN
2281     -----get all the children of the config item id that is passed in
2282     get_child_items (p_config_hdr_id,p_config_rev_nbr,p_config_item_id,v_child_config_tbl);
2283 
2284     IF (v_child_config_tbl.COUNT > 0) THEN
2285       FOR childItem IN v_child_config_tbl.FIRST..v_child_config_tbl.LAST
2286       LOOP
2287         l_config_item_id := v_child_config_tbl(childItem);
2288         cz_ib_transactions.remove_ib_config(p_session_config_hdr_id =>   p_config_hdr_id,
2289                   p_session_config_rev_nbr => p_config_rev_nbr,
2290                   p_instance_item_id =>  l_config_item_id,
2291                   x_run_id =>  l_run_id
2292                   );
2293         IF (l_run_id > 0) THEN
2294           RAISE REMOVE_IB_ERR;
2295         END IF;
2296       END LOOP;
2297     END IF;
2298   END IF;
2299 
2300   l_ext_activated_flag := '1';
2301   UPDATE cz_config_items
2302   SET    ext_activated_flag = NO_FLAG
2303   WHERE  ext_activated_flag = l_ext_activated_flag
2304     AND  config_hdr_id = p_config_hdr_id
2305     AND  config_rev_nbr = p_config_rev_nbr
2306     AND  config_item_id IN
2307       (SELECT config_item_id
2308        FROM cz_config_items
2309        WHERE config_hdr_id = p_config_hdr_id
2310          AND config_rev_nbr = p_config_rev_nbr
2311          AND deleted_flag = NO_FLAG
2312        START WITH config_item_id = p_config_item_id
2313          AND config_hdr_id = p_config_hdr_id
2314          AND config_rev_nbr = p_config_rev_nbr
2315          AND deleted_flag = NO_FLAG
2316        CONNECT BY PRIOR config_item_id = parent_config_item_id
2317          AND config_hdr_id = p_config_hdr_id
2318          AND config_rev_nbr = p_config_rev_nbr
2319          AND deleted_flag = NO_FLAG);
2320 
2321   IF (SQL%ROWCOUNT > 0) THEN
2322     x_return_status := FND_API.G_RET_STS_SUCCESS;
2323   ELSE
2324     x_return_status := FND_API.G_RET_STS_ERROR;
2325     set_fnd_message('CZ_IB_API_NO_DEACTIVATE','ConfigHdrId',p_config_hdr_id, 'ConfigRevNbr', p_config_rev_nbr);
2326   END IF;
2327   fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
2328 
2329 EXCEPTION
2330   WHEN REMOVE_IB_ERR THEN
2331     x_return_status := FND_API.G_RET_STS_ERROR;
2332     set_fnd_message('CZ_IB_DEACT_REMOVE_IB_ERR',
2333           'ConfigHdrId',  p_config_hdr_id,
2334           'ConfigRevNbr', p_config_rev_nbr,
2335           'ConfigItemId', l_config_item_id,
2336           'RunId', l_run_id);
2337     fnd_msg_pub.count_and_get(p_count => x_msg_count,p_data  => x_msg_data);
2338   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2339     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2340     fnd_msg_pub.count_and_get(p_count => x_msg_count,
2341                               p_data  => x_msg_data);
2342   WHEN OTHERS THEN
2343     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2344     IF fnd_msg_pub.check_msg_Level(fnd_msg_pub.G_MSG_LVL_UNEXP_ERROR) THEN
2345       fnd_msg_pub.add_exc_msg(G_PKG_NAME, l_api_name);
2346     END IF;
2347 
2348     fnd_msg_pub.count_and_get(p_count => x_msg_count,
2349                               p_data  => x_msg_data);
2350 END ext_deactivate_item;
2351 
2352 ------------------------------------------------------------------------------------------
2353 /*  The CZ stub patch for use as a prereq by other teams will contain CZ_NETWORK_API_PUB.validate
2354     but not CZ_CF_API.validate.  Existing customers have CZ_CF_API.validate,
2355     but without the new p_validation_type parameter. If the CZ stub patch is applied
2356     with your product's MACD changes but without CZ's MACD changes,
2357     your code will not compile if it calls CZ_CF_API.validate with p_validation_type. */
2358 
2359 PROCEDURE VALIDATE(config_input_list IN  CZ_CF_API.CFG_INPUT_LIST,        -- input selections
2360              init_message      IN  VARCHAR2,                              -- additional XML
2361              config_messages   IN OUT NOCOPY CZ_CF_API.CFG_OUTPUT_PIECES, -- table of output XML messages
2362              validation_status IN OUT NOCOPY NUMBER,                      -- status return
2363              URL               IN  VARCHAR2 DEFAULT FND_PROFILE.Value('CZ_UIMGR_URL'),
2364              p_validation_type IN  VARCHAR2 DEFAULT CZ_API_PUB.VALIDATE_ORDER
2365         )
2366 
2367 IS
2368 
2369 BEGIN
2370   cz_cf_api.validate( config_input_list,
2371                       init_message,
2372                       config_messages,
2373                       validation_status,
2374                       URL,
2375                       p_validation_type);
2376 END VALIDATE;
2377 
2378 
2379 -- The "is_item_added" function returns 1 if the config item has an "add" delta, 0 if not.
2380 -- Note that p_config_hdr_id and p_config_rev_nbr are for the session header, not the instance header.
2381 
2382 FUNCTION is_item_added (p_config_hdr_id IN NUMBER,
2383                         p_config_rev_nbr IN NUMBER,
2384                         p_config_item_id IN NUMBER) RETURN pls_integer IS
2385   l_delta pls_integer;
2386   l_hex_format varchar2(20) := 'FM0000X';
2387   -- add bit is bit 1, which has a value of 2 when turned on
2388   l_add_bit pls_integer := 2;
2389 BEGIN
2390   SELECT config_delta INTO l_delta
2391   FROM cz_config_items
2392   WHERE config_hdr_id = p_config_hdr_id AND config_rev_nbr = p_config_rev_nbr
2393     AND config_item_id = p_config_item_id;
2394 
2395   IF to_number(utl_raw.bit_and(to_char(l_delta,l_hex_format), to_char(l_add_bit,l_hex_format))) > 0 THEN
2396     RETURN 1;
2397   ELSE
2398     RETURN 0;
2399   END IF;
2400 END is_item_added;
2401 
2402 ----------------------------------------------------------------------
2403 END CZ_NETWORK_API_PUB;