[Home] [Help]
PACKAGE BODY: APPS.CZ_DEVELOPER_UTILS_PVT
Source
1 PACKAGE BODY CZ_DEVELOPER_UTILS_PVT AS
2 /* $Header: czdevub.pls 120.58.12010000.10 2009/03/02 14:48:31 vsingava ship $ */
3
4 gDB_SETTING_USE_SECURITY BOOLEAN := TRUE;
5 G_DEFAULT_ITEM_TYPE CONSTANT INTEGER := 0;
6 G_RULE_TYPE CONSTANT VARCHAR2(10) := 'R';
7 G_INTL_TEXT_TYPE CONSTANT VARCHAR2(10) := 'T';
8 G_UI_ACTION_TYPE CONSTANT VARCHAR2(10) := 'A';
9 modelReportRun BOOLEAN := FALSE; -- vsingava: 24-Nov-2008; Bug 7297669
10 mINCREMENT INTEGER:=20;
11 currPSSeqVal CZ_PS_NODES.ps_node_id%TYPE:=0;
12 currentPSNode CZ_PS_NODES.ps_node_id%TYPE:=mINCREMENT;
13
14 -- FOR MODEL REPORT, storing default seeded data in static data 5404051
15 TYPE tRuleName IS TABLE OF cz_rules.name%TYPE INDEX BY BINARY_INTEGER;
16 TYPE tTemplateToken IS TABLE OF cz_rules.template_token%TYPE INDEX BY BINARY_INTEGER;
17 TYPE tRuleId IS TABLE OF cz_rules.rule_id%TYPE INDEX BY BINARY_INTEGER;
18
19 h_RuleName tRuleName;
20 h_TemplateToken tTemplateToken;
21 h_RuleId tRuleId;
22 TYPE t_int_array_tbl_type IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
23 TYPE t_int_array_tbl_type_idx_vc2 IS TABLE OF INTEGER INDEX BY VARCHAR2(15);
24 TYPE t_varchar_array_tbl_type IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
25 TYPE t_varchar_array_tbl_type_vc2 IS TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(15);-- kdande; Bug 6880555; 12-Mar-2008
26 TYPE t_num_array_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
27 TYPE t_char_array_tbl_type IS TABLE OF VARCHAR2(1) INDEX BY BINARY_INTEGER;
28 TYPE t_varchar_map_type IS TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(4000);
29 TYPE t_varchar_to_num_map_type IS TABLE OF NUMBER INDEX BY VARCHAR2(255);
30 TYPE t_indexes IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
31
32 -- vsingava bug6638552 23rd Nov '08
33 -- performance fix for model report
34 TYPE tNodeId IS TABLE OF cz_model_ref_expls.model_ref_expl_id%TYPE INDEX BY BINARY_INTEGER;
35 TYPE tParentId IS TABLE OF cz_model_ref_expls.parent_expl_node_id%TYPE INDEX BY BINARY_INTEGER;
36 TYPE tComponentId IS TABLE OF cz_model_ref_expls.component_id%TYPE INDEX BY BINARY_INTEGER;
37 TYPE tReferringId IS TABLE OF cz_model_ref_expls.referring_node_id%TYPE INDEX BY BINARY_INTEGER;
38 TYPE tNodeType IS TABLE OF cz_model_ref_expls.ps_node_type%TYPE INDEX BY BINARY_INTEGER;
39
40 -- tables to cache model explosion data
41 v_NodeId tNodeId;
42 v_ParentId tParentId;
43 v_ComponentId tComponentId;
44 v_ReferringId tReferringId;
45 v_NodeType tNodeType;
46 h_ParentId tParentId;
47 h_NodeType tNodeType;
48 h_ReferringId tReferringId;
49 h_ComponentId tComponentId;
50
51 OBJECT_NOT_FOUND EXCEPTION;
52 SEEDED_OBJ_EXCEP EXCEPTION;
53 NO_TXT_FOUND_EXCP EXCEPTION;
54 COPY_RULE_FAILURE EXCEPTION;
55
56 CZ_R_NO_PARTICIPANTS EXCEPTION;
57 CZ_R_WRONG_EXPRESSION_NODE EXCEPTION;
58 CZ_G_INVALID_RULE_EXPLOSION EXCEPTION;
59 CZ_R_INCORRECT_NODE_ID EXCEPTION;
60 CZ_R_LITERAL_NO_VALUE EXCEPTION;
61
62 g_attribute_map t_varchar_map_type;
63 g_element_type_tbl t_varchar_to_num_map_type;
64
65 RULE_CLASS_DEFAULT CONSTANT INTEGER := 1;
66 RULE_CLASS_SEARCH_DECISION CONSTANT INTEGER := 2;
67
68 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
69 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
70
71 PROCEDURE Initialize IS
72 BEGIN
73 SELECT CZ_PS_NODES_S.NEXTVAL INTO currentPSNode FROM dual;
74 currPSSeqVal:=currentPSNode;
75
76 SELECT TO_NUMBER(value) INTO mINCREMENT FROM cz_db_settings
77 WHERE UPPER(setting_id)=UPPER('OracleSequenceIncr') AND section_name='SCHEMA';
78 EXCEPTION
79 WHEN NO_DATA_FOUND THEN
80 mINCREMENT:=20;
81 WHEN OTHERS THEN
82 mINCREMENT:=20;
83 END Initialize;
84
85 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
86 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
87
88 FUNCTION getPSSeqVal RETURN INTEGER IS
89 BEGIN
90
91 IF currentPSNode<currPSSeqVal+mINCREMENT-1 THEN
92 currentPSNode:=currentPSNode+1;
93 ELSE
94 SELECT CZ_PS_NODES_S.nextval INTO currPSSeqVal FROM dual;
95 currentPSNode:=currPSSeqVal;
96 END IF;
97 RETURN currentPSNode;
98 END getPSSeqVal;
99
100
101
102 FUNCTION is_val_number(p_str IN VARCHAR2)
103 RETURN VARCHAR2
104 IS
105
106 v_numval NUMBER;
107
108 BEGIN
109 IF (p_str IS NOT NULL) THEN
110 v_numval := TO_NUMBER(p_str);
111 RETURN 'TRUE';
112 ELSE
113 RETURN 'FALSE';
114 END IF;
115 EXCEPTION
116 WHEN OTHERS THEN
117 RETURN 'FALSE';
118 END is_val_number;
119
120 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
121 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
122
123 FUNCTION GetRunID return INTEGER IS
124 RUN_ID NUMBER;
125 BEGIN
126 select CZ_XFR_RUN_INFOS_S.NEXTVAL INTO RUN_ID FROM dual;
127 return RUN_ID;
128 END GetRunID;
129
130 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
131 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
132
133 --
134 -- this method add log message to fnd log table
135 --
136 PROCEDURE LOG_REPORT
137 (p_run_id IN VARCHAR2,
138 p_error_message IN VARCHAR2) IS
139 l_return BOOLEAN;
140 BEGIN
141 l_return := cz_utils.log_report(Msg => p_error_message,
142 Urgency => 1,
143 ByCaller => 'CZ_DEVELOPER_UTILS_PVT',
144 StatusCode => 11276,
145 RunId => p_run_id);
146 END LOG_REPORT;
147
148 --
149 -- initialize global run_id ( <-> CZ_DB_LOGS.run_id )
150 --
151 --PROCEDURE Initialize IS
152 --BEGIN
153 -- SELECT CZ_XFR_RUN_INFOS_S.NEXTVAL INTO gRUN_ID FROM dual;
154 -- fnd_msg_pub.initialize;
155 --END Initialize;
156
157 --
158 --
159 -- add FND error message
160 --
161 PROCEDURE add_Error_Message(p_message_name IN VARCHAR2,
162 p_token_name1 IN VARCHAR2 DEFAULT NULL,
163 p_token_value1 IN VARCHAR2 DEFAULT NULL,
164 p_token_name2 IN VARCHAR2 DEFAULT NULL,
165 p_token_value2 IN VARCHAR2 DEFAULT NULL,
166 p_token_name3 IN VARCHAR2 DEFAULT NULL,
167 p_token_value3 IN VARCHAR2 DEFAULT NULL) IS
168 l_msg_count NUMBER;
169 l_msg_data VARCHAR2(32000);
170 BEGIN
171 FND_MESSAGE.SET_NAME('CZ', p_message_name);
172 IF p_token_name1 IS NOT NULL THEN
173 FND_MESSAGE.SET_TOKEN(p_token_name1, p_token_value1);
174 END IF;
175 IF p_token_name2 IS NOT NULL THEN
176 FND_MESSAGE.SET_TOKEN(p_token_name2, p_token_value2);
177 END IF;
178 IF p_token_name3 IS NOT NULL THEN
179 FND_MESSAGE.SET_TOKEN(p_token_name3, p_token_value3);
180 END IF;
181 FND_MSG_PUB.ADD;
182 FND_MSG_PUB.count_and_get(p_count => l_msg_count,
183 p_data => l_msg_data);
184 END add_Error_Message;
185
186 --
187 -- handle exception and put error message to FND stack
188 --
189 PROCEDURE handle_Error
190 (p_message_name IN VARCHAR2,
191 p_token_name1 IN VARCHAR2 DEFAULT NULL,
192 p_token_value1 IN VARCHAR2 DEFAULT NULL,
193 p_token_name2 IN VARCHAR2 DEFAULT NULL,
194 p_token_value2 IN VARCHAR2 DEFAULT NULL,
195 p_token_name3 IN VARCHAR2 DEFAULT NULL,
196 p_token_value3 IN VARCHAR2 DEFAULT NULL,
197 x_return_status OUT NOCOPY VARCHAR2,
198 x_msg_count OUT NOCOPY NUMBER,
199 x_msg_data OUT NOCOPY VARCHAR2) IS
200 BEGIN
201 x_return_status := FND_API.G_RET_STS_ERROR;
202 x_msg_count := 1;
203 add_Error_Message(p_message_name => p_message_name,
204 p_token_name1 => p_token_name1,
205 p_token_value1 => p_token_value1,
206 p_token_name2 => p_token_name2,
207 p_token_value2 => p_token_value2,
208 p_token_name3 => p_token_name3,
209 p_token_value3 => p_token_value3);
210 x_msg_data := fnd_msg_pub.GET(1,fnd_api.g_false);
211 END handle_Error;
212
213 --
214 -- handle exception and put error message to FND stack
215 --
216 PROCEDURE handle_Error
217 (p_procedure_name IN VARCHAR2,
218 p_error_message IN VARCHAR2,
219 x_return_status OUT NOCOPY VARCHAR2,
220 x_msg_count OUT NOCOPY NUMBER,
221 x_msg_data OUT NOCOPY VARCHAR2) IS
222 BEGIN
223 x_return_status := FND_API.G_RET_STS_ERROR;
224 x_msg_count := 1;
225 x_msg_data := 'Fatal error : '||p_error_message;
226 fnd_msg_pub.add_exc_msg('CZ_DEVELOPER_UTILS_PVT', p_procedure_name, x_msg_data);
227 END handle_Error;
228
229 /*
230 * This procedure loops over the objects in a folder checking/logging
231 * models and UIC templates that are currently locked.
232 *
233 * p_rp_folder_id - folder_id
234 * x_return_status - status string
235 * x_msg_count - number of error messages
236 * x_msg_data - string which contains error messages
237 */
238
239 PROCEDURE check_folder_for_locks(p_rp_folder_id IN NUMBER,
240 x_return_status OUT NOCOPY VARCHAR2,
241 x_msg_count OUT NOCOPY NUMBER,
242 x_msg_data OUT NOCOPY VARCHAR2)
243 IS
244
245 TYPE t_checkout_user_tbl IS TABLE OF cz_devl_projects.checkout_user%TYPE INDEX BY BINARY_INTEGER;
246 TYPE number_type_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
247 TYPE name_tbl IS TABLE OF cz_ps_nodes.name%TYPE INDEX BY BINARY_INTEGER;
248
249 l_user_name cz_ui_templates.checkout_user%type;
250 l_rp_folder NUMBER;
251 l_rp_model_tbl number_type_tbl;
252 l_rp_fld_tbl number_type_tbl;
253 l_uct_tbl number_type_tbl;
254 l_checkout_user_tbl t_checkout_user_tbl;
255 l_devl_prj_name_tbl name_tbl;
256 l_template_name_tbl name_tbl;
257
258 BEGIN
259
260 x_return_status := FND_API.g_ret_sts_success;
261 x_msg_count := 0;
262 x_msg_data := '';
263
264 l_user_name := FND_GLOBAL.user_name;
265
266 --check if p_rp_folder_id exists
267 SELECT object_id
268 INTO l_rp_folder
269 FROM cz_rp_entries
270 WHERE cz_rp_entries.object_id = p_rp_folder_id
271 AND cz_rp_entries.object_type = 'FLD'
272 AND cz_rp_entries.deleted_flag = '0';
273
274 l_rp_fld_tbl.DELETE;
275
276 -- Get all folders and subfolders
277 SELECT object_id
278 BULK
279 COLLECT
280 INTO l_rp_fld_tbl
281 FROM cz_rp_entries
282 WHERE cz_rp_entries.deleted_flag = '0'
283 AND cz_rp_entries.object_type = 'FLD'
284 START WITH cz_rp_entries.object_type = 'FLD'
285 AND cz_rp_entries.object_id = l_rp_folder
286 CONNECT BY PRIOR cz_rp_entries.object_id = cz_rp_entries.enclosing_folder
287 AND PRIOR cz_rp_entries.object_type = 'FLD';
288
289 IF (l_rp_fld_tbl.COUNT > 0) THEN
290 FOR I IN l_rp_fld_tbl.FIRST..l_rp_fld_tbl.LAST
291 LOOP
292
293 ----collect all projects
294 l_rp_model_tbl.DELETE;
295 SELECT object_id, checkout_user, cz_devl_projects.name
296 BULK COLLECT
297 INTO l_rp_model_tbl, l_checkout_user_tbl, l_devl_prj_name_tbl
298 FROM cz_rp_entries, cz_devl_projects
299 WHERE cz_rp_entries.object_type = 'PRJ'
300 AND cz_rp_entries.deleted_flag = '0'
301 AND cz_rp_entries.enclosing_folder = l_rp_fld_tbl(i)
302 AND cz_rp_entries.object_id = cz_devl_projects.devl_project_id;
303
304 IF (l_rp_model_tbl.COUNT > 0) THEN
305 FOR J IN l_rp_model_tbl.FIRST..l_rp_model_tbl.LAST
306 LOOP
307 IF (l_checkout_user_tbl(j) IS NOT NULL AND l_checkout_user_tbl(j) <> l_user_name ) THEN
308 FND_MESSAGE.SET_NAME('CZ', 'CZ_COPY_MODEL_IS_LOCKED');
309 FND_MESSAGE.SET_TOKEN('MODELNAME', l_devl_prj_name_tbl(j));
310 FND_MESSAGE.SET_TOKEN('USERNAME', l_checkout_user_tbl(j));
311 FND_MSG_PUB.ADD;
312 x_return_status := FND_API.g_ret_sts_error;
313 END IF;
314 END LOOP;
315 END IF;
316
317 ----get uct
318 l_uct_tbl.DELETE;
319 SELECT object_id, checkout_user, template_name
320 BULK COLLECT
321 INTO l_uct_tbl, l_checkout_user_tbl, l_template_name_tbl
322 FROM cz_rp_entries, cz_ui_templates
323 WHERE cz_rp_entries.object_type = 'UCT'
324 AND cz_rp_entries.deleted_flag = '0'
325 AND cz_rp_entries.seeded_flag <> '1'
326 AND cz_rp_entries.enclosing_folder = l_rp_fld_tbl(i)
327 AND cz_rp_entries.object_id = cz_ui_templates.template_id
328 AND cz_ui_templates.ui_def_id = 0;
329
330 IF (l_uct_tbl.COUNT > 0) THEN
331 FOR J IN l_uct_tbl.FIRST..l_uct_tbl.LAST
332 LOOP
333 IF (l_checkout_user_tbl(j) IS NOT NULL AND l_checkout_user_tbl(j) <> l_user_name ) THEN
334 FND_MESSAGE.SET_NAME('CZ', 'CZ_COPY_TMPL_IS_LOCKED');
335 FND_MESSAGE.SET_TOKEN('UCTNAME', l_template_name_tbl(j));
336 FND_MESSAGE.SET_TOKEN('USERNAME', l_checkout_user_tbl(j));
337 FND_MSG_PUB.ADD;
338 x_return_status := FND_API.g_ret_sts_error;
339 END IF;
340 END LOOP;
341 END IF;
342
343 END LOOP;
344 END IF;
345
346 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
347 p_data => x_msg_data);
348
349 EXCEPTION
350 WHEN NO_DATA_FOUND THEN
351 x_return_status := FND_API.G_RET_STS_SUCCESS;
352 WHEN OTHERS THEN
353 handle_Error(p_procedure_name => 'check_folder_for_locks',
354 p_error_message => SQLERRM,
355 x_return_status => x_return_status,
356 x_msg_count => x_msg_count,
357 x_msg_data => x_msg_data);
358
359 END check_folder_for_locks;
360
361 --
362 -- update node names in rule text
363 -- Parameters : p_rule_id - identifies rule
364 -- Returns : rule text with updated node names
365 --
366 FUNCTION replace_Rule_Text(p_rule_id IN NUMBER,
367 p_use_profile IN NUMBER DEFAULT 0) RETURN CLOB IS
368
369 MAX_CHUNK_SIZE INTEGER := 32000;
370 l_var_str VARCHAR2(32000);
371 l_var_str1 VARCHAR2(32000);
372 l_var_str2 VARCHAR2(32000);
373 l_var_path VARCHAR2(32000);
374 l_rule_text_str VARCHAR2(32000);
375 l_source_offset NUMBER;
376 l_model_id NUMBER;
377
378 PROCEDURE put_String_Into_CLOB(p_buffer IN VARCHAR2) IS
379
380 l_clob_loc CLOB;
381 l_amount BINARY_INTEGER;
382 l_position INTEGER := 1;
383
384 BEGIN
385
386 UPDATE CZ_RULES
387 SET rule_text = EMPTY_CLOB()
388 WHERE rule_id = p_rule_id;
389
390 SELECT rule_text INTO l_clob_loc FROM CZ_RULES
391 WHERE rule_id = p_rule_id;
392
393 DBMS_LOB.OPEN(l_clob_loc,DBMS_LOB.lob_readwrite);
394
395 l_amount:=LENGTH(p_buffer);
396
397 DBMS_LOB.WRITE(l_clob_loc, l_amount, l_position, p_buffer);
398
399 DBMS_LOB.CLOSE (l_clob_loc);
400
401 END put_String_Into_CLOB;
402
403 FUNCTION get_String_From_CLOB RETURN VARCHAR2 IS
404
408 l_position INTEGER := 1;
405 l_clob_loc CLOB;
406 l_chunksize INTEGER;
407 l_amount BINARY_INTEGER;
409 l_buffer VARCHAR2(32000);
410
411 BEGIN
412
413 --Bug #6936712. Removing calls to opening-closing DBMS_LOB procedures.
414 --The following SELECT creates a temporary LOB, so there is no need in
415 --explicit call to CREATETEMPORARY. Temporary LOBs will get freed
416 --automatically - examples in Oracle Doc do not call FREETEMPORARY.
417 --Also, Oracle Doc says that calls to OPEN-CLOSE are not required. It
418 --seems that DBMS successfully manages LOBs.
419
420 SELECT rule_text INTO l_clob_loc FROM CZ_RULES
421 WHERE rule_id = p_rule_id;
422
423 l_chunksize := DBMS_LOB.GETCHUNKSIZE(l_clob_loc);
424 --vsingava 18th Dec '08 bug7316397
425 IF (l_chunksize < MAX_CHUNK_SIZE) THEN
426 l_amount := FLOOR(MAX_CHUNK_SIZE / l_chunksize) * l_chunksize;
427 ELSE
428 l_amount := MAX_CHUNK_SIZE;
429 END IF;
430
431 BEGIN
432 LOOP
433 DBMS_LOB.READ (l_clob_loc, l_amount, l_position, l_buffer);
434 l_position := l_position + l_amount;
435 END LOOP;
436 EXCEPTION
437 WHEN OTHERS THEN
438 NULL;
439 END;
440
441 RETURN l_buffer;
442
443 END get_String_From_CLOB;
444
445 --This procedure retrieves the full model path and cuts it according to node_depth.
446
447 FUNCTION get_Path(p_model_id IN NUMBER,p_ps_node_id IN NUMBER,
448 p_model_ref_expl_id IN NUMBER, p_depth IN NUMBER)
449 RETURN VARCHAR2 IS
450
451 l_nodes_tbl t_varchar_array_tbl_type;
452 l_depth NUMBER;
453 l_path VARCHAR2(32000);
454 l_full_path VARCHAR2(32000);
455 l_substr VARCHAR2(32000);
456 l_name CZ_PS_NODES.name%TYPE;
457 l_to NUMBER;
458 l_from NUMBER;
459 l_index NUMBER;
460 l_shift NUMBER;
461
462 BEGIN
463
464 IF(p_use_profile = 0)THEN
465
466 l_full_path := get_Full_Model_Path(p_ps_node_id => p_ps_node_id,
467 p_model_ref_expl_id => p_model_ref_expl_id,
468 p_model_id => p_model_id);
469 ELSE
470
471 l_full_path := get_Full_Label_Path(p_ps_node_id => p_ps_node_id,
472 p_model_ref_expl_id => p_model_ref_expl_id,
473 p_model_id => p_model_id);
474 END IF;
475
476 l_substr := REPLACE(l_full_path, '\''', FND_GLOBAL.LOCAL_CHR(7) || FND_GLOBAL.LOCAL_CHR(8));
477 LOOP
478
479 IF(SUBSTR(l_substr, 1, 1) = '''')THEN
480
481 l_index := INSTR(l_substr,'''.');
482
483 --The original node name can start with ., so '. will be found at the position 1.
484 --In this case we need the second one.
485
486 IF(l_index = 1)THEN l_index := INSTR(l_substr, '''.', 2); END IF;
487 l_shift := 2;
488 ELSE
489
490 l_index := INSTR(l_substr,'.');
491 l_shift := 1;
492 END IF;
493
494 IF l_index > 0 THEN
495 l_nodes_tbl(l_nodes_tbl.COUNT + 1) := SUBSTR(l_substr, 1, l_index - 2 + l_shift);
496 l_substr := SUBSTR(l_substr, l_index + l_shift);
497 ELSE
498 l_nodes_tbl(l_nodes_tbl.COUNT + 1) := l_substr;
499 EXIT;
500 END IF;
501 END LOOP;
502
503 l_to := l_nodes_tbl.Count;
504
505 FOR i IN 1..l_to LOOP
506
507 --Bug #3545083 - we need all the names enclosed in single quotes for the purposes of the
508 --replace_Rule_Text procedure, therefore enclose it here if necessary.
509
510 IF(SUBSTR(l_nodes_tbl(i), 1, 1) <> '''')THEN l_nodes_tbl(i) := '''' || l_nodes_tbl(i) || ''''; END IF;
511 END LOOP;
512
513 l_from := l_to - p_depth + 1;
514 IF(l_from <= l_to)THEN l_path := l_nodes_tbl(l_from); END IF;
515
516 FOR i IN l_from + 1..l_to LOOP
517 l_path := l_path || '.' || l_nodes_tbl(i);
518 END LOOP;
519
520 RETURN REPLACE(l_path, FND_GLOBAL.LOCAL_CHR(7) || FND_GLOBAL.LOCAL_CHR(8), '\''');
521 END get_Path;
522
523 FUNCTION get_Property(p_property_id IN NUMBER) RETURN VARCHAR2 IS
524 l_property_name CZ_PROPERTIES.NAME%TYPE;
525 BEGIN
526 SELECT NAME INTO l_property_name FROM CZ_PROPERTIES
527 WHERE property_id=p_property_id;
528 RETURN '"' || l_property_name || '"';
529 END get_Property;
530
531 BEGIN
532
533 SELECT devl_project_id INTO l_model_id FROM CZ_RULES
534 WHERE rule_id=p_rule_id;
535
536 l_rule_text_str := get_String_From_CLOB();
537
538 FOR i IN(SELECT source_offset,source_length,display_node_depth,
539 ps_node_id,property_id,model_ref_expl_id FROM CZ_EXPRESSION_NODES
543
540 WHERE rule_id = p_rule_id AND expr_type IN(205,207)
541 AND deleted_flag='0' ORDER BY -source_offset)
542 LOOP
544 IF i.source_offset=0 THEN
545 l_source_offset := 1;
546 ELSE
547 l_source_offset := i.source_offset;
548 END IF;
549
550 IF l_source_offset =1 THEN
551 l_var_str1 := '';
552 ELSE
553 l_var_str1 := SUBSTR(l_rule_text_str,1,l_source_offset-1);
554 END IF;
555
556 l_var_str2 := SUBSTR(l_rule_text_str,l_source_offset+i.source_length);
557 IF i.property_id IS NULL THEN
558 l_var_path := get_Path(l_model_id,i.ps_node_id,i.model_ref_expl_id,i.display_node_depth);
559 ELSE
560 l_var_path := get_Property(i.property_id);
561 END IF;
562
563 l_rule_text_str := l_var_str1||l_var_path||l_var_str2;
564 END LOOP;
565
566 RETURN l_rule_text_str;
567
568 END replace_Rule_Text;
569
570 --
571 -- generate NEW ID FROM a given sequence
572 -- Parameters : p_sequence_name - name of DB sequence
573 -- Return : next id from sequence
574 --
575 FUNCTION allocateId(p_sequence_name IN VARCHAR2) RETURN NUMBER IS
576 l_id NUMBER;
577 BEGIN
578 EXECUTE IMMEDIATE
579 'SELECT '||p_sequence_name||'.NEXTVAL FROM dual' INTO l_id;
580 RETURN l_id;
581 END allocateId;
582
583 --
584 -- create a copy of INTL TEXT record
585 -- Parameters :
586 -- p_intl_text_id - identifies INTL TEXT record
587 -- Returns : id of new INTL TEXT record
588 --
589 FUNCTION copy_INTL_TEXT(p_intl_text_id IN VARCHAR2) RETURN NUMBER IS
590
591 l_new_intl_text_id NUMBER;
592 l_counter NUMBER := 0;
593
594 BEGIN
595
596 IF p_intl_text_id IS NULL THEN
597 RETURN NULL;
598 END IF;
599
600 l_new_intl_text_id := allocateId('CZ_INTL_TEXTS_S');
601
602 FOR i IN(SELECT intl_text_id,language,localized_str,source_lang FROM CZ_LOCALIZED_TEXTS
603 WHERE intl_text_id=p_intl_text_id AND deleted_flag='0')
604 LOOP
605 INSERT INTO CZ_LOCALIZED_TEXTS
606 (INTL_TEXT_ID,
607 LOCALIZED_STR,
608 LANGUAGE,
609 SOURCE_LANG,
610 DELETED_FLAG,
611 SECURITY_MASK,
612 CHECKOUT_USER,
613 UI_DEF_ID,
614 MODEL_ID,
615 PERSISTENT_INTL_TEXT_ID,
616 SEEDED_FLAG)
617 SELECT
618 l_new_intl_text_id,
619 LOCALIZED_STR,
620 LANGUAGE,
621 SOURCE_LANG,
622 DELETED_FLAG,
623 SECURITY_MASK,
624 CHECKOUT_USER,
625 UI_DEF_ID,
626 MODEL_ID,
627 l_new_intl_text_id,
628 '0'
629 FROM CZ_LOCALIZED_TEXTS
630 WHERE intl_text_id=p_intl_text_id AND
631 language=i.LANGUAGE AND
632 source_lang=i.SOURCE_LANG AND deleted_flag='0';
633 l_counter := l_counter + 1;
634 END LOOP;
635 IF l_counter = 0 THEN
636 RETURN -1;
637 END IF;
638 RETURN l_new_intl_text_id;
639 END copy_INTL_TEXT;
640
641 --
642 -- copy subtree
643 --
644 --
645 PROCEDURE copy_Expl_Subtree
646 (
647 p_model_ref_expl_id IN NUMBER,
648 p_curr_node_depth IN NUMBER,
649 p_new_parent_expl_id IN NUMBER,
650 p_new_parent_expl_node_depth IN NUMBER,
651 p_ps_nodes_tbl IN t_int_array_tbl_type_idx_vc2,
652 x_expl_nodes_tbl OUT NOCOPY t_int_array_tbl_type
653 ) IS
654
655 l_new_expl_id NUMBER;
656 l_new_parent_expl_id NUMBER;
657 l_new_component_id NUMBER;
658 l_referring_node_id NUMBER;
659 l_node_depth NUMBER;
660 l_index NUMBER;
661 l_delta NUMBER;
662
663 BEGIN
664 l_delta := p_curr_node_depth - p_new_parent_expl_node_depth;
665
666 FOR i IN(SELECT * FROM CZ_MODEL_REF_EXPLS
667 START WITH model_ref_expl_id=p_model_ref_expl_id AND deleted_flag='0'
668 CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag='0'
669 AND PRIOR deleted_flag='0')
670 LOOP
671 x_expl_nodes_tbl(i.model_ref_expl_id) := allocateId('CZ_MODEL_REF_EXPLS_S');
672 --dbms_output.put_line('i.model_ref_expl_id:'||i.model_ref_expl_id);
673 --dbms_output.put_line(x_expl_nodes_tbl(i.model_ref_expl_id));
674 END LOOP;
675
676 l_index := x_expl_nodes_tbl.FIRST;
677
678 LOOP
679 IF l_index IS NULL THEN
680 EXIT;
681 END IF;
682
683 FOR i IN(SELECT * FROM CZ_MODEL_REF_EXPLS
684 WHERE model_ref_expl_id = l_index )
685 LOOP
686
687 l_referring_node_id := NULL;
688 l_new_component_id := NULL;
689 l_new_parent_expl_id := NULL;
690 l_node_depth := i.node_depth - l_delta + 1;
694 l_new_parent_expl_id := p_new_parent_expl_id;
691 l_new_expl_id := x_expl_nodes_tbl(i.model_ref_expl_id);
692
693 IF i.parent_expl_node_id IS NULL OR i.model_ref_expl_id=p_model_ref_expl_id THEN
695 ELSE
696 l_new_parent_expl_id := x_expl_nodes_tbl(i.parent_expl_node_id);
697 END IF;
698
699 IF (p_ps_nodes_tbl.EXISTS(i.component_id)) THEN
700 l_new_component_id := p_ps_nodes_tbl(i.component_id);
701 ELSE
702 l_new_component_id := i.component_id;
703 END IF;
704
705 IF (p_ps_nodes_tbl.EXISTS(i.referring_node_id)) THEN
706 l_referring_node_id := p_ps_nodes_tbl(i.referring_node_id);
707 ELSE
708 l_referring_node_id := i.referring_node_id;
709 END IF;
710
711 INSERT INTO CZ_MODEL_REF_EXPLS
712 (
713 MODEL_REF_EXPL_ID
714 ,COMPONENT_ID
715 ,PARENT_EXPL_NODE_ID
716 ,PS_NODE_TYPE
717 ,MODEL_ID
718 ,VIRTUAL_FLAG
719 ,NODE_DEPTH
720 ,DELETED_FLAG
721 ,REFERRING_NODE_ID
722 ,CHILD_MODEL_EXPL_ID
723 ,EXPL_NODE_TYPE
724 ,HAS_TRACKABLE_CHILDREN
725 )
726 VALUES
727 (
728 l_new_expl_id
729 ,l_new_component_id
730 ,l_new_parent_expl_id
731 ,i.PS_NODE_TYPE
732 ,i.MODEL_ID
733 ,i.VIRTUAL_FLAG
734 ,l_node_depth
735 ,i.DELETED_FLAG
736 ,l_referring_node_id
737 ,i.CHILD_MODEL_EXPL_ID
738 ,i.EXPL_NODE_TYPE
739 ,i.HAS_TRACKABLE_CHILDREN
740 );
741
742 END LOOP;
743 l_index := x_expl_nodes_tbl.NEXT(l_index);
744 END LOOP;
745
746 END copy_Expl_Subtree;
747
748 --
749 -- copy subtree of Model tree
750 -- Parameters :
751 -- p_node_id - identifies root node of subtree
752 -- p_new_parent_id - identifies new parent node
753 -- p_copy_mode - specifies mode of copying
754 -- x_run_id - OUT parameter : if =0 => no errors
755 -- - else =CZ_DB_LOGS.run_id
756 -- x_return_status - status string
757 -- x_msg_count - number of error messages
758 -- x_msg_data - string which contains error messages
759 --
760 PROCEDURE copy_PS_Subtree
761 (
762 p_node_id IN NUMBER,
763 p_new_parent_id IN NUMBER,
764 p_copy_mode IN VARCHAR2,
765 x_run_id OUT NOCOPY NUMBER,
766 x_return_status OUT NOCOPY VARCHAR2,
767 x_msg_count OUT NOCOPY NUMBER,
768 x_msg_data OUT NOCOPY VARCHAR2
769 ) IS
770
771 l_new_intl_text_id NUMBER;
772 l_new_violation_text_id NUMBER;
773 l_new_node_id NUMBER;
774 l_new_parent_id NUMBER;
775 l_model_id NUMBER;
776 l_component_id NUMBER;
777 l_new_component_id NUMBER;
778 l_reference_id NUMBER;
779 l_parent_expl_id NUMBER;
780 l_new_pr_expl_id NUMBER;
781 l_parent_component_id NUMBER;
782 l_expl_id NUMBER;
783 l_node_depth NUMBER;
784 l_parent_id NUMBER;
785 l_tree_seq NUMBER;
786 l_index NUMBER;
787 l_name CZ_PS_NODES.name%TYPE;
788 l_virtual_flag VARCHAR2(1);
789
790 l_ps_nodes_tbl t_int_array_tbl_type_idx_vc2;
791 l_persistent_tbl t_int_array_tbl_type_idx_vc2;
792 l_ps_node_type_tbl t_int_array_tbl_type_idx_vc2;
793 l_comp_tbl t_int_array_tbl_type_idx_vc2;
794 l_node_name_tbl t_varchar_array_tbl_type_vc2;-- kdande; Bug 6880555; 12-Mar-2008
795 l_top_ref_node_id NUMBER;
796 l_node_counter NUMBER;
797 l_expl_nodes_tbl t_int_array_tbl_type;
798 l_curr_node_depth NUMBER;
799 l_min_node_depth NUMBER;
800 l_text_id NUMBER;
801 l_ps_node_type NUMBER;
802 l_expl_nodes_all_tbl t_int_array_tbl_type;
803 l_new_expl_id NUMBER;
804
805 BEGIN
806
807 FND_MSG_PUB.initialize;
808 Initialize;
809 l_ps_nodes_tbl.delete;
810 l_persistent_tbl.delete;
811 x_return_status := FND_API.G_RET_STS_SUCCESS;
812
813 -- get the info from the node to be copied
814 SELECT devl_project_id,parent_id,reference_id,component_id,virtual_flag,ps_node_type
815 INTO l_model_id,l_parent_id,l_reference_id,l_component_id,l_virtual_flag,l_ps_node_type
816 FROM CZ_PS_NODES
817 WHERE ps_node_id=p_node_id;
818
819 -- if not a reference node, get the model_refexpl_id record in model ref expls
820 IF l_reference_id IS NULL THEN
821 SELECT model_ref_expl_id, node_depth INTO l_expl_id, l_curr_node_depth
822 FROM CZ_MODEL_REF_EXPLS
823 WHERE model_id=l_model_id AND component_id=l_component_id AND
824 child_model_expl_id IS NULL AND deleted_flag='0';
825 ELSE
826 SELECT MIN(node_depth) INTO l_min_node_depth
827 FROM CZ_MODEL_REF_EXPLS
831 SELECT model_ref_expl_id, node_depth INTO l_expl_id, l_curr_node_depth
828 WHERE model_id=l_model_id AND referring_node_id=p_node_id
829 AND deleted_flag='0';
830
832 FROM CZ_MODEL_REF_EXPLS
833 WHERE model_id=l_model_id AND referring_node_id=p_node_id AND
834 node_depth=l_min_node_depth AND deleted_flag='0';
835 END IF;
836
837 -- get the ref expl id and node depth of the destination node in ref expls
838 SELECT model_ref_expl_id,node_depth INTO l_new_pr_expl_id, l_node_depth
839 FROM CZ_MODEL_REF_EXPLS
840 WHERE model_id=l_model_id AND component_id=(SELECT component_id
841 FROM CZ_PS_NODES WHERE ps_node_id = p_new_parent_id) AND referring_node_id IS NULL AND
842 child_model_expl_id IS NULL AND deleted_flag='0';
843
844 FOR i IN (SELECT ps_node_id, ps_node_type, component_id, persistent_node_id, name FROM CZ_PS_NODES
845 START WITH ps_node_id=p_node_id AND deleted_flag='0'
846 CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag='0' AND PRIOR deleted_flag='0')
847 LOOP
848 l_ps_nodes_tbl(i.ps_node_id) := getPSSeqVal;
849 l_ps_node_type_tbl(i.ps_node_id) := i.ps_node_type;
850 l_node_name_tbl(i.ps_node_id) := i.name;
851 l_comp_tbl(i.ps_node_id) := i.component_id;
852 l_persistent_tbl(i.persistent_node_id) := l_ps_nodes_tbl(i.ps_node_id);
853 END LOOP;
854 l_index := l_ps_nodes_tbl.FIRST;
855 LOOP
856 IF l_index IS NULL THEN
857 EXIT;
858 END IF;
859
860 FOR i IN (SELECT * FROM CZ_PS_NODES
861 WHERE ps_node_id=l_index AND deleted_flag='0')
862 LOOP
863 IF i.ps_node_id=p_node_id THEN
864 l_new_parent_id := p_new_parent_id;
865 SELECT NVL(MAX(tree_seq),0) + 1 INTO l_tree_seq
866 FROM cz_ps_nodes
867 WHERE parent_id=p_new_parent_id;
868 ELSE
869 l_new_parent_id := l_ps_nodes_tbl(i.parent_id);
870 l_tree_seq := i.TREE_SEQ;
871 END IF;
872
873 l_new_node_id := l_ps_nodes_tbl(i.ps_node_id);
874
875 IF i.intl_text_id IS NOT NULL THEN
876 l_text_id := i.intl_text_id;
877 l_new_intl_text_id := copy_INTL_TEXT(i.intl_text_id);
878 IF l_new_intl_text_id = -1 THEN
879 RAISE NO_TXT_FOUND_EXCP;
880 END IF;
881 ELSE
882 l_new_intl_text_id:=NULL;
883 END IF;
884
885 IF i.violation_text_id IS NOT NULL THEN
886 l_text_id := i.violation_text_id;
887 l_new_violation_text_id := copy_INTL_TEXT(i.violation_text_id);
888 IF l_new_violation_text_id = -1 THEN
889 RAISE NO_TXT_FOUND_EXCP;
890 END IF;
891 ELSE
892 l_new_violation_text_id:=NULL;
893 END IF;
894
895 IF l_new_parent_id=p_new_parent_id THEN
896 SELECT COUNT(*) INTO l_node_counter FROM CZ_PS_NODES
897 WHERE parent_id=p_new_parent_id AND
898 (name=i.NAME OR name LIKE 'Copy (%) of '||i.NAME) AND deleted_flag='0';
899 IF l_node_counter > 0 THEN
900 l_name := 'Copy ('||TO_CHAR(l_node_counter)||') of '||i.NAME;
901 ELSE
902 l_name := i.NAME;
903 END IF;
904 ELSE
905 l_name := i.NAME;
906 END IF;
907
908 INSERT INTO CZ_PS_NODES
909 (
910 PS_NODE_ID
911 ,DEVL_PROJECT_ID
912 ,FROM_POPULATOR_ID
913 ,PROPERTY_BACKPTR
914 ,ITEM_TYPE_BACKPTR
915 ,INTL_TEXT_ID
916 ,SUB_CONS_ID
917 ,ITEM_ID
918 ,NAME
919 ,ORIG_SYS_REF
920 ,RESOURCE_FLAG
921 ,INITIAL_VALUE
922 ,PARENT_ID
923 ,MINIMUM
924 ,MAXIMUM
925 ,PS_NODE_TYPE
926 ,FEATURE_TYPE
927 ,PRODUCT_FLAG
928 ,REFERENCE_ID
929 ,MULTI_CONFIG_FLAG
930 ,ORDER_SEQ_FLAG
931 ,SYSTEM_NODE_FLAG
932 ,TREE_SEQ
933 ,COUNTED_OPTIONS_FLAG
934 ,UI_OMIT
935 ,UI_SECTION
936 ,BOM_TREATMENT
937 ,COMPONENT_SEQUENCE_ID
938 ,BOM_REQUIRED_FLAG
939 ,SO_ITEM_TYPE_CODE
940 ,MINIMUM_SELECTED
941 ,MAXIMUM_SELECTED
942 ,DELETED_FLAG
943 ,EFF_FROM
944 ,EFF_TO
945 ,SECURITY_MASK
946 ,EFF_MASK
947 ,CHECKOUT_USER
948 ,USER_NUM01
949 ,USER_NUM02
950 ,USER_NUM03
951 ,USER_NUM04
952 ,USER_STR01
953 ,USER_STR02
954 ,USER_STR03
955 ,USER_STR04
956 ,VIRTUAL_FLAG
957 ,EFFECTIVE_USAGE_MASK
958 ,EFFECTIVE_FROM
959 ,EFFECTIVE_UNTIL
960 ,DECIMAL_QTY_FLAG
961 ,PERSISTENT_NODE_ID
962 ,COMPONENT_SEQUENCE_PATH
963 ,VIOLATION_TEXT_ID
964 ,EFFECTIVITY_SET_ID
965 ,QUOTEABLE_FLAG
966 ,PRIMARY_UOM_CODE
967 ,BOM_SORT_ORDER
968 ,IB_TRACKABLE
969 ,COMPONENT_ID
973 ,INITIAL_NUM_VALUE
970 ,ACCUMULATOR_FLAG
971 ,NOTES_TEXT_ID
972 ,INSTANTIABLE_FLAG
974 ,SRC_APPLICATION_ID
975 ,MAX_LENGTH
976 ,DISPLAYNAME_CAPT_RULE_ID
977 ,DISPLAYNAME_TEXT_ID
978 )
979 VALUES
980 (
981 l_new_node_id
982 ,i.DEVL_PROJECT_ID
983 ,i.FROM_POPULATOR_ID
984 ,i.PROPERTY_BACKPTR
985 ,i.ITEM_TYPE_BACKPTR
986 ,l_new_intl_text_id
987 ,i.SUB_CONS_ID
988 ,i.ITEM_ID
989 ,l_name
990 ,NULL
991 ,i.RESOURCE_FLAG
992 ,i.INITIAL_VALUE
993 ,l_new_parent_id
994 ,i.MINIMUM
995 ,i.MAXIMUM
996 ,i.PS_NODE_TYPE
997 ,i.FEATURE_TYPE
998 ,i.PRODUCT_FLAG
999 ,i.REFERENCE_ID
1000 ,i.MULTI_CONFIG_FLAG
1001 ,i.ORDER_SEQ_FLAG
1002 ,i.SYSTEM_NODE_FLAG
1003 ,l_tree_seq
1004 ,i.COUNTED_OPTIONS_FLAG
1005 ,i.UI_OMIT
1006 ,i.UI_SECTION
1007 ,i.BOM_TREATMENT
1008 ,i.COMPONENT_SEQUENCE_ID
1009 ,i.BOM_REQUIRED_FLAG
1010 ,i.SO_ITEM_TYPE_CODE
1011 ,i.MINIMUM_SELECTED
1012 ,i.MAXIMUM_SELECTED
1013 ,i.DELETED_FLAG
1014 ,i.EFF_FROM
1015 ,i.EFF_TO
1016 ,i.SECURITY_MASK
1017 ,i.EFF_MASK
1018 ,i.CHECKOUT_USER
1019 ,i.USER_NUM01
1020 ,i.USER_NUM02
1021 ,i.USER_NUM03
1022 ,i.USER_NUM04
1023 ,i.USER_STR01
1024 ,i.USER_STR02
1025 ,i.USER_STR03
1026 ,i.USER_STR04
1027 ,i.VIRTUAL_FLAG
1028 ,i.EFFECTIVE_USAGE_MASK
1029 ,i.EFFECTIVE_FROM
1030 ,i.EFFECTIVE_UNTIL
1031 ,i.DECIMAL_QTY_FLAG
1032 ,l_new_node_id
1033 ,i.COMPONENT_SEQUENCE_PATH
1034 ,l_new_violation_text_id
1035 ,i.EFFECTIVITY_SET_ID
1036 ,i.QUOTEABLE_FLAG
1037 ,i.PRIMARY_UOM_CODE
1038 ,i.BOM_SORT_ORDER
1039 ,i.IB_TRACKABLE
1040 ,i.COMPONENT_ID
1041 ,i.ACCUMULATOR_FLAG
1042 ,i.NOTES_TEXT_ID
1043 ,i.INSTANTIABLE_FLAG
1044 ,i.INITIAL_NUM_VALUE
1045 ,i.SRC_APPLICATION_ID
1046 ,i.MAX_LENGTH
1047 ,i.DISPLAYNAME_CAPT_RULE_ID
1048 ,i.DISPLAYNAME_TEXT_ID
1049 );
1050
1051 -- copy ps node property values, if any
1052
1053 INSERT INTO CZ_PS_PROP_VALS(
1054 PS_NODE_ID
1055 ,PROPERTY_ID
1056 ,DATA_VALUE
1057 ,DELETED_FLAG
1058 ,EFF_FROM
1059 ,EFF_TO
1060 ,SECURITY_MASK
1061 ,EFF_MASK
1062 ,CHECKOUT_USER
1063 ,ORIG_SYS_REF
1064 ,DATA_NUM_VALUE
1065 )
1066 SELECT
1067 l_new_node_id
1068 ,PROPERTY_ID
1069 ,DATA_VALUE
1070 ,DELETED_FLAG
1071 ,EFF_FROM
1072 ,EFF_TO
1073 ,SECURITY_MASK
1074 ,EFF_MASK
1075 ,CHECKOUT_USER
1076 ,NULL
1077 ,DATA_NUM_VALUE
1078 FROM CZ_PS_PROP_VALS
1079 WHERE PS_NODE_ID=l_index
1080 AND DELETED_FLAG='0';
1081
1082 END LOOP;
1083
1084 l_index := l_ps_nodes_tbl.NEXT(l_index);
1085
1086 END LOOP;
1087
1088 IF (l_virtual_flag='1' OR l_virtual_flag IS NULL) AND l_parent_id IS NOT NULL AND l_ps_node_type IN(COMPONENT_TYPE) THEN
1089 FOR i IN(SELECT model_ref_expl_id, node_depth FROM CZ_MODEL_REF_EXPLS
1090 WHERE parent_expl_node_id=l_expl_id AND
1091 (referring_node_id IS NULL AND component_id IN
1092 (SELECT ps_node_id FROM CZ_PS_NODES
1093 START WITH ps_node_id=p_node_id
1094 CONNECT BY PRIOR ps_node_id=parent_id AND
1095 deleted_flag='0' AND PRIOR deleted_flag='0'))
1096 UNION
1097 SELECT model_ref_expl_id, node_depth FROM CZ_MODEL_REF_EXPLS
1098 WHERE parent_expl_node_id=l_expl_id AND
1099 (referring_node_id IS NOT NULL AND referring_node_id IN
1100 (SELECT ps_node_id FROM CZ_PS_NODES
1101 START WITH ps_node_id=p_node_id
1102 CONNECT BY PRIOR ps_node_id=parent_id AND
1103 deleted_flag='0' AND PRIOR deleted_flag='0')))
1104
1105 LOOP
1106
1107 copy_Expl_Subtree(p_model_ref_expl_id => i.model_ref_expl_id,
1108 p_curr_node_depth => i.node_depth,
1109 p_new_parent_expl_id => l_new_pr_expl_id,
1110 p_new_parent_expl_node_depth => l_node_depth,
1111 p_ps_nodes_tbl => l_ps_nodes_tbl,
1112 x_expl_nodes_tbl => l_expl_nodes_tbl);
1113
1114 --
1118 l_index:=l_expl_nodes_tbl.FIRST;
1115 -- save in the new map to use later for updating the expl ids for rules
1116 --
1117
1119 LOOP
1120 IF l_index IS NULL THEN
1121 EXIT;
1122 END IF;
1123 l_expl_nodes_all_tbl(l_index):=l_expl_nodes_tbl(l_index);
1124 l_index := l_expl_nodes_tbl.NEXT(l_index);
1125 END LOOP;
1126
1127 END LOOP;
1128
1129 ELSIF (l_virtual_flag='0' OR l_parent_id IS NULL) OR l_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) THEN
1130
1131 copy_Expl_Subtree(p_model_ref_expl_id => l_expl_id,
1132 p_curr_node_depth => l_curr_node_depth,
1133 p_new_parent_expl_id => l_new_pr_expl_id,
1134 p_new_parent_expl_node_depth => l_node_depth,
1135 p_ps_nodes_tbl => l_ps_nodes_tbl,
1136 x_expl_nodes_tbl => l_expl_nodes_tbl);
1137
1138 END IF;
1139
1140 CZ_REFS.populate_Component_Id(l_model_id);
1141 --vsingava bug7831246
1142 CZ_REFS.populate_parent_expl_tree(p_ps_node_id => l_ps_nodes_tbl(p_node_id),
1143 p_model_id => l_model_id);
1144
1145
1146 /* begining of copy associated rules option */
1147
1148 IF (p_copy_mode = '2') THEN
1149 DECLARE
1150 l_rule_folder_id_tbl t_num_array_tbl_type;
1151 l_rule_id_tbl t_num_array_tbl_type;
1152 l_rule_type_tbl t_num_array_tbl_type;
1153 l_rule_compid_tbl t_num_array_tbl_type;
1154 l_rule_model_refexpl_tbl t_num_array_tbl_type;
1155 l_ref_models_tbl t_num_array_tbl_type;
1156 l_ref_model_id_tbl t_num_array_tbl_type;
1157 l_rule_node_model_tbl t_num_array_tbl_type;
1158 l_model_ref_expl_tbl t_num_array_tbl_type;
1159 l_rule_nodes_tbl t_num_array_tbl_type;
1160 l_new_rule_id NUMBER;
1161 l_run_id NUMBER;
1162 l_return_status VARCHAR2(1);
1163 l_msg_count NUMBER;
1164 l_msg_data VARCHAR2(2000);
1165 l_copy_rule BOOLEAN:=FALSE;
1166 l_node_found BOOLEAN:=FALSE;
1167 l_referenced_model_id NUMBER;
1168 l_count NUMBER;
1169 l_ref_node_found BOOLEAN:=FALSE;
1170 -------------------------------------------
1171 -- cursor to load all rules in this project
1172 -------------------------------------------
1173 CURSOR l_model_rules_csr is
1174 SELECT rule_id, rule_folder_id, rule_type, component_id, model_ref_expl_id
1175 FROM cz_rules
1176 WHERE devl_project_id = l_model_id
1177 AND deleted_flag = '0'
1178 AND rule_type IN (RULE_TYPE_EXPRESSION,RULE_TYPE_COMPAT_TABLE,RULE_TYPE_DESIGNCHART,RULE_TYPE_JAVA_METHOD);
1179 ------------------------------------------------------------------------
1180 -- cursor to load all participating ps nodes in a expression or CX rule
1181 ------------------------------------------------------------------------
1182 CURSOR l_rule_nodes_csr (iRuleId NUMBER) IS
1183 SELECT DISTINCT e.ps_node_id, p.devl_project_id, e.model_ref_expl_id
1184 FROM cz_expression_nodes e, cz_rules r, cz_ps_nodes p
1185 WHERE e.deleted_flag = '0'
1186 AND r.deleted_flag = '0'
1187 AND p.deleted_flag = '0'
1188 AND p.ps_node_id = e.ps_node_id
1189 AND r.rule_id = e.rule_id
1190 AND r.rule_id = iRuleId
1191 AND e.ps_node_id IS NOT NULL;
1192 ----------------------------------------------------------------------------------
1193 -- cursor to load all participating ps nodes in design chart or explicit comp rule
1194 ----------------------------------------------------------------------------------
1195 CURSOR l_rule_nodes_csr2 (iRuleId NUMBER) IS
1196 SELECT DISTINCT f.feature_id, p.devl_project_id, f.model_ref_expl_id
1197 FROM cz_des_chart_features f, cz_rules r, cz_ps_nodes p
1198 WHERE f.deleted_flag = '0'
1199 AND r.deleted_flag = '0'
1200 AND p.deleted_flag = '0'
1201 AND p.ps_node_id = f.feature_id
1202 AND r.rule_id = f.rule_id
1203 AND r.rule_id = iRuleId
1204 AND f.feature_id IS NOT NULL;
1205
1206 BEGIN
1207 -----------------------------------
1208 -- load all the rules of this model
1209 -----------------------------------
1210 OPEN l_model_rules_csr;
1211 FETCH l_model_rules_csr BULK COLLECT INTO
1212 l_rule_id_tbl, l_rule_folder_id_tbl, l_rule_type_tbl, l_rule_compid_tbl, l_rule_model_refexpl_tbl;
1213 CLOSE l_model_rules_csr;
1214
1215 --
1216 -- get the nearest expl id of the newly created root node of the subtree
1217 --
1218 l_index := l_ps_nodes_tbl.FIRST;
1219 IF l_index = NULL THEN
1220 RETURN;
1221 END IF;
1222
1223 IF (l_ps_node_type_tbl(l_index) IN (263, 264)) THEN
1224 SELECT model_ref_expl_id INTO l_new_expl_id
1225 FROM cz_model_ref_expls a, cz_ps_nodes b
1226 WHERE a.referring_node_id = l_ps_nodes_tbl(l_index)
1227 AND a.referring_node_id = b.ps_node_id
1228 AND b.devl_project_id = l_model_id
1229 AND a.model_id = l_model_id
1230 AND b.ps_node_type = l_ps_node_type_tbl(l_index)
1234 SELECT component_id INTO l_new_component_id
1231 AND a.deleted_flag='0'
1232 AND b.deleted_flag='0';
1233 ELSE
1235 FROM cz_ps_nodes
1236 WHERE ps_node_id=l_ps_nodes_tbl(l_index);
1237
1238 SELECT model_ref_expl_id INTO l_new_expl_id
1239 FROM cz_model_ref_expls a, cz_ps_nodes b
1240 WHERE a.component_id = b.ps_node_id
1241 AND b.ps_node_id = l_new_component_id
1242 AND b.devl_project_id = l_model_id
1243 AND a.model_id = b.devl_project_id
1244 AND a.deleted_flag = '0'
1245 AND b.deleted_flag = '0';
1246 END IF;
1247
1248 IF (l_rule_id_tbl.COUNT > 0) THEN
1249 FOR i IN l_rule_id_tbl.FIRST..l_rule_id_tbl.LAST LOOP
1250 l_copy_rule := TRUE;
1251
1252 IF (l_rule_type_tbl(i) = RULE_TYPE_JAVA_METHOD AND NOT l_ps_nodes_tbl.EXISTS(l_rule_compid_tbl(i))) THEN
1253
1254 SELECT devl_project_id INTO l_referenced_model_id
1255 FROM cz_ps_nodes
1256 WHERE ps_node_id = l_rule_compid_tbl(i)
1257 AND deleted_flag = '0';
1258
1259 l_node_found := FALSE;
1260 l_index := l_ps_nodes_tbl.FIRST;
1261 LOOP
1262 IF l_index IS NULL THEN
1263 EXIT;
1264 END IF;
1265 IF (l_ps_node_type_tbl(l_index) IN (263, 264)) THEN
1266
1267 FOR k IN (SELECT * FROM cz_model_ref_expls
1268 START WITH model_id=l_model_id AND referring_node_id = l_index
1269 AND component_id = l_comp_tbl(l_index) AND ps_node_type = l_ps_node_type_tbl(l_index)
1270 AND deleted_flag = '0'
1271 CONNECT BY PRIOR model_ref_expl_id = parent_expl_node_id
1272 AND deleted_flag = '0' AND PRIOR deleted_flag = '0')
1273 LOOP
1274
1275 IF(k.component_id = l_referenced_model_id AND k.model_ref_expl_id = l_rule_model_refexpl_tbl(i)) THEN
1276 l_node_found := TRUE;
1277 EXIT;
1278 END IF;
1279 END LOOP;
1280 END IF;
1281 l_index := l_ps_nodes_tbl.NEXT(l_index);
1282 END LOOP;
1283
1284 IF (l_node_found = FALSE) THEN
1285 l_copy_rule := FALSE;
1286 END IF;
1287
1288 END IF;
1289
1290 l_rule_nodes_tbl.delete; l_rule_node_model_tbl.delete; l_model_ref_expl_tbl.delete;
1291
1292 --
1293 -- load all the participants ps nodes in this rule
1294 --
1295
1296 IF l_copy_rule = TRUE THEN
1297 IF l_rule_type_tbl(i) IN (RULE_TYPE_EXPRESSION, RULE_TYPE_JAVA_METHOD) THEN
1298 OPEN l_rule_nodes_csr(l_rule_id_tbl(i));
1299 FETCH l_rule_nodes_csr BULK COLLECT INTO l_rule_nodes_tbl, l_rule_node_model_tbl, l_model_ref_expl_tbl;
1300 CLOSE l_rule_nodes_csr;
1301 ELSIF l_rule_type_tbl(i) IN (RULE_TYPE_DESIGNCHART, RULE_TYPE_COMPAT_TABLE) THEN
1302 OPEN l_rule_nodes_csr2(l_rule_id_tbl(i));
1303 FETCH l_rule_nodes_csr2 BULK COLLECT INTO l_rule_nodes_tbl, l_rule_node_model_tbl, l_model_ref_expl_tbl;
1304 CLOSE l_rule_nodes_csr2;
1305 END IF;
1306 END IF;
1307
1308 IF (l_rule_nodes_tbl.COUNT > 0) THEN
1309 FOR j IN l_rule_nodes_tbl.FIRST..l_rule_nodes_tbl.LAST LOOP
1310
1311 l_node_found := FALSE;
1312 -------------------------------------------------
1313 -- check if this ps node belongs to this model
1314 -- if so, search the entire subtree for this node
1315 -------------------------------------------------
1316 IF (l_rule_node_model_tbl(j) = l_model_id) THEN
1317 IF l_ps_nodes_tbl.EXISTS(l_rule_nodes_tbl(j)) THEN
1318 l_node_found := TRUE;
1319 END IF;
1320 ELSE
1321 ----------------------------------------------------------------------------
1322 -- check if the ps node belongs to any of models referenced in this subtree
1323 ----------------------------------------------------------------------------
1324 l_index := l_ps_node_type_tbl.FIRST;
1325 LOOP
1326 IF l_index IS NULL THEN
1327 EXIT;
1328 END IF;
1329 IF (l_ps_node_type_tbl(l_index) IN (263, 264)) THEN
1330
1331 FOR k IN (SELECT * FROM cz_model_ref_expls
1332 START WITH model_id=l_model_id AND referring_node_id = l_index
1333 AND component_id = l_comp_tbl(l_index) AND ps_node_type = l_ps_node_type_tbl(l_index)
1334 AND deleted_flag = '0'
1335 CONNECT BY PRIOR model_ref_expl_id = parent_expl_node_id
1336 AND deleted_flag = '0' AND PRIOR deleted_flag = '0')
1337 LOOP
1338
1339 IF(k.component_id = l_rule_node_model_tbl(j) AND k.model_ref_expl_id = l_model_ref_expl_tbl(j)) THEN
1340 l_node_found := TRUE;
1341 EXIT;
1342 END IF;
1346 EXIT;
1343 END LOOP;
1344 END IF;
1345 IF (l_node_found = TRUE) THEN
1347 END IF;
1348 l_index := l_ps_nodes_tbl.NEXT(l_index);
1349 END LOOP;
1350
1351 END IF; /* l_rule_node_model_tbl(j) = l_model_id) */
1352
1353 IF (l_node_found = FALSE) THEN
1354 l_copy_rule := FALSE;
1355 EXIT;
1356 END IF;
1357
1358 END LOOP; /* next node, for j */
1359 END IF; -- if l_rule_nodes.count > 0
1360 ---------------------------------------------------------------------
1361 -- copy the rule because all ps nodes in this rule are in the subtree being copied
1362 ---------------------------------------------------------------------
1363 IF (l_copy_rule = TRUE AND (l_rule_type_tbl(i) = RULE_TYPE_JAVA_METHOD OR l_rule_nodes_tbl.COUNT > 0)) THEN
1364
1365 copy_Rule(l_rule_id_tbl(i),
1366 l_rule_folder_id_tbl(i),
1367 FND_API.G_FALSE,
1368 l_new_rule_id,
1369 x_run_id,
1370 l_return_status,
1371 l_msg_count,
1372 l_msg_data);
1373
1374 ----------------------------------------------------------
1375 -- update node ids and expl ids of the newly created rules
1376 ----------------------------------------------------------
1377
1378 IF (l_return_status = 'S' AND l_new_rule_id IS NOT NULL) THEN
1379
1380 IF (l_rule_type_tbl(i) IN (RULE_TYPE_EXPRESSION, RULE_TYPE_JAVA_METHOD)) THEN
1381
1382 --
1383 -- update node ids
1384 --
1385
1386 l_index := l_ps_nodes_tbl.FIRST;
1387 LOOP
1388 IF l_index IS NULL THEN
1389 EXIT;
1390 END IF;
1391
1392 UPDATE cz_expression_nodes
1393 SET ps_node_id = l_ps_nodes_tbl(l_index)
1394 WHERE ps_node_id = l_index
1395 AND rule_id = l_new_rule_id;
1396
1397 l_index := l_ps_nodes_tbl.NEXT(l_index);
1398 END LOOP;
1399
1400 IF (l_rule_type_tbl(i) = RULE_TYPE_JAVA_METHOD) THEN
1401
1402 --
1403 -- update relative_node_path
1404 --
1405
1406 l_index := l_persistent_tbl.FIRST;
1407 LOOP
1408 IF l_index IS NULL THEN
1409 EXIT;
1410 END IF;
1411 UPDATE cz_expression_nodes
1412 SET relative_node_path = REPLACE(relative_node_path,TO_CHAR(l_index),TO_CHAR(l_persistent_tbl(l_index)))
1413 WHERE rule_id = l_new_rule_id
1414 AND relative_node_path IS NOT NULL;
1415 l_index := l_persistent_tbl.NEXT(l_index);
1416 END LOOP;
1417
1418 --
1419 -- update component_id in cz_rules
1420 --
1421
1422 l_index := l_ps_nodes_tbl.FIRST;
1423 LOOP
1424 IF l_index IS NULL THEN
1425 EXIT;
1426 END IF;
1427 UPDATE cz_rules
1428 SET component_id = l_ps_nodes_tbl(l_index)
1429 WHERE rule_id = l_new_rule_id
1430 AND component_id = l_index
1431 AND deleted_flag = '0';
1432 l_index := l_ps_nodes_tbl.NEXT(l_index);
1433 END LOOP;
1434
1435 END IF;
1436
1437 --
1438 -- update expl ids
1439 --
1440
1441 IF l_virtual_flag='0' OR l_parent_id IS NULL THEN
1442
1443 l_index := l_expl_nodes_tbl.FIRST;
1444 LOOP
1445 IF l_index IS NULL THEN
1446 EXIT;
1447 END IF;
1448
1449 UPDATE cz_expression_nodes
1450 SET model_ref_expl_id = l_expl_nodes_tbl(l_index)
1451 WHERE model_ref_expl_id = l_index
1452 AND rule_id = l_new_rule_id;
1453
1454 l_index := l_expl_nodes_tbl.NEXT(l_index);
1455 END LOOP;
1456
1457 IF (l_rule_type_tbl(i) = RULE_TYPE_JAVA_METHOD) THEN
1458
1459 --
1460 -- update model_ref_expl_id in cz_rules
1461 --
1462
1463 l_index := l_expl_nodes_tbl.FIRST;
1464 LOOP
1465 IF l_index IS NULL THEN
1466 EXIT;
1467 END IF;
1468
1472 AND rule_id = l_new_rule_id;
1469 UPDATE cz_rules
1470 SET model_ref_expl_id = l_expl_nodes_tbl(l_index)
1471 WHERE model_ref_expl_id = l_index
1473
1474 l_index := l_expl_nodes_tbl.NEXT(l_index);
1475 END LOOP;
1476 END IF;
1477
1478 ELSE -- root has no expls but the rest of subtree contains expls
1479
1480 l_index := l_expl_nodes_all_tbl.FIRST;
1481 LOOP
1482 IF l_index IS NULL THEN
1483 EXIT;
1484 END IF;
1485
1486 UPDATE cz_expression_nodes
1487 SET model_ref_expl_id = l_expl_nodes_all_tbl(l_index)
1488 WHERE model_ref_expl_id = l_index
1489 AND rule_id = l_new_rule_id;
1490
1491 l_index := l_expl_nodes_all_tbl.NEXT(l_index);
1492 END LOOP;
1493
1494 -- also update those nodes in subtree under the non-virtual root
1495
1496 UPDATE cz_expression_nodes
1497 SET model_ref_expl_id = l_new_expl_id
1498 WHERE rule_id=l_new_rule_id
1499 AND model_ref_expl_id=l_expl_id;
1500
1501 IF (l_rule_type_tbl(i) = RULE_TYPE_JAVA_METHOD) THEN
1502
1503 --
1504 -- update model_ref_expl_id in cz_rules
1505 --
1506
1507 l_index := l_expl_nodes_all_tbl.FIRST;
1508 LOOP
1509 IF l_index IS NULL THEN
1510 EXIT;
1511 END IF;
1512
1513 UPDATE cz_rules
1514 SET model_ref_expl_id = l_expl_nodes_all_tbl(l_index)
1515 WHERE model_ref_expl_id = l_index
1516 AND rule_id = l_new_rule_id;
1517
1518 l_index := l_expl_nodes_all_tbl.NEXT(l_index);
1519 END LOOP;
1520 END IF;
1521
1522 END IF; -- vf
1523
1524 ELSIF l_rule_type_tbl(i) IN (RULE_TYPE_DESIGNCHART, RULE_TYPE_COMPAT_TABLE) THEN
1525
1526 --
1527 -- update node ids
1528 --
1529
1530 l_index := l_ps_nodes_tbl.FIRST;
1531 LOOP
1532 IF l_index IS NULL THEN
1533 EXIT;
1534 END IF;
1535
1536 --des chart cells primary_opt_id
1537 UPDATE cz_des_chart_cells
1538 SET primary_opt_id = l_ps_nodes_tbl(l_index)
1539 WHERE primary_opt_id = l_index
1540 AND rule_id = l_new_rule_id;
1541
1542 -- des chart cells secondary_opt_id
1543 UPDATE cz_des_chart_cells
1544 SET secondary_opt_id = l_ps_nodes_tbl(l_index)
1545 WHERE secondary_opt_id = l_index
1546 AND rule_id = l_new_rule_id;
1547
1548 -- des chart cells secondary_feature_id
1549 UPDATE cz_des_chart_cells
1550 SET secondary_feature_id = l_ps_nodes_tbl(l_index)
1551 WHERE secondary_feature_id = l_index
1552 AND rule_id = l_new_rule_id;
1553
1554 -- des chart features feature_id
1555 UPDATE cz_des_chart_features
1556 SET feature_id = l_ps_nodes_tbl(l_index)
1557 WHERE feature_id = l_index
1558 AND rule_id = l_new_rule_id;
1559
1560 l_index := l_ps_nodes_tbl.NEXT(l_index);
1561 END LOOP; -- updated node ids
1562
1563 --
1564 -- update expl ids
1565 --
1566
1567 IF l_virtual_flag='0' OR l_parent_id IS NULL THEN
1568 l_index := l_expl_nodes_tbl.FIRST;
1569 LOOP
1570 IF l_index IS NULL THEN
1571 EXIT;
1572 END IF;
1573
1574 -- des_chart_cells secondary_feature_expl_id
1575 UPDATE cz_des_chart_cells
1576 SET secondary_feat_expl_id = l_expl_nodes_tbl(l_index)
1577 WHERE secondary_feat_expl_id = l_index
1578 AND rule_id = l_new_rule_id;
1579
1580 -- des_chart_features model_ref_expl_id
1581 UPDATE cz_des_chart_features
1582 SET model_ref_expl_id = l_expl_nodes_tbl(l_index)
1583 WHERE model_ref_expl_id = l_index
1584 AND rule_id = l_new_rule_id;
1585
1586 l_index := l_expl_nodes_tbl.NEXT(l_index);
1587 END LOOP;
1588
1589 ELSE -- root has no expls but the rest of subtree contains expls
1590
1591 l_index := l_expl_nodes_all_tbl.FIRST;
1592 LOOP
1593 IF l_index IS NULL THEN
1594 EXIT;
1595 END IF;
1596
1600 WHERE secondary_feat_expl_id = l_index
1597 -- des_chart_cells secondary_feature_expl_id
1598 UPDATE cz_des_chart_cells
1599 SET secondary_feat_expl_id = l_expl_nodes_all_tbl(l_index)
1601 AND rule_id = l_new_rule_id;
1602
1603 -- des_chart_features model_ref_expl_id
1604 UPDATE cz_des_chart_features
1605 SET model_ref_expl_id = l_expl_nodes_all_tbl(l_index)
1606 WHERE model_ref_expl_id = l_index
1607 AND rule_id = l_new_rule_id;
1608
1609 l_index := l_expl_nodes_all_tbl.NEXT(l_index);
1610 END LOOP;
1611
1612 -- also update those nodes in subtree under the non-virtual root
1613
1614 -- des_chart_cells secondary_feature_expl_id
1615 UPDATE cz_des_chart_cells
1616 SET secondary_feat_expl_id = l_new_expl_id
1617 WHERE secondary_feat_expl_id = l_expl_id
1618 AND rule_id = l_new_rule_id;
1619
1620 -- des_chart_features model_ref_expl_id
1621 UPDATE cz_des_chart_features
1622 SET model_ref_expl_id = l_new_expl_id
1623 WHERE model_ref_expl_id = l_expl_id
1624 AND rule_id = l_new_rule_id;
1625
1626 END IF; -- vf
1627 END IF; -- rule type
1628
1629 END IF; -- (l_return_status = 'S')
1630 END IF; -- (l_copy_rule = TRUE)
1631
1632 END LOOP; -- FOR i IN l_rule_id_tbl.FIRST
1633
1634 END IF; -- l_rule_id_tbl.COUNT > 0
1635 EXCEPTION
1636 WHEN OTHERS THEN
1637 RAISE;
1638 END; -- begin
1639 END IF; -- if p_copy_mode = '2'
1640
1641
1642 EXCEPTION
1643 WHEN NO_TXT_FOUND_EXCP THEN
1644 handle_Error(p_message_name => 'CZ_COPY_PSSUBTREE_NO_TXT',
1645 p_token_name1 => 'TEXTID',
1646 p_token_value1 => TO_CHAR(l_text_id),
1647 x_return_status => x_return_status,
1648 x_msg_count => x_msg_count,
1649 x_msg_data => x_msg_data);
1650 x_run_id := GetRunID;
1651 LOG_REPORT(x_run_id,x_msg_data);
1652 WHEN OTHERS THEN
1653 handle_Error(p_procedure_name => 'copy_PS_Subtree',
1654 p_error_message => SQLERRM,
1655 x_return_status => x_return_status,
1656 x_msg_count => x_msg_count,
1657 x_msg_data => x_msg_data);
1658
1659 x_run_id := GetRunID;
1660 LOG_REPORT(x_run_id,x_msg_data);
1661 END copy_PS_Subtree;
1662
1663 --
1664 -- copy single Rule
1665 -- Parameters :
1666 -- p_rule_id - identifies rule to copy
1667 -- p_rule_folder_id - identifies rule folder in which rule will be copied
1668 -- x_out_new_rule_id - OUT variable - id of new rule
1669 -- x_run_id - OUT parameter : if =0 => no errors
1670 -- - else =CZ_DB_LOGS.run_id
1671 -- x_return_status - status string
1672 -- x_msg_count - number of error messages
1673 -- x_msg_data - string which contains error messages
1674 --
1675 PROCEDURE copy_Rule
1676 (p_rule_id IN NUMBER,
1677 p_rule_folder_id IN NUMBER DEFAULT NULL,
1678 p_init_msg_list IN VARCHAR2,
1679 p_ui_def_id IN NUMBER,
1680 p_ui_page_id IN NUMBER,
1681 p_ui_page_element_id IN VARCHAR2,
1682 x_out_new_rule_id OUT NOCOPY NUMBER,
1683 x_run_id OUT NOCOPY NUMBER,
1684 x_return_status OUT NOCOPY VARCHAR2,
1685 x_msg_count OUT NOCOPY NUMBER,
1686 x_msg_data OUT NOCOPY VARCHAR2) IS
1687
1688 l_model_id NUMBER;
1689 l_rule_folder_id NUMBER;
1690 l_new_rule_id NUMBER;
1691 l_new_reason_id NUMBER;
1692 l_new_unsatisfied_msg_id NUMBER;
1693 l_new_seq_nbr NUMBER;
1694 l_filter_set_id NUMBER;
1695 l_new_filter_set_id NUMBER;
1696 l_new_populator_id NUMBER;
1697 l_new_expr_id NUMBER;
1698 l_new_tree_seq NUMBER;
1699 l_new_rfl_id NUMBER;
1700 l_rule_type NUMBER;
1701 l_reference_ps_node_id NUMBER;
1702 l_persistent_node_id NUMBER;
1703 l_seeded_flag cz_rules.seeded_flag%TYPE;
1704
1705 l_new_exprnode_tbl t_num_array_tbl_type;
1706 l_new_parent_exprnode_tbl t_num_array_tbl_type;
1707 l_exprnode_tbl t_num_array_tbl_type;
1708 l_parent_exprnode_tbl t_num_array_tbl_type;
1709 l_key NUMBER;
1710 l_new_parent NUMBER;
1711 l_object_type cz_rule_folders.object_type%type;
1712 l_effective_from DATE;
1713 l_effective_until DATE;
1714 l_effective_set_id NUMBER;
1715 l_devl_project_id NUMBER;
1716
1717 SEEDED_FLAG_EXCP EXCEPTION;
1718 INVALID_FOLDER_ID_EXCP EXCEPTION;
1719 PAGEBASE_NOT_FOUND_EXCP EXCEPTION;
1720 l_text_id NUMBER;
1721 l_component_id NUMBER;
1722 l_model_ref_expl_id NUMBER;
1726 IF p_init_msg_list = FND_API.G_TRUE THEN
1723 l_class_seq NUMBER;
1724
1725 BEGIN
1727 FND_MSG_PUB.initialize;
1728 END IF;
1729 x_run_id := 0;
1730 x_return_status := FND_API.G_RET_STS_SUCCESS;
1731
1732 SELECT devl_project_id,rule_folder_id, rule_type, seeded_flag
1733 INTO l_model_id,l_rule_folder_id, l_rule_type, l_seeded_flag
1734 FROM CZ_RULES
1735 WHERE rule_id=p_rule_id AND deleted_flag='0';
1736
1737 IF (l_seeded_flag = '1' AND l_rule_type NOT IN (RULE_TYPE_DISPLAY_CONDITION, RULE_TYPE_ENABLED_CONDITION,
1738 RULE_TYPE_CAPTION, RULE_TYPE_JAVA_SYS_PROP)) THEN
1739 RAISE SEEDED_FLAG_EXCP;
1740 END IF;
1741
1742 /* need to investigate this, sselahi*/
1743
1744 if l_rule_type = RULE_TYPE_POPULATOR then
1745 BEGIN
1746 SELECT filter_set_id INTO l_filter_set_id
1747 FROM CZ_FILTER_SETS
1748 WHERE rule_id=p_rule_id AND rownum<2;
1749 EXCEPTION
1750 WHEN NO_DATA_FOUND THEN
1751 NULL;
1752 END;
1753 end if;
1754
1755 IF p_rule_folder_id IS NOT NULL THEN
1756 IF (l_rule_type NOT IN (RULE_TYPE_DISPLAY_CONDITION, RULE_TYPE_ENABLED_CONDITION,
1757 RULE_TYPE_CAPTION, RULE_TYPE_JAVA_SYS_PROP)) THEN
1758 BEGIN
1759 SELECT object_type INTO l_object_type
1760 FROM CZ_RULE_FOLDERS
1761 WHERE rule_folder_id=p_rule_folder_id
1762 AND object_type IN ('RFL','RSQ')
1763 AND deleted_flag='0';
1764 EXCEPTION
1765 WHEN NO_DATA_FOUND THEN
1766 RAISE INVALID_FOLDER_ID_EXCP;
1767 END;
1768 ELSIF (l_rule_type IN (RULE_TYPE_DISPLAY_CONDITION, RULE_TYPE_ENABLED_CONDITION,
1769 RULE_TYPE_CAPTION, RULE_TYPE_JAVA_SYS_PROP)
1770 AND p_rule_folder_id <> 0) THEN
1771 RAISE INVALID_FOLDER_ID_EXCP;
1772 END IF;
1773 END IF;
1774
1775 l_new_rule_id := allocateId('CZ_RULES_S');
1776 x_out_new_rule_id := l_new_rule_id;
1777
1778 FOR i IN (SELECT * FROM CZ_RULES
1779 WHERE rule_id=p_rule_id AND deleted_flag='0')
1780 LOOP
1781 IF i.reason_id IS NOT NULL THEN
1782 l_text_id := i.reason_id;
1783 l_new_reason_id := copy_INTL_TEXT(i.reason_id);
1784 IF l_new_reason_id = -1 THEN
1785 RAISE NO_TXT_FOUND_EXCP;
1786 END IF;
1787 ELSE
1788 l_new_reason_id := NULL;
1789 END IF;
1790
1791 IF i.unsatisfied_msg_id IS NOT NULL THEN
1792 l_text_id := i.unsatisfied_msg_id;
1793 l_new_unsatisfied_msg_id := copy_INTL_TEXT(i.unsatisfied_msg_id);
1794 IF l_new_unsatisfied_msg_id = -1 THEN
1795 RAISE NO_TXT_FOUND_EXCP;
1796 END IF;
1797 ELSE
1798 l_new_unsatisfied_msg_id := NULL;
1799 END IF;
1800
1801 IF (i.reason_type IN (0,1) ) THEN
1802 BEGIN
1803 UPDATE cz_localized_texts
1804 SET localized_str=REPLACE(localized_str, i.NAME, i.NAME||'-'||TO_CHAR(l_new_rule_id))
1805 WHERE intl_text_id = l_new_reason_id;
1806 EXCEPTION
1807 WHEN OTHERS THEN
1808 NULL;
1809 END;
1810 END IF;
1811
1812 IF (i.unsatisfied_msg_source IN (0,1)) THEN
1813 BEGIN
1814 UPDATE cz_localized_texts
1815 SET localized_str=REPLACE(localized_str, i.NAME, i.NAME||'-'||TO_CHAR(l_new_rule_id))
1816 WHERE intl_text_id = l_new_unsatisfied_msg_id;
1817 EXCEPTION
1818 WHEN OTHERS THEN
1819 NULL;
1820 END;
1821 END IF;
1822
1823 IF p_rule_folder_id IS NOT NULL AND p_rule_folder_id<>-1 THEN
1824 l_new_rfl_id := p_rule_folder_id;
1825 ELSE
1826 l_new_rfl_id := i.RULE_FOLDER_ID;
1827 END IF;
1828
1829 SELECT NVL(MAX(seq_nbr),0)+1
1830 INTO l_new_seq_nbr
1831 FROM CZ_RULES
1832 WHERE rule_folder_id=l_new_rfl_id AND deleted_flag='0';
1833
1834 IF l_object_type='RSQ' THEN
1835 IF i.EFFECTIVITY_SET_ID IS NULL OR i.EFFECTIVITY_SET_ID=-1 THEN
1836 l_effective_set_id := NULL;
1837 l_effective_from := CZ_UTILS.EPOCH_END_;
1838 l_effective_until := CZ_UTILS.EPOCH_BEGIN_;
1839 ELSE
1840 SELECT effective_from,effective_until
1841 INTO l_effective_from,l_effective_until
1842 FROM CZ_EFFECTIVITY_SETS
1843 WHERE effectivity_set_id = i.EFFECTIVITY_SET_ID;
1844
1845 IF l_effective_from = CZ_UTILS.EPOCH_END_ AND
1846 l_effective_until = CZ_UTILS.EPOCH_BEGIN_ THEN
1847 l_effective_set_id := i.EFFECTIVITY_SET_ID;
1848 l_effective_from := i.EFFECTIVE_FROM;
1849 l_effective_until := i.EFFECTIVE_UNTIL;
1850 ELSE
1851 l_effective_set_id := NULL;
1852 l_effective_from := CZ_UTILS.EPOCH_END_;
1853 l_effective_until := CZ_UTILS.EPOCH_BEGIN_;
1854 END IF;
1855
1856 END IF;
1857 ELSE
1858 l_effective_from := i.EFFECTIVE_FROM;
1859 l_effective_until := i.EFFECTIVE_UNTIL;
1863 IF (i.rule_type IN (RULE_TYPE_DISPLAY_CONDITION,
1860 l_effective_set_id := i.EFFECTIVITY_SET_ID;
1861 END IF;
1862
1864 RULE_TYPE_ENABLED_CONDITION,
1865 RULE_TYPE_CAPTION) AND (p_ui_def_id IS NOT NULL AND p_ui_def_id<>0) AND p_ui_page_id IS NOT NULL) THEN
1866 BEGIN
1867 SELECT devl_project_id INTO l_devl_project_id FROM CZ_UI_DEFS
1868 WHERE ui_def_id=p_ui_def_id AND deleted_flag='0';
1869 EXCEPTION
1870 WHEN NO_DATA_FOUND THEN
1871 RAISE PAGEBASE_NOT_FOUND_EXCP;
1872 END;
1873 BEGIN
1874
1875 --
1876 -- here we are getting persistent_node_id of base page
1877 --
1878 SELECT persistent_node_id,pagebase_expl_node_id
1879 INTO l_persistent_node_id, l_model_ref_expl_id
1880 FROM cz_ui_pages
1881 WHERE page_id=p_ui_page_id
1882 AND ui_def_id=p_ui_def_id;
1883
1884 --
1885 -- here there is a block for converting persistent_node_id of base page
1886 -- to its ps_node_id based on l_model_ref_expl_id of base page
1887 -- ( using l_model_ref_expl_id of base page we can find devl_project_id
1888 -- of model which has a ps node of base page
1889 --
1890 BEGIN
1891 --
1892 -- first - try to get ps_node_id from the current mode,
1893 -- because in most cases ps node is under the current model
1894 --
1895 SELECT ps_node_id INTO l_component_id FROM CZ_PS_NODES
1896 WHERE devl_project_id=l_devl_project_id AND
1897 persistent_node_id=l_persistent_node_id AND
1898 deleted_flag='0';
1899 EXCEPTION
1900 --
1901 -- if ps node is not under the current model
1902 -- then try to find it by using l_model_ref_expl_id if page base
1903 --
1904 WHEN NO_DATA_FOUND THEN -- node is under some referenced model
1905 -- find ps_node_id of nearest reference above
1906 FOR p IN (SELECT referring_node_id
1907 FROM cz_model_ref_expls
1908 START WITH model_ref_expl_id=l_model_ref_expl_id
1909 CONNECT by PRIOR parent_expl_node_id=model_ref_expl_id AND
1910 deleted_flag='0' AND PRIOR deleted_flag='0' AND
1911 PRIOR referring_node_id IS NULL)
1912 LOOP
1913 l_reference_ps_node_id := p.referring_node_id;
1914 END LOOP;
1915
1916 -- we need to use l_model_ref_expl_id in this case
1917 SELECT ps_node_id INTO l_component_id FROM CZ_PS_NODES
1918 WHERE devl_project_id=
1919 (
1920 SELECT devl_project_id FROM CZ_PS_NODES
1921 WHERE ps_node_id=l_reference_ps_node_id
1922 ) AND
1923 persistent_node_id=l_persistent_node_id AND
1924 deleted_flag='0';
1925 END;
1926
1927 EXCEPTION
1928 WHEN NO_DATA_FOUND THEN
1929 RAISE PAGEBASE_NOT_FOUND_EXCP;
1930 END;
1931 ELSE
1932 l_component_id := i.component_id;
1933 l_model_ref_expl_id := i.model_ref_expl_id;
1934 l_devl_project_id := i.devl_project_id;
1935 END IF;
1936
1937 l_class_seq := i.class_seq;
1938 IF i.rule_class IS NOT NULL AND i.rule_class IN (RULE_CLASS_DEFAULT, RULE_CLASS_SEARCH_DECISION) THEN
1939 SELECT max(nvl(class_seq,0))+1 INTO l_class_seq
1940 FROM cz_rules
1941 WHERE deleted_flag = '0' AND devl_project_id = l_devl_project_id
1942 AND rule_class = i.rule_class;
1943 END IF;
1944
1945 INSERT INTO CZ_RULES(
1946 RULE_ID,
1947 SUB_CONS_ID,
1948 REASON_ID,
1949 AMOUNT_ID,
1950 GRID_ID,
1951 RULE_FOLDER_ID,
1952 DEVL_PROJECT_ID,
1953 INVALID_FLAG,
1954 DESC_TEXT,
1955 NAME,
1956 ANTECEDENT_ID,
1957 CONSEQUENT_ID,
1958 RULE_TYPE,
1959 EXPR_RULE_TYPE,
1960 COMPONENT_ID,
1961 REASON_TYPE,
1962 DISABLED_FLAG,
1963 ORIG_SYS_REF,
1964 DELETED_FLAG,
1965 SECURITY_MASK,
1966 CHECKOUT_USER,
1967 EFFECTIVITY_SET_ID,
1968 EFFECTIVE_FROM,
1969 EFFECTIVE_UNTIL,
1970 EFFECTIVE_USAGE_MASK,
1971 SEQ_NBR,
1972 RULE_FOLDER_TYPE,
1973 UNSATISFIED_MSG_ID,
1974 UNSATISFIED_MSG_SOURCE,
1975 SIGNATURE_ID,
1976 TEMPLATE_PRIMITIVE_FLAG,
1977 PRESENTATION_FLAG,
1978 TEMPLATE_TOKEN,
1979 RULE_TEXT,
1980 NOTES,
1981 CLASS_NAME,
1982 INSTANTIATION_SCOPE,
1983 MODEL_REF_EXPL_ID,
1987 UI_PAGE_ID,
1984 MUTABLE_FLAG,
1985 SEEDED_FLAG,
1986 UI_DEF_ID,
1988 UI_PAGE_ELEMENT_ID,
1989 RULE_CLASS,
1990 CLASS_SEQ,
1991 CONFIG_ENGINE_TYPE,
1992 ACCUMULATOR_FLAG)
1993 VALUES(
1994 l_new_rule_id,
1995 i.SUB_CONS_ID,
1996 l_new_reason_id,
1997 i.AMOUNT_ID,
1998 i.GRID_ID,
1999 l_new_rfl_id,
2000 l_devl_project_id,
2001 i.INVALID_FLAG,
2002 i.DESC_TEXT,
2003 i.NAME||'-'||TO_CHAR(l_new_rule_id),
2004 i.ANTECEDENT_ID,
2005 i.CONSEQUENT_ID,
2006 i.RULE_TYPE,
2007 i.EXPR_RULE_TYPE,
2008 l_component_id,
2009 i.REASON_TYPE,
2010 i.DISABLED_FLAG,
2011 NULL,
2012 i.DELETED_FLAG,
2013 i.SECURITY_MASK,
2014 i.CHECKOUT_USER,
2015 l_effective_set_id,
2016 l_effective_from,
2017 l_effective_until,
2018 i.EFFECTIVE_USAGE_MASK,
2019 l_new_seq_nbr,
2020 i.RULE_FOLDER_TYPE,
2021 l_new_unsatisfied_msg_id,
2022 i.UNSATISFIED_MSG_SOURCE,
2023 i.SIGNATURE_ID,
2024 i.TEMPLATE_PRIMITIVE_FLAG,
2025 i.PRESENTATION_FLAG,
2026 i.TEMPLATE_TOKEN,
2027 i.RULE_TEXT,
2028 i.NOTES,
2029 i.CLASS_NAME,
2030 i.INSTANTIATION_SCOPE,
2031 l_model_ref_expl_id,
2032 i.MUTABLE_FLAG,
2033 '0',
2034 DECODE(p_ui_def_id,NULL,i.ui_def_id,p_ui_def_id),
2035 DECODE(p_ui_page_id,NULL,i.ui_page_id,p_ui_page_id),
2036 DECODE(p_ui_page_element_id,NULL,i.ui_page_element_id,p_ui_page_element_id),
2037 i.RULE_CLASS,
2038 l_class_seq,
2039 i.CONFIG_ENGINE_TYPE,
2040 i.ACCUMULATOR_FLAG
2041 );
2042
2043 SELECT NVL(MAX(tree_seq),0)+1
2044 INTO l_new_tree_seq
2045 FROM CZ_RULE_FOLDERS
2046 WHERE parent_rule_folder_id=l_new_rfl_id
2047 AND deleted_flag='0';
2048
2049 INSERT INTO CZ_RULE_FOLDERS
2050 (RULE_FOLDER_ID,
2051 FOLDER_TYPE,
2052 NAME,
2053 DESC_TEXT,
2054 PARENT_RULE_FOLDER_ID,
2055 TREE_SEQ,
2056 DEVL_PROJECT_ID,
2057 PERSISTENT_RULE_FOLDER_ID,
2058 EFFECTIVE_USAGE_MASK,
2059 EFFECTIVE_FROM,
2060 EFFECTIVE_UNTIL,
2061 EFFECTIVITY_SET_ID,
2062 DELETED_FLAG,
2063 SECURITY_MASK,
2064 CHECKOUT_USER,
2065 OBJECT_TYPE,
2066 DISABLED_FLAG,
2067 ORIG_SYS_REF)
2068 SELECT
2069 l_new_rule_id,
2070 FOLDER_TYPE,
2071 NAME||'-'||TO_CHAR(l_new_rule_id),
2072 DESC_TEXT,
2073 l_new_rfl_id,
2074 l_new_tree_seq,
2075 DEVL_PROJECT_ID,
2076 l_new_rule_id,
2077 EFFECTIVE_USAGE_MASK,
2078 EFFECTIVE_FROM,
2079 EFFECTIVE_UNTIL,
2080 EFFECTIVITY_SET_ID,
2081 DELETED_FLAG,
2082 SECURITY_MASK,
2083 CHECKOUT_USER,
2084 OBJECT_TYPE,
2085 DISABLED_FLAG,
2086 ORIG_SYS_REF
2087 FROM CZ_RULE_FOLDERS
2088 WHERE rule_folder_id=p_rule_id AND parent_rule_folder_id = l_rule_folder_id AND deleted_flag='0';
2089
2090 END LOOP;
2091
2092 INSERT INTO CZ_DES_CHART_CELLS
2093 (RULE_ID,
2094 PRIMARY_OPT_ID,
2095 SECONDARY_OPT_ID,
2096 MARK_CHAR,
2097 SECONDARY_FEAT_EXPL_ID,
2098 SECONDARY_FEATURE_ID,
2099 DELETED_FLAG,
2100 SECURITY_MASK ,
2101 CHECKOUT_USER )
2102 SELECT
2103 l_new_rule_id,
2104 PRIMARY_OPT_ID,
2105 SECONDARY_OPT_ID,
2106 MARK_CHAR,
2107 SECONDARY_FEAT_EXPL_ID,
2108 SECONDARY_FEATURE_ID,
2109 DELETED_FLAG,
2110 SECURITY_MASK,
2111 CHECKOUT_USER
2112 FROM CZ_DES_CHART_CELLS
2113 WHERE rule_id=p_rule_id AND deleted_flag='0';
2114
2115 INSERT INTO CZ_DES_CHART_FEATURES
2116 (RULE_ID,
2117 FEATURE_ID,
2118 FEATURE_TYPE ,
2119 MODEL_REF_EXPL_ID,
2120 DELETED_FLAG,
2121 SECURITY_MASK,
2122 CHECKOUT_USER )
2123 SELECT
2124 l_new_rule_id,
2125 FEATURE_ID,
2126 FEATURE_TYPE ,
2127 MODEL_REF_EXPL_ID,
2128 DELETED_FLAG,
2129 SECURITY_MASK,
2130 CHECKOUT_USER
2134 /* need to investigate this, sselahi */
2131 FROM CZ_DES_CHART_FEATURES
2132 WHERE rule_id=p_rule_id AND deleted_flag='0';
2133
2135 if l_rule_type = RULE_TYPE_POPULATOR then
2136 l_new_filter_set_id := allocateId('CZ_FILTER_SETS_S');
2137
2138 INSERT INTO CZ_FILTER_SETS
2139 (
2140 FILTER_SET_ID
2141 ,DEVL_PROJECT_ID
2142 ,RULE_ID
2143 ,EXPRESS_ID
2144 ,SOURCE_TYPE
2145 ,DELETED_FLAG
2146 ,EFF_FROM
2147 ,EFF_TO
2148 ,SECURITY_MASK
2149 ,EFF_MASK
2150 ,CHECKOUT_USER
2151 ,SOURCE_SYNTAX
2152 ,SOURCE_VIEW_OWNER
2153 ,SOURCE_VIEW_NAME
2154 )
2155 SELECT
2156 l_new_filter_set_id
2157 ,DEVL_PROJECT_ID
2158 ,l_new_rule_id
2159 ,EXPRESS_ID
2160 ,SOURCE_TYPE
2161 ,DELETED_FLAG
2162 ,EFF_FROM
2163 ,EFF_TO
2164 ,SECURITY_MASK
2165 ,EFF_MASK
2166 ,CHECKOUT_USER
2167 ,SOURCE_SYNTAX
2168 ,SOURCE_VIEW_OWNER
2169 ,SOURCE_VIEW_NAME
2170 FROM CZ_FILTER_SETS
2171 WHERE rule_id = p_rule_id AND deleted_flag='0';
2172
2173 l_new_populator_id := allocateId('CZ_POPULATORS_S');
2174
2175 INSERT INTO CZ_POPULATORS
2176 (
2177 POPULATOR_ID
2178 ,OWNED_BY_NODE_ID
2179 ,FILTER_SET_ID
2180 ,RESULT_TYPE
2181 ,DELETED_FLAG
2182 ,EFF_FROM
2183 ,EFF_TO
2184 ,SECURITY_MASK
2185 ,EFF_MASK
2186 ,CHECKOUT_USER
2187 ,PERSISTENT_POPULATOR_ID
2188 ,DESCRIPTION
2189 ,NAME
2190 ,HAS_LEVEL
2191 ,HAS_DESCRIPTION
2192 ,HAS_PROPERTY
2193 ,HAS_ITEM_TYPE
2194 ,HAS_ITEM
2195 ,VIEW_NAME
2196 ,FEATURE_TYPE
2197 ,QUERY_SYNTAX
2198 ,XFR_GROUP
2199 ,SEEDED_FLAG
2200 )
2201 SELECT
2202 l_new_populator_id
2203 ,OWNED_BY_NODE_ID
2204 ,l_new_filter_set_id
2205 ,RESULT_TYPE
2206 ,DELETED_FLAG
2207 ,EFF_FROM
2208 ,EFF_TO
2209 ,SECURITY_MASK
2210 ,EFF_MASK
2211 ,CHECKOUT_USER
2212 ,l_new_populator_id
2213 ,DESCRIPTION
2214 ,NAME
2215 ,HAS_LEVEL
2216 ,HAS_DESCRIPTION
2217 ,HAS_PROPERTY
2218 ,HAS_ITEM_TYPE
2219 ,HAS_ITEM
2220 ,VIEW_NAME
2221 ,FEATURE_TYPE
2222 ,QUERY_SYNTAX
2223 ,XFR_GROUP
2224 ,SEEDED_FLAG
2225 FROM CZ_POPULATORS
2226 WHERE filter_set_id=l_filter_set_id AND deleted_flag='0';
2227 end if;
2228
2229 l_new_exprnode_tbl.delete;
2230 l_parent_exprnode_tbl.delete;
2231 l_new_parent_exprnode_tbl.delete;
2232
2233 FOR i IN (
2234 SELECT expr_node_id, expr_parent_id
2235 FROM CZ_EXPRESSION_NODES
2236 WHERE rule_id=p_rule_id AND deleted_flag='0') LOOP
2237 l_new_exprnode_tbl(i.expr_node_id) := allocateId('CZ_EXPRESSION_NODES_S');
2238 l_parent_exprnode_tbl(i.expr_node_id) := i.expr_parent_id;
2239 END LOOP;
2240
2241 l_key := l_new_exprnode_tbl.FIRST;
2242 LOOP
2243 IF l_key IS NULL THEN
2244 EXIT;
2245 END IF;
2246 IF (l_parent_exprnode_tbl(l_key) IS NOT NULL) THEN
2247 l_new_parent := l_new_exprnode_tbl(l_parent_exprnode_tbl(l_key));
2248 ELSE
2249 l_new_parent := NULL;
2250 END IF;
2251
2252 INSERT INTO CZ_EXPRESSION_NODES
2253 (
2254 EXPR_NODE_ID
2255 ,EXPRESS_ID
2256 ,SEQ_NBR
2257 ,ITEM_TYPE_ID
2258 ,PS_NODE_ID
2259 ,ITEM_ID
2260 ,FILTER_SET_ID
2261 ,GRID_COL_ID
2262 ,EXPR_PARENT_ID
2263 ,PROPERTY_ID
2264 ,COMPILE_ADVICE
2265 ,COL
2266 ,DATA_VALUE
2267 ,FIELD_NAME
2268 ,EXPR_TYPE
2269 ,EXPR_SUBTYPE
2270 ,TOKEN_LIST_SEQ
2271 ,DELETED_FLAG
2272 ,EFF_FROM
2273 ,EFF_TO
2274 ,SECURITY_MASK
2275 ,EFF_MASK
2276 ,CHECKOUT_USER
2277 ,CONSEQUENT_FLAG
2278 ,MODEL_REF_EXPL_ID
2279 ,RULE_ID
2280 ,TEMPLATE_ID
2281 ,ARGUMENT_SIGNATURE_ID
2282 ,ARGUMENT_INDEX
2283 ,PARAM_SIGNATURE_ID
2284 ,PARAM_INDEX
2285 ,DATA_TYPE
2286 ,COLLECTION_FLAG
2287 ,DISPLAY_NODE_DEPTH
2288 ,ARGUMENT_NAME
2289 ,SOURCE_OFFSET
2290 ,SOURCE_LENGTH
2291 ,MUTABLE_FLAG
2292 ,RELATIVE_NODE_PATH
2293 ,EVENT_EXECUTION_SCOPE
2294 ,DATA_NUM_VALUE
2295 ,SEEDED_FLAG
2296 )
2297 SELECT
2298 l_new_exprnode_tbl(l_key)
2299 ,EXPRESS_ID
2300 ,SEQ_NBR
2301 ,ITEM_TYPE_ID
2302 ,PS_NODE_ID
2303 ,ITEM_ID
2304 ,decode(l_rule_type, RULE_TYPE_POPULATOR,l_new_filter_set_id, FILTER_SET_ID)
2305 ,GRID_COL_ID
2306 ,l_new_parent
2307 ,PROPERTY_ID
2308 ,COMPILE_ADVICE
2309 ,COL
2310 ,DATA_VALUE
2311 ,FIELD_NAME
2312 ,EXPR_TYPE
2313 ,EXPR_SUBTYPE
2314 ,TOKEN_LIST_SEQ
2318 ,SECURITY_MASK
2315 ,DELETED_FLAG
2316 ,EFF_FROM
2317 ,EFF_TO
2319 ,EFF_MASK
2320 ,CHECKOUT_USER
2321 ,CONSEQUENT_FLAG
2322 ,MODEL_REF_EXPL_ID
2323 ,l_new_rule_id
2324 ,TEMPLATE_ID
2325 ,ARGUMENT_SIGNATURE_ID
2326 ,ARGUMENT_INDEX
2327 ,PARAM_SIGNATURE_ID
2328 ,PARAM_INDEX
2329 ,DATA_TYPE
2330 ,COLLECTION_FLAG
2331 ,DISPLAY_NODE_DEPTH
2332 ,ARGUMENT_NAME
2333 ,SOURCE_OFFSET
2334 ,SOURCE_LENGTH
2335 ,MUTABLE_FLAG
2336 ,RELATIVE_NODE_PATH
2337 ,EVENT_EXECUTION_SCOPE
2338 ,DATA_NUM_VALUE
2339 ,SEEDED_FLAG
2340 FROM CZ_EXPRESSION_NODES
2341 WHERE expr_node_id=l_key;
2342 l_key := l_new_exprnode_tbl.NEXT(l_key);
2343 END LOOP;
2344
2345 EXCEPTION
2346 WHEN NO_TXT_FOUND_EXCP THEN
2347 handle_Error(p_message_name => 'CZ_COPY_RULE_NO_TXT',
2348 p_token_name1 => 'TEXTID',
2349 p_token_value1 => TO_CHAR(l_text_id),
2350 x_return_status => x_return_status,
2351 x_msg_count => x_msg_count,
2352 x_msg_data => x_msg_data);
2353 x_run_id := GetRunID;
2354 LOG_REPORT(x_run_id,x_msg_data);
2355 WHEN SEEDED_FLAG_EXCP THEN
2356 handle_Error(p_message_name => 'CZ_COPY_RULE_SEEDED_DATA',
2357 x_return_status => x_return_status,
2358 x_msg_count => x_msg_count,
2359 x_msg_data => x_msg_data);
2360 x_run_id := GetRunID;
2361 LOG_REPORT(x_run_id,x_msg_data);
2362 WHEN INVALID_FOLDER_ID_EXCP THEN
2363 handle_Error(p_message_name => 'CZ_COPY_RULE_INV_FOLDERID',
2364 x_return_status => x_return_status,
2365 x_msg_count => x_msg_count,
2366 x_msg_data => x_msg_data);
2367 x_run_id := GetRunID;
2368 LOG_REPORT(x_run_id,x_msg_data);
2369 WHEN PAGEBASE_NOT_FOUND_EXCP THEN
2370 handle_Error(p_message_name => 'CZ_COPY_RULE_PAGEBASE',
2371 p_token_name1 => 'UIPAGEID',
2372 p_token_value1 => TO_CHAR(p_ui_page_id),
2373 p_token_name2 => 'UIDEFID',
2374 p_token_value2 => TO_CHAR(p_ui_def_id),
2375 x_return_status => x_return_status,
2376 x_msg_count => x_msg_count,
2377 x_msg_data => x_msg_data);
2378 x_run_id := GetRunID;
2379 LOG_REPORT(x_run_id,x_msg_data);
2380 WHEN OTHERS THEN
2381 handle_Error(p_procedure_name => 'copy_Rule',
2382 p_error_message => SQLERRM,
2383 x_return_status => x_return_status,
2384 x_msg_count => x_msg_count,
2385 x_msg_data => x_msg_data);
2386
2387 x_run_id := GetRunID;
2388 LOG_REPORT(x_run_id,x_msg_data);
2389
2390 END copy_Rule;
2391
2392 PROCEDURE copy_Rule
2393 (p_rule_id IN NUMBER,
2394 p_rule_folder_id IN NUMBER DEFAULT NULL,
2395 x_out_new_rule_id OUT NOCOPY INTEGER,
2396 x_run_id OUT NOCOPY NUMBER,
2397 x_return_status OUT NOCOPY VARCHAR2,
2398 x_msg_count OUT NOCOPY NUMBER,
2399 x_msg_data OUT NOCOPY VARCHAR2) IS
2400 BEGIN
2401
2402 copy_Rule(p_rule_id => p_rule_id,
2403 p_rule_folder_id => p_rule_folder_id,
2404 p_init_msg_list => FND_API.G_TRUE,
2405 x_out_new_rule_id => x_out_new_rule_id,
2406 x_run_id => x_run_id,
2407 x_return_status => x_return_status,
2408 x_msg_count => x_msg_count,
2409 x_msg_data => x_msg_data);
2410 END copy_rule;
2411
2412
2413 PROCEDURE copy_Rule
2414 (p_rule_id IN NUMBER,
2415 p_rule_folder_id IN NUMBER DEFAULT NULL,
2416 p_init_msg_list IN VARCHAR2,
2417 x_out_new_rule_id OUT NOCOPY INTEGER,
2418 x_run_id OUT NOCOPY NUMBER,
2419 x_return_status OUT NOCOPY VARCHAR2,
2420 x_msg_count OUT NOCOPY NUMBER,
2421 x_msg_data OUT NOCOPY VARCHAR2) IS
2422
2423 BEGIN
2424 copy_Rule(p_rule_id => p_rule_id,
2425 p_rule_folder_id => p_rule_folder_id,
2426 p_init_msg_list => p_init_msg_list,
2427 p_ui_def_id => NULL,
2428 p_ui_page_id => NULL,
2429 p_ui_page_element_id => NULL,
2430 x_out_new_rule_id => x_out_new_rule_id,
2431 x_run_id => x_run_id,
2432 x_return_status => x_return_status,
2433 x_msg_count => x_msg_count,
2434 x_msg_data => x_msg_data);
2435
2436 END copy_rule;
2437
2438 --
2439 -- copy Rule Folder
2440 -- Parameters :
2441 -- p_rule_folder_id - identifies rule folder to copy
2442 -- p_new_parent_folder_id - identifies new parent rule folder
2443 -- p_init_msg_list - indicates if initializing message stack
2447 -- x_return_status - status string
2444 -- x_out_new_rule_id - OUR parameter - id of new copied rule folder
2445 -- x_run_id - OUT parameter : if =0 => no errors
2446 -- - else =CZ_DB_LOGS.run_id
2448 -- x_msg_count - number of error messages
2449 -- x_msg_data - string which contains error messages
2450 --
2451 PROCEDURE copy_Rule_Folder
2452 (p_rule_folder_id IN NUMBER,
2453 p_new_parent_folder_id IN NUMBER,
2454 p_init_msg_list IN VARCHAR2,
2455 x_out_rule_folder_id OUT NOCOPY INTEGER,
2456 x_run_id OUT NOCOPY NUMBER,
2457 x_return_status OUT NOCOPY VARCHAR2,
2458 x_msg_count OUT NOCOPY NUMBER,
2459 x_msg_data OUT NOCOPY VARCHAR2) IS
2460
2461 l_rule_id NUMBER;
2462 l_rule_folder_id NUMBER;
2463 l_locked_entities_tbl cz_security_pvt.number_type_tbl;
2464 l_has_priveleges VARCHAR2(255);
2465 l_msg_data VARCHAR2(32000);
2466 l_lock_status VARCHAR2(255);
2467 l_return_status VARCHAR2(255);
2468 l_msg_count NUMBER;
2469
2470 BEGIN
2471 IF p_init_msg_list = FND_API.G_TRUE THEN
2472 FND_MSG_PUB.initialize;
2473 END IF;
2474
2475 x_run_id := 0;
2476 x_return_status := FND_API.G_RET_STS_SUCCESS;
2477
2478 --
2479 -- check global flag that equals '1' if model is already locked
2480 -- by calling sequirity package
2481 --
2482 IF gDB_SETTING_USE_SECURITY THEN
2483
2484 cz_security_pvt.has_privileges (p_model_id => p_new_parent_folder_id,
2485 p_function_name => cz_security_pvt.LOCK_RULEFOLDER_FUNC,
2486 x_return_status => l_return_status,
2487 x_msg_data => l_msg_data,
2488 x_msg_count => l_msg_count);
2489
2490 IF (l_return_status IN(cz_security_pvt.UNEXPECTED_ERROR,cz_security_pvt.HAS_NO_PRIVILEGE)) THEN
2491 x_run_id := GetRunID;
2492 LOG_REPORT(x_run_id,l_msg_count);
2493 RETURN;
2494 END IF;
2495
2496 l_locked_entities_tbl.DELETE;
2497
2498 cz_security_pvt.lock_entity(p_rule_folder_id,
2499 cz_security_pvt.LOCK_RULEFOLDER_FUNC,
2500 l_locked_entities_tbl,
2501 l_lock_status,
2502 l_msg_count,
2503 l_msg_data);
2504
2505 IF l_lock_status <> 'S' THEN
2506 x_run_id := GetRunID;
2507 LOG_REPORT(x_run_id,l_msg_count);
2508 RETURN;
2509 END IF;
2510
2511 END IF;
2512
2513 BEGIN
2514 SELECT CZ_RULE_FOLDERS_S.NEXTVAL INTO x_out_rule_folder_id FROM dual;
2515 INSERT INTO CZ_RULE_FOLDERS
2516 (RULE_FOLDER_ID,
2517 FOLDER_TYPE,
2518 NAME,
2519 DESC_TEXT,
2520 PARENT_RULE_FOLDER_ID,
2521 TREE_SEQ,
2522 DEVL_PROJECT_ID,
2523 PERSISTENT_RULE_FOLDER_ID,
2524 EFFECTIVE_USAGE_MASK,
2525 EFFECTIVE_FROM,
2526 EFFECTIVE_UNTIL,
2527 EFFECTIVITY_SET_ID,
2528 DELETED_FLAG,
2529 SECURITY_MASK,
2530 CHECKOUT_USER,
2531 OBJECT_TYPE,
2532 DISABLED_FLAG,
2533 ORIG_SYS_REF)
2534 SELECT
2535 x_out_rule_folder_id,
2536 FOLDER_TYPE,
2537 NAME||'-'||TO_CHAR(x_out_rule_folder_id),
2538 DESC_TEXT,
2539 p_new_parent_folder_id,
2540 TREE_SEQ,
2541 DEVL_PROJECT_ID,
2542 x_out_rule_folder_id,
2543 EFFECTIVE_USAGE_MASK,
2544 EFFECTIVE_FROM,
2545 EFFECTIVE_UNTIL,
2546 EFFECTIVITY_SET_ID,
2547 DELETED_FLAG,
2548 SECURITY_MASK,
2549 CHECKOUT_USER,
2550 OBJECT_TYPE,
2551 DISABLED_FLAG,
2552 ORIG_SYS_REF
2553 FROM CZ_RULE_FOLDERS
2554 WHERE rule_folder_id=p_rule_folder_id AND object_type IN ('RFL', 'RSQ') AND deleted_flag='0';
2555
2556 FOR i IN (SELECT rule_folder_id, object_type FROM CZ_RULE_FOLDERS
2557 WHERE parent_rule_folder_id=p_rule_folder_id AND deleted_flag='0')
2558 LOOP
2559 IF i.object_type IN ('RFL', 'RSQ') THEN
2560 copy_rule_folder(p_rule_folder_id => i.rule_folder_id
2561 ,p_new_parent_folder_id => x_out_rule_folder_id
2562 ,p_init_msg_list => FND_API.G_FALSE
2563 ,x_out_rule_folder_id => l_rule_folder_id
2564 ,x_run_id => x_run_id
2565 ,x_return_status => x_return_status
2566 ,x_msg_count => x_msg_count
2567 ,x_msg_data => x_msg_data);
2568 ELSE
2569 copy_Rule(p_rule_id => i.rule_folder_id,
2570 p_rule_folder_id => x_out_rule_folder_id,
2571 p_init_msg_list => FND_API.G_FALSE,
2575 x_msg_count => x_msg_count,
2572 x_out_new_rule_id => l_rule_id,
2573 x_run_id => x_run_id,
2574 x_return_status => x_return_status,
2576 x_msg_data => x_msg_data);
2577 END IF;
2578
2579 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2580 RETURN;
2581 END IF;
2582 END LOOP;
2583
2584 EXCEPTION
2585 WHEN OTHERS THEN
2586 handle_Error(p_procedure_name => 'copy_Rule_Folder',
2587 p_error_message => SQLERRM,
2588 x_return_status => x_return_status,
2589 x_msg_count => x_msg_count,
2590 x_msg_data => x_msg_data);
2591
2592 x_run_id := GetRunID;
2593 LOG_REPORT(x_run_id,x_msg_data);
2594 END;
2595
2596 IF l_locked_entities_tbl.COUNT>0 AND gDB_SETTING_USE_SECURITY THEN
2597 cz_security_pvt.unlock_entity(p_rule_folder_id,
2598 cz_security_pvt.LOCK_RULEFOLDER_FUNC,
2599 l_locked_entities_tbl,
2600 x_return_status,
2601 x_msg_count,
2602 x_msg_data);
2603 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2604 x_run_id := GetRunID;
2605 LOG_REPORT(x_run_id,x_msg_count);
2606 RETURN;
2607 END IF;
2608 END IF;
2609
2610 END copy_Rule_Folder;
2611
2612 --
2613 -- copy Rule Folder
2614 -- Parameters :
2615 -- p_rule_folder_id - identifies rule folder to copy
2616 -- p_new_parent_folder_id - identifies new parent rule folder
2617 -- x_out_new_rule_id - OUR parameter - id of new copied rule folder
2618 -- x_run_id - OUT parameter : if =0 => no errors
2619 -- - else =CZ_DB_LOGS.run_id
2620 -- x_return_status - status string
2621 -- x_msg_count - number of error messages
2622 -- x_msg_data - string which contains error messages
2623 --
2624 PROCEDURE copy_Rule_Folder
2625 (p_rule_folder_id IN NUMBER,
2626 p_new_parent_folder_id IN NUMBER,
2627 x_out_rule_folder_id OUT NOCOPY INTEGER,
2628 x_run_id OUT NOCOPY NUMBER,
2629 x_return_status OUT NOCOPY VARCHAR2,
2630 x_msg_count OUT NOCOPY NUMBER,
2631 x_msg_data OUT NOCOPY VARCHAR2) IS
2632
2633 BEGIN
2634 copy_rule_folder(p_rule_folder_id => p_rule_folder_id
2635 ,p_new_parent_folder_id => p_new_parent_folder_id
2636 ,p_init_msg_list => FND_API.G_TRUE
2637 ,x_out_rule_folder_id => x_out_rule_folder_id
2638 ,x_run_id => x_run_id
2639 ,x_return_status => x_return_status
2640 ,x_msg_count => x_msg_count
2641 ,x_msg_data => x_msg_data
2642 );
2643 END copy_Rule_Folder;
2644
2645 -- Function set_name_entity.
2646 -- Returns the name, enclosed in single quotes, if the name contains
2647 -- any of the special characters.
2648 -- If the name contains a single quote, the quote is escaped.
2649 --
2650 FUNCTION set_name_entity(p_name IN VARCHAR2) RETURN VARCHAR2 IS
2651
2652 v_name VARCHAR2(32000) := p_name;
2653 v_quotepos PLS_INTEGER := INSTR(p_name, '''');
2654 BEGIN
2655
2656 IF(v_quotepos > 0)THEN
2657
2658 --The name contains a single quote, need to escape.
2659
2660 v_name := REPLACE(v_name, '''', '\''');
2661 END IF;
2662
2663 --Now check for other special characters (including '\').
2664
2665 IF(LENGTH(TRANSLATE(v_name, 'X /\-*.+|&=<>^,;:@$#!', 'X')) < LENGTH(v_name))THEN
2666
2667 v_name := '''' || v_name || '''';
2668 RETURN v_name;
2669 END IF;
2670
2671 --Bug #4665333. If the node name is a lexical number, need the quotes.
2672 --The '.' is not in the name, so we can use it as a not-null third argument as required by TRANSLATE.
2673 --By parser request we need to make it more strict - enclose in quotes if the first character is numeric.
2674
2675 IF(TRANSLATE(SUBSTR(v_name, 1, 1), '.0123456789', '.') IS NULL)THEN
2676
2677 v_name := '''' || v_name || '''';
2678 RETURN v_name;
2679 END IF;
2680
2681 RETURN v_name;
2682 END set_name_entity;
2683
2684 --
2685 -- get absolute model path ( <=> path from root node )
2686 -- Parameters :
2687 -- p_ps_node_id - identifies model tree node
2688 -- px_model_path - OUT parameter - absolute model path
2689 --
2690 PROCEDURE get_Absolute_Model_Path
2691 (
2692 p_ps_node_id IN NUMBER,
2693 px_model_path OUT NOCOPY VARCHAR2
2694 ) IS
2695
2696 BEGIN
2697
2698 px_model_path := get_Absolute_Model_Path(p_ps_node_id);
2699 END get_Absolute_Model_Path;
2700
2701 --
2702 -- get absolute model path ( <=> path from root node )
2703 -- Parameters :
2704 -- p_ps_node_id - identifies model tree node
2705 --
2706 FUNCTION get_Absolute_Model_Path
2707 (
2708 p_ps_node_id IN NUMBER
2709 ) RETURN VARCHAR2 IS
2710
2711 l_model_path VARCHAR2(32000);
2712 l_name VARCHAR2(32000);
2713 BEGIN
2714
2718 PRIOR deleted_flag='0' AND deleted_flag='0')
2715 FOR i IN(SELECT NAME FROM CZ_PS_NODES
2716 START WITH ps_node_id=p_ps_node_id AND deleted_flag='0'
2717 CONNECT BY PRIOR parent_id=ps_node_id AND
2719 LOOP
2720
2721 --If the node name contains special characters (bug #3817913), enclose the name into single quotes.
2722
2723 l_name := set_name_entity(i.NAME);
2724
2725 IF l_model_path IS NULL THEN
2726 l_model_path := l_name;
2727 ELSE
2728 l_model_path := l_name || '.' || l_model_path;
2729 END IF;
2730 END LOOP;
2731 RETURN l_model_path;
2732 END get_Absolute_Model_Path;
2733
2734 --
2735 -- get full model path ( <=> path from root node )
2736 -- Parameters :
2737 -- p_ps_node_id - identifies model tree node
2738 -- p_model_ref_expl_id - identifies model_ref_expl_id of model tree node
2739 -- p_model_id - identifies current model
2740 -- px_model_path - OUT parameter - full model path
2741 --
2742 PROCEDURE get_Full_Model_Path
2743 (
2744 p_ps_node_id IN NUMBER,
2745 p_model_ref_expl_id IN NUMBER,
2746 p_model_id IN NUMBER,
2747 px_model_path OUT NOCOPY VARCHAR2
2748 ) IS
2749 BEGIN
2750
2751 px_model_path := get_Full_Model_Path(p_ps_node_id => p_ps_node_id,
2752 p_model_ref_expl_id => p_model_ref_expl_id,
2753 p_model_id => p_model_id);
2754 END get_Full_Model_Path;
2755
2756 --
2757 -- get full model path ( <=> path from root node )
2758 -- Parameters :
2759 -- p_ps_node_id - identifies model tree node
2760 -- p_model_ref_expl_id - identifies model_ref_expl_id of model tree node
2761 -- p_model_id - identifies current model
2762 -- RETURN : full model path
2763 --
2764 FUNCTION get_Full_Model_Path
2765 (
2766 p_ps_node_id IN NUMBER,
2767 p_model_ref_expl_id IN NUMBER,
2768 p_model_id IN NUMBER) RETURN VARCHAR2 IS
2769
2770 l_model_path VARCHAR2(32000);
2771 l_ref_model_path VARCHAR2(32000);
2772 l_ps_node_id NUMBER;
2773
2774 BEGIN
2775
2776 BEGIN
2777 SELECT ps_node_id INTO l_ps_node_id
2778 FROM CZ_PS_NODES
2779 WHERE ps_node_id=p_ps_node_id AND devl_project_id=p_model_id;
2780 EXCEPTION
2781 WHEN NO_DATA_FOUND THEN
2782 NULL;
2783 END;
2784
2785 l_model_path := get_Absolute_Model_Path(p_ps_node_id => p_ps_node_id);
2786
2787 --
2788 -- if ps_node_id is in the model with model_id=p_model_id
2789 -- then Full path = Absolute path
2790 --
2791 IF l_ps_node_id IS NOT NULL THEN
2792 RETURN l_model_path;
2793 END IF;
2794
2795 FOR i IN(SELECT * FROM CZ_MODEL_REF_EXPLS
2796 START WITH model_ref_expl_id=p_model_ref_expl_id
2797 CONNECT BY PRIOR parent_expl_node_id=model_ref_expl_id
2798 AND deleted_flag='0' AND PRIOR deleted_flag='0')
2799 LOOP
2800
2801 IF i.referring_node_id IS NOT NULL THEN
2802
2803 IF(i.referring_node_id = p_ps_node_id)THEN
2804
2805 --The ps node is a reference itself. In this case l_ref_model_path calculated below will
2806 --duplicate the l_model_path calculated above, but we need it only once.
2807
2808 l_model_path := NULL;
2809 ELSE
2810
2811 --if it's not a connector we need to cut off the model name. If it is in single quotes, we need to account for that
2812 --and search for "'." on the other side of the model's name. Otherwise we just search for "."
2813
2814 IF i.ps_node_type<>CONNECTOR_TYPE THEN
2815 IF(SUBSTR(l_model_path, 1, 1) = '''')THEN
2816 l_model_path := SUBSTR(l_model_path, INSTR(l_model_path,'''.') + 2);
2817 ELSE
2818 l_model_path := SUBSTR(l_model_path, INSTR(l_model_path,'.') + 1);
2819 END IF;
2820 END IF;
2821 END IF;
2822
2823 l_ref_model_path := get_Absolute_Model_Path(p_ps_node_id => i.referring_node_id);
2824 IF(l_model_path IS NULL)THEN
2825
2826 l_model_path := l_ref_model_path;
2827 ELSE
2828
2829 l_model_path := l_ref_model_path || '.' || l_model_path;
2830 END IF;
2831 END IF;
2832 END LOOP;
2833
2834 RETURN l_model_path;
2835 END get_Full_Model_Path;
2836
2837 --
2838 -- get relative model path ( <=> path from root node )
2839 -- Parameters :
2840 -- p_ps_node_id - identifies model tree node
2841 -- px_model_path - OUT parameter - absolute model path
2842 --
2843 PROCEDURE get_Relative_Model_Path
2844 (
2845 p_ps_node_id IN NUMBER,
2846 px_model_path OUT NOCOPY VARCHAR2
2847 ) IS
2848
2849 l_ps_node_id CZ_PS_NODES.ps_node_id%TYPE;
2850 l_name CZ_PS_NODES.name%TYPE;
2851 l_model_path VARCHAR2(32000);
2852
2853 BEGIN
2854
2855 FOR i IN(SELECT parent_id,name FROM CZ_PS_NODES
2856 START WITH ps_node_id=p_ps_node_id AND deleted_flag='0'
2857 CONNECT BY PRIOR parent_id=ps_node_id AND
2861 l_name := set_name_entity(i.NAME);
2858 PRIOR deleted_flag='0' AND deleted_flag='0' AND NVL(virtual_flag,'1')='1')
2859 LOOP
2860
2862
2863 IF l_model_path IS NULL THEN
2864 l_model_path:=l_name;
2865 ELSE
2866 l_model_path:=l_name||'.'||l_model_path;
2867 END IF;
2868 l_ps_node_id := i.parent_id;
2869 END LOOP;
2870
2871 IF l_ps_node_id IS NOT NULL THEN
2872 SELECT name INTO l_name FROM CZ_PS_NODES
2873 WHERE ps_node_id=l_ps_node_id;
2874
2875 l_name := set_name_entity(l_name);
2876 l_model_path := l_name||'.'||l_model_path;
2877 END IF;
2878
2879 px_model_path := l_model_path;
2880 END get_Relative_Model_Path;
2881
2882 --
2883 -- get relative model path ( <=> path from root node )
2884 -- Parameters :
2885 -- p_ps_node_id - identifies model tree node
2886 --
2887 FUNCTION get_Relative_Model_Path
2888 (
2889 p_ps_node_id IN NUMBER
2890 ) RETURN VARCHAR2 IS
2891
2892 l_ps_node_id CZ_PS_NODES.ps_node_id%TYPE;
2893 l_name CZ_PS_NODES.name%TYPE;
2894 l_model_path VARCHAR2(32000);
2895
2896 BEGIN
2897
2898 FOR i IN(SELECT parent_id,name FROM CZ_PS_NODES
2899 START WITH ps_node_id=p_ps_node_id AND deleted_flag='0'
2900 CONNECT BY PRIOR parent_id=ps_node_id AND
2901 PRIOR deleted_flag='0' AND deleted_flag='0' AND NVL(virtual_flag,'1')='1')
2902 LOOP
2903
2904 l_name := set_name_entity(i.NAME);
2905
2906 IF l_model_path IS NULL THEN
2907 l_model_path:=l_name;
2908 ELSE
2909 l_model_path:=l_name||'.'||l_model_path;
2910 END IF;
2911 l_ps_node_id := i.parent_id;
2912 END LOOP;
2913
2914 IF l_ps_node_id IS NOT NULL THEN
2915 SELECT name INTO l_name FROM CZ_PS_NODES
2916 WHERE ps_node_id=l_ps_node_id;
2917
2918 l_name := set_name_entity(l_name);
2919 l_model_path := l_name||'.'||l_model_path;
2920 END IF;
2921
2922 RETURN l_model_path;
2923 END get_Relative_Model_Path;
2924 --------------------------------------------------------------------------------------
2925 FUNCTION get_absolute_label_path(p_ps_node_id IN NUMBER,
2926 p_label_bom IN VARCHAR2,
2927 p_label_nonbom IN VARCHAR2) RETURN VARCHAR2
2928 IS
2929 l_model_path VARCHAR2(32000);
2930 l_name VARCHAR2(32000);
2931 BEGIN
2932 FOR i IN (SELECT name, intl_text_id, ps_node_type FROM cz_ps_nodes
2933 START WITH ps_node_id = p_ps_node_id AND deleted_flag='0'
2934 CONNECT BY PRIOR parent_id = ps_node_id AND
2935 PRIOR deleted_flag='0' AND deleted_flag='0') LOOP
2936
2937 l_name := i.name;
2938
2939 --If the profile option value is 'Description', read the description.
2940
2941 IF((i.ps_node_type >= BOM_MODEL_TYPE AND p_label_bom = OPTION_VALUE_LABEL_DESC) OR
2942 (i.ps_node_type < BOM_MODEL_TYPE AND p_label_nonbom = OPTION_VALUE_LABEL_DESC))THEN
2943
2944 BEGIN
2945 SELECT text_str INTO l_name FROM cz_localized_texts_vl WHERE intl_text_id = i.intl_text_id;
2946 l_name := NVL(l_name, i.name);
2947 EXCEPTION
2948 WHEN NO_DATA_FOUND THEN
2949 l_name := i.name;
2950 END;
2951 END IF;
2952
2953 l_name := set_name_entity(l_name);
2954
2955 IF l_model_path IS NULL THEN
2956 l_model_path := l_name;
2957 ELSE
2958 l_model_path := l_name || '.' || l_model_path;
2959 END IF;
2960 END LOOP;
2961 RETURN l_model_path;
2962 END get_absolute_label_path;
2963 --------------------------------------------------------------------------------------
2964 PROCEDURE get_full_label_path(p_ps_node_id IN NUMBER,
2965 p_model_ref_expl_id IN NUMBER,
2966 p_model_id IN NUMBER,
2967 px_model_path OUT NOCOPY VARCHAR2)
2968 IS
2969 BEGIN
2970 px_model_path := get_full_label_path(p_ps_node_id => p_ps_node_id,
2971 p_model_ref_expl_id => p_model_ref_expl_id,
2972 p_model_id => p_model_id);
2973 END get_full_label_path;
2974 --------------------------------------------------------------------------------------
2975 FUNCTION get_node_label(p_ps_node_type IN NUMBER,
2976 p_name IN VARCHAR2,
2977 p_description IN VARCHAR2) RETURN VARCHAR2
2978 IS
2979 v_label VARCHAR2(240);
2980 BEGIN
2981
2982 IF(p_ps_node_type >= BOM_MODEL_TYPE)THEN
2983
2984 v_label := NVL(fnd_profile.value_wnps(PROFILE_OPTION_LABEL_BOM), OPTION_VALUE_LABEL_NAME);
2985 ELSE
2986
2987 v_label := NVL(fnd_profile.value_wnps(PROFILE_OPTION_LABEL_NONBOM), OPTION_VALUE_LABEL_NAME);
2988 END IF;
2989
2990 IF(v_label = OPTION_VALUE_LABEL_NAME)THEN RETURN p_name; ELSE RETURN NVL(p_description, p_name); END IF;
2991 END get_node_label;
2992 --------------------------------------------------------------------------------------
2996 v_ps_node_type NUMBER;
2993 FUNCTION get_node_label(p_ps_node_id IN NUMBER) RETURN VARCHAR2
2994 IS
2995 v_label VARCHAR2(240);
2997 v_name VARCHAR2(4000);
2998 v_description VARCHAR2(4000);
2999 v_intl_text_id NUMBER;
3000 BEGIN
3001
3002 SELECT ps_node_type, intl_text_id, name INTO v_ps_node_type, v_intl_text_id, v_name
3003 FROM cz_ps_nodes WHERE ps_node_id = p_ps_node_id;
3004
3005 v_description := v_name;
3006
3007 IF(v_intl_text_id IS NOT NULL)THEN
3008
3009 BEGIN
3010 SELECT text_str INTO v_description FROM cz_localized_texts_vl WHERE intl_text_id = v_intl_text_id;
3011 EXCEPTION
3012 WHEN NO_DATA_FOUND THEN
3013 NULL;
3014 END;
3015 END IF;
3016
3017 IF(v_ps_node_type >= BOM_MODEL_TYPE)THEN
3018
3019 v_label := NVL(fnd_profile.value_wnps(PROFILE_OPTION_LABEL_BOM), OPTION_VALUE_LABEL_NAME);
3020 ELSE
3021
3022 v_label := NVL(fnd_profile.value_wnps(PROFILE_OPTION_LABEL_NONBOM), OPTION_VALUE_LABEL_NAME);
3023 END IF;
3024
3025 IF(v_label = OPTION_VALUE_LABEL_NAME)THEN RETURN v_name; ELSE RETURN NVL(v_description, v_name); END IF;
3026 END get_node_label;
3027 --------------------------------------------------------------------------------------
3028 FUNCTION get_full_label_path(p_ps_node_id IN NUMBER,
3029 p_model_ref_expl_id IN NUMBER,
3030 p_model_id IN NUMBER) RETURN VARCHAR2
3031 IS
3032 l_model_path VARCHAR2(32000);
3033 l_ref_model_path VARCHAR2(32000);
3034 l_ps_node_id NUMBER;
3035 v_label_bom VARCHAR2(240);
3036 v_label_nonbom VARCHAR2(240);
3037 BEGIN
3038
3039 --Read and default the profile option values to 'Name'.
3040
3041 v_label_bom := NVL(fnd_profile.value_wnps(PROFILE_OPTION_LABEL_BOM), OPTION_VALUE_LABEL_NAME);
3042 v_label_nonbom := NVL(fnd_profile.value_wnps(PROFILE_OPTION_LABEL_NONBOM), OPTION_VALUE_LABEL_NAME);
3043
3044 BEGIN
3045 SELECT ps_node_id INTO l_ps_node_id
3046 FROM CZ_PS_NODES
3047 WHERE ps_node_id=p_ps_node_id AND devl_project_id=p_model_id;
3048 EXCEPTION
3049 WHEN NO_DATA_FOUND THEN
3050 NULL;
3051 END;
3052
3053 l_model_path := get_absolute_label_path(p_ps_node_id => p_ps_node_id,
3054 p_label_bom => v_label_bom,
3055 p_label_nonbom => v_label_nonbom);
3056
3057 --If ps_node_id is in the model with model_id = p_model_id then full path is equal to absolute path.
3058
3059 IF l_ps_node_id IS NOT NULL THEN RETURN l_model_path; END IF;
3060
3061 FOR i IN (SELECT * FROM cz_model_ref_expls
3062 START WITH model_ref_expl_id = p_model_ref_expl_id
3063 CONNECT BY PRIOR parent_expl_node_id = model_ref_expl_id
3064 AND deleted_flag='0' AND PRIOR deleted_flag='0') LOOP
3065
3066 IF i.referring_node_id IS NOT NULL THEN
3067 IF(i.referring_node_id = p_ps_node_id)THEN
3068
3069 --The ps node is a reference itself. In this case l_ref_model_path calculated below will
3070 --duplicate the l_model_path calculated above, but we need it only once.
3071
3072 l_model_path := NULL;
3073 ELSE
3074
3075 --If it's not a connector we need to cut off the model name. If it is in single quotes, we need to
3076 --account for that and search for "'." on the other side of the model's name. Otherwise we just
3077 --search for "."
3078
3079 IF(i.ps_node_type <> CONNECTOR_TYPE)THEN
3080 IF(SUBSTR(l_model_path, 1, 1) = '''')THEN
3081 l_model_path := SUBSTR(l_model_path, INSTR(l_model_path, '''.') + 2);
3082 ELSE
3083 l_model_path := SUBSTR(l_model_path, INSTR(l_model_path, '.') + 1);
3084 END IF;
3085 END IF;
3086 END IF;
3087
3088 l_ref_model_path := get_absolute_label_path(p_ps_node_id => i.referring_node_id,
3089 p_label_bom => v_label_bom,
3090 p_label_nonbom => v_label_nonbom);
3091 IF(l_model_path IS NULL)THEN
3092
3093 l_model_path := l_ref_model_path;
3094 ELSE
3095
3096 l_model_path := l_ref_model_path || '.' || l_model_path;
3097 END IF;
3098 END IF;
3099 END LOOP;
3100
3101 RETURN l_model_path;
3102 END get_full_label_path;
3103 --------------------------------------------------------------------------------------
3104 --
3105 -- get path in Repository
3106 -- Parameters :
3107 -- p_object_id - identifies object
3108 -- p_object_type - identifies object type
3109 --
3110 FUNCTION get_Repository_Path
3111 (
3112 p_object_id IN NUMBER,
3113 p_object_type IN VARCHAR2
3114 ) RETURN VARCHAR2 IS
3115
3116 l_name CZ_RP_ENTRIES.name%TYPE;
3117 l_root_name CZ_RP_ENTRIES.name%TYPE;
3118 l_enclosing_folder CZ_RP_ENTRIES.enclosing_folder%TYPE;
3119 l_repository_path VARCHAR2(32000);
3120
3121 BEGIN
3122
3123 SELECT name,enclosing_folder INTO l_repository_path,l_enclosing_folder FROM CZ_RP_ENTRIES
3124 WHERE object_id=p_object_id AND object_type=p_object_type AND deleted_flag='0';
3128 IF l_enclosing_folder<>0 THEN
3125
3126 l_repository_path := set_name_entity(l_repository_path);
3127
3129 FOR i IN(SELECT name FROM CZ_RP_ENTRIES
3130 START WITH object_id=l_enclosing_folder AND object_type='FLD' AND deleted_flag='0'
3131 CONNECT BY PRIOR enclosing_folder=object_id
3132 AND deleted_flag='0' AND PRIOR deleted_flag='0'
3133 AND object_type='FLD' AND PRIOR object_type='FLD' AND object_id<>0 AND PRIOR object_id<>0)
3134 LOOP
3135
3136 l_name := set_name_entity(i.NAME);
3137 l_repository_path:=l_name||'/'||l_repository_path;
3138 END LOOP;
3139 END IF;
3140
3141 IF NOT(l_enclosing_folder=0 AND p_object_id=0 AND p_object_type='FLD') THEN
3142 BEGIN
3143 SELECT name INTO l_root_name FROM CZ_RP_ENTRIES
3144 WHERE object_id=0 AND object_type='FLD' AND deleted_flag='0' AND rownum<2;
3145
3146 --If the name contains special symbols, enclose the name in single quotes.
3147
3148 l_root_name := set_name_entity(l_root_name);
3149 l_repository_path := l_root_name||'/'||l_repository_path;
3150 EXCEPTION
3151 WHEN NO_DATA_FOUND THEN
3152 NULL;
3153 END;
3154 END IF;
3155
3156 RETURN l_repository_path;
3157 END get_Repository_Path;
3158
3159 --
3160 -- get path in Rule Folders
3161 -- Parameters :
3162 -- p_rule_folder_id - identifies object
3163 -- p_object_type - identifies object type
3164 --
3165 FUNCTION get_Rule_Folder_Path
3166 (
3167 p_rule_folder_id IN NUMBER,
3168 p_object_type IN VARCHAR2
3169 ) RETURN VARCHAR2 IS
3170
3171 l_name CZ_RP_ENTRIES.name%TYPE;
3172 l_root_name CZ_RP_ENTRIES.name%TYPE;
3173 l_enclosing_folder CZ_RP_ENTRIES.enclosing_folder%TYPE;
3174 l_rule_folder_path VARCHAR2(32000);
3175
3176 BEGIN
3177
3178 SELECT name,NVL(parent_rule_folder_id,0)
3179 INTO l_rule_folder_path,l_enclosing_folder FROM CZ_RULE_FOLDERS
3180 WHERE rule_folder_id=p_rule_folder_id AND object_type=p_object_type AND deleted_flag='0';
3181
3182 l_rule_folder_path := set_name_entity(l_rule_folder_path);
3183
3184 IF l_enclosing_folder<>0 THEN
3185 FOR i IN(SELECT name FROM CZ_RULE_FOLDERS
3186 START WITH rule_folder_id=l_enclosing_folder AND object_type='RFL' AND deleted_flag='0'
3187 CONNECT BY PRIOR parent_rule_folder_id=rule_folder_id
3188 AND deleted_flag='0' AND PRIOR deleted_flag='0'
3189 AND object_type='RFL' AND PRIOR object_type='RFL')
3190 LOOP
3191
3192 l_name := set_name_entity(i.NAME);
3193 l_rule_folder_path := l_name||'/'||l_rule_folder_path;
3194 END LOOP;
3195 END IF;
3196
3197 RETURN l_rule_folder_path;
3198 END get_Rule_Folder_Path;
3199
3200 /*
3201 * copy Repository folders 6718191 Need to display locked objects
3202 * This procedure is a wrapper for calling copy_repository_folder.
3203 * It loops over all of the folders calling a procedure to check for
3204 * locked Models or Templates and logs them before continuing to do the actual
3205 * copy operation.
3206 *
3207 * p_folder_ids - identifies folders to copy
3208 * p_encl_folder_id - enclosing folder to copy to
3209 * x_folder_id - folder_id
3210 * x_return_status - status string
3211 * x_msg_count - number of error messages
3212 * x_msg_data - string which contains error messages
3213 */
3214
3215 PROCEDURE copy_repository_folders
3216 (
3217 p_folder_ids IN system.cz_number_tbl_type,
3218 p_encl_folder_id IN NUMBER,
3219 x_folder_id OUT NOCOPY NUMBER,
3220 x_run_id OUT NOCOPY NUMBER,
3221 x_return_status OUT NOCOPY VARCHAR2,
3222 x_msg_count OUT NOCOPY NUMBER,
3223 x_msg_data OUT NOCOPY VARCHAR2
3224 ) IS
3225
3226 l_folder_id NUMBER;
3227 l_return_status VARCHAR2(1);
3228 l_lock_profile VARCHAR2(3);
3229
3230 BEGIN
3231
3232 fnd_msg_pub.initialize;
3233 l_return_status := FND_API.g_ret_sts_success;
3234
3235 ----check if locking is enabled
3236 ----if the site level profile for locking is not enabled then
3237 ----there is no need to check for locked objects in the folder
3238 l_lock_profile := cz_security_pvt.get_locking_profile_value;
3239 IF (UPPER(NVL(l_lock_profile,'Y')) IN ('Y','YES')) THEN
3240 FOR i IN 1..p_folder_ids.COUNT LOOP
3241 l_folder_id := p_folder_ids(i);
3242
3243 -- Log all locked models or UIC templates for display in UI
3244 check_folder_for_locks(l_folder_id,
3245 x_return_status,
3246 x_msg_count,
3247 x_msg_data);
3248
3249 -- Need to store status as we are looping and the status will get overwritten for
3250 -- each folder.
3251 IF (l_return_status = FND_API.g_ret_sts_success AND x_return_status <> FND_API.g_ret_sts_success) THEN
3252 l_return_status := x_return_status;
3253 END IF;
3254 END LOOP;
3255 END IF;
3256
3257 -- If there are locked objects, outro, else perform copy operation
3261 p_data => x_msg_data);
3258 IF (l_return_status <> FND_API.g_ret_sts_success) THEN
3259 x_return_status := l_return_status;
3260 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
3262 RETURN;
3263 ELSE
3264 FOR i IN 1..p_folder_ids.COUNT LOOP
3265 l_folder_id := p_folder_ids(i);
3266
3267 -- Copy will also show locked models and UIC templates if locking happens
3268 -- during copy process
3269 copy_Repository_Folder(l_folder_id,
3270 p_encl_folder_id,
3271 x_folder_id,
3272 x_run_id,
3273 x_return_status,
3274 x_msg_count,
3275 x_msg_data,
3276 FND_API.G_FALSE);
3277
3278 END LOOP;
3279 END IF;
3280 END;
3281
3282 --
3283 -- copy Repository folder
3284 -- p_folder_id - identifies folder to copy
3285 -- p_encl_folder_id - enclosing folder to copy to
3286 -- x_folder_id - new copied folder
3287 -- x_run_id - OUT parameter : if = 0 => no errors
3288 -- - else = CZ_DB_LOGS.run_id
3289 -- x_return_status - status string
3290 -- x_msg_count - number of error messages
3291 -- x_msg_data - string which contains error messages
3292 -- p_init_msg_list - yes/no indicates whether to init FND message data
3293 --
3294 PROCEDURE copy_Repository_Folder
3295 (
3296 p_folder_id IN NUMBER,
3297 p_encl_folder_id IN NUMBER,
3298 x_folder_id OUT NOCOPY NUMBER,
3299 x_run_id OUT NOCOPY NUMBER,
3300 x_return_status OUT NOCOPY VARCHAR2,
3301 x_msg_count OUT NOCOPY NUMBER,
3302 x_msg_data OUT NOCOPY VARCHAR2,
3303 p_init_msg_list IN VARCHAR2 DEFAULT FND_API.G_TRUE
3304 ) IS
3305
3306 INVALID_ENCL_FLD_EXCP EXCEPTION;
3307 INVALID_FLD_EXCP EXCEPTION;
3308
3309 l_object_id_tbl t_int_array_tbl_type;
3310 l_encl_folder_tbl t_int_array_tbl_type;
3311 l_object_type_tbl t_varchar_array_tbl_type;
3312 l_new_object_id_tbl t_int_array_tbl_type;
3313 l_new_encl_folder_tbl t_int_array_tbl_type;
3314 l_folder_id NUMBER;
3315 l_model_id NUMBER;
3316 l_run_id NUMBER;
3317 l_status VARCHAR2(255);
3318 l_new_id NUMBER;
3319 l_folder_name cz_rp_entries.name%TYPE;
3320
3321 BEGIN
3322
3323 --initialize the message stack depending on the input parameter
3324 IF (p_init_msg_list = FND_API.G_TRUE ) THEN
3325 fnd_msg_pub.initialize;
3326 END IF;
3327
3328 x_run_id := 0;
3329 x_return_status := FND_API.G_RET_STS_SUCCESS;
3330
3331 BEGIN
3332 SELECT name INTO l_folder_name
3333 FROM cz_rp_entries
3334 WHERE object_id = p_encl_folder_id
3335 AND object_type = 'FLD'
3336 AND deleted_flag = '0';
3337 EXCEPTION
3338 WHEN NO_DATA_FOUND THEN
3339 RAISE INVALID_ENCL_FLD_EXCP;
3340 END;
3341
3342 BEGIN
3343 SELECT object_id,object_type , enclosing_folder
3344 BULK COLLECT INTO l_object_id_tbl,l_object_type_tbl, l_encl_folder_tbl
3345 FROM CZ_RP_ENTRIES
3346 START WITH object_id=p_folder_id AND object_type='FLD' AND deleted_flag='0'
3347 CONNECT BY PRIOR object_id=ENCLOSING_FOLDER AND PRIOR object_type = 'FLD' AND deleted_flag='0'
3348 AND PRIOR deleted_flag='0';
3349
3350 EXCEPTION
3351 WHEN NO_DATA_FOUND THEN
3352 RAISE INVALID_FLD_EXCP;
3353 END;
3354
3355 IF l_object_id_tbl.COUNT=0 THEN
3356 RETURN;
3357 END IF;
3358
3359 FOR i IN l_object_id_tbl.FIRST..l_object_id_tbl.LAST
3360 LOOP
3361
3362 -- update enclosing folder
3363 IF i=1 THEN
3364 l_new_encl_folder_tbl(i) := p_encl_folder_id;
3365 ELSE
3366
3367 FOR j in l_object_id_tbl.FIRST..i LOOP
3368 IF (l_encl_folder_tbl(i) = l_object_id_tbl(j) AND l_object_type_tbl(j) = 'FLD') THEN
3369 l_new_encl_folder_tbl(i) := l_new_object_id_tbl(j);
3370 EXIT;
3371 END IF;
3372
3373 END LOOP;
3374 END IF;
3375
3376 IF l_object_type_tbl(i)='FLD' THEN
3377 l_new_object_id_tbl(i) := allocateId('CZ_RP_ENTRIES_S');
3378
3379 -- Create the new folder
3380
3381 INSERT INTO CZ_RP_ENTRIES
3382 (
3383 OBJECT_TYPE
3384 ,OBJECT_ID
3385 ,ENCLOSING_FOLDER
3386 ,NAME
3387 ,DESCRIPTION
3388 ,NOTES
3389 ,SEEDED_FLAG
3390 ,DELETED_FLAG
3391 )
3392 SELECT
3393 OBJECT_TYPE
3394 ,l_new_object_id_tbl(i)
3395 ,l_new_encl_folder_tbl(i)
3396 ,NAME||' - '||TO_CHAR(l_new_object_id_tbl(i))
3397 ,DESCRIPTION
3398 ,NOTES
3399 ,0
3400 ,DELETED_FLAG
3401 FROM CZ_RP_ENTRIES
3402 WHERE object_id=l_object_id_tbl(i) AND object_type=l_object_type_tbl(i)
3403 AND deleted_flag='0';
3404
3408 p_effectivity_set_id => l_object_id_tbl(i),
3405 ELSIF l_object_type_tbl(i)='EFF' THEN
3406
3407 copy_effectivity_set(
3409 p_encl_folder_id => l_new_encl_folder_tbl(i),
3410 x_new_effectivity_set_id => l_new_object_id_tbl(i),
3411 x_return_status => x_return_status,
3412 x_msg_count => x_msg_count,
3413 x_msg_data => x_msg_data);
3414
3415 ELSIF l_object_type_tbl(i)='PRP' THEN
3416
3417 copy_property(
3418 p_property_id => l_object_id_tbl(i),
3419 p_encl_folder_id => l_new_encl_folder_tbl(i),
3420 x_new_property_id => l_new_object_id_tbl(i),
3421 x_return_status => x_return_status,
3422 x_msg_count => x_msg_count,
3423 x_msg_data => x_msg_data);
3424
3425 ELSIF l_object_type_tbl(i)='USG' THEN
3426
3427 copy_model_usage(
3428 p_model_usage_id => l_object_id_tbl(i),
3429 p_encl_folder_id => l_new_encl_folder_tbl(i),
3430 x_new_model_usage_id => l_new_object_id_tbl(i),
3431 x_return_status => x_return_status,
3432 x_msg_count => x_msg_count,
3433 x_msg_data => x_msg_data);
3434
3435 ELSIF l_object_type_tbl(i)='ARC' THEN
3436
3437 copy_archive(
3438 p_archive_id => l_object_id_tbl(i),
3439 p_encl_folder_id => l_new_encl_folder_tbl(i),
3440 x_new_archive_id => l_new_object_id_tbl(i),
3441 x_return_status => x_return_status,
3442 x_msg_count => x_msg_count,
3443 x_msg_data => x_msg_data);
3444
3445 ELSIF l_object_type_tbl(i)='UCT' THEN
3446
3447 copy_ui_template(
3448 p_template_id => l_object_id_tbl(i),
3449 p_encl_folder_id => l_new_encl_folder_tbl(i),
3450 x_new_template_id => l_new_object_id_tbl(i),
3451 x_return_status => x_return_status,
3452 x_msg_count => x_msg_count,
3453 x_msg_data => x_msg_data);
3454
3455 ELSIF l_object_type_tbl(i)='UMT' THEN
3456
3457 copy_ui_master_template(
3458 p_ui_def_id => l_object_id_tbl(i),
3459 p_encl_folder_id => l_new_encl_folder_tbl(i),
3460 x_new_ui_def_id => l_new_object_id_tbl(i),
3461 x_return_status => x_return_status,
3462 x_msg_count => x_msg_count,
3463 x_msg_data => x_msg_data);
3464
3465 ELSIF l_object_type_tbl(i)='PRJ' THEN
3466 -- 6718191 Need to display locked objects
3467 cz_pb_mgr.deep_model_copy(
3468 p_model_id => l_object_id_tbl(i),
3469 p_server_id => 0,
3470 p_folder => l_new_encl_folder_tbl(i),
3471 p_copy_rules => 1,
3472 p_copy_uis => 1,
3473 p_copy_root => 1,
3474 x_return_status => x_return_status,
3475 x_msg_count => x_msg_count,
3476 x_msg_data => x_msg_data,
3477 p_init_msg_list => p_init_msg_list);
3478
3479 END IF;
3480
3481 END LOOP;
3482
3483 x_folder_id := l_new_object_id_tbl(1);
3484
3485 EXCEPTION
3486 WHEN INVALID_ENCL_FLD_EXCP THEN
3487 handle_Error(p_message_name => 'CZ_COPY_RPFLD_ENCLFLD_ID',
3488 p_token_name1 => 'OBJID',
3489 p_token_value1 => TO_CHAR(p_encl_folder_id),
3490 x_return_status => x_return_status,
3491 x_msg_count => x_msg_count,
3492 x_msg_data => x_msg_data);
3493 x_run_id := GetRunID;
3494 LOG_REPORT(x_run_id,x_msg_data);
3495 WHEN INVALID_FLD_EXCP THEN
3496 handle_Error(p_message_name => 'CZ_COPY_RPFLD_FLD_ID',
3497 p_token_name1 => 'OBJID',
3498 p_token_value1 => TO_CHAR(p_folder_id),
3499 x_return_status => x_return_status,
3500 x_msg_count => x_msg_count,
3501 x_msg_data => x_msg_data);
3502 x_run_id := GetRunID;
3503 LOG_REPORT(x_run_id,x_msg_data);
3504 WHEN OTHERS THEN
3505 ROLLBACK;
3506 handle_Error(p_procedure_name => 'copy_Repository_Folder',
3507 p_error_message => SQLERRM,
3508 x_return_status => x_return_status,
3509 x_msg_count => x_msg_count,
3510 x_msg_data => x_msg_data);
3511 x_run_id := GetRunID;
3512 LOG_REPORT(x_run_id,x_msg_data);
3513 END copy_Repository_Folder;
3514
3515 --
3516 -- delete_model_node
3517 -- Parameters :
3518 -- p_ps_node_id -
3519 -- x_return_status - status string
3520 -- x_msg_count - number of error messages
3521 -- x_msg_data - string which contains error messages
3522 --
3523
3524 PROCEDURE delete_model_node
3525 (p_ps_node_id IN NUMBER,
3526 x_return_status OUT NOCOPY VARCHAR2,
3527 x_msg_count OUT NOCOPY NUMBER,
3528 x_msg_data OUT NOCOPY VARCHAR2)
3529 IS
3530
3534
3531 l_procedure_name CONSTANT VARCHAR2(30) := 'delete_model_node';
3532
3533 TYPE l_tName IS TABLE OF cz_devl_projects.name%TYPE INDEX BY BINARY_INTEGER;
3535 MODEL_LOCKED_EXCP EXCEPTION;
3536 INVALID_PS_NODE_ID_EXCP EXCEPTION;
3537 NO_PRIV_EXCP EXCEPTION;
3538 NOT_EDITABLE_EXCP EXCEPTION;
3539 BOM_NODE_DELETION_EXCP EXCEPTION;
3540 USER_IS_NULL_EXCP EXCEPTION;
3541 MODEL_UNLOCKED_EXCP EXCEPTION;
3542 REF_EXPLS_DEL_EXCP EXCEPTION;
3543
3544 l_model_id_tbl t_num_array_tbl_type;
3545 l_model_name_tbl t_varchar_array_tbl_type;
3546 l_node_name_tbl t_varchar_array_tbl_type;
3547
3548 l_devl_project_id cz_ps_nodes.devl_project_id%TYPE;
3549 l_name_tbl l_tName;
3550 l_priv VARCHAR2(1) := 'F';
3551
3552 l_node_type cz_ps_nodes.ps_node_type%TYPE;
3553 l_feature_type cz_ps_nodes.feature_type%TYPE;
3554 l_vf cz_ps_nodes.virtual_flag%TYPE;
3555 l_parent_id cz_ps_nodes.parent_id%TYPE;
3556 l_tree_seq cz_ps_nodes.tree_seq%TYPE;
3557 l_node_name cz_ps_nodes.name%TYPE;
3558
3559 p_out_err INTEGER;
3560 p_del_logically INTEGER:=1;
3561
3562 l_user_name VARCHAR2(40);
3563
3564
3565 -- child nodes
3566 CURSOR l_children_csr (inPsNodeId NUMBER) IS
3567 SELECT ps_node_id, ps_node_type, virtual_flag
3568 FROM cz_ps_nodes
3569 WHERE parent_id = inPsNodeId
3570 AND deleted_flag = '0';
3571
3572 ---------------------------------------------------------
3573 -- this procedure is called to process child nodes
3574 -- it calls itself to complete processing the child nodes
3575 -- as it finds more children in deeper levels
3576 ---------------------------------------------------------
3577
3578 PROCEDURE process_children(p_ps_node_id IN NUMBER) IS
3579
3580 l_ps_node_tbl t_int_array_tbl_type;
3581 l_node_type_tbl t_int_array_tbl_type;
3582 l_virtual_flag_tbl t_varchar_array_tbl_type;
3583 l_feature_type_tbl t_int_array_tbl_type;
3584
3585 p_out_err INTEGER;
3586 p_del_logically INTEGER:=1;
3587
3588 CURSOR l_children_csr IS
3589 SELECT ps_node_id, ps_node_type, virtual_flag, feature_type
3590 FROM cz_ps_nodes
3591 WHERE parent_id = p_ps_node_id
3592 AND deleted_flag = '0';
3593
3594 BEGIN
3595
3596 ------------------------------
3597 -- get the children if any
3598 -- and process them one by one
3599 ------------------------------
3600
3601 OPEN l_children_csr;
3602 FETCH l_children_csr
3603 BULK COLLECT
3604 INTO l_ps_node_tbl, l_node_type_tbl, l_virtual_flag_tbl, l_feature_type_tbl;
3605
3606 IF (l_ps_node_tbl.COUNT > 0) THEN
3607 FOR i IN l_ps_node_tbl.FIRST..l_ps_node_tbl.LAST LOOP
3608
3609 ------------------------------------
3610 -- if it may have children, it calls
3611 -- itself to process any children
3612 ------------------------------------
3613
3614 IF (l_node_type_tbl(i) = COMPONENT_TYPE) OR
3615 (l_node_type_tbl(i) = FEATURE_TYPE AND l_feature_type_tbl(i) = OPTION_FEATURE_TYPE) THEN
3616 process_children(l_ps_node_tbl(i));
3617 END IF;
3618
3619 --------------------------
3620 -- finally delete this child node
3621 --------------------------
3622
3623 UPDATE cz_ps_nodes
3624 SET deleted_flag = '1'
3625 WHERE ps_node_id = l_ps_node_tbl(i)
3626 AND ps_node_type NOT IN (436,437,438);
3627
3628 END LOOP;
3629 END IF;
3630
3631 CLOSE l_children_csr;
3632
3633 EXCEPTION
3634 WHEN OTHERS THEN
3635 CLOSE l_children_csr;
3636 RAISE;
3637 END process_children;
3638
3639 BEGIN
3640
3641 FND_MSG_PUB.initialize;
3642 x_return_status := FND_API.G_RET_STS_SUCCESS;
3643
3644 --------------------------------------------------
3645 -- Get the node info and return error if BOM node
3646 --------------------------------------------------
3647
3648 BEGIN
3649 SELECT virtual_flag, ps_node_type, feature_type,
3650 parent_id, tree_seq, devl_project_id, name
3651 INTO l_vf, l_node_type, l_feature_type,
3652 l_parent_id, l_tree_seq, l_devl_project_id, l_node_name
3653 FROM cz_ps_nodes
3654 WHERE ps_node_id = p_ps_node_id
3655 AND deleted_flag = '0';
3656
3657 IF l_node_type IN (436,437,438) THEN
3658 RAISE BOM_NODE_DELETION_EXCP;
3659 END IF;
3660
3661 EXCEPTION
3662 WHEN NO_DATA_FOUND THEN
3663 RAISE INVALID_PS_NODE_ID_EXCP;
3664 END;
3665
3666 /* l_user_name := FND_GLOBAL.user_name;
3667 IF (l_user_name IS NULL) THEN
3668 RAISE USER_IS_NULL_EXCP;
3669 END IF;
3670
3671 l_priv := cz_security_pvt.has_privileges (1.0,
3672 l_user_name ,cz_security_pvt.LOCK_MODEL_FUNC,cz_security_pvt.MODEL,l_devl_project_id);
3676 */
3673 IF (l_priv <> cz_security_pvt.HAS_PRIVILEGE) THEN
3674 RAISE NO_PRIV_EXCP;
3675 END IF;
3677
3678 /*
3679 ----attempt to get a lock
3680 cz_security_pvt.lock_model (l_devl_project_id,x_return_status,x_msg_count,x_msg_data);
3681 IF (x_return_status <> 'T') THEN
3682 RAISE MODEL_LOCKED_EXCP;
3683 END IF;
3684 */
3685 ----------------------------------------------------------
3686 -- if it has refs, call to delete the refs in expls table
3687 ----------------------------------------------------------
3688
3689 IF (l_node_type IN (COMPONENT_TYPE, REFERENCE_TYPE, CONNECTOR_TYPE)) THEN
3690 CZ_REFS.delete_node(p_ps_node_id,l_node_type,p_out_err,p_del_logically);
3691 IF (p_out_err <> 0) THEN
3692 RAISE REF_EXPLS_DEL_EXCP;
3693 END IF;
3694 END IF;
3695
3696 -----------------------------------------------------------------
3697 -- if it may have children, then recursively process the children
3698 -----------------------------------------------------------------
3699
3700 IF (l_node_type = COMPONENT_TYPE) OR
3701 (l_node_type = FEATURE_TYPE AND l_feature_type = OPTION_FEATURE_TYPE) THEN
3702 process_children(p_ps_node_id);
3703 END IF;
3704
3705 ------------------------------------------
3706 -- finally delete the node if not BOM node
3707 ------------------------------------------
3708
3709 UPDATE cz_ps_nodes
3710 SET deleted_flag = '1'
3711 WHERE ps_node_id = p_ps_node_id
3712 AND ps_node_type NOT IN (436,437,438);
3713
3714 --------------------
3715 -- Update tree_seq
3716 --------------------
3717
3718 UPDATE cz_ps_nodes
3719 SET tree_seq = tree_seq - 1
3720 WHERE parent_id = l_parent_id
3721 AND devl_project_id = l_devl_project_id
3722 AND tree_seq > l_tree_seq
3723 AND deleted_flag = '0';
3724 /*
3725 -------------------
3726 -- Unlock the model
3727 -------------------
3728
3729 cz_security_pvt.unlock_model (l_devl_project_id,x_return_status,x_msg_count,x_msg_data);
3730 IF (x_return_status <> 'T') THEN
3731 RAISE MODEL_UNLOCKED_EXCP;
3732 END IF;
3733 */
3734 x_return_status := FND_API.G_RET_STS_SUCCESS;
3735
3736 EXCEPTION
3737 WHEN REF_EXPLS_DEL_EXCP THEN
3738 handle_Error(p_message_name => 'CZ_DEL_NODE_DEL_EXLS',
3739 p_token_name1 => 'RUNID',
3740 p_token_value1 => TO_CHAR(p_out_err),
3741 x_return_status => x_return_status,
3742 x_msg_count => x_msg_count,
3743 x_msg_data => x_msg_data);
3744 WHEN BOM_NODE_DELETION_EXCP THEN
3745 handle_Error(p_message_name => 'CZ_DEL_NODE_BOMNODE',
3746 p_token_name1 => 'NODENAME',
3747 p_token_value1 => l_node_name,
3748 x_return_status => x_return_status,
3749 x_msg_count => x_msg_count,
3750 x_msg_data => x_msg_data);
3751 WHEN USER_IS_NULL_EXCP THEN
3752 handle_Error(p_message_name => 'CZ_DEL_NODE_NULL_USER',
3753 x_return_status => x_return_status,
3754 x_msg_count => x_msg_count,
3755 x_msg_data => x_msg_data);
3756 WHEN MODEL_LOCKED_EXCP THEN
3757 handle_Error(p_message_name => 'CZ_DEL_NODE_LOCKED_MODEL',
3758 x_return_status => x_return_status,
3759 x_msg_count => x_msg_count,
3760 x_msg_data => x_msg_data);
3761 WHEN NO_PRIV_EXCP THEN
3762 handle_Error(p_message_name => 'CZ_DEL_NODE_NO_PRIV',
3763 x_return_status => x_return_status,
3764 x_msg_count => x_msg_count,
3765 x_msg_data => x_msg_data);
3766 WHEN INVALID_PS_NODE_ID_EXCP THEN
3767 handle_Error(p_message_name => 'CZ_DEL_NODE_INV_NODE_ID',
3768 p_token_name1 => 'PSNODEID',
3769 p_token_value1 => TO_CHAR(p_ps_node_id),
3770 x_return_status => x_return_status,
3771 x_msg_count => x_msg_count,
3772 x_msg_data => x_msg_data);
3773 WHEN OTHERS THEN
3774 handle_Error(p_procedure_name => 'delete_model_node',
3775 p_error_message => SQLERRM,
3776 x_return_status => x_return_status,
3777 x_msg_count => x_msg_count,
3778 x_msg_data => x_msg_data);
3779 END delete_model_node;
3780
3781 --
3782 -- delete_ui_def
3783 -- Parameters :
3784 -- p_ui_def_id -
3785 -- x_return_status - status string
3786 -- x_msg_count - number of error messages
3787 -- x_msg_data - string which contains error messages
3788 --
3789
3790 PROCEDURE delete_ui_def
3791 (p_ui_def_id IN NUMBER,
3792 x_return_status OUT NOCOPY VARCHAR2,
3793 x_msg_count OUT NOCOPY NUMBER,
3794 x_msg_data OUT NOCOPY VARCHAR2)
3795 IS
3796
3797 TYPE l_tName IS TABLE OF cz_ui_defs.name%TYPE INDEX BY BINARY_INTEGER;
3798
3802 UIDEF_REFERENCED_EXCP EXCEPTION;
3799 l_procedure_name CONSTANT VARCHAR2(30) := 'delete_ui_def';
3800
3801 UIDEF_LOCKED_EXCP EXCEPTION;
3803 INVALID_UIDEF_ID_EXCP EXCEPTION;
3804 SEEDED_FLAG_EXCP EXCEPTION;
3805 NO_PRIV_EXCP EXCEPTION;
3806 NOT_EDITABLE_EXCP EXCEPTION;
3807 MODEL_LOCKED_EXCP EXCEPTION;
3808 USER_IS_NULL_EXCP EXCEPTION;
3809 DEL_UI_IS_PUBLISHED EXCEPTION;
3810
3811 l_user_name VARCHAR2(40);
3812 l_checkout_user cz_devl_projects.checkout_user%TYPE;
3813 l_priv VARCHAR2(1) := 'F';
3814 l_ui_def_tbl t_num_array_tbl_type;
3815 l_name_tbl l_tName;
3816
3817 l_model_name_tbl t_varchar_array_tbl_type;
3818 l_devl_project_id cz_ps_nodes.devl_project_id%TYPE;
3819 l_ui_style cz_ui_defs.ui_style%TYPE;
3820 l_seeded_flag cz_ui_defs.seeded_flag%TYPE;
3821 l_uidef_name cz_ui_defs.name%TYPE;
3822
3823 p_out_err INTEGER;
3824 p_del_logically INTEGER:=1;
3825
3826 l_ui_is_published BOOLEAN;
3827
3828 ---------------------------------
3829 -- referencing UI Defs JRAD Style
3830 ---------------------------------
3831 CURSOR l_ref_ui_def_jrad_csr (inUIDefID integer) IS
3832 SELECT DISTINCT r.ui_def_id, d.name
3833 FROM cz_ui_refs r, cz_ui_defs d
3834 WHERE r.ref_ui_def_id = inUIDefID
3835 AND r.ui_def_id = d.ui_def_id
3836 AND d.deleted_flag = '0'
3837 AND r.deleted_flag = '0'
3838 AND d.devl_project_id IN (SELECT object_id
3839 FROM cz_rp_entries
3840 WHERE cz_rp_entries.object_type = 'PRJ'
3841 AND cz_rp_entries.deleted_flag = '0');
3842
3843 ---------------------------------
3844 -- referencing UI Defs HTML Style
3845 ---------------------------------
3846 CURSOR l_ref_ui_def_0_csr (inUIDefID integer) IS
3847 SELECT DISTINCT d.ui_def_id, d.name
3848 FROM cz_ui_nodes n, cz_ui_defs d
3849 WHERE n.ui_def_ref_id = inUIDefID
3850 AND n.ui_def_id = d.ui_def_id
3851 AND d.deleted_flag = '0'
3852 AND n.deleted_flag = '0';
3853
3854 BEGIN
3855
3856 FND_MSG_PUB.initialize;
3857 x_return_status := FND_API.G_RET_STS_SUCCESS;
3858
3859 --------------------------
3860 -- get the devl project id
3861 --------------------------
3862
3863 BEGIN
3864 SELECT devl_project_id, seeded_flag, ui_style, name
3865 INTO l_devl_project_id, l_seeded_flag, l_ui_style, l_uidef_name
3866 FROM cz_ui_defs
3867 WHERE ui_def_id = p_ui_def_id;
3868 EXCEPTION
3869 WHEN NO_DATA_FOUND THEN
3870 RAISE INVALID_UIDEF_ID_EXCP;
3871 END;
3872
3873 --------------------
3874 -- check seeded flag
3875 --------------------
3876
3877 IF l_seeded_flag = '1' THEN
3878 RAISE SEEDED_FLAG_EXCP;
3879 END IF;
3880
3881 -------------
3882 -- check priv
3883 -------------
3884 /* changes related to bug #3613346
3885 l_user_name := FND_GLOBAL.user_name;
3886 IF (l_user_name IS NULL) THEN
3887 RAISE USER_IS_NULL_EXCP;
3888 END IF;
3889 */
3890
3891 /*
3892 l_priv := cz_security_pvt.has_privileges (1.0,
3893 l_user_name ,cz_security_pvt.LOCK_MODEL_FUNC,cz_security_pvt.MODEL,l_devl_project_id);
3894 IF (l_priv <> cz_security_pvt.HAS_PRIVILEGE) THEN
3895 RAISE NO_PRIV_EXCP;
3896 END IF;
3897
3898 ---------------------------------
3899 -- attempt to get a lock
3900 ---------------------------------
3901
3902 IF (cz_security_pvt.lock_ui_def(p_ui_def_id) <> 'T') THEN
3903 RAISE UIDEF_LOCKED_EXCP;
3904 END IF;
3905 */
3906
3907 l_ui_def_tbl.DELETE;
3908 l_model_name_tbl.DELETE;
3909
3910 --------------------------------------
3911 -- check for references to this UI Def
3912 --------------------------------------
3913
3914 --
3915 -- need to check the style to
3916 -- know what table to look
3917 --
3918
3919 IF (l_ui_style = 0) THEN
3920
3921 OPEN l_ref_ui_def_0_csr(p_ui_def_id);
3922
3923 FETCH l_ref_ui_def_0_csr BULK COLLECT INTO l_ui_def_tbl, l_name_tbl;
3924
3925 CLOSE l_ref_ui_def_0_csr;
3926
3927 IF (l_ui_def_tbl.COUNT > 0) THEN
3928 x_msg_count := 0;
3929 FOR i IN l_ui_def_tbl.first..l_ui_def_tbl.last LOOP
3930 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEL_UIDEF_IS_REFED');
3931 FND_MESSAGE.SET_TOKEN('UIDEFNAME', l_uidef_name);
3932 FND_MESSAGE.SET_TOKEN('REFUIDEFNAME', l_name_tbl(i));
3933 FND_MSG_PUB.ADD;
3934 END LOOP;
3935 RAISE UIDEF_REFERENCED_EXCP;
3936 END IF;
3937 ELSIF (l_ui_style = CZ_UIOA_PVT.G_OA_STYLE_UI) THEN
3938
3939 OPEN l_ref_ui_def_jrad_csr(p_ui_def_id);
3940
3941 FETCH l_ref_ui_def_jrad_csr BULK COLLECT INTO l_ui_def_tbl, l_name_tbl;
3942
3943 CLOSE l_ref_ui_def_jrad_csr;
3944
3945 IF (l_ui_def_tbl.COUNT > 0) THEN
3946 x_msg_count := 0;
3947 FOR i IN l_ui_def_tbl.first..l_ui_def_tbl.last LOOP
3951 FND_MSG_PUB.ADD;
3948 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEL_UIDEF_IS_REFED');
3949 FND_MESSAGE.SET_TOKEN('UIDEFNAME', l_uidef_name);
3950 FND_MESSAGE.SET_TOKEN('REFUIDEFNAME', l_name_tbl(i));
3952 END LOOP;
3953 RAISE UIDEF_REFERENCED_EXCP;
3954 END IF;
3955 END IF;
3956
3957 --------------------------------------
3958 -- check - if this UI published or no
3959 --------------------------------------
3960 l_ui_is_published := FALSE;
3961 x_msg_count := 0;
3962 FOR k IN(SELECT publication_id FROM CZ_MODEL_PUBLICATIONS
3963 WHERE ui_def_id=p_ui_def_id AND deleted_flag='0')
3964 LOOP
3965 l_ui_is_published := TRUE;
3966 add_Error_Message(p_message_name => 'CZ_DEL_UI_IS_PUBLISHED',
3967 p_token_name1 => 'PUBID',
3968 p_token_value1 => TO_CHAR(k.publication_id));
3969 END LOOP;
3970
3971 IF l_ui_is_published THEN
3972 RAISE DEL_UI_IS_PUBLISHED;
3973 END IF;
3974
3975 ----------------------------
3976 -- finally delete the ui def
3977 ----------------------------
3978
3979 UPDATE cz_ui_defs
3980 SET deleted_flag = '1'
3981 WHERE ui_def_id = p_ui_def_id;
3982
3983 UPDATE CZ_RULES
3984 SET deleted_flag = '1'
3985 WHERE ui_def_id = p_ui_def_id;
3986
3987 UPDATE CZ_LOCALIZED_TEXTS
3988 SET deleted_flag = '1'
3989 WHERE ui_def_id = p_ui_def_id;
3990
3991 UPDATE CZ_UI_ACTIONS
3992 SET deleted_flag = '1'
3993 WHERE ui_def_id = p_ui_def_id;
3994
3995 UPDATE CZ_UI_PAGE_REFS
3996 SET deleted_flag = '1'
3997 WHERE ui_def_id = p_ui_def_id;
3998
3999 UPDATE CZ_UI_PAGES
4000 SET deleted_flag = '1'
4001 WHERE ui_def_id = p_ui_def_id;
4002
4003 UPDATE CZ_UI_PAGE_SETS
4004 SET deleted_flag = '1'
4005 WHERE ui_def_id = p_ui_def_id;
4006
4007 UPDATE CZ_UI_PAGE_ELEMENTS
4008 SET deleted_flag = '1'
4009 WHERE ui_def_id = p_ui_def_id;
4010
4011 FOR I in (SELECT JRAD_DOC from CZ_UI_PAGES
4012 WHERE ui_def_id = p_ui_def_id)
4013 LOOP
4014
4015 IF jdr_docbuilder.documentexists(i.JRAD_DOC)=TRUE
4016 THEN
4017 jdr_docbuilder.deleteDocument(i.JRAD_DOC);
4018 END IF;
4019
4020 END LOOP;
4021
4022 EXCEPTION
4023 WHEN USER_IS_NULL_EXCP THEN
4024 handle_Error(p_message_name => 'CZ_DEL_UIDEF_NULL_USER',
4025 x_return_status => x_return_status,
4026 x_msg_count => x_msg_count,
4027 x_msg_data => x_msg_data);
4028 WHEN UIDEF_LOCKED_EXCP THEN
4029 handle_Error(p_message_name => 'CZ_DEL_UIDEF_LOCKED',
4030 p_token_name1 => 'UIDEFNAME',
4031 p_token_value1 => l_uidef_name,
4032 p_token_name2 => 'CHECKOUT_USER',
4033 p_token_value2 => l_checkout_user,
4034 x_return_status => x_return_status,
4035 x_msg_count => x_msg_count,
4036 x_msg_data => x_msg_data);
4037 WHEN NO_PRIV_EXCP THEN
4038 handle_Error(p_message_name => 'CZ_DEL_UIDEF_NO_PRIV',
4039 p_token_name1 => 'UIDEFNAME',
4040 p_token_value1 => l_uidef_name,
4041 x_return_status => x_return_status,
4042 x_msg_count => x_msg_count,
4043 x_msg_data => x_msg_data);
4044 WHEN SEEDED_FLAG_EXCP THEN
4045 handle_Error(p_message_name => 'CZ_DEL_UIDEF_SEEDED_DATA',
4046 p_token_name1 => 'UIDEFNAME',
4047 p_token_value1 => l_uidef_name,
4048 x_return_status => x_return_status,
4049 x_msg_count => x_msg_count,
4050 x_msg_data => x_msg_data);
4051 WHEN MODEL_LOCKED_EXCP THEN
4052 handle_Error(p_message_name => 'CZ_DEL_UIDEF_MODEL_LOCKED',
4053 p_token_name1 => 'UIDEFNAME',
4054 p_token_value1 => l_uidef_name,
4055 p_token_name2 => 'CHECKOUT_USER',
4056 p_token_value2 => l_checkout_user,
4057 x_return_status => x_return_status,
4058 x_msg_count => x_msg_count,
4059 x_msg_data => x_msg_data);
4060 WHEN UIDEF_REFERENCED_EXCP THEN
4061 handle_Error(p_message_name => 'CZ_DEL_UIDEF_REFS_EXIST',
4062 p_token_name1 => 'UIDEFNAME',
4063 p_token_value1 => l_uidef_name,
4064 x_return_status => x_return_status,
4065 x_msg_count => x_msg_count,
4066 x_msg_data => x_msg_data);
4067
4068 WHEN INVALID_UIDEF_ID_EXCP THEN
4069 handle_Error(p_message_name => 'CZ_INVALID_UIDEF',
4070 p_token_name1 => 'UIDEFID',
4071 p_token_value1 => TO_CHAR(p_ui_def_id),
4072 x_return_status => x_return_status,
4073 x_msg_count => x_msg_count,
4077 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
4074 x_msg_data => x_msg_data);
4075 WHEN DEL_UI_IS_PUBLISHED THEN
4076 x_return_status := FND_API.G_RET_STS_ERROR;
4078 p_data => x_msg_data);
4079 x_msg_data := fnd_msg_pub.GET(1,fnd_api.g_false);
4080 WHEN OTHERS THEN
4081 handle_Error(p_procedure_name => 'delete_ui_def',
4082 p_error_message => SQLERRM,
4083 x_return_status => x_return_status,
4084 x_msg_count => x_msg_count,
4085 x_msg_data => x_msg_data);
4086 END delete_ui_def;
4087
4088 --
4089 -- delete_rule_folder
4090 -- Parameters :
4091 -- p_rule_folder_id -
4092 -- x_run_id - OUT parameter : if =0 => no errors
4093 -- - else =CZ_DB_LOGS.run_id
4094 -- x_return_status - status string
4095 -- x_msg_count - number of error messages
4096 -- x_msg_data - string which contains error messages
4097 --
4098
4099 PROCEDURE delete_rule_folder
4100 (p_rule_folder_id IN NUMBER,
4101 x_return_status OUT NOCOPY VARCHAR2,
4102 x_msg_count OUT NOCOPY NUMBER,
4103 x_msg_data OUT NOCOPY VARCHAR2)
4104 IS
4105
4106 l_procedure_name CONSTANT VARCHAR2(30) := 'delete_rule_folder';
4107 l_priv VARCHAR2(1) := 'F';
4108
4109 RFL_LOCKED_EXCP EXCEPTION;
4110 MODEL_LOCKED_EXCP EXCEPTION;
4111 INVALID_RFL_EXCP EXCEPTION;
4112 SEEDED_FLAG_EXCP EXCEPTION;
4113 NO_PRIV_EXCP EXCEPTION;
4114 NOT_EDITABLE_EXCP EXCEPTION;
4115 USER_IS_NULL_EXCP EXCEPTION;
4116
4117 l_user_name VARCHAR2(40);
4118 l_checkout_user cz_devl_projects.checkout_user%TYPE;
4119 l_model_name_tbl t_varchar_array_tbl_type;
4120 l_rule_folder_id_tbl t_num_array_tbl_type;
4121 l_object_type_tbl t_varchar_array_tbl_type;
4122 l_devl_project_id cz_rule_folders.devl_project_id%TYPE;
4123 l_parent_rule_folder_id cz_rule_folders.parent_rule_folder_id%TYPE;
4124 l_rfl_name cz_rule_folders.name%TYPE;
4125
4126 p_out_err INTEGER;
4127 p_del_logically INTEGER:=1;
4128
4129 BEGIN
4130
4131 FND_MSG_PUB.initialize;
4132 x_return_status := FND_API.G_RET_STS_SUCCESS;
4133
4134 --------------------------
4135 -- get the devl project id
4136 --------------------------
4137
4138 l_parent_rule_folder_id := 0;
4139
4140 BEGIN
4141 SELECT devl_project_id, nvl(parent_rule_folder_id,0), name
4142 INTO l_devl_project_id, l_parent_rule_folder_id, l_rfl_name
4143 FROM cz_rule_folders
4144 WHERE rule_folder_id = p_rule_folder_id
4145 AND object_type = 'RFL'
4146 AND deleted_flag = '0';
4147 EXCEPTION
4148 WHEN NO_DATA_FOUND THEN
4149 RAISE INVALID_RFL_EXCP;
4150 END;
4151
4152 --------------------
4153 -- check seeded flag
4154 --------------------
4155
4156 IF (l_parent_rule_folder_id = 0) THEN
4157 RAISE SEEDED_FLAG_EXCP;
4158 END IF;
4159
4160 -------------
4161 -- check priv
4162 -------------
4163 /* changes related to bug #3613346
4164 l_user_name := FND_GLOBAL.user_name;
4165 IF (l_user_name IS NULL) THEN
4166 RAISE USER_IS_NULL_EXCP;
4167 END IF;
4168 */
4169 /*
4170 l_priv := cz_security_pvt.has_privileges (1.0,
4171 l_user_name ,cz_security_pvt.LOCK_MODEL_FUNC,cz_security_pvt.MODEL,l_devl_project_id);
4172 IF (l_priv <> cz_security_pvt.HAS_PRIVILEGE) THEN
4173 RAISE NO_PRIV_EXCP;
4174 END IF;
4175
4176 ----------------------------------
4177 -- attempt to get a lock
4178 ----------------------------------
4179
4180 IF (cz_security_pvt.lock_rulefolder(p_rule_folder_id) <> 'T') THEN
4181 RAISE RFL_LOCKED_EXCP;
4182 END IF;
4183 */
4184 ------------------------------------------------------------------------------------
4185 -- logically delete all from cz_rule_folders, the trigger takes care of other tables
4186 ------------------------------------------------------------------------------------
4187
4188 l_rule_folder_id_tbl.delete;
4189 SELECT rule_folder_id, object_type
4190 BULK
4191 COLLECT
4192 INTO l_rule_folder_id_tbl, l_object_type_tbl
4193 FROM cz_rule_folders
4194 START WITH rule_folder_id = p_rule_folder_id and object_type='RFL'
4195 CONNECT BY PRIOR rule_folder_id = parent_rule_folder_id
4196 AND PRIOR object_type in ('RFL','RSQ')
4197 AND PRIOR deleted_flag = '0'
4198 AND deleted_flag = '0';
4199
4200 IF (l_rule_folder_id_tbl.COUNT > 0) THEN
4201
4202 FOR i IN l_rule_folder_id_tbl.FIRST..l_rule_folder_id_tbl.LAST LOOP
4203 update cz_rule_folders
4204 set deleted_flag = '1'
4205 where rule_folder_id = l_rule_folder_id_tbl(i)
4206 and object_type=l_object_type_tbl(i);
4207 END LOOP;
4208
4209 END IF;
4210
4211 EXCEPTION
4215 x_msg_count => x_msg_count,
4212 WHEN USER_IS_NULL_EXCP THEN
4213 handle_Error(p_message_name => 'CZ_DEL_RFL_NULL_USER',
4214 x_return_status => x_return_status,
4216 x_msg_data => x_msg_data);
4217 WHEN SEEDED_FLAG_EXCP THEN
4218 handle_Error(p_message_name => 'CZ_DEL_RFL_SEEDED_DATA',
4219 p_token_name1 => 'RFLNAME',
4220 p_token_value1 => l_rfl_name,
4221 x_return_status => x_return_status,
4222 x_msg_count => x_msg_count,
4223 x_msg_data => x_msg_data);
4224 WHEN MODEL_LOCKED_EXCP THEN
4225 handle_Error(p_message_name => 'CZ_DEL_RFL_LOCKED_MODEL',
4226 p_token_name1 => 'RFLNAME',
4227 p_token_value1 => l_rfl_name,
4228 p_token_name2 => 'CHECKOUTUSER',
4229 p_token_value2 => l_checkout_user,
4230 x_return_status => x_return_status,
4231 x_msg_count => x_msg_count,
4232 x_msg_data => x_msg_data);
4233 WHEN RFL_LOCKED_EXCP THEN
4234 handle_Error(p_message_name => 'CZ_DEL_RFL_LOCKED_RFL',
4235 p_token_name1 => 'RFLNAME',
4236 p_token_value1 => l_rfl_name,
4237 p_token_name2 => 'CHECKOUTUSER',
4238 p_token_value2 => l_checkout_user,
4239 x_return_status => x_return_status,
4240 x_msg_count => x_msg_count,
4241 x_msg_data => x_msg_data);
4242 WHEN NO_PRIV_EXCP THEN
4243 handle_Error(p_message_name => 'CZ_DEL_RFL_NO_PRIV',
4244 p_token_name1 => 'RFLNAME',
4245 p_token_value1 => l_rfl_name,
4246 x_return_status => x_return_status,
4247 x_msg_count => x_msg_count,
4248 x_msg_data => x_msg_data);
4249 WHEN INVALID_RFL_EXCP THEN
4250 handle_Error(p_message_name => 'CZ_INVALID_RFL',
4251 p_token_name1 => 'RFLID',
4252 p_token_value1 => TO_CHAR(p_rule_folder_id),
4253 x_return_status => x_return_status,
4254 x_msg_count => x_msg_count,
4255 x_msg_data => x_msg_data);
4256 WHEN OTHERS THEN
4257 handle_Error(p_procedure_name => 'delete_rule_folder',
4258 p_error_message => SQLERRM,
4259 x_return_status => x_return_status,
4260 x_msg_count => x_msg_count,
4261 x_msg_data => x_msg_data);
4262 END delete_rule_folder;
4263
4264
4265 --
4266 -- delete_rule_sequence
4267 -- Parameters :
4268 -- p_rule_sequence_id -
4269 -- x_run_id - OUT parameter : if =0 => no errors
4270 -- - else =CZ_DB_LOGS.run_id
4271 -- x_return_status - status string
4272 -- x_msg_count - number of error messages
4273 -- x_msg_data - string which contains error messages
4274 --
4275
4276 PROCEDURE delete_rule_sequence
4277 (p_rule_sequence_id IN NUMBER,
4278 x_return_status OUT NOCOPY VARCHAR2,
4279 x_msg_count OUT NOCOPY NUMBER,
4280 x_msg_data OUT NOCOPY VARCHAR2)
4281 IS
4282
4283 l_procedure_name CONSTANT VARCHAR2(30) := 'delete_rule_sequence';
4284 l_priv VARCHAR2(1) := 'F';
4285
4286
4287 MODEL_LOCKED_EXCP EXCEPTION;
4288 RSQ_LOCKED_EXCP EXCEPTION;
4289 INVALID_RSQ_EXCP EXCEPTION;
4290 SEEDED_FLAG_EXCP EXCEPTION;
4291 NO_PRIV_EXCP EXCEPTION;
4292 NOT_EDITABLE_EXCP EXCEPTION;
4293 USER_IS_NULL_EXCP EXCEPTION;
4294
4295 l_user_name VARCHAR2(40);
4296 l_checkout_user cz_devl_projects.checkout_user%TYPE;
4297 l_ui_def_tbl t_num_array_tbl_type; -- the referencing models
4298 l_model_name_tbl t_varchar_array_tbl_type;
4299 l_devl_project_id cz_ps_nodes.devl_project_id%TYPE;
4300
4301 l_rsq_name cz_rule_folders.name%TYPE;
4302
4303 p_out_err INTEGER;
4304 p_del_logically INTEGER:=1;
4305
4306 BEGIN
4307
4308 FND_MSG_PUB.initialize;
4309 x_return_status := FND_API.G_RET_STS_SUCCESS;
4310
4311 --------------------------
4312 -- get the devl project id
4313 --------------------------
4314
4315 BEGIN
4316 SELECT devl_project_id, name
4317 INTO l_devl_project_id, l_rsq_name
4318 FROM cz_rule_folders
4319 WHERE rule_folder_id = p_rule_sequence_id
4320 AND object_type = 'RSQ';
4321 EXCEPTION
4322 WHEN NO_DATA_FOUND THEN
4323 RAISE INVALID_RSQ_EXCP;
4324 END;
4325
4326 -------------
4327 -- check priv
4328 -------------
4329 /* changes related to bug #3613346
4330 l_user_name := FND_GLOBAL.user_name;
4331 IF (l_user_name IS NULL) THEN
4332 RAISE USER_IS_NULL_EXCP;
4333 END IF;
4334 */
4335 /*
4336 l_priv := cz_security_pvt.has_privileges (1.0,
4340 END IF;
4337 l_user_name ,cz_security_pvt.LOCK_MODEL_FUNC,cz_security_pvt.MODEL,l_devl_project_id);
4338 IF (l_priv <> cz_security_pvt.HAS_PRIVILEGE) THEN
4339 RAISE NO_PRIV_EXCP;
4341
4342 ----------------------------------
4343 -- attempt to get a lock
4344 ----------------------------------
4345
4346 IF (cz_security_pvt.lock_rulefolder(p_rule_sequence_id) <> 'T') THEN
4347 RAISE RSQ_LOCKED_EXCP;
4348 END IF;
4349 */
4350 ----------------------------------
4351 -- delete the rules in this folder
4352 ----------------------------------
4353
4354 UPDATE cz_rules
4355 SET deleted_flag = '1'
4356 WHERE rule_folder_id = p_rule_sequence_id;
4357
4358 -------------------------
4359 -- delete the rule folder
4360 -------------------------
4361
4362 UPDATE cz_rule_folders
4363 SET deleted_flag = '1'
4364 WHERE rule_folder_id = p_rule_sequence_id
4365 AND object_type = 'RSQ';
4366
4367 EXCEPTION
4368 WHEN USER_IS_NULL_EXCP THEN
4369 handle_Error(p_message_name => 'CZ_DEL_RSQ_NULL_USER',
4370 x_return_status => x_return_status,
4371 x_msg_count => x_msg_count,
4372 x_msg_data => x_msg_data);
4373 WHEN SEEDED_FLAG_EXCP THEN
4374 handle_Error(p_message_name => 'CZ_DEL_RSQ_SEEDED_DATA',
4375 p_token_name1 => 'RSQNAME',
4376 p_token_value1 => l_rsq_name,
4377 x_return_status => x_return_status,
4378 x_msg_count => x_msg_count,
4379 x_msg_data => x_msg_data);
4380 WHEN MODEL_LOCKED_EXCP THEN
4381 handle_Error(p_message_name => 'CZ_DEL_RSQ_LOCKED_RSQ',
4382 p_token_name1 => 'RSQNAME',
4383 p_token_value1 => l_rsq_name,
4384 p_token_name2 => 'CHECKOUTUSER',
4385 p_token_value2 => l_checkout_user,
4386 x_return_status => x_return_status,
4387 x_msg_count => x_msg_count,
4388 x_msg_data => x_msg_data);
4389 WHEN RSQ_LOCKED_EXCP THEN
4390 handle_Error(p_message_name => 'CZ_DEL_RSQ_LOCKED_RSQ',
4391 p_token_name1 => 'RSQNAME',
4392 p_token_value1 => l_rsq_name,
4393 p_token_name2 => 'CHECKOUTUSER',
4394 p_token_value2 => l_checkout_user,
4395 x_return_status => x_return_status,
4396 x_msg_count => x_msg_count,
4397 x_msg_data => x_msg_data);
4398 WHEN NO_PRIV_EXCP THEN
4399 handle_Error(p_message_name => 'CZ_DEL_RSQ_NO_PRIV',
4400 p_token_name1 => 'RSQNAME',
4401 p_token_value1 => l_rsq_name,
4402 x_return_status => x_return_status,
4403 x_msg_count => x_msg_count,
4404 x_msg_data => x_msg_data);
4405 WHEN INVALID_RSQ_EXCP THEN
4406 handle_Error(p_message_name => 'CZ_DEL_RSQ_INVALID_RSQ_ID',
4407 p_token_name1 => 'RSQID',
4408 p_token_value1 => TO_CHAR(p_rule_sequence_id),
4409 x_return_status => x_return_status,
4410 x_msg_count => x_msg_count,
4411 x_msg_data => x_msg_data);
4412 WHEN OTHERS THEN
4413 handle_Error(p_procedure_name => 'delete_rule_sequence',
4414 p_error_message => SQLERRM,
4415 x_return_status => x_return_status,
4416 x_msg_count => x_msg_count,
4417 x_msg_data => x_msg_data);
4418 END delete_rule_sequence;
4419
4420 --
4421 -- delete_item_type
4422 -- Parameters :
4423 -- p_item_type_id -
4424 -- x_return_status - status string
4425 -- x_msg_count - number of error messages
4426 -- x_msg_data - string which contains error messages
4427 --
4428
4429 PROCEDURE delete_item_type
4430 (p_item_type_id IN NUMBER,
4431 x_return_status OUT NOCOPY VARCHAR2,
4432 x_msg_count OUT NOCOPY NUMBER,
4433 x_msg_data OUT NOCOPY VARCHAR2)
4434 IS
4435
4436 l_procedure_name CONSTANT VARCHAR2(30) := 'delete_item_type';
4437 l_priv VARCHAR2(1) := 'F';
4438
4439 SEEDED_FLAG_EXCP EXCEPTION;
4440 INVALID_ITEM_TYPE_ID_EXCP EXCEPTION;
4441 USER_IS_NULL_EXCP EXCEPTION;
4442 NO_PRIV_EXCP EXCEPTION;
4443
4444 l_user_name VARCHAR2(40);
4445 l_checkout_user cz_devl_projects.checkout_user%TYPE;
4446 l_item_id_tbl t_num_array_tbl_type;
4447
4448 CURSOR l_item_csr IS
4449 SELECT item_id
4450 FROM cz_item_masters
4451 WHERE item_type_id = p_item_type_id
4452 AND deleted_flag = '0';
4453
4454 BEGIN
4455
4456 FND_MSG_PUB.initialize;
4457 x_return_status := FND_API.G_RET_STS_SUCCESS;
4458
4459 IF (p_item_type_id = G_DEFAULT_ITEM_TYPE) THEN
4460 RAISE SEEDED_FLAG_EXCP;
4461 END IF;
4462
4463 -------------
4464 -- check priv
4468 IF (l_user_name IS NULL) THEN
4465 -------------
4466 /* changes related to bug #3613346
4467 l_user_name := FND_GLOBAL.user_name;
4469 RAISE USER_IS_NULL_EXCP;
4470 END IF;
4471 */
4472 /*
4473 l_priv := cz_security_pvt.has_privileges (1.0,
4474 l_user_name ,cz_security_pvt.LOCK_MODEL_FUNC,cz_security_pvt.MODEL,l_devl_project_id);
4475 IF (l_priv <> cz_security_pvt.HAS_PRIVILEGE) THEN
4476 RAISE NO_PRIV_EXCP;
4477 END IF;
4478 */
4479
4480 ----------------------------------
4481 -- delete any item property values
4482 ----------------------------------
4483
4484 OPEN l_item_csr;
4485 l_item_id_tbl.DELETE;
4486 FETCH l_item_csr BULK COLLECT INTO l_item_id_tbl;
4487
4488 IF (l_item_id_tbl.COUNT > 0) THEN
4489
4490 FORALL i IN l_item_id_tbl.FIRST..l_item_id_tbl.LAST
4491 UPDATE cz_item_property_values
4492 SET deleted_flag = '1'
4493 WHERE item_id = l_item_id_tbl(i);
4494
4495 END IF;
4496 CLOSE l_item_csr;
4497
4498 -------------------------------------------------------------
4499 -- change the item type of items in this item type to default
4500 -------------------------------------------------------------
4501
4502 UPDATE cz_item_masters
4503 SET item_type_id = G_DEFAULT_ITEM_TYPE
4504 WHERE item_type_id = p_item_type_id;
4505
4506 ----------------------------------
4507 -- delete the item type properties
4508 ----------------------------------
4509
4510 UPDATE cz_item_type_properties
4511 SET deleted_flag ='1'
4512 WHERE item_type_id = p_item_type_id;
4513
4514 -----------------------
4515 -- delete the item type
4516 -----------------------
4517
4518 UPDATE cz_item_types
4519 SET deleted_flag ='1'
4520 WHERE item_type_id = p_item_type_id;
4521
4522 IF SQL%NOTFOUND THEN
4523 RAISE INVALID_ITEM_TYPE_ID_EXCP;
4524 END IF;
4525
4526 EXCEPTION
4527 WHEN USER_IS_NULL_EXCP THEN
4528 handle_Error(p_message_name => 'CZ_DEL_IT_NULL_USER',
4529 x_return_status => x_return_status,
4530 x_msg_count => x_msg_count,
4531 x_msg_data => x_msg_data);
4532 WHEN SEEDED_FLAG_EXCP THEN
4533 handle_Error(p_message_name => 'CZ_DEL_IT_SEEDED_DATA',
4534 x_return_status => x_return_status,
4535 x_msg_count => x_msg_count,
4536 x_msg_data => x_msg_data);
4537 WHEN NO_PRIV_EXCP THEN
4538 handle_Error(p_message_name => 'CZ_DEL_IT_NO_PRIV',
4539 x_return_status => x_return_status,
4540 x_msg_count => x_msg_count,
4541 x_msg_data => x_msg_data);
4542 WHEN INVALID_ITEM_TYPE_ID_EXCP THEN
4543 handle_Error(p_message_name => 'CZ_DEL_IT_INVALID_ITEM_TYPE_ID',
4544 x_return_status => x_return_status,
4545 x_msg_count => x_msg_count,
4546 x_msg_data => x_msg_data);
4547 WHEN OTHERS THEN
4548 handle_Error(p_procedure_name => 'delete_item_type',
4549 p_error_message => SQLERRM,
4550 x_return_status => x_return_status,
4551 x_msg_count => x_msg_count,
4552 x_msg_data => x_msg_data);
4553 END delete_item_type;
4554
4555 --
4556 -- is_model_deleteable
4557 -- Parameters :
4558 -- p_model_id - object_id in cz_rp_entries where object_type = 'PRJ'
4559 -- x_return_status - status string: 'S', 'E', 'U'
4560 -- x_msg_count - number of error messages
4561 -- x_msg_data - string which contains error messages
4562
4563 PROCEDURE is_model_deleteable (p_model_id IN NUMBER,
4564 x_return_status OUT NOCOPY VARCHAR2,
4565 x_msg_count OUT NOCOPY NUMBER,
4566 x_msg_data OUT NOCOPY VARCHAR2)
4567 IS
4568
4569 TYPE number_type_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4570 TYPE tModelNames IS TABLE OF cz_devl_projects.name%TYPE INDEX BY BINARY_INTEGER;
4571 TYPE tModelIds IS TABLE OF cz_devl_projects.devl_project_id%TYPE INDEX BY BINARY_INTEGER;
4572
4573 SEEDED_FLAG_EXCP EXCEPTION;
4574 MODEL_LOCKED EXCEPTION;
4575 NO_PRIV EXCEPTION;
4576 REFS_EXIST EXCEPTION;
4577 INVALID_MODEL_ID EXCEPTION;
4578 UNEXPECTED_ERROR EXCEPTION;
4579 MODEL_PUBS_EXIST EXCEPTION;
4580 USER_IS_NULL_EXCP EXCEPTION;
4581 MODEL_DELETED EXCEPTION;
4582
4583 l_user_name VARCHAR2(40);
4584 l_checkout_user cz_devl_projects.checkout_user%TYPE;
4585 l_model_name cz_devl_projects.name%TYPE;
4586 l_devl_project_id cz_devl_projects.devl_project_id%TYPE;
4587
4588 l_priv VARCHAR2(1) := 'F';
4589 l_return_status VARCHAR2(1);
4590 l_msg_count NUMBER := 0;
4591 l_msg_data VARCHAR2(2000);
4592
4593 x_ref_model_ids_tbl tModelIds;
4594 l_publication_tbl tModelIds;
4595 x_ref_model_names_tbl tModelNames;
4596 l_seeded_flag VARCHAR2(1);
4600
4597 l_deleted_flag VARCHAR2(1);
4598
4599 l_procedure_name CONSTANT VARCHAR2(30) := 'is_model_deleteable';
4601 BEGIN
4602
4603 FND_MSG_PUB.initialize;
4604 l_user_name := FND_GLOBAL.user_name;
4605 x_return_status := FND_API.G_RET_STS_SUCCESS;
4606
4607 ------------------------------
4608 -- check for valid p_model_id
4609 ------------------------------
4610 BEGIN
4611 SELECT a.seeded_flag, a.name, a.deleted_flag, checkout_user
4612 INTO l_seeded_flag, l_model_name, l_deleted_flag, l_checkout_user
4613 FROM cz_rp_entries a, cz_devl_projects b
4614 WHERE object_id = p_model_id
4615 AND object_type = 'PRJ'
4616 AND object_id = devl_project_id;
4617 EXCEPTION
4618 WHEN NO_DATA_FOUND THEN
4619 RAISE INVALID_MODEL_ID;
4620 END;
4621
4622 IF (l_deleted_flag = '1') THEN
4623 RAISE MODEL_DELETED;
4624 END IF;
4625
4626 IF (l_seeded_flag = '1') THEN
4627 RAISE SEEDED_FLAG_EXCP;
4628 END IF;
4629
4630 IF ( l_checkout_user IS NOT NULL AND l_checkout_user <> l_user_name ) THEN
4631 RAISE MODEL_LOCKED;
4632 END IF;
4633
4634 -------------------------------------
4635 -- check for user privs on this model
4636 -------------------------------------
4637 l_priv := cz_security_pvt.has_model_privileges(p_model_id,'PRJ');
4638 IF (l_priv <> cz_security_pvt.HAS_PRIVILEGE) THEN
4639 RAISE NO_PRIV;
4640 ELSIF (l_priv = FND_API.G_RET_STS_UNEXP_ERROR) THEN
4641 RAISE UNEXPECTED_ERROR;
4642 END IF;
4643
4644 ----------------------------------
4645 -- check for model refs/connectors
4646 ----------------------------------
4647 BEGIN
4648
4649 SELECT d.devl_project_id, d.name
4650 BULK COLLECT INTO x_ref_model_ids_tbl, x_ref_model_names_tbl
4651 FROM cz_ps_nodes p, cz_devl_projects d
4652 WHERE p.reference_id = p_model_id
4653 AND p.ps_node_type IN (263, 264)
4654 AND p.deleted_flag = '0'
4655 AND p.devl_project_id = d.devl_project_id
4656 AND d.deleted_flag = '0';
4657 EXCEPTION
4658 WHEN NO_DATA_FOUND THEN
4659 NULL; -- good, no refs or connectors to worry about
4660 END;
4661
4662 IF x_ref_model_ids_tbl.COUNT > 0 THEN
4663 FOR i IN 1..x_ref_model_ids_tbl.COUNT LOOP
4664 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEL_MODEL_IS_REFD_BY');
4665 FND_MESSAGE.SET_TOKEN('MODELNAME', l_model_name);
4666 FND_MESSAGE.SET_TOKEN('REFMODELNAME', x_ref_model_names_tbl(i));
4667 FND_MSG_PUB.ADD;
4668 END LOOP;
4669 RAISE REFS_EXIST;
4670 END IF;
4671
4672 ---------------------------------------
4673 -- finally, check for published models
4674 ---------------------------------------
4675 BEGIN
4676 SELECT publication_id BULK COLLECT INTO l_publication_tbl
4677 FROM cz_model_publications
4678 WHERE object_id = p_model_id
4679 AND object_type = 'PRJ'
4680 AND deleted_flag = '0';
4681
4682 IF (l_publication_tbl.COUNT > 0) THEN
4683
4684 RAISE MODEL_PUBS_EXIST;
4685
4686 END IF;
4687
4688 EXCEPTION
4689 WHEN NO_DATA_FOUND THEN
4690 NULL; -- good no published models to worry about
4691 END;
4692
4693 EXCEPTION
4694 WHEN USER_IS_NULL_EXCP THEN
4695 handle_Error(p_message_name => 'CZ_DEL_MODEL_NULL_USER',
4696 x_return_status => x_return_status,
4697 x_msg_count => x_msg_count,
4698 x_msg_data => x_msg_data);
4699 WHEN INVALID_MODEL_ID THEN
4700 handle_Error(p_message_name => 'CZ_DEL_MODEL_NOT_FOUND',
4701 x_return_status => x_return_status,
4702 x_msg_count => x_msg_count,
4703 x_msg_data => x_msg_data);
4704 WHEN MODEL_DELETED THEN
4705 NULL;
4706 WHEN SEEDED_FLAG_EXCP THEN
4707 handle_Error(p_message_name => 'CZ_DEL_MODEL_SEEDED_DATA',
4708 x_return_status => x_return_status,
4709 x_msg_count => x_msg_count,
4710 x_msg_data => x_msg_data);
4711 WHEN MODEL_LOCKED THEN
4712 handle_Error(p_message_name => 'CZ_DEL_MODEL_LOCKED_MODEL',
4713 p_token_name1 => 'MODELNAME',
4714 p_token_value1 => l_model_name,
4715 p_token_name2 => 'CHECKOUTUSER',
4716 p_token_value2 => l_checkout_user,
4717 x_return_status => x_return_status,
4718 x_msg_count => x_msg_count,
4719 x_msg_data => x_msg_data);
4720 WHEN REFS_EXIST THEN
4721 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEL_MODEL_REFS_EXIST');
4722 FND_MSG_PUB.ADD;
4723 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
4727 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEL_MODEL_IS_PUBSHD');
4724 p_data => x_msg_data);
4725 x_return_status := FND_API.G_RET_STS_ERROR;
4726 WHEN MODEL_PUBS_EXIST THEN
4728 FND_MESSAGE.SET_TOKEN('MODELNAME', l_model_name);
4729 FND_MSG_PUB.ADD;
4730 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
4731 p_data => x_msg_data);
4732 x_return_status := FND_API.G_RET_STS_ERROR;
4733 WHEN NO_PRIV THEN
4734 handle_Error(p_message_name => 'CZ_DEL_MODEL_NO_MODEL_PRIV',
4735 p_token_name1 => 'MODELNAME',
4736 p_token_value1 => l_model_name,
4737 x_return_status => x_return_status,
4738 x_msg_count => x_msg_count,
4739 x_msg_data => x_msg_data);
4740 WHEN UNEXPECTED_ERROR THEN
4741 handle_Error(p_procedure_name => 'is_model_deleteable',
4742 p_error_message => ' unexpected error in cz_security_pvt.has_model_privileges()',
4743 x_return_status => x_return_status,
4744 x_msg_count => x_msg_count,
4745 x_msg_data => x_msg_data);
4746 WHEN OTHERS THEN
4747 handle_Error(p_procedure_name => 'is_model_deleteable',
4748 p_error_message => SQLERRM,
4749 x_return_status => x_return_status,
4750 x_msg_count => x_msg_count,
4751 x_msg_data => x_msg_data);
4752 END is_model_deleteable;
4753 --------------------------------------------------------------------------------
4754 PROCEDURE delete_model(p_model_id IN NUMBER
4755 ,x_return_status OUT NOCOPY VARCHAR2
4756 ,x_msg_count OUT NOCOPY NUMBER
4757 ,x_msg_data OUT NOCOPY VARCHAR2)
4758 IS
4759 LOCK_MODEL_EXCP EXCEPTION;
4760 l_locked_model_tbl cz_security_pvt.number_type_tbl;
4761 BEGIN
4762
4763 FND_MSG_PUB.initialize;
4764
4765 is_model_deleteable(p_model_id, x_return_status, x_msg_count, x_msg_data);
4766
4767 IF ( x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
4768
4769 cz_security_pvt.lock_model(
4770 p_api_version => 1.0,
4771 p_model_id => p_model_id,
4772 p_lock_child_models => FND_API.G_FALSE,
4773 p_commit_flag => FND_API.G_FALSE,
4774 x_locked_entities => l_locked_model_tbl,
4775 x_return_status => x_return_status,
4776 x_msg_count => x_msg_count,
4777 x_msg_data => x_msg_data);
4778 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4779 RAISE LOCK_MODEL_EXCP;
4780 END IF;
4781
4782 UPDATE cz_devl_projects
4783 SET deleted_flag = '1',
4784 name = append_name (p_model_id, 'PRJ', name)
4785 WHERE devl_project_id = p_model_id
4786 AND deleted_flag = '0';
4787 END IF;
4788
4789 EXCEPTION
4790 WHEN LOCK_MODEL_EXCP THEN
4791 FND_MESSAGE.SET_NAME('CZ','CZ_DEL_MODEL_LOCK_ERR');
4792 FND_MSG_PUB.ADD;
4793 x_msg_count := x_msg_count + 1;
4794 x_msg_data := fnd_msg_pub.GET(x_msg_count,fnd_api.g_false);
4795 WHEN OTHERS THEN
4796 handle_Error(p_procedure_name => 'delete_model',
4797 p_error_message => SQLERRM,
4798 x_return_status => x_return_status,
4799 x_msg_count => x_msg_count,
4800 x_msg_data => x_msg_data);
4801 END delete_model;
4802
4803
4804 --
4805 -- copy_model_usage
4806 -- p_model_usage_id - identifies folder to copy
4807 -- p_encl_folder_id - enclosing folder to copy to
4808 -- x_folder_id - new copied folder
4809 -- x_run_id - OUT parameter : if =0 => no errors
4810 -- - else =CZ_DB_LOGS.run_id
4811 -- x_return_status - status string
4812 -- x_msg_count - number of error messages
4813 -- x_msg_data - string which contains error messages
4814
4815 PROCEDURE copy_model_usage
4816 (
4817 p_model_usage_id IN NUMBER,
4818 p_encl_folder_id IN NUMBER,
4819 x_new_model_usage_id OUT NOCOPY NUMBER,
4820 x_return_status OUT NOCOPY VARCHAR2,
4821 x_msg_count OUT NOCOPY NUMBER,
4822 x_msg_data OUT NOCOPY VARCHAR2
4823 ) IS
4824
4825 l_api_version CONSTANT NUMBER := 1.0;
4826 l_api_name CONSTANT VARCHAR2(30) := 'copy_model_usage';
4827 INVALID_MODEL_USAGE_ID_EXCP EXCEPTION;
4828 USER_IS_NULL_EXCP EXCEPTION;
4829 usageID NUMBER := 0;
4830 l_usage_name cz_model_usages.name%TYPE;
4831 BEGIN
4832 FND_MSG_PUB.initialize;
4833 x_return_status := FND_API.G_RET_STS_SUCCESS;
4834 new_usage (p_encl_folder_id,usageID);
4835 IF (usageID = -2) THEN
4836 x_return_status := FND_API.G_RET_STS_ERROR;
4837 x_msg_count := 1;
4838 handle_Error(p_message_name => 'CZ_COPY_MODELUSG_MAX',
4842 ELSE
4839 x_return_status => x_return_status,
4840 x_msg_count => x_msg_count,
4841 x_msg_data => x_msg_data);
4843 l_usage_name := copy_name(p_model_usage_id,'USG');
4844
4845 UPDATE cz_rp_entries
4846 SET name = l_usage_name
4847 WHERE object_id = usageID
4848 AND object_type = 'USG';
4849
4850 UPDATE cz_model_usages
4851 SET name = l_usage_name,
4852 note=(select note from cz_model_usages
4853 where model_usage_id=usageID)
4854 WHERE model_usage_id = usageID;
4855
4856
4857 update cz_model_usages_tl target
4858 set (LANGUAGE,SOURCE_LANG,DESCRIPTION)=(select LANGUAGE,SOURCE_LANG,DESCRIPTION
4859 from
4860 cz_model_usages_tl source where model_usage_id=p_model_usage_id and target.language=source.language)
4861 where model_usage_id=usageID;
4862
4863 x_new_model_usage_id := usageID;
4864 END IF;
4865 EXCEPTION
4866 WHEN INVALID_MODEL_USAGE_ID_EXCP THEN
4867 handle_Error(p_message_name => 'CZ_COPY_MODELUSG_INV_ID',
4868 p_token_name1 => 'USGID',
4869 p_token_value1 => TO_CHAR(p_model_usage_id),
4870 x_return_status => x_return_status,
4871 x_msg_count => x_msg_count,
4872 x_msg_data => x_msg_data);
4873 WHEN OTHERS THEN
4874 handle_Error(p_procedure_name => 'copy_model_usage',
4875 p_error_message => SQLERRM,
4876 x_return_status => x_return_status,
4877 x_msg_count => x_msg_count,
4878 x_msg_data => x_msg_data);
4879 END copy_model_usage;
4880
4881
4882 PROCEDURE copy_property
4883 (
4884 p_property_id IN NUMBER,
4885 p_encl_folder_id IN NUMBER,
4886 x_new_property_id OUT NOCOPY NUMBER,
4887 x_return_status OUT NOCOPY VARCHAR2,
4888 x_msg_count OUT NOCOPY NUMBER,
4889 x_msg_data OUT NOCOPY VARCHAR2
4890 ) IS
4891
4892 l_api_version CONSTANT NUMBER := 1.0;
4893 l_api_name CONSTANT VARCHAR2(30) := 'copy_property';
4894 INVALID_PROPERTY_ID_EXCP EXCEPTION;
4895 USER_IS_NULL_EXCP EXCEPTION;
4896 l_name cz_rp_entries.name%TYPE;
4897 l_new_intl_text_id cz_localized_texts.intl_text_id%TYPE;
4898 l_text_id NUMBER;
4899
4900 BEGIN
4901
4902 x_return_status := FND_API.G_RET_STS_SUCCESS;
4903 x_new_property_id := allocateId('CZ_PROPERTIES_S');
4904 l_name := copy_name(p_property_id,'PRP');
4905 INSERT INTO CZ_PROPERTIES
4906 (
4907 PROPERTY_ID
4908 ,PROPERTY_UNIT
4909 ,DESC_TEXT
4910 ,NAME
4911 ,DATA_TYPE
4912 ,DEF_VALUE
4913 ,USER_NUM01
4914 ,USER_NUM02
4915 ,USER_NUM03
4916 ,USER_NUM04
4917 ,USER_STR01
4918 ,USER_STR02
4919 ,USER_STR03
4920 ,USER_STR04
4921 ,DELETED_FLAG
4922 ,EFF_FROM
4923 ,EFF_TO
4924 ,SECURITY_MASK
4925 ,EFF_MASK
4926 ,CHECKOUT_USER
4927 ,def_num_value
4928 )
4929 SELECT
4930 x_new_property_id
4931 ,PROPERTY_UNIT
4932 ,DESC_TEXT
4933 ,l_name
4934 ,DATA_TYPE
4935 ,DEF_VALUE
4936 ,USER_NUM01
4937 ,USER_NUM02
4938 ,USER_NUM03
4939 ,USER_NUM04
4940 ,USER_STR01
4941 ,USER_STR02
4942 ,USER_STR03
4943 ,USER_STR04
4944 ,DELETED_FLAG
4945 ,EFF_FROM
4946 ,EFF_TO
4947 ,SECURITY_MASK
4948 ,EFF_MASK
4949 ,CHECKOUT_USER
4950 ,def_num_value
4951 FROM CZ_PROPERTIES
4952 WHERE property_id=p_property_id;
4953
4954 IF SQL%ROWCOUNT = 0 THEN
4955 RAISE INVALID_PROPERTY_ID_EXCP;
4956 END IF;
4957
4958 -- Create new text if the type is translateable text
4959 FOR i IN (SELECT def_num_value FROM cz_properties
4960 WHERE property_id=p_property_id
4961 AND data_type=8
4962 AND def_num_value IS NOT NULL) LOOP
4963 l_text_id := i.def_num_value;
4964 l_new_intl_text_id := copy_INTL_TEXT(i.def_num_value);
4965 IF l_new_intl_text_id = -1 THEN
4966 RAISE NO_TXT_FOUND_EXCP;
4967 END IF;
4968 UPDATE cz_properties
4969 SET def_num_value=l_new_intl_text_id
4970 WHERE property_id=x_new_property_id;
4971 END LOOP;
4972
4973 --Create Repository Entry
4974
4975 INSERT INTO CZ_RP_ENTRIES
4976 (
4977 OBJECT_TYPE
4978 ,OBJECT_ID
4979 ,ENCLOSING_FOLDER
4980 ,NAME
4981 ,DESCRIPTION
4982 ,NOTES
4983 ,SEEDED_FLAG
4984 ,DELETED_FLAG
4985 )
4986 SELECT
4987 OBJECT_TYPE
4991 ,DESCRIPTION
4988 ,x_new_property_id
4989 ,p_encl_folder_id
4990 ,l_name
4992 ,NOTES
4993 ,'0'
4994 ,DELETED_FLAG
4995 FROM CZ_RP_ENTRIES
4996 WHERE object_id= p_property_id AND object_type='PRP'
4997 AND deleted_flag='0';
4998
4999 IF SQL%ROWCOUNT = 0 THEN
5000 RAISE INVALID_PROPERTY_ID_EXCP;
5001 END IF;
5002 EXCEPTION
5003 WHEN INVALID_PROPERTY_ID_EXCP THEN
5004 handle_Error(p_message_name => 'CZ_COPY_PRP_INV_ID',
5005 p_token_name1 => 'OBJID',
5006 p_token_value1 => TO_CHAR(p_property_id),
5007 x_return_status => x_return_status,
5008 x_msg_count => x_msg_count,
5009 x_msg_data => x_msg_data);
5010 WHEN NO_TXT_FOUND_EXCP THEN
5011 handle_Error(p_message_name => 'CZ_COPY_PROP_NO_TXT',
5012 p_token_name1 => 'TEXTID',
5013 p_token_value1 => TO_CHAR(l_text_id),
5014 x_return_status => x_return_status,
5015 x_msg_count => x_msg_count,
5016 x_msg_data => x_msg_data);
5017 WHEN OTHERS THEN
5018 handle_Error(p_procedure_name => 'copy_property',
5019 p_error_message => SQLERRM,
5020 x_return_status => x_return_status,
5021 x_msg_count => x_msg_count,
5022 x_msg_data => x_msg_data);
5023 END copy_property;
5024
5025 PROCEDURE copy_effectivity_set
5026 (
5027 p_effectivity_set_id IN NUMBER,
5028 p_encl_folder_id IN NUMBER,
5029 x_new_effectivity_set_id OUT NOCOPY NUMBER,
5030 x_return_status OUT NOCOPY VARCHAR2,
5031 x_msg_count OUT NOCOPY NUMBER,
5032 x_msg_data OUT NOCOPY VARCHAR2
5033 ) IS
5034
5035 l_api_version CONSTANT NUMBER := 1.0;
5036 l_api_name CONSTANT VARCHAR2(30) := 'copy_effectivity_set';
5037 INVALID_EFF_SET_ID_EXCP EXCEPTION;
5038 USER_IS_NULL_EXCP EXCEPTION;
5039 l_name cz_rp_entries.name%TYPE;
5040 BEGIN
5041 FND_MSG_PUB.initialize;
5042 x_return_status := FND_API.G_RET_STS_SUCCESS;
5043 x_new_effectivity_set_id := allocateId('CZ_EFFECTIVITY_SETS_S');
5044 l_name := copy_name(p_effectivity_set_id,'EFF');
5045 INSERT INTO CZ_RP_ENTRIES
5046 (
5047 OBJECT_TYPE
5048 ,OBJECT_ID
5049 ,ENCLOSING_FOLDER
5050 ,NAME
5051 ,DESCRIPTION
5052 ,NOTES
5053 ,SEEDED_FLAG
5054 ,DELETED_FLAG
5055 )
5056 SELECT
5057 OBJECT_TYPE
5058 ,x_new_effectivity_set_id
5059 ,p_encl_folder_id
5060 ,l_name
5061 ,DESCRIPTION
5062 ,NOTES
5063 ,'0'
5064 ,DELETED_FLAG
5065 FROM CZ_RP_ENTRIES
5066 WHERE object_id= p_effectivity_set_id AND object_type='EFF'
5067 AND deleted_flag='0';
5068
5069 IF SQL%ROWCOUNT = 0 THEN
5070 RAISE INVALID_EFF_SET_ID_EXCP;
5071 END IF;
5072
5073 INSERT INTO CZ_EFFECTIVITY_SETS
5074 (
5075 EFFECTIVITY_SET_ID
5076 ,NAME
5077 ,DESCRIPTION
5078 ,NOTE
5079 ,EFFECTIVE_FROM
5080 ,EFFECTIVE_UNTIL
5081 ,USER_STR01
5082 ,USER_STR02
5083 ,USER_STR03
5084 ,USER_STR04
5085 ,USER_NUM01
5086 ,USER_NUM02
5087 ,USER_NUM03
5088 ,USER_NUM04
5089 ,DELETED_FLAG
5090 )
5091 SELECT
5092 x_new_effectivity_set_id
5093 ,l_name
5094 ,DESCRIPTION
5095 ,NOTE
5096 ,EFFECTIVE_FROM
5097 ,EFFECTIVE_UNTIL
5098 ,USER_STR01
5099 ,USER_STR02
5100 ,USER_STR03
5101 ,USER_STR04
5102 ,USER_NUM01
5103 ,USER_NUM02
5104 ,USER_NUM03
5105 ,USER_NUM04
5106 ,DELETED_FLAG
5107 FROM CZ_EFFECTIVITY_SETS
5108 WHERE effectivity_set_id = p_effectivity_set_id;
5109
5110 IF SQL%ROWCOUNT = 0 THEN
5111 RAISE INVALID_EFF_SET_ID_EXCP;
5112 END IF;
5113
5114 EXCEPTION
5115 WHEN INVALID_EFF_SET_ID_EXCP THEN
5116 handle_Error(p_message_name => 'CZ_COPY_EFF_INV_ID',
5117 p_token_name1 => 'OBJID',
5118 p_token_value1 => TO_CHAR(p_effectivity_set_id),
5119 x_return_status => x_return_status,
5120 x_msg_count => x_msg_count,
5121 x_msg_data => x_msg_data);
5122 WHEN OTHERS THEN
5123 handle_Error(p_procedure_name => 'copy_effectivity_set',
5124 p_error_message => SQLERRM,
5125 x_return_status => x_return_status,
5126 x_msg_count => x_msg_count,
5127 x_msg_data => x_msg_data);
5128 END copy_effectivity_set;
5129
5130 PROCEDURE copy_archive
5131 (
5132 p_archive_id IN NUMBER,
5136 x_msg_count OUT NOCOPY NUMBER,
5133 p_encl_folder_id IN NUMBER,
5134 x_new_archive_id OUT NOCOPY NUMBER,
5135 x_return_status OUT NOCOPY VARCHAR2,
5137 x_msg_data OUT NOCOPY VARCHAR2
5138 ) IS
5139
5140 l_api_version CONSTANT NUMBER := 1.0;
5141 l_api_name CONSTANT VARCHAR2(30) := 'copy_archive';
5142 INVALID_ARCHIVE_ID_EXCP EXCEPTION;
5143 USER_IS_NULL_EXCP EXCEPTION;
5144
5145 BEGIN
5146 x_new_archive_id := allocateId('CZ_ARCHIVES_S');
5147 INSERT INTO CZ_ARCHIVES(
5148 ARCHIVE_ID
5149 ,NAME
5150 ,DESCRIPTION
5151 ,ARCHIVE_TYPE
5152 ,ARCHIVE_BLOB
5153 ,ARCHIVE_URL
5154 ,PERSISTENT_ARCHIVE_ID
5155 ,DELETED_FLAG
5156 ,DOCUMENTATION_URL
5157 )
5158 SELECT
5159 x_new_archive_id
5160 ,NAME||' - '||TO_CHAR(x_new_archive_id)
5161 ,DESCRIPTION
5162 ,ARCHIVE_TYPE
5163 ,ARCHIVE_BLOB
5164 ,ARCHIVE_URL
5165 ,PERSISTENT_ARCHIVE_ID
5166 ,DELETED_FLAG
5167 ,DOCUMENTATION_URL
5168 FROM CZ_ARCHIVES
5169 WHERE archive_id = p_archive_id;
5170
5171 IF SQL%ROWCOUNT = 0 THEN
5172 RAISE INVALID_ARCHIVE_ID_EXCP;
5173 END IF;
5174
5175 --Create Repository Entry
5176
5177 INSERT INTO CZ_RP_ENTRIES
5178 (
5179 OBJECT_TYPE
5180 ,OBJECT_ID
5181 ,ENCLOSING_FOLDER
5182 ,NAME
5183 ,DESCRIPTION
5184 ,NOTES
5185 ,SEEDED_FLAG
5186 ,DELETED_FLAG
5187 )
5188 SELECT
5189 OBJECT_TYPE
5190 ,x_new_archive_id
5191 ,p_encl_folder_id
5192 ,NAME||' - '||TO_CHAR(x_new_archive_id)
5193 ,DESCRIPTION
5194 ,NOTES
5195 ,'0'
5196 ,DELETED_FLAG
5197 FROM CZ_RP_ENTRIES
5198 WHERE object_id= p_archive_id AND object_type='ARC'
5199 AND deleted_flag='0';
5200
5201 IF SQL%ROWCOUNT = 0 THEN
5202 RAISE INVALID_ARCHIVE_ID_EXCP;
5203 END IF;
5204
5205 x_return_status := FND_API.G_RET_STS_SUCCESS;
5206
5207 EXCEPTION
5208 WHEN INVALID_ARCHIVE_ID_EXCP THEN
5209 handle_Error(p_message_name => 'CZ_COPY_ARC_INV_ID',
5210 p_token_name1 => 'OBJID',
5211 p_token_value1 => TO_CHAR(p_archive_id),
5212 x_return_status => x_return_status,
5213 x_msg_count => x_msg_count,
5214 x_msg_data => x_msg_data);
5215 WHEN OTHERS THEN
5216 handle_Error(p_procedure_name => 'copy_archive',
5217 p_error_message => SQLERRM,
5218 x_return_status => x_return_status,
5219 x_msg_count => x_msg_count,
5220 x_msg_data => x_msg_data);
5221 END copy_archive;
5222
5223 -------------------------- copy_ui_template ----------------------------
5224 FUNCTION get_Attribute_Value(p_node IN xmldom.DOMNode,
5225 p_attr_name IN VARCHAR2) RETURN VARCHAR2 IS
5226
5227 l_node_map_tbl xmldom.DOMNamedNodeMap;
5228 l_node_attr xmldom.DOMNode;
5229 l_attr_value VARCHAR2(32000);
5230 l_length NUMBER;
5231
5232 BEGIN
5233
5234 IF xmldom.IsNull(p_node) THEN
5235 RETURN NULL;
5236 END IF;
5237 l_node_map_tbl := xmldom.getAttributes(p_node);
5238
5239 IF (xmldom.isNull(l_node_map_tbl) = FALSE) THEN
5240 l_length := xmldom.getLength(l_node_map_tbl);
5241 --
5242 -- loop through attributes
5243 --
5244 FOR i IN 0 .. l_length - 1
5245 LOOP
5246 l_node_attr := xmldom.item(l_node_map_tbl, i);
5247 IF xmldom.getNodeName(l_node_attr) = p_attr_name THEN
5248 l_attr_value := xmldom.getNodeValue(l_node_attr);
5249 EXIT;
5250 END IF;
5251 END LOOP;
5252 END IF;
5253 RETURN l_attr_value;
5254 END get_Attribute_Value;
5255
5256 FUNCTION get_User_Attribute(p_user_attribute_value IN VARCHAR2,
5257 p_cz_attribute_name IN VARCHAR2)
5258 RETURN VARCHAR2 IS
5259
5260 l_ind1 NUMBER;
5261 l_ind2 NUMBER;
5262 l_substr VARCHAR2(32000);
5263
5264 BEGIN
5265 l_ind1 := INSTR(p_user_attribute_value,p_cz_attribute_name);
5266
5267 IF l_ind1 > 0 THEN
5268 l_substr := SUBSTR(p_user_attribute_value,l_ind1+LENGTH(p_cz_attribute_name)+LENGTH('='));
5269 l_ind2 := INSTR(l_substr, '|');
5270 IF l_ind2 > 0 THEN
5271 RETURN SUBSTR(l_substr,1,l_ind2-1);
5272 ELSE
5273 RETURN l_substr;
5274 END IF;
5275 ELSE
5276 RETURN NULL;
5277 END IF;
5278 END get_User_Attribute;
5279
5280 PROCEDURE set_Attribute(p_dom_element xmldom.DOMElement,
5281 p_attribute_name IN VARCHAR2,
5282 p_attribute_value IN VARCHAR2) IS
5283
5284 BEGIN
5288 FUNCTION replace_attrib_value (p_attrib_name IN VARCHAR2,
5285 xmldom.setAttribute(p_dom_element, p_attribute_name, p_attribute_value);
5286 END set_Attribute;
5287
5289 p_attrib_val IN VARCHAR2,
5290 p_tag_name IN VARCHAR2,
5291 p_old_switcher_id IN VARCHAR2,
5292 p_new_document_name IN VARCHAR2)
5293 RETURN VARCHAR2
5294 IS
5295 l_new_seq NUMBER;
5296 l_attrib_val VARCHAR2(4000);
5297 l_index NUMBER;
5298 l_case_name VARCHAR2(4000);
5299 l_new_case_name VARCHAR2(4000);
5300 l_old_tree_tag_id VARCHAR2(60);
5301 l_new_tree_tag_id VARCHAR2(60);
5302 BEGIN
5303 l_attrib_val := '';
5304
5305 IF ( (p_attrib_name = 'id') ) THEN
5306 -- check if a new id has already been assigned for this tag. This can happen in two situations
5307 -- 1. The user:attribute3 containing the switcherDefaultCaseName attribute is processed before
5308 -- the <oa:switcher id attribute
5309 -- 2. In case of <oa:stackLayout immediately following the <ui:case. There is always a
5310 -- <oa:stackLayout following a <ui:case
5311 IF ( g_attribute_map.EXISTS(p_attrib_val) ) THEN
5312 l_attrib_val := g_attribute_map(p_attrib_val);
5313 ELSE
5314 SELECT cz_ui_page_elements_s.nextval INTO l_new_seq FROM dual;
5315 l_attrib_val := '_czc'||l_new_seq;
5316 g_attribute_map(p_attrib_val) := l_attrib_val;
5317 END IF;
5318
5319 ELSIF (p_tag_name = 'switcher' AND p_attrib_name = 'user:attribute3') THEN
5320 -- replace the defaultCaseName attribute on the switcher, if present
5321 l_case_name := get_User_Attribute(p_attrib_val, 'switcherDefaultCaseName');
5322 IF ( l_case_name IS NOT NULL ) THEN
5323 -- get the new switcher id
5324 IF ( g_attribute_map.EXISTS(p_old_switcher_id) ) THEN
5325 l_attrib_val := g_attribute_map(p_old_switcher_id);
5326 ELSE
5327 -- This case can happen when user:attribute3 is processed before the id attribute
5328 -- We have no control over the order in which these attributes are returned.
5329 -- So this case can occur. Since id is not yet processed we dont have the new id
5330 -- So let us just create a new id for the switcher right now and put it in the map
5331 SELECT cz_ui_page_elements_s.nextval INTO l_new_seq FROM dual;
5332 -- this is the new id attribute value for the switcher.
5333 -- We will put it in the map so that it gets used when processing the id attribute in the
5334 -- first If block in this function
5335 l_attrib_val := '_czc'||l_new_seq;
5336
5337 g_attribute_map(p_old_switcher_id) := l_attrib_val;
5338 END IF;
5339
5340 -- form the new case name by replacing the old switcher id with the new one
5341 l_new_case_name := REPLACE(l_case_name, p_old_switcher_id, l_attrib_val);
5342 -- replace the case value in user attribute with the new one
5343 l_attrib_val := REPLACE(p_attrib_val,'switcherDefaultCaseName=' || l_case_name, 'switcherDefaultCaseName=' || l_new_case_name);
5344
5345 ELSE
5346 l_attrib_val := p_attrib_val;
5347 END IF;
5348
5349 ELSIF (p_tag_name = 'case' AND p_attrib_name = 'name') THEN
5350
5351 l_case_name := p_attrib_val;
5352 -- get the new switcher id. If we don't find the switcher id in the map, then it would
5353 -- be either because of a code bug or data corruption. Therefore not protecting the
5354 -- fetch using an EXISTS check
5355
5356 l_attrib_val := g_attribute_map(p_old_switcher_id);
5357
5358 -- form the new case name by replacing the old switcher id with the new one
5359 l_attrib_val := REPLACE(l_case_name, p_old_switcher_id, l_attrib_val);
5360
5361 g_attribute_map(p_attrib_val) := l_attrib_val;
5362
5363 ELSIF (p_attrib_name = 'ancestorNode') THEN
5364
5365 l_index := INSTR(p_attrib_val, '.');
5366 l_old_tree_tag_id := SUBSTR(p_attrib_val, l_index+1);
5367 -- By the time the ancestorNode attribute is processed, we will have already seen
5368 -- and processed the <oa:tree tag and its id attribute. This id attribute should
5369 -- be in the map already
5370
5371 l_new_tree_tag_id := g_attribute_map(l_old_tree_tag_id);
5372 l_attrib_val := p_new_document_name || '.' || l_new_tree_tag_id;
5373
5374 ELSE
5375 -- not an attribute we are interested in
5376 RETURN p_attrib_val;
5377 END IF;
5378
5379 RETURN l_attrib_val;
5380 END;
5381
5382 ---------------------
5383 function createElement (p_namespace IN OUT NOCOPY VARCHAR2,
5384 p_tagname IN VARCHAR2)
5385 RETURN jdr_docbuilder.ELEMENT
5386 IS
5387 l_child_element jdr_docbuilder.ELEMENT;
5388
5389 BEGIN
5390 IF (p_namespace IS NULL) THEN
5391 p_namespace := 'jrad:';
5392 END IF;
5393 l_child_element := jdr_docbuilder.createElement(p_namespace,p_tagname);
5394 RETURN l_child_element;
5395 EXCEPTION
5396 WHEN OTHERS THEN
5397 RAISE;
5398 END;
5399
5400 -----------------------
5401
5402 FUNCTION replace_global_ids(p_user_attr_value IN VARCHAR2,
5403 p_new_template_id IN NUMBER) RETURN VARCHAR2 IS
5404
5405 l_user_attribute_value VARCHAR2(4000);
5406
5410 l_attr_end_ind NUMBER := 1;
5407 FUNCTION replace_global_ids(p_attribute_value IN VARCHAR2, p_id_type VARCHAR2) RETURN VARCHAR2 IS
5408
5409 l_tkn_start NUMBER;
5411 l_token VARCHAR2(20);
5412 l_length_of_tkn NUMBER;
5413 l_elementId_str VARCHAR2(255);
5414 l_element_id NUMBER;
5415 l_persistent_element_id NUMBER;
5416 l_rule_folder_id NUMBER;
5417 l_new_element_id NUMBER;
5418 l_new_user_attr_value VARCHAR2(4000) := NULL;
5419 l_return_status VARCHAR2(1);
5420 l_run_id NUMBER;
5421 l_msg_count NUMBER;
5422 l_msg_data VARCHAR2(2000);
5423
5424 BEGIN
5425 -- Get the start of the first 'CondnId' attribute
5426 IF ( p_id_type = G_RULE_TYPE ) THEN
5427 l_token := 'CondnId=';
5428 ELSIF ( p_id_type = G_INTL_TEXT_TYPE ) THEN
5429 l_token := 'IntlTextId=';
5430 ELSE
5431 l_token := 'actionId=';
5432 END IF;
5433
5434 l_length_of_tkn := length(l_token);
5435
5436 l_tkn_start := instr(p_attribute_value, l_token);
5437
5438 l_new_user_attr_value := '';
5439
5440 IF (l_tkn_start > 0) THEN
5441 LOOP
5442 -- If no Token found then exit the loop
5443 IF (l_tkn_start < 1) THEN
5444 IF ( l_attr_end_ind > 0 ) THEN
5445 -- The last part of the string is yet to be added
5446 l_new_user_attr_value := l_new_user_attr_value || SUBSTR(p_attribute_value, l_attr_end_ind);
5447 END IF;
5448 EXIT;
5449 END IF;
5450
5451 -- move the start pointer to the start of the actual Rule Id
5452 l_tkn_start := l_tkn_start + l_length_of_Tkn;
5453
5454 -- save the part from the end of previous CondnId values to start of this CondnId attribute
5455 l_new_user_attr_value := l_new_user_attr_value || SUBSTR(p_attribute_value, l_attr_end_ind, (l_tkn_start-l_attr_end_ind));
5456
5457 -- Look for the delimiter Pipe character
5458 l_attr_end_ind := INSTR(p_attribute_value, '|', l_tkn_start);
5459
5460 IF l_attr_end_ind > 0 THEN
5461 -- Delimiter found; extract the Rule Id and move the l_tkn_start the start of the
5462 -- next CondnId token
5463 l_elementId_str := SUBSTR(p_attribute_value, l_tkn_start, l_attr_end_ind-l_tkn_start);
5464 l_tkn_start := INSTR(p_attribute_value, l_token, l_attr_end_ind);
5465 ELSE
5466 -- Delimiter not found, which means we are at the end of the user:attribute
5467 -- Obviously there won't be any more CondnId tokens, so set l_tkn_start to -1
5468 l_elementId_str := SUBSTR(p_attribute_value, l_tkn_start);
5469 l_tkn_start := -1;
5470 END IF;
5471
5472 -- now we have the RuleId in l_condnId_str
5473 l_persistent_element_id := TO_NUMBER(l_elementId_str);
5474
5475 -- In case of Global source templates elements (element_id = persistent_element_id) is true
5476 -- This assumes that element_id is always = persistent_element_id in case of a source
5477 -- template_id regardless of how the template got created (developer, copy or migration)
5478 l_element_id := l_persistent_element_id;
5479
5480 IF( g_element_type_tbl.EXISTS(p_id_type || l_element_id) ) THEN
5481
5482 IF ( p_id_type = G_RULE_TYPE ) THEN
5483
5484 SELECT rule_folder_id INTO l_rule_folder_id
5485 FROM cz_rules
5486 WHERE cz_rules.rule_id = l_element_id
5487 AND cz_rules.deleted_flag = '0';
5488
5489
5490 cz_developer_utils_pvt.copy_Rule (l_element_id,
5491 l_rule_folder_id,
5492 FND_API.G_TRUE,
5493 l_new_element_id,
5494 l_run_id,
5495 l_return_status,
5496 l_msg_count,
5497 l_msg_data);
5498
5499 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5500 RAISE COPY_RULE_FAILURE;
5501 END IF;
5502
5503 ELSIF ( p_id_type = G_INTL_TEXT_TYPE ) THEN
5504
5505 l_new_element_id := copy_INTL_TEXT(l_element_id);
5506
5507 IF l_new_element_id = -1 THEN
5508 RAISE NO_TXT_FOUND_EXCP;
5509 END IF;
5510
5511 ELSE
5512
5513 SELECT cz_ui_actions_s.nextval INTO l_new_element_id FROM dual;
5514
5515 INSERT INTO CZ_UI_ACTIONS
5516 (UI_ACTION_ID,UI_DEF_ID,SOURCE_PAGE_ID,CONTEXT_COMPONENT_ID,ELEMENT_ID,RENDER_CONDITION_ID,
5517 UI_ACTION_TYPE,TARGET_UI_DEF_ID,TARGET_PERSISTENT_NODE_ID,TARGET_NODE_PATH,TARGET_PAGE_SET_ID,
5518 TARGET_PAGE_ID,TARGET_URL,FRAME_NAME,TARGET_ANCHOR,DELETED_FLAG,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
5519 LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,SEEDED_FLAG,CX_COMMAND_NAME,WINDOW_PARAMETERS,TARGET_WINDOW_TYPE,TARGET_WINDOW_NAME,
5520 TARGET_EXPL_NODE_ID,URL_PROPERTY_ID )
5521 SELECT l_new_element_id,UI_DEF_ID,SOURCE_PAGE_ID,CONTEXT_COMPONENT_ID,ELEMENT_ID,RENDER_CONDITION_ID,
5525 TARGET_EXPL_NODE_ID,URL_PROPERTY_ID FROM CZ_UI_ACTIONS
5522 UI_ACTION_TYPE,TARGET_UI_DEF_ID,TARGET_PERSISTENT_NODE_ID,TARGET_NODE_PATH,TARGET_PAGE_SET_ID,
5523 TARGET_PAGE_ID,TARGET_URL,FRAME_NAME,TARGET_ANCHOR,DELETED_FLAG,CREATED_BY,CREATION_DATE,LAST_UPDATED_BY,
5524 LAST_UPDATE_DATE,LAST_UPDATE_LOGIN,SEEDED_FLAG,CX_COMMAND_NAME,WINDOW_PARAMETERS,TARGET_WINDOW_TYPE,TARGET_WINDOW_NAME,
5526 WHERE ui_def_id = 0
5527 AND UI_ACTION_ID = l_element_id;
5528
5529 END IF;
5530
5531 INSERT
5532 INTO cz_ui_template_elements (TEMPLATE_ID,
5533 UI_DEF_ID,
5534 ELEMENT_TYPE,
5535 ELEMENT_ID,
5536 PERSISTENT_ELEMENT_ID,
5537 DELETED_FLAG,
5538 SEEDED_FLAG)
5539 VALUES (p_new_template_id,
5540 0,
5541 g_element_type_tbl(p_id_type || l_element_id),
5542 l_new_element_id,
5543 l_new_element_id,
5544 '0',
5545 '0');
5546 ELSE
5547 -- This can happen in case of seeded template elements
5548 -- Seeded template elements do not have a record in cz_ui_template_elements
5549 -- In such a case we do not create the new template_element record
5550 -- and continue using the same element_id
5551 l_new_element_id := l_element_id;
5552
5553 END IF; -- if element_id exists in g_element_type_tbl
5554
5555 -- l_newuser_attr_value is not like "....xxxxxxCondnId="
5556 -- Add the new rule_id to the end of this
5557 l_new_user_attr_value := l_new_user_attr_value || l_new_element_id;
5558
5559 END LOOP;
5560 ELSE
5561 l_new_user_attr_value := p_attribute_value;
5562 END IF;
5563 RETURN l_new_user_attr_value;
5564
5565 END replace_global_ids;
5566
5567 BEGIN
5568
5569 l_user_attribute_value := replace_global_ids(p_user_attr_value, G_RULE_TYPE);
5570 l_user_attribute_value := replace_global_ids(l_user_attribute_value, G_INTL_TEXT_TYPE);
5571 l_user_attribute_value := replace_global_ids(l_user_attribute_value, G_UI_ACTION_TYPE);
5572
5573 RETURN l_user_attribute_value;
5574
5575 END replace_global_ids;
5576
5577 -----
5578
5579 PROCEDURE copyAttributes(p_source_node IN xmldom.DOMNode,
5580 p_dest_element IN jdr_docbuilder.ELEMENT,
5581 p_new_template_id IN NUMBER,
5582 p_new_document_name IN VARCHAR2,
5583 p_old_switcher_id IN VARCHAR2)
5584 IS
5585
5586 l_attributes xmldom.DOMNamedNodeMap;
5587 l_attrib_node xmldom.DOMNode;
5588 l_attrib_count NUMBER := 0;
5589 l_tagname VARCHAR2(255);
5590 attrname VARCHAR2(255);
5591 attrval VARCHAR2(4000);
5592 l_ampers VARCHAR2(1) := fnd_global.local_chr(38);
5593
5594 BEGIN
5595
5596 l_attributes := xmldom.getAttributes(p_source_node);
5597 l_tagname := SUBSTR(xmldom.getNodeName(p_source_node),INSTR(xmldom.getNodeName(p_source_node),':') + 1);
5598
5599 l_attrib_count := xmldom.getLength(l_attributes);
5600
5601 IF (l_attrib_count > 0) then
5602 FOR attrCount IN 0..l_attrib_count - 1
5603 LOOP
5604 l_attrib_node := xmldom.item(l_attributes,attrCount);
5605 attrname := xmldom.getNodeName(l_attrib_node);
5606 attrval := xmldom.getNodeValue(l_attrib_node);
5607
5608 IF ( attrname = 'user:attribute3' ) THEN
5609 -- user:attribute3 can contain global Ids like Rule Ids (for UI Conditions), Intl_text_ids
5610 -- and Ui_action_ids
5611 attrval := replace_global_ids(attrval,
5612 p_new_template_id);
5613
5614 ELSIF ( attrname IN('text','caption','prompt','shortDesc') ) THEN
5615
5616 IF ( INSTR(attrval,l_ampers) > 0
5617 AND INSTR(attrval,l_ampers||'amp') = 0 ) THEN
5618 attrval := REPLACE(attrval, l_ampers, l_ampers||'amp;');
5619 END IF;
5620
5621 attrval := REPLACE(attrval, '<', l_ampers||'lt;');
5622 attrval := REPLACE(attrval, '"', l_ampers||'quot;');
5623 attrval := REPLACE(attrval, '''', l_ampers||'apos;');
5624
5625 END IF;
5626
5627 attrval := replace_attrib_value (attrname,attrval,l_tagname,p_old_switcher_id,p_new_document_name);
5628
5629 jdr_docbuilder.setAttribute(p_dest_element,attrname,attrval);
5630
5631 END LOOP;
5632 END IF;
5633
5634 END copyAttributes;
5635
5636
5637 PROCEDURE exploreTree(p_new_template_id IN NUMBER,
5638 p_new_document_name VARCHAR2,
5639 p_jrad_parent_element IN jdr_docbuilder.ELEMENT,
5640 p_dom_parent_element IN xmldom.DOMNode,
5641 p_grouping_tag IN VARCHAR2,
5642 p_enclosing_switcher_id IN VARCHAR2)
5643 IS
5644
5645 l_child_nodes xmldom.DOMNodeList;
5646 l_child_node xmldom.DOMNode;
5650 l_tagname VARCHAR2(255);
5647 l_parent_xml_node xmldom.DOMNode;
5648 l_child_count NUMBER := 0;
5649 l_namespace VARCHAR2(255);
5651 l_tag_name VARCHAR2(255);
5652 l_groupingNS VARCHAR2(255);
5653 l_groupingTagName VARCHAR2(255);
5654 l_grouping_tag VARCHAR2(255);
5655 l_child_element jdr_docbuilder.ELEMENT;
5656 l_parent_tag_name VARCHAR2(255);
5657 l_old_switcher_id VARCHAR2(60);
5658 l_attributes xmldom.DOMNamedNodeMap;
5659 l_attrib_count NUMBER := 0;
5660
5661 BEGIN
5662 l_child_nodes := xmldom.getChildNodes(p_dom_parent_element);
5663 l_child_count := xmldom.getLength(l_child_nodes);
5664
5665 IF (l_child_count > 0) THEN
5666 FOR childCount IN 0..l_child_count - 1
5667 LOOP
5668 l_child_node := xmldom.item(l_child_nodes,childCount);
5669 l_grouping_tag :='';
5670 l_tag_name := xmldom.getNodeName(l_child_node);
5671 l_parent_xml_node := xmldom.getParentNode(l_child_node);
5672
5673 l_attributes := xmldom.getAttributes(l_child_node);
5674 l_attrib_count := xmldom.getLength(l_attributes);
5675
5676 l_old_switcher_id := p_enclosing_switcher_id;
5677
5678 IF (l_tag_name = 'oa:switcher') THEN
5679 l_old_switcher_id := get_Attribute_value(l_child_node, 'id');
5680 END IF;
5681
5682 IF NOT(xmldom.isNull(l_parent_xml_node)) THEN
5683 l_parent_tag_name := xmldom.getNodeName(l_parent_xml_node);
5684 END IF;
5685
5686 IF ( (l_attrib_count = 0) AND (l_tag_name not in ('ui:firePartialAction') ) ) THEN
5687 l_grouping_tag := l_tag_name;
5688 END IF;
5689
5690 l_namespace := SUBSTR(xmldom.getNodeName(l_child_node),1,INSTR(xmldom.getNodeName(l_child_node),':'));
5691 l_tagname := SUBSTR(xmldom.getNodeName(l_child_node),INSTR(xmldom.getNodeName(l_child_node),':') + 1);
5692 l_child_element := createElement(l_namespace,l_tagname);
5693
5694 copyAttributes(l_child_node,
5695 l_child_element,
5696 p_new_template_id,
5697 p_new_document_name,
5698 l_old_switcher_id);
5699
5700 IF (p_grouping_tag IS NOT NULL) THEN
5701
5702 l_groupingNS :=SUBSTR(p_grouping_tag,1,INSTR(p_grouping_tag,':'));
5703 l_groupingTagName :=SUBSTR(p_grouping_tag,INSTR(p_grouping_tag,':')+1);
5704
5705 IF (l_groupingNS IS NULL) THEN l_groupingNS := 'jrad:'; END IF;
5706
5707 jdr_docbuilder.AddChild(p_jrad_parent_element,l_groupingNS,l_groupingTagName,l_child_element);
5708 exploreTree(p_new_template_id, p_new_document_name, l_child_element,l_child_node,l_grouping_tag,l_old_switcher_id);
5709
5710 ELSE
5711
5712 IF (l_grouping_tag IS NULL) THEN
5713 jdr_docbuilder.AddChild(p_jrad_parent_element,l_child_element);
5714 exploreTree(p_new_template_id, p_new_document_name, l_child_element,l_child_node,l_grouping_tag,l_old_switcher_id);
5715 ELSE
5716 exploreTree(p_new_template_id, p_new_document_name, p_jrad_parent_element,l_child_node,l_grouping_tag,l_old_switcher_id);
5717 END IF;
5718
5719 END IF;
5720
5721 END LOOP;
5722 END IF;
5723 END exploreTree;
5724
5725 ---------------------
5726 PROCEDURE replace_global_ids_in_XML (p_template_id IN NUMBER,
5727 p_new_template_id IN NUMBER,
5728 p_old_document_name IN VARCHAR2,
5729 p_new_document_name IN VARCHAR2,
5730 x_return_status OUT NOCOPY VARCHAR2,
5731 x_msg_count OUT NOCOPY NUMBER,
5732 x_msg_data OUT NOCOPY VARCHAR2 )
5733 IS
5734
5735 TYPE char_tbl_type IS TABLE OF VARCHAR2(255);
5736 g_toplevel_attr_tbl char_tbl_type := char_tbl_type ('version','xml:lang','xmlns:oa',
5737 'xmlns:ui','xmlns:jrad','xmlns:user','xmlns');
5738
5739 DOCUMENT_IS_NULL EXCEPTION;
5740
5741 l_lob CLOB;
5742 l_length BINARY_INTEGER;
5743 l_buffer VARCHAR2(32767);
5744 firstChunk VARCHAR2(32767);
5745 p xmlparser.parser;
5746 doc xmldom.DOMDocument;
5747 n xmldom.DOMNode;
5748 top_node xmldom.DOMNODE;
5749 nnm xmldom.DOMNamedNodeMap;
5750 attrname VARCHAR2(255);
5751 attrval VARCHAR2(4000); -- jdr_attributes.att_value
5752 name_space VARCHAR2(255);
5753 tag_name VARCHAR2(255);
5754 l_doc jdr_docbuilder.DOCUMENT;
5755 top_element jdr_docbuilder.ELEMENT;
5756 jrad_save_status PLS_INTEGER;
5757 g_jrad_trans_list jdr_utils.translationlist := jdr_utils.translationlist();
5758 l_exportfinished BOOLEAN;
5759 BEGIN
5760 FND_MSG_PUB.initialize;
5761 x_return_status := FND_API.G_RET_STS_SUCCESS;
5762 jdr_docbuilder.refresh;
5763
5764 IF (p_old_document_name IS NULL) THEN
5765 RAISE DOCUMENT_IS_NULL;
5766 END IF;
5767
5768 g_element_type_tbl.DELETE;
5769
5770 FOR i in (SELECT persistent_element_id,
5771 element_type,
5772 decode(element_type,
5773 552, G_UI_ACTION_TYPE,
5774 8, G_INTL_TEXT_TYPE,
5775 G_RULE_TYPE) entity_type
5779 AND deleted_flag = '0')
5776 FROM cz_ui_template_elements
5777 WHERE template_id = p_template_id
5778 AND ui_def_Id = 0
5780 LOOP
5781 -- Populate the table as follows
5782 -- R12345 => 33
5783 -- R64354 => 34
5784 -- T12345 => 8
5785 -- We need to use the prefixes (R,T,A) because the rule_ids, text_ids and action_ids can clash
5786 -- We use the following table for two purposes
5787 -- 1. To determine if an id found in the XML has a representation in cz_ui_template_elements
5788 -- If it does, we copy the cz_ui_tempalte_elements record. If it does not, then the id is
5789 -- probably a seeded id and we wont create a cz_ui_template_elements record for it.
5790 -- 2. In case of a UI Condition, to find the rule_type which can be 33 or 34.
5791 g_element_type_tbl(i.entity_type || TO_CHAR(i.persistent_element_id)) := i.element_type;
5792 END LOOP;
5793
5794
5795
5796 SYS.DBMS_LOB.CREATETEMPORARY(l_lob,TRUE,dbms_lob.session);
5797 SYS.DBMS_LOB.OPEN (l_lob,DBMS_LOB.LOB_READWRITE);
5798 firstChunk := jdr_utils.EXPORTDOCUMENT(p_old_document_name,l_exportfinished);
5799
5800 IF (firstChunk IS NULL) THEN
5801 RAISE DOCUMENT_IS_NULL;
5802 END IF;
5803
5804 l_buffer := LTRIM(RTRIM(firstChunk));
5805 l_length := LENGTH(l_buffer);
5806 BEGIN
5807 SYS.DBMS_LOB.writeappend(l_lob,l_length,l_buffer);
5808 EXCEPTION WHEN OTHERS THEN
5809 NULL;
5810 END;
5811
5812 LOOP
5813 l_buffer := jdr_utils.EXPORTDOCUMENT(NULL,l_exportfinished);
5814 l_buffer := LTRIM(RTRIM(l_buffer));
5815
5816 EXIT WHEN l_buffer IS NULL;
5817 l_length := LENGTH(l_buffer);
5818 SYS.DBMS_LOB.writeappend(l_lob,l_length,l_buffer);
5819 END LOOP;
5820
5821 l_length := SYS.DBMS_LOB.getlength(l_lob);
5822 p := xmlparser.newParser;
5823 xmlparser.parseCLOB(p,l_lob);
5824 doc := xmlparser.getDocument(p);
5825
5826 SYS.DBMS_LOB.CLOSE (l_lob);
5827 SYS.DBMS_LOB.FREETEMPORARY(l_lob);
5828
5829 l_doc := jdr_docbuilder.createDocument(p_new_document_name);
5830 top_node := xmldom.makeNode(xmldom.getDocumentElement(doc));
5831
5832 IF (g_toplevel_attr_tbl.COUNT > 0) THEN
5833 FOR I IN g_toplevel_attr_tbl.FIRST..g_toplevel_attr_tbl.LAST
5834 LOOP
5835 begin
5836 xmldom.removeAttribute(xmldom.makeElement(top_node),g_toplevel_attr_tbl(i));
5837 exception
5838 when others then
5839 NULL;
5840 end;
5841 END LOOP;
5842 END IF;
5843
5844 name_space:=SUBSTR(xmldom.getNodeName(top_node),1,INSTR(xmldom.getNodeName(top_node),':'));
5845 tag_name :=SUBSTR(xmldom.getNodeName(top_node),INSTR(xmldom.getNodeName(top_node),':')+1);
5846 top_element := createElement(name_space,tag_name);
5847 nnm := xmldom.getAttributes(top_node);
5848
5849 IF (xmldom.isNull(nnm) = FALSE) then
5850 l_length := xmldom.getLength(nnm);
5851 FOR i in 0..l_length-1
5852 LOOP
5853 n := xmldom.item(nnm, i);
5854 attrname := xmldom.getNodeName(n);
5855 attrval := xmldom.getNodeValue(n);
5856 IF( attrname = 'user:attribute10' ) THEN
5857 -- Have to check for user:attribute3
5858 attrval := replace_global_ids(attrval, p_new_template_id);
5859 END IF;
5860 jdr_docbuilder.setAttribute(top_element,attrname,attrval);
5861 END LOOP;
5862 END IF;
5863
5864 jdr_docbuilder.setTopLevelElement(l_doc,top_element);
5865
5866 g_attribute_map.DELETE;
5867
5868 exploreTree(p_new_template_id, p_new_document_name, top_element, top_node,'',' ');
5869
5870 jrad_save_status := jdr_docbuilder.SAVE;
5871 xmlparser.freeParser(p);
5872 g_jrad_trans_list := jdr_utils.translationList();
5873 g_jrad_trans_list := jdr_utils.getTranslations(p_old_document_name);
5874 IF (g_jrad_trans_list IS NOT NULL) THEN
5875 jdr_utils.saveTranslations(p_new_document_name,g_jrad_trans_list);
5876 END IF;
5877 jdr_docbuilder.refresh;
5878 EXCEPTION
5879 WHEN DOCUMENT_IS_NULL THEN
5880 NULL;
5881
5882 WHEN COPY_RULE_FAILURE THEN
5883 x_return_status := FND_API.G_RET_STS_ERROR;
5884 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5885 p_data => x_msg_data);
5886 RAISE;
5887 WHEN OTHERS THEN
5888 x_return_status := FND_API.G_RET_STS_ERROR;
5889 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5890 p_data => x_msg_data);
5891 RAISE;
5892 END replace_global_ids_in_XML ;
5893
5894 --------------------------------------------------------
5895 PROCEDURE copy_ui_template
5896 (
5897 p_template_id IN NUMBER,
5898 p_encl_folder_id IN NUMBER,
5899 x_new_template_id OUT NOCOPY NUMBER,
5900 x_return_status OUT NOCOPY VARCHAR2,
5901 x_msg_count OUT NOCOPY NUMBER,
5902 x_msg_data OUT NOCOPY VARCHAR2
5903 ) IS
5904
5905 -- l_api_version CONSTANT NUMBER := 1.0;
5906 -- l_api_name CONSTANT VARCHAR2(30) := 'copy_ui_template';
5907 l_jrad_doc CZ_UI_TEMPLATES.jrad_doc%TYPE;
5911 l_title_id NUMBER;
5908 l_copied_jrad_doc CZ_UI_TEMPLATES.jrad_doc%TYPE;
5909 INVALID_TEMPLATE_ID_EXCP EXCEPTION;
5910 l_name cz_rp_entries.name%TYPE;
5912 l_main_message_id NUMBER;
5913 l_old_title_id NUMBER;
5914 l_old_main_message_id NUMBER;
5915 l_index NUMBER;
5916 l_template_type NUMBER;
5917 l_template_name cz_ui_templates.template_name%TYPE;
5918 l_templates cz_security_pvt.number_type_tbl;
5919 l_locked_templates cz_security_pvt.number_type_tbl;
5920 l_return_status VARCHAR2(1);
5921 l_msg_count NUMBER;
5922 l_msg_data VARCHAR2(2000);
5923 FAILED_TO_LOCK_UCT EXCEPTION;
5924
5925 BEGIN
5926 SELECT jrad_doc, template_name, template_type
5927 INTO l_jrad_doc, l_template_name, l_template_type
5928 FROM CZ_UI_TEMPLATES
5929 WHERE ui_def_id=0 AND template_id=p_template_id;
5930
5931 l_templates(1) := p_template_id;
5932 cz_security_pvt.lock_template(
5933 p_api_version => 1.0,
5934 p_templates_to_lock => l_templates,
5935 p_commit_flag => FND_API.G_FALSE,
5936 p_init_msg_list => FND_API.G_FALSE,
5937 x_locked_templates => l_locked_templates,
5938 x_return_status => x_return_status,
5939 x_msg_count => x_msg_count,
5940 x_msg_data => x_msg_data);
5941 IF ( x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5942 RAISE FAILED_TO_LOCK_UCT;
5943 END IF;
5944 x_new_template_id := allocateId('CZ_UI_TEMPLATES_S');
5945 l_name := copy_name(p_template_id,'UCT');
5946
5947 -- The jrad_doc is broken up into pieces (paths and fileName) and saved in
5948 -- jdr_paths.path_name. jdr_paths.path_name is a varchar2(60) type. So the fileName
5949 -- cannot exceed 60 characters. So we cannot keep adding the template_id
5950 -- to the jrad_doc on every copy. We will create the fileName just like Developer
5951 -- does <template_id>_<template_type>
5952
5953 -- look for the last '/'
5954 l_index := INSTR(l_jrad_doc, '/', -1);
5955
5956 l_copied_jrad_doc := SUBSTR(l_jrad_doc, 1, l_index)
5957 || TO_CHAR(x_new_template_id) || '_' || TO_CHAR(l_template_type);
5958
5959 -- Copy corresponding JRAD document
5960
5961 replace_global_ids_in_XML (p_template_id,
5962 x_new_template_id,
5963 l_jrad_doc,
5964 l_copied_jrad_doc,
5965 x_return_status,
5966 x_msg_count,
5967 x_msg_data);
5968
5969 INSERT INTO CZ_UI_TEMPLATES(
5970 TEMPLATE_ID
5971 ,UI_DEF_ID
5972 ,TEMPLATE_NAME
5973 ,TEMPLATE_TYPE
5974 ,TEMPLATE_DESC
5975 ,PARENT_CONTAINER_TYPE
5976 ,JRAD_DOC
5977 ,BUTTON_BAR_TEMPLATE_ID
5978 ,MESSAGE_TYPE
5979 ,MAIN_MESSAGE_ID
5980 ,TITLE_ID
5981 ,DELETED_FLAG
5982 ,SEEDED_FLAG
5983 ,LAYOUT_UI_STYLE
5984 ,ROOT_REGION_TYPE
5985 ,BUTTON_BAR_TEMPL_UIDEF_ID
5986 ,ROOT_ELEMENT_SIGNATURE_ID
5987 ,AMN_USAGE
5988 )
5989 SELECT
5990 x_new_template_id
5991 ,UI_DEF_ID
5992 ,l_name
5993 ,TEMPLATE_TYPE
5994 ,TEMPLATE_DESC
5995 ,PARENT_CONTAINER_TYPE
5996 ,l_copied_jrad_doc
5997 ,BUTTON_BAR_TEMPLATE_ID
5998 ,MESSAGE_TYPE
5999 ,MAIN_MESSAGE_ID
6000 ,TITLE_ID
6001 ,DELETED_FLAG
6002 ,'0'
6003 ,LAYOUT_UI_STYLE
6004 ,ROOT_REGION_TYPE
6005 ,BUTTON_BAR_TEMPL_UIDEF_ID
6006 ,ROOT_ELEMENT_SIGNATURE_ID
6007 ,AMN_USAGE
6008 FROM CZ_UI_TEMPLATES
6009 WHERE ui_def_id=0 AND template_id = p_template_id;
6010
6011 IF SQL%ROWCOUNT = 0 THEN
6012 RAISE INVALID_TEMPLATE_ID_EXCP;
6013 END IF;
6014
6015 -----create new title id and main message id fix for bug# 3939234
6016 SELECT title_id, main_message_id
6017 INTO l_old_title_id, l_old_main_message_id
6018 FROM cz_ui_templates
6019 WHERE template_id = p_template_id
6020 AND ui_def_id = 0;
6021
6022 IF (l_old_title_id IS NOT NULL) THEN
6023 l_title_id := copy_INTL_TEXT(l_old_title_id);
6024 END IF;
6025
6026 IF (l_old_main_message_id IS NOT NULL) THEN
6027 l_main_message_id := copy_INTL_TEXT(l_old_main_message_id);
6028 END IF;
6029
6030 UPDATE cz_ui_templates
6031 SET title_id = l_title_id,
6032 main_message_id = l_main_message_id
6033 WHERE template_id = x_new_template_id
6034 AND ui_def_id = 0;
6035
6036
6037 -- Create Template Refs
6038
6039 INSERT INTO CZ_UI_REF_TEMPLATES
6043 ,DELETED_FLAG
6040 (
6041 TEMPLATE_ID
6042 ,REF_TEMPLATE_ID
6044 ,TEMPLATE_UI_DEF_ID
6045 ,REF_TEMPLATE_UI_DEF_ID
6046 ,SEEDED_FLAG
6047 ,REF_TEMPL_SEEDED_FLAG
6048 ,REF_COUNT
6049 )
6050 SELECT
6051 x_new_template_id
6052 ,REF_TEMPLATE_ID
6053 ,DELETED_FLAG
6054 ,0
6055 ,REF_TEMPLATE_UI_DEF_ID
6056 ,'0'
6057 ,REF_TEMPL_SEEDED_FLAG
6058 ,REF_COUNT
6059 FROM CZ_UI_REF_TEMPLATES
6060 WHERE template_id=p_template_id AND
6061 template_ui_def_id=0 AND
6062 deleted_flag='0';
6063
6064 --Create Repository Entry
6065
6066 INSERT INTO CZ_RP_ENTRIES
6067 (
6068 OBJECT_TYPE
6069 ,OBJECT_ID
6070 ,ENCLOSING_FOLDER
6071 ,NAME
6072 ,DESCRIPTION
6073 ,NOTES
6074 ,SEEDED_FLAG
6075 ,DELETED_FLAG
6076 )
6077 SELECT
6078 OBJECT_TYPE
6079 ,x_new_template_id
6080 ,p_encl_folder_id
6081 ,l_name
6082 ,DESCRIPTION
6083 ,NOTES
6084 ,'0'
6085 ,DELETED_FLAG
6086 FROM CZ_RP_ENTRIES
6087 WHERE object_id= p_template_id AND object_type='UCT'
6088 AND deleted_flag='0';
6089
6090 IF SQL%ROWCOUNT = 0 THEN
6091 RAISE INVALID_TEMPLATE_ID_EXCP;
6092 END IF;
6093 IF ( l_locked_templates.COUNT > 0 ) THEN
6094 cz_security_pvt.unlock_template(
6095 p_api_version => 1.0,
6096 p_templates_to_unlock => l_locked_templates,
6097 p_commit_flag => FND_API.G_FALSE,
6098 p_init_msg_list => FND_API.G_FALSE,
6099 x_return_status => x_return_status,
6100 x_msg_count => x_msg_count,
6101 x_msg_data => x_msg_data);
6102 END IF;
6103 x_return_status := FND_API.G_RET_STS_SUCCESS;
6104 EXCEPTION
6105 WHEN INVALID_TEMPLATE_ID_EXCP THEN
6106 handle_Error(p_message_name => 'CZ_COPY_UCT_INV_ID',
6107 p_token_name1 => 'OBJID',
6108 p_token_value1 => TO_CHAR(p_template_id),
6109 x_return_status => x_return_status,
6110 x_msg_count => x_msg_count,
6111 x_msg_data => x_msg_data);
6112 WHEN FAILED_TO_LOCK_UCT THEN
6113 x_return_status := FND_API.G_RET_STS_ERROR;
6114 add_error_message(p_message_name => 'CZ_CP_CANNOT_LOC_UCT',
6115 p_token_name1 => 'UICTNAME',
6116 p_token_value1 => l_template_name);
6117 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
6118 p_data => x_msg_data);
6119 WHEN OTHERS THEN
6120 handle_Error(p_procedure_name => 'copy_ui_template',
6121 p_error_message => SQLERRM,
6122 x_return_status => x_return_status,
6123 x_msg_count => x_msg_count,
6124 x_msg_data => x_msg_data);
6125 IF ( l_locked_templates.COUNT > 0 ) THEN
6126 cz_security_pvt.unlock_template(p_api_version => 1.0,
6127 p_templates_to_unlock => l_locked_templates,
6128 p_commit_flag => FND_API.G_FALSE,
6129 p_init_msg_list => FND_API.G_FALSE,
6130 x_return_status => l_return_status,
6131 x_msg_count => l_msg_count,
6132 x_msg_data => l_msg_data);
6133
6134 -- propogate the status from unlock template only in case of an error during unlock
6135 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6136 x_return_status := l_return_status;
6137 x_msg_count := l_msg_count;
6138 x_msg_data := l_msg_data;
6139 END IF;
6140
6141 END IF;
6142 END copy_ui_template;
6143
6144 ----------------------------------------------------------------------
6145 PROCEDURE copy_ui_master_template
6146 (
6147 p_ui_def_id IN NUMBER,
6148 p_encl_folder_id IN NUMBER,
6149 x_new_ui_def_id OUT NOCOPY NUMBER,
6150 x_return_status OUT NOCOPY VARCHAR2,
6151 x_msg_count OUT NOCOPY NUMBER,
6152 x_msg_data OUT NOCOPY VARCHAR2
6153 ) IS
6154
6155 l_api_version CONSTANT NUMBER := 1.0;
6156 l_api_name CONSTANT VARCHAR2(30) := 'copy_ui_master_template';
6157 INVALID_UIDEF_ID_EXCP EXCEPTION;
6158 l_name cz_rp_entries.name%TYPE;
6159
6160 BEGIN
6161 x_new_ui_def_id := allocateId('CZ_UI_DEFS_S');
6162 l_name := copy_name(p_ui_def_id,'UMT');
6163 INSERT INTO CZ_UI_DEFS(
6164 UI_DEF_ID
6165 ,DESC_TEXT
6166 ,NAME
6167 ,DEVL_PROJECT_ID
6168 ,COMPONENT_ID
6169 ,TREE_SEQ
6170 ,DELETED_FLAG
6171 ,EFF_FROM
6172 ,EFF_TO
6173 ,SECURITY_MASK
6174 ,EFF_MASK
6178 ,GEN_HEADER
6175 ,UI_STYLE
6176 ,GEN_VERSION
6177 ,TREENODE_DISPLAY_SOURCE
6179 ,LOOK_AND_FEEL
6180 ,CONTROLS_PER_SCREEN
6181 ,PRIMARY_NAVIGATION
6182 ,PERSISTENT_UI_DEF_ID
6183 ,MODEL_TIMESTAMP
6184 ,UI_STATUS
6185 ,PAGE_SET_ID
6186 ,START_PAGE_ID
6187 ,ERR_RUN_ID
6188 ,START_URL
6189 ,PAGE_LAYOUT
6190 ,PRICE_UPDATE
6191 ,SEEDED_FLAG
6192 ,MASTER_TEMPLATE_FLAG
6193 ,PRICE_DISPLAY
6194 ,FROM_MASTER_TEMPLATE_ID
6195 ,PAGIN_MAXCONTROLS
6196 ,PAGIN_NONINST
6197 ,PAGIN_NONINST_REFCOMP
6198 ,CONTROL_LAYOUT
6199 ,PAGIN_DRILLDOWNCTRL
6200 ,OUTER_TEMPLATE_USAGE
6201 ,PAGIN_BOMOC
6202 ,BOMUI_LAYOUT
6203 ,BOMQTYINPUTCTRLS
6204 ,CTRLTEMPLUSE_BOM
6205 ,CTRLTEMPLUSE_NONBOM
6206 ,NONBOM_UILAYOUT
6207 ,CTRLTEMPLUSE_COMMON
6208 ,CTRLTEMPLUSE_REQDMSG
6209 ,CTRLTEMPLUSE_OPTMSG
6210 ,MENU_CAPTION_RULE_ID
6211 ,PAGE_CAPTION_RULE_ID
6212 ,PRESERVE_MODEL_HIERARCHY
6213 ,EMPTY_UI_FLAG
6214 ,SHOW_TRAIN
6215 ,PAGINATION_SLOT
6216 ,DRILLDOWN_CONTROL_TEXT_ID
6217 ,DRILLDOWN_IMAGE_URL
6218 ,ROWS_PER_TABLE
6219 ,CTRLTEMPLATEUSE_BUTTONBAR
6220 ,CTRLTEMPLATEUSE_UTILITYPAGE
6221 ,OPTION_SORT_SELECT_FIRST
6222 ,OPTION_SORT_ORDER
6223 ,OPTION_SORT_METHOD
6224 ,OPTION_SORT_PROPERTY_ID
6225 ,SHOW_ALL_NODES_FLAG
6226 )
6227 SELECT
6228 x_new_ui_def_id
6229 ,DESC_TEXT
6230 ,l_name
6231 ,DEVL_PROJECT_ID
6232 ,COMPONENT_ID
6233 ,TREE_SEQ
6234 ,DELETED_FLAG
6235 ,EFF_FROM
6236 ,EFF_TO
6237 ,SECURITY_MASK
6238 ,EFF_MASK
6239 ,UI_STYLE
6240 ,GEN_VERSION
6241 ,TREENODE_DISPLAY_SOURCE
6242 ,GEN_HEADER
6243 ,LOOK_AND_FEEL
6244 ,CONTROLS_PER_SCREEN
6245 ,PRIMARY_NAVIGATION
6246 ,PERSISTENT_UI_DEF_ID
6247 ,MODEL_TIMESTAMP
6248 ,UI_STATUS
6249 ,PAGE_SET_ID
6250 ,START_PAGE_ID
6251 ,ERR_RUN_ID
6252 ,START_URL
6253 ,PAGE_LAYOUT
6254 ,PRICE_UPDATE
6255 ,'0'
6256 ,MASTER_TEMPLATE_FLAG
6257 ,PRICE_DISPLAY
6258 ,FROM_MASTER_TEMPLATE_ID
6259 ,PAGIN_MAXCONTROLS
6260 ,PAGIN_NONINST
6261 ,PAGIN_NONINST_REFCOMP
6262 ,CONTROL_LAYOUT
6263 ,PAGIN_DRILLDOWNCTRL
6264 ,OUTER_TEMPLATE_USAGE
6265 ,PAGIN_BOMOC
6266 ,BOMUI_LAYOUT
6267 ,BOMQTYINPUTCTRLS
6268 ,CTRLTEMPLUSE_BOM
6269 ,CTRLTEMPLUSE_NONBOM
6270 ,NONBOM_UILAYOUT
6271 ,CTRLTEMPLUSE_COMMON
6272 ,CTRLTEMPLUSE_REQDMSG
6273 ,CTRLTEMPLUSE_OPTMSG
6274 ,MENU_CAPTION_RULE_ID
6275 ,PAGE_CAPTION_RULE_ID
6276 ,PRESERVE_MODEL_HIERARCHY
6277 ,EMPTY_UI_FLAG
6278 ,SHOW_TRAIN
6279 ,PAGINATION_SLOT
6280 ,DRILLDOWN_CONTROL_TEXT_ID
6281 ,DRILLDOWN_IMAGE_URL
6282 ,ROWS_PER_TABLE
6283 ,CTRLTEMPLATEUSE_BUTTONBAR
6284 ,CTRLTEMPLATEUSE_UTILITYPAGE
6285 ,OPTION_SORT_SELECT_FIRST
6286 ,OPTION_SORT_ORDER
6287 ,OPTION_SORT_METHOD
6288 ,OPTION_SORT_PROPERTY_ID
6289 ,SHOW_ALL_NODES_FLAG
6290 FROM CZ_UI_DEFS
6291 WHERE ui_def_id = p_ui_def_id;
6292
6293 IF SQL%ROWCOUNT = 0 THEN
6294 RAISE INVALID_UIDEF_ID_EXCP;
6295 END IF;
6296
6297 -- Create ui content type templates for this newly copied ui def
6298
6299 INSERT INTO CZ_UI_CONT_TYPE_TEMPLS(
6300 UI_DEF_ID
6301 ,CONTENT_TYPE
6302 ,TEMPLATE_ID
6303 ,DELETED_FLAG
6304 ,MASTER_TEMPLATE_FLAG
6305 ,SEEDED_FLAG
6306 ,TEMPLATE_UI_DEF_ID
6307 ,WRAP_TEMPLATE_FLAG
6308 )
6309 SELECT
6310 x_new_ui_def_id
6311 ,CONTENT_TYPE
6312 ,TEMPLATE_ID
6313 ,DELETED_FLAG
6314 ,MASTER_TEMPLATE_FLAG
6315 ,'0'
6316 ,TEMPLATE_UI_DEF_ID
6317 ,WRAP_TEMPLATE_FLAG
6318 FROM CZ_UI_CONT_TYPE_TEMPLS
6319 WHERE ui_def_id = p_ui_def_id;
6320
6321 -- Create ui images for this newly copied ui def
6322 INSERT INTO CZ_UI_IMAGES
6323 (
6324 UI_DEF_ID
6325 ,MASTER_TEMPLATE_FLAG
6326 ,IMAGE_USAGE_CODE
6327 ,IMAGE_FILE
6328 ,DELETED_FLAG
6329 ,SEEDED_FLAG
6330 ,ENTITY_CODE
6331 )
6332 SELECT
6333 x_new_ui_def_id
6334 ,MASTER_TEMPLATE_FLAG
6335 ,IMAGE_USAGE_CODE
6336 ,IMAGE_FILE
6337 ,DELETED_FLAG
6338 ,'0'
6339 ,ENTITY_CODE
6340 FROM CZ_UI_IMAGES
6341 WHERE ui_def_id = p_ui_def_id AND deleted_flag='0';
6342
6343 --Create Repository Entry
6344
6345 INSERT INTO CZ_RP_ENTRIES
6346 (
6347 OBJECT_TYPE
6348 ,OBJECT_ID
6349 ,ENCLOSING_FOLDER
6350 ,NAME
6354 ,DELETED_FLAG
6351 ,DESCRIPTION
6352 ,NOTES
6353 ,SEEDED_FLAG
6355 )
6356 SELECT
6357 OBJECT_TYPE
6358 ,x_new_ui_def_id
6359 ,p_encl_folder_id
6360 ,l_name
6361 ,DESCRIPTION
6362 ,NOTES
6363 ,'0'
6364 ,DELETED_FLAG
6365 FROM CZ_RP_ENTRIES
6366 WHERE object_id= p_ui_def_id AND object_type='UMT'
6367 AND deleted_flag='0';
6368
6369 IF SQL%ROWCOUNT = 0 THEN
6370 RAISE INVALID_UIDEF_ID_EXCP;
6371 END IF;
6372
6373 x_return_status := FND_API.G_RET_STS_SUCCESS;
6374
6375 EXCEPTION
6376 WHEN INVALID_UIDEF_ID_EXCP THEN
6377 handle_Error(p_message_name => 'CZ_COPY_UMT_INV_ID',
6378 p_token_name1 => 'OBJID',
6379 p_token_value1 => TO_CHAR(p_ui_def_id),
6380 x_return_status => x_return_status,
6381 x_msg_count => x_msg_count,
6382 x_msg_data => x_msg_data);
6383
6384 WHEN OTHERS THEN
6385 handle_Error(p_procedure_name => 'copy_ui_master_template',
6386 p_error_message => SQLERRM,
6387 x_return_status => x_return_status,
6388 x_msg_count => x_msg_count,
6389 x_msg_data => x_msg_data);
6390 END copy_ui_master_template;
6391
6392 -------------------delete API(s)
6393 --------is effset deletable
6394 PROCEDURE is_eff_set_deleteable(p_eff_set_id IN NUMBER,
6395 x_return_status OUT NOCOPY VARCHAR2,
6396 x_msg_count OUT NOCOPY NUMBER,
6397 x_msg_data OUT NOCOPY VARCHAR2)
6398 IS
6399
6400 TYPE prj_name_tbl_type IS TABLE of cz_devl_projects.name%TYPE INDEX BY BINARY_INTEGER;
6401 l_prj_name_tbl prj_name_tbl_type;
6402
6403 l_eff_set_id NUMBER;
6404 l_eff_name VARCHAR2(255);
6405
6406 BEGIN
6407 FND_MSG_PUB.initialize;
6408 x_return_status := FND_API.G_RET_STS_SUCCESS;
6409 x_msg_count := 0;
6410 x_msg_data := '';
6411
6412 ----check if eff set exists
6413 SELECT object_id,name
6414 INTO l_eff_set_id,l_eff_name
6415 FROM cz_rp_entries
6416 WHERE cz_rp_entries.object_id = p_eff_set_id
6417 AND cz_rp_entries.object_type = 'EFF'
6418 AND cz_rp_entries.deleted_flag = '0'
6419 AND cz_rp_entries.seeded_flag <> '1';
6420
6421 SELECT name BULK COLLECT INTO l_prj_name_tbl
6422 FROM cz_devl_projects
6423 WHERE deleted_flag = '0' AND devl_project_id IN
6424 (SELECT devl_project_id FROM cz_rules
6425 WHERE effectivity_set_id = p_eff_set_id
6426 AND deleted_flag = '0'
6427 UNION ALL
6428 SELECT devl_project_id FROM cz_ps_nodes
6429 WHERE effectivity_set_id = p_eff_set_id
6430 AND deleted_flag = '0');
6431
6432 IF l_prj_name_tbl.COUNT > 0 THEN
6433 x_return_status := FND_API.G_RET_STS_ERROR;
6434 FOR i IN l_prj_name_tbl.FIRST..l_prj_name_tbl.LAST
6435 LOOP
6436 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEV_UTILS_EFF_SET_IN_USE');
6437 FND_MESSAGE.SET_TOKEN('EFFSETNAME', l_eff_name);
6438 FND_MESSAGE.SET_TOKEN('MODELNAME', l_prj_name_tbl(i));
6439 FND_MSG_PUB.ADD;
6440 END LOOP;
6441 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
6442 p_data => x_msg_data);
6443 END IF;
6444 EXCEPTION
6445 WHEN NO_DATA_FOUND THEN
6446 NULL;
6447 WHEN OTHERS THEN
6448 handle_Error(p_procedure_name => 'is_eff_set_deleteable',
6449 p_error_message => SQLERRM,
6450 x_return_status => x_return_status,
6451 x_msg_count => x_msg_count,
6452 x_msg_data => x_msg_data);
6453 END is_eff_set_deleteable;
6454
6455 --------------------------------------------
6456 ---- delete effectivity sets
6457 PROCEDURE delete_eff_set(p_eff_set_id IN NUMBER,
6458 x_return_status OUT NOCOPY VARCHAR2,
6459 x_msg_count OUT NOCOPY NUMBER,
6460 x_msg_data OUT NOCOPY VARCHAR2)
6461 IS
6462
6463 l_return_status VARCHAR2(1);
6464 l_msg_count NUMBER;
6465 l_msg_data VARCHAR2(2000);
6466
6467 BEGIN
6468 FND_MSG_PUB.initialize;
6469 x_return_status := FND_API.G_RET_STS_SUCCESS;
6470 x_msg_count := 0;
6471 x_msg_data := '';
6472
6473 is_eff_set_deleteable(p_eff_set_id,l_return_status,l_msg_count,l_msg_data);
6474 IF (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
6475 UPDATE cz_effectivity_sets
6476 SET deleted_flag = '1',
6477 name = append_name(p_eff_set_id, 'EFF', name)
6478 WHERE effectivity_set_id = p_eff_set_id;
6479
6480 UPDATE cz_rp_entries
6481 SET deleted_flag = '1',
6482 name = append_name(p_eff_set_id, 'EFF', name)
6483 WHERE object_id = p_eff_set_id
6484 AND object_type = 'EFF';
6485 ELSE
6486 x_return_status := l_return_status;
6487 x_msg_count := l_msg_count;
6488 x_msg_data := l_msg_data;
6489 END IF;
6490 EXCEPTION
6491 WHEN OTHERS THEN
6492 handle_Error(p_procedure_name => 'delete_eff_set',
6493 p_error_message => SQLERRM,
6494 x_return_status => x_return_status,
6495 x_msg_count => x_msg_count,
6496 x_msg_data => x_msg_data);
6497 END delete_eff_set;
6501 -------can delete archive
6498
6499 -------------------------------------------
6500 -----------------------------------------------
6502 PROCEDURE is_archive_deleteable(p_archive_id IN NUMBER,
6503 x_return_status OUT NOCOPY VARCHAR2,
6504 x_msg_count OUT NOCOPY NUMBER,
6505 x_msg_data OUT NOCOPY VARCHAR2)
6506 IS
6507
6508 l_devl_project_tbl t_indexes;
6509 l_object_id cz_rp_entries.object_id%TYPE;
6510 l_object_name cz_rp_entries.name%TYPE;
6511 l_seeded_flag cz_rp_entries.seeded_flag%TYPE;
6512 l_devl_name cz_devl_projects.name%TYPE;
6513 BEGIN
6514 FND_MSG_PUB.initialize;
6515 x_return_status := FND_API.G_RET_STS_SUCCESS;
6516 x_msg_count := 0;
6517 x_msg_data := '';
6518
6519 ----check if archive exists
6520 BEGIN
6521 SELECT object_id,name,seeded_flag
6522 INTO l_object_id,l_object_name,l_seeded_flag
6523 FROM cz_rp_entries
6524 WHERE cz_rp_entries.object_id = p_archive_id
6525 AND cz_rp_entries.object_type = 'ARC'
6526 AND cz_rp_entries.deleted_flag = '0';
6527 EXCEPTION
6528 WHEN NO_DATA_FOUND THEN
6529 l_object_id := -1;
6530 END;
6531
6532 IF (l_object_id = -1) THEN
6533 RAISE OBJECT_NOT_FOUND;
6534 END IF;
6535
6536 IF (l_seeded_flag = '1') THEN
6537 RAISE SEEDED_OBJ_EXCEP;
6538 END IF;
6539
6540 l_devl_project_tbl.DELETE;
6541 SELECT DISTINCT devl_project_id
6542 BULK
6543 COLLECT
6544 INTO l_devl_project_tbl
6545 FROM cz_archive_refs
6546 WHERE cz_archive_refs.archive_id = p_archive_id
6547 AND cz_archive_refs.deleted_flag = '0'
6548 AND cz_archive_refs.devl_project_id IN (SELECT object_id
6549 FROM cz_rp_entries
6550 WHERE object_type = 'PRJ'
6551 AND deleted_flag = '0');
6552
6553 IF (l_devl_project_tbl.COUNT > 0) THEN
6554 x_return_status := FND_API.G_RET_STS_ERROR;
6555 FOR I IN l_devl_project_tbl.FIRST..l_devl_project_tbl.LAST
6556 LOOP
6557 x_msg_count := x_msg_count + 1;
6558 SELECT name into l_devl_name FROM cz_devl_projects WHERE devl_project_id = l_devl_project_tbl(i);
6559 handle_Error(p_message_name => 'CZ_ARC_IN_USE',
6560 p_token_name1 => 'ARCHIVENAME',
6561 p_token_value1 => l_object_name,
6562 p_token_name2 => 'MODELNAME',
6563 p_token_value2 => l_devl_name,
6564 x_return_status => x_return_status,
6565 x_msg_count => x_msg_count,
6566 x_msg_data => x_msg_data);
6567 END LOOP;
6568 END IF;
6569 EXCEPTION
6570 WHEN NO_DATA_FOUND THEN
6571 NULL;
6572 WHEN OBJECT_NOT_FOUND THEN
6573 NULL;
6574 WHEN SEEDED_OBJ_EXCEP THEN
6575 handle_Error(p_message_name => 'CZ_OBJ_SEEDED',
6576 p_token_name1 => 'NAME',
6577 p_token_value1 => l_object_name,
6578 x_return_status => x_return_status,
6579 x_msg_count => x_msg_count,
6580 x_msg_data => x_msg_data);
6581
6582 WHEN OTHERS THEN
6583 handle_Error(p_procedure_name => 'is_archive_deleteable',
6584 p_error_message => SQLERRM,
6585 x_return_status => x_return_status,
6586 x_msg_count => x_msg_count,
6587 x_msg_data => x_msg_data);
6588 END is_archive_deleteable;
6589
6590 ---------------------------------------
6591 --------delete archive
6592 PROCEDURE delete_archive(p_archive_id IN NUMBER,
6593 x_return_status OUT NOCOPY VARCHAR2,
6594 x_msg_count OUT NOCOPY NUMBER,
6595 x_msg_data OUT NOCOPY VARCHAR2)
6596 IS
6597 l_return_status VARCHAR2(1);
6598 l_msg_count NUMBER := 0;
6599 l_msg_data VARCHAR2(2000);
6600
6601 BEGIN
6602 FND_MSG_PUB.initialize;
6603 x_return_status := FND_API.G_RET_STS_SUCCESS;
6604 x_msg_count := 0;
6605 x_msg_data := '';
6606
6607 is_archive_deleteable(p_archive_id,l_return_status,l_msg_count,l_msg_data);
6608 IF (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
6609 UPDATE cz_rp_entries
6610 set deleted_flag = '1',
6611 name = append_name(p_archive_id, 'ARC', name)
6612 where object_id = p_archive_id
6613 and object_type = 'ARC'
6614 and deleted_flag = '0'
6615 and seeded_flag <> '1';
6616
6617 UPDATE cz_archives
6618 SET cz_archives.deleted_flag = '1',
6619 cz_archives.name = append_name(p_archive_id, 'ARC', name)
6620 WHERE cz_archives.archive_id = p_archive_id;
6621 ELSE
6622 x_return_status := l_return_status;
6623 x_msg_count := l_msg_count;
6624 x_msg_data := l_msg_data;
6625 END IF;
6626 EXCEPTION
6627 WHEN OTHERS THEN
6628 handle_Error(p_procedure_name => 'delete_archive',
6629 p_error_message => SQLERRM,
6630 x_return_status => x_return_status,
6631 x_msg_count => x_msg_count,
6632 x_msg_data => x_msg_data);
6633 END delete_archive;
6634
6635 ---------------------------------
6636 -----can delete property
6637 PROCEDURE is_property_deleteable (p_property_id IN NUMBER,
6638 x_return_status OUT NOCOPY VARCHAR2,
6642
6639 x_msg_count OUT NOCOPY NUMBER,
6640 x_msg_data OUT NOCOPY VARCHAR2)
6641 IS
6643 l_object_id cz_rp_entries.object_id%TYPE;
6644 l_object_name cz_rp_entries.name%TYPE;
6645 l_seeded_flag cz_rp_entries.seeded_flag%TYPE;
6646 l_ps_prop_count NUMBER := 0;
6647 l_item_prop_count NUMBER := 0;
6648 l_ui_pages_count NUMBER := 0;
6649 l_prop_count NUMBER := 0;
6650
6651 PROPERTY_IN_USE EXCEPTION;
6652
6653 BEGIN
6654 FND_MSG_PUB.initialize;
6655 x_return_status := FND_API.G_RET_STS_SUCCESS;
6656 x_msg_count := 0;
6657 x_msg_data := '';
6658
6659 ----check if prop exists
6660 BEGIN
6661 SELECT object_id,name,seeded_flag
6662 INTO l_object_id,l_object_name,l_seeded_flag
6663 FROM cz_rp_entries
6664 WHERE cz_rp_entries.object_id = p_property_id
6665 AND cz_rp_entries.object_type = 'PRP'
6666 AND cz_rp_entries.deleted_flag = '0';
6667 EXCEPTION
6668 WHEN NO_DATA_FOUND THEN
6669 l_object_id := -1;
6670 END;
6671
6672 IF (l_object_id = -1) THEN
6673 RAISE OBJECT_NOT_FOUND;
6674 END IF;
6675
6676 IF (l_seeded_flag = '1') THEN
6677 RAISE SEEDED_OBJ_EXCEP;
6678 END IF;
6679
6680
6681 BEGIN
6682 SELECT 1
6683 INTO l_prop_count
6684 FROM CZ_PSNODE_PROPVAL_V
6685 WHERE ps_node_id IN (select ps_node_id
6686 from cz_ps_nodes
6687 where cz_ps_nodes.deleted_flag = '0')
6688 AND property_id = p_property_id
6689 AND rownum < 2;
6690 EXCEPTION
6691 WHEN NO_DATA_FOUND THEN
6692 l_prop_count := 0;
6693 END;
6694 IF (l_prop_count > 0) THEN
6695 RAISE PROPERTY_IN_USE ;
6696 END IF;
6697
6698 BEGIN
6699 SELECT 1
6700 INTO l_item_prop_count
6701 FROM CZ_ITEM_TYPE_PROPERTIES
6702 WHERE item_type_id IN (select item_type_id
6703 from cz_item_types
6704 where deleted_flag = '0')
6705 AND property_id = p_property_id
6706 AND deleted_flag = '0';
6707 EXCEPTION
6708 WHEN NO_DATA_FOUND THEN
6709 l_prop_count := 0;
6710 END;
6711 IF (l_item_prop_count > 0) THEN
6712 RAISE PROPERTY_IN_USE;
6713 END IF;
6714
6715 BEGIN
6716 SELECT 1
6717 INTO l_ui_pages_count
6718 FROM CZ_UI_PAGES
6719 WHERE property_id = p_property_id
6720 AND deleted_flag = '0';
6721 EXCEPTION
6722 WHEN NO_DATA_FOUND THEN
6723 l_prop_count := 0;
6724 END;
6725 IF (l_item_prop_count > 0) THEN
6726 RAISE PROPERTY_IN_USE;
6727 END IF;
6728
6729 EXCEPTION
6730 WHEN OBJECT_NOT_FOUND THEN
6731 NULL;
6732 WHEN SEEDED_OBJ_EXCEP THEN
6733 handle_Error(p_message_name => 'CZ_OBJ_SEEDED',
6734 p_token_name1 => 'NAME',
6735 p_token_value1 => l_object_name,
6736 x_return_status => x_return_status,
6737 x_msg_count => x_msg_count,
6738 x_msg_data => x_msg_data);
6739 WHEN PROPERTY_IN_USE THEN
6740 handle_Error(p_message_name => 'CZ_PROP_IN_USE',
6741 p_token_name1 => 'NAME',
6742 p_token_value1 => l_object_name,
6743 x_return_status => x_return_status,
6744 x_msg_count => x_msg_count,
6745 x_msg_data => x_msg_data);
6746 WHEN OTHERS THEN
6747 handle_Error(p_procedure_name => 'is_property_deleteable',
6748 p_error_message => SQLERRM,
6749 x_return_status => x_return_status,
6750 x_msg_count => x_msg_count,
6751 x_msg_data => x_msg_data);
6752 END is_property_deleteable ;
6753
6754 ----------------------------------------------
6755 ------------------delete property
6756 PROCEDURE delete_property(p_property_id IN NUMBER,
6757 x_return_status OUT NOCOPY VARCHAR2,
6758 x_msg_count OUT NOCOPY NUMBER,
6759 x_msg_data OUT NOCOPY VARCHAR2)
6760 IS
6761 l_return_status VARCHAR2(1);
6762 l_msg_count NUMBER := 0;
6763 l_msg_data VARCHAR2(2000);
6764
6765 BEGIN
6766 FND_MSG_PUB.initialize;
6767 x_return_status := FND_API.G_RET_STS_SUCCESS;
6768 x_msg_count := 0;
6769 x_msg_data := '';
6770
6771 is_property_deleteable(p_property_id,l_return_status,l_msg_count,l_msg_data);
6772 IF (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
6773 UPDATE cz_rp_entries
6774 SET deleted_flag = '1',
6775 name = append_name(p_property_id, 'PRP', name)
6776 WHERE object_id = p_property_id
6777 AND object_type = 'PRP'
6778 AND deleted_flag = '0'
6779 AND seeded_flag <> '1';
6780
6781 UPDATE cz_properties
6782 SET cz_properties.deleted_flag = '1',
6783 cz_properties.name = append_name(p_property_id, 'PRP', name)
6784 WHERE property_id = p_property_id;
6785 ELSE
6786 x_return_status := l_return_status;
6787 x_msg_count := l_msg_count;
6788 x_msg_data := l_msg_data;
6789 END IF;
6790 EXCEPTION
6791 WHEN OTHERS THEN
6792 handle_Error(p_procedure_name => 'delete_property',
6793 p_error_message => SQLERRM,
6797 END delete_property;
6794 x_return_status => x_return_status,
6795 x_msg_count => x_msg_count,
6796 x_msg_data => x_msg_data);
6798
6799 ----can delete umt
6800 PROCEDURE is_umt_deleteable (p_umt_id IN NUMBER,
6801 x_return_status OUT NOCOPY VARCHAR2,
6802 x_msg_count OUT NOCOPY NUMBER,
6803 x_msg_data OUT NOCOPY VARCHAR2)
6804 IS
6805
6806 l_object_id cz_rp_entries.object_id%TYPE;
6807 l_object_name cz_rp_entries.name%TYPE;
6808 l_seeded_flag VARCHAR2(1);
6809 TYPE ui_name_tbl is TABLE OF VARCHAR2(255) INDEX BY BINARY_INTEGER;
6810 l_ui_name_tbl ui_name_tbl;
6811
6812 BEGIN
6813 FND_MSG_PUB.initialize;
6814 ----check if p_umt_id exists
6815 x_return_status := FND_API.G_RET_STS_SUCCESS;
6816 x_msg_count := 0;
6817 x_msg_data := '';
6818
6819 BEGIN
6820 SELECT object_id,name,seeded_flag
6821 INTO l_object_id,l_object_name,l_seeded_flag
6822 FROM cz_rp_entries
6823 WHERE cz_rp_entries.object_id = p_umt_id
6824 AND cz_rp_entries.object_type = 'UMT'
6825 AND cz_rp_entries.deleted_flag = '0';
6826 EXCEPTION
6827 WHEN NO_DATA_FOUND THEN
6828 l_object_id := -1;
6829 END;
6830 IF (l_object_id = -1) THEN
6831 RAISE OBJECT_NOT_FOUND;
6832 END IF;
6833
6834 IF (l_seeded_flag = '1') THEN
6835 RAISE SEEDED_OBJ_EXCEP;
6836 END IF;
6837
6838 BEGIN
6839 SELECT name
6840 BULK
6841 COLLECT
6842 INTO l_ui_name_tbl
6843 FROM cz_ui_defs ui
6844 WHERE from_master_template_id = p_umt_id
6845 AND deleted_flag = '0'
6846 AND seeded_flag <> '1'
6847 AND exists (SELECT 1 FROM cz_rp_entries WHERE deleted_flag = '0'
6848 AND object_id = ui.devl_project_id and object_type = 'PRJ');
6849 EXCEPTION
6850 WHEN NO_DATA_FOUND THEN
6851 l_object_id := -1;
6852 END;
6853
6854 IF (l_ui_name_tbl.count > 0 ) THEN
6855 x_return_status := FND_API.G_RET_STS_ERROR;
6856 FOR I IN l_ui_name_tbl.FIRST..l_ui_name_tbl.LAST
6857 LOOP
6858 FND_MESSAGE.SET_NAME('CZ', 'CZ_UMT_IN_USE');
6859 FND_MESSAGE.SET_TOKEN('NAME', l_object_name);
6860 FND_MESSAGE.SET_TOKEN('UI', l_ui_name_tbl(i));
6861 FND_MSG_PUB.ADD;
6862 END LOOP;
6863 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
6864 p_data => x_msg_data);
6865 END IF;
6866
6867 EXCEPTION
6868 WHEN OBJECT_NOT_FOUND THEN
6869 NULL;
6870 WHEN SEEDED_OBJ_EXCEP THEN
6871 handle_Error(p_message_name => 'CZ_OBJ_SEEDED',
6872 p_token_name1 => 'UMTNAME',
6873 p_token_value1 => l_object_name,
6874 x_return_status => x_return_status,
6875 x_msg_count => x_msg_count,
6876 x_msg_data => x_msg_data);
6877 WHEN OTHERS THEN
6878 handle_Error(p_procedure_name => 'is_umt_deleteable',
6879 p_error_message => SQLERRM,
6880 x_return_status => x_return_status,
6881 x_msg_count => x_msg_count,
6882 x_msg_data => x_msg_data);
6883 END is_umt_deleteable;
6884
6885 ------------delete umt
6886 PROCEDURE delete_umt(p_umt_id IN NUMBER,
6887 x_return_status OUT NOCOPY VARCHAR2,
6888 x_msg_count OUT NOCOPY NUMBER,
6889 x_msg_data OUT NOCOPY VARCHAR2)
6890 IS
6891
6892 l_return_status VARCHAR2(1);
6893 l_msg_count NUMBER := 0;
6894 l_msg_data VARCHAR2(2000);
6895
6896 BEGIN
6897 FND_MSG_PUB.initialize;
6898 x_return_status := FND_API.G_RET_STS_SUCCESS;
6899 x_msg_count := 0;
6900 x_msg_data := '';
6901
6902 is_umt_deleteable(p_umt_id,l_return_status,l_msg_count,l_msg_data);
6903 IF (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
6904 UPDATE cz_rp_entries
6905 SET deleted_flag = '1',
6906 name = append_name(p_umt_id, 'UMT', name)
6907 WHERE object_id = p_umt_id
6908 AND object_type = 'UMT';
6909
6910 UPDATE cz_ui_defs
6911 set deleted_flag = '1',
6912 name = append_name(p_umt_id, 'UMT', name)
6913 WHERE ui_def_id = p_umt_id
6914 AND master_template_flag = '1'
6915 AND seeded_flag <> '1';
6916 ELSE
6917 x_return_status := l_return_status;
6918 x_msg_count := l_msg_count;
6919 x_msg_data := l_msg_data;
6920 END IF;
6921 EXCEPTION
6922 WHEN OTHERS THEN
6923 handle_Error(p_procedure_name => 'delete_umt',
6924 p_error_message => SQLERRM,
6925 x_return_status => x_return_status,
6926 x_msg_count => x_msg_count,
6927 x_msg_data => x_msg_data);
6928 END delete_umt;
6929
6930 --------------------------------------------------------------------------------
6931 -- can delete uct ?
6932 PROCEDURE is_uct_deleteable(p_uct_id IN NUMBER,
6933 x_return_status OUT NOCOPY VARCHAR2,
6934 x_msg_count OUT NOCOPY NUMBER,
6935 x_msg_data OUT NOCOPY VARCHAR2)
6936 IS
6940 l_object_id cz_rp_entries.object_id%TYPE;
6937 TYPE ui_name_tbl is TABLE OF VARCHAR2(255) INDEX BY BINARY_INTEGER;
6938 TYPE num_type_tbl is TABLE OF NUMBER INDEX BY BINARY_INTEGER;
6939
6941 l_object_name cz_rp_entries.name%TYPE;
6942 l_seeded_flag VARCHAR2(1);
6943 l_ui_name_tbl ui_name_tbl;
6944 l_mt_flag_tbl ui_name_tbl;
6945 l_ref_template_tbl num_type_tbl;
6946 l_ref_templ_ui_tbl num_type_tbl;
6947 l_ref_template_name cz_ui_templates.template_name%TYPE;
6948
6949 BEGIN
6950 FND_MSG_PUB.initialize;
6951 x_return_status := FND_API.G_RET_STS_SUCCESS;
6952 x_msg_count := 0;
6953 x_msg_data := '';
6954
6955 -- check if p_uct_id exists
6956 BEGIN
6957 SELECT object_id,name,seeded_flag
6958 INTO l_object_id,l_object_name,l_seeded_flag
6959 FROM cz_rp_entries
6960 WHERE cz_rp_entries.object_id = p_uct_id
6961 AND cz_rp_entries.object_type = 'UCT'
6962 AND cz_rp_entries.deleted_flag = '0';
6963 EXCEPTION
6964 WHEN NO_DATA_FOUND THEN
6965 l_object_id := -1;
6966 END;
6967
6968 IF (l_object_id = -1) THEN
6969 RAISE OBJECT_NOT_FOUND;
6970 END IF;
6971
6972 IF (l_seeded_flag = '1') THEN
6973 RAISE SEEDED_OBJ_EXCEP;
6974 END IF;
6975
6976 l_ui_name_tbl.DELETE;
6977 BEGIN
6978 SELECT name name, master_template_flag
6979 BULK COLLECT INTO l_ui_name_tbl, l_mt_flag_tbl
6980 FROM cz_ui_defs ui
6981 WHERE deleted_flag = '0'
6982 AND ui_def_id IN
6983 (SELECT ui_def_id
6984 FROM cz_ui_cont_type_templs
6985 WHERE cz_ui_cont_type_templs.template_id = p_uct_id
6986 AND cz_ui_cont_type_templs.template_ui_def_id = 0
6987 AND cz_ui_cont_type_templs.deleted_flag = '0'
6988 UNION ALL
6989 SELECT ui_def_id
6990 FROM cz_ui_page_elements
6991 WHERE cz_ui_page_elements.ctrl_template_id = p_uct_id
6992 AND cz_ui_page_elements.ctrl_template_ui_def_id = 0
6993 AND cz_ui_page_elements.deleted_flag = '0')
6994 AND exists (SELECT 1 FROM cz_rp_entries WHERE deleted_flag = '0'
6995 AND object_id = ui.devl_project_id and object_type = 'PRJ');
6996 EXCEPTION
6997 WHEN NO_DATA_FOUND THEN
6998 l_object_id := -1;
6999 END;
7000
7001 IF (l_ui_name_tbl.count > 0 ) THEN
7002 x_return_status := FND_API.G_RET_STS_ERROR;
7003 FOR I IN l_ui_name_tbl.FIRST..l_ui_name_tbl.LAST
7004 LOOP
7005 IF l_mt_flag_tbl(i) = '1' THEN
7006 FND_MESSAGE.SET_NAME ('CZ', 'CZ_UCT_IN_USE_TEMPL');
7007 FND_MESSAGE.SET_TOKEN('NAME', l_object_name);
7008 FND_MESSAGE.SET_TOKEN('TEMPLNAME',l_ui_name_tbl(i));
7009 ELSE
7010 FND_MESSAGE.SET_NAME('CZ', 'CZ_UCT_IN_USE');
7011 FND_MESSAGE.SET_TOKEN('NAME', l_object_name);
7012 FND_MESSAGE.SET_TOKEN('UINAME', l_ui_name_tbl(i));
7013 END IF;
7014 FND_MSG_PUB.ADD;
7015 END LOOP;
7016 END IF;
7017
7018 BEGIN
7019 SELECT template_id, template_ui_def_id
7020 BULK COLLECT INTO l_ref_template_tbl, l_ref_templ_ui_tbl
7021 FROM cz_ui_ref_templates
7022 WHERE cz_ui_ref_templates.deleted_flag = '0'
7023 AND cz_ui_ref_templates.ref_template_id = p_uct_id
7024 AND cz_ui_ref_templates.ref_template_ui_def_id = 0;
7025 EXCEPTION
7026 WHEN NO_DATA_FOUND THEN
7027 NULL;
7028 END;
7029
7030 IF (l_ref_template_tbl.COUNT > 0) THEN
7031 FOR I IN l_ref_template_tbl.FIRST..l_ref_template_tbl.LAST
7032 LOOP
7033 BEGIN
7034 SELECT template_name INTO l_ref_template_name
7035 FROM cz_ui_templates
7036 WHERE cz_ui_templates.template_id = l_ref_template_tbl(i)
7037 AND cz_ui_templates.ui_def_id = l_ref_templ_ui_tbl(i)
7038 AND cz_ui_templates.deleted_flag = '0';
7039 EXCEPTION
7040 WHEN NO_DATA_FOUND THEN
7041 l_ref_template_name := NULL;
7042 END;
7043
7044 IF l_ref_template_name IS NOT NULL THEN
7045 FND_MESSAGE.SET_NAME ('CZ', 'CZ_UCT_IN_USE_TEMPL');
7046 FND_MESSAGE.SET_TOKEN('NAME', l_object_name);
7047 FND_MESSAGE.SET_TOKEN('TEMPLNAME',l_ref_template_name);
7048 FND_MSG_PUB.ADD;
7049 x_return_status := FND_API.G_RET_STS_ERROR;
7050 END IF;
7051 END LOOP;
7052 END IF;
7053 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
7054 p_data => x_msg_data);
7055 EXCEPTION
7056 WHEN OBJECT_NOT_FOUND THEN
7057 NULL;
7058 WHEN SEEDED_OBJ_EXCEP THEN
7059 handle_Error(p_message_name => 'CZ_OBJ_SEEDED',
7060 p_token_name1 => 'UCTNAME',
7061 p_token_value1 => l_object_name,
7062 x_return_status => x_return_status,
7063 x_msg_count => x_msg_count,
7064 x_msg_data => x_msg_data);
7065 WHEN OTHERS THEN
7066 handle_Error(p_procedure_name => 'is_uct_deleteable',
7067 p_error_message => SQLERRM,
7068 x_return_status => x_return_status,
7069 x_msg_count => x_msg_count,
7070 x_msg_data => x_msg_data);
7071 END is_uct_deleteable;
7072
7076 x_return_status OUT NOCOPY VARCHAR2,
7073 --------------------------------------------------------------------------------
7074 ------delete uct
7075 PROCEDURE delete_uct(p_uct_id IN NUMBER,
7077 x_msg_count OUT NOCOPY NUMBER,
7078 x_msg_data OUT NOCOPY VARCHAR2)
7079 IS
7080
7081 l_return_status VARCHAR2(1);
7082 l_msg_count NUMBER := 0;
7083 l_msg_data VARCHAR2(2000);
7084
7085 BEGIN
7086 FND_MSG_PUB.initialize;
7087 x_return_status := FND_API.G_RET_STS_SUCCESS;
7088 x_msg_count := 0;
7089 x_msg_data := '';
7090
7091 is_uct_deleteable(p_uct_id,l_return_status,l_msg_count,l_msg_data);
7092 IF (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
7093 UPDATE cz_rp_entries
7094 SET deleted_flag = '1',
7095 name = append_name(p_uct_id, 'UCT', name)
7096 WHERE object_id = p_uct_id
7097 AND object_type = 'UCT'
7098 AND seeded_flag <> '1';
7099
7100 UPDATE cz_ui_templates
7101 SET deleted_flag = '1',
7102 template_name = append_name(p_uct_id, 'UCT', template_name)
7103 WHERE template_id = p_uct_id;
7104 ELSE
7105 x_return_status := l_return_status;
7106 x_msg_count := l_msg_count;
7107 x_msg_data := l_msg_data;
7108 END IF;
7109 EXCEPTION
7110 WHEN OTHERS THEN
7111 handle_Error(p_procedure_name => 'delete_uct',
7112 p_error_message => SQLERRM,
7113 x_return_status => x_return_status,
7114 x_msg_count => x_msg_count,
7115 x_msg_data => x_msg_data);
7116 END delete_uct;
7117
7118 --------------------------------
7119 FUNCTION hextobinary (hexnum in char)
7120 RETURN VARCHAR2
7121 IS
7122 result VARCHAR2(4) :='';
7123 current_digit_dec number;
7124 BEGIN
7125 if hexnum in ('A','B','C','D','E','F','a','b','c','d','e','f') then
7126 current_digit_dec := ascii(UPPER(hexnum)) - ascii('A') + 10;
7127 else
7128 current_digit_dec := to_number(hexnum);
7129 end if;
7130 LOOP
7131 result := to_char(MOD(current_digit_dec,2))||result;
7132 current_digit_dec := trunc(current_digit_dec/2);
7133 EXIT WHEN (current_digit_dec < 1);
7134 end loop;
7135 result := LPAD(result,4,'0');
7136 return result;
7137 END;
7138 -----------------------------------
7139 FUNCTION mapHasUsageId(usageId in number, usageMap VARCHAR2)
7140 return number
7141 is
7142 l_str varchar2(1) :='';
7143 l_length number;
7144 l_hex varchar2(16) default '0123456789ABCDEF';
7145 l_bits VARCHAR2(64) := '';
7146 current_digit VARCHAR2(1);
7147 l_length1 number;
7148 begin
7149 l_length := LENGTH(usageMap);
7150 FOR I IN 1..l_length
7151 LOOP
7152 current_digit := SUBSTR(usageMap,i,1);
7153 l_length1 := LENGTH(l_bits);
7154 l_bits := l_bits||hextobinary(current_digit);
7155 END LOOP;
7156 l_str := substr(l_bits,-(usageid+1),1);
7157 IF( to_number(l_str) = 1) THEN
7158 return 1;
7159 ELSE
7160 return 0;
7161 END IF;
7162 end mapHasUsageId;
7163
7164 -------------------
7165 FUNCTION power_func (p_power IN NUMBER)
7166 RETURN number
7167 IS
7168 result number := 1;
7169 BEGIN
7170 for x in 1..p_power
7171 loop
7172 result := result*2;
7173 end loop;
7174 return result;
7175 END;
7176
7177 ----------------------------
7178 FUNCTION hextodec (hexnum in char)
7179 RETURN number
7180 IS
7181 x number;
7182 digits number;
7183 result number := 0;
7184 current_digit char(1);
7185 current_digit_dec number;
7186 BEGIN
7187 digits := length(hexnum);
7188 for x in 1..digits
7189 loop
7190 current_digit := SUBSTR(hexnum, x, 1);
7191 if current_digit in ('A','B','C','D','E','F') then
7192 current_digit_dec := ascii(current_digit) - ascii('A') + 10;
7193 else
7194 current_digit_dec := to_number(current_digit);
7195 end if;
7196 result := (result * 16) + current_digit_dec;
7197 end loop;
7198 return result;
7199 END;
7200
7201 ----------------------------
7202 FUNCTION MAP_LESS_USAGE_ID(usageId in number, usageMap VARCHAR2 )
7203 RETURN VARCHAR2
7204 IS
7205 l_str varchar2(255) default NULL;
7206 l_num number;
7207 l_hex varchar2(16) default '0123456789ABCDEF';
7208
7209 BEGIN
7210 l_num := hextodec(usageMap) - power_func(usageId);
7211
7212 loop
7213 l_str := substr( l_hex, mod(l_num,16)+1, 1 ) || l_str;
7214 l_num := trunc( l_num/16 );
7215 exit when ( l_num = 0 );
7216 end loop;
7217
7218 l_str := lpad(l_str,16,'0');
7219
7220 return l_str;
7221 END MAP_LESS_USAGE_ID;
7222
7223 --------------------------------
7224 PROCEDURE is_usage_deleteable(p_usage_id IN NUMBER,
7225 x_return_status OUT NOCOPY VARCHAR2,
7226 x_msg_count OUT NOCOPY NUMBER,
7227 x_msg_data OUT NOCOPY VARCHAR2)
7228 IS
7229 TYPE t_indexes IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
7230 TYPE t_mask IS TABLE OF cz_ps_nodes.effective_usage_mask%TYPE INDEX BY BINARY_INTEGER;
7231
7232 NO_USG_EXISTS EXCEPTION;
7233 USG_IN_USE EXCEPTION;
7234 l_usage_count NUMBER := 0;
7238 v_masks_nodes t_mask;
7235 l_map_has_usg_id NUMBER := 1;
7236 v_nodes t_indexes;
7237 v_rules t_indexes;
7239 v_masks_rules t_mask;
7240 l_usage_name cz_model_usages.name%TYPE;
7241 BEGIN
7242 FND_MSG_PUB.initialize;
7243 x_return_status := FND_API.G_RET_STS_SUCCESS;
7244 x_msg_count := 0;
7245 x_msg_data := '';
7246
7247 BEGIN
7248 SELECT name
7249 INTO l_usage_name
7250 FROM cz_model_usages
7251 WHERE cz_model_usages.model_usage_id = p_usage_id
7252 AND cz_model_usages.in_use <> 'X';
7253 EXCEPTION
7254 WHEN NO_DATA_FOUND THEN
7255 RAISE NO_USG_EXISTS;
7256 END;
7257
7258 BEGIN
7259 SELECT 1
7260 INTO l_usage_count
7261 FROM cz_publication_usages
7262 WHERE cz_publication_usages.usage_id = p_usage_id
7263 AND cz_publication_usages.publication_id IN (SELECT publication_id
7264 FROM cz_model_publications
7265 WHERE cz_model_publications.deleted_flag = '0')
7266 AND rownum < 2;
7267 EXCEPTION
7268 WHEN NO_DATA_FOUND THEN
7269 NULL;
7270 END;
7271
7272 IF (l_usage_count = 1) THEN
7273 RAiSE USG_IN_USE;
7274 END IF;
7275
7276 v_nodes.DELETE;
7277 v_rules.DELETE;
7278 v_masks_nodes.DELETE;
7279 v_masks_rules.DELETE;
7280 BEGIN
7281 SELECT ps_node_id,
7282 effective_usage_mask
7283 BULK
7284 COLLECT
7285 INTO v_nodes,
7286 v_masks_nodes
7287 FROM cz_ps_nodes
7288 WHERE effective_usage_mask NOT IN ('0', '0000000000000000')
7289 AND deleted_flag = '0'
7290 ORDER BY effective_usage_mask;
7291 EXCEPTION
7292 WHEN OTHERS THEN
7293 NULL;
7294 END;
7295
7296 BEGIN
7297 SELECT rule_id,
7298 effective_usage_mask
7299 BULK
7300 COLLECT
7301 INTO v_rules,
7302 v_masks_rules
7303 FROM cz_rules
7304 WHERE effective_usage_mask NOT IN ('0', '0000000000000000')
7305 AND deleted_flag = '0'
7306 ORDER BY effective_usage_mask;
7307 EXCEPTION
7308 WHEN OTHERS THEN
7309 NULL;
7310 END;
7311
7312 IF (v_nodes.COUNT > 0) THEN
7313 FOR I IN v_nodes.FIRST..v_nodes.LAST
7314 LOOP
7315 l_map_has_usg_id := mapHasUsageId(p_usage_id, v_masks_nodes(i));
7316 IF (l_map_has_usg_id = 1) THEN
7317 RAISE USG_IN_USE;
7318 EXIT;
7319 END IF;
7320 END LOOP;
7321 END IF;
7322
7323 IF (v_rules.COUNT > 0) THEN
7324 FOR I IN v_rules.FIRST..v_rules.LAST
7325 LOOP
7326 l_map_has_usg_id := mapHasUsageId(p_usage_id, v_masks_rules(i));
7327 IF (l_map_has_usg_id = 1) THEN
7328 RAISE USG_IN_USE;
7329 EXIT;
7330 END IF;
7331 END LOOP;
7332 END IF;
7333
7334 EXCEPTION
7335 WHEN NO_DATA_FOUND THEN
7336 x_return_status := FND_API.G_RET_STS_SUCCESS;
7337 x_msg_count := 0;
7338 x_msg_data := NULL;
7339 WHEN NO_USG_EXISTS THEN
7340 x_return_status := FND_API.G_RET_STS_SUCCESS;
7341 x_msg_count := 0;
7342 x_msg_data := NULL;
7343 WHEN USG_IN_USE THEN
7344 FND_MESSAGE.SET_NAME('CZ','CZ_USG_IN_USE');
7345 FND_MESSAGE.SET_TOKEN('USAGE',l_usage_name);
7346 FND_MSG_PUB.ADD;
7347 x_return_status := FND_API.g_ret_sts_error;
7348 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
7349 p_data => x_msg_data);
7350 WHEN OTHERS THEN
7351 handle_Error(p_message_name => 'CZ_DEL_USG_FATAL_ERR',
7352 p_token_name1 => 'USAGE',
7353 p_token_value1 => TO_CHAR(p_usage_id),
7354 x_return_status => x_return_status,
7355 x_msg_count => x_msg_count,
7356 x_msg_data => x_msg_data);
7357 END is_usage_deleteable;
7358 ------------------------------------------
7359 PROCEDURE DELETE_USAGE(usageId IN NUMBER, delete_status IN OUT NOCOPY VARCHAR2)
7360 AS
7361
7362 TYPE t_indexes IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
7363 TYPE t_mask IS TABLE OF cz_ps_nodes.effective_usage_mask%TYPE INDEX BY BINARY_INTEGER;
7364 v_nodes t_indexes;
7365 v_rules t_indexes;
7366 v_masks_nodes t_mask;
7367 v_masks_rules t_mask;
7368 v_new_mask VARCHAR2(16);
7369 v_last_old_mask VARCHAR2(16);
7370 v_first_index BINARY_INTEGER;
7371
7372 BEGIN
7373 FND_MSG_PUB.initialize;
7374 v_nodes.DELETE;
7375 v_rules.DELETE;
7376 v_masks_nodes.DELETE;
7377 v_masks_rules.DELETE;
7378
7379 BEGIN
7380 SELECT ps_node_id,
7381 effective_usage_mask
7382 BULK
7383 COLLECT
7384 INTO v_nodes,
7385 v_masks_nodes
7386 FROM cz_ps_nodes
7387 WHERE effective_usage_mask NOT IN ('0', '0000000000000000')
7388 ORDER BY effective_usage_mask;
7389 EXCEPTION
7390 WHEN OTHERS THEN
7391 NULL;
7392 END;
7393
7394 BEGIN
7395 SELECT rule_id,
7396 effective_usage_mask
7397 BULK
7398 COLLECT
7399 INTO v_rules,
7400 v_masks_rules
7401 FROM cz_rules
7402 WHERE effective_usage_mask NOT IN ('0', '0000000000000000')
7403 ORDER BY effective_usage_mask;
7404 EXCEPTION
7405 WHEN OTHERS THEN
7406 NULL;
7407 END;
7408
7409 BEGIN
7410 UPDATE cz_model_usages
7414
7411 SET in_use = 'X',
7412 name = append_name(usageId, 'USG', name)
7413 WHERE model_usage_id = usageId;
7415 DELETE FROM cz_publication_usages
7416 WHERE usage_id = usageId;
7417
7418 DELETE FROM cz_rp_entries
7419 WHERE object_type ='USG' and object_id = usageId;
7420
7421 IF (v_nodes.COUNT > 0) THEN
7422 v_first_index := v_masks_nodes.FIRST;
7423 v_last_old_mask := v_masks_nodes(v_first_index);
7424 v_new_mask := MAP_LESS_USAGE_ID(usageId, v_masks_nodes(v_first_index));
7425 v_masks_nodes(v_first_index) := v_new_mask;
7426
7427 FOR i IN v_masks_nodes.NEXT(v_first_index)..v_masks_nodes.LAST
7428 LOOP
7429 IF v_masks_nodes(i) = v_last_old_mask THEN
7430 v_masks_nodes(i) := v_masks_nodes(i-1);
7431 ELSE
7432 v_last_old_mask := v_masks_nodes(i);
7433 v_new_mask := MAP_LESS_USAGE_ID(usageId, v_masks_nodes(i));
7434 v_masks_nodes(i) := v_new_mask;
7435 END IF;
7436 END LOOP;
7437
7438 FORALL i IN v_nodes.FIRST..v_nodes.LAST
7439 UPDATE cz_ps_nodes
7440 SET effective_usage_mask = v_masks_nodes(i)
7441 WHERE ps_node_id = v_nodes(i);
7442 END IF;
7443
7444 IF (v_rules.COUNT > 0) THEN
7445 v_first_index := v_masks_rules.FIRST;
7446 v_last_old_mask := v_masks_rules(v_first_index);
7447 v_new_mask := MAP_LESS_USAGE_ID(usageId, v_masks_rules(v_first_index));
7448 v_masks_rules(v_first_index) := v_new_mask;
7449
7450 FOR i IN v_masks_rules.NEXT(v_first_index)..v_masks_rules.LAST
7451 LOOP
7452 IF v_masks_rules(i) = v_last_old_mask THEN
7453 v_masks_rules(i) := v_masks_rules(i-1);
7454 ELSE
7455 v_last_old_mask := v_masks_rules(i);
7456 v_new_mask := MAP_LESS_USAGE_ID(usageId, v_masks_rules(i));
7457 v_masks_rules(i) := v_new_mask;
7458 END IF;
7459 END LOOP;
7460 FORALL i IN v_rules.FIRST..v_rules.LAST
7461 UPDATE cz_rules
7462 SET effective_usage_mask = v_masks_rules(i)
7463 WHERE rule_id = v_rules(i);
7464 END IF;
7465 EXCEPTION
7466 WHEN OTHERS THEN
7467 delete_status := '-1';
7468 END;
7469
7470 IF SQLCODE = 0 THEN
7471 delete_status := '0';
7472 END IF;
7473 END DELETE_USAGE;
7474
7475 ------------------------------------------
7476 PROCEDURE delete_usage (p_usage_id IN NUMBER,
7477 x_return_status OUT NOCOPY VARCHAR2,
7478 x_msg_count OUT NOCOPY NUMBER,
7479 x_msg_data OUT NOCOPY VARCHAR2)
7480 IS
7481
7482 l_return_status VARCHAR2(1);
7483 l_usg_status NUMBER := 0;
7484 l_msg_count NUMBER := 0;
7485 l_msg_data VARCHAR2(2000);
7486 DEL_USG_ERR EXCEPTION;
7487 BEGIN
7488 FND_MSG_PUB.initialize;
7489 x_return_status := FND_API.G_RET_STS_SUCCESS;
7490 x_msg_count := 0;
7491 x_msg_data := '';
7492
7493 is_usage_deleteable(p_usage_id,l_return_status,l_msg_count,l_msg_data);
7494 IF (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
7495 delete_usage(p_usage_id,l_usg_status);
7496 IF (l_usg_status <> 0) THEN
7497 RAISE DEL_USG_ERR ;
7498 END IF;
7499 ELSE
7500 x_return_status := l_return_status;
7501 x_msg_count := l_msg_count;
7502 x_msg_data := l_msg_data;
7503 END IF;
7504 EXCEPTION
7505 WHEN DEL_USG_ERR THEN
7506 x_return_status := FND_API.G_RET_STS_ERROR;
7507 handle_Error(p_message_name => 'CZ_CANNOT_DEL_USG',
7508 p_token_name1 => 'USAGE',
7509 p_token_value1 => TO_CHAR(p_usage_id),
7510 x_return_status => x_return_status,
7511 x_msg_count => x_msg_count,
7512 x_msg_data => x_msg_data);
7513
7514 WHEN OTHERS THEN
7515 handle_Error(p_procedure_name => 'delete_usage',
7516 p_error_message => SQLERRM,
7517 x_return_status => x_return_status,
7518 x_msg_count => x_msg_count,
7519 x_msg_data => x_msg_data);
7520 END delete_usage;
7521
7522 ---------------------------------------
7523 PROCEDURE is_repos_fld_deleteable ( p_rp_folder_id IN NUMBER,
7524 x_return_status OUT NOCOPY VARCHAR2,
7525 x_msg_count OUT NOCOPY NUMBER,
7526 x_msg_data OUT NOCOPY VARCHAR2)
7527 IS
7528
7529 TYPE number_type_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
7530 TYPE model_names_tbl IS TABLE OF cz_devl_projects.name%TYPE INDEX BY BINARY_INTEGER;
7531 TYPE t_mask IS TABLE OF cz_ps_nodes.effective_usage_mask%TYPE INDEX BY BINARY_INTEGER;
7532 TYPE name_tbl IS TABLE OF cz_ps_nodes.name%TYPE INDEX BY BINARY_INTEGER;
7533 TYPE t_checkout_user_tbl IS TABLE OF cz_devl_projects.checkout_user%TYPE INDEX BY BINARY_INTEGER;
7534 l_rp_folder NUMBER;
7535 l_rp_fld_tbl number_type_tbl;
7536 l_rp_model_tbl number_type_tbl;
7537 l_rp_model_ref number_type_tbl;
7538 l_eff_set_tbl number_type_tbl;
7539 l_eff_set_ref number_type_tbl;
7540 l_eff_tbl number_type_tbl;
7541 l_eff_ref number_type_tbl;
7542 l_eff_idx_ref number_type_tbl;
7543 l_eff_set_id NUMBER := 0;
7544 l_encl_eff_fld NUMBER := 0;
7545 l_eff_name VARCHAR2(255);
7546
7547 l_devl_project_tbl number_type_tbl;
7548 l_object_id cz_rp_entries.object_id%TYPE;
7549 l_object_name cz_rp_entries.name%TYPE;
7550 l_seeded_flag cz_rp_entries.seeded_flag%TYPE;
7551 l_devl_name cz_devl_projects.name%TYPE;
7555 l_usg_ref number_type_tbl;
7552 l_encl_arc_fld NUMBER := 0;
7553
7554 l_usg_tbl number_type_tbl;
7556 l_arc_tbl number_type_tbl;
7557 l_arc_ref number_type_tbl;
7558 l_prp_tbl number_type_tbl;
7559 l_prp_ref number_type_tbl;
7560 l_umt_tbl number_type_tbl;
7561 l_umt_ref number_type_tbl;
7562 l_uct_tbl number_type_tbl;
7563 l_uct_ref number_type_tbl;
7564 l_publication_tbl number_type_tbl;
7565 l_encl_tbl number_type_tbl;
7566 l_encl_fld_tbl number_type_tbl;
7567 l_encl_idx_ref number_type_tbl;
7568 l_encl_devl_tbl number_type_tbl;
7569 l_ref_model_ids_tbl number_type_tbl;
7570 l_ref_model_names_tbl model_names_tbl;
7571 l_eff_encl_fld_id NUMBER := 0;
7572 rec_count NUMBER := 0;
7573 l_checkout_user cz_devl_projects.checkout_user%TYPE;
7574 l_model_name cz_devl_projects.name%TYPE;
7575 l_template_name cz_ui_templates.template_name%TYPE;
7576 l_fld_name cz_rp_entries.name%TYPE;
7577 l_priv VARCHAR2(1) := 'F';
7578 l_return_status VARCHAR2(1);
7579 l_msg_count NUMBER := 0;
7580 l_msg_data VARCHAR2(2000);
7581 l_ref_count NUMBER:=0;
7582 l_orig_sys_ref VARCHAR2(255);
7583
7584 l_ps_prop_count NUMBER := 0;
7585 l_item_prop_count NUMBER := 0;
7586 l_ui_pages_count NUMBER := 0;
7587 l_prop_count NUMBER := 0;
7588 l_folder_count NUMBER := 0;
7589 l_ui_name_tbl model_names_tbl;
7590 l_usage_name cz_model_usages.name%TYPE;
7591
7592 l_usage_count NUMBER := 0;
7593 l_map_has_usg_id NUMBER := 1;
7594 v_nodes number_type_tbl ;
7595 v_rules number_type_tbl ;
7596 l_nodes_project_tbl number_type_tbl ;
7597 l_rules_project_tbl number_type_tbl ;
7598 v_masks_nodes t_mask;
7599 v_masks_rules t_mask;
7600 l_nodes_name_tbl name_tbl;
7601 l_rules_name_tbl name_tbl;
7602 l_ref_model_name cz_devl_projects.name%TYPE;
7603 l_locked_models_tbl number_type_tbl;
7604 l_all_locked_models_tbl number_type_tbl;
7605 l_checkout_user_tbl t_checkout_user_tbl;
7606 l_user_name cz_devl_projects.checkout_user%TYPE;
7607 l_devl_prj_name_tbl name_tbl;
7608 l_template_name_tbl name_tbl;
7609 BEGIN
7610 FND_MSG_PUB.initialize;
7611 x_return_status := FND_API.g_ret_sts_success;
7612 x_msg_count := 0;
7613 x_msg_data := '';
7614
7615 l_user_name := FND_GLOBAL.user_name;
7616 ------check if p_rp_folder_id exists
7617 SELECT object_id
7618 INTO l_rp_folder
7619 FROM cz_rp_entries
7620 WHERE cz_rp_entries.object_id = p_rp_folder_id
7621 AND cz_rp_entries.object_type = 'FLD'
7622 AND cz_rp_entries.deleted_flag = '0';
7623
7624 l_rp_fld_tbl.DELETE;
7625 l_encl_idx_ref.DELETE;
7626 l_encl_fld_tbl.DELETE;
7627 SELECT object_id,enclosing_folder
7628 BULK
7629 COLLECT
7630 INTO l_rp_fld_tbl,l_encl_fld_tbl
7631 FROM cz_rp_entries
7632 WHERE cz_rp_entries.deleted_flag = '0'
7633 AND cz_rp_entries.object_type = 'FLD'
7634 START WITH cz_rp_entries.object_type = 'FLD'
7635 AND cz_rp_entries.object_id = l_rp_folder
7636 CONNECT BY PRIOR cz_rp_entries.object_id = cz_rp_entries.enclosing_folder
7637 AND PRIOR cz_rp_entries.object_type = 'FLD';
7638
7639 ---l_folder_count := l_rp_fld_tbl.COUNT + 1;
7640 ---l_rp_fld_tbl(l_folder_count) := l_rp_folder;
7641 ---l_encl_fld_tbl(l_folder_count) := -1;
7642 IF (l_rp_fld_tbl.COUNT > 0) THEN
7643 FOR I IN l_rp_fld_tbl.FIRST..l_rp_fld_tbl.LAST
7644 LOOP
7645 l_encl_idx_ref(l_rp_fld_tbl(i)) := l_rp_fld_tbl(i);
7646
7647 ----collect all projects
7648 l_rp_model_tbl.DELETE;
7649 SELECT object_id, checkout_user, cz_devl_projects.name
7650 BULK COLLECT
7651 INTO l_rp_model_tbl, l_checkout_user_tbl, l_devl_prj_name_tbl
7652 FROM cz_rp_entries, cz_devl_projects
7653 WHERE cz_rp_entries.object_type = 'PRJ'
7654 AND cz_rp_entries.deleted_flag = '0'
7655 AND cz_rp_entries.enclosing_folder = l_rp_fld_tbl(i)
7656 AND cz_rp_entries.object_id = cz_devl_projects.devl_project_id;
7657
7658 IF (l_rp_model_tbl.COUNT > 0) THEN
7659 rec_count := l_rp_model_ref.COUNT;
7660 FOR J IN l_rp_model_tbl.FIRST..l_rp_model_tbl.LAST
7661 LOOP
7662 IF ( l_checkout_user_tbl(j) IS NOT NULL AND l_checkout_user_tbl(j) <> l_user_name ) THEN
7663 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEL_MODEL_LOCKED_MODEL');
7664 FND_MESSAGE.SET_TOKEN('MODELNAME', l_devl_prj_name_tbl(j));
7665 FND_MESSAGE.SET_TOKEN('CHECKOUTUSER', l_checkout_user_tbl(j));
7666 FND_MSG_PUB.ADD;
7667 x_return_status := FND_API.g_ret_sts_error;
7668 END IF;
7669 rec_count := rec_count + 1;
7670 l_rp_model_ref(rec_count) := l_rp_model_tbl(j);
7671 END LOOP;
7672 END IF;
7673
7674 ----get eff sets
7675 l_eff_set_tbl.DELETE;
7676 SELECT object_id
7677 BULK COLLECT
7678 INTO l_eff_set_tbl
7679 FROM cz_rp_entries
7680 WHERE cz_rp_entries.object_type = 'EFF'
7681 AND cz_rp_entries.deleted_flag = '0'
7682 AND cz_rp_entries.enclosing_folder = l_rp_fld_tbl(i);
7683
7684 IF (l_eff_set_tbl.COUNT > 0) THEN
7685 rec_count := l_eff_set_ref.COUNT;
7686 FOR J IN l_eff_set_tbl.FIRST..l_eff_set_tbl.LAST
7690 END LOOP;
7687 LOOP
7688 rec_count := rec_count + 1;
7689 l_eff_set_ref(rec_count) := l_eff_set_tbl(j);
7691 END IF;
7692
7693 ----get usages
7694 l_usg_tbl.DELETE;
7695 SELECT object_id
7696 BULK COLLECT
7697 INTO l_usg_tbl
7698 FROM cz_rp_entries
7699 WHERE cz_rp_entries.object_type = 'USG'
7700 AND cz_rp_entries.deleted_flag = '0'
7701 AND cz_rp_entries.enclosing_folder = l_rp_fld_tbl(i);
7702
7703 IF (l_usg_tbl.COUNT > 0) THEN
7704 rec_count := l_usg_ref.COUNT;
7705 FOR J IN l_usg_tbl.FIRST..l_usg_tbl.LAST
7706 LOOP
7707 rec_count := rec_count + 1;
7708 l_usg_ref(rec_count) := l_usg_tbl(j);
7709 END LOOP;
7710 END IF;
7711
7712 ----get archives
7713 l_arc_tbl.DELETE;
7714 SELECT object_id
7715 BULK COLLECT
7716 INTO l_arc_tbl
7717 FROM cz_rp_entries
7718 WHERE cz_rp_entries.object_type = 'ARC'
7719 AND cz_rp_entries.deleted_flag = '0'
7720 AND cz_rp_entries.seeded_flag <> '1'
7721 AND cz_rp_entries.enclosing_folder = l_rp_fld_tbl(i);
7722
7723 IF (l_arc_tbl.COUNT > 0) THEN
7724 rec_count := l_arc_ref.COUNT;
7725 FOR J IN l_arc_tbl.FIRST..l_arc_tbl.LAST
7726 LOOP
7727 rec_count := rec_count + 1;
7728 l_arc_ref(rec_count) := l_arc_tbl(j);
7729 END LOOP;
7730 END IF;
7731
7732 ----get properties
7733 l_prp_tbl.DELETE;
7734 SELECT object_id
7735 BULK COLLECT
7736 INTO l_prp_tbl
7737 FROM cz_rp_entries
7738 WHERE cz_rp_entries.object_type = 'PRP'
7739 AND cz_rp_entries.deleted_flag = '0'
7740 AND cz_rp_entries.seeded_flag <> '1'
7741 AND cz_rp_entries.enclosing_folder = l_rp_fld_tbl(i);
7742
7743 IF (l_prp_tbl.COUNT > 0) THEN
7744 rec_count := l_prp_ref.COUNT;
7745 FOR J IN l_prp_tbl.FIRST..l_prp_tbl.LAST
7746 LOOP
7747 rec_count := rec_count + 1;
7748 l_prp_ref(rec_count) := l_prp_tbl(j);
7749 END LOOP;
7750 END IF;
7751
7752 ----get master tmp
7753 l_umt_tbl.DELETE;
7754 SELECT object_id
7755 BULK COLLECT
7756 INTO l_umt_tbl
7757 FROM cz_rp_entries
7758 WHERE cz_rp_entries.object_type = 'UMT'
7759 AND cz_rp_entries.deleted_flag = '0'
7760 AND cz_rp_entries.seeded_flag <> '1'
7761 AND cz_rp_entries.enclosing_folder = l_rp_fld_tbl(i);
7762
7763 IF (l_umt_tbl.COUNT > 0) THEN
7764 rec_count := l_umt_ref.COUNT;
7765 FOR J IN l_umt_tbl.FIRST..l_umt_tbl.LAST
7766 LOOP
7767 rec_count := rec_count + 1;
7768 l_umt_ref(rec_count) := l_umt_tbl(j);
7769 END LOOP;
7770 END IF;
7771
7772 ----get uct
7773 l_uct_tbl.DELETE;
7774 SELECT object_id, checkout_user, template_name
7775 BULK COLLECT
7776 INTO l_uct_tbl, l_checkout_user_tbl, l_template_name_tbl
7777 FROM cz_rp_entries, cz_ui_templates
7778 WHERE cz_rp_entries.object_type = 'UCT'
7779 AND cz_rp_entries.deleted_flag = '0'
7780 AND cz_rp_entries.seeded_flag <> '1'
7781 AND cz_rp_entries.enclosing_folder = l_rp_fld_tbl(i)
7782 AND cz_rp_entries.object_id = cz_ui_templates.template_id
7783 AND cz_ui_templates.ui_def_id = 0;
7784
7785 IF (l_uct_tbl.COUNT > 0) THEN
7786 rec_count := l_uct_ref.COUNT;
7787 FOR J IN l_uct_tbl.FIRST..l_uct_tbl.LAST
7788 LOOP
7789 IF ( l_checkout_user_tbl(j) IS NOT NULL AND l_checkout_user_tbl(j) <> l_user_name ) THEN
7790 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEL_TMPL_IS_LOCKED');
7791 FND_MESSAGE.SET_TOKEN('UCTNAME', l_template_name_tbl(j));
7792 FND_MESSAGE.SET_TOKEN('USERNAME', l_checkout_user_tbl(j));
7793 FND_MSG_PUB.ADD;
7794 x_return_status := FND_API.g_ret_sts_error;
7795 END IF;
7796 rec_count := rec_count + 1;
7797 l_uct_ref(rec_count) := l_uct_tbl(j);
7798 END LOOP;
7799 END IF;
7800
7801 END LOOP;
7802 END IF;
7803
7804 IF (l_rp_model_ref.COUNT > 0) THEN
7805 FOR modelId IN l_rp_model_ref.FIRST..l_rp_model_ref.LAST
7806 LOOP
7807 l_ref_model_ids_tbl.DELETE;
7808 l_encl_devl_tbl.DELETE;
7809 l_ref_model_names_tbl.DELETE;
7810 SELECT d.devl_project_id,d.name, rp.enclosing_folder
7811 BULK
7812 COLLECT
7813 INTO l_ref_model_ids_tbl,l_ref_model_names_tbl,l_encl_devl_tbl
7814 FROM cz_ps_nodes p,
7815 cz_devl_projects d,
7816 cz_rp_entries rp
7817 WHERE p.reference_id = l_rp_model_ref(modelId)
7818 AND p.ps_node_type IN (263, 264)
7819 AND p.deleted_flag = '0'
7820 AND p.devl_project_id = d.devl_project_id
7821 AND rp.object_id = d.devl_project_id
7822 AND rp.object_type = 'PRJ'
7823 AND d.deleted_flag = '0';
7824
7825 IF (l_ref_model_ids_tbl.COUNT > 0) THEN
7826 FOR I IN l_ref_model_ids_tbl.FIRST..l_ref_model_ids_tbl.LAST
7827 LOOP
7828 IF (NOT l_encl_idx_ref.EXISTS( l_encl_devl_tbl(i) ) ) THEN
7829 SELECT name into l_model_name from cz_devl_projects
7830 WHERE devl_project_id = l_ref_model_ids_tbl(i);
7831
7832 SELECT name into l_ref_model_name from cz_devl_projects
7836 FND_MESSAGE.SET_TOKEN('MODELNAME',l_ref_model_name);
7833 WHERE devl_project_id = l_rp_model_ref(modelId);
7834
7835 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEL_MODEL_IS_REFD_BY');
7837 FND_MESSAGE.SET_TOKEN('REFMODELNAME',l_model_name);
7838 FND_MSG_PUB.ADD;
7839 x_return_status := FND_API.g_ret_sts_error;
7840 END IF;
7841
7842 l_publication_tbl.DELETE;
7843 SELECT publication_id
7844 BULK
7845 COLLECT
7846 INTO l_publication_tbl
7847 FROM cz_model_publications
7848 WHERE object_id = l_ref_model_ids_tbl(i)
7849 AND object_type = 'PRJ'
7850 AND deleted_flag = '0';
7851
7852 IF (l_publication_tbl.COUNT > 0) THEN
7853 FOR I IN l_publication_tbl.FIRST..l_publication_tbl.LAST
7854 LOOP
7855 SELECT name into l_model_name from cz_devl_projects
7856 WHERE devl_project_id = l_ref_model_ids_tbl(i);
7857 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEL_MODEL_IS_PUBLD');
7858 FND_MESSAGE.SET_TOKEN('MODELNAME', l_model_name);
7859 FND_MESSAGE.SET_TOKEN('PUBID', l_publication_tbl(i));
7860 FND_MSG_PUB.ADD;
7861 x_return_status := FND_API.g_ret_sts_error;
7862 END LOOP;
7863 END IF;
7864 END LOOP;
7865 END IF;
7866 END LOOP;
7867 END IF;
7868
7869 IF (l_eff_set_ref.COUNT > 0) THEN
7870 FOR I IN l_eff_set_ref.FIRST..l_eff_set_ref.LAST
7871 LOOP
7872 BEGIN
7873 SELECT object_id,name
7874 INTO l_eff_set_id,l_eff_name
7875 FROM cz_rp_entries
7876 WHERE cz_rp_entries.object_id = l_eff_set_ref(i)
7877 AND cz_rp_entries.object_type = 'EFF'
7878 AND cz_rp_entries.deleted_flag = '0'
7879 AND cz_rp_entries.seeded_flag <> '1';
7880
7881 l_eff_tbl.DELETE;
7882 SELECT distinct devl_project_id
7883 BULK
7884 COLLECT
7885 INTO l_eff_tbl
7886 FROM cz_rules
7887 WHERE cz_rules.effectivity_set_id = l_eff_set_ref(i)
7888 AND cz_rules.deleted_flag = '0';
7889
7890 rec_count := l_eff_ref.COUNT;
7891 IF (l_eff_tbl.COUNT > 0) THEN
7892 FOR I IN l_eff_tbl.FIRST..l_eff_tbl.LAST
7893 LOOP
7894 rec_count := rec_count + 1;
7895 l_eff_ref(rec_count) := l_eff_tbl(i);
7896 l_eff_idx_ref(l_eff_tbl(i)) := l_eff_tbl(i);
7897 END LOOP;
7898 END IF;
7899
7900 l_eff_tbl.DELETE;
7901 SELECT distinct devl_project_id
7902 BULK
7903 COLLECT
7904 INTO l_eff_tbl
7905 FROM cz_ps_nodes
7906 WHERE cz_ps_nodes.effectivity_set_id = l_eff_set_ref(i)
7907 AND cz_ps_nodes.deleted_flag = '0';
7908
7909 rec_count := l_eff_ref.COUNT;
7910 IF (l_eff_tbl.COUNT > 0) THEN
7911 FOR I IN l_eff_tbl.FIRST..l_eff_tbl.LAST
7912 LOOP
7913 IF (NOT l_eff_idx_ref.EXISTS(l_eff_tbl(i)) ) THEN
7914 rec_count := rec_count + 1;
7915 l_eff_ref(rec_count) := l_eff_tbl(i);
7916 END IF;
7917 END LOOP;
7918 END IF;
7919
7920 IF (l_eff_ref.COUNT > 0) THEN
7921 FOR I IN l_eff_ref.FIRST..l_eff_ref.LAST
7922 LOOP
7923 BEGIN
7924 SELECT enclosing_folder,name
7925 INTO l_encl_eff_fld,l_model_name
7926 from cz_rp_entries
7927 WHERE object_id = l_eff_ref(i)
7928 AND object_type = 'PRJ'
7929 AND deleted_flag = '0';
7930 EXCEPTION
7931 WHEN NO_DATA_FOUND THEN
7932 l_model_name := NULL;
7933 END;
7934
7935 IF ( (l_model_name IS NOT NULL)
7936 AND (NOT l_encl_idx_ref.EXISTS(l_encl_eff_fld ) ) ) THEN
7937 x_return_status := FND_API.G_RET_STS_ERROR;
7938 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEV_UTILS_EFF_SET_IN_USE');
7939 FND_MESSAGE.SET_TOKEN('EFFSETNAME', l_eff_name);
7940 FND_MESSAGE.SET_TOKEN('MODELNAME', l_model_name);
7941 FND_MSG_PUB.ADD;
7942 END IF;
7943 END LOOP;
7944 END IF;
7945 EXCEPTION
7946 WHEN NO_DATA_FOUND THEN
7947 NULL;
7948 END;
7949 END LOOP;
7950 END IF;
7951
7952 IF (l_arc_ref.COUNT > 0) THEN
7953 FOR modelId IN l_arc_ref.FIRST..l_arc_ref.LAST
7954 LOOP
7955 BEGIN
7956 ----check if archive exists
7957 SELECT object_id,name,seeded_flag,enclosing_folder
7958 INTO l_object_id,l_object_name,l_seeded_flag,l_encl_arc_fld
7959 FROM cz_rp_entries
7960 WHERE cz_rp_entries.object_id = l_arc_ref(modelId)
7961 AND cz_rp_entries.object_type = 'ARC'
7962 AND cz_rp_entries.deleted_flag = '0';
7963
7964 l_devl_project_tbl.DELETE;
7965 SELECT DISTINCT devl_project_id
7966 BULK
7967 COLLECT
7968 INTO l_devl_project_tbl
7969 FROM cz_archive_refs
7970 WHERE cz_archive_refs.archive_id = l_arc_ref(modelId)
7971 AND cz_archive_refs.deleted_flag = '0'
7972 AND cz_archive_refs.devl_project_id IN (SELECT object_id
7973 FROM cz_rp_entries
7974 WHERE object_type = 'PRJ'
7975 AND deleted_flag = '0');
7976 IF (l_devl_project_tbl.COUNT > 0) THEN
7977 FOR I IN l_devl_project_tbl.FIRST..l_devl_project_tbl.LAST
7981 FROM cz_rp_entries
7978 LOOP
7979 SELECT name,enclosing_folder
7980 into l_devl_name,l_encl_arc_fld
7982 WHERE object_id = l_devl_project_tbl(i)
7983 AND object_type = 'PRJ';
7984 IF ( NOT l_encl_idx_ref.EXISTS(l_encl_arc_fld ) ) THEN
7985 x_return_status := FND_API.G_RET_STS_ERROR;
7986 FND_MESSAGE.SET_NAME('CZ','CZ_ARC_IN_USE');
7987 FND_MESSAGE.SET_TOKEN('ARCHIVENAME',l_object_name);
7988 FND_MESSAGE.SET_TOKEN('MODELNAME',l_devl_name);
7989 FND_MSG_PUB.ADD;
7990 END IF;
7991 END LOOP;
7992 END IF;
7993 EXCEPTION
7994 WHEN NO_DATA_FOUND THEN
7995 NULL;
7996 END;
7997 END LOOP;
7998 END IF;
7999
8000 IF (l_prp_ref.COUNT > 0) THEN
8001 FOR modelId IN l_prp_ref.FIRST..l_prp_ref.LAST
8002 LOOP
8003 BEGIN
8004
8005 SELECT object_id,name,seeded_flag
8006 INTO l_object_id,l_object_name,l_seeded_flag
8007 FROM cz_rp_entries
8008 WHERE cz_rp_entries.object_id = l_prp_ref(modelId)
8009 AND cz_rp_entries.object_type = 'PRP'
8010 AND cz_rp_entries.deleted_flag = '0';
8011
8012 SELECT devl_project_id BULK COLLECT INTO l_devl_project_tbl
8013 FROM (SELECT devl_project_id
8014 FROM cz_ps_prop_vals psp,
8015 cz_ps_nodes ps
8016 WHERE psp.deleted_flag = '0'
8017 AND ps.deleted_flag = '0'
8018 AND ps.ps_node_id = psp.ps_node_id
8019 AND property_id = l_prp_ref(modelId)
8020 UNION
8021 SELECT devl_project_id
8022 FROM cz_item_type_properties itypr,
8023 cz_item_masters itm,
8024 cz_ps_nodes psnd
8025 WHERE itypr.deleted_flag = '0'
8026 AND itypr.item_type_id = itm.item_type_id
8027 AND itm.deleted_flag = '0'
8028 AND psnd.item_id = itm.item_id
8029 AND psnd.deleted_flag = '0'
8030 AND itypr.property_id = l_prp_ref(modelId));
8031
8032 IF (l_devl_project_tbl.COUNT > 0) THEN
8033 FOR J IN l_devl_project_tbl.FIRST..l_devl_project_tbl.LAST
8034 LOOP
8035 SELECT enclosing_folder into l_encl_arc_fld
8036 FROM cz_rp_entries WHERE object_id = l_devl_project_tbl(j)
8037 AND object_type = 'PRJ';
8038 IF ( NOT l_encl_idx_ref.EXISTS(l_encl_arc_fld) ) THEN
8039 x_return_status := FND_API.G_RET_STS_ERROR;
8040 FND_MESSAGE.SET_NAME('CZ','CZ_PROP_IN_USE');
8041 FND_MESSAGE.SET_TOKEN('NAME',l_object_name);
8042 FND_MSG_PUB.ADD;
8043 EXIT;
8044 END IF;
8045 END LOOP;
8046 END IF;
8047
8048 BEGIN
8049 SELECT 1
8050 INTO l_item_prop_count
8051 FROM CZ_ITEM_TYPE_PROPERTIES
8052 WHERE item_type_id IN (select item_type_id
8053 from cz_item_types
8054 where deleted_flag = '0')
8055 AND property_id = l_prp_ref(modelId)
8056 AND deleted_flag = '0';
8057 EXCEPTION
8058 WHEN NO_DATA_FOUND THEN
8059 l_prop_count := 0;
8060 END;
8061
8062 IF (l_item_prop_count > 0) THEN
8063 x_return_status := FND_API.G_RET_STS_ERROR;
8064 FND_MESSAGE.SET_NAME('CZ','CZ_PROP_IN_USE');
8065 FND_MESSAGE.SET_TOKEN('NAME',l_object_name);
8066 FND_MSG_PUB.ADD;
8067 END IF;
8068
8069 BEGIN
8070 SELECT 1
8071 INTO l_ui_pages_count
8072 FROM CZ_UI_PAGES
8073 WHERE property_id = l_prp_ref(modelId)
8074 AND deleted_flag = '0';
8075 EXCEPTION
8076 WHEN NO_DATA_FOUND THEN
8077 l_prop_count := 0;
8078 END;
8079 IF (l_item_prop_count > 0) THEN
8080 x_return_status := FND_API.G_RET_STS_ERROR;
8081 FND_MESSAGE.SET_NAME('CZ','CZ_PROP_IN_USE');
8082 FND_MESSAGE.SET_TOKEN('NAME',l_object_name);
8083 FND_MSG_PUB.ADD;
8084 END IF;
8085 EXCEPTION
8086 WHEN NO_DATA_FOUND THEN
8087 NULL;
8088 END;
8089 END LOOP;
8090 END IF;
8091
8092 IF (l_umt_ref.COUNT > 0) THEN
8093 FOR modelId IN l_umt_ref.FIRST..l_umt_ref.LAST
8094 LOOP
8095 BEGIN
8096 SELECT object_id,name,seeded_flag
8097 INTO l_object_id,l_object_name,l_seeded_flag
8098 FROM cz_rp_entries
8099 WHERE cz_rp_entries.object_id = l_umt_ref(modelId)
8100 AND cz_rp_entries.object_type = 'UMT'
8101 AND cz_rp_entries.deleted_flag = '0';
8102
8103 l_ui_name_tbl.DELETE;
8104 SELECT name
8105 BULK
8106 COLLECT
8107 INTO l_ui_name_tbl
8108 FROM cz_ui_defs
8109 WHERE cz_ui_defs.from_master_template_id = l_umt_ref(modelId)
8110 AND cz_ui_defs.deleted_flag = '0'
8111 AND cz_ui_defs.seeded_flag <> '1';
8112
8113 IF (l_ui_name_tbl.count > 0 ) THEN
8114 x_return_status := FND_API.G_RET_STS_ERROR;
8115 FOR I IN l_ui_name_tbl.FIRST..l_ui_name_tbl.LAST
8116 LOOP
8120 FND_MSG_PUB.ADD;
8117 FND_MESSAGE.SET_NAME('CZ', 'CZ_UMT_IN_USE');
8118 FND_MESSAGE.SET_TOKEN('NAME', l_object_name);
8119 FND_MESSAGE.SET_TOKEN('UI', l_ui_name_tbl(i));
8121 EXIT;
8122 END LOOP;
8123 END IF;
8124 EXCEPTION
8125 WHEN NO_DATA_FOUND THEN
8126 NULL;
8127 END;
8128 END LOOP;
8129 END IF;
8130
8131 IF (l_uct_ref.COUNT > 0) THEN
8132 FOR modelId IN l_uct_ref.FIRST..l_uct_ref.LAST
8133 LOOP
8134 BEGIN
8135 SELECT object_id,name,seeded_flag
8136 INTO l_object_id,l_object_name,l_seeded_flag
8137 FROM cz_rp_entries
8138 WHERE cz_rp_entries.object_id = l_uct_ref(modelId)
8139 AND cz_rp_entries.object_type = 'UCT'
8140 AND cz_rp_entries.deleted_flag = '0';
8141
8142 l_ui_name_tbl.DELETE;
8143 SELECT name
8144 BULK
8145 COLLECT
8146 INTO l_ui_name_tbl
8147 FROM cz_ui_defs
8148 WHERE cz_ui_defs.ui_def_id IN (SELECT ui_def_id
8149 FROM cz_ui_cont_type_templs
8150 WHERE cz_ui_cont_type_templs.template_id = l_uct_ref(modelId)
8151 AND cz_ui_cont_type_templs.deleted_flag = '0'
8152 AND cz_ui_cont_type_templs.seeded_flag <> '1')
8153 AND cz_ui_defs.deleted_flag = '0';
8154
8155 IF (l_ui_name_tbl.count > 0 ) THEN
8156 x_return_status := FND_API.G_RET_STS_ERROR;
8157 FOR I IN l_ui_name_tbl.FIRST..l_ui_name_tbl.LAST
8158 LOOP
8159 FND_MESSAGE.SET_NAME('CZ', 'CZ_UCT_IN_USE');
8160 FND_MESSAGE.SET_TOKEN('NAME', l_object_name);
8161 FND_MESSAGE.SET_TOKEN('UI', l_ui_name_tbl(i));
8162 FND_MSG_PUB.ADD;
8163 END LOOP;
8164 END IF;
8165 EXCEPTION
8166 WHEN NO_DATA_FOUND THEN
8167 NULL;
8168 END;
8169 END LOOP;
8170 END IF;
8171
8172 IF (l_usg_ref.COUNT > 0) THEN
8173 FOR modelId IN l_usg_ref.FIRST..l_usg_ref.LAST
8174 LOOP
8175 BEGIN
8176 SELECT model_usage_id,name
8177 INTO l_usage_count,l_usage_name
8178 FROM cz_model_usages
8179 WHERE cz_model_usages.model_usage_id = l_usg_ref(modelId)
8180 AND cz_model_usages.in_use <> 'X';
8181
8182 BEGIN
8183 SELECT 1
8184 INTO l_usage_count
8185 FROM cz_publication_usages
8186 WHERE cz_publication_usages.usage_id = l_usg_ref(modelId)
8187 AND cz_publication_usages.publication_id IN (SELECT publication_id
8188 FROM cz_model_publications
8189 WHERE cz_model_publications.deleted_flag = '0')
8190 AND rownum < 2;
8191 EXCEPTION
8192 WHEN NO_DATA_FOUND THEN
8193 l_usage_count := 0;
8194 END;
8195
8196 IF (l_usage_count = 1) THEN
8197 FND_MESSAGE.SET_NAME('CZ','CZ_USG_IN_USE');
8198 FND_MESSAGE.SET_TOKEN('USAGE',l_usage_name);
8199 FND_MSG_PUB.ADD;
8200 x_return_status := FND_API.g_ret_sts_error;
8201 EXIT;
8202 END IF;
8203
8204 v_nodes.DELETE;
8205 v_rules.DELETE;
8206 v_masks_nodes.DELETE;
8207 v_masks_rules.DELETE;
8208 l_nodes_name_tbl.DELETE;
8209 l_rules_name_tbl.DELETE;
8210
8211 BEGIN
8212 SELECT ps_node_id,effective_usage_mask,devl_project_id,name
8213 BULK
8214 COLLECT
8215 INTO v_nodes,v_masks_nodes,l_nodes_project_tbl,l_nodes_name_tbl
8216 FROM cz_ps_nodes
8217 WHERE effective_usage_mask NOT IN ('0', '0000000000000000')
8218 ORDER BY effective_usage_mask;
8219 EXCEPTION
8220 WHEN OTHERS THEN
8221 NULL;
8222 END;
8223
8224 BEGIN
8225 SELECT rule_id,effective_usage_mask,devl_project_id,name
8226 BULK
8227 COLLECT
8228 INTO v_rules,v_masks_rules,l_rules_project_tbl,l_rules_name_tbl
8229 FROM cz_rules
8230 WHERE effective_usage_mask NOT IN ('0', '0000000000000000')
8231 ORDER BY effective_usage_mask;
8232 EXCEPTION
8233 WHEN OTHERS THEN
8234 NULL;
8235 END;
8236
8237 IF (v_nodes.COUNT > 0) THEN
8238 FOR I IN v_nodes.FIRST..v_nodes.LAST
8239 LOOP
8240 l_map_has_usg_id := mapHasUsageId(l_usg_ref(modelId), v_masks_nodes(i));
8241 IF (l_map_has_usg_id = 1) THEN
8242 SELECT enclosing_folder,name into l_encl_arc_fld,l_model_name
8243 FROM cz_rp_entries WHERE object_id = l_nodes_project_tbl(i)
8244 AND object_type = 'PRJ';
8245 IF ( NOT l_encl_idx_ref.EXISTS(l_encl_arc_fld) ) THEN
8246 FND_MESSAGE.SET_NAME('CZ','CZ_USG_IN_USE');
8247 FND_MESSAGE.SET_TOKEN('USAGE',l_usage_name);
8248 FND_MESSAGE.SET_TOKEN('PSNODE',l_nodes_name_tbl(i));
8249 FND_MESSAGE.SET_TOKEN('PROJECT',l_model_name);
8250 FND_MSG_PUB.ADD;
8251 x_return_status := FND_API.g_ret_sts_error;
8252 EXIT;
8253 END IF;
8254 END IF;
8255 END LOOP;
8256 END IF;
8257
8258 IF (v_rules.COUNT > 0) THEN
8259 FOR I IN v_rules.FIRST..v_rules.LAST
8260 LOOP
8261 l_map_has_usg_id := mapHasUsageId(l_usg_ref(modelId), v_masks_rules(i));
8265 AND object_type = 'PRJ';
8262 IF (l_map_has_usg_id = 1) THEN
8263 SELECT enclosing_folder,name into l_encl_arc_fld,l_model_name
8264 FROM cz_rp_entries WHERE object_id = l_nodes_project_tbl(i)
8266 IF ( NOT l_encl_idx_ref.EXISTS(l_encl_arc_fld) ) THEN
8267 FND_MESSAGE.SET_NAME('CZ','CZ_USG_IN_USE');
8268 FND_MESSAGE.SET_TOKEN('USAGE',l_usage_name);
8269 FND_MESSAGE.SET_TOKEN('RULE',l_rules_name_tbl(i));
8270 FND_MESSAGE.SET_TOKEN('PROJECT',l_model_name);
8271 FND_MSG_PUB.ADD;
8272 x_return_status := FND_API.g_ret_sts_error;
8273 EXIT;
8274 END IF;
8275 END IF;
8276 END LOOP;
8277 END IF;
8278 EXCEPTION
8279 WHEN NO_DATA_FOUND THEN
8280 NULL;
8281 END;
8282 END LOOP;
8283 END IF;
8284 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8285 p_data => x_msg_data);
8286 EXCEPTION
8287 WHEN NO_DATA_FOUND THEN
8288 x_return_status := FND_API.G_RET_STS_SUCCESS;
8289 WHEN OTHERS THEN
8290 handle_Error( p_procedure_name => 'is_repos_fld_deleteable',
8291 p_error_message => SQLERRM,
8292 x_return_status => x_return_status,
8293 x_msg_count => x_msg_count,
8294 x_msg_data => x_msg_data);
8295 END is_repos_fld_deleteable;
8296
8297 --------------------------------------------------
8298 PROCEDURE delete_repository_folder (p_rp_folder_id IN NUMBER,
8299 x_return_status OUT NOCOPY VARCHAR2,
8300 x_msg_count OUT NOCOPY NUMBER,
8301 x_msg_data OUT NOCOPY VARCHAR2)
8302 IS
8303 TYPE number_type_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
8304 TYPE object_type_tbl IS TABLE OF VARCHAR2(3) INDEX BY BINARY_INTEGER;
8305 l_rp_fld_tbl number_type_tbl;
8306 l_object_id_tbl number_type_tbl;
8307 l_object_typ_tbl object_type_tbl;
8308 l_locked_models_tbl cz_security_pvt.number_type_tbl;
8309 l_model_name cz_devl_projects.name%TYPE;
8310 l_template_name cz_ui_templates.template_name%TYPE;
8311 l_count NUMBER := 0;
8312 FAILED_TO_LOCK_PRJ EXCEPTION;
8313 FAILED_TO_LOCK_UCT EXCEPTION;
8314 BEGIN
8315 FND_MSG_PUB.initialize;
8316 x_return_status := FND_API.g_ret_sts_success;
8317 x_msg_count := 0;
8318 x_msg_data := '';
8319
8320 ---check if models in the repository folder are locked
8321 l_rp_fld_tbl.DELETE;
8322 SELECT object_id
8323 BULK
8324 COLLECT
8325 INTO l_rp_fld_tbl
8326 FROM cz_rp_entries
8327 WHERE cz_rp_entries.deleted_flag = '0'
8328 AND cz_rp_entries.object_type = 'FLD'
8329 START WITH cz_rp_entries.object_type = 'FLD'
8330 AND cz_rp_entries.object_id = p_rp_folder_id
8331 CONNECT BY PRIOR cz_rp_entries.object_id = cz_rp_entries.enclosing_folder
8332 AND PRIOR cz_rp_entries.object_type = 'FLD';
8333
8334 is_repos_fld_deleteable (p_rp_folder_id,x_return_status,x_msg_count,x_msg_data);
8335 IF ( (x_return_status = FND_API.g_ret_sts_success)
8336 AND (l_rp_fld_tbl.COUNT > 0) ) THEN
8337 FOR I IN l_rp_fld_tbl.FIRST..l_rp_fld_tbl.LAST
8338 LOOP
8339 l_object_typ_tbl.DELETE;
8340 l_object_id_tbl.DELETE;
8341 BEGIN
8342 SELECT object_id, object_type
8343 BULK
8344 COLLECT
8345 INTO l_object_id_tbl, l_object_typ_tbl
8346 FROM cz_rp_entries
8347 WHERE object_type <> 'FLD'
8348 AND enclosing_folder = l_rp_fld_tbl(i)
8349 AND deleted_flag = '0';
8350 EXCEPTION
8351 WHEN NO_DATA_FOUND THEN
8352 NULL;
8353 END;
8354 IF (l_object_id_tbl.COUNT > 0) THEN
8355 FOR I IN l_object_id_tbl.FIRST..l_object_id_tbl.LAST
8356 LOOP
8357 IF (l_object_typ_tbl(i) = 'PRJ') THEN
8358 cz_security_pvt.lock_model(
8359 p_api_version => 1.0,
8360 p_model_id => l_object_id_tbl(i),
8361 p_lock_child_models => FND_API.G_FALSE,
8362 p_commit_flag => FND_API.G_FALSE,
8363 x_locked_entities => l_locked_models_tbl,
8364 x_return_status => x_return_status,
8365 x_msg_count => x_msg_count,
8366 x_msg_data => x_msg_data);
8367 IF ( x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8368 SELECT name INTO l_model_name FROM cz_devl_projects
8369 WHERE devl_project_id = l_object_id_tbl(i);
8370 RAISE FAILED_TO_LOCK_PRJ;
8371 END IF;
8372 UPDATE cz_devl_projects
8373 SET deleted_flag = '1'
8374 WHERE devl_project_id = l_object_id_tbl(i) ;
8375
8376 ELSIF (l_object_typ_tbl(i) = 'UCT') THEN
8377 cz_security_pvt.lock_template(
8378 p_api_version => 1.0,
8379 p_template_id => l_object_id_tbl(i),
8380 p_commit_flag => FND_API.G_FALSE,
8381 p_init_msg_list => FND_API.G_FALSE,
8382 x_return_status => x_return_status,
8383 x_msg_count => x_msg_count,
8384 x_msg_data => x_msg_data);
8385 IF ( x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8389 END IF;
8386 SELECT template_name INTO l_template_name FROM cz_ui_templates
8387 WHERE template_id = l_object_id_tbl(i);
8388 RAISE FAILED_TO_LOCK_UCT;
8390 UPDATE cz_ui_templates
8391 SET deleted_flag = '1'
8392 WHERE template_id = l_object_id_tbl(i)
8393 AND ui_def_id = 0;
8394
8395 ELSIF (l_object_typ_tbl(i) = 'UMT') THEN
8396 UPDATE cz_ui_defs
8397 SET deleted_flag = '1'
8398 WHERE ui_def_id = l_object_id_tbl(i);
8399 ELSIF (l_object_typ_tbl(i) = 'USG') THEN
8400 UPDATE cz_model_usages
8401 SET in_use = 'X'
8402 WHERE model_usage_id = l_object_id_tbl(i);
8403 DELETE FROM CZ_RP_ENTRIES
8404 WHERE OBJECT_TYPE = 'USG'
8405 AND OBJECT_ID = l_object_id_tbl(i);
8406 ELSIF (l_object_typ_tbl(i) = 'ARC') THEN
8407 UPDATE cz_archives
8408 SET deleted_flag = '1'
8409 WHERE archive_id = l_object_id_tbl(i);
8410 ELSIF (l_object_typ_tbl(i) = 'EFF') THEN
8411 UPDATE cz_effectivity_sets
8412 SET deleted_flag = '1'
8413 WHERE effectivity_set_id = l_object_id_tbl(i);
8414 ELSIF (l_object_typ_tbl(i) = 'PRP') THEN
8415 UPDATE cz_properties
8416 SET deleted_flag = '1'
8417 WHERE property_id = l_object_id_tbl(i);
8418 END IF;
8419 END LOOP;
8420 COMMIT;
8421 END IF;
8422 UPDATE cz_rp_entries
8423 SET deleted_flag = '1',
8424 name = append_name (object_id,object_type,name)
8425 WHERE object_type <> 'FLD'
8426 AND enclosing_folder = l_rp_fld_tbl(i);
8427 END LOOP;
8428
8429 l_count := l_rp_fld_tbl.COUNT;
8430 WHILE (l_count > 0)
8431 LOOP
8432 UPDATE cz_rp_entries
8433 SET deleted_flag = '1',
8434 name = append_name (l_rp_fld_tbl(l_count), 'FLD', name)
8435 WHERE object_type = 'FLD'
8436 AND object_id = l_rp_fld_tbl(l_count);
8437 l_count := l_count - 1;
8438 END LOOP;
8439 END IF;
8440 EXCEPTION
8441 WHEN FAILED_TO_LOCK_PRJ THEN
8442 x_return_status := FND_API.G_RET_STS_ERROR;
8443 add_error_message(p_message_name => 'CZ_CANNOT_LOC_PRJ',
8444 p_token_name1 => 'PRJNAME',
8445 p_token_value1 => l_model_name);
8446 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8447 p_data => x_msg_data);
8448 WHEN FAILED_TO_LOCK_UCT THEN
8449 x_return_status := FND_API.G_RET_STS_ERROR;
8450 add_error_message(p_message_name => 'CZ_CANNOT_LOC_UCT',
8451 p_token_name1 => 'UCTNAME',
8452 p_token_value1 => l_template_name);
8453 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8454 p_data => x_msg_data);
8455 WHEN OTHERS THEN
8456 handle_Error(p_procedure_name => 'delete_repository_folder',
8457 p_error_message => SQLERRM,
8458 x_return_status => x_return_status,
8459 x_msg_count => x_msg_count,
8460 x_msg_data => x_msg_data);
8461 END delete_repository_folder;
8462
8463 ----------------------------------------
8464 -- Returns -2 if all 64 usages plus 'Any Usage' are in use.
8465 PROCEDURE NEW_USAGE (enclosingFolderId IN NUMBER,
8466 usageId IN OUT NOCOPY NUMBER) AS
8467 try_id NUMBER := -1;
8468 nextVal NUMBER;
8469 CURSOR Xed_usages IS
8470 SELECT model_usage_id
8471 FROM cz_model_usages
8472 WHERE in_use = 'X'
8473 AND model_usage_id < 64
8474 ORDER BY model_usage_id;
8475 BEGIN
8476 usageId := -2;
8477 OPEN Xed_usages;
8478 LOOP
8479 FETCH Xed_usages INTO try_id;
8480 EXIT WHEN Xed_usages%NOTFOUND;
8481 usageId := try_id;
8482 UPDATE cz_model_usages SET
8483 in_use = '1', name = 'New Usage ' || try_id
8484 WHERE model_usage_id = try_id AND in_use = 'X';
8485 INSERT INTO cz_rp_entries(object_id, object_type, enclosing_folder, name)
8486 VALUES (usageId, 'USG',enclosingFolderId, 'New Usage ' || try_id);
8487 EXIT;
8488 END LOOP;
8489 CLOSE Xed_usages;
8490 END NEW_USAGE;
8491
8492 ------------------------------------------------------
8493 FUNCTION append_name(p_object_id IN NUMBER, p_object_type IN VARCHAR2, p_object_name IN VARCHAR2)
8494 RETURN VARCHAR2 IS
8495 BEGIN
8496 RETURN '_d:'||p_object_type||':'||p_object_id||';'||p_object_name;
8497 END append_name;
8498
8499 FUNCTION copy_name(p_object_id IN NUMBER,
8500 p_object_type IN VARCHAR2)
8501 RETURN VARCHAR2
8502
8503 AS
8504
8505 original_name cz_devl_projects.name%TYPE;
8506 copy_name cz_devl_projects.name%TYPE;
8507 L PLS_INTEGER := 0;
8508 x_error BOOLEAN := FALSE;
8509
8510 BEGIN
8511 BEGIN
8512 SELECT name
8513 INTO original_name
8514 FROM cz_rp_entries
8515 WHERE object_id = p_object_id
8516 AND object_type = p_object_type
8517 AND deleted_flag = '0';
8518 EXCEPTION
8519 WHEN NO_DATA_FOUND THEN
8520 original_name := NULL;
8521 WHEN OTHERS THEN
8522 original_name := NULL;
8523 END;
8524
8525 IF (original_name IS NOT NULL) THEN
8526
8527 BEGIN
8528
8532 WHERE name LIKE 'Copy (%) of '||original_name
8529 SELECT nvl(max(to_number(substr(SUBSTR(name, 1, instr(name,original_name, -1, 1)-1),7,instr(SUBSTR(name, 1, instr(name,original_name, -1, 1)-1),')',7)-7))),0)
8530 INTO L
8531 FROM cz_rp_entries
8533 and instr(SUBSTR(name, 1, instr(name,original_name, -1, 1)-1),'Copy (',7)=0
8534 and is_val_number(substr(SUBSTR(name, 1, instr(name,original_name, -1, 1)-1),7,instr(SUBSTR(name, 1, instr(name,original_name, -1, 1)-1),')',7)-7))='TRUE'
8535 AND deleted_flag = '0' and object_type=p_object_type;
8536
8537 -- L := to_number(substr(copy_name,7,instr(copy_name,')',7)-7));
8538
8539 EXCEPTION
8540 WHEN NO_DATA_FOUND THEN
8541 L := 0;
8542 END;
8543 END IF;
8544
8545 L := L + 1;
8546 copy_name := 'Copy ('||to_char(L)||') of '||original_name;
8547 RETURN copy_name ;
8548 EXCEPTION
8549 WHEN OTHERS THEN
8550 RETURN copy_name ;
8551 END copy_name;
8552 ------------------------------------------------------
8553 FUNCTION parse_to_statement (p_rule_id IN NUMBER) RETURN VARCHAR2 IS
8554
8555 EXPR_OPERATOR CONSTANT PLS_INTEGER := 200;
8556 EXPR_LITERAL CONSTANT PLS_INTEGER := 201;
8557 EXPR_PSNODE CONSTANT PLS_INTEGER := 205;
8558 EXPR_PROP CONSTANT PLS_INTEGER := 207;
8559 EXPR_PUNCT CONSTANT PLS_INTEGER := 208;
8560 EXPR_SYS_PROP CONSTANT PLS_INTEGER := 210;
8561 EXPR_CONSTANT CONSTANT PLS_INTEGER := 211;
8562 EXPR_ARGUMENT CONSTANT PLS_INTEGER := 221;
8563 EXPR_TEMPLATE CONSTANT PLS_INTEGER := 222;
8564 EXPR_FORALL CONSTANT PLS_INTEGER := 223;
8565 EXPR_ITERATOR CONSTANT PLS_INTEGER := 224;
8566 EXPR_WHERE CONSTANT PLS_INTEGER := 225;
8567 EXPR_COMPATIBLE CONSTANT PLS_INTEGER := 226;
8568 EXPR_OPERATORBYNAME CONSTANT PLS_INTEGER := 229;
8569
8570 DATA_TYPE_INTEGER CONSTANT PLS_INTEGER := 1;
8571 DATA_TYPE_DECIMAL CONSTANT PLS_INTEGER := 2;
8572 DATA_TYPE_BOOLEAN CONSTANT PLS_INTEGER := 3;
8573 DATA_TYPE_TEXT CONSTANT PLS_INTEGER := 4;
8574
8575 PS_NODE_TYPE_REFERENCE CONSTANT PLS_INTEGER := 263;
8576 PS_NODE_TYPE_CONNECTOR CONSTANT PLS_INTEGER := 264;
8577
8578 EXPR_CONSTANT_E CONSTANT PLS_INTEGER := 0;
8579 EXPR_CONSTANT_PI CONSTANT PLS_INTEGER := 1;
8580
8581 CONSTANT_PI CONSTANT VARCHAR2(3) := 'pi';
8582 CONSTANT_E CONSTANT VARCHAR2(3) := 'e';
8583
8584 NewLine CONSTANT VARCHAR2(25) := FND_GLOBAL.NEWLINE;
8585 StoreNlsCharacters VARCHAR2(16) := NlsNumericCharacters;
8586
8587 CZ_RT_NO_SUCH_RULE EXCEPTION;
8588 CZ_RT_INCORRECT_DATA EXCEPTION;
8589 CZ_RT_MULTIPLE_ROOTS EXCEPTION;
8590 CZ_RT_UNKNOWN_TYPE EXCEPTION;
8591 CZ_RT_INCORRECT_PROP EXCEPTION;
8592 CZ_RT_INCORRECT_NODE EXCEPTION;
8593 CZ_RT_TEMPLATE_UNKNOWN EXCEPTION;
8594 CZ_R_INCORRECT_DATA EXCEPTION;
8595 CZ_RT_INCORRECT_TOKEN EXCEPTION;
8596 CZ_RT_NO_SYSTEM_PROP EXCEPTION;
8597
8598 TYPE tStringTable IS TABLE OF VARCHAR2(32767) INDEX BY VARCHAR2(15);
8599 TYPE tIntegerTable IS TABLE OF PLS_INTEGER INDEX BY VARCHAR2(15);
8600 TYPE tNumberTable IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
8601
8602 TYPE tPsNodeName IS TABLE OF cz_ps_nodes.name%TYPE INDEX BY BINARY_INTEGER;
8603 TYPE tPropertyName IS TABLE OF cz_properties.name%TYPE INDEX BY BINARY_INTEGER;
8604 TYPE tExprId IS TABLE OF cz_expression_nodes.expr_node_id%TYPE INDEX BY BINARY_INTEGER;
8605 TYPE tExprParentId IS TABLE OF cz_expression_nodes.expr_parent_id%TYPE INDEX BY BINARY_INTEGER;
8606 TYPE tExprType IS TABLE OF cz_expression_nodes.expr_type%TYPE INDEX BY BINARY_INTEGER;
8607 TYPE tExprTemplateId IS TABLE OF cz_expression_nodes.template_id%TYPE INDEX BY BINARY_INTEGER;
8608 TYPE tExprPsNodeId IS TABLE OF cz_expression_nodes.ps_node_id%TYPE INDEX BY BINARY_INTEGER;
8609 TYPE tExplNodeId IS TABLE OF cz_expression_nodes.model_ref_expl_id%TYPE INDEX BY BINARY_INTEGER;
8610 TYPE tExprPropertyId IS TABLE OF cz_expression_nodes.property_id%TYPE INDEX BY BINARY_INTEGER;
8611 TYPE tExprDataType IS TABLE OF cz_expression_nodes.data_type%TYPE INDEX BY BINARY_INTEGER;
8612 TYPE tExprDataValue IS TABLE OF cz_expression_nodes.data_value%TYPE INDEX BY BINARY_INTEGER;
8613 TYPE tExprDataNumValue IS TABLE OF cz_expression_nodes.data_num_value%TYPE INDEX BY BINARY_INTEGER;
8614 TYPE tExprParamIndex IS TABLE OF cz_expression_nodes.param_index%TYPE INDEX BY BINARY_INTEGER;
8615 TYPE tExprArgumentName IS TABLE OF cz_expression_nodes.argument_name%TYPE INDEX BY BINARY_INTEGER;
8616 TYPE tExprArgumentIndex IS TABLE OF cz_expression_nodes.argument_index%TYPE INDEX BY BINARY_INTEGER;
8617
8618 h_PsNodeName tPsNodeName;
8619 h_PropertyName tPropertyName;
8620 h_FullName tIntegerTable;
8621
8622 h_ContextPath tStringTable;
8623 h_ModelPath tStringTable;
8624 h_NodeName tStringTable;
8625
8626 v_template_flag cz_rules.presentation_flag%TYPE;
8627 v_devl_project_id cz_rules.devl_project_id%TYPE;
8628 nLocalExprId PLS_INTEGER := 1000;
8629 nDebug PLS_INTEGER;
8630
8631 v_ExprId tExprId;
8632 v_ExprParentId tExprParentId;
8633 v_ExprType tExprType;
8634 v_ExprTemplateId tExprTemplateId;
8638 v_ExprDataType tExprDataType;
8635 v_ExprPsNodeId tExprPsNodeId;
8636 v_ExplNodeId tExplNodeId;
8637 v_ExprPropertyId tExprPropertyId;
8639 v_ExprDataValue tExprDataValue;
8640 v_ExprDataNumValue tExprDataNumValue;
8641 v_ExprParamIndex tExprParamIndex;
8642 v_ExprArgumentName tExprArgumentName;
8643
8644 vi_ExprId tExprId;
8645 vi_Name tStringTable;
8646 vi_Depth tIntegerTable;
8647 vi_Occurrence tIntegerTable;
8648
8649 v_ChildrenIndex tIntegerTable;
8650 v_NumberOfChildren tIntegerTable;
8651 v_RuleText VARCHAR2(32767);
8652 errmsg1 VARCHAR2(2000);
8653 errmsg2 VARCHAR2(2000);
8654 rootIndex PLS_INTEGER;
8655 isCompatible PLS_INTEGER := 0;
8656 ----------------------------------Bug6243144-------------------------------------------
8657 PROCEDURE SET_NLS_CHARACTERS(p_nls_characters IN VARCHAR2) IS
8658 BEGIN
8659
8660 IF(NlsNumericCharacters <> StoreNlsCharacters)THEN
8661 EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '''||p_nls_characters || '''';
8662 END IF;
8663
8664 END;
8665
8666 ---------------------------------------------------------------------------------------
8667 FUNCTION parse_expr_node (j IN PLS_INTEGER) RETURN VARCHAR2 IS
8668
8669 v_RuleText VARCHAR2(32767);
8670 v_Name VARCHAR2(32767);
8671 v_Index PLS_INTEGER;
8672 v_token cz_rules.template_token%TYPE;
8673 ---------------------------------------------------------------------------------------
8674 FUNCTION generate_model_path (p_ps_node_id IN NUMBER) RETURN VARCHAR2 IS
8675 v_Name VARCHAR2(32767);
8676 BEGIN
8677
8678 nDebug := 40;
8679
8680 IF(h_ModelPath.EXISTS(p_ps_node_id))THEN RETURN h_ModelPath(p_ps_node_id); END IF;
8681
8682 FOR c_name IN (SELECT name, parent_id FROM cz_ps_nodes
8683 START WITH ps_node_id = p_ps_node_id
8684 CONNECT BY PRIOR parent_id = ps_node_id) LOOP
8685
8686 IF(v_Name IS NULL)THEN
8687
8688 v_Name := '''' || REPLACE(c_name.name, '''', '\''') || '''';
8689 h_NodeName(p_ps_node_id) := v_Name;
8690
8691 FOR c_node IN (SELECT NULL FROM cz_ps_nodes WHERE deleted_flag = '0'
8692 AND devl_project_id = v_devl_project_id
8693 AND name = c_name.name
8694 AND ps_node_id <> p_ps_node_id)LOOP
8695 h_FullName(p_ps_node_id) := 1;
8696 EXIT;
8697 END LOOP;
8698 FOR c_node IN (SELECT NULL FROM cz_ps_nodes WHERE deleted_flag = '0'
8699 AND devl_project_id IN
8700 (SELECT component_id FROM cz_model_ref_expls
8701 WHERE deleted_flag = '0'
8702 AND model_id = v_devl_project_id
8703 AND ps_node_type IN (PS_NODE_TYPE_REFERENCE, PS_NODE_TYPE_CONNECTOR))
8704 AND name = c_name.name)LOOP
8705 h_FullName(p_ps_node_id) := 1;
8706 EXIT;
8707 END LOOP;
8708 ELSIF(c_name.parent_id IS NOT NULL)THEN -- This is to exclude the root model name from the path.
8709 v_Name := '''' || REPLACE(c_name.name, '''', '\''') || '''' || FND_GLOBAL.LOCAL_CHR(8) || v_Name;
8710 END IF;
8711 END LOOP;
8712
8713 h_ModelPath(p_ps_node_id) := v_Name;
8714 RETURN v_Name;
8715 END generate_model_path;
8716 ---------------------------------------------------------------------------------------
8717 FUNCTION generate_context_path (p_expl_id IN NUMBER) RETURN VARCHAR2 IS
8718 v_Node NUMBER;
8719 v_Name VARCHAR2(32767);
8720 v_ModelName VARCHAR2(32767);
8721 BEGIN
8722
8723 nDebug := 50;
8724
8725 --The path cashing is disabled because now it depends not only on expl_id, but also on the
8726 --participating node (see comment below).
8727
8728 --IF(h_ContextPath.EXISTS(p_expl_id))THEN RETURN h_ContextPath(p_expl_id); END IF;
8729
8730 v_Node := p_expl_id;
8731
8732 WHILE(v_Node IS NOT NULL)LOOP
8733
8734 IF(h_NodeType(v_Node) IN (PS_NODE_TYPE_REFERENCE, PS_NODE_TYPE_CONNECTOR))THEN
8735
8736 v_ModelName := NULL;
8737
8738 IF(h_NodeType(v_Node) = PS_NODE_TYPE_CONNECTOR AND
8739
8740 --We do not need to add the connected model name if the participating node is the model
8741 --itself, otherwise it will be twice in the path.
8742
8743 h_ComponentId(v_Node) <> v_ExprPsNodeId(j))THEN
8744
8745 BEGIN
8746
8747 SELECT name INTO v_ModelName FROM cz_ps_nodes
8748 WHERE ps_node_id = h_ComponentId(v_Node);
8749 EXCEPTION
8750 WHEN OTHERS THEN
8751 NULL;
8752 END;
8753 END IF;
8754
8755 IF(v_ModelName IS NOT NULL)THEN
8756
8757 v_ModelName := FND_GLOBAL.LOCAL_CHR(7) || '''' || REPLACE(v_ModelName, '''', '\''') || '''';
8758 END IF;
8762 END IF;
8759
8760 IF(v_Name IS NULL)THEN v_Name := generate_model_path(h_ReferringId(v_Node)) || v_ModelName;
8761 ELSE v_Name := generate_model_path(h_ReferringId(v_Node)) || v_ModelName || FND_GLOBAL.LOCAL_CHR(8) || v_Name;
8763 END IF;
8764
8765 v_Node := h_ParentId(v_Node);
8766 END LOOP;
8767
8768 --h_ContextPath(p_expl_id) := v_Name;
8769 RETURN v_Name;
8770 END generate_context_path;
8771 ---------------------------------------------------------------------------------------
8772 FUNCTION generate_name RETURN VARCHAR2 IS
8773 v_expl_id NUMBER := v_ExplNodeId(j);
8774 v_this VARCHAR2(32767);
8775 v_that VARCHAR2(32767);
8776 v_subthis VARCHAR2(32767);
8777 v_subthat VARCHAR2(32767);
8778 v_name VARCHAR2(32767);
8779 v_level PLS_INTEGER;
8780 v_depth PLS_INTEGER := 0;
8781 v_aux PLS_INTEGER;
8782 BEGIN
8783
8784 nDebug := 60;
8785
8786 IF(v_ExprPsNodeId(j) = h_ReferringId(v_expl_id))THEN
8787 v_expl_id := h_ParentId(v_expl_id);
8788 END IF;
8789
8790 IF(v_expl_id IS NOT NULL)THEN v_this := generate_context_path(v_expl_id); END IF;
8791 v_name := generate_model_path(v_ExprPsNodeId(j));
8792
8793 IF(v_this IS NULL)THEN
8794 IF(NOT h_FullName.EXISTS(v_ExprPsNodeId(j)))THEN v_name := h_NodeName(v_ExprPsNodeId(j)); END IF;
8795 ELSE
8796
8797 FOR i IN 1..v_NodeId.COUNT LOOP
8798
8799 IF(h_ComponentId(v_NodeId(i)) = h_ComponentId(v_expl_id) AND v_NodeId(i) <> v_expl_id)THEN
8800
8801 v_that := generate_context_path(v_NodeId(i));
8802 v_level := 1;
8803
8804 LOOP
8805
8806 v_subthis := SUBSTR(v_this, INSTR(v_this, FND_GLOBAL.LOCAL_CHR(8), -1, v_level) + 1);
8807 v_subthat := SUBSTR(v_that, INSTR(v_that, FND_GLOBAL.LOCAL_CHR(8), -1, v_level) + 1);
8808
8809 IF(v_subthis = v_this)THEN EXIT; END IF;
8810 IF(v_subthat = v_that)THEN v_Level := v_Level + 1; EXIT; END IF;
8811 IF(v_subthis <> v_subthat)THEN EXIT; END IF;
8812
8813 v_level := v_level + 1;
8814 END LOOP;
8815
8816 IF(v_level > v_depth)THEN v_depth := v_level; END IF;
8817 END IF;
8818 END LOOP;
8819
8820 IF(v_depth = 0)THEN
8821
8822 --Bug #4590481 - in this case we also need to concatenate the path. If the full path is not
8823 --required, the second line will reset it to just the node name.
8824
8825 v_name := v_this || FND_GLOBAL.LOCAL_CHR(8) || v_name;
8826
8827 IF(NOT h_FullName.EXISTS(v_ExprPsNodeId(j)))THEN v_name := h_NodeName(v_ExprPsNodeId(j)); END IF;
8828 ELSE v_name := SUBSTR(v_this, INSTR(v_this, FND_GLOBAL.LOCAL_CHR(8), -1, v_depth) + 1) || FND_GLOBAL.LOCAL_CHR(8) || v_name;
8829 END IF;
8830 END IF;
8831
8832 v_aux := 1;
8833
8834 FOR i IN 1..vi_Name.COUNT LOOP
8835 IF(v_name = vi_Name(i))THEN v_aux := v_aux + 1; END IF;
8836 END LOOP;
8837
8838 v_Index := vi_ExprId.COUNT + 1;
8839 vi_ExprId(v_Index) := v_ExprId(j);
8840 vi_Name(v_Index) := v_name;
8841 vi_Occurrence(v_Index) := v_aux;
8842
8843 v_Level := 1;
8844 WHILE(INSTR(v_name, FND_GLOBAL.LOCAL_CHR(8), 1, v_Level) <> 0)LOOP v_Level := v_Level + 1; END LOOP;
8845 vi_Depth(v_Index) := v_Level;
8846
8847 v_name := REPLACE(v_name, '''' || FND_GLOBAL.LOCAL_CHR(7) || '''', '''.''');
8848 v_name := REPLACE(v_name, '''' || FND_GLOBAL.LOCAL_CHR(8) || '''', '''.''');
8849
8850 RETURN v_name;
8851 END generate_name;
8852 ---------------------------------------------------------------------------------------
8853 BEGIN
8854
8855 IF(v_ExprType(j) IN (EXPR_OPERATOR, EXPR_OPERATORBYNAME))THEN
8856
8857 nDebug := 1000;
8858
8859 --First correct a data_type upgrade problem from czrules1.sql. This is an operator, its children
8860 --has not been generated into text yet. We will update data_type and data_num_value for children
8861 --in memory, if necessary, so that children will or will not be enclosed in quotes correctly. At
8862 --the end, we physically update the columns in cz_expression_nodes.
8863
8864 IF(v_ExprTemplateId(j) IN
8865 (318,320,321,322,323,350,351,352,353,399,401,402,403,
8866 404,405,406,407,408,409,410,411,412,413,414,415,416,
8867 417,418,430,431,432,433,434,435,436,437,438,439,551)
8868 AND v_ChildrenIndex.EXISTS(v_ExprId(j)))THEN
8869
8870 --This is one of the operators with only numeric operands or = or <>.
8871
8872 v_Index := v_ChildrenIndex(v_ExprId(j));
8873
8874 LOOP
8875
8876 IF(v_ExprType(v_Index) = EXPR_LITERAL AND v_ExprDataType(v_Index) IS NULL AND
8877 v_ExprDataNumValue(v_Index) IS NULL)THEN
8878
8879 --This is a literal child of the operator with undefined data_type and data_num_value.
8880 --Here we fix data only for such operands.
8881
8882 BEGIN
8883
8884 v_ExprDataNumValue(v_Index) := TO_NUMBER(v_ExprDataValue(v_Index));
8885 v_ExprDataType(v_Index) := DATA_TYPE_DECIMAL;
8889 WHEN OTHERS THEN
8886 IF(v_ExprTemplateId(j) = 551)THEN v_ExprDataType(v_Index) := DATA_TYPE_INTEGER; END IF;
8887
8888 EXCEPTION
8890 v_ExprDataType(v_Index) := DATA_TYPE_TEXT;
8891 END;
8892 END IF;
8893
8894 v_Index := v_Index + 1;
8895 EXIT WHEN (NOT v_ExprParentId.EXISTS(v_Index)) OR
8896 (v_ExprParentId(v_Index) IS NULL) OR
8897 (v_ExprParentId(v_Index) <> v_ExprId(j));
8898 END LOOP;
8899 END IF;
8900
8901 --Done with the data fix for data_type, data_num_value population after czrules1.sql.
8902
8903 IF(v_ExprType(j) = EXPR_OPERATORBYNAME)THEN
8904
8905 FOR n IN 1..h_RuleId.COUNT LOOP
8906
8907 IF(h_RuleName(h_RuleId(n)) = v_ExprArgumentName(j))THEN v_ExprTemplateId(j) := h_RuleId(n); EXIT; END IF;
8908 END LOOP;
8909 END IF;
8910
8911 IF(NOT h_TemplateToken.EXISTS(v_ExprTemplateId(j)))THEN
8912 errmsg1 := TO_CHAR(v_ExprTemplateId(j));
8913 RAISE CZ_RT_INCORRECT_TOKEN;
8914 END IF;
8915
8916 v_token := h_TemplateToken(v_ExprTemplateId(j));
8917
8918 IF((v_token IS NULL AND UPPER(h_RuleName(v_ExprTemplateId(j))) NOT IN ('CONTRIBUTESTO', 'CONSUMESFROM', 'ADDSTO', 'SUBTRACTSFROM')) OR
8919 v_NumberOfChildren(v_ExprId(j)) > 2)THEN
8920
8921 IF(UPPER(h_RuleName(v_ExprTemplateId(j))) <> 'NONE')THEN
8922 v_RuleText := NVL(h_RuleName(v_ExprTemplateId(j)), v_token) || '(';
8923 END IF;
8924
8925 IF(v_ChildrenIndex.EXISTS(v_ExprId(j)))THEN
8926
8927 v_Index := v_ChildrenIndex(v_ExprId(j));
8928
8929 LOOP
8930
8931 v_RuleText := v_RuleText || parse_expr_node(v_Index);
8932 v_Index := v_Index + 1;
8933
8934 EXIT WHEN (NOT v_ExprParentId.EXISTS(v_Index)) OR
8935 (v_ExprParentId(v_Index) IS NULL) OR
8936 (v_ExprParentId(v_Index) <> v_ExprId(j));
8937
8938 v_RuleText := v_RuleText || ', ';
8939 END LOOP;
8940 END IF;
8941
8942 IF(UPPER(h_RuleName(v_ExprTemplateId(j))) <> 'NONE')THEN
8943 v_RuleText := v_RuleText || ')';
8944 END IF;
8945 ELSE
8946
8947 IF(v_token IS NULL)THEN v_token := h_RuleName(v_ExprTemplateId(j)); END IF;
8948
8949 IF(v_ChildrenIndex.EXISTS(v_ExprId(j)))THEN
8950
8951 v_Index := v_ChildrenIndex(v_ExprId(j));
8952
8953 IF(v_NumberOfChildren(v_ExprId(j)) = 2)THEN
8954 IF(UPPER(v_token) IN ('CONTRIBUTESTO', 'CONSUMESFROM', 'ADDSTO', 'SUBTRACTSFROM'))THEN
8955
8956 IF(UPPER(v_token) = 'CONSUMESFROM')THEN
8957 v_RuleText := 'Contribute ((' || parse_expr_node(v_Index) || ') * -1) TO';
8958 ELSIF (UPPER(v_token) = 'CONTRIBUTESTO') THEN
8959 v_RuleText := 'Contribute ' || parse_expr_node(v_Index) || ' TO';
8960 ELSIF (UPPER(v_token) = 'ADDSTO') THEN
8961 v_RuleText := 'Add ' || parse_expr_node(v_Index) || ' TO';
8962 ELSIF (UPPER(v_token) = 'SUBTRACTSFROM') THEN
8963 v_RuleText := 'Subtract ' || parse_expr_node(v_Index) || ' FROM';
8964 END IF;
8965 v_token := NULL;
8966 ELSE
8967
8968 v_RuleText := parse_expr_node(v_Index) || ' ';
8969 END IF;
8970
8971 v_Index := v_Index + 1;
8972 END IF;
8973
8974 IF(UPPER(v_token) = 'CONSUMESFROM')THEN
8975 v_RuleText := v_RuleText || 'Contribute ((' || parse_expr_node(v_Index) || ') * -1) TO';
8976 ELSIF(UPPER(v_token) = 'CONTRIBUTESTO')THEN
8977 v_RuleText := v_RuleText || 'Contribute ' || parse_expr_node(v_Index) || ' TO';
8978 ELSIF(UPPER(v_token) = 'ADDSTO')THEN
8979 v_RuleText := v_RuleText || 'Add ' || parse_expr_node(v_Index) || ' TO';
8980 ELSIF(UPPER(v_token) = 'SUBTRACTSFROM')THEN
8981 v_RuleText := v_RuleText || 'Subtract ' || parse_expr_node(v_Index) || ' FROM';
8982 ELSE
8983 v_RuleText := v_RuleText || v_token || ' ' || parse_expr_node(v_Index);
8984 END IF;
8985 ELSE
8986
8987 v_RuleText := v_token;
8988 END IF;
8989 END IF;
8990
8991 ELSIF(v_ExprType(j) = EXPR_LITERAL)THEN
8992
8993 nDebug := 1001;
8994
8995 IF(v_ExprPropertyId(j) IS NULL)THEN
8996 IF(v_ExprDataType(j) IN (DATA_TYPE_INTEGER, DATA_TYPE_DECIMAL))THEN
8997
8998 v_RuleText := NVL ( NVL ( v_ExprDataNumValue(j), v_ExprDataValue(j)), '1');
8999
9000 ELSIF(v_ExprDataType(j) = DATA_TYPE_TEXT OR (v_ExprDataType(j) IS NULL AND v_ExprDataNumValue(j) IS NULL))THEN
9001
9002 v_RuleText := '"' || v_ExprDataValue(j) || '"';
9003
9004 ELSE
9005
9006 v_RuleText := NVL ( NVL ( v_ExprDataNumValue(j), v_ExprDataValue(j)), '1');
9007
9008 END IF;
9009 ELSE
9010
9011 --This is a literal representing property name.
9012
9013 v_RuleText := '.Property("' || v_ExprDataValue(j) || '")';
9014 END IF;
9015
9016 ELSIF(v_ExprType(j) = EXPR_PSNODE)THEN
9017
9018 nDebug := 1002;
9019
9020 v_RuleText := generate_name;
9021
9025
9022 IF(v_ChildrenIndex.EXISTS(v_ExprId(j)))THEN
9023
9024 v_Index := v_ChildrenIndex(v_ExprId(j));
9026 WHILE(v_ExprParentId.EXISTS(v_Index) AND v_ExprParentId(v_Index) = v_ExprId(j))LOOP
9027
9028 v_RuleText := v_RuleText || parse_expr_node(v_Index);
9029 v_Index := v_Index + 1;
9030 END LOOP;
9031 END IF;
9032
9033 ELSIF(v_ExprType(j) = EXPR_PROP)THEN
9034
9035 nDebug := 1003;
9036
9037 IF(NOT h_PropertyName.EXISTS(v_ExprPropertyId(j)))THEN
9038
9039 --We don't want to account for deleted_flag in this query because we want to parse a rule even
9040 --if it refers to a deleted property instead of ignoring the rule.
9041
9042 BEGIN
9043 SELECT name INTO v_Name FROM cz_properties
9044 WHERE property_id = v_ExprPropertyId(j);
9045
9046 h_PropertyName(v_ExprPropertyId(j)) := v_Name;
9047
9048 EXCEPTION
9049 WHEN OTHERS THEN
9050 errmsg1 := TO_CHAR(v_ExprId(j));
9051 errmsg2 := TO_CHAR(v_ExprPropertyId(j));
9052 RAISE CZ_RT_INCORRECT_PROP;
9053 END;
9054 ELSE
9055
9056 v_Name := h_PropertyName(v_ExprPropertyId(j));
9057 END IF;
9058
9059 v_RuleText := '.Property("' || v_Name || '")';
9060
9061 ELSIF(v_ExprType(j) = EXPR_SYS_PROP)THEN
9062
9063 nDebug := 1004;
9064
9065 IF(v_ExprTemplateId(j) IS NULL)THEN
9066 RAISE CZ_RT_NO_SYSTEM_PROP;
9067 END IF;
9068
9069 IF(isCompatible = 0)THEN v_RuleText := '.' || h_RuleName(v_ExprTemplateId(j)) || '()'; END IF;
9070
9071 ELSIF(v_ExprType(j) = EXPR_ARGUMENT)THEN
9072
9073 nDebug := 1005;
9074
9075 v_RuleText := v_ExprArgumentName(j);
9076 IF(SUBSTR(v_RuleText, 1, 1) <> FND_GLOBAL.LOCAL_CHR(38))THEN
9077
9078 v_RuleText := FND_GLOBAL.LOCAL_CHR(38) || v_RuleText;
9079 END IF;
9080
9081 IF(v_ChildrenIndex.EXISTS(v_ExprId(j)))THEN
9082
9083 v_Index := v_ChildrenIndex(v_ExprId(j));
9084
9085 WHILE(v_ExprParentId.EXISTS(v_Index) AND v_ExprParentId(v_Index) = v_ExprId(j))LOOP
9086
9087 v_RuleText := v_RuleText || parse_expr_node(v_Index);
9088 v_Index := v_Index + 1;
9089 END LOOP;
9090 END IF;
9091
9092 ELSIF(v_ExprType(j) = EXPR_TEMPLATE)THEN
9093
9094 nDebug := 1006;
9095
9096 v_RuleText := '@' || h_RuleName(v_ExprTemplateId(j));
9097
9098 ELSIF(v_ExprType(j) = EXPR_FORALL)THEN
9099
9100 nDebug := 1007;
9101
9102 v_RuleText := ' FOR ALL' || NewLine;
9103
9104 IF(v_ChildrenIndex.EXISTS(v_ExprId(j)))THEN
9105
9106 v_Index := v_ChildrenIndex(v_ExprId(j)) + v_NumberOfChildren(v_ExprId(j)) - 1;
9107
9108 IF(v_ExprParentId.EXISTS(v_Index) AND v_ExprParentId(v_Index) = v_ExprId(j) AND
9109 v_ExprType(v_Index) NOT IN (EXPR_ITERATOR, EXPR_WHERE))THEN
9110 IF(v_ExprParentId(j) IS NULL)THEN
9111 v_RuleText := parse_expr_node(v_Index) || v_RuleText;
9112 ELSE
9113 v_RuleText := '{ COLLECT ' || parse_expr_node(v_Index) || v_RuleText;
9114 END IF;
9115 END IF;
9116
9117 v_Index := v_ChildrenIndex(v_ExprId(j));
9118
9119 LOOP
9120
9121 v_RuleText := v_RuleText || parse_expr_node(v_Index);
9122 v_Index := v_Index + 1;
9123
9124 EXIT WHEN (NOT v_ExprParentId.EXISTS(v_Index)) OR
9125 (v_ExprType(v_Index) NOT IN (EXPR_ITERATOR, EXPR_WHERE)) OR
9126 (v_ExprParentId(v_Index) IS NULL) OR
9127 (v_ExprParentId(v_Index) <> v_ExprId(j));
9128
9129 IF(v_ExprType(v_Index - 1) = EXPR_ITERATOR AND v_ExprType(v_Index) = EXPR_ITERATOR)THEN
9130 v_RuleText := v_RuleText || ',';
9131 END IF;
9132 v_RuleText := v_RuleText || NewLine;
9133 END LOOP;
9134 IF(v_ExprParentId(j) IS NOT NULL)THEN v_RuleText := v_RuleText || '}'; END IF;
9135 END IF;
9136
9137 ELSIF(v_ExprType(j) = EXPR_ITERATOR)THEN
9138
9139 nDebug := 1008;
9140
9141 IF(isCompatible = 1)THEN v_RuleText := v_ExprArgumentName(j) || ' OF ';
9142 ELSE v_RuleText := v_ExprArgumentName(j) || ' IN {'; END IF;
9143 IF(SUBSTR(v_RuleText, 1, 1) <> FND_GLOBAL.LOCAL_CHR(38))THEN
9144
9145 v_RuleText := FND_GLOBAL.LOCAL_CHR(38) || v_RuleText;
9146 END IF;
9147
9148 IF(v_ChildrenIndex.EXISTS(v_ExprId(j)))THEN
9149
9150 v_Index := v_ChildrenIndex(v_ExprId(j));
9151
9152 LOOP
9153
9154 v_RuleText := v_RuleText || parse_expr_node(v_Index);
9155 v_Index := v_Index + 1;
9156
9157 EXIT WHEN (NOT v_ExprParentId.EXISTS(v_Index)) OR
9158 (v_ExprParentId(v_Index) IS NULL) OR
9159 (v_ExprParentId(v_Index) <> v_ExprId(j));
9160
9161 v_RuleText := v_RuleText || ', ';
9162 END LOOP;
9163 END IF;
9164
9165 IF(isCompatible = 0)THEN v_RuleText := v_RuleText || '}'; END IF;
9166
9167 ELSIF(v_ExprType(j) = EXPR_WHERE)THEN
9168
9169 nDebug := 1009;
9170
9171 v_RuleText := ' WHERE' || NewLine;
9172
9176
9173 IF(v_ChildrenIndex.EXISTS(v_ExprId(j)))THEN
9174
9175 v_Index := v_ChildrenIndex(v_ExprId(j));
9177 WHILE(v_ExprParentId.EXISTS(v_Index) AND v_ExprParentId(v_Index) = v_ExprId(j))LOOP
9178
9179 v_RuleText := v_RuleText || parse_expr_node(v_Index);
9180 v_Index := v_Index + 1;
9181 END LOOP;
9182 END IF;
9183
9184 ELSIF(v_ExprType(j) = EXPR_COMPATIBLE)THEN
9185
9186 nDebug := 1010;
9187
9188 isCompatible := 1;
9189 v_RuleText := 'COMPATIBLE' || NewLine;
9190
9191 IF(v_ChildrenIndex.EXISTS(v_ExprId(j)))THEN
9192
9193 v_Index := v_ChildrenIndex(v_ExprId(j));
9194
9195 LOOP
9196
9197 v_RuleText := v_RuleText || parse_expr_node(v_Index);
9198 v_Index := v_Index + 1;
9199
9200 EXIT WHEN (NOT v_ExprParentId.EXISTS(v_Index)) OR
9201 (v_ExprParentId(v_Index) IS NULL) OR
9202 (v_ExprParentId(v_Index) <> v_ExprId(j));
9203
9204 IF(v_ExprType(v_Index - 1) = EXPR_ITERATOR AND v_ExprType(v_Index) = EXPR_ITERATOR)THEN
9205 v_RuleText := v_RuleText || ',';
9206 END IF;
9207 v_RuleText := v_RuleText || NewLine;
9208 END LOOP;
9209 END IF;
9210 isCompatible := 0;
9211 ELSIF(v_ExprType(j) = EXPR_CONSTANT)THEN
9212
9213 IF(v_ExprTemplateId(j) = EXPR_CONSTANT_E)THEN
9214
9215 v_RuleText := CONSTANT_E;
9216 ELSE
9217
9218 v_RuleText := CONSTANT_PI;
9219 END IF;
9220 ELSE
9221 errmsg1 := TO_CHAR(v_ExprId(j));
9222 errmsg2 := TO_CHAR(v_ExprType(j));
9223 RAISE CZ_RT_UNKNOWN_TYPE;
9224 END IF;
9225
9226 RETURN v_RuleText;
9227 END parse_expr_node;
9228 ---------------------------------------------------------------------------------------
9229 FUNCTION parse_template_application (j IN PLS_INTEGER) RETURN VARCHAR2 IS
9230
9231 h_mapExprId tIntegerTable;
9232 jdef PLS_INTEGER;
9233 templateStart PLS_INTEGER;
9234 templateEnd PLS_INTEGER;
9235 v_index PLS_INTEGER;
9236
9237 v_ParamIndex tIntegerTable;
9238 v_multiply_id NUMBER;
9239 v_operator_index PLS_INTEGER;
9240 v_iterator_index PLS_INTEGER;
9241 v_argument_index PLS_INTEGER;
9242 v_literal_index PLS_INTEGER;
9243 l_options_applied PLS_INTEGER;
9244
9245 v_tTmplNodeId tExplNodeId;
9246 v_tTmplType tExprType;
9247 v_tTmplId tExprId;
9248 v_tTmplParentId tExprParentId;
9249 v_tTmplTemplateId tExprTemplateId;
9250 v_tTmplPsNodeId tExplNodeId;
9251 v_tTmplDataType tExprDataType;
9252 v_tTmplDataValue tExprDataValue;
9253 v_tTmplDataNumValue tExprDataValue;
9254 v_tTmplPropertyId tExprPropertyId;
9255 v_tTmplArgumentIndex tExprArgumentIndex;
9256 v_tTmplArgumentName tExprArgumentName;
9257 ---------------------------------------------------------------------------------------
9258 PROCEDURE read_template (p_template_id IN NUMBER) IS
9259 BEGIN
9260 SELECT model_ref_expl_id, expr_type, expr_node_id, expr_parent_id, template_id,
9261 ps_node_id, data_value, property_id, argument_index,
9262 argument_name, data_num_value, data_type
9263 BULK COLLECT INTO v_tTmplNodeId, v_tTmplType, v_tTmplId, v_tTmplParentId, v_tTmplTemplateId,
9264 v_tTmplPsNodeId, v_tTmplDataValue, v_tTmplPropertyId,
9265 v_tTmplArgumentIndex, v_tTmplArgumentName, v_tTmplDataNumValue, v_tTmplDataType
9266 FROM cz_expression_nodes
9267 WHERE rule_id = p_template_id
9268 AND expr_type <> EXPR_PUNCT
9269 AND deleted_flag = '0'
9270 ORDER BY expr_parent_id, seq_nbr;
9271
9272 IF(v_tTmplId.COUNT = 0)THEN
9273 RAISE CZ_RT_TEMPLATE_UNKNOWN;
9274 END IF;
9275 END read_template;
9276 ---------------------------------------------------------------------------------------
9277 FUNCTION copy_expression_node (j_from IN PLS_INTEGER, j_parent IN PLS_INTEGER) RETURN PLS_INTEGER IS
9278 j_to PLS_INTEGER;
9279 BEGIN
9280
9281 nDebug := 10;
9282
9283 j_to := v_ExprId.COUNT + 1;
9284 nLocalExprId := nLocalExprId + 1;
9285
9286 v_ExprId(j_to) := nLocalExprId;
9287 v_ExprParentId(j_to) := j_parent;
9288
9289 v_ExplNodeId(j_to) := v_ExplNodeId(j_from);
9290 v_ExprType(j_to) := v_ExprType(j_from);
9291 v_ExprTemplateId(j_to) := v_ExprTemplateId(j_from);
9292 v_ExprParamIndex(j_to) := v_ExprParamIndex(j_from);
9293 v_ExprPsNodeId(j_to) := v_ExprPsNodeId(j_from);
9294 v_ExprDataType(j_to) := v_ExprDataType(j_from);
9295 v_ExprDataValue(j_to) := v_ExprDataValue(j_from);
9296 v_ExprDataNumValue(j_to) := v_ExprDataNumValue(j_from);
9297 v_ExprPropertyId(j_to) := v_ExprPropertyId(j_from);
9298 v_ExprArgumentName(j_to) := v_ExprArgumentName(j_from);
9299
9300 nDebug := 19;
9301
9302 RETURN j_to;
9303 END copy_expression_node;
9304 ---------------------------------------------------------------------------------------
9305 PROCEDURE copy_expression_tree (j_from IN PLS_INTEGER, j_parent IN PLS_INTEGER) IS
9306 j_child PLS_INTEGER;
9307 j_children tIntegerTable;
9311
9308 BEGIN
9309
9310 nDebug := 20;
9312 IF(v_ChildrenIndex.EXISTS(v_ExprId(j_from)))THEN
9313
9314 j_child := v_ChildrenIndex(v_ExprId(j_from));
9315
9316 WHILE(v_ExprParentId(j_child) = v_ExprId(j_from))LOOP
9317
9318 j_children(j_child) := copy_expression_node(j_child, j_parent);
9319 j_child := j_child + 1;
9320 END LOOP;
9321
9322 j_child := v_ChildrenIndex(v_ExprId(j_from));
9323
9324 WHILE(v_ExprParentId(j_child) = v_ExprId(j_from))LOOP
9325
9326 copy_expression_tree(j_child, j_children(j_child));
9327 j_child := j_child + 1;
9328 END LOOP;
9329 END IF;
9330
9331 nDebug := 29;
9332
9333 END copy_expression_tree;
9334 ---------------------------------------------------------------------------------------
9335 PROCEDURE store_expr_node (j IN PLS_INTEGER) IS
9336 BEGIN
9337 v_ExprParentId(-1) := v_ExprParentId(j);
9338 v_ExplNodeId(-1) := v_ExplNodeId(j);
9339 v_ExprType(-1) := v_ExprType(j);
9340 v_ExprTemplateId(-1) := v_ExprTemplateId(j);
9341 v_ExprPsNodeId(-1) := v_ExprPsNodeId(j);
9342 v_ExprDataType(-1) := v_ExprDataType(j);
9343 v_ExprDataValue(-1) := v_ExprDataValue(j);
9344 v_ExprDataNumValue(-1) := v_ExprDataNumValue(j);
9345 v_ExprPropertyId(-1) := v_ExprPropertyId(j);
9346 v_ExprArgumentName(-1) := v_ExprArgumentName(j);
9347 v_ExprParamIndex(-1) := v_ExprParamIndex(j);
9348 v_ExprId(-1) := v_ExprId(j);
9349 END store_expr_node;
9350 ---------------------------------------------------------------------------------------
9351 PROCEDURE restore_expr_node (j IN PLS_INTEGER) IS
9352 BEGIN
9353 v_ExprParentId(j) := v_ExprParentId(-1);
9354 v_ExplNodeId(j) := v_ExplNodeId(-1);
9355 v_ExprType(j) := v_ExprType(-1);
9356 v_ExprTemplateId(j) := v_ExprTemplateId(-1);
9357 v_ExprPsNodeId(j) := v_ExprPsNodeId(-1);
9358 v_ExprDataType(j) := v_ExprDataType(-1);
9359 v_ExprDataValue(j) := v_ExprDataValue(-1);
9360 v_ExprDataNumValue(j) := v_ExprDataNumValue(-1);
9361 v_ExprPropertyId(j) := v_ExprPropertyId(-1);
9362 v_ExprArgumentName(j) := v_ExprArgumentName(-1);
9363 v_ExprParamIndex(j) := v_ExprParamIndex(-1);
9364 v_ExprId(j) := v_ExprId(-1);
9365
9366 v_ExprParentId.DELETE(-1);
9367 v_ExplNodeId.DELETE(-1);
9368 v_ExprType.DELETE(-1);
9369 v_ExprTemplateId.DELETE(-1);
9370 v_ExprPsNodeId.DELETE(-1);
9371 v_ExprDataType.DELETE(-1);
9372 v_ExprDataValue.DELETE(-1);
9373 v_ExprDataNumValue.DELETE(-1);
9374 v_ExprPropertyId.DELETE(-1);
9375 v_ExprArgumentName.DELETE(-1);
9376 v_ExprParamIndex.DELETE(-1);
9377 v_ExprId.DELETE(-1);
9378 END restore_expr_node;
9379 ---------------------------------------------------------------------------------------
9380 PROCEDURE shift_nodes_right (j_start IN PLS_INTEGER, j_end IN PLS_INTEGER) IS
9381 BEGIN
9382 FOR i IN REVERSE j_start..j_end LOOP
9383 v_ExprParentId(i + 1) := v_ExprParentId(i);
9384 v_ExplNodeId(i + 1) := v_ExplNodeId(i);
9385 v_ExprType(i + 1) := v_ExprType(i);
9386 v_ExprTemplateId(i + 1) := v_ExprTemplateId(i);
9387 v_ExprPsNodeId(i + 1) := v_ExprPsNodeId(i);
9388 v_ExprDataType(i + 1) := v_ExprDataType(i);
9389 v_ExprDataValue(i + 1) := v_ExprDataValue(i);
9390 v_ExprDataNumValue(i + 1) := v_ExprDataNumValue(i);
9391 v_ExprPropertyId(i + 1) := v_ExprPropertyId(i);
9392 v_ExprArgumentName(i + 1) := v_ExprArgumentName(i);
9393 v_ExprParamIndex(i + 1) := v_ExprParamIndex(i);
9394 v_ExprId(i + 1) := v_ExprId(i);
9395 END LOOP;
9396 END shift_nodes_right;
9397 ---------------------------------------------------------------------------------------
9398 BEGIN
9399
9400 nDebug := 30;
9401
9402 read_template(v_ExprTemplateId(j));
9403 templateStart := v_ExprId.COUNT + 1;
9404 l_options_applied := 0;
9405
9406 FOR i IN 1..v_tTmplId.COUNT LOOP
9407 IF(v_tTmplType(i) = EXPR_ARGUMENT AND v_tTmplArgumentIndex(i) IS NOT NULL)THEN
9408
9409 --This is an argument, may correspond to a collection of paramaters in the template
9410 --application.
9411
9412 jdef := 0;
9413
9414 FOR ii IN 1..templateStart - 1 LOOP
9415 IF(v_ExprParamIndex(ii) = v_tTmplArgumentIndex(i))THEN
9416
9417 jdef := 1;
9418 v_index := v_ExprId.COUNT + 1;
9419 nLocalExprId := nLocalExprId + 1;
9420
9421 IF(UPPER(h_RuleName(v_ExprTemplateId(j))) IN ('SIMPLENUMERICRULE', 'SIMPLEACCUMULATORRULE'))THEN
9422 IF(v_tTmplArgumentIndex(i) = 1)THEN
9423
9424 --This is the first argument of the SimpleNumericRule template application. If this is a
9425 --collection, we will have to rewrite the rule as a FORALL expression. Store the indexes
9426 --of these nodes for later use.
9427
9428 v_ParamIndex(v_ParamIndex.COUNT + 1) := v_index;
9429
9430 --Also, check if there is Options() property applied to the first argument - in this case
9431 --we again need a FORALL - bug #5350405.
9432
9433 IF(v_ChildrenIndex.EXISTS(v_ExprId(ii)) AND
9434 h_RuleName.EXISTS(v_ExprTemplateId(v_ChildrenIndex(v_ExprId(ii)))) AND
9438 END IF;
9435 UPPER(h_RuleName(v_ExprTemplateId(v_ChildrenIndex(v_ExprId(ii))))) = 'OPTIONS')THEN
9436
9437 l_options_applied := 1;
9439 ELSIF(v_tTmplArgumentIndex(i) = 2)THEN
9440
9441 --This is the literal operand of the 'Multiply' operator.
9442
9443 v_literal_index := v_index;
9444
9445 ELSIF(v_tTmplArgumentIndex(i) = 3)THEN
9446
9447 --This is the third argument of the SimpleNumericRule template application. Remember the
9448 --index for possible later use in case of converting to FORALL.
9449
9450 v_operator_index := v_index;
9451 END IF;
9452 END IF;
9453
9454 v_ExprId(v_index) := nLocalExprId;
9455 h_mapExprId(v_ExprId(ii)) := nLocalExprId;
9456
9457 --If this entry gets overwritten many times, it is not a problem because in this case it
9458 --will never be used.
9459
9460 h_mapExprId(v_tTmplId(i)) := nLocalExprId;
9461
9462 v_ExprParentId(v_index) := v_tTmplParentId(i);
9463 v_ExplNodeId(v_index) := v_ExplNodeId(ii);
9464 v_ExprType(v_index) := v_ExprType(ii);
9465 v_ExprTemplateId(v_index) := v_ExprTemplateId(ii);
9466 v_ExprPsNodeId(v_index) := v_ExprPsNodeId(ii);
9467 v_ExprDataType(v_index) := v_ExprDataType(ii);
9468 v_ExprDataValue(v_index) := v_ExprDataValue(ii);
9469 v_ExprDataNumValue(v_index) := v_ExprDataNumValue(ii);
9470 v_ExprPropertyId(v_index) := v_ExprPropertyId(ii);
9471 v_ExprArgumentName(v_index) := v_ExprArgumentName(ii);
9472 v_ExprParamIndex(v_index) := v_ExprParamIndex(ii);
9473
9474 IF(v_ExprType(v_index) = EXPR_TEMPLATE)THEN v_ExprType(v_index) := EXPR_OPERATOR; END IF;
9475 END IF;
9476 END LOOP;
9477 ELSE
9478
9479 --This is a regular node in the template definition, just copy.
9480
9481 v_index := v_ExprId.COUNT + 1;
9482 nLocalExprId := nLocalExprId + 1;
9483
9484 v_ExprId(v_index) := nLocalExprId;
9485 h_mapExprId(v_tTmplId(i)) := nLocalExprId;
9486
9487 v_ExprParentId(v_index) := v_tTmplParentId(i);
9488 v_ExplNodeId(v_index) := v_tTmplNodeId(i);
9489 v_ExprType(v_index) := v_tTmplType(i);
9490 v_ExprTemplateId(v_index) := v_tTmplTemplateId(i);
9491 v_ExprPsNodeId(v_index) := v_tTmplPsNodeId(i);
9492 v_ExprDataType(v_index) := v_tTmplDataType(i);
9493 v_ExprDataValue(v_index) := v_tTmplDataValue(i);
9494 v_ExprDataNumValue(v_index) := v_tTmplDataNumValue(i);
9495 v_ExprPropertyId(v_index) := v_tTmplPropertyId(i);
9496 v_ExprArgumentName(v_index) := v_tTmplArgumentName(i);
9497
9498 IF(UPPER(h_RuleName(v_ExprTemplateId(j))) IN ('SIMPLENUMERICRULE', 'SIMPLEACCUMULATORRULE') AND
9499 UPPER(h_RuleName(v_ExprTemplateId(v_index))) = 'MULTIPLY')THEN
9500
9501 --This is a SimpleNumericRule template application which we may need to convert to a FORALL rule.
9502 --Store the expr_node_id of the 'multiply' operator for possible later use.
9503
9504 v_multiply_id := v_ExprId(v_index);
9505 v_ExprParamIndex(v_index) := NULL;
9506
9507 END IF;
9508 END IF;
9509 END LOOP;
9510
9511 nDebug := 31;
9512
9513 templateEnd := v_ExprId.COUNT;
9514
9515 FOR i IN templateStart..templateEnd LOOP
9516 IF(v_ExprParentId(i) IS NOT NULL)THEN
9517
9518 IF(NOT h_mapExprId.EXISTS(v_ExprParentId(i)))THEN RAISE CZ_R_INCORRECT_DATA; END IF;
9519 v_ExprParentId(i) := h_mapExprId(v_ExprParentId(i));
9520 END IF;
9521 END LOOP;
9522
9523 FOR i IN 1..templateStart - 1 LOOP
9524 IF(h_mapExprId.EXISTS(v_ExprId(i)))THEN
9525
9526 copy_expression_tree(i, h_mapExprId(v_ExprId(i)));
9527 END IF;
9528 END LOOP;
9529
9530 --Convert to FORALL if necessary.
9531
9532 IF(v_ParamIndex.COUNT > 1 OR l_options_applied = 1)THEN
9533
9534 v_index := v_ExprId.COUNT + 1;
9535
9536 --Create the FORALL node.
9537
9538 v_ExprParentId(v_index) := NULL;
9539 v_ExplNodeId(v_index) := NULL;
9540 v_ExprType(v_index) := EXPR_FORALL;
9541 v_ExprTemplateId(v_index) := NULL;
9542 v_ExprPsNodeId(v_index) := NULL;
9543 v_ExprDataType(v_index) := NULL;
9544 v_ExprDataValue(v_index) := NULL;
9545 v_ExprDataNumValue(v_index) := NULL;
9546 v_ExprPropertyId(v_index) := NULL;
9547 v_ExprArgumentName(v_index) := NULL;
9548 v_ExprParamIndex(v_index) := NULL;
9549
9550 nLocalExprId := nLocalExprId + 1;
9551 v_ExprId(v_index) := nLocalExprId;
9552
9553 --Make the rule operator a child of the FORALL.
9554
9555 v_ExprParentId(v_operator_index) := nLocalExprId;
9556 v_index := v_index + 1;
9557
9558 --Create the iterator node as a child of the FORALL.
9559
9560 v_ExprParentId(v_index) := nLocalExprId;
9561 v_ExplNodeId(v_index) := NULL;
9562 v_ExprType(v_index) := EXPR_ITERATOR;
9563 v_ExprTemplateId(v_index) := NULL;
9564 v_ExprPsNodeId(v_index) := NULL;
9565 v_ExprDataType(v_index) := NULL;
9569 v_ExprArgumentName(v_index) := FND_GLOBAL.LOCAL_CHR(38) || 'x';
9566 v_ExprDataValue(v_index) := NULL;
9567 v_ExprDataNumValue(v_index) := NULL;
9568 v_ExprPropertyId(v_index) := NULL;
9570 v_ExprParamIndex(v_index) := NULL;
9571
9572 nLocalExprId := nLocalExprId + 1;
9573 v_ExprId(v_index) := nLocalExprId;
9574 v_iterator_index := v_index;
9575
9576 --Move all the 'Multiply' operands to be the children of the iterator.
9577
9578 FOR i IN 1..v_ParamIndex.COUNT LOOP
9579
9580 v_ExprParentId(v_ParamIndex(i)) := nLocalExprId;
9581 END LOOP;
9582 v_index := v_index + 1;
9583
9584 --Create the argument node as a child of the 'Multiply' operator.
9585
9586 v_ExprParentId(v_index) := v_multiply_id;
9587 v_ExplNodeId(v_index) := NULL;
9588 v_ExprType(v_index) := EXPR_ARGUMENT;
9589 v_ExprTemplateId(v_index) := NULL;
9590 v_ExprPsNodeId(v_index) := NULL;
9591 v_ExprDataType(v_index) := NULL;
9592 v_ExprDataValue(v_index) := NULL;
9593 v_ExprDataNumValue(v_index) := NULL;
9594 v_ExprPropertyId(v_index) := NULL;
9595 v_ExprArgumentName(v_index) := FND_GLOBAL.LOCAL_CHR(38) || 'x';
9596 v_ExprParamIndex(v_index) := NULL;
9597
9598 nLocalExprId := nLocalExprId + 1;
9599 v_ExprId(v_index) := nLocalExprId;
9600 v_argument_index := v_index;
9601
9602 --Now the new expression tree is build but we added three nodes at the end of the tree. However,
9603 --we need to emulate the ordering by expr_parent_id, seq_nbr which is significantly used in the
9604 --code.
9605
9606 --The newly added iterator node should be exactly before the rule operator node.
9607
9608 store_expr_node(v_iterator_index);
9609 shift_nodes_right(v_operator_index, v_iterator_index - 1);
9610 restore_expr_node(v_operator_index);
9611
9612 --We may need to adjust the stored index for the literal operand.
9613
9614 IF(v_literal_index > v_operator_index)THEN v_literal_index := v_literal_index + 1; END IF;
9615
9616 --The newly added argument node should be exactly before the literal operand.
9617
9618 store_expr_node(v_argument_index);
9619 shift_nodes_right(v_literal_index, v_argument_index - 1);
9620 restore_expr_node(v_literal_index);
9621 END IF;
9622
9623 --We need to populate all the auxiliary arrays because now this is the expression we will be
9624 --processing. We don't really have to empty these arrays.
9625
9626 nDebug := 32;
9627
9628 templateEnd := v_ExprId.COUNT;
9629 v_NumberOfChildren.DELETE;
9630 v_ChildrenIndex.DELETE;
9631
9632 FOR i IN templateStart..templateEnd LOOP
9633 IF(v_ExprParentId(i) IS NOT NULL)THEN
9634
9635 IF(v_NumberOfChildren.EXISTS(v_ExprParentId(i)))THEN
9636 v_NumberOfChildren(v_ExprParentId(i)) := v_NumberOfChildren(v_ExprParentId(i)) + 1;
9637 ELSE
9638 v_NumberOfChildren(v_ExprParentId(i)) := 1;
9639 END IF;
9640
9641 IF(NOT v_ChildrenIndex.EXISTS(v_ExprParentId(i)))THEN
9642 v_ChildrenIndex(v_ExprParentId(i)) := i;
9643 END IF;
9644
9645 ELSE
9646
9647 --This is the root of the exploded template application expression tree.
9648
9649 jdef := i;
9650 END IF;
9651 END LOOP;
9652
9653 nDebug := 39;
9654
9655 RETURN parse_expr_node(jdef);
9656 END parse_template_application;
9657 ---------------------------------------------------------------------------------------
9658 PROCEDURE prep_rule_seed_templ_arr IS
9659 v_RuleName tRuleName;
9660 v_TemplateToken tTemplateToken;
9661 BEGIN
9662 --Initialize the rule data for resolving token names.
9663 SELECT rule_id, name, template_token BULK COLLECT INTO h_RuleId, v_RuleName, v_TemplateToken
9664 FROM cz_rules
9665 WHERE devl_project_id = 0
9666 AND deleted_flag = '0'
9667 AND disabled_flag = '0'
9668 AND seeded_flag = '1';
9669
9670 FOR i IN 1..h_RuleId.COUNT LOOP
9671
9672 h_RuleName(h_RuleId(i)) := v_RuleName(i);
9673 h_TemplateToken(h_RuleId(i)) := v_TemplateToken(i);
9674 END LOOP;
9675 END prep_rule_seed_templ_arr;
9676 ---------------------------------------------------------------------------------------
9677 BEGIN
9678
9679 SELECT value INTO StoreNlsCharacters FROM NLS_SESSION_PARAMETERS
9680 WHERE UPPER(parameter) = 'NLS_NUMERIC_CHARACTERS';
9681
9682 SET_NLS_CHARACTERS(NlsNumericCharacters);
9683
9684 BEGIN
9685
9686 nDebug := 1;
9687
9688 BEGIN
9689 SELECT devl_project_id, presentation_flag INTO v_devl_project_id, v_template_flag FROM cz_rules
9690 WHERE deleted_flag = '0'
9691 AND rule_id = p_rule_id;
9692 EXCEPTION
9693 WHEN NO_DATA_FOUND THEN
9694 RAISE CZ_RT_NO_SUCH_RULE;
9695 END;
9696
9697 nDebug := 2;
9698
9699 -- Prepare static seeded rule data template
9700 IF (h_RuleName.COUNT = 0) THEN
9701 prep_rule_seed_templ_arr();
9702 END IF;
9703
9704 --Performance fix for model report ( bug6638552 )
9705 --Intitialize the explosion data.
9706 -- vsingava: 24-Nov-2008; Bug 7297669; Populate the data for all non-ModelReport runs
9707 IF NOT modelReportRun THEN
9711 WHERE model_id = v_devl_project_id
9708 SELECT model_ref_expl_id, parent_expl_node_id, component_id, referring_node_id, ps_node_type
9709 BULK COLLECT INTO v_NodeId, v_ParentId, v_ComponentId, v_ReferringId, v_NodeType
9710 FROM cz_model_ref_expls
9712 AND deleted_flag = '0';
9713
9714 FOR i IN 1..v_NodeId.COUNT LOOP
9715
9716 h_ParentId(v_NodeId(i)) := v_ParentId(i);
9717 h_NodeType(v_NodeId(i)) := v_NodeType(i);
9718 h_ReferringId(v_NodeId(i)) := v_ReferringId(i);
9719 h_ComponentId(v_NodeId(i)) := v_ComponentId(i);
9720 END LOOP;
9721 END IF;
9722
9723 --Read the expression into memory.
9724
9725 SELECT expr_node_id, expr_parent_id, expr_type, template_id,
9726 ps_node_id, model_ref_expl_id, property_id, data_type, data_value, data_num_value,
9727 param_index, argument_name
9728 BULK COLLECT INTO v_ExprId, v_ExprParentId, v_ExprType, v_ExprTemplateId,
9729 v_ExprPsNodeId, v_ExplNodeId, v_ExprPropertyId, v_ExprDataType, v_ExprDataValue, v_ExprDataNumValue,
9730 v_ExprParamIndex, v_ExprArgumentName
9731 FROM cz_expression_nodes
9732 WHERE rule_id = p_rule_id
9733 AND expr_type <> EXPR_PUNCT
9734 AND deleted_flag = '0'
9735 ORDER BY expr_parent_id, seq_nbr;
9736
9737 rootIndex := 0;
9738
9739 FOR i IN 1..v_ExprId.COUNT LOOP
9740
9741 IF(NOT v_NumberOfChildren.EXISTS(v_ExprId(i)))THEN v_NumberOfChildren(v_ExprId(i)) := 0; END IF;
9742
9743 IF(v_ExprParentId(i) IS NOT NULL)THEN
9744
9745 IF(v_NumberOfChildren.EXISTS(v_ExprParentId(i)))THEN
9746 v_NumberOfChildren(v_ExprParentId(i)) := v_NumberOfChildren(v_ExprParentId(i)) + 1;
9747 ELSE
9748 v_NumberOfChildren(v_ExprParentId(i)) := 1;
9749 END IF;
9750
9751 IF(NOT v_ChildrenIndex.EXISTS(v_ExprParentId(i)))THEN
9752 v_ChildrenIndex(v_ExprParentId(i)) := i;
9753 END IF;
9754 ELSE
9755
9756 IF(rootIndex = 0)THEN rootIndex := i; ELSE RAISE CZ_RT_MULTIPLE_ROOTS; END IF;
9757 END IF;
9758 END LOOP;
9759
9760 nDebug := 3;
9761
9762 IF(rootIndex = 0)THEN
9763 RAISE CZ_RT_INCORRECT_DATA;
9764 END IF;
9765
9766 IF(v_template_flag IS NULL OR v_template_flag = '1')THEN v_RuleText := parse_template_application(rootIndex);
9767 ELSE v_RuleText := parse_expr_node(rootIndex); END IF;
9768
9769 RETURN v_RuleText;
9770
9771 END;
9772
9773 SET_NLS_CHARACTERS(StoreNlsCharacters);
9774
9775 EXCEPTION
9776 WHEN CZ_RT_NO_SUCH_RULE THEN
9777 SET_NLS_CHARACTERS(StoreNlsCharacters);
9778 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ': cannot find the rule.');
9779 WHEN CZ_RT_MULTIPLE_ROOTS THEN
9780 SET_NLS_CHARACTERS(StoreNlsCharacters);
9781 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ': more than one record with null expr_parent_id.');
9782 WHEN CZ_RT_INCORRECT_DATA THEN
9783 SET_NLS_CHARACTERS(StoreNlsCharacters);
9784 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ': no rule data found.');
9785 WHEN CZ_RT_UNKNOWN_TYPE THEN
9786 SET_NLS_CHARACTERS(StoreNlsCharacters);
9787 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ', expr_node_id = ' || errmsg1 || ': unknown expression type, expr_type = ' || errmsg2 || '.');
9788 WHEN CZ_RT_INCORRECT_PROP THEN
9789 SET_NLS_CHARACTERS(StoreNlsCharacters);
9790 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ', expr_node_id = ' || errmsg1 || ': no such property, property_id = ' || errmsg2 || '.');
9791 WHEN CZ_RT_INCORRECT_NODE THEN
9792 SET_NLS_CHARACTERS(StoreNlsCharacters);
9793 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ', expr_node_id = ' || errmsg1 || ': no such node, ps_node_id = ' || errmsg2 || '.');
9794 WHEN CZ_RT_TEMPLATE_UNKNOWN THEN
9795 SET_NLS_CHARACTERS(StoreNlsCharacters);
9796 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ': template definition not available.');
9797 WHEN CZ_R_INCORRECT_DATA THEN
9798 SET_NLS_CHARACTERS(StoreNlsCharacters);
9799 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ': incorrect data in template application.');
9800 WHEN CZ_RT_INCORRECT_TOKEN THEN
9801 SET_NLS_CHARACTERS(StoreNlsCharacters);
9802 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ': unable to resolve template token for ' || errmsg1 || '.');
9803 WHEN CZ_RT_NO_SYSTEM_PROP THEN
9804 SET_NLS_CHARACTERS(StoreNlsCharacters);
9805 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ': no system property specified for a system property node.');
9806 WHEN OTHERS THEN
9807 SET_NLS_CHARACTERS(StoreNlsCharacters);
9808 errmsg1 := SQLERRM;
9809 RETURN NULL; --DBMS_OUTPUT.PUT_LINE('rule_id = ' || p_rule_id || ' at ' || nDebug || ': ' || errmsg1);
9810 END parse_to_statement;
9811 ---------------------------------------------------------------------------------------
9812 FUNCTION cut_dot(p_string IN VARCHAR2) RETURN VARCHAR2 IS
9813 BEGIN
9814 IF(SUBSTR(p_string, LENGTH(p_string), 1) = '.')THEN RETURN SUBSTR(p_string, 1, LENGTH(p_string) - 1);
9815 ELSE RETURN p_string; END IF;
9816 END;
9817 ---------------------------------------------------------------------------------------
9821 --p_end_node_id - end node ps_node_id.
9818 --This function generates a path of persistent_node_ids within a model.
9819
9820 --p_start_node_id - start node ps_node_id;
9822
9823 FUNCTION generate_model_path(p_start_node_id IN NUMBER,
9824 p_end_node_id IN NUMBER,
9825 p_annotate IN PLS_INTEGER)
9826 RETURN VARCHAR2 IS
9827
9828 v_path VARCHAR2(32000);
9829 v_local_path VARCHAR2(32000);
9830
9831 v_ps_node_id_hash t_varchar_array_tbl_type_vc2;-- kdande; Bug 6880555; 12-Mar-2008
9832 v_start_node_id_tab t_num_array_tbl_type;
9833 v_start_parent_id_tab t_num_array_tbl_type;
9834 v_start_persist_id_tab t_num_array_tbl_type;
9835 v_end_node_id_tab t_num_array_tbl_type;
9836 v_end_parent_id_tab t_num_array_tbl_type;
9837 v_end_persist_id_tab t_num_array_tbl_type;
9838 v_start_virtual_tab t_char_array_tbl_type;
9839 v_end_virtual_tab t_char_array_tbl_type;
9840
9841 v_separator VARCHAR2(1) := '/';
9842 v_annotation VARCHAR2(8) := '';
9843
9844 FUNCTION annotate(p_virtual_flag IN VARCHAR2) RETURN VARCHAR2 IS
9845 BEGIN
9846 IF(p_virtual_flag = '0')THEN RETURN v_annotation; END IF;
9847 RETURN '';
9848 END;
9849 BEGIN
9850
9851 IF(p_annotate = 1)THEN v_separator := '.'; v_annotation := '[#ANY]'; END IF;
9852 IF((p_start_node_id IS NULL AND p_end_node_id IS NULL) OR (p_start_node_id = p_end_node_id))THEN RETURN NULL; END IF;
9853
9854 SELECT ps_node_id, parent_id, persistent_node_id, virtual_flag
9855 BULK COLLECT INTO v_start_node_id_tab, v_start_parent_id_tab, v_start_persist_id_tab, v_start_virtual_tab
9856 FROM cz_ps_nodes
9857 WHERE deleted_flag = '0'
9858 START WITH ps_node_id = p_start_node_id
9859 CONNECT BY PRIOR parent_id = ps_node_id;
9860
9861 SELECT ps_node_id, parent_id, persistent_node_id, virtual_flag
9862 BULK COLLECT INTO v_end_node_id_tab, v_end_parent_id_tab, v_end_persist_id_tab, v_end_virtual_tab
9863 FROM cz_ps_nodes
9864 WHERE deleted_flag = '0'
9865 START WITH ps_node_id = p_end_node_id
9866 CONNECT BY PRIOR parent_id = ps_node_id;
9867
9868 IF(p_start_node_id IS NULL OR v_start_node_id_tab.COUNT = 1)THEN
9869
9870 --We need to construct the path down from the root to the end node.
9871
9872 FOR i IN 1..v_end_node_id_tab.COUNT - 1 LOOP
9873
9874 v_path := TO_CHAR(v_end_persist_id_tab(i)) || annotate(v_end_virtual_tab(i)) || v_separator || v_path;
9875 END LOOP;
9876 RETURN v_path;
9877 END IF;
9878
9879 IF(p_end_node_id IS NULL OR v_end_parent_id_tab.COUNT = 1)THEN
9880
9881 --We need to construct the '..' path up to the root from the start node.
9882
9883 FOR i IN 1..v_start_node_id_tab.COUNT - 1 LOOP
9884
9885 v_path := '..' || v_separator || v_path;
9886 END LOOP;
9887 RETURN v_path;
9888 END IF;
9889
9890 --We need to construct a mixed path from the start node to the end node.
9891 --In order to find the LCA of the two nodes, first build a hash map from the end node to the root.
9892
9893 FOR i IN 1..v_end_node_id_tab.COUNT LOOP
9894
9895 v_ps_node_id_hash(v_end_node_id_tab(i)) := v_local_path;
9896 v_local_path := TO_CHAR(v_end_persist_id_tab(i)) || annotate(v_end_virtual_tab(i)) || v_separator || v_local_path;
9897
9898 --In case the start node is a direct ancestor of the end node.
9899
9900 IF(v_end_parent_id_tab(i) = p_start_node_id)THEN RETURN v_local_path; END IF;
9901 END LOOP;
9902
9903 --We know that the start node is not a direct ancestor of the end node. Go up from the start node
9904 --until one of the following occurs: we hit the end node which is a direct ancestor of the start
9905 --node, or we hit entry in the hash table meaning the LCA.
9906
9907 FOR i IN 1..v_start_node_id_tab.COUNT LOOP
9908
9909 v_path := '..' || v_separator || v_path;
9910
9911 IF(v_start_parent_id_tab(i) = p_end_node_id)THEN RETURN v_path; END IF;
9912 IF(v_ps_node_id_hash.EXISTS(v_start_parent_id_tab(i)))THEN
9913
9914 RETURN v_path || v_ps_node_id_hash(v_start_parent_id_tab(i));
9915 END IF;
9916 END LOOP;
9917
9918 RETURN v_path || v_local_path;
9919 END generate_model_path;
9920 ---------------------------------------------------------------------------------------
9921 FUNCTION in_boundary (p_base_expl_id IN NUMBER,
9922 p_node_expl_id IN NUMBER,
9923 p_node_persistent_node_id IN NUMBER)
9924 RETURN PLS_INTEGER IS
9925
9926 v_base_expl_id_tab t_num_array_tbl_type;
9927 v_base_expl_type_tab t_num_array_tbl_type;
9928 v_node_expl_id_tab t_num_array_tbl_type;
9929 v_node_expl_type_tab t_num_array_tbl_type;
9930 v_base_path_expl_id t_num_array_tbl_type;
9931
9932 YES CONSTANT PLS_INTEGER := 1;
9933 NO CONSTANT PLS_INTEGER := 0;
9934 MANDATORY CONSTANT PLS_INTEGER := 2;
9935 CONNECTOR CONSTANT PLS_INTEGER := 3;
9936
9937 l_model_id NUMBER;
9938 l_component_id NUMBER;
9939 l_referring_node_id NUMBER;
9940 l_ps_node_id NUMBER;
9941 l_root_model_id NUMBER;
9942 l_persistent_node_id NUMBER;
9946
9943 l_it_is_in_subtree BOOLEAN := FALSE;
9944
9945 BEGIN
9947 IF(p_base_expl_id = p_node_expl_id)THEN RETURN YES; END IF;
9948
9949 SELECT model_id,component_id,referring_node_id
9950 INTO l_root_model_id, l_component_id, l_referring_node_id
9951 FROM CZ_MODEL_REF_EXPLS WHERE model_ref_expl_id=p_node_expl_id;
9952
9953 IF l_referring_node_id IS NULL THEN
9954 SELECT devl_project_id INTO l_model_id FROM CZ_PS_NODES
9955 WHERE ps_node_id=l_component_id;
9956
9957 SELECT ps_node_id INTO l_ps_node_id FROM CZ_PS_NODES
9958 WHERE devl_project_id=l_model_id AND
9959 persistent_node_id=p_node_persistent_node_id AND
9960 deleted_flag='0';
9961
9962 IF l_ps_node_id<>l_component_id THEN
9963 l_it_is_in_subtree := TRUE;
9964 END IF;
9965
9966 ELSE
9967
9968 SELECT persistent_node_id INTO l_persistent_node_id FROM CZ_PS_NODES
9969 WHERE ps_node_id=l_referring_node_id;
9970
9971 IF p_node_persistent_node_id=l_persistent_node_id THEN
9972 SELECT devl_project_id INTO l_model_id FROM CZ_PS_NODES
9973 WHERE ps_node_id=l_referring_node_id;
9974 ELSE
9975 SELECT devl_project_id INTO l_model_id FROM CZ_PS_NODES
9976 WHERE ps_node_id=l_component_id;
9977 END IF;
9978
9979 SELECT ps_node_id INTO l_ps_node_id FROM CZ_PS_NODES
9980 WHERE devl_project_id=l_model_id AND
9981 persistent_node_id=p_node_persistent_node_id AND
9982 deleted_flag='0';
9983
9984 IF l_ps_node_id<>l_referring_node_id THEN
9985 l_it_is_in_subtree := TRUE;
9986 END IF;
9987
9988 END IF;
9989
9990 SELECT model_ref_expl_id, expl_node_type
9991 BULK COLLECT INTO v_base_expl_id_tab, v_base_expl_type_tab
9992 FROM cz_model_ref_expls
9993 WHERE deleted_flag = '0'
9994 START WITH model_ref_expl_id = p_base_expl_id
9995 CONNECT BY PRIOR parent_expl_node_id = model_ref_expl_id;
9996
9997 SELECT model_ref_expl_id, expl_node_type
9998 BULK COLLECT INTO v_node_expl_id_tab, v_node_expl_type_tab
9999 FROM cz_model_ref_expls
10000 WHERE deleted_flag = '0'
10001 START WITH model_ref_expl_id = p_node_expl_id
10002 CONNECT BY PRIOR parent_expl_node_id = model_ref_expl_id;
10003
10004 FOR i IN 1..v_base_expl_id_tab.COUNT LOOP
10005
10006 --Go up the tree from the base node.
10007
10008 IF(v_base_expl_id_tab(i) = v_node_expl_id_tab(1))THEN
10009
10010 --We hit the argument node on the way up.
10011
10012 RETURN YES;
10013 END IF;
10014
10015 IF(v_base_expl_type_tab(i) = CONNECTOR AND i > 1)THEN
10016
10017 --We hit a connector on the way up before the argument node. However, the base node itself can
10018 --be a connector.
10019
10020 RETURN NO;
10021 END IF;
10022
10023 --Hash the explosion_id in order to detect a fork when going up from the argument.
10024
10025 v_base_path_expl_id(v_base_expl_id_tab(i)) := 1;
10026 END LOOP;
10027
10028 --We went all the way up from the base node but we haven't hit the argument node. So the
10029 --argument node is either down the tree or in a different branch.
10030
10031 FOR i IN 1..v_node_expl_id_tab.COUNT LOOP
10032
10033 --Go up the tree from the argument node. The rules for this walk are slightly different.
10034
10035 IF(v_node_expl_id_tab(i) = v_base_expl_id_tab(1))THEN
10036
10037 --We hit the base node on the way up without hitting non-virtual nodes or connectors.
10038
10039 RETURN YES;
10040 END IF;
10041
10042 IF(v_base_path_expl_id.EXISTS(v_node_expl_id_tab(i)))THEN
10043
10044 --We hit a node on the path up from the base - there is a fork in the boundary.
10045
10046 RETURN YES;
10047 END IF;
10048
10049 IF(v_node_expl_type_tab(i) = CONNECTOR AND i>1)THEN
10050
10051 --We hit a connector on the way up before the base node.
10052
10053 RETURN NO;
10054 END IF;
10055
10056 IF(v_node_expl_type_tab(i) <> MANDATORY) THEN
10057
10058 IF i>1 OR l_it_is_in_subtree THEN
10059 --We hit a non-virtual node on the way up before the base node - this is not allowed
10060 --for argument nodes because the base node should be in the deepest non-virtual net.
10061 RETURN NO;
10062 END IF;
10063
10064 END IF;
10065
10066 END LOOP;
10067
10068 --If we are here, the base and argument nodes are in different branches but still in
10069 --the allowable context.
10070
10071 RETURN YES;
10072 END in_boundary;
10073 ---------------------------------------------------------------------------------------
10074 FUNCTION in_cx_boundary (p_base_expl_id IN NUMBER,
10075 p_base_node_id IN NUMBER,
10076 p_node_expl_id IN NUMBER,
10077 p_node_node_id IN NUMBER)
10078 RETURN PLS_INTEGER IS
10079
10080 v_base_expl_id_tab t_num_array_tbl_type;
10081 v_base_expl_type_tab t_num_array_tbl_type;
10082 v_node_expl_id_tab t_num_array_tbl_type;
10083 v_node_expl_type_tab t_num_array_tbl_type;
10084 v_base_path_expl_id t_num_array_tbl_type;
10085
10086 YES CONSTANT PLS_INTEGER := 0;
10087 BASE_UNDER_CONNECTOR CONSTANT PLS_INTEGER := 1;
10091 MANDATORY CONSTANT PLS_INTEGER := 2;
10088 ARG_UNDER_CONNECTOR CONSTANT PLS_INTEGER := 2;
10089 CROSS_BOUNDARY CONSTANT PLS_INTEGER := 3;
10090
10092 CONNECTOR CONSTANT PLS_INTEGER := 3;
10093
10094 l_component_id NUMBER;
10095 l_referring_node_id NUMBER;
10096 base_is_in_subtree BOOLEAN := FALSE;
10097 node_is_in_subtree BOOLEAN := FALSE;
10098 BEGIN
10099
10100 SELECT component_id, referring_node_id
10101 INTO l_component_id, l_referring_node_id
10102 FROM cz_model_ref_expls WHERE model_ref_expl_id = p_base_expl_id;
10103
10104 IF(p_base_node_id <> NVL(l_referring_node_id, l_component_id))THEN base_is_in_subtree := TRUE; END IF;
10105
10106 SELECT component_id, referring_node_id
10107 INTO l_component_id, l_referring_node_id
10108 FROM cz_model_ref_expls WHERE model_ref_expl_id = p_node_expl_id;
10109
10110 IF(p_node_node_id <> NVL(l_referring_node_id, l_component_id))THEN node_is_in_subtree := TRUE; END IF;
10111
10112 SELECT model_ref_expl_id, expl_node_type
10113 BULK COLLECT INTO v_base_expl_id_tab, v_base_expl_type_tab
10114 FROM cz_model_ref_expls
10115 WHERE deleted_flag = '0'
10116 START WITH model_ref_expl_id = p_base_expl_id
10117 CONNECT BY PRIOR parent_expl_node_id = model_ref_expl_id;
10118
10119 SELECT model_ref_expl_id, expl_node_type
10120 BULK COLLECT INTO v_node_expl_id_tab, v_node_expl_type_tab
10121 FROM cz_model_ref_expls
10122 WHERE deleted_flag = '0'
10123 START WITH model_ref_expl_id = p_node_expl_id
10124 CONNECT BY PRIOR parent_expl_node_id = model_ref_expl_id;
10125
10126 --First check if base or argument nodes are in a connected structure - this is prohibited.
10127
10128 FOR i IN 1..v_base_expl_id_tab.COUNT LOOP
10129 IF(v_base_expl_type_tab(i) = CONNECTOR AND (i > 1 OR base_is_in_subtree))THEN
10130
10131 --We hit a connector on the way up (the base node itself can be a connector).
10132
10133 RETURN BASE_UNDER_CONNECTOR;
10134 END IF;
10135 END LOOP;
10136
10137 FOR i IN 1..v_node_expl_id_tab.COUNT LOOP
10138 IF(v_node_expl_type_tab(i) = CONNECTOR AND (i > 1 OR node_is_in_subtree))THEN
10139
10140 --We hit a connector on the way up (the argument itself can be a connector).
10141
10142 RETURN ARG_UNDER_CONNECTOR;
10143 END IF;
10144 END LOOP;
10145
10146 IF(p_base_expl_id = p_node_expl_id)THEN RETURN YES; END IF;
10147
10148 FOR i IN 1..v_base_expl_id_tab.COUNT LOOP
10149
10150 --Go up the tree from the base node.
10151
10152 IF(v_base_expl_id_tab(i) = v_node_expl_id_tab(1))THEN
10153
10154 --We hit the argument node on the way up.
10155
10156 RETURN YES;
10157 END IF;
10158
10159 --Hash the explosion_id in order to detect a fork when going up from the argument.
10160
10161 v_base_path_expl_id(v_base_expl_id_tab(i)) := 1;
10162 END LOOP;
10163
10164 --We went all the way up from the base node but we haven't hit the argument node. So the
10165 --argument node is either down the tree or in a different branch.
10166
10167 FOR i IN 1..v_node_expl_id_tab.COUNT LOOP
10168
10169 --Go up the tree from the argument node. The rules for this walk are slightly different.
10170
10171 IF(v_node_expl_id_tab(i) = v_base_expl_id_tab(1))THEN
10172
10173 --We hit the base node on the way up without hitting non-virtual nodes or connectors.
10174
10175 RETURN YES;
10176 END IF;
10177
10178 IF(v_base_path_expl_id.EXISTS(v_node_expl_id_tab(i)))THEN
10179
10180 --We hit a node on the path up from the base - there is a fork in the boundary.
10181
10182 RETURN YES;
10183 END IF;
10184
10185 IF(v_node_expl_type_tab(i) <> MANDATORY AND (i > 1 OR node_is_in_subtree)) THEN
10186
10187 --We hit a non-virtual node on the way up before the base node - this is not allowed
10188 --for argument nodes because the base node should be in the deepest non-virtual net.
10189
10190 RETURN CROSS_BOUNDARY;
10191 END IF;
10192 END LOOP;
10193
10194 --If we are here, the base and argument nodes are in different branches but still in
10195 --the allowable context.
10196
10197 RETURN YES;
10198 END in_cx_boundary;
10199 ---------------------------------------------------------------------------------------
10200 FUNCTION generate_relative_path_(p_base_expl_id IN NUMBER,
10201 p_base_node_id IN NUMBER,
10202 p_node_expl_id IN NUMBER,
10203 p_node_node_id IN NUMBER,
10204 p_annotate IN PLS_INTEGER)
10205 RETURN VARCHAR2 IS
10206
10207 v_base_expl_id_tab t_num_array_tbl_type;
10208 v_base_expl_type_tab t_num_array_tbl_type;
10209 v_base_ref_id_tab t_num_array_tbl_type;
10210 v_node_expl_id_tab t_num_array_tbl_type;
10211 v_node_expl_type_tab t_num_array_tbl_type;
10212 v_node_ref_id_tab t_num_array_tbl_type;
10213
10214 v_path VARCHAR2(32000);
10215 v_expl_path_hash t_varchar_array_tbl_type;
10216
10217 v_base_ref_expl_index PLS_INTEGER;
10218 v_node_ref_expl_index PLS_INTEGER;
10219 v_base_ref_expl_id NUMBER;
10220 v_node_ref_expl_id NUMBER;
10221 v_prev_referring_id NUMBER;
10225 REFERENCE CONSTANT PLS_INTEGER := 263;
10222 v_base_project_id NUMBER;
10223 v_node_project_id NUMBER;
10224
10226 CONNECTOR CONSTANT PLS_INTEGER := 264;
10227
10228 BEGIN
10229
10230 IF(p_base_node_id = p_node_node_id)THEN RETURN NULL; END IF;
10231
10232 SELECT devl_project_id INTO v_base_project_id FROM cz_ps_nodes
10233 WHERE ps_node_id = p_base_node_id;
10234
10235 SELECT devl_project_id INTO v_node_project_id FROM cz_ps_nodes
10236 WHERE ps_node_id = p_node_node_id;
10237
10238 IF(v_base_project_id = v_node_project_id)THEN
10239
10240 --The nodes are in the same model regardless of their types.
10241
10242 RETURN cut_dot(generate_model_path(p_base_node_id, p_node_node_id, p_annotate));
10243 END IF;
10244
10245 SELECT model_ref_expl_id, referring_node_id, ps_node_type
10246 BULK COLLECT INTO v_base_expl_id_tab, v_base_ref_id_tab, v_base_expl_type_tab
10247 FROM cz_model_ref_expls
10248 WHERE deleted_flag = '0'
10249 START WITH model_ref_expl_id = p_base_expl_id
10250 CONNECT BY PRIOR parent_expl_node_id = model_ref_expl_id;
10251
10252 SELECT model_ref_expl_id, referring_node_id, ps_node_type
10253 BULK COLLECT INTO v_node_expl_id_tab, v_node_ref_id_tab, v_node_expl_type_tab
10254 FROM cz_model_ref_expls
10255 WHERE deleted_flag = '0'
10256 START WITH model_ref_expl_id = p_node_expl_id
10257 CONNECT BY PRIOR parent_expl_node_id = model_ref_expl_id;
10258
10259 --Here we need to work only with references, because whatever explosions are within a model, they
10260 --will be processed in one call to generate_model_path. So, find the deepest references above the
10261 --base and argument nodes to start. Can as well be the root model or the nodes themselves.
10262
10263 FOR i IN 1..v_base_expl_id_tab.COUNT LOOP
10264
10265 v_base_ref_expl_index := i;
10266 IF(v_base_expl_type_tab(i) IN (REFERENCE, CONNECTOR))THEN EXIT; END IF;
10267 END LOOP;
10268
10269 FOR i IN 1..v_node_expl_id_tab.COUNT LOOP
10270
10271 v_node_ref_expl_index := i;
10272 IF(v_node_expl_type_tab(i) IN (REFERENCE, CONNECTOR))THEN EXIT; END IF;
10273 END LOOP;
10274
10275 --Explosion ids of the deepest references above the base and argument.
10276
10277 v_base_ref_expl_id := v_base_expl_id_tab(v_base_ref_expl_index);
10278 v_node_ref_expl_id := v_node_expl_id_tab(v_node_ref_expl_index);
10279
10280 IF(v_base_ref_expl_id = v_node_ref_expl_id)THEN
10281 IF(p_base_node_id = v_base_ref_id_tab(v_base_ref_expl_index))THEN
10282
10283 --The base node is the reference itself, so the argument is a node in the referenced model.
10284
10285 RETURN cut_dot(generate_model_path(NULL, p_node_node_id, p_annotate));
10286 ELSIF(p_node_node_id = v_node_ref_id_tab(v_node_ref_expl_index))THEN
10287
10288 --The argument node is the reference itself, so the base is a node in the referenced model.
10289
10290 RETURN cut_dot(generate_model_path(p_base_node_id, NULL, p_annotate));
10291 ELSE
10292
10293 --Both base and argument are in the same model.
10294
10295 RETURN cut_dot(generate_model_path(p_base_node_id, p_node_node_id, p_annotate));
10296 END IF;
10297 END IF;
10298
10299 --Now we know that base and argument are in different models. Check if the base node is in the
10300 --root model. If it is, we skip going up from it.
10301
10302 IF(v_base_ref_id_tab(v_base_ref_expl_index) IS NOT NULL)THEN
10303
10304 --We will go up from the base node because it is not in the root model.
10305 --If the base node is not the reference itself, we start the path with the model path from
10306 --the base node up.
10307
10308 IF(p_base_node_id <> v_base_ref_id_tab(v_base_ref_expl_index))THEN
10309
10310 v_path := generate_model_path(p_base_node_id, NULL, p_annotate);
10311 END IF;
10312
10313 v_prev_referring_id := v_base_ref_id_tab(v_base_ref_expl_index);
10314
10315 FOR i IN v_base_ref_expl_index + 1..v_base_expl_id_tab.COUNT LOOP
10316
10317 IF(v_base_expl_id_tab(i) = v_node_ref_expl_id)THEN
10318
10319 --We hit the argument node's explosion on the way up. If the argument node is the reference
10320 --itself, we build the path through the whole model, otherwise the argument is an internal
10321 --node, so we use a partial model path from the reference.
10322
10323 IF(p_node_node_id = v_node_ref_id_tab(v_node_ref_expl_index))THEN
10324
10325 v_path := v_path || generate_model_path(v_prev_referring_id, NULL, p_annotate);
10326 ELSE
10327
10328 v_path := v_path || generate_model_path(v_prev_referring_id, p_node_node_id, p_annotate);
10329 END IF;
10330 RETURN cut_dot(v_path);
10331 ELSIF(v_base_expl_type_tab(i) IN (REFERENCE, CONNECTOR) OR i = v_base_expl_id_tab.COUNT)THEN
10332
10333 v_path := v_path || generate_model_path(v_prev_referring_id, NULL, p_annotate);
10334 v_prev_referring_id := v_base_ref_id_tab(i);
10335
10336 --Create an entry in the hash table which may be used to find the LCA of the base and
10337 --argument nodes.
10338
10339 v_expl_path_hash(v_base_expl_id_tab(i)) := v_path;
10340 END IF;
10341 END LOOP;
10342 END IF; --the base node is not in the root model.
10343
10344 --We went all the way up from the base node but we haven't hit the argument node. So the
10348
10345 --argument node is either down the tree or in a different branch. We are going to go up
10346 --from the argument node. If the argument node is not the reference itself, we start
10347 --the path with the model path from the argument node up.
10349 --v_node_ref_id_tab(v_node_ref_expl_index) is not null: argument is not in the root model
10350 --otherwise we would have hit it before.
10351
10352 v_path := NULL;
10353 v_prev_referring_id := v_node_ref_id_tab(v_node_ref_expl_index);
10354
10355 IF(p_node_node_id <> v_node_ref_id_tab(v_node_ref_expl_index))THEN
10356
10357 v_path := generate_model_path(NULL, p_node_node_id, p_annotate);
10358 END IF;
10359
10360 FOR i IN v_node_ref_expl_index + 1..v_node_expl_id_tab.COUNT LOOP
10361
10362 --Go up the tree from the argument node's explosion.
10363
10364 IF(v_node_expl_id_tab(i) = v_base_ref_expl_id)THEN
10365
10366 --We hit the base node's explosion on the way up. If the base node is the reference itself
10367 --(or the root model) we build the path through the whole model, otherwise the base is an
10368 --internal node, so we use a partial model path from the reference.
10369
10370 IF(p_base_node_id = v_base_ref_id_tab(v_base_ref_expl_index))THEN
10371
10372 v_path := generate_model_path(NULL, v_prev_referring_id, p_annotate) || v_path;
10373 ELSE
10374
10375 v_path := generate_model_path(p_base_node_id, v_prev_referring_id, p_annotate) || v_path;
10376 END IF;
10377 RETURN cut_dot(v_path);
10378 ELSIF(v_node_expl_type_tab(i) IN (REFERENCE, CONNECTOR) OR i = v_node_expl_id_tab.COUNT)THEN
10379
10380 v_path := generate_model_path(NULL, v_prev_referring_id, p_annotate) || v_path;
10381 v_prev_referring_id := v_node_ref_id_tab(i);
10382 END IF;
10383
10384 IF(v_expl_path_hash.EXISTS(v_node_expl_id_tab(i)))THEN
10385
10386 --We hit the LCA. The base node is in the different branch, otherwise the hash entry would not
10387 --exist. This can be the very root model, so this is the ultimate return point.
10388
10389 RETURN cut_dot(v_expl_path_hash(v_node_expl_id_tab(i)) || v_path);
10390 END IF;
10391 END LOOP;
10392
10393 --Algorithmically we can never be here.
10394
10395 RAISE CZ_G_INVALID_RULE_EXPLOSION;
10396 END generate_relative_path_;
10397 ---------------------------------------------------------------------------------------
10398 FUNCTION generate_relative_path(p_base_expl_id IN NUMBER,
10399 p_base_node_id IN NUMBER,
10400 p_node_expl_id IN NUMBER,
10401 p_node_node_id IN NUMBER)
10402 RETURN VARCHAR2 IS
10403 BEGIN
10404 RETURN generate_relative_path_(p_base_expl_id, p_base_node_id, p_node_expl_id, p_node_node_id, 0);
10405 END;
10406 ---------------------------------------------------------------------------------------
10407 PROCEDURE verify_special_rule(p_rule_id IN NUMBER,
10408 p_name IN VARCHAR,
10409 x_run_id IN OUT NOCOPY NUMBER) IS
10410
10411 TYPE t_path_array_tbl_type IS TABLE OF VARCHAR2(32000) INDEX BY BINARY_INTEGER;
10412
10413 EXPR_NODE_TYPE_LITERAL CONSTANT PLS_INTEGER := 201;
10414 EXPR_NODE_TYPE_NODE CONSTANT PLS_INTEGER := 205;
10415 EXPR_NODE_TYPE_PUNCT CONSTANT PLS_INTEGER := 208;
10416 EXPR_JAVA_METHOD CONSTANT PLS_INTEGER := 216;
10417 EXPR_EVENT_PARAMETER CONSTANT PLS_INTEGER := 217;
10418 EXPR_SYSTEM_PARAMETER CONSTANT PLS_INTEGER := 218;
10419
10420 YES CONSTANT PLS_INTEGER := 0;
10421 BASE_UNDER_CONNECTOR CONSTANT PLS_INTEGER := 1;
10422 ARG_UNDER_CONNECTOR CONSTANT PLS_INTEGER := 2;
10423 CROSS_BOUNDARY CONSTANT PLS_INTEGER := 3;
10424
10425 DATA_TYPE_INTEGER CONSTANT PLS_INTEGER := 1;
10426 DATA_TYPE_DECIMAL CONSTANT PLS_INTEGER := 2;
10427
10428 INSTANTIATION_SCOPE_INST CONSTANT PLS_INTEGER := 1;
10429
10430 EVT_ON_COMMAND_NAME CONSTANT VARCHAR2(30) := 'ONCOMMAND';
10431 EVT_POSTADD_NAME CONSTANT VARCHAR2(30) := 'POSTINSTANCEADD';
10432 EVT_POSTDELETE_NAME CONSTANT VARCHAR2(30) := 'POSTINSTANCEDELETE';
10433 COMPONENT_JAVA_TYPE CONSTANT VARCHAR2(2000) := 'oracle.apps.cz.cio.Component';
10434 COMPONENTSET_JAVA_TYPE CONSTANT VARCHAR2(2000) := 'oracle.apps.cz.cio.ComponentSet';
10435 COMPONENTINST_JAVA_TYPE CONSTANT VARCHAR2(2000) := 'oracle.apps.cz.cio.ComponentInstance';
10436 STRING_JAVA_TYPE CONSTANT VARCHAR2(2000) := 'java.lang.String';
10437
10438 CZ_R_NO_PARTICIPANTS EXCEPTION;
10439 CZ_R_WRONG_EXPRESSION_NODE EXCEPTION;
10440 CZ_G_INVALID_RULE_EXPLOSION EXCEPTION;
10441 CZ_R_INCORRECT_NODE_ID EXCEPTION;
10442 CZ_R_LITERAL_NO_VALUE EXCEPTION;
10443
10444 flagInvalidCX PLS_INTEGER;
10445 x_error PLS_INTEGER;
10446 v_number NUMBER;
10447
10448 v_rule_type NUMBER;
10449 v_component_id NUMBER;
10450 v_virtual_flag VARCHAR2(1);
10451 v_persistent_id NUMBER;
10452 v_base_name cz_ps_nodes.name%TYPE;
10453 v_node_name cz_ps_nodes.name%TYPE;
10454 v_expl_id NUMBER;
10455 v_class_name VARCHAR2(2000);
10456 v_model_id NUMBER;
10460 v_model_name VARCHAR2(2000);
10457 v_rule_folder_id NUMBER;
10458 v_signature_name VARCHAR2(2000);
10459 v_rule_name VARCHAR2(2000);
10461 v_seeded_flag VARCHAR2(1);
10462 v_arg_count NUMBER;
10463 v_property_value VARCHAR2(4000);
10464 v_property_name cz_properties.name%TYPE;
10465 v_item_name cz_ps_nodes.name%TYPE;
10466 v_parent_name cz_ps_nodes.name%TYPE;
10467 v_parent_id cz_ps_nodes.parent_id%TYPE;
10468 v_inst_scope cz_rules.instantiation_scope%TYPE;
10469
10470 v_tExprId t_num_array_tbl_type;
10471 v_tExprParentId t_num_array_tbl_type;
10472 v_tExplNodeId t_num_array_tbl_type;
10473 v_tExprType t_num_array_tbl_type;
10474 v_tExprSubtype t_num_array_tbl_type;
10475 v_tExprPsNodeId t_num_array_tbl_type;
10476 v_tExprArgSignature t_num_array_tbl_type;
10477 v_tExprParSignature t_num_array_tbl_type;
10478 v_tExprParamIndex t_num_array_tbl_type;
10479 v_tExprDataValue t_varchar_array_tbl_type;
10480 v_tExprDataNumValue t_num_array_tbl_type;
10481 v_tArgumentIndex t_num_array_tbl_type;
10482 v_tExprArgumentName t_varchar_array_tbl_type;
10483 v_tExprDataType t_num_array_tbl_type;
10484 v_tDataType t_num_array_tbl_type;
10485 v_tArgumentName t_varchar_array_tbl_type;
10486 v_tPropertyId t_num_array_tbl_type;
10487 v_tExprArgumentIndex t_num_array_tbl_type;
10488 v_RelativeNodePath t_path_array_tbl_type;
10489 v_tJavaDataType t_varchar_array_tbl_type;
10490 h_tJavaDataType t_varchar_array_tbl_type;
10491 h_tArgumentName t_varchar_array_tbl_type;
10492
10493 nDebug PLS_INTEGER := 20;
10494 aux_flag PLS_INTEGER;
10495 expressionSize PLS_INTEGER;
10496 expressionStart PLS_INTEGER;
10497 expressionEnd PLS_INTEGER;
10498 initRuleStatus PLS_INTEGER :=1;
10499 ---------------------------------------------------------------------------------------
10500 PROCEDURE report(inMessage IN VARCHAR2, inUrgency IN PLS_INTEGER) IS
10501 BEGIN
10502 INSERT INTO cz_db_logs (message, statuscode, caller, urgency, run_id, logtime)
10503 VALUES (inMessage, nDebug, 'verify_special_rule', inUrgency, x_run_id, SYSDATE);
10504 END;
10505 ---------------------------------------------------------------------------------------
10506 PROCEDURE mark_rule_invalid IS
10507 BEGIN
10508 UPDATE cz_rules SET invalid_flag = '1' WHERE rule_id = p_rule_id;
10509 END;
10510 ---------------------------------------------------------------------------------------
10511 PROCEDURE mark_rule_valid IS
10512 BEGIN
10513 UPDATE cz_rules SET invalid_flag = '0' WHERE rule_id = p_rule_id;
10514 END;
10515 ---------------------------------------------------------------------------------------
10516 PROCEDURE set_status(initRuleStatus IN PLS_INTEGER) IS
10517 BEGIN
10518 if initRuleStatus='0'
10519 then
10520 mark_rule_invalid;
10521 end if;
10522 END;
10523 ---------------------------------------------------------------------------------------
10524 FUNCTION rule_name RETURN VARCHAR2 IS
10525 v_qualified VARCHAR2(4000) := '.';
10526 n_rule_name PLS_INTEGER;
10527 BEGIN
10528
10529 IF(p_name IS NOT NULL)THEN RETURN p_name; END IF;
10530 IF(v_rule_folder_id IS NULL OR v_rule_folder_id = -1)THEN RETURN v_rule_name; END IF;
10531
10532 n_rule_name := LENGTHB(v_rule_name);
10533
10534 FOR folder IN (SELECT name FROM cz_rule_folders
10535 WHERE deleted_flag = '0'
10536 AND parent_rule_folder_id IS NOT NULL
10537 START WITH rule_folder_id = v_rule_folder_id
10538 AND object_type = 'RFL'
10539 CONNECT BY PRIOR parent_rule_folder_id = rule_folder_id
10540 AND object_type = 'RFL')LOOP
10541
10542 IF(LENGTHB(folder.name) + LENGTHB(v_qualified) + 1 < 2000 - n_rule_name)THEN
10543
10544 v_qualified := '.' || folder.name || v_qualified;
10545 ELSE
10546
10547 v_qualified := v_qualified || '...'; EXIT;
10548 END IF;
10549 END LOOP;
10550 RETURN v_qualified || v_rule_name;
10551 END;
10552 ---------------------------------------------------------------------------------------
10553 PROCEDURE verify_node(p_node_id IN NUMBER, x_persistent_id OUT NOCOPY NUMBER,
10554 x_name OUT NOCOPY VARCHAR2, x_virtual_flag OUT NOCOPY VARCHAR2) IS
10555 BEGIN
10556 SELECT persistent_node_id, name, virtual_flag
10557 INTO x_persistent_id, x_name, x_virtual_flag
10558 FROM cz_ps_nodes
10559 WHERE deleted_flag = '0' AND ps_node_id = p_node_id;
10560 EXCEPTION
10561 WHEN OTHERS THEN
10562 RAISE CZ_R_WRONG_EXPRESSION_NODE;
10563 END;
10564 ---------------------------------------------------------------------------------------
10565 PROCEDURE verify_explosion(p_expl_id IN NUMBER) IS
10566 BEGIN
10567 SELECT NULL INTO aux_flag FROM cz_model_ref_expls
10568 WHERE deleted_flag = '0' AND model_ref_expl_id = p_expl_id
10569 AND model_id = v_model_id;
10570 EXCEPTION
10571 WHEN OTHERS THEN
10572 RAISE CZ_G_INVALID_RULE_EXPLOSION;
10576 RETURN BOOLEAN IS
10573 END;
10574 ---------------------------------------------------------------------------------------
10575 FUNCTION is_compatible_event(p_signature_id IN NUMBER, p_data_type IN PLS_INTEGER, p_argument_index IN VARCHAR2)
10577 v_null PLS_INTEGER;
10578 BEGIN
10579
10580 SELECT NULL INTO v_null FROM cz_conversion_rels_v rel, cz_cx_event_params_v par
10581 WHERE par.event_signature_id = p_signature_id
10582 AND par.argument_index = p_argument_index
10583 AND rel.subject_type = par.data_type
10584 AND rel.object_type = p_data_type AND par.p_model_id = v_model_id;
10585
10586 RETURN TRUE;
10587 EXCEPTION
10588 WHEN NO_DATA_FOUND THEN
10589 RETURN FALSE;
10590 WHEN TOO_MANY_ROWS THEN
10591 RETURN TRUE;
10592 WHEN OTHERS THEN
10593 RETURN FALSE;
10594 END;
10595 ---------------------------------------------------------------------------------------
10596 FUNCTION is_compatible_system(p_data_type IN PLS_INTEGER, p_argument_name IN VARCHAR2) RETURN BOOLEAN IS
10597 v_null PLS_INTEGER;
10598 BEGIN
10599
10600 SELECT NULL INTO v_null FROM cz_conversion_rels_v rel, cz_cx_system_params_v par
10601 WHERE par.data_value = p_argument_name
10602 AND rel.subject_type = par.data_type
10603 AND rel.object_type = p_data_type;
10604
10605 RETURN TRUE;
10606 EXCEPTION
10607 WHEN NO_DATA_FOUND THEN
10608 RETURN FALSE;
10609 WHEN TOO_MANY_ROWS THEN
10610 RETURN TRUE;
10611 WHEN OTHERS THEN
10612 RETURN FALSE;
10613 END;
10614 ---------------------------------------------------------------------------------------
10615 BEGIN
10616
10617 IF(x_run_id IS NULL OR x_run_id = 0)THEN
10618 SELECT cz_xfr_run_infos_s.NEXTVAL INTO x_run_id FROM DUAL;
10619 END IF;
10620
10621 SELECT rule_type, component_id, model_ref_expl_id, devl_project_id, rule_folder_id, name,
10622 class_name, seeded_flag, invalid_flag, instantiation_scope
10623 INTO v_rule_type, v_component_id, v_expl_id, v_model_id, v_rule_folder_id, v_rule_name,
10624 v_class_name, v_seeded_flag, initRuleStatus, v_inst_scope
10625 FROM cz_rules
10626 WHERE rule_id = p_rule_id;
10627
10628 IF(v_seeded_flag = '1')THEN x_run_id := 0; RETURN; END IF;
10629
10630 IF v_model_id > 0 THEN
10631 BEGIN
10632 SELECT name INTO v_model_name
10633 FROM cz_devl_projects
10634 WHERE devl_project_id = v_model_id;
10635 EXCEPTION
10636 WHEN NO_DATA_FOUND THEN
10637 RAISE;
10638 END;
10639 END IF;
10640
10641 --We will mark the rule invalid by default. If the rule will pass all the verifications and the
10642 --relative node path will be successfully generated, we will mark the rule valid.
10643 --Bug #3526242.
10644
10645 -- mark_rule_invalid;
10646 flagInvalidCX := 0;
10647
10648 SELECT expr_node_id, expr_parent_id, model_ref_expl_id, expr_type, expr_subtype, ps_node_id,
10649 argument_signature_id, param_signature_id, param_index, data_value,
10650 data_num_value, argument_name, data_type, argument_index, property_id
10651 BULK COLLECT INTO v_tExprId, v_tExprParentId, v_tExplNodeId, v_tExprType, v_tExprSubtype, v_tExprPsNodeId,
10652 v_tExprArgSignature, v_tExprParSignature, v_tExprParamIndex, v_tExprDataValue,
10653 v_tExprDataNumValue, v_tExprArgumentName, v_tExprDataType, v_tExprArgumentIndex,
10654 v_tPropertyId
10655 FROM cz_expression_nodes
10656 WHERE rule_id = p_rule_id
10657 AND expr_type <> EXPR_NODE_TYPE_PUNCT
10658 AND deleted_flag = '0';
10659
10660 IF(v_tExprType.COUNT = 0)THEN
10661 RAISE CZ_R_NO_PARTICIPANTS;
10662 END IF;
10663
10664 expressionSize := v_tExprType.COUNT;
10665 expressionStart := 1;
10666 expressionEnd := expressionSize;
10667
10668 IF(v_rule_type = RULE_TYPE_JAVA_METHOD)THEN
10669
10670 --This is Configurator Extention rule. Here we will validate all argument bindings and
10671 --data types.
10672
10673 --If the class name is specified on the rule, verify there are some archives associated
10674 --with the model. We do not validate that such class does exist in one of the archives.
10675 --If there is no class name, report as incomplete.
10676
10677 IF(v_class_name IS NULL)THEN
10678
10679 --'Incomplete data: No class name specified for the Configurator Extension ''%RULENAME'' in model ''%MODELNAME''.'
10680
10681 report(CZ_UTILS.GET_TEXT('CZ_LCE_NO_PROGRAM_STRING', 'RULENAME', rule_name, 'MODELNAME', v_model_name), 1);
10682 flagInvalidCX := 1;
10683
10684 ELSIF(v_component_id IS NULL OR v_expl_id IS NULL)THEN
10685
10686 --'Incomplete data: No base component specified for the Configurator Extension ''%RULENAME'' in model ''%MODELNAME''.'
10687
10688 report(CZ_UTILS.GET_TEXT('CZ_LCE_NO_BASE_COMPONENT', 'RULENAME', rule_name, 'MODELNAME', v_model_name), 1);
10689 flagInvalidCX := 1;
10690 END IF;
10691
10692 FOR i IN expressionStart..expressionEnd LOOP
10693
10694 IF(v_tExprType(i) = EXPR_JAVA_METHOD)THEN
10695
10696 --This is an event binding. Verify that argument_signature_id and param_signature_id are specified.
10697
10698 IF(v_tExprArgSignature(i) IS NULL)THEN
10699
10700 --'Incomplete data: No event binding specified for the Configurator Extension ''%RULENAME'' in model ''%MODELNAME''.'
10701
10705
10702 report(CZ_UTILS.GET_TEXT('CZ_LCE_NO_BINDING', 'RULENAME', rule_name, 'MODELNAME', v_model_name), 1);
10703 flagInvalidCX := 1;
10704 ELSE
10706 --Read the signature and verify that if the event is EVT_ON_COMMAND, data_value contains the command.
10707
10708 BEGIN
10709
10710 SELECT name INTO v_signature_name FROM cz_signatures
10711 WHERE deleted_flag = '0' AND signature_id = v_tExprArgSignature(i);
10712
10713 IF(UPPER(v_signature_name) = EVT_ON_COMMAND_NAME AND v_tExprDataValue(i) IS NULL)THEN
10714
10715 --'Incomplete data: No command string specified for the ''On Command'' event in the Configurator
10716 -- Extension ''%RULENAME'' in model ''%MODELNAME''.'
10717
10718 report(CZ_UTILS.GET_TEXT('CZ_LCE_NO_COMMAND', 'RULENAME', rule_name, 'MODELNAME', v_model_name), 1);
10719 flagInvalidCX := 1;
10720 END IF;
10721
10722 EXCEPTION
10723 WHEN OTHERS THEN
10724 report(CZ_UTILS.GET_TEXT('CZ_LCE_NO_BINDING', 'RULENAME', rule_name, 'MODELNAME', v_model_name), 1);
10725 flagInvalidCX := 1;
10726 END;
10727 END IF;
10728
10729 IF(v_tExprParSignature(i) IS NULL)THEN
10730
10731 --'Incomplete data: No Java method signature specified in the Configurator Extension ''%RULENAME'' in model ''%MODELNAME''.'
10732
10733 report(CZ_UTILS.GET_TEXT('CZ_LCE_NO_JAVA_SIGNATURE', 'RULENAME', rule_name, 'MODELNAME', v_model_name), 1);
10734 flagInvalidCX := 1;
10735 ELSE
10736
10737 --Read the signature to verify the number of parameters.
10738
10739 BEGIN
10740
10741 SELECT argument_count INTO v_arg_count FROM cz_signatures
10742 WHERE deleted_flag = '0' AND signature_id = v_tExprParSignature(i);
10743
10744 --Read the java signature arguments and verify the parameters and their types.
10745
10746 v_tArgumentIndex.DELETE;
10747 v_tDataType.DELETE;
10748 v_tArgumentName.DELETE;
10749 v_tJavaDataType.DELETE;
10750
10751 SELECT argument_index, data_type, argument_name, java_data_type
10752 BULK COLLECT INTO v_tArgumentIndex, v_tDataType, v_tArgumentName, v_tJavaDataType
10753 FROM cz_signature_arguments
10754 WHERE deleted_flag = '0'
10755 AND argument_signature_id = v_tExprParSignature(i);
10756
10757 --Verify that the count of the arguments equals to the number specified in the signature,
10758 --then verify the binding and the type for every argument.
10759
10760 IF(v_tArgumentIndex.COUNT <> v_arg_count)THEN
10761
10762 --'Incorrect signature arguments data for Configurator Extension ''%RULENAME'' in model ''%MODELNAME''.'
10763
10764 report(CZ_UTILS.GET_TEXT('CZ_LCE_WRONG_ARGUMENTS', 'RULENAME', rule_name, 'MODELNAME', v_model_name), 1);
10765 flagInvalidCX := 1;
10766 END IF;
10767
10768 FOR ii IN 1..v_tArgumentIndex.COUNT LOOP
10769
10770 aux_flag := 0;
10771
10772 FOR iii IN expressionStart..expressionEnd LOOP
10773
10774 IF(v_tExprParSignature(iii) = v_tExprParSignature(i) AND
10775 v_tExprParentId(iii) = v_tExprId(i) AND
10776 v_tExprParamIndex(iii) = v_tArgumentIndex(ii))THEN
10777
10778 IF((v_tExprType(iii) = EXPR_EVENT_PARAMETER AND v_tExprArgSignature(iii) IS NOT NULL AND
10779 v_tExprArgumentIndex(iii) IS NOT NULL AND is_compatible_event(v_tExprArgSignature(iii), v_tDataType(ii), v_tExprArgumentIndex(iii))) OR
10780 (v_tExprType(iii) = EXPR_SYSTEM_PARAMETER AND v_tExprArgumentName(iii) IS NOT NULL AND
10781 is_compatible_system(v_tDataType(ii), v_tExprArgumentName(iii))) OR
10782 (v_tExprType(iii) = EXPR_NODE_TYPE_NODE AND v_tExprPsNodeId(iii) IS NOT NULL AND v_tExplNodeId(iii) IS NOT NULL) OR
10783 (v_tExprType(iii) = EXPR_NODE_TYPE_LITERAL AND (v_tJavaDataType(ii) = STRING_JAVA_TYPE OR
10784 (v_tExprDataValue(iii) IS NOT NULL OR v_tExprDataNumValue(iii) IS NOT NULL))) OR
10785 v_tExprType(iii) NOT IN (EXPR_EVENT_PARAMETER, EXPR_SYSTEM_PARAMETER, EXPR_NODE_TYPE_NODE, EXPR_NODE_TYPE_LITERAL))THEN
10786
10787 aux_flag := iii;
10788 h_tJavaDataType(iii) := v_tJavaDataType(ii);
10789 h_tArgumentName(iii) := v_tArgumentName(ii);
10790 EXIT;
10791 END IF;
10792 END IF;
10793 END LOOP;
10794
10795 IF(aux_flag = 0)THEN
10796
10797 --'No parameter bound to the argument ''%ARGUMENTNAME'' in Configurator Extension ''%RULENAME'' in model ''%MODELNAME''.'
10798
10799 report(CZ_UTILS.GET_TEXT('CZ_LCE_NO_PARAM_BOUND', 'ARGUMENTNAME', v_tArgumentName(ii), 'RULENAME', rule_name, 'MODELNAME', v_model_name), 1);
10800 flagInvalidCX := 1;
10801 END IF;
10802 END LOOP;
10803
10804 EXCEPTION
10805 WHEN OTHERS THEN
10806 report(CZ_UTILS.GET_TEXT('CZ_LCE_NO_JAVA_SIGNATURE', 'RULENAME', rule_name, 'MODELNAME', v_model_name), 1);
10807 flagInvalidCX := 1;
10808 END;
10809 END IF;
10810 END IF;
10811 END LOOP;
10812 END IF;
10813
10817 IF(v_expl_id IS NOT NULL)THEN verify_explosion(v_expl_id); END IF;
10814 IF(flagInvalidCX = 0)THEN
10815
10816 IF(v_component_id IS NOT NULL)THEN verify_node(v_component_id, v_persistent_id, v_base_name, v_virtual_flag); END IF;
10818
10819 FOR i IN expressionStart..expressionEnd LOOP
10820
10821 v_RelativeNodePath(i) := NULL;
10822
10823 IF(v_tExprPsNodeId(i) IS NOT NULL)THEN
10824
10825 verify_node(v_tExprPsNodeId(i), v_persistent_id, v_node_name, v_virtual_flag);
10826
10827 IF(v_rule_type = RULE_TYPE_JAVA_METHOD AND v_virtual_flag = '1' AND
10828 h_tJavaDataType.EXISTS(i) AND h_tJavaDataType(i) = COMPONENTSET_JAVA_TYPE)THEN
10829
10830 --This is a mandatory component with java data type of ComponentSet (bug #4178506).
10831
10832 --'You cannot bind a mandatory component to a component set. The Java parameter ''%ARGUMENTNAME'' is of the
10833 -- type ComponentSet. ''%NODENAME'' is a mandatory component.'
10834 report(CZ_UTILS.GET_TEXT('CZ_LCE_VIRTUAL_COMPONENT', 'ARGUMENTNAME', h_tArgumentName(i), 'NODENAME', v_node_name), 1);
10835 flagInvalidCX := 1;
10836 END IF;
10837
10838 IF(v_tExplNodeId(i) IS NULL)THEN
10839
10840 RAISE CZ_G_INVALID_RULE_EXPLOSION;
10841 ELSE
10842 verify_explosion(v_tExplNodeId(i));
10843 END IF;
10844 END IF;
10845
10846 IF(v_rule_type = RULE_TYPE_JAVA_METHOD AND v_tPropertyId(i) IS NOT NULL)THEN
10847
10848 FOR ii IN expressionStart..expressionEnd LOOP
10849 IF(v_tExprId(ii) = v_tExprParentId(i))THEN
10850
10851 BEGIN
10852 SELECT NVL(property_value, property_num_value) INTO v_property_value
10853 FROM cz_psnode_propval_v
10854 WHERE ps_node_id = v_tExprPsNodeId(ii)
10855 AND property_id = v_tPropertyId(i);
10856 EXCEPTION
10857 WHEN NO_DATA_FOUND THEN
10858 v_property_value := NULL;
10859 END;
10860
10861 IF(v_property_value IS NULL)THEN
10862
10863 v_property_name := NULL;
10864 v_item_name := NULL;
10865 v_parent_id := NULL;
10866 v_parent_name := NULL;
10867
10868 BEGIN
10869 SELECT name INTO v_property_name
10870 FROM cz_properties
10871 WHERE deleted_flag = '0'
10872 AND property_id = v_tPropertyId(i);
10873
10874 SELECT parent_id, name INTO v_parent_id, v_item_name
10875 FROM cz_ps_nodes
10876 WHERE deleted_flag = '0'
10877 AND ps_node_id = v_tExprPsNodeId(ii);
10878
10879 SELECT name INTO v_parent_name
10880 FROM cz_ps_nodes
10881 WHERE deleted_flag = '0'
10882 AND ps_node_id = v_parent_id;
10883 EXCEPTION
10884 WHEN OTHERS THEN
10885 --Just use the information we can get and log the following message.
10886 NULL;
10887 END;
10888
10889 --'Property value for ''%PROPERTYNAME'' is not defined for item ''%ITEMNAME'' with parent ''%PARENTNAME''
10890 -- in model ''%MODELNAME''. Rule ''%RULENAME'' ignored.
10891 report(CZ_UTILS.GET_TEXT('CZ_R_OPTION_NO_PROPERTY', 'PROPERTYNAME', v_property_name, 'ITEMNAME', v_item_name,
10892 'PARENTNAME', v_parent_name, 'MODELNAME', v_model_name, 'RULENAME', rule_name), 1);
10893 flagInvalidCX := 1;
10894 END IF;
10895 EXIT;
10896 END IF;
10897 END LOOP;
10898 END IF;
10899
10900 IF(v_tExprType(i) = EXPR_NODE_TYPE_NODE)THEN
10901 IF(v_tExprPsNodeId(i) IS NULL)THEN
10902
10903 RAISE CZ_R_INCORRECT_NODE_ID;
10904 END IF;
10905 ELSIF(v_tExprType(i) = EXPR_NODE_TYPE_LITERAL)THEN
10906 IF(((NOT h_tJavaDataType.EXISTS(i)) OR h_tJavaDataType(i) IS NULL OR h_tJavaDataType(i) <> STRING_JAVA_TYPE) AND
10907 v_tExprDataValue(i) IS NULL AND v_tExprDataNumValue(i) IS NULL)THEN
10908
10909 RAISE CZ_R_LITERAL_NO_VALUE;
10910 END IF;
10911
10912 IF(v_tExprDataType(i) IN (DATA_TYPE_INTEGER, DATA_TYPE_DECIMAL) AND v_tExprDataNumValue(i) IS NULL)THEN
10913
10914 BEGIN
10915 v_number := TO_NUMBER(v_tExprDataValue(i));
10916 EXCEPTION
10917 WHEN OTHERS THEN
10918 RAISE CZ_R_INCORRECT_NODE_ID;
10919 END;
10920 END IF;
10921 END IF;
10922
10923 IF(v_tExprPsNodeId(i) IS NOT NULL AND v_expl_id IS NOT NULL AND v_component_id IS NOT NULL)THEN
10924 IF(v_rule_type = RULE_TYPE_JAVA_METHOD AND h_tJavaDataType.EXISTS(i))THEN
10925
10926 x_error := in_cx_boundary(v_expl_id, v_component_id, v_tExplNodeId(i), v_tExprPsNodeId(i));
10927
10928 IF(x_error = YES)THEN
10929
10930 v_RelativeNodePath(i) := generate_relative_path(v_expl_id, v_component_id, v_tExplNodeId(i), v_tExprPsNodeId(i));
10931
10932 IF(v_virtual_flag = '0')THEN
10933
10934 --Bug #4178506. This is an instantiable component or component set. Check the generated path.
10938
10935 --If the path ends with ../ then we approach the argument from below, and so if it is a
10936 --component set, we need to add /../<id>/ to the path. If the path ends with <id>/ then we
10937 --are approaching the argument from above, and so if it is a component, it should be rejected.
10939 IF(SUBSTR(v_RelativeNodePath(i), LENGTH(v_RelativeNodePath(i)) - 2, 3) = '../')THEN
10940 IF(h_tJavaDataType(i) = COMPONENTSET_JAVA_TYPE)THEN
10941
10942 v_RelativeNodePath(i) := v_RelativeNodePath(i) || '../' || TO_CHAR(v_tExprPsNodeId(i)) || '/';
10943 END IF;
10944 ELSE
10945 IF(h_tJavaDataType(i) IN (COMPONENT_JAVA_TYPE, COMPONENTINST_JAVA_TYPE))THEN
10946
10947 --'You cannot bind an argument that is an instantiable component when it is not an ancestor of the
10948 -- base node. The argument node ''%NODENAME'' is not an ancestor of the base node ''%BASENAME''.'
10949 report(CZ_UTILS.GET_TEXT('CZ_LCE_NON_VIRTUAL_ARG', 'NODENAME', v_node_name, 'BASENAME', v_base_name), 1);
10950 flagInvalidCX := 1;
10951 END IF;
10952 END IF;
10953 END IF;
10954 ELSIF(x_error = BASE_UNDER_CONNECTOR)THEN
10955
10956 --'You cannot choose a base node that is a node in the target of a Connector. ''%BASENAME'' is in the
10957 -- target of a Connector.'
10958 report(CZ_UTILS.GET_TEXT('CZ_LCE_BASE_CONNECTED', 'BASENAME', v_base_name), 1);
10959 flagInvalidCX := 1;
10960 ELSIF(x_error = ARG_UNDER_CONNECTOR)THEN
10961
10962 --'You cannot choose an argument node that is a node in the target of a Connector. ''%NODENAME'' is
10963 -- in the target of a Connector.'
10964 report(CZ_UTILS.GET_TEXT('CZ_LCE_ARG_CONNECTED', 'NODENAME', v_node_name), 1);
10965 flagInvalidCX := 1;
10966 ELSIF(x_error = CROSS_BOUNDARY)THEN
10967
10968 --'An instance of an argument node must be accessible at runtime from an instance of the base node.
10969 -- The argument node ''%NODENAME'' is not accessible in this way from the base node ''%BASENAME''.'
10970 report(CZ_UTILS.GET_TEXT('CZ_LCE_CROSS_BOUNDARY', 'NODENAME', v_node_name, 'BASENAME', v_base_name), 1);
10971 flagInvalidCX := 1;
10972 END IF;
10973 ELSE --This is not a Configurator Extension.
10974 IF(in_boundary(v_expl_id, v_tExplNodeId(i), v_persistent_id) = 1)THEN
10975
10976 v_RelativeNodePath(i) := generate_relative_path(v_expl_id, v_component_id, v_tExplNodeId(i), v_tExprPsNodeId(i));
10977 ELSE
10978 --'Rule ''%RULENAME'' cannot be generated because it relates an incorrect combination of components. Rule ignored.'
10979 report('(' || p_rule_id || '): ' || CZ_UTILS.GET_TEXT('CZ_R_INVALID_RULE', 'RULENAME', rule_name), 1);
10980 flagInvalidCX := 1;
10981 END IF;
10982 END IF;
10983 END IF;
10984 END LOOP;
10985 END IF;
10986
10987 IF(flagInvalidCX = 0)THEN
10988
10989 FORALL i IN expressionStart..expressionEnd
10990 UPDATE cz_expression_nodes SET relative_node_path = v_RelativeNodePath(i)
10991 WHERE expr_node_id = v_tExprId(i);
10992
10993 IF(initRuleStatus = '1')THEN
10994
10995 mark_rule_valid;
10996 END IF;
10997
10998 x_run_id := 0;
10999
11000 ELSE
11001
11002 IF(initRuleStatus = '0')THEN
11003
11004 mark_rule_invalid;
11005 END IF;
11006
11007 --'The Configurator Extension Rule ''%RULENAME'' in the Model ''%MODELNAME'' will be disabled.'
11008 report(CZ_UTILS.GET_TEXT('CZ_LCE_DISABLE_CX_RULE', 'RULENAME', rule_name, 'MODELNAME', v_model_name), 1);
11009 END IF;
11010 --NO COMMIT;
11011 EXCEPTION
11012 WHEN CZ_R_NO_PARTICIPANTS THEN
11013 set_status(initRuleStatus);
11014 --'Incomplete rule - no participants, rule ''%RULENAME'' ignored'
11015 report('(' || p_rule_id || '): ' || CZ_UTILS.GET_TEXT('CZ_R_NO_PARTICIPANTS', 'RULENAME', rule_name), 1);
11016 WHEN CZ_R_WRONG_EXPRESSION_NODE THEN
11017 set_status(initRuleStatus);
11018 --'Incorrect node in expression, rule ''%RULENAME'' ignored'
11019 report('(' || p_rule_id || '): ' || CZ_UTILS.GET_TEXT('CZ_R_WRONG_EXPRESSION_NODE', 'RULENAME', rule_name), 1);
11020 WHEN CZ_G_INVALID_RULE_EXPLOSION THEN
11021 set_status(initRuleStatus);
11022 --'Unable to generate rule ''%RULENAME'', internal data error.'
11023 report('(' || p_rule_id || '): ' || CZ_UTILS.GET_TEXT('CZ_G_INTERNAL_RULE_ERROR', 'RULENAME', rule_name), 1);
11024 WHEN CZ_R_INCORRECT_NODE_ID THEN
11025 set_status(initRuleStatus);
11026 --'Incomplete or invalid data in rule ''%RULENAME'', rule ignored'
11027 report('(' || p_rule_id || '): ' || CZ_UTILS.GET_TEXT('CZ_R_INCORRECT_NODE_ID', 'RULENAME', rule_name), 1);
11028 WHEN CZ_R_LITERAL_NO_VALUE THEN
11029 set_status(initRuleStatus);
11030 --'No literal value specified in rule ''%RULENAME'', rule ignored'
11031 report('(' || p_rule_id || '): ' || CZ_UTILS.GET_TEXT('CZ_R_LITERAL_NO_VALUE', 'RULENAME', rule_name), 1);
11032 END verify_special_rule;
11033 ---------------------------------------------------------------------------------------
11034 PROCEDURE in_boundary (p_base_expl_id IN NUMBER,
11035 p_node_expl_id IN NUMBER,
11039 x_output := in_boundary (p_base_expl_id, p_node_expl_id, p_node_persistent_node_id);
11036 p_node_persistent_node_id IN NUMBER,
11037 x_output OUT NOCOPY PLS_INTEGER) IS
11038 BEGIN
11040 END in_boundary;
11041 ---------------------------------------------------------------------------------------
11042 --This function generates a path of persistent_node_ids within a model using the runtime
11043 --notation: #PARENT.<id>.
11044
11045 --p_start_node_id - start node ps_node_id;
11046 --p_end_node_id - end node ps_node_id.
11047
11048 FUNCTION runtime_model_path(p_start_node_id IN NUMBER,
11049 p_end_node_id IN NUMBER)
11050 RETURN VARCHAR2 IS
11051
11052 v_path VARCHAR2(32000);
11053 v_local_path VARCHAR2(32000);
11054
11055 v_ps_node_id_hash t_varchar_array_tbl_type_vc2;-- kdande; Bug 6880555; 12-Mar-2008
11056 v_start_node_id_tab t_num_array_tbl_type;
11057 v_start_parent_id_tab t_num_array_tbl_type;
11058 v_start_persist_id_tab t_num_array_tbl_type;
11059 v_end_node_id_tab t_num_array_tbl_type;
11060 v_end_parent_id_tab t_num_array_tbl_type;
11061 v_end_persist_id_tab t_num_array_tbl_type;
11062
11063 BEGIN
11064
11065 IF((p_start_node_id IS NULL AND p_end_node_id IS NULL) OR (p_start_node_id = p_end_node_id))THEN RETURN NULL; END IF;
11066
11067 SELECT ps_node_id, parent_id, persistent_node_id
11068 BULK COLLECT INTO v_start_node_id_tab, v_start_parent_id_tab, v_start_persist_id_tab
11069 FROM cz_ps_nodes
11070 WHERE deleted_flag = '0'
11071 START WITH ps_node_id = p_start_node_id
11072 CONNECT BY PRIOR parent_id = ps_node_id;
11073
11074 SELECT ps_node_id, parent_id, persistent_node_id
11075 BULK COLLECT INTO v_end_node_id_tab, v_end_parent_id_tab, v_end_persist_id_tab
11076 FROM cz_ps_nodes
11077 WHERE deleted_flag = '0'
11078 START WITH ps_node_id = p_end_node_id
11079 CONNECT BY PRIOR parent_id = ps_node_id;
11080
11081 IF(p_start_node_id IS NULL OR v_start_node_id_tab.COUNT = 1)THEN
11082
11083 --We need to construct the path down from the root to the end node.
11084
11085 FOR i IN 1..v_end_node_id_tab.COUNT - 1 LOOP
11086
11087 v_path := TO_CHAR(v_end_persist_id_tab(i)) || '.' || v_path;
11088 END LOOP;
11089 RETURN v_path;
11090 END IF;
11091
11092 IF(p_end_node_id IS NULL OR v_end_parent_id_tab.COUNT = 1)THEN
11093
11094 --We need to construct the '#PARENT' path up to the root from the start node.
11095
11096 FOR i IN 1..v_start_node_id_tab.COUNT - 1 LOOP
11097
11098 v_path := '#PARENT.' || v_path;
11099 END LOOP;
11100 RETURN v_path;
11101 END IF;
11102
11103 --We need to construct a mixed path from the start node to the end node.
11104 --In order to find the LCA of the two nodes, first build a hash map from the end node to the root.
11105
11106 FOR i IN 1..v_end_node_id_tab.COUNT LOOP
11107
11108 v_ps_node_id_hash(v_end_node_id_tab(i)) := v_local_path;
11109 v_local_path := TO_CHAR(v_end_persist_id_tab(i)) || '.' || v_local_path;
11110
11111 --In case the start node is a direct ancestor of the end node.
11112
11113 IF(v_end_parent_id_tab(i) = p_start_node_id)THEN RETURN v_local_path; END IF;
11114 END LOOP;
11115
11116 --We know that the start node is not a direct ancestor of the end node. Go up from the start node
11117 --until one of the following occurs: we hit the end node which is a direct ancestor of the start
11118 --node, or we hit entry in the hash table meaning the LCA.
11119
11120 FOR i IN 1..v_start_node_id_tab.COUNT LOOP
11121
11122 v_path := '#PARENT.' || v_path;
11123
11124 IF(v_start_parent_id_tab(i) = p_end_node_id)THEN RETURN v_path; END IF;
11125 IF(v_ps_node_id_hash.EXISTS(v_start_parent_id_tab(i)))THEN
11126
11127 RETURN v_path || v_ps_node_id_hash(v_start_parent_id_tab(i));
11128 END IF;
11129 END LOOP;
11130
11131 RETURN v_path || v_local_path;
11132 END runtime_model_path;
11133 ---------------------------------------------------------------------------------------
11134 FUNCTION runtime_relative_path(p_base_expl_id IN NUMBER,
11135 p_base_pers_id IN NUMBER,
11136 p_node_expl_id IN NUMBER,
11137 p_node_pers_id IN NUMBER)
11138 RETURN VARCHAR2 IS
11139
11140 v_base_expl_id_tab t_num_array_tbl_type;
11141 v_base_expl_type_tab t_num_array_tbl_type;
11142 v_base_ref_id_tab t_num_array_tbl_type;
11143 v_base_component_id_tab t_num_array_tbl_type;
11144 v_node_expl_id_tab t_num_array_tbl_type;
11145 v_node_expl_type_tab t_num_array_tbl_type;
11146 v_node_ref_id_tab t_num_array_tbl_type;
11147 v_node_component_id_tab t_num_array_tbl_type;
11148
11149 v_path VARCHAR2(32000);
11150 v_expl_path_hash t_varchar_array_tbl_type;
11151
11152 v_base_ref_expl_index PLS_INTEGER;
11153 v_node_ref_expl_index PLS_INTEGER;
11154 v_base_ref_expl_id NUMBER;
11155 v_node_ref_expl_id NUMBER;
11156 v_prev_referring_id NUMBER;
11157 v_base_node_type NUMBER;
11158 v_node_node_type NUMBER;
11159 v_base_devl_project_id NUMBER;
11160 v_node_devl_project_id NUMBER;
11161
11162 p_base_node_id NUMBER;
11166 CONNECTOR CONSTANT PLS_INTEGER := 264;
11163 p_node_node_id NUMBER;
11164
11165 REFERENCE CONSTANT PLS_INTEGER := 263;
11167
11168 BEGIN
11169
11170 IF(p_base_pers_id = p_node_pers_id AND p_base_expl_id = p_node_expl_id)THEN RETURN NULL; END IF;
11171
11172 SELECT model_ref_expl_id, referring_node_id, ps_node_type, component_id
11173 BULK COLLECT INTO v_base_expl_id_tab, v_base_ref_id_tab, v_base_expl_type_tab, v_base_component_id_tab
11174 FROM cz_model_ref_expls
11175 WHERE deleted_flag = '0'
11176 START WITH model_ref_expl_id = p_base_expl_id
11177 CONNECT BY PRIOR parent_expl_node_id = model_ref_expl_id;
11178
11179 SELECT model_ref_expl_id, referring_node_id, ps_node_type, component_id
11180 BULK COLLECT INTO v_node_expl_id_tab, v_node_ref_id_tab, v_node_expl_type_tab, v_node_component_id_tab
11181 FROM cz_model_ref_expls
11182 WHERE deleted_flag = '0'
11183 START WITH model_ref_expl_id = p_node_expl_id
11184 CONNECT BY PRIOR parent_expl_node_id = model_ref_expl_id;
11185
11186 SELECT ps_node_type INTO v_base_node_type
11187 FROM cz_ps_nodes
11188 WHERE deleted_flag = '0'
11189 AND persistent_node_id = p_base_pers_id
11190 AND ROWNUM = 1;
11191
11192 SELECT ps_node_type INTO v_node_node_type
11193 FROM cz_ps_nodes
11194 WHERE deleted_flag = '0'
11195 AND persistent_node_id = p_node_pers_id
11196 AND ROWNUM = 1;
11197
11198 --Here we need to work only with references, because whatever explosions are within a model, they
11199 --will be processed in one call to generate_model_path. So, find the deepest references above the
11200 --base and argument nodes to start. Can as well be the root model or the nodes themselves.
11201
11202 FOR i IN 1..v_base_expl_id_tab.COUNT LOOP
11203
11204 v_base_ref_expl_index := i;
11205 IF(v_base_expl_type_tab(i) IN (REFERENCE, CONNECTOR))THEN EXIT; END IF;
11206 END LOOP;
11207
11208 FOR i IN 1..v_node_expl_id_tab.COUNT LOOP
11209
11210 v_node_ref_expl_index := i;
11211 IF(v_node_expl_type_tab(i) IN (REFERENCE, CONNECTOR))THEN EXIT; END IF;
11212 END LOOP;
11213
11214 --Explosion ids of the deepest references above the base and argument.
11215
11216 v_base_ref_expl_id := v_base_expl_id_tab(v_base_ref_expl_index);
11217 v_node_ref_expl_id := v_node_expl_id_tab(v_node_ref_expl_index);
11218
11219 IF(v_base_node_type IN (REFERENCE, CONNECTOR))THEN
11220
11221 --If the node is a reference, it must be specified together with its own explosion.
11222
11223 p_base_node_id := v_base_ref_id_tab(v_base_ref_expl_index);
11224
11225 SELECT devl_project_id INTO v_base_devl_project_id FROM cz_ps_nodes
11226 WHERE deleted_flag = '0' AND ps_node_id = p_base_node_id;
11227 ELSE
11228
11229 SELECT ps_node_id, devl_project_id INTO p_base_node_id, v_base_devl_project_id FROM cz_ps_nodes
11230 WHERE deleted_flag = '0'
11231 AND persistent_node_id = p_base_pers_id
11232 AND devl_project_id =
11233 (SELECT devl_project_id FROM cz_ps_nodes WHERE ps_node_id = v_base_component_id_tab(v_base_ref_expl_index));
11234 END IF;
11235
11236 IF(v_node_node_type IN (REFERENCE, CONNECTOR))THEN
11237
11238 --If the node is a reference, it must be specified together with its own explosion.
11239
11240 p_node_node_id := v_node_ref_id_tab(v_node_ref_expl_index);
11241
11242 SELECT devl_project_id INTO v_node_devl_project_id FROM cz_ps_nodes
11243 WHERE deleted_flag = '0' AND ps_node_id = p_node_node_id;
11244 ELSE
11245
11246 SELECT ps_node_id, devl_project_id INTO p_node_node_id, v_node_devl_project_id FROM cz_ps_nodes
11247 WHERE deleted_flag = '0'
11248 AND persistent_node_id = p_node_pers_id
11249 AND devl_project_id =
11250 (SELECT devl_project_id FROM cz_ps_nodes WHERE ps_node_id = v_node_component_id_tab(v_node_ref_expl_index));
11251 END IF;
11252
11253 IF(p_base_node_id = v_base_ref_id_tab(v_base_ref_expl_index) AND
11254 p_node_node_id = v_node_ref_id_tab(v_node_ref_expl_index) AND
11255 v_base_devl_project_id = v_node_devl_project_id)THEN
11256
11257 --Both base and argument are references and are in the same model.
11258
11259 RETURN cut_dot(runtime_model_path(p_base_node_id, p_node_node_id));
11260 END IF;
11261
11262 IF(v_base_ref_expl_id = v_node_ref_expl_id)THEN
11263 IF(p_base_node_id = v_base_ref_id_tab(v_base_ref_expl_index))THEN
11264
11265 --The base node is the reference itself, so the argument is a node in the referenced model.
11266
11267 RETURN cut_dot(runtime_model_path(NULL, p_node_node_id));
11268 ELSIF(p_node_node_id = v_node_ref_id_tab(v_node_ref_expl_index))THEN
11269
11270 --The argument node is the reference itself, so the base is a node in the referenced model.
11271
11272 RETURN cut_dot(runtime_model_path(p_base_node_id, NULL));
11273 ELSE
11274
11275 --Both base and argument are in the same model.
11276
11277 RETURN cut_dot(runtime_model_path(p_base_node_id, p_node_node_id));
11278 END IF;
11279 END IF;
11280
11281 --Now we know that base and argument are in different models. Check if the base node is in the
11282 --root model. If it is, we skip going up from it.
11283
11284 IF(v_base_ref_id_tab(v_base_ref_expl_index) IS NOT NULL)THEN
11285
11289
11286 --We will go up from the base node because it is not in the root model.
11287 --If the base node is not the reference itself, we start the path with the model path from
11288 --the base node up.
11290 IF(p_base_node_id <> v_base_ref_id_tab(v_base_ref_expl_index))THEN
11291
11292 v_path := runtime_model_path(p_base_node_id, NULL);
11293 END IF;
11294
11295 v_prev_referring_id := v_base_ref_id_tab(v_base_ref_expl_index);
11296
11297 FOR i IN v_base_ref_expl_index + 1..v_base_expl_id_tab.COUNT LOOP
11298
11299 IF(v_base_expl_id_tab(i) = v_node_ref_expl_id)THEN
11300
11301 --We hit the argument node's explosion on the way up. If the argument node is the reference
11302 --itself, we build the path through the whole model, otherwise the argument is an internal
11303 --node, so we use a partial model path from the reference.
11304
11305 IF(p_node_node_id = v_node_ref_id_tab(v_node_ref_expl_index))THEN
11306
11307 v_path := v_path || runtime_model_path(v_prev_referring_id, NULL);
11308 ELSE
11309
11310 v_path := v_path || runtime_model_path(v_prev_referring_id, p_node_node_id);
11311 END IF;
11312 RETURN cut_dot(v_path);
11313 ELSIF(v_base_expl_type_tab(i) IN (REFERENCE, CONNECTOR))THEN
11314
11315 v_path := v_path || runtime_model_path(v_prev_referring_id, NULL);
11316 v_prev_referring_id := v_base_ref_id_tab(i);
11317
11318 --Create an entry in the hash table which may be used to find the LCA of the base and
11319 --argument nodes.
11320
11321 v_expl_path_hash(v_base_expl_id_tab(i)) := v_path;
11322 END IF;
11323 END LOOP;
11324 END IF; --the base node is not in the root model.
11325
11326 --We went all the way up from the base node but we haven't hit the argument node. So the
11327 --argument node is either down the tree or in a different branch. We are going to go up
11328 --from the argument node. If the argument node is not the reference itself, we start
11329 --the path with the model path from the argument node up.
11330
11331 --v_node_ref_id_tab(v_node_ref_expl_index) is not null: argument is not in the root model
11332 --otherwise we would have hit it before.
11333
11334 v_path := NULL;
11335 v_prev_referring_id := v_node_ref_id_tab(v_node_ref_expl_index);
11336
11337 IF(p_node_node_id <> v_node_ref_id_tab(v_node_ref_expl_index))THEN
11338
11339 v_path := runtime_model_path(NULL, p_node_node_id);
11340 END IF;
11341
11342 FOR i IN v_node_ref_expl_index + 1..v_node_expl_id_tab.COUNT LOOP
11343
11344 --Go up the tree from the argument node's explosion.
11345
11346 IF(v_node_expl_id_tab(i) = v_base_ref_expl_id)THEN
11347
11348 --We hit the base node's explosion on the way up. If the base node is the reference itself
11349 --(or the root model) we build the path through the whole model, otherwise the base is an
11350 --internal node, so we use a partial model path from the reference.
11351
11352 IF(p_base_node_id = v_base_ref_id_tab(v_base_ref_expl_index))THEN
11353
11354 v_path := runtime_model_path(NULL, v_prev_referring_id) || v_path;
11355 ELSE
11356
11360 ELSIF(v_expl_path_hash.EXISTS(v_node_expl_id_tab(i)))THEN
11357 v_path := runtime_model_path(p_base_node_id, v_prev_referring_id) || v_path;
11358 END IF;
11359 RETURN (cut_dot(v_path));
11361
11362 --We hit the LCA. The base node is in the different branch, otherwise the hash entry would not
11363 --exist. This can be the very root model, so this is the ultimate return point.
11364
11365 RETURN cut_dot(v_expl_path_hash(v_node_expl_id_tab(i)) || v_path);
11366
11367 ELSIF(v_node_expl_type_tab(i) IN (REFERENCE, CONNECTOR))THEN
11368
11369 v_path := runtime_model_path(NULL, v_prev_referring_id) || v_path;
11370 v_prev_referring_id := v_node_ref_id_tab(i);
11371 END IF;
11372 END LOOP;
11373
11374 --Algorithmically we can never be here.
11375
11376 RETURN NULL;
11377 END runtime_relative_path;
11378
11379 ---- this functions does validations required during the time of
11380 ---- moving a rule or rule folder to a different folder
11381 PROCEDURE is_rule_movable(p_src_rule_id IN cz_rule_folders.rule_folder_id%TYPE,
11382 p_src_rule_type IN cz_rule_folders.object_type%TYPE,
11383 p_tgt_rule_fld_id IN cz_rule_folders.rule_folder_id%TYPE,
11384 x_return_status OUT NOCOPY VARCHAR2,
11385 x_msg_count OUT NOCOPY NUMBER,
11386 x_msg_data OUT NOCOPY VARCHAR2)
11387 IS
11388 TYPE t_ref is TABLE OF NUMBER INDEX BY BINARY_INTEGER;
11389 l_src_rule_id NUMBER;
11390 l_src_object_type cz_rule_folders.object_type%TYPE;
11391 l_tgt_object_type cz_rule_folders.object_type%TYPE;
11392 l_tgt_rule_fld_id NUMBER;
11393 l_parent_rule_folder_id NUMBER;
11394 l_tgt_parent_fld_id NUMBER;
11395 l_deleted_flag VARCHAR2(1);
11396 l_valid_move NUMBER := 0;
11397 l_tgt_devl_project_id NUMBER;
11398 l_src_devl_project_id NUMBER;
11399 SRCRULE_DOES_NOT_EXIST EXCEPTION;
11400 SRCRULE_IS_DELETED EXCEPTION;
11401 TGTRULEFLD_DOES_NOT_EXIST EXCEPTION;
11402 INVALID_CIRCULAR_MOVE EXCEPTION;
11403 CANNOT_MOVE_TO_THIS_FLD EXCEPTION;
11404 CAN_MOVE_IN_SAME_PROJECT EXCEPTION;
11405 OBJTYPE_NOT_ALLOWED EXCEPTION;
11406 l_rule_fld_tbl t_ref;
11407
11408 BEGIN
11409 x_return_status := FND_API.G_RET_STS_SUCCESS;
11410 fnd_msg_pub.initialize;
11411
11412 BEGIN
11413 SELECT rule_folder_id,object_type,deleted_flag,parent_rule_folder_id,devl_project_id
11414 INTO l_src_rule_id,l_src_object_type,l_deleted_flag,l_parent_rule_folder_id,l_src_devl_project_id
11415 FROM cz_rule_folders
11416 WHERE cz_rule_folders.rule_folder_id = p_src_rule_id
11417 AND cz_rule_folders.object_type = p_src_rule_type;
11418 EXCEPTION
11419 WHEN NO_DATA_FOUND THEN
11420 l_src_rule_id := -1;
11421 END;
11422
11423 IF (l_src_rule_id = -1) THEN
11424 RAISE SRCRULE_DOES_NOT_EXIST;
11425 END IF;
11426
11427 IF (l_deleted_flag = '1') THEN
11428 RAISE SRCRULE_IS_DELETED;
11429 END IF;
11430
11431 BEGIN
11432 SELECT rule_folder_id,parent_rule_folder_id,devl_project_id,object_type
11433 INTO l_tgt_rule_fld_id,l_tgt_parent_fld_id,l_tgt_devl_project_id,l_tgt_object_type
11434 FROM cz_rule_folders
11435 WHERE cz_rule_folders.rule_folder_id = p_tgt_rule_fld_id
11436 AND cz_rule_folders.object_type IN ('RFL','RSQ')
11437 AND cz_rule_folders.deleted_flag = '0';
11438 EXCEPTION
11439 WHEN NO_DATA_FOUND THEN
11440 l_tgt_rule_fld_id := -1;
11441 END;
11442
11443 IF (l_tgt_rule_fld_id = -1) THEN
11444 RAISE TGTRULEFLD_DOES_NOT_EXIST;
11445 END IF;
11446
11447 IF (( (p_src_rule_id = p_tgt_rule_fld_id) AND (p_src_rule_type = 'RFL'))
11448 OR ( (l_tgt_parent_fld_id = p_tgt_rule_fld_id) AND (p_src_rule_type <> 'RFL') ) ) THEN
11449 RAISE INVALID_CIRCULAR_MOVE;
11450 END IF;
11451
11452 IF ( p_src_rule_type in ('FNC','RFL','RSQ') AND (l_tgt_object_type = 'RSQ') ) THEN
11453 RAISE OBJTYPE_NOT_ALLOWED;
11454 END IF;
11455
11456 IF (p_src_rule_type = 'RFL') THEN
11457 BEGIN
11458 l_rule_fld_tbl.DELETE;
11459 SELECT rule_folder_id
11460 BULK
11461 COLLECT
11462 INTO l_rule_fld_tbl
11463 FROM cz_rule_folders
11464 WHERE cz_rule_folders.object_type = 'RFL'
11465 AND cz_rule_folders.deleted_flag = '0'
11466 START WITH cz_rule_folders.rule_folder_id = p_src_rule_id
11467 CONNECT BY PRIOR rule_folder_id = parent_rule_folder_id
11468 AND PRIOR object_type = 'RFL'
11469 AND PRIOR deleted_flag = '0';
11470 EXCEPTION
11471 WHEN NO_DATA_FOUND THEN
11472 NULL;
11473 END;
11474 END IF;
11475
11476 IF (l_rule_fld_tbl.COUNT > 0) THEN
11477 FOR I IN l_rule_fld_tbl.FIRST..l_rule_fld_tbl.LAST
11478 LOOP
11479 IF (l_rule_fld_tbl(i) = p_tgt_rule_fld_id) THEN
11480 l_valid_move := 1;
11481 EXIT;
11482 END IF;
11483 END LOOP;
11484 IF (l_valid_move = 1) THEN
11485 RAISE CANNOT_MOVE_TO_THIS_FLD;
11486 END IF;
11487 END IF;
11488
11489 IF (l_src_devl_project_id <> l_tgt_devl_project_id) THEN
11490 RAISE CAN_MOVE_IN_SAME_PROJECT;
11491 END IF;
11492
11493 EXCEPTION
11494 WHEN SRCRULE_DOES_NOT_EXIST THEN
11495 x_return_status := FND_API.G_RET_STS_ERROR;
11499 p_data => x_msg_data);
11496 FND_MESSAGE.SET_NAME('CZ', 'CZ_SRCRULE_DOES_NOT_EXIST');
11497 FND_MSG_PUB.ADD;
11498 fnd_msg_pub.count_and_get(p_count => x_msg_count,
11500 WHEN SRCRULE_IS_DELETED THEN
11501 x_return_status := FND_API.G_RET_STS_ERROR;
11502 FND_MESSAGE.SET_NAME('CZ', 'CZ_SRCRULE_IS_DELETED');
11503 FND_MSG_PUB.ADD;
11504 fnd_msg_pub.count_and_get(p_count => x_msg_count,
11505 p_data => x_msg_data);
11506 WHEN TGTRULEFLD_DOES_NOT_EXIST THEN
11507 x_return_status := FND_API.G_RET_STS_ERROR;
11508 FND_MESSAGE.SET_NAME('CZ', 'CZ_TGTRULEFLD_DOES_NOT_EXIST');
11509 FND_MSG_PUB.ADD;
11510 fnd_msg_pub.count_and_get(p_count => x_msg_count,
11511 p_data => x_msg_data);
11512 WHEN INVALID_CIRCULAR_MOVE THEN
11513 x_return_status := FND_API.G_RET_STS_ERROR;
11514 FND_MESSAGE.SET_NAME('CZ', 'CZ_INVALID_CIRCULAR_MOVE');
11515 FND_MSG_PUB.ADD;
11516 fnd_msg_pub.count_and_get(p_count => x_msg_count,
11517 p_data => x_msg_data);
11518 WHEN OBJTYPE_NOT_ALLOWED THEN
11519 x_return_status := FND_API.G_RET_STS_ERROR;
11520 FND_MESSAGE.SET_NAME('CZ', 'CZ_DEV_FOLDER_SEQ_INCOMPAT_ERR');
11521 FND_MSG_PUB.ADD;
11522 fnd_msg_pub.count_and_get(p_count => x_msg_count,
11523 p_data => x_msg_data);
11524 WHEN CANNOT_MOVE_TO_THIS_FLD THEN
11525 x_return_status := FND_API.G_RET_STS_ERROR;
11526 FND_MESSAGE.SET_NAME('CZ', 'CZ_CANNOT_MOVE_TO_THIS_FLD');
11527 FND_MSG_PUB.ADD;
11528 fnd_msg_pub.count_and_get(p_count => x_msg_count,
11529 p_data => x_msg_data);
11530 WHEN CAN_MOVE_IN_SAME_PROJECT THEN
11531 x_return_status := FND_API.G_RET_STS_ERROR;
11532 FND_MESSAGE.SET_NAME('CZ', 'CZ_CAN_MOVE_IN_SAME_PROJECT');
11533 FND_MSG_PUB.ADD;
11534 fnd_msg_pub.count_and_get(p_count => x_msg_count,
11535 p_data => x_msg_data);
11536 WHEN OTHERS THEN
11537 x_return_status := FND_API.G_RET_STS_ERROR;
11538 FND_MESSAGE.SET_NAME('CZ', 'CZ_CANNOT_MOVE_TO_THIS_FLD');
11539 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
11540 FND_MSG_PUB.ADD;
11541 fnd_msg_pub.count_and_get(p_count => x_msg_count,
11542 p_data => x_msg_data);
11543 END is_rule_movable;
11544 ---------------------------------------------------------------------------------------
11545 /*#
11546 * This function is used for effectivity filtering in CZ_EXPLNODES_IMAGE_EFF_V. When called
11547 * on a node and given the node's parent identity and node's effectivity parameters it
11548 * returns 1 if the node is visible with the current effectivity filtering settings,
11549 * 0 otherwise.
11550 *
11551 * @param p_parent_psnode_id correspond to cz_explmodel_nodes_v.effective_parent_id
11552 * @param p_parent_expl_id correspond to cz_explmodel_nodes_v.parent_psnode_expl_id
11553 * p_model_id correspond to cz_explmodel_nodes_v.model_id
11554 * p_self_eff_from correspond to cz_explmodel_nodes_v.effective_from
11555 * p_self_eff_until correspond to cz_explmodel_nodes_v.effective_until
11556 * p_self_eff_set_id correspond to cz_explmodel_nodes_v.effectivity_set_id
11557 *
11558 * @rep:scope public
11559 * @rep:product CZ
11560 * @rep:displayname Auxiliary function for using in CZ_EXPLNODES_IMAGE_EFF_V
11561 * @rep:lifecycle active
11562 * @rep:compatibility S
11563 * @rep:category Effectivity Filtering
11564 */
11565
11566 FUNCTION is_node_visible(p_parent_psnode_id IN NUMBER,
11567 p_parent_expl_id IN NUMBER,
11568 p_model_id IN NUMBER,
11569 p_self_eff_from IN DATE,
11570 p_self_eff_until IN DATE,
11571 p_self_eff_set_id IN NUMBER) RETURN PLS_INTEGER IS
11572
11573 v_parent_id NUMBER := p_parent_psnode_id;
11574 v_expl_id NUMBER := p_parent_expl_id;
11575 v_eff_from DATE := p_self_eff_from;
11576 v_eff_until DATE := p_self_eff_until;
11577 v_eff_set_id NUMBER := p_self_eff_set_id;
11578
11579 v_filter VARCHAR2(240);
11580
11581 TYPE date_hash_table IS TABLE OF DATE INDEX BY BINARY_INTEGER;
11582 h_eff_from date_hash_table;
11583 h_eff_until date_hash_table;
11584 BEGIN
11585
11586 --v_parent_id (cz_explmodel_nodes_v.effective_parent_id) can only be null for the root model node
11587 --which is always effective by definition, so we don't even have to read the profile value, just
11588 --return 1 immediately.
11589
11590 WHILE(v_parent_id IS NOT NULL)LOOP
11591
11592 IF(v_eff_set_id IS NOT NULL)THEN
11593 IF(h_eff_from.EXISTS(v_eff_set_id))THEN
11594
11595 v_eff_from := h_eff_from(v_eff_set_id);
11596 v_eff_until := h_eff_until(v_eff_set_id);
11597 ELSE
11598
11599 SELECT effective_from, effective_until INTO v_eff_from, v_eff_until
11600 FROM cz_effectivity_sets
11601 WHERE deleted_flag = '0'
11602 AND effectivity_set_id = v_eff_set_id;
11603
11604 h_eff_from(v_eff_set_id) := v_eff_from;
11605 h_eff_until(v_eff_set_id) := v_eff_until;
11606 END IF;
11607 END IF;
11608
11609 --The actual reading of the profile option value will be done only once or, if the node on which
11610 --the function is called, is always effective - never.
11611
11612 IF(v_filter IS NULL)THEN
11613 v_filter := NVL(fnd_profile.value_wnps(PROFILE_OPTION_EFF_FILTER), OPTION_VALUE_FILTER_ALL);
11617 IF(v_eff_until < v_eff_from)THEN RETURN 0; END IF;
11614 IF(v_filter = OPTION_VALUE_FILTER_ALL)THEN RETURN 1; END IF;
11615 END IF;
11616
11618
11619 IF((v_filter = OPTION_VALUE_FILTER_FUTURE AND v_eff_until <= SYSDATE) OR
11620 (v_filter = OPTION_VALUE_FILTER_CURRENT AND (SYSDATE < v_eff_from OR SYSDATE >= v_eff_until))
11621 )THEN RETURN 0; END IF;
11622
11623 SELECT effective_parent_id, parent_psnode_expl_id, effective_from, effective_until, effectivity_set_id
11624 INTO v_parent_id, v_expl_id, v_eff_from, v_eff_until, v_eff_set_id
11625 FROM cz_explmodel_nodes_v
11626 WHERE model_id = p_model_id
11627 AND model_ref_expl_id = v_expl_id
11628 AND ps_node_id = v_parent_id;
11629
11630 END LOOP;
11631 RETURN 1;
11632 END;
11633
11634 /*#
11635 * This function is used for effectivity filtering. It takes a node identity and arrays of effectivity
11636 * parameters for the children of this node. It returns an array with 0 or 1 for every child of this
11637 * node, 1 if the child node is visible with the current effectivity filtering settings, 0 otherwise.
11638 *
11639 * @param p_parent_psnode_id ps_node_id of the node
11640 * @param p_parent_expl_id model_ref_expl_id of the node
11641 * p_self_eff_from array of effective_from values for children of the node
11642 * p_self_eff_until array of effective_until values for children of the node
11643 * p_self_eff_set_id array of effectivity_set_id values for children of the node
11644 *
11645 * @rep:scope public
11646 * @rep:product CZ
11647 * @rep:displayname Auxiliary function for effectivity filtering
11648 * @rep:lifecycle active
11649 * @rep:compatibility S
11650 * @rep:category
11651 */
11652
11653 FUNCTION get_visibility(p_parent_psnode_id IN NUMBER,
11654 p_parent_expl_id IN NUMBER,
11655 p_self_eff_from IN system.cz_date_tbl_type,
11656 p_self_eff_until IN system.cz_date_tbl_type,
11657 p_self_eff_set_id IN system.cz_number_tbl_type)
11658 RETURN system.cz_number_tbl_type IS
11659
11660 v_parent_id NUMBER := p_parent_psnode_id;
11661 v_expl_id NUMBER := p_parent_expl_id;
11662 v_eff_from DATE;
11663 v_eff_until DATE;
11664 v_eff_set_id NUMBER;
11665
11666 v_filter VARCHAR2(240);
11667 v_flag PLS_INTEGER;
11668 v_return system.cz_number_tbl_type := system.cz_number_tbl_type();
11669
11670 TYPE date_hash_table IS TABLE OF DATE INDEX BY BINARY_INTEGER;
11671 h_eff_from date_hash_table;
11672 h_eff_until date_hash_table;
11673 BEGIN
11674
11675 v_filter := NVL(fnd_profile.value_wnps(PROFILE_OPTION_EFF_FILTER), OPTION_VALUE_FILTER_ALL);
11676 IF(v_filter = OPTION_VALUE_FILTER_ALL)THEN
11677 FOR i IN 1..p_self_eff_set_id.COUNT LOOP
11678 v_return.EXTEND();
11679 v_return(i) := 1;
11680 END LOOP;
11681 RETURN v_return;
11682 END IF;
11683
11684 WHILE(v_expl_id IS NOT NULL)LOOP
11685 WHILE(v_parent_id IS NOT NULL)LOOP
11686
11687 SELECT parent_id, effective_from, effective_until, effectivity_set_id
11688 INTO v_parent_id, v_eff_from, v_eff_until, v_eff_set_id
11689 FROM cz_ps_nodes
11690 WHERE deleted_flag = '0'
11691 AND ps_node_id = v_parent_id;
11692
11693 IF(v_eff_set_id IS NOT NULL)THEN
11694 IF(h_eff_from.EXISTS(v_eff_set_id))THEN
11695
11696 v_eff_from := h_eff_from(v_eff_set_id);
11697 v_eff_until := h_eff_until(v_eff_set_id);
11698 ELSE
11699
11700 SELECT effective_from, effective_until INTO v_eff_from, v_eff_until
11701 FROM cz_effectivity_sets
11702 WHERE deleted_flag = '0'
11703 AND effectivity_set_id = v_eff_set_id;
11704
11705 h_eff_from(v_eff_set_id) := v_eff_from;
11706 h_eff_until(v_eff_set_id) := v_eff_until;
11707 END IF;
11708 END IF;
11709
11710 IF(v_eff_until < v_eff_from)THEN
11711 FOR i IN 1..p_self_eff_set_id.COUNT LOOP
11712 v_return.EXTEND();
11713 v_return(i) := 0;
11714 END LOOP;
11715 RETURN v_return;
11716 END IF;
11717
11718 IF((v_filter = OPTION_VALUE_FILTER_FUTURE AND v_eff_until <= SYSDATE) OR
11719 (v_filter = OPTION_VALUE_FILTER_CURRENT AND (SYSDATE < v_eff_from OR SYSDATE >= v_eff_until))
11720 )THEN
11721 FOR i IN 1..p_self_eff_set_id.COUNT LOOP
11722 v_return.EXTEND();
11723 v_return(i) := 0;
11724 END LOOP;
11725 RETURN v_return;
11726 END IF;
11727 END LOOP;
11728
11729 SELECT referring_node_id, parent_expl_node_id INTO v_parent_id, v_expl_id
11730 FROM cz_model_ref_expls
11731 WHERE deleted_flag = '0'
11732 AND model_ref_expl_id = v_expl_id;
11733 END LOOP;
11734
11735 v_return.extend(p_self_eff_set_id.COUNT);
11736
11737 FOR i IN 1..p_self_eff_set_id.COUNT LOOP
11738
11739 v_eff_from := p_self_eff_from(i);
11740 v_eff_until := p_self_eff_until(i);
11741 v_eff_set_id := p_self_eff_set_id(i);
11742
11743 IF(v_eff_set_id IS NOT NULL)THEN
11747 v_eff_until := h_eff_until(v_eff_set_id);
11744 IF(h_eff_from.EXISTS(v_eff_set_id))THEN
11745
11746 v_eff_from := h_eff_from(v_eff_set_id);
11748 ELSE
11749
11750 SELECT effective_from, effective_until INTO v_eff_from, v_eff_until
11751 FROM cz_effectivity_sets
11752 WHERE deleted_flag = '0'
11753 AND effectivity_set_id = v_eff_set_id;
11754
11755 h_eff_from(v_eff_set_id) := v_eff_from;
11756 h_eff_until(v_eff_set_id) := v_eff_until;
11757 END IF;
11758 END IF;
11759
11760 IF(v_eff_until < v_eff_from)THEN v_return(i) := 0;
11761
11762 ELSIF((v_filter = OPTION_VALUE_FILTER_FUTURE AND v_eff_until <= SYSDATE) OR
11763 (v_filter = OPTION_VALUE_FILTER_CURRENT AND (SYSDATE < v_eff_from OR SYSDATE >= v_eff_until))
11764 )THEN v_return(i) := 0;
11765
11766 ELSE v_return(i) := 1; END IF;
11767 END LOOP;
11768 RETURN v_return;
11769 END;
11770
11771 /*#
11772 * This procedure is a wrapper over the function to be called by the Developer.
11773 *
11774 * @rep:scope public
11775 * @rep:product CZ
11776 * @rep:displayname Wrapper over the function for Developer
11777 * @rep:lifecycle active
11778 * @rep:compatibility S
11779 * @rep:category
11780 */
11781
11782 PROCEDURE get_visibility(p_parent_psnode_id IN NUMBER,
11783 p_parent_expl_id IN NUMBER,
11784 p_self_eff_from IN system.cz_date_tbl_type,
11785 p_self_eff_until IN system.cz_date_tbl_type,
11786 p_self_eff_set_id IN system.cz_number_tbl_type,
11787 x_is_visible IN OUT NOCOPY system.cz_number_tbl_type) IS
11788 BEGIN
11789 x_is_visible := get_visibility(p_parent_psnode_id,
11790 p_parent_expl_id,
11791 p_self_eff_from,
11792 p_self_eff_until,
11793 p_self_eff_set_id);
11794 END;
11795 ---------------------------------------------------------------------------------------
11796 FUNCTION annotated_node_path(p_model_id IN NUMBER,
11797 p_model_ref_expl_id IN NUMBER,
11798 p_ps_node_id IN NUMBER) RETURN VARCHAR2
11799 IS
11800 v_model_expl_id cz_model_ref_expls.model_ref_expl_id%TYPE;
11801 BEGIN
11802
11803 SELECT model_ref_expl_id INTO v_model_expl_id FROM cz_model_ref_expls
11804 WHERE deleted_flag = '0'
11805 AND model_id = p_model_id
11806 AND parent_expl_node_id IS NULL;
11807
11808 RETURN generate_relative_path_(v_model_expl_id, p_model_id, p_model_ref_expl_id, p_ps_node_id, 1);
11809 END;
11810 ---------------------------------------------------------------------------------------
11811 /*#
11812 * This function is used for getting translated description for a given object id and object type.
11813 * It takes object_id and object_type as an input and returns the translated description.
11814 *
11815 * @param object_id object_id of the repository object
11816 * @param object_type object_type of the repository object
11817 * @rep:scope public
11818 * @rep:product CZ
11819 * @rep:displayname Function for getting translated usage description.
11820 * @rep:lifecycle active
11821 * @rep:compatibility S
11822 * @rep:category
11823 */
11824
11825 FUNCTION get_trans_desc(object_id IN NUMBER,object_type IN varchar2) RETURN VARCHAR2 IS
11826
11827 trans_desc cz_model_usages_tl.description%TYPE;
11828
11829 BEGIN
11830
11831 IF (OBJECT_TYPE='USG')
11832 THEN
11833 SELECT description INTO trans_desc FROM cz_model_usages_tl
11834 where model_usage_id=object_id AND language = userenv('LANG');
11835 END IF;
11836
11837 RETURN trans_desc;
11838
11839 EXCEPTION
11840
11841 WHEN NO_DATA_FOUND THEN
11845
11842 RETURN NULL;
11843 END;
11844 ---------------------------------------------------------------------------------------
11846 /*
11847 * This function returns the date when the logic generation occured
11848 * It uses the model id to determine engine type for switching between
11849 * cz_lce_headers (LCE) and cz_fce_files (FCE).
11850 *
11851 * @param p_model_id model id
11852 */
11853 FUNCTION GET_LAST_LOGIC_GEN_DATE(p_model_id in NUMBER)
11854 RETURN CZ_FCE_FILES.CREATION_DATE%TYPE
11855
11856 IS
11857 l_last_log_gen_date cz_fce_files.creation_date%TYPE;
11858 l_config_engine_type cz_devl_projects.config_engine_type%TYPE;
11859 BEGIN
11860
11861 SELECT config_engine_type
11862 INTO l_config_engine_type
11863 FROM cz_devl_projects
11864 WHERE devl_project_id = p_model_id;
11865
11866
11867 if (l_config_engine_type = LCE_ENGINE_TYPE OR l_config_engine_type IS NULL) THEN
11871 WHERE deleted_flag = 0 AND
11868 SELECT creation_date
11869 INTO l_last_log_gen_date
11870 FROM cz_lce_headers
11872 net_type = 1 AND
11873 component_id = devl_project_id AND devl_project_id = p_model_id;
11874 ELSE
11875 SELECT MAX(creation_date)
11876 INTO l_last_log_gen_date
11877 FROM cz_fce_files
11878 WHERE deleted_flag = 0 AND
11879 component_id = p_model_id AND
11880 fce_file_type = 1;
11881 END IF;
11882
11883 return l_last_log_gen_date;
11884
11885 EXCEPTION
11886 when NO_DATA_FOUND then
11887 return null;
11888 END GET_LAST_LOGIC_GEN_DATE;
11889
11890 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
11891 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
11892
11893 FUNCTION convertClassName(p_class_name IN VARCHAR2,p_pattern IN VARCHAR2) RETURN VARCHAR2 IS
11894 l_substr CZ_RULES.class_name%TYPE;
11895 l_output CZ_RULES.class_name%TYPE;
11896 l_reverse_string CZ_RULES.class_name%TYPE;
11897 l_reverse_pattern CZ_RULES.class_name%TYPE;
11898 l_index NUMBER;
11899 l_next_index NUMBER;
11900 BEGIN
11901
11902 SELECT REVERSE(p_class_name) INTO l_reverse_string FROM dual;
11903 SELECT REVERSE(p_pattern) INTO l_reverse_pattern FROM dual;
11904
11905 l_index := INSTR(l_reverse_string,'.');
11906
11907 IF l_index=0 THEN
11908 l_output := p_pattern||'.'||p_class_name;
11909 ELSE
11910 l_next_index := INSTR(SUBSTR(l_reverse_string,l_index+1),'.');
11911 IF l_next_index=0 THEN
11912 l_substr := SUBSTR(l_reverse_string,l_index);
11913 ELSE
11914 l_substr := SUBSTR(l_reverse_string, l_index,l_next_index);
11915 END IF;
11916
11917 IF l_substr='.'||l_reverse_pattern THEN
11918 l_output := p_class_name;
11919 ELSE
11920 l_output := REPLACE(p_class_name,SUBSTR(p_class_name,1,LENGTH(p_class_name)-l_index),
11921 SUBSTR(p_class_name,1,LENGTH(p_class_name)-l_index)||'.'||p_pattern);
11922 END IF;
11923 END IF;
11924 RETURN l_output;
11925 END convertClassName;
11926
11927 PROCEDURE ConvertModelCXs
11928 (
11929 p_model_id IN NUMBER,
11930 x_return_status OUT NOCOPY VARCHAR2,
11931 x_msg_count OUT NOCOPY NUMBER,
11932 x_msg_data OUT NOCOPY VARCHAR2
11933 ) IS
11934 l_new_class_name CZ_RULES.class_name%TYPE;
11935 BEGIN
11936
11937 x_return_status := FND_API.g_ret_sts_success;
11938 x_msg_count := 0;
11939 x_msg_data := '';
11940
11941 FOR i IN(SELECT args.argument_signature_id, args.java_data_type, args.data_type, args.argument_index, rul.class_name, rul.rule_id
11942 FROM CZ_RULES rul,
11943 CZ_EXPRESSION_NODES expr,
11944 CZ_SIGNATURE_ARGUMENTS args
11945 WHERE rul.rule_type = 300 AND rul.devl_project_id = p_model_id AND
11946 expr.rule_id = rul.rule_id AND expr.expr_parent_id is null AND
11947 expr.param_signature_id = args.argument_signature_id AND
11948 args.java_data_type like 'oracle.apps.cz.cio.%' AND
11949 args.deleted_flag = '0' AND args.seeded_flag = '0' AND
11950 rul.deleted_flag = '0' AND expr.deleted_flag = '0')
11951 LOOP
11952 UPDATE CZ_SIGNATURE_ARGUMENTS arg
11953 SET java_data_type = REPLACE(i.java_data_type,'oracle.apps.cz.cio.','oracle.apps.cz.cioemu.')
11954 WHERE argument_signature_id=i.argument_signature_id AND
11955 argument_index=i.argument_index AND
11956 EXISTS(SELECT NULL FROM cz_node_type_Classes
11957 WHERE class_name = arg.java_data_type);
11958
11959 l_new_class_name := convertClassName(i.class_name,'emu');
11960 IF l_new_class_name<>i.class_name THEN
11961 UPDATE CZ_RULES
11962 SET class_name=l_new_class_name
11963 WHERE rule_id=i.rule_id;
11964 END IF;
11965
11966 END LOOP;
11967
11968 EXCEPTION
11969 WHEN OTHERS THEN
11970 handle_Error
11971 (p_procedure_name => 'ConvertModelCXs',
11972 p_error_message => SQLERRM,
11973 x_return_status => x_return_status,
11974 x_msg_count => x_msg_count,
11975 x_msg_data => x_msg_data);
11976 END ConvertModelCXs;
11977
11978 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
11979 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
11980
11981 PROCEDURE start_model_report (p_devl_project_id IN NUMBER)
11982 IS
11983 BEGIN
11984 modelReportRun := TRUE; -- vsingava: 24-Nov-2008; Bug 7297669
11985 --Intitialize the explosion data.
11986 SELECT model_ref_expl_id, parent_expl_node_id, component_id, referring_node_id, ps_node_type
11987 BULK COLLECT INTO v_NodeId, v_ParentId, v_ComponentId, v_ReferringId, v_NodeType
11988 FROM cz_model_ref_expls
11989 WHERE model_id IN (SELECT component_id FROM cz_model_ref_expls
11990 WHERE model_id = p_devl_project_id AND deleted_flag = '0')
11991 AND deleted_flag = '0';
11992
11993 h_ParentId.DELETE;
11994 h_NodeType.DELETE;
11995 h_ReferringId.DELETE;
11996 h_ComponentId.DELETE;
11997
11998 FOR i IN 1..v_NodeId.COUNT LOOP
11999 h_ParentId(v_NodeId(i)) := v_ParentId(i);
12000 h_NodeType(v_NodeId(i)) := v_NodeType(i);
12001 h_ReferringId(v_NodeId(i)) := v_ReferringId(i);
12002 h_ComponentId(v_NodeId(i)) := v_ComponentId(i);
12003 END LOOP;
12004 EXCEPTION
12005 WHEN OTHERS THEN
12006 LOG_REPORT( -1, 'Exception in start_model_report :' || SQLERRM );
12007 END start_model_report;
12008
12009 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
12013 BEGIN
12010 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
12011
12012 PROCEDURE end_model_report IS
12014 modelReportRun := FALSE; -- vsingava: 24-Nov-2008; Bug 7297669
12015 v_NodeId.DELETE;
12016 v_ParentId.DELETE;
12017 v_ComponentId.DELETE;
12018 v_ReferringId.DELETE;
12019 v_NodeType.DELETE;
12020 h_ParentId.DELETE;
12021 h_NodeType.DELETE;
12022 h_ReferringId.DELETE;
12023 h_ComponentId.DELETE;
12024 EXCEPTION
12025 WHEN OTHERS THEN
12026 LOG_REPORT( -1, 'Exception in end_model_report :' || SQLERRM );
12027 END end_model_report;
12028
12029
12030 END CZ_DEVELOPER_UTILS_PVT;