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