[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;