DBA Data[Home] [Help]

PACKAGE BODY: APPS.CZ_DEVELOPER_UTILS_PVT

Source


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