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