DBA Data[Home] [Help]

PACKAGE BODY: APPS.CZ_REFS

Source


1 PACKAGE BODY CZ_REFS AS
2 /*	$Header: czrefb.pls 120.9 2010/08/14 07:51:04 kksriram ship $*/
3 
4 PRODUCT_TYPE   CONSTANT INTEGER:=258;
5 COMPONENT_TYPE CONSTANT INTEGER:=259;
6 FEATURE_TYPE   CONSTANT INTEGER:=261;
7 OPTION_TYPE    CONSTANT INTEGER:=262;
8 REFERENCE_TYPE CONSTANT INTEGER:=263;
9 CONNECTOR_TYPE CONSTANT INTEGER:=264;
10 BOM_MODEL_TYPE CONSTANT INTEGER:=436;
11 
12 CONTRIBUTE_TO_MIN_SUBTYPE CONSTANT INTEGER:=4;
13 CONTRIBUTE_TO_MAX_SUBTYPE CONSTANT INTEGER:=5;
14 
15 CONTRIBUTE_TO_MIN    CONSTANT INTEGER:=1;
16 CONTRIBUTE_TO_MAX    CONSTANT INTEGER:=2;
17 CONTRIBUTE_TO_MINMAX CONSTANT INTEGER:=3;
18 
19 MINUS_MODE     CONSTANT VARCHAR2(1):='-';
20 PLUS_MODE      CONSTANT VARCHAR2(1):='+';
21 
22 TYPE IdStructure  IS RECORD(new_id              INTEGER,
23                             parent_id           INTEGER,
24                             ps_node_id          INTEGER,
25                             ps_node_type        INTEGER,
26                             component_id        INTEGER,
27                             child_model_id      INTEGER,
28                             current_level       INTEGER,
29                             expl_node_type      INTEGER,
30                             virtual_flag        VARCHAR2(1),
31                             expl_path           VARCHAR2(32000));
32 
33 TYPE modelArrStructure  IS RECORD(model_id           INTEGER,
34                                   parent_model_id    INTEGER,
35                                   connector_loop     BOOLEAN:=FALSE);
36 
37 TYPE ArrayId  IS TABLE   OF IdStructure INDEX BY BINARY_INTEGER;
38 TYPE IntArray IS TABLE   OF NUMBER INDEX BY BINARY_INTEGER;
39 TYPE IntArray_idx_vc2 IS TABLE   OF NUMBER INDEX BY VARCHAR2(15);			--Bug9979750
40 TYPE modelArray IS TABLE OF modelArrStructure  INDEX BY BINARY_INTEGER;
41 TYPE Int2Array  IS TABLE OF IntArray INDEX BY BINARY_INTEGER;
42 TYPE Varchar2Array IS TABLE OF VARCHAR2(32000) INDEX BY BINARY_INTEGER;
43 
44 TYPE Int2RecArray  IS TABLE OF ArrayId INDEX BY BINARY_INTEGER;
45 
46 g_hash_tree_tbl       Int2RecArray;
47 g_root_point_tree_tbl IntArray;
48 t_models              modelArray;
49 t_chain               modelArray;
50 t_projectCache        IntArray;
51 
52 --9446997 fix
53 t_upd_node_depth_models IntArray_idx_vc2;
54 
55 t_old_expl_ids   IntArray;
56 t_new_expl_ids   IntArray;
57 
58 m_RUN_ID         NUMBER;
59 
60 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
61 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
62 
63 PROCEDURE Initialize IS
64 BEGIN
65     FND_MSG_PUB.initialize;
66     SELECT CZ_XFR_RUN_INFOS_S.NEXTVAL INTO m_RUN_ID FROM dual;
67 END Initialize;
68 
69 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
70 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
71 
72 PROCEDURE LOG_REPORT
73 (p_caller    IN VARCHAR2,
74  p_str       IN VARCHAR2) IS
75 
76    l_return BOOLEAN;
77 
78 BEGIN
79    l_return := cz_utils.log_report(Msg        => p_str,
80                                    Urgency    => 1,
81                                    ByCaller   => p_caller,
82                                    StatusCode => 11276,
83                                    RunId      => m_RUN_ID);
84 END;
85 
86 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
87 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
88 
89 PROCEDURE DEBUG(p_str IN VARCHAR2) IS
90 BEGIN
91     NULL;
92     --DBMS_OUTPUT.PUT_LINE(p_str);
93 END;
94 
95 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
96 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
97 
98 PROCEDURE DEBUG(p_str IN VARCHAR2,v_num IN NUMBER) IS
99 BEGIN
100     DEBUG(p_str||'='||TO_CHAR(v_num));
101 END;
102 
103 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
104 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
105 
106 PROCEDURE DEBUG(p_name IN VARCHAR2,p_arr IN ArrayId) IS
107     v_ind     PLS_INTEGER;
108     v_counter PLS_INTEGER:=0;
109 BEGIN
110     IF p_arr.COUNT=0 THEN
111        RETURN;
112     END IF;
113     v_ind:=p_arr.FIRST;
114     LOOP
115        IF v_ind IS NULL THEN
116           EXIT;
117        END IF;
118        v_counter:=v_counter+1;
119        DEBUG('++++++ '||TO_CHAR(v_counter)||' ++++++');
120        DEBUG(p_name||'('||TO_CHAR(v_ind)||').new_id='||TO_CHAR(p_arr(v_ind).new_id));
121        DEBUG(p_name||'('||TO_CHAR(v_ind)||').parent_id='||TO_CHAR(p_arr(v_ind).parent_id));
122        DEBUG(p_name||'('||TO_CHAR(v_ind)||').component_id='||TO_CHAR(p_arr(v_ind).component_id));
123        v_ind:=p_arr.NEXT(v_ind);
124        DEBUG('++++++++++++++++++++++++++++++++++++++');
125    END LOOP;
126 END DEBUG;
127 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
128 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
129 
130 -- p_out_flag=0  - it's not nonVirtual --
131 -- p_out_flag=1  - nonVirtual          --
132 /* old version
133 PROCEDURE IsNonVirtual
134 (p_ps_node_id      IN  INTEGER,
135  p_model_id        IN  INTEGER,
136  p_out_flag        OUT NOCOPY INTEGER) IS
137 
138 BEGIN
139     p_out_flag:=0;
140     SELECT 1 INTO p_out_flag FROM CZ_PS_NODES
141     WHERE deleted_flag = NO_FLAG
142     AND ps_node_id=p_ps_node_id AND ps_node_type IN(COMPONENT_TYPE,PRODUCT_TYPE,
143     REFERENCE_TYPE,CONNECTOR_TYPE,BOM_MODEL_TYPE)
144     AND ps_node_id NOT IN
145     (SELECT ps_node_id FROM CZ_PS_NODES nodes
146     WHERE deleted_flag = NO_FLAG
147     AND devl_project_id =p_model_id
148     AND ps_node_type IN(COMPONENT_TYPE,REFERENCE_TYPE,CONNECTOR_TYPE,BOM_MODEL_TYPE)
149     AND MINIMUM = 1
150     AND MAXIMUM = 1
151     AND NOT EXISTS
152     (SELECT 1 FROM cz_expression_nodes x
153     WHERE deleted_flag = NO_FLAG
154     AND consequent_flag =YES_FLAG
155     AND ps_node_id = nodes.ps_node_id
156     AND EXISTS
157     (SELECT NULL FROM cz_rules WHERE (antecedent_id=x.express_id OR consequent_id=x.express_id
158      OR amount_id=x.express_id) AND disabled_flag=NO_FLAG
159     AND devl_project_id=p_model_id AND deleted_flag=NO_FLAG)));
160 EXCEPTION
161     WHEN NO_DATA_FOUND THEN
162          NULL;
163     WHEN OTHERS        THEN
164          LOG_REPORT('IsNonVirtual','Error : ps_node_id='||TO_CHAR(p_ps_node_id)||' '||SQLERRM);
165 END;
166 */
167 
168 PROCEDURE IsNonVirtual
169 (p_ps_node_id      IN  INTEGER,
170  p_model_id        IN  INTEGER,
171  p_out_flag        OUT NOCOPY INTEGER) IS
172 
173 BEGIN
174     p_out_flag:=0;
175     SELECT 1 INTO p_out_flag FROM CZ_PS_NODES
176     WHERE deleted_flag = NO_FLAG
177     AND ps_node_id=p_ps_node_id AND (instantiable_flag IN (OPTIONAL_EXPL_TYPE,OPTIONAL_EXPL_TYPE) OR
178     (ps_node_type IN(COMPONENT_TYPE,PRODUCT_TYPE,REFERENCE_TYPE,CONNECTOR_TYPE,BOM_MODEL_TYPE) AND NOT(MAXIMUM=1 AND MINIMUM=1)));
179 EXCEPTION
180     WHEN NO_DATA_FOUND THEN
181          NULL;
182     WHEN OTHERS        THEN
183          LOG_REPORT('IsNonVirtual','Error : ps_node_id='||TO_CHAR(p_ps_node_id)||' '||SQLERRM);
184 END;
185 
186 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
187 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
188 
189 FUNCTION allocate_Expl_Id RETURN NUMBER IS
190     v_next_id NUMBER;
191 BEGIN
192     SELECT CZ_MODEL_REF_EXPLS_S.NEXTVAL INTO v_next_id FROM dual;
193     RETURN v_next_id;
194 END allocate_Expl_Id;
195 
196 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
197 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
198 
199 FUNCTION get_Root_Expl_Id(p_model_id IN NUMBER) RETURN NUMBER IS
200     v_expl_node_id  CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
201 BEGIN
202      SELECT model_ref_expl_id INTO v_expl_node_id FROM CZ_MODEL_REF_EXPLS
203      WHERE component_id=p_model_id AND model_id=p_model_id AND
204            parent_expl_node_id IS NULL AND deleted_flag=NO_FLAG;
205      RETURN v_expl_node_id;
206 END get_Root_Expl_Id;
207 
208 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
209 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
210 
211 FUNCTION circularity_Exists
212 (
213  p_source_model_id IN NUMBER,
214  p_target_model_id IN NUMBER
215 ) RETURN VARCHAR2 IS
216 
217     p_circularity_exists VARCHAR2(1):=NO_FLAG;
218 
219 BEGIN
220     SELECT YES_FLAG INTO p_circularity_exists FROM dual WHERE
221     EXISTS
222          (SELECT component_id FROM CZ_MODEL_REF_EXPLS
223           WHERE model_id=p_target_model_id AND deleted_flag=NO_FLAG
224           AND ps_node_type IN (REFERENCE_TYPE,CONNECTOR_TYPE) AND component_id=p_source_model_id) OR
225           (p_target_model_id=p_source_model_id);
226           RETURN p_circularity_exists;
227      EXCEPTION
228          WHEN OTHERS THEN
229               RETURN p_circularity_exists;
230 END;
231 
232 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
233 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
234 
235 -- Bugfix 9446997
236 -- This procedure was introduced to reset arrays/tables
237 -- which will store distinct models which will be used
238 -- to drive update_node_depth
239 --
240 -- TO DO - Also need to check it can be used for
241 -- update_child_nodes
242 --
243 
244 PROCEDURE reset_model_array IS
245 BEGIN
246     t_upd_node_depth_models.DELETE;
247 
248 END reset_model_array;
249 
250 
251 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
252 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
253 
254 --
255 -- this procedure is used in temporary fix for the bug #2425995
256 --
257 -- As a part of Bugfix 9446997 array
258 -- t_upd_node_depth_models will be driving population of
259 -- update_node_depth during refresh process. Caller to check_node from where
260 -- this procedure is called should make sure that the reset_model_array
261 -- is called before calling check_node and pass value '1' for
262 -- p_skip_upd_nod_depth param in check_node and call update_node_depth
263 -- explicitly with NULL parameter. (as in cz_imp_ps_node pkg)
264 --
265 PROCEDURE update_Node_Depth(p_model_id IN INTEGER DEFAULT NULL) IS
266 
267   t_nodes_to_delete_tbl   IntArray;
268   i number;
269   j number;
270 
271   PROCEDURE update_Node_Depth_
272   (p_model_id     IN INTEGER,
273    p_expl_id      IN INTEGER DEFAULT NULL,
274    p_node_depth   IN INTEGER DEFAULT NULL,
275    p_ps_node_id   IN INTEGER DEFAULT NULL,
276    p_ps_node_type IN INTEGER DEFAULT NULL) IS
277 
278       v_node_depth         INTEGER;
279       v_model_ref_expl_id  INTEGER;
280 
281   BEGIN
282       IF p_node_depth IS NULL THEN
283          UPDATE CZ_MODEL_REF_EXPLS
284          SET node_depth=0
285          WHERE model_id=p_model_id AND parent_expl_node_id IS NULL
286          AND deleted_flag=NO_FLAG
287          RETURNING model_ref_expl_id INTO v_model_ref_expl_id;
288          update_Node_Depth_(p_model_id,v_model_ref_expl_id,0);
289       ELSE
290          v_node_depth:=p_node_depth+1;
291          FOR i IN(SELECT model_ref_expl_id,referring_node_id,ps_node_type FROM CZ_MODEL_REF_EXPLS
292                   WHERE model_id=p_model_id AND parent_expl_node_id=p_expl_id
293                   AND deleted_flag=NO_FLAG)
294          LOOP
295             UPDATE CZ_MODEL_REF_EXPLS
296             SET node_depth=v_node_depth
297             WHERE model_ref_expl_id=i.model_ref_expl_id AND node_depth<>v_node_depth;
298 
299             --
300             -- temporary workaround to delete possible reference duplicates
301             -- t_nodes_to_delete_tbl stores duplicate nodes
302             -- that need to be deleled later
303             --
304             IF p_ps_node_id=i.referring_node_id
305                AND p_ps_node_type=i.ps_node_type THEN
306                t_nodes_to_delete_tbl(t_nodes_to_delete_tbl.COUNT+1):=i.model_ref_expl_id;
307             END IF;
308 
309             update_Node_Depth_(p_model_id,i.model_ref_expl_id,v_node_depth,i.referring_node_id,i.ps_node_type);
310          END LOOP;
311       END IF;
312   END update_Node_Depth_;
313 
314 BEGIN
315     t_nodes_to_delete_tbl.DELETE;
316 
317     -- Bugfix 9446997
318     IF p_model_id IS NULL THEN
319        -- Bugfix 9446997
320        -- Drive t_upd_node_depth_models array to update node depth calls
321        -- as this will be called after all check_nodes call in BOM Refresh process
322        i :=t_upd_node_depth_models.FIRST;
323        LOOP
324           EXIT WHEN i IS NULL;
325           update_Node_Depth_(t_upd_node_depth_models(i));
326           i := t_upd_node_depth_models.NEXT (i);
327        END LOOP;
328 
329        -- Instead of using p_model_id as driver use t_upd_node_depth_models array as driver to
330        -- delete reference duplicates
331        j :=t_upd_node_depth_models.FIRST;
332        LOOP
333            EXIT WHEN j IS NULL;
334            IF t_nodes_to_delete_tbl.COUNT>0 THEN
335               FORALL i IN t_nodes_to_delete_tbl.FIRST..t_nodes_to_delete_tbl.LAST
336                UPDATE CZ_MODEL_REF_EXPLS
337                SET deleted_flag=YES_FLAG
338                WHERE model_ref_expl_id IN
339                (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
340                START WITH model_id=t_upd_node_depth_models(j) AND model_ref_expl_id=t_nodes_to_delete_tbl(i) AND deleted_flag=NO_FLAG
341                CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
342                         AND PRIOR deleted_flag=NO_FLAG);
343               END IF;
344                j := t_upd_node_depth_models.NEXT (j);
345        END LOOP;
346 
347 
348     ELSE
349        FOR i IN(SELECT DISTINCT model_id FROM cz_model_ref_expls
350                 WHERE ((component_id=p_model_id AND
351                 ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE)) OR model_id=p_model_id)
352                 AND deleted_flag=NO_FLAG)
353        LOOP
354           update_Node_Depth_(i.model_id);
355        END LOOP;
356 
357        IF t_nodes_to_delete_tbl.COUNT>0 THEN
358           FORALL i IN t_nodes_to_delete_tbl.FIRST..t_nodes_to_delete_tbl.LAST
359             UPDATE CZ_MODEL_REF_EXPLS
360             SET deleted_flag=YES_FLAG
361             WHERE model_ref_expl_id IN
362            (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
363             START WITH model_id=p_model_id AND model_ref_expl_id=t_nodes_to_delete_tbl(i) AND deleted_flag=NO_FLAG
364             CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
365                             AND PRIOR deleted_flag=NO_FLAG);
366        END IF;
367 
368     END IF;   -- p_model_id IS NULL
369 
370 
371 END update_Node_Depth;
372 
373 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
374 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
375 
376 -- p_out_flag=0  - it's not nonVirtual --
377 -- p_out_flag=1  - nonVirtual          --
378 
379 FUNCTION existContributeRule
380 (p_ps_node_id      IN  INTEGER,
381  p_model_id        IN  INTEGER) RETURN BOOLEAN IS
382 
383     v_iret  INTEGER:=0;
384     v_bret  BOOLEAN:=FALSE;
385     v_instantiable_flag CZ_PS_NODES.instantiable_flag%TYPE;
386 
387 BEGIN
388     SELECT instantiable_flag INTO v_instantiable_flag
389       FROM CZ_PS_NODES
390      WHERE ps_node_id=p_ps_node_id;
391     IF v_instantiable_flag IN(OPTIONAL_EXPL_TYPE,MINMAX_EXPL_TYPE) THEN
392        RETURN TRUE;
393     ELSE
394        RETURN FALSE;
395     END IF;
396     /* old code
397     BEGIN
398         SELECT 1 INTO v_iret FROM dual
399         WHERE
403         AND ps_node_id = p_ps_node_id
400         EXISTS(SELECT NULL FROM cz_expression_nodes x
401         WHERE deleted_flag = NO_FLAG
402         AND consequent_flag =YES_FLAG
404         AND EXISTS
405        (SELECT NULL FROM cz_rules WHERE (antecedent_id=x.express_id OR consequent_id=x.express_id
406         OR amount_id=x.express_id) AND disabled_flag=NO_FLAG
407         AND devl_project_id=p_model_id AND deleted_flag=NO_FLAG));
408      EXCEPTION
409         WHEN NO_DATA_FOUND THEN
410              NULL;
411         WHEN OTHERS THEN
412               LOG_REPORT('existContributeRule','Error : ps_node_id='||TO_CHAR(p_ps_node_id)||' '||SQLERRM);
413      END;
414 
415      IF v_iret=0 THEN
416         v_bret:=FALSE;
417      ELSE
418         v_bret:=TRUE;
419      END IF;
420 
421      RETURN v_bret;
422     */
423 END;
424 
425 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
426 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
427 
428 FUNCTION getExprSubType(p_expr_node_id IN INTEGER) RETURN NUMBER IS
429 
430     v_expr_parent  CZ_EXPRESSION_NODES.expr_parent_id%TYPE;
431     v_expr_subtype CZ_EXPRESSION_NODES.expr_subtype%TYPE;
432 
433 BEGIN
434     SELECT expr_parent_id INTO v_expr_parent
435     FROM CZ_EXPRESSION_NODES WHERE expr_node_id=p_expr_node_id AND
436     deleted_flag=NO_FLAG;
437 
438     SELECT expr_subtype INTO v_expr_subtype
439     FROM CZ_EXPRESSION_NODES WHERE expr_parent_id=v_expr_parent AND ps_node_id IS NULL AND
440     deleted_flag=NO_FLAG;
441 
442     RETURN v_expr_subtype;
443 
444 EXCEPTION
445     WHEN OTHERS THEN
446          RETURN -1;
447 END;
448 
449 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
450 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
451 
452 -- p_out_flag=0  - it's not nonVirtual --
453 -- p_out_flag=1  - nonVirtual          --
454 
455 FUNCTION getExplType
456 (p_ps_node_id      IN  INTEGER,
457  p_model_id        IN  INTEGER,
458  p_minimum         IN  INTEGER,
459  p_maximum         IN  INTEGER,
460  p_ps_node_type    IN  INTEGER) RETURN NUMBER IS
461 
462     v_expr_parent_id  CZ_EXPRESSION_NODES.expr_parent_id%TYPE;
463     v_expr_subtype    CZ_EXPRESSION_NODES.expr_subtype%TYPE;
464     v_expl_node_type  CZ_MODEL_REF_EXPLS.expl_node_type%TYPE;
465 
466 BEGIN
467         FOR i IN (SELECT rule_id,antecedent_id,consequent_id,NAME FROM CZ_RULES
468                   WHERE devl_project_id=p_model_id AND disabled_flag=NO_FLAG
469                   AND deleted_flag=NO_FLAG)
470         LOOP
471            BEGIN
472                SELECT expr_parent_id INTO v_expr_parent_id FROM CZ_EXPRESSION_NODES
473                WHERE ps_node_id=p_ps_node_id AND deleted_flag=NO_FLAG AND
474                rule_id=i.rule_id;
475 
476                SELECT expr_subtype INTO v_expr_subtype
477                FROM CZ_EXPRESSION_NODES WHERE expr_parent_id=v_expr_parent_id AND ps_node_id IS NULL AND
478                deleted_flag=NO_FLAG;
479 
480                IF v_expr_subtype=CONTRIBUTE_TO_MIN_SUBTYPE THEN
481                   IF (p_minimum=1 AND p_maximum=1) OR (p_minimum=0 AND p_maximum=1) THEN
482                      v_expl_node_type:=OPTIONAL_EXPL_TYPE;
483                   ELSE
484                      RETURN MINMAX_EXPL_TYPE;
485                   END IF;
486                END IF;
487 
488                IF v_expr_subtype=CONTRIBUTE_TO_MAX_SUBTYPE THEN
489                   RETURN MINMAX_EXPL_TYPE;
490                END IF;
491 
492           EXCEPTION
493                WHEN OTHERS THEN
494                     NULL;
495           END;
496        END LOOP;
497 
498       IF p_minimum=1 AND p_maximum=1 AND v_expl_node_type=OPTIONAL_EXPL_TYPE THEN
499          RETURN OPTIONAL_EXPL_TYPE;
500       END IF;
501 
502       IF NOT(p_minimum=1 AND p_maximum=1) AND v_expl_node_type=OPTIONAL_EXPL_TYPE THEN
503          IF p_minimum=0 AND p_maximum=1 THEN
504             RETURN OPTIONAL_EXPL_TYPE;
505          ELSE
506             RETURN MINMAX_EXPL_TYPE;
507          END IF;
508       END IF;
509 
510       IF NOT(p_minimum=1 AND p_maximum=1) AND NOT(p_minimum=0 AND p_maximum=1) THEN
511             RETURN MINMAX_EXPL_TYPE;
512       END IF;
513 
514       IF p_minimum=0 AND p_maximum=1 THEN
515             RETURN OPTIONAL_EXPL_TYPE;
516       END IF;
517 
518       IF p_minimum=1 AND p_maximum=1 AND p_ps_node_type=REFERENCE_TYPE THEN
519             RETURN MANDATORY_EXPL_TYPE;
520       END IF;
521 
522       IF p_minimum=1 AND p_maximum=1 AND p_ps_node_type=CONNECTOR_TYPE THEN
523             RETURN CONNECTOR_EXPL_TYPE;
524       END IF;
525 
526       RETURN 0;
527 END;
528 
529 
530 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
531 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
532 
533 PROCEDURE add_root_Model_record
534 (p_ps_node_id   IN  INTEGER,
535  p_ps_node_type IN  INTEGER) IS
536 
537     v_expl_id NUMBER;
538 
539 BEGIN
540     v_expl_id:=allocate_Expl_Id;
541 
545             referring_node_id,
542     INSERT INTO CZ_MODEL_REF_EXPLS
543            (model_ref_expl_id,
544             parent_expl_node_id,
546             model_id,
547             component_id,
548             ps_node_type,
549             virtual_flag,
550             node_depth,
551 	    expl_node_type,
552             deleted_flag)
553     VALUES (v_expl_id,
554             NULL,
555             NULL,
556             p_ps_node_id,
557             p_ps_node_id,
558             p_ps_node_type,
559             YES_FLAG,
560             0,
561 	      MANDATORY_EXPL_TYPE,
562             NO_FLAG);
563 
564 END add_root_Model_record;
565 
566 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
567 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
568 
569 --
570 -- populate chain of connected models starting with model ( p_model_id )
571 -- format of record : model_id/parent_model_id
572 -- Example :
573 --  M3
574 --   |---> M2
575 --         |--->M1
576 --               |--~~~--> M3 ( Circular connector )
577 -- we start with M1 and go up on the tree
578 -- until M3
579 -- so t_chain is { M1/M2, M2/M3, M3/null }
580 -- note that element for M3 must have parent_model_id=null - not M1
581 -- otherwise we will have  a VERY BIG PROBLEM because of circularity :
582 --  check_node/move_node/delete_node  will go to infinite loop
583 --
584 PROCEDURE populate_chain
585 (p_model_id            IN  INTEGER) IS
586 TYPE IntArray IS TABLE   OF NUMBER INDEX BY VARCHAR2(15);
587 t_models             IntArray;
588 v_circularity_exists BOOLEAN:=FALSE;
589 
590     PROCEDURE pop(p_id IN NUMBER) IS
591         v_ind NUMBER:=0;
592     BEGIN
593         FOR i IN(SELECT DISTINCT devl_project_id FROM CZ_PS_NODES a
594                  WHERE reference_id=p_id AND deleted_flag=NO_FLAG AND
595                  devl_project_id IN(SELECT object_id FROM CZ_RP_ENTRIES
596                  WHERE object_id=a.devl_project_id AND object_type='PRJ' AND deleted_flag=NO_FLAG))
597         LOOP
598            v_ind:=t_chain.COUNT+1;
599            t_chain(v_ind).model_id:=i.devl_project_id;
600            t_chain(v_ind).parent_model_id:=p_id;
601 
602            v_circularity_exists:=t_models.EXISTS(i.devl_project_id);
603            t_models(i.devl_project_id):=p_id;
604 
605            IF i.devl_project_id <> p_model_id AND
606               NOT(v_circularity_exists) THEN
607               pop(i.devl_project_id);
608            ELSE
609               --t_chain(v_ind).parent_model_id:=NULL;
610               NULL;
611            END IF;
612         END LOOP;
613     END pop;
614 
615 BEGIN
616     pop(p_model_id);
617 END populate_chain;
618 
619 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
620 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
621 
622 PROCEDURE calc_Expl_Paths(p_root_expl_id IN NUMBER,x_paths_tbl OUT NOCOPY Varchar2Array ) IS
623 BEGIN
624 
625   FOR m IN(SELECT model_ref_expl_id,parent_expl_node_id,component_id,referring_node_id
626              FROM CZ_MODEL_REF_EXPLS
627             START WITH model_ref_expl_id=p_root_expl_id
628             CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag='0' AND PRIOR deleted_flag='0')
629   LOOP
630 
631     IF m.referring_node_id IS NULL THEN
632 
633       IF x_paths_tbl.EXISTS(m.parent_expl_node_id) THEN
634         IF x_paths_tbl(m.parent_expl_node_id)='.' THEN
635           x_paths_tbl(m.model_ref_expl_id) := TO_CHAR(m.component_id);
636         ELSE
637           x_paths_tbl(m.model_ref_expl_id) := TO_CHAR(m.component_id)||'.'||x_paths_tbl(m.parent_expl_node_id);
638         END IF;
639       ELSE
640         x_paths_tbl(m.model_ref_expl_id) := '.';
641       END IF;
642 
643     ELSE
644 
645       IF x_paths_tbl.EXISTS(m.parent_expl_node_id) THEN
646         IF x_paths_tbl(m.parent_expl_node_id)='.' THEN
647           x_paths_tbl(m.model_ref_expl_id) := TO_CHAR(m.referring_node_id);
648         ELSE
649           x_paths_tbl(m.model_ref_expl_id) := TO_CHAR(m.referring_node_id)||'.'||x_paths_tbl(m.parent_expl_node_id);
650         END IF;
651       ELSE
652         x_paths_tbl(m.model_ref_expl_id) := '.';
653       END IF;
654 
655     END IF;
656 
657   END LOOP;
658 
659 END calc_Expl_Paths;
660 
661 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
662 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
663 
664 --
665 -- populate target subtree = array that contains expl tree of the target model ( p_target_model_id )
666 -- Example :
667 --     M3
668 --     |-->M2
669 --         |--C2
670 --         |------>M1
671 --                 |--->C1
672 -- now if we add a circular connector  from M4 to M3
673 -- then target subtree will look like :
674 --     M3
675 --     |-->M2
676 --         |--C2
677 --         |------>M1
678 --                 |--->C1
679 --
680 PROCEDURE get_Expl_Tree
681 (
682  p_target_model_id         IN  NUMBER,
683  px_root_expl_id           OUT NOCOPY NUMBER,
684  p_target_subtree_tbl      IN OUT NOCOPY ArrayId
685 ) IS
686   l_paths_tbl VArchar2Array;
687   l_expl_id   NUMBER;
691                FROM CZ_MODEL_REF_EXPLS
688 BEGIN
689      FOR i IN (SELECT  parent_expl_node_id,referring_node_id,ps_node_type,
690                        virtual_flag,component_id,expl_node_type,model_ref_expl_id,LEVEL
692                START WITH model_id=p_target_model_id AND component_id=p_target_model_id -- this condition specifies root of expl tree
693                           AND deleted_flag=NO_FLAG
694                CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
695      LOOP
696         IF i.parent_expl_node_id IS NULL THEN
697            px_root_expl_id:=i.model_ref_expl_id;
698         END IF;
699         p_target_subtree_tbl(i.model_ref_expl_id).new_id:=i.model_ref_expl_id;
700         p_target_subtree_tbl(i.model_ref_expl_id).parent_id:=i.parent_expl_node_id;
701         p_target_subtree_tbl(i.model_ref_expl_id).ps_node_id:=i.referring_node_id;
702         p_target_subtree_tbl(i.model_ref_expl_id).ps_node_type:=i.ps_node_type;
703         p_target_subtree_tbl(i.model_ref_expl_id).virtual_flag:=i.virtual_flag;
704         p_target_subtree_tbl(i.model_ref_expl_id).component_id:=i.component_id;
705         p_target_subtree_tbl(i.model_ref_expl_id).expl_node_type:=i.expl_node_type;
706         p_target_subtree_tbl(i.model_ref_expl_id).child_model_id:=i.model_ref_expl_id;
707         p_target_subtree_tbl(i.model_ref_expl_id).current_level:=i.LEVEL;
708     END LOOP;
709 
710     calc_Expl_Paths(px_root_expl_id,l_paths_tbl);
711     l_expl_id := p_target_subtree_tbl.First;
712     LOOP
713       IF l_expl_id IS NULL THEN
714         EXIT;
715       END IF;
716       p_target_subtree_tbl(l_expl_id).expl_path := l_paths_tbl(l_expl_id);
717       l_expl_id := p_target_subtree_tbl.NEXT(l_expl_id);
718     END LOOP;
719 
720 END get_Expl_Tree;
721 
722 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
723 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
724 
725 --
726 -- the procedure uses target subtree to construct attached subtree in circular connectors case
727 --
728 PROCEDURE filter_Branches
729 (
730 p_target_model_id     IN NUMBER,
731 p_target_subtree_tbl      IN OUT NOCOPY ArrayId,       -- stores target subtree
732 x_subtree_tbl             IN OUT NOCOPY ArrayId        -- will store subtree
733 ) IS
734 
735     t_model_ref_expl_ids_tbl  IntArray;
736 
737 BEGIN
738     --
739     -- inialize OUTPUT subtree
740     --
741     x_subtree_tbl:=p_target_subtree_tbl;
742 
743     --
744     -- collect expl_ids which belong to subtrees of the references/connectors of excluded branch
745     -- Example :
746     -- suppose p_target_subtree_tbl looks like :
747     -- M3
748     -- |---> M2
749     --       |---C2
750     --       |-~~~~~~~~->M1 ( CONNECTOR )
751     --       |        |_C1
752     --       |--------------->M5
753     --  then we need to collect expl_ids of the following subtrees
754     --  M1         and     M5
755     --  |--C1
756     --  so in this case t_model_ref_expl_ids_tbl will store 2 elements
757     --
758     FOR i IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
759              WHERE model_id=p_target_model_id AND deleted_flag=NO_FLAG AND
760              ps_node_type IN(CONNECTOR_TYPE,REFERENCE_TYPE) )
761     LOOP
762        FOR j IN (SELECT model_ref_expl_id,ps_node_type
763                  FROM CZ_MODEL_REF_EXPLS
764                  START WITH model_ref_expl_id = i.model_ref_expl_id AND deleted_flag=NO_FLAG
765                  CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
766        LOOP
767           t_model_ref_expl_ids_tbl(t_model_ref_expl_ids_tbl.COUNT+1):=j.model_ref_expl_id;
768        END LOOP;
769     END LOOP;
770 
771     IF t_model_ref_expl_ids_tbl.COUNT=0 THEN
772        RETURN;
773     END IF;
774 
775     --
776     -- remove those branches from the target subtree which point to model with model_id=p_exluded_model_id
777     -- <=> remove all expl_ids from ( x_subtree_tbl that was initilized as p_target_subtree_tbl )
778     -- that we collected before
779     --
780     FOR i IN t_model_ref_expl_ids_tbl.FIRST..t_model_ref_expl_ids_tbl.LAST
781     LOOP
782        x_subtree_tbl.DELETE(t_model_ref_expl_ids_tbl(i));
783     END LOOP;
784 
785 END filter_Branches;
786 
787 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
788 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
789 
790 --
791 -- the procedure is used for attaching subtree to the new subtree root node
792 -- of model from the NEXT LEVEL of the chain of connected models
793 -- this means  that p_subtree_tbl contains subtree from the PREVIOUS LEVEL
794 -- we need to rekey this subtree and attach it to the new subtree root node identified by p_new_root_expl_id
795 -- of the model from the NEXT LEVEL
796 --
797 PROCEDURE attach_Subtree
798 (
799 p_model_id                IN NUMBER,              -- model_id of the model to which we are attaching subtree
800 p_new_root_expl_id        IN NUMBER,              -- expl_id of new root node
801 p_new_root_level          IN NUMBER,              -- node_depth of new root node
802 p_subtree_root_expl_id    IN NUMBER,              -- expl_id of the rood node of  subtree
803 p_subtree_tbl             IN ArrayId) IS          -- stores subtree
804 
808 
805     t_subtree_tbl             ArrayId;   -- stores rehashed ( rekeyed ) subtree
806 
807     t_next_level_expl_ids_tbl ArrayId;
809     v_parent_id          CZ_MODEL_REF_EXPLS.parent_expl_node_id%TYPE;
810     v_level              CZ_MODEL_REF_EXPLS.node_depth%TYPE;
811     v_next_id            CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
812     v_ind                CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
813     v_subtree_root_level CZ_MODEL_REF_EXPLS.node_depth%TYPE;
814 
815 BEGIN
816 
817     t_subtree_tbl := p_subtree_tbl;
818 
819     ---- FIRST STEP : rehash subtree
820 
821     v_ind:=p_subtree_tbl.FIRST;
822     LOOP
823        IF v_ind IS NULL THEN
824           EXIT;
825        END IF;
826 
827        IF (v_ind = p_subtree_root_expl_id) THEN
828          v_subtree_root_level := t_subtree_tbl(v_ind).current_level;
829        END IF;
830 
831        t_subtree_tbl(v_ind).new_id := allocate_Expl_Id;
832        v_ind:=p_subtree_tbl.NEXT(v_ind);
833     END LOOP;
834 
835     ---- NEXT STEP : attach subtree
836 
837     v_ind:=t_subtree_tbl.FIRST;
838     LOOP
839        IF v_ind IS NULL THEN
840           EXIT;
841        END IF;
842 
843        IF (v_ind = p_subtree_root_expl_id) THEN
844           --
845           -- if this is a root node
846           -- then attach the root node to a new subtree root identified by model_ref_expl_id = p_new_root_expl_id
847           --
848           v_parent_id := p_new_root_expl_id;
849           v_level     := p_new_root_level+1;
850        ELSE
851           BEGIN
852               v_level:= p_new_root_level + (t_subtree_tbl(v_ind).current_level-v_subtree_root_level);
853               v_parent_id:=t_subtree_tbl(t_subtree_tbl(v_ind).parent_id).new_id;
854           EXCEPTION
855               WHEN NO_DATA_FOUND THEN
856                    v_parent_id:=t_subtree_tbl(p_subtree_root_expl_id).new_id;
857               WHEN OTHERS THEN
858                    v_parent_id:=t_subtree_tbl(p_subtree_root_expl_id).new_id;
859           END;
860        END IF;
861 
862        IF v_parent_id=p_new_root_expl_id THEN -- this is a root of attached subtree
863          g_root_point_tree_tbl(p_new_root_expl_id) := t_subtree_tbl(v_ind).new_id; -- store maping between attach point and root of attached subtree
864        END IF;
865 
866        INSERT INTO CZ_MODEL_REF_EXPLS
867               (model_ref_expl_id,
868                parent_expl_node_id,
869                referring_node_id,
870                model_id,
871                component_id,
872                child_model_expl_id,
873                ps_node_type,
874                virtual_flag,
875                node_depth,
876                expl_node_type,
877                deleted_flag)
878            VALUES
879                (t_subtree_tbl(v_ind).new_id,
880                v_parent_id,
881                t_subtree_tbl(v_ind).ps_node_id,
882                p_model_id,
883                t_subtree_tbl(v_ind).component_id,
884                NULL,
885                t_subtree_tbl(v_ind).ps_node_type,
886                t_subtree_tbl(v_ind).virtual_flag,
887                v_level,
888                t_subtree_tbl(v_ind).expl_node_type,
889                NO_FLAG);
890 
891        t_next_level_expl_ids_tbl(v_ind).new_id         := t_subtree_tbl(v_ind).new_id;
892        t_next_level_expl_ids_tbl(v_ind).ps_node_id     := t_subtree_tbl(v_ind).ps_node_id;
893        t_next_level_expl_ids_tbl(v_ind).component_id   := t_subtree_tbl(v_ind).component_id;
894        t_next_level_expl_ids_tbl(v_ind).expl_path      := t_subtree_tbl(v_ind).expl_path;
895 
896 
897        v_ind:=t_subtree_tbl.NEXT(v_ind);
898     END LOOP;
899 
900     -- release memory allocated for t_subtree_tbl array
901     t_subtree_tbl.DELETE;
902 
903     FOR i IN(SELECT ps_node_id, devl_project_id FROM CZ_PS_NODES a
904               WHERE reference_id=p_model_id AND deleted_flag='0'
905                                             AND EXISTS (SELECT NULL FROM cz_devl_projects
906                                                         WHERE devl_project_id = a.devl_project_id
907                                                           AND deleted_flag='0'))
908     LOOP
909       FOR h IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
910                  WHERE model_id=i.devl_project_id AND
911                        child_model_expl_id=p_new_root_expl_id AND deleted_flag='0')
912       LOOP
913         g_hash_tree_tbl(h.model_ref_expl_id) := t_next_level_expl_ids_tbl;
914       END LOOP;
915     END LOOP;
916 
917     t_next_level_expl_ids_tbl.DELETE;
918 
919 END attach_Subtree;
920 
921 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
922 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
923 
924 --
925 -- this procedure populates child_model_expl_id's.
926 -- It uses global arrays g_root_point_tree_tbl and g_hash_tree_tbl which are
927 -- populated in attach_Subtree()
928 --
929 PROCEDURE populate_Child_Model_Expl_id IS
930 
931   t_attach_subtree_tbl       ArrayId;
932   l_expl_paths_tbl           Varchar2Array;
933   l_new_expl_id              NUMBER;
934 
935   v_ind                      NUMBER;
936   v_expl_id                  NUMBER;
940 
937   v_root_expl_id             NUMBER;
938 
939 BEGIN
941   v_ind := g_hash_tree_tbl.First;
942   LOOP
943     IF v_ind IS NULL THEN
944       EXIT;
945     END IF;
946 
947     v_root_expl_id := g_root_point_tree_tbl(v_ind);
948     t_attach_subtree_tbl := g_hash_tree_tbl(v_ind);
949 
950     calc_Expl_Paths(v_root_expl_id, l_expl_paths_tbl);
951 
952     l_new_expl_id := l_expl_paths_tbl.First;
953     LOOP
954       IF l_new_expl_id IS NULL THEN
955         EXIT;
956       END IF;
957 
958       v_expl_id := t_attach_subtree_tbl.First;
959       LOOP
960         IF v_expl_id IS NULL THEN
961           EXIT;
962         END IF;
963 
964         IF l_expl_paths_tbl(l_new_expl_id) = t_attach_subtree_tbl(v_expl_id).expl_path THEN
965 
966           UPDATE CZ_MODEL_REF_EXPLS
967              SET child_model_expl_id=t_attach_subtree_tbl(v_expl_id).new_id
968            WHERE model_ref_expl_id=l_new_expl_id;
969 
970         END IF;
971         v_expl_id := t_attach_subtree_tbl.NEXT(v_expl_id);
972       END LOOP;
973 
974       l_new_expl_id := l_expl_paths_tbl.NEXT(l_new_expl_id);
975     END LOOP;
976     l_expl_paths_tbl.DELETE;
977     v_ind := g_hash_tree_tbl.NEXT(v_ind);
978   END LOOP;
979 
980 END populate_Child_Model_Expl_id;
981 
982 
983 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
984 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
985 
986 --
987 -- attach subtree ( presented as array ) to all connected models
988 --
989 PROCEDURE copy_Subtree
990 (p_model_id                IN INTEGER,            -- current model id
991  p_target_model_id         IN INTEGER,
992  p_parent_ps_id            IN INTEGER,            -- ps_node_id of the node to attach subtree
993  p_target_root_expl_id     IN INTEGER,            -- expl_id of the root node of subtree ( <=> p_target_subtree_tbl )
994  p_target_subtree_tbl      IN OUT NOCOPY ArrayId, -- array which contains subtree
995  p_ps_node_type            IN INTEGER
996  ) IS
997     TYPE IntArrayIndexVC2 IS TABLE   OF NUMBER INDEX BY VARCHAR2(15);
998     t_temp_tree_tbl            IntArray;
999     t_connect_point_tbl        IntArray;
1000     t_models_level             IntArrayIndexVC2;   -- is populated by model_ids of the current level ( in a chain of connected models )
1001     t_new_models_level         IntArrayIndexVC2;   -- is populated by model_ids for the next level ( in a chain of connected models )
1002     t_hash_models              IntArrayIndexVC2;   -- stores already handled models
1003     t_subtree_tbl              ArrayId;
1004     v_circularity_exists       VARCHAR2(1):=NO_FLAG;
1005     v_connector_parent_exists  VARCHAR2(1):=NO_FLAG;
1006     v_ind                      NUMBER;
1007     v_el                       NUMBER;
1008 
1009 BEGIN
1010     -- initialize global arrays which stores expl_ids
1011     g_hash_tree_tbl.DELETE;
1012     g_root_point_tree_tbl.DELETE;
1013 
1014     IF p_target_model_id=p_model_id THEN   -- this is an obvious circular case
1015 
1016        v_circularity_exists:=YES_FLAG;
1017 
1018        --
1019        -- exlude all References/Connectors from the subtree that we are attaching
1020        -- to the current model (p_model_id)
1021        -- t_subtree_tbl will store the subtree without References/Connectors subtrees
1022        --
1023        filter_Branches(p_target_model_id    => p_model_id,
1024                        p_target_subtree_tbl => p_target_subtree_tbl,
1025                        x_subtree_tbl        => t_subtree_tbl);
1026 
1027     ELSE
1028        --
1029        -- check circularity
1030        --
1031        v_circularity_exists := circularity_Exists(p_model_id,p_target_model_id);
1032        IF v_circularity_exists=YES_FLAG AND p_ps_node_type=CONNECTOR_TYPE THEN
1033 
1034              filter_Branches(p_target_model_id    => p_target_model_id,
1035                              p_target_subtree_tbl => p_target_subtree_tbl,
1036                              x_subtree_tbl        => t_subtree_tbl);
1037        ELSE
1038            t_subtree_tbl:=p_target_subtree_tbl;
1039        END IF;
1040 
1041     END IF;
1042 
1043     g_hash_tree_tbl(t_subtree_tbl(p_target_root_expl_id).parent_id) := t_subtree_tbl;
1044 
1045     --
1046     -- first - attach the subtree to the current model ( <=> p_model_id )
1047     --
1048     attach_Subtree(p_model_id                => p_model_id,    -- specifies model to which we are attaching the subtree
1049                    p_new_root_expl_id        => t_subtree_tbl(p_target_root_expl_id).parent_id, -- expl_id of new subtree root
1050                    p_new_root_level          => t_subtree_tbl(p_target_root_expl_id).current_level, -- node_depth of new subtree root
1051                    p_subtree_root_expl_id    => p_target_root_expl_id, -- expl_id=index of subtree root in subtree array p_subtree_tbl
1052                    p_subtree_tbl             => t_subtree_tbl);         -- subtree array
1053 
1054     --
1055     -- if there are no any connected models then just exit
1056     --
1057     IF t_chain.COUNT=0 THEN
1058        --
1059        -- populate child_model_expl_id's
1060        --
1061        populate_Child_Model_Expl_id();
1062        RETURN;
1063     END IF;
1064 
1065     --
1066     -- initilaize hash map of models on the current level
1070 
1067     --
1068     t_models_level(p_model_id):=p_model_id;
1069 
1071     --
1072     -- initilaize hash map of already handled models
1073     --
1074     t_hash_models(p_model_id):=p_model_id;
1075 
1076 
1077     --
1078     -- loop through t_models_level array
1079     -- initially t_model_level contains just p_model_id ( source model )
1080     --
1081     LOOP
1082        --
1083        -- go through all connected models
1084        -- in order to find all models connected to the model with model_id = t_models_level(v_ind)
1085        -- Example :
1086        -- M3
1087        -- |--->M2
1088        --      |---->M1
1089        --            ^
1090        -- M10        |
1091        --  |----------
1092        --
1093        -- initially we have t_model_level(M1)=M1
1094        -- and t_chain ( model_id/parent_model_id ) = { M1/M2, M2/M3, M3/null }
1095        -- so in this algorithm we go through all t_chain elements and find
1096        -- those which are parent elements ( elementS because the same model can be referenced from the different models )
1097        -- if we start with M1 then
1098        --    next level will contain t_chain elements for which t_chain(i).parent_model_id = M1
1099        --    => it will contain M2 and M10
1100        --  t_new_models_level will be populated with {M2, M10}
1101        --  at the bottom of the loop we have t_models_level:=lt_new_models_level;
1102        -- so on next itteration we will be using t_models_level = { M2, M10}
1103        --
1104        FOR i IN t_chain.FIRST..t_chain.LAST
1105        LOOP
1106           v_ind:=t_models_level.FIRST;
1107           LOOP
1108              IF v_ind IS NULL THEN
1109                 EXIT;
1110              END IF;
1111 
1112              --
1113              -- starting with the current model go up to the chain of connected
1114              -- models level by level
1115              --
1116              IF t_chain(i).parent_model_id=t_models_level(v_ind)              -- find all models connected to the current one
1117                 AND t_chain(i).model_id <> t_chain(i).parent_model_id THEN    -- if it's circular connector
1118                                                                               -- case then we don't need to attach
1119                                                                               -- the target subtree again
1120                 --
1121                 -- if t_chain has a duplicates of model_ids then
1122                 -- we don't need to apply algorithm second time
1123                 -- one model must be handled only once
1124                 --
1125                 IF NOT(t_hash_models.EXISTS(t_chain(i).model_id)) THEN
1126 
1127                 --
1128                 -- t_connect_point_tbl stores already handled branches
1129                 -- Example :
1130                 -- M2
1131                 --  |--Ref1--expl_id=1000---->M1
1132                 --
1133                 --  |--Ref2--expl_id=2000---->M1
1134                 --
1135                 -- and we want to attach the target subtree under M1
1136                 -- in model M2 we have 2 entries that have component_id = p_parent_ps_id = M1
1137                 -- these are references Ref1 and Ref2
1138 
1139                 FOR m IN(SELECT model_ref_expl_id,component_id,ps_node_type,node_depth
1140                          FROM CZ_MODEL_REF_EXPLS
1141                          WHERE  model_id=t_chain(i).model_id AND component_id=p_parent_ps_id AND
1142                                 parent_expl_node_id IS NOT NULL AND deleted_flag=NO_FLAG)
1143                 LOOP
1144 
1145                    BEGIN
1146                        v_connector_parent_exists:=NO_FLAG;
1147                        SELECT YES_FLAG INTO v_connector_parent_exists FROM dual
1148                        WHERE EXISTS(SELECT NULL FROM CZ_MODEL_REF_EXPLS
1149                        WHERE ps_node_type=CONNECTOR_TYPE
1150                        START WITH model_ref_expl_id=m.model_ref_expl_id
1151                        CONNECT BY PRIOR parent_expl_node_id=model_ref_expl_id AND deleted_flag=NO_FLAG AND deleted_flag=NO_FLAG);
1152                    EXCEPTION
1153                        WHEN NO_DATA_FOUND THEN
1154                             NULL;
1155                    END;
1156 
1157                    --
1158                    -- t_connect_point_tbl - hash map that stores expl_ids of
1159                    -- already handled branches
1160                    -- so we need to attach subtree just in case when
1161                    -- this given branch is not handled yet
1162                    --
1163                    IF NOT(t_connect_point_tbl.EXISTS(m.model_ref_expl_id)) AND
1164                       NOT( p_ps_node_type=CONNECTOR_TYPE AND v_connector_parent_exists=YES_FLAG) THEN  -- not a connector's subtree under connector
1165 
1166                       IF v_circularity_exists = YES_FLAG THEN
1167 
1168                          IF p_ps_node_type=CONNECTOR_TYPE THEN
1169 
1170                             --
1171                             -- remove all expl subtrees under References/Connectors which
1172                             -- belong to model with model_id=t_chain(i).model_id
1173                             -- t_subtree_tbl will store OUTPUT subtree
1174                             --
1175                             filter_Branches(p_target_model_id    => p_target_model_id,
1179                             --
1176                                             p_target_subtree_tbl => p_target_subtree_tbl,
1177                                             x_subtree_tbl        => t_subtree_tbl);
1178 
1180                             -- attach subtree with removed expl subtrees under References/Connectors which
1181                             -- belong to model with model_id=t_chain(i).model_id
1182                             -- to expl_id = m.model_ref_expl_id
1183                             --
1184                             attach_Subtree(p_model_id             => t_chain(i).model_id,
1185                                            p_new_root_expl_id     => m.model_ref_expl_id,       -- expl_id of the next "attach point"
1186                                            p_new_root_level       => m.node_depth,              -- node_depth of the next "attach point"
1187                                            p_subtree_root_expl_id => p_target_root_expl_id,     -- expl_id=index of subtree array associated
1188                                                                                                 -- with a root node
1189                                            p_subtree_tbl             => t_subtree_tbl);          -- subtree array
1190                            END IF;
1191                       ELSE
1192 
1193                          --
1194                          -- attach the target subtree to expl_id = m.model_ref_expl_id
1195                          -- here we don't need to change initial target subtree p_target_subtree_tbl
1196                          -- we need just attach it to an appropriate expl node
1197                          --
1198                          attach_Subtree(p_model_id             => t_chain(i).model_id,
1199                                         p_new_root_expl_id     => m.model_ref_expl_id,       -- expl_id of the next "attach point"
1200                                         p_new_root_level       => m.node_depth,              -- node_depth of the next "attach point"
1201                                         p_subtree_root_expl_id => p_target_root_expl_id,     -- expl_id=index of subtree array associated
1202                                                                                              -- with a root node
1203                                         p_subtree_tbl             => p_target_subtree_tbl);     -- subtree array
1204 
1205                       END IF;
1206 
1207                    END IF;
1208                    --
1209                    -- put expl_id of branch that we've just handled
1210                    --
1211                    t_connect_point_tbl(m.model_ref_expl_id):= t_chain(i).model_id;
1212                 END LOOP; -- end of loop through CZ_MODEL_REF_EXPLS table --
1213 
1214                 --
1215                 -- put the current model = t_chain(i).model_id to the hash
1216                 -- of models which already hadnled
1217                 -- this hash is used in order to avoid attaching
1218                 -- the subtree twice ( or more than twice )
1219                 --
1220                 t_hash_models(t_chain(i).model_id):= t_chain(i).model_id;
1221 
1222                 --
1223                 -- populate array of models for the next level
1224                 -- models from the current level will be used as base level
1225                 -- on the next itteration
1226                 --
1227                 t_new_models_level(t_chain(i).model_id):=t_chain(i).model_id;
1228 
1229                 END IF; -- end of if NOT(t_hash_models.EXISTS(t_chain(i).model_id)) --
1230 
1231              END IF;     -- end of if t_chain(i).parent_model_id=t_models_level(v_ind)
1232 
1233              v_ind:=t_models_level.NEXT(v_ind);
1234 
1235           END LOOP; -- end of loop for t_models_level array
1236 
1237     END LOOP; -- end of loop for i in t_chain.First..t_chain.Last --
1238 
1239     --
1240     -- now we going to the next itteration
1241     -- so we need to set t_models_level to array of the models from the just handled level
1242     --
1243     t_models_level:=t_new_models_level; t_new_models_level.DELETE;
1244 
1245     --
1246     -- if there are no connected models to models on the current level then exit
1247     --
1248     IF (t_models_level.COUNT = 0) THEN
1249         EXIT;
1250     END IF;
1251 
1252 END LOOP;
1253 
1254 --
1255 -- populate child_model_expl_id's
1256 --
1257 populate_Child_Model_Expl_id();
1258 
1259 EXCEPTION
1260     WHEN OTHERS THEN
1261          LOG_REPORT('copy_Subtree','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
1262 END Copy_Subtree;
1263 
1264 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1265 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1266 
1267 PROCEDURE add_Reference
1268 (p_ps_node_id           IN  INTEGER,
1269  p_to_model_id          IN  INTEGER,               -- reference to p_to_model_id
1270  p_containing_model_id  IN  INTEGER,               -- current Model where reference is created
1271  p_virtual_flag         IN  VARCHAR2,
1272  p_out_err              OUT NOCOPY INTEGER,
1273  p_ps_type              IN  INTEGER DEFAULT NULL,
1274  p_expl_node_type       IN  INTEGER                -- DEFAULT MANDATORY_EXPL_TYPE
1275 ) IS
1276 
1277      t_subtree_tbl             ArrayId;                                    -- stores subtree array
1278      t_prev_level_expl_ids_tbl IntArray;                                   -- stores expl_ids of the target subtree
1282      v_parent_level            CZ_MODEL_REF_EXPLS.node_depth%TYPE;         -- node_depth of new subtree root node
1279                                                                            -- which will be used as child_expl_ids on the next level
1280      v_parent_ps_node_id       CZ_PS_NODES.ps_node_id%TYPE;                -- ps_node_id of new subtree root node
1281      v_parent_expl_id          CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;  -- expl_id of new subtree root node
1283      v_target_root_expl_id     CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;  -- root expl_id of the target model
1284      v_next_id                 CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;  -- stores expl_id generated by sequence
1285 
1286 BEGIN
1287      Initialize;
1288      p_out_err:=0;
1289 
1290      --
1291      -- find node in Model Ref Expls which can be used as parent node
1292      -- for Subtree
1293      --
1294      get_Node_Up(p_ps_node_id,p_containing_model_id,
1295                  v_parent_ps_node_id,v_parent_expl_id,v_parent_level);
1296 
1297      --
1298      -- get the target subtree
1299      --
1300      get_Expl_Tree(p_target_model_id    => p_to_model_id,
1301                    px_root_expl_id      => v_target_root_expl_id,
1302                    p_target_subtree_tbl => t_subtree_tbl);
1303 
1304      --
1305      -- create array element associated with the Reference ( ps_node_id = p_ps_node_id) itself
1306      --
1307      t_subtree_tbl(v_target_root_expl_id).parent_id      := v_parent_expl_id;      -- <=> model_ref_expl_id of the node to attach subtree
1308      t_subtree_tbl(v_target_root_expl_id).ps_node_id     := p_ps_node_id;
1309      t_subtree_tbl(v_target_root_expl_id).ps_node_type   := p_ps_type;
1310      t_subtree_tbl(v_target_root_expl_id).virtual_flag   := p_virtual_flag;
1311      t_subtree_tbl(v_target_root_expl_id).current_level  := v_parent_level;      -- node_depth of the node to attach subtree plus 1
1312      t_subtree_tbl(v_target_root_expl_id).component_id   := p_to_model_id;         -- referenced model ( <=> target model )
1313      t_subtree_tbl(v_target_root_expl_id).child_model_id := v_target_root_expl_id; -- <=> model_ref_expl_id of the root node of target model
1314      t_subtree_tbl(v_target_root_expl_id).expl_node_type := p_expl_node_type;
1315 
1316      --
1317      -- attach Subtree to the containing model --
1318      -- here we assume that root node of subtree is already populated
1319      --
1320      copy_Subtree(p_model_id                => p_containing_model_id,
1321                   p_target_model_id         => p_to_model_id,
1322                   p_parent_ps_id            => v_parent_ps_node_id,
1323                   p_target_root_expl_id     => v_target_root_expl_id,
1324                   p_target_subtree_tbl      => t_subtree_tbl,
1325                   p_ps_node_type            => p_ps_type);
1326 
1327 EXCEPTION
1328      WHEN OTHERS THEN
1329           p_out_err:=m_RUN_ID;
1330           LOG_REPORT('add_Reference',
1331           'Error : ps_node_id='||TO_CHAR(p_ps_node_id)||' < '||ERROR_CODE||' > :'||SQLERRM);
1332 END add_Reference;
1333 
1334 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1335 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1336 
1337 PROCEDURE add_Ref
1338 (p_ps_node_id           IN  INTEGER,
1339  p_to_model_id          IN  INTEGER,
1340  p_containing_model_id  IN  INTEGER) IS
1341 
1342     v_out_err       INTEGER;
1343 
1344 BEGIN
1345     add_Reference(p_ps_node_id,p_to_model_id, p_containing_model_id,
1346                   NO_FLAG,v_out_err,REFERENCE_TYPE, MANDATORY_EXPL_TYPE);
1347 END;
1348 
1349 
1350 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1351 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1352 
1353 PROCEDURE add_Connector
1354 (p_ps_node_id           IN  INTEGER,
1355  p_to_model_id          IN  INTEGER,
1356  p_containing_model_id  IN  INTEGER) IS
1357 
1358     v_out_err       INTEGER;
1359 
1360 BEGIN
1361     add_Reference(p_ps_node_id,p_to_model_id, p_containing_model_id,
1362                   NO_FLAG,v_out_err,CONNECTOR_TYPE, MANDATORY_EXPL_TYPE);
1363 
1364 END;
1365 
1366 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1367 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1368 
1369 PROCEDURE get_Expl_Id
1370 (p_ps_node_id     IN     INTEGER,
1371  p_project_id     IN     INTEGER,
1372  p_out_expl_id    IN OUT NOCOPY INTEGER,
1373  p_out_level      IN OUT NOCOPY INTEGER,
1374  p_ps_node_type   IN      INTEGER DEFAULT NULL ) IS
1375 
1376      ret INTEGER:=NULL_VALUE;
1377 
1378 BEGIN
1379      p_out_expl_id:=NULL_VALUE;
1380      p_out_level:=NULL_VALUE;
1381 
1382 
1383      IF p_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) THEN
1384         FOR i IN (SELECT model_ref_expl_id,node_depth FROM CZ_MODEL_REF_EXPLS
1385                   WHERE model_id=p_project_id AND referring_node_id=p_ps_node_id
1386                   AND child_model_expl_id IS NULL AND deleted_flag=NO_FLAG)
1387         LOOP
1388            p_out_expl_id:=i.model_ref_expl_id;
1389            p_out_level:=i.node_depth;
1390         END LOOP;
1391      ELSE
1392         FOR i IN (SELECT model_ref_expl_id,node_depth FROM CZ_MODEL_REF_EXPLS
1393                   WHERE model_id=p_project_id AND referring_node_id IS NULL
1394                   AND component_id=p_ps_node_id AND child_model_expl_id IS NULL AND
1398            p_out_level:=i.node_depth;
1395                   deleted_flag=NO_FLAG)
1396         LOOP
1397            p_out_expl_id:=i.model_ref_expl_id;
1399         END LOOP;
1400      END IF;
1401 
1402 EXCEPTION
1403      WHEN OTHERS THEN
1404          LOG_REPORT('get_Expl_Id','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
1405 END;
1406 
1407 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1408 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1409 
1410 PROCEDURE get_Node_Up
1411 (p_ps_node_id     IN     INTEGER,
1412  p_project_id     IN     INTEGER,
1413  p_out_ps_node_id IN OUT NOCOPY INTEGER,
1414  p_out_expl_id    IN OUT NOCOPY INTEGER,
1415  p_out_level      IN OUT NOCOPY INTEGER) IS
1416 
1417      v_expl_id    INTEGER;
1418      v_temp       INTEGER;
1419 
1420 BEGIN
1421      p_out_ps_node_id:=NULL_VALUE;
1422      p_out_expl_id:=NULL_VALUE;
1423      p_out_level:=NULL_VALUE;
1424 
1425      FOR i IN (SELECT ps_node_id,ps_node_type,parent_id FROM CZ_PS_NODES
1426                WHERE ps_node_id=p_ps_node_id AND deleted_flag=NO_FLAG)
1427      LOOP
1428         get_Expl_Id(i.ps_node_id,p_project_id,v_expl_id,p_out_level,i.ps_node_type);
1429 
1430         IF v_expl_id<>NULL_VALUE THEN
1431            p_out_ps_node_id:=i.ps_node_id;
1432            p_out_expl_id:=v_expl_id;
1433            EXIT;
1434         END IF;
1435 
1436         IF i.ps_node_id<>p_project_id AND v_expl_id=NULL_VALUE THEN
1437            get_Node_Up(i.parent_id,p_project_id,p_out_ps_node_id,
1438                        p_out_expl_id,p_out_level);
1439         ELSE
1440            p_out_ps_node_id:=p_project_id;
1441         END IF;
1442      END LOOP;
1443 
1444 EXCEPTION
1445      WHEN OTHERS THEN
1446          LOG_REPORT('get_Node_Up','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
1447 END;
1448 
1449 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1450 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1451 
1452 PROCEDURE get_Node_Down
1453 (p_ps_node_id     IN     INTEGER,
1454  p_project_id     IN     INTEGER,
1455  p_out_ps_node_id IN OUT NOCOPY INTEGER,
1456  p_out_expl_id    IN OUT NOCOPY INTEGER,
1457  p_out_level      IN OUT NOCOPY INTEGER) IS
1458 
1459     v_expl_id    CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
1460     NODE_FOUND     EXCEPTION;
1461 
1462 BEGIN
1463      p_out_ps_node_id:=NULL_VALUE;
1464      p_out_expl_id:=NULL_VALUE;
1465      p_out_level:=NULL_VALUE;
1466      get_Expl_Id(p_ps_node_id,p_project_id,v_expl_id,p_out_level);
1467      IF v_expl_id<>NULL_VALUE THEN
1468         p_out_ps_node_id:=p_ps_node_id;
1469         p_out_expl_id:=v_expl_id;
1470         RAISE NODE_FOUND;
1471      END IF;
1472 
1473      FOR i IN (SELECT ps_node_id,parent_id FROM CZ_PS_NODES
1474                WHERE parent_id=p_ps_node_id AND deleted_flag=NO_FLAG)
1475      LOOP
1476         get_Expl_Id(i.ps_node_id,p_project_id,v_expl_id,p_out_level);
1477 
1478         IF v_expl_id<>NULL_VALUE THEN
1479            p_out_ps_node_id:=i.ps_node_id;
1480            p_out_expl_id:=v_expl_id;
1481            EXIT;
1482         END IF;
1483 
1484         IF v_expl_id=NULL_VALUE THEN
1485            get_Node_Down(i.ps_node_id,p_project_id,p_out_ps_node_id,
1486                          p_out_expl_id,p_out_level);
1487         ELSE
1488            p_out_ps_node_id:=NULL_VALUE;
1489         END IF;
1490      END LOOP;
1491 
1492 EXCEPTION
1493      WHEN NODE_FOUND THEN
1494           NULL;
1495      WHEN OTHERS THEN
1496          LOG_REPORT('get_Node_Down','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
1497 END;
1498 
1499 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1500 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1501 
1502 FUNCTION get_Next_ExplId
1503 (p_expl_id       IN INTEGER,
1504  p_child_expl_id IN INTEGER,
1505  p_mode          IN VARCHAR2 -- default PLUS_MODE
1506 )
1507 RETURN INTEGER IS
1508 
1509     v_ref_id INTEGER;
1510 
1511 BEGIN
1512 
1513     IF p_mode=PLUS_MODE THEN
1514 
1515      --
1516        -- DEBUG ERROR CODE --
1517        --
1518        ERROR_CODE:=300;
1519 
1520        SELECT model_ref_expl_id INTO v_ref_id FROM CZ_MODEL_REF_EXPLS
1521        WHERE parent_expl_node_id=p_expl_id
1522        AND (child_model_expl_id=p_child_expl_id OR model_ref_expl_id=p_child_expl_id)
1523        AND deleted_flag=NO_FLAG;
1524 
1525        --
1526        -- DEBUG ERROR CODE --
1527        --
1528        ERROR_CODE:=301;
1529 
1530     ELSE
1531        --
1532        -- DEBUG ERROR CODE --
1533        --
1534        ERROR_CODE:=302;
1535 
1536        SELECT parent_expl_node_id INTO v_ref_id FROM CZ_MODEL_REF_EXPLS
1537        WHERE model_ref_expl_id=p_expl_id;
1538 
1539        --
1540        -- DEBUG ERROR CODE --
1541        --
1542        ERROR_CODE:=303;
1543 
1544     END IF;
1545 
1546     RETURN v_ref_id;
1547 
1548 END;
1549 
1550 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1551 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1552 
1553 PROCEDURE set_Expls
1554 (p_project_id      IN INTEGER,
1555  p_ps_node_id      IN INTEGER,
1559     v_model_ref_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE ;
1556  p_mode            IN VARCHAR2, -- DEFAULT PLUS_MODE
1557  p_deleted_expl_id IN INTEGER DEFAULT NULL) IS
1558 
1560     v_project_id   CZ_MODEL_REF_EXPLS.model_id%TYPE;
1561     v_ref_id       CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
1562 
1563 BEGIN
1564 
1565     IF p_mode=PLUS_MODE THEN
1566 
1567        --
1568        -- DEBUG ERROR CODE --
1569        --
1570        ERROR_CODE:=400;
1571 
1572        SELECT model_ref_expl_id INTO v_model_ref_id FROM
1573        CZ_MODEL_REF_EXPLS WHERE model_id=p_project_id
1574        AND component_id=p_ps_node_id AND child_model_expl_id IS NULL AND deleted_flag=NO_FLAG;
1575 
1576        --
1577        -- DEBUG ERROR CODE --
1578        --
1579        ERROR_CODE:=401;
1580 
1581     END IF;
1582     IF p_mode=MINUS_MODE THEN
1583        v_model_ref_id:=p_deleted_expl_id;
1584     END IF;
1585 
1586     FOR i IN (SELECT ps_node_id,ps_node_type,NAME FROM CZ_PS_NODES
1587               START WITH devl_project_id=p_project_id AND deleted_flag=NO_FLAG AND ps_node_id=p_ps_node_id
1588               CONNECT BY PRIOR ps_node_id=parent_id AND NVL(virtual_flag,'1')='1' AND deleted_flag=NO_FLAG
1589               AND PRIOR deleted_flag=NO_FLAG)
1590     LOOP
1591 
1592         --
1593         -- DEBUG ERROR CODE --
1594         --
1595         ERROR_CODE:=402;
1596 
1597         FOR m IN(SELECT expr_node_id,rule_id,model_ref_expl_id FROM CZ_EXPRESSION_NODES
1598                  WHERE ps_node_id=i.ps_node_id AND deleted_flag=NO_FLAG)
1599         LOOP
1600            BEGIN
1601 
1602                --
1603                -- DEBUG ERROR CODE --
1604                --
1605                ERROR_CODE:=403;
1606 
1607                v_ref_id:=get_Next_ExplId(m.model_ref_expl_id,v_model_ref_id,p_mode);
1608 
1609                --
1610                -- DEBUG ERROR CODE --
1611                --
1612                ERROR_CODE:=404;
1613 
1614                UPDATE CZ_EXPRESSION_NODES
1615                SET model_ref_expl_id=v_ref_id
1616                WHERE expr_node_id=m.expr_node_id AND rule_id=m.rule_id;
1617 
1618                --
1619                -- DEBUG ERROR CODE --
1620                --
1621                ERROR_CODE:=405;
1622 
1623            EXCEPTION
1624                WHEN NO_DATA_FOUND THEN
1625                     NULL;
1626                WHEN OTHERS THEN
1627                     LOG_REPORT('set_Expls','CZ_EXPRESSION_NODES ERROR CODE :'||
1628                     ERROR_CODE||' : '||SQLERRM);
1629            END;
1630     END LOOP;
1631 
1632     IF i.ps_node_type IN(PRODUCT_TYPE,COMPONENT_TYPE) THEN
1633 
1634        --
1635        -- DEBUG ERROR CODE --
1636        --
1637        ERROR_CODE:=406;
1638 
1639        FOR m IN(SELECT func_comp_id,component_id,model_ref_expl_id FROM CZ_FUNC_COMP_SPECS
1640                 WHERE component_id=i.ps_node_id AND deleted_flag=NO_FLAG)
1641        LOOP
1642           BEGIN
1643 
1644               --
1645               -- DEBUG ERROR CODE --
1646               --
1647               ERROR_CODE:=407;
1648 
1649               v_ref_id:=get_Next_ExplId(m.model_ref_expl_id,v_model_ref_id,p_mode);
1650 
1651               --
1652               -- DEBUG ERROR CODE --
1653               --
1654               ERROR_CODE:=408;
1655 
1656               UPDATE CZ_FUNC_COMP_SPECS
1657               SET model_ref_expl_id=v_ref_id
1658               WHERE func_comp_id=m.func_comp_id AND component_id=m.component_id;
1659 
1660               --
1661               -- DEBUG ERROR CODE --
1662               --
1663               ERROR_CODE:=409;
1664 
1665           EXCEPTION
1666               WHEN OTHERS THEN
1667                    LOG_REPORT('set_Expls','CZ_FUNC_COMP_SPECS : func_comp_id='||TO_CHAR(m.func_comp_id));
1668           END;
1669 
1670        END LOOP;
1671 
1672     END  IF;
1673 
1674 
1675     IF i.ps_node_type IN(FEATURE_TYPE) THEN
1676 
1677       --
1678       -- DEBUG ERROR CODE --
1679       --
1680       ERROR_CODE:=410;
1681 
1682       FOR m IN(SELECT rule_id,feature_id,model_ref_expl_id FROM CZ_COMBO_FEATURES
1683                WHERE feature_id=i.ps_node_id AND deleted_flag=NO_FLAG)
1684       LOOP
1685          BEGIN
1686 
1687          --
1688          -- DEBUG ERROR CODE --
1689          --
1690          ERROR_CODE:=411;
1691 
1692          v_ref_id:=get_Next_ExplId(m.model_ref_expl_id,v_model_ref_id,p_mode);
1693 
1694          --
1695          -- DEBUG ERROR CODE --
1696          --
1697          ERROR_CODE:=412;
1698 
1699          UPDATE CZ_COMBO_FEATURES
1700          SET model_ref_expl_id=v_ref_id
1701          WHERE rule_id=m.rule_id AND feature_id=m.feature_id;
1702 
1703          --
1704          -- DEBUG ERROR CODE --
1705          --
1706          ERROR_CODE:=413;
1707 
1708 
1709          EXCEPTION
1710          WHEN NO_DATA_FOUND THEN
1711               LOG_REPORT('set_Expls','CZ_COMBO_FEATURES : feature_id='||TO_CHAR(m.feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1712          WHEN OTHERS THEN
1716       END LOOP;
1713               LOG_REPORT('set_Expls','CZ_COMBO_FEATURES : feature_id='||TO_CHAR(m.feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1714          END;
1715 
1717 
1718       --
1719       -- DEBUG ERROR CODE --
1720       --
1721       ERROR_CODE:=414;
1722 
1723       FOR m IN(SELECT rule_id,feature_id,model_ref_expl_id FROM CZ_DES_CHART_FEATURES
1724                WHERE feature_id=i.ps_node_id AND deleted_flag=NO_FLAG)
1725       LOOP
1726          BEGIN
1727 
1728          --
1729          -- DEBUG ERROR CODE --
1730          --
1731          ERROR_CODE:=415;
1732 
1733          v_ref_id:=get_Next_ExplId(m.model_ref_expl_id,v_model_ref_id,p_mode);
1734 
1735          --
1736          -- DEBUG ERROR CODE --
1737          --
1738          ERROR_CODE:=416;
1739 
1740          UPDATE CZ_DES_CHART_FEATURES
1741          SET model_ref_expl_id=v_ref_id
1742          WHERE rule_id=m.rule_id AND feature_id=m.feature_id;
1743 
1744          --
1745          -- DEBUG ERROR CODE --
1746          --
1747          ERROR_CODE:=417;
1748 
1749          EXCEPTION
1750          WHEN NO_DATA_FOUND THEN
1751               LOG_REPORT('set_Expls','CZ_DES_CHART_FEATURES : feature_id='||TO_CHAR(m.feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1752          WHEN OTHERS THEN
1753               LOG_REPORT('set_Expls','CZ_DES_CHART_FEATURES : feature_id='||TO_CHAR(m.feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1754          END;
1755       END LOOP;
1756 
1757       FOR m IN(SELECT rule_id,primary_opt_id,secondary_opt_id,secondary_feature_id,
1758                secondary_feat_expl_id FROM CZ_DES_CHART_CELLS
1759                WHERE secondary_feature_id=i.ps_node_id AND deleted_flag=NO_FLAG)
1760       LOOP
1761          BEGIN
1762          v_ref_id:=get_Next_ExplId(m.secondary_feat_expl_id,v_model_ref_id,p_mode);
1763          UPDATE CZ_DES_CHART_CELLS
1764          SET secondary_feat_expl_id=v_ref_id
1765          WHERE rule_id=m.rule_id AND secondary_feature_id=m.secondary_feature_id AND
1766          primary_opt_id=m.primary_opt_id AND secondary_opt_id=m.secondary_opt_id;
1767 
1768          EXCEPTION
1769          WHEN NO_DATA_FOUND THEN
1770               LOG_REPORT('set_Expls','CZ_DES_CHART_CELLS : secondary_feature_id='||TO_CHAR(m.secondary_feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1771          WHEN OTHERS THEN
1772               LOG_REPORT('set_Expls','CZ_DES_CHART_CELLS : secondary_feature_id='||TO_CHAR(m.secondary_feature_id)||' rule_id='||TO_CHAR(m.rule_id));
1773          END;
1774 
1775       END LOOP;
1776 
1777     END IF;
1778 
1779     IF i.ps_node_type=OPTION_TYPE THEN
1780        FOR m IN(SELECT rule_id,option_id,model_ref_expl_id FROM CZ_DES_CHART_COLUMNS
1781                 WHERE option_id=i.ps_node_id)
1782        LOOP
1783           BEGIN
1784           v_ref_id:=get_Next_ExplId(m.model_ref_expl_id,v_model_ref_id,p_mode);
1785 
1786           UPDATE CZ_DES_CHART_COLUMNS
1787           SET model_ref_expl_id=v_ref_id
1788           WHERE rule_id=m.rule_id AND option_id=m.option_id;
1789 
1790           EXCEPTION
1791           WHEN NO_DATA_FOUND THEN
1792                LOG_REPORT('set_Expls','CZ_DES_CHART_COLUMNS : option_id='||TO_CHAR(m.option_id)||' rule_id='||TO_CHAR(m.rule_id));
1793           WHEN OTHERS THEN
1794                LOG_REPORT('set_Expls','CZ_DES_CHART_COLUMNS : option_id='||TO_CHAR(m.option_id)||' rule_id='||TO_CHAR(m.rule_id));
1795           END;
1796        END LOOP;
1797     END IF;
1798 
1799 END LOOP;
1800 
1801 EXCEPTION
1802     WHEN OTHERS THEN
1803          LOG_REPORT('set_Expls','ERROR CODE : '||TO_CHAR(ERROR_CODE)||' ERROR MESSAGE : '||SQLERRM);
1804 END set_Expls;
1805 
1806 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1807 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1808 
1809 PROCEDURE refresh_UI_Expl_Ids(p_ps_node_id   IN NUMBER,
1810                               p_component_id IN NUMBER,
1811                               p_model_id     IN NUMBER,
1812                               p_old_expl_id  IN NUMBER,
1813                               p_new_expl_id  IN NUMBER) IS
1814 
1815   t_persistent_node_id_tbl IntArray;
1816 
1817   PROCEDURE refresh_It_For_Single_UI(p_current_ui_def_id IN NUMBER) IS
1818   BEGIN
1819 
1820     FOR k IN t_persistent_node_id_tbl.First..t_persistent_node_id_tbl.Last
1821     LOOP
1822       UPDATE CZ_UI_PAGE_ELEMENTS
1823          SET model_ref_expl_id=p_new_expl_id
1824        WHERE ui_def_id=p_current_ui_def_id AND
1825              persistent_node_id=t_persistent_node_id_tbl(k) AND
1826              model_ref_expl_id=p_old_expl_id AND
1827              deleted_flag='0';
1828 
1829       UPDATE CZ_UI_PAGES
1830          SET pagebase_expl_node_id=p_new_expl_id
1831        WHERE ui_def_id=p_current_ui_def_id AND
1832              persistent_node_id=t_persistent_node_id_tbl(k) AND
1833              pagebase_expl_node_id=p_old_expl_id AND
1834              deleted_flag='0';
1835 
1836       UPDATE CZ_UI_PAGE_REFS
1837          SET target_expl_node_id=p_new_expl_id
1838        WHERE ui_def_id=p_current_ui_def_id AND
1839              target_persistent_node_id=t_persistent_node_id_tbl(k) AND
1840              target_expl_node_id=p_old_expl_id AND
1841              deleted_flag='0';
1842 
1843       UPDATE CZ_UI_PAGE_SETS
1847              pagebase_expl_node_id=p_old_expl_id AND
1844          SET pagebase_expl_node_id=p_new_expl_id
1845        WHERE ui_def_id=p_current_ui_def_id AND
1846              persistent_node_id=t_persistent_node_id_tbl(k) AND
1848              deleted_flag='0';
1849 
1850       UPDATE CZ_UI_ACTIONS
1851          SET target_expl_node_id=p_new_expl_id
1852        WHERE ui_def_id=p_current_ui_def_id AND
1853              target_persistent_node_id=t_persistent_node_id_tbl(k) AND
1854              target_expl_node_id=p_old_expl_id AND
1855              deleted_flag='0';
1856 
1857      END LOOP;
1858 
1859   END refresh_It_For_Single_UI;
1860 
1861   PROCEDURE refresh_It_For_Single_Model(p_current_model_id IN NUMBER) IS
1862   BEGIN
1863     FOR i IN (SELECT ui_def_id FROM CZ_UI_DEFS
1864               WHERE devl_project_id=p_current_model_id AND
1865                     ui_style='7' AND deleted_flag='0')
1866     LOOP
1867       refresh_It_For_Single_UI(i.ui_def_id);
1868     END LOOP;
1869   END refresh_It_For_Single_Model;
1870 
1871 BEGIN
1872 
1873   SELECT persistent_node_id
1874   BULK COLLECT INTO t_persistent_node_id_tbl
1875   FROM CZ_PS_NODES
1876   START WITH ps_node_id=p_ps_node_id AND deleted_flag='0' AND
1877    (reference_id IS NULL AND component_id=p_component_id)
1878   CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag='0' AND
1879   PRIOR deleted_flag='0' AND (reference_id IS NULL AND component_id=p_component_id);
1880 
1881   refresh_It_For_Single_Model(p_model_id);
1882 
1883   IF t_chain.COUNT>0 THEN
1884     FOR i IN t_chain.First..t_chain.Last
1885     LOOP
1886       refresh_It_For_Single_Model(t_chain(i).model_id);
1887     END LOOP;
1888   END IF;
1889 
1890 END refresh_UI_Expl_Ids;
1891 
1892 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1893 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1894 
1895 PROCEDURE delete_it
1896 (p_expl_id       IN  INTEGER,
1897  p_del_logically IN  VARCHAR2  -- DEFAULT YES_FLAG
1898 ) IS
1899 
1900 BEGIN
1901     IF p_del_logically=YES_FLAG THEN
1902 
1903        --
1904        -- DEBUG ERROR CODE --
1905        --
1906        ERROR_CODE:=500;
1907 
1908        UPDATE CZ_MODEL_REF_EXPLS SET deleted_flag=YES_FLAG WHERE model_ref_expl_id IN
1909        (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1910         START WITH model_ref_expl_id=p_expl_id AND deleted_flag=NO_FLAG
1911         CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG);
1912 
1913        --
1914        -- DEBUG ERROR CODE --
1915        --
1916        ERROR_CODE:=501;
1917 
1918     ELSE
1919        --
1920        -- DEBUG ERROR CODE --
1921        --
1922        ERROR_CODE:=502;
1923 
1924        DELETE FROM CZ_MODEL_REF_EXPLS WHERE model_ref_expl_id IN
1925        (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1926         START WITH model_ref_expl_id=p_expl_id AND deleted_flag=NO_FLAG
1927         CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG);
1928 
1929        --
1930        -- DEBUG ERROR CODE --
1931        --
1932        ERROR_CODE:=503;
1933 
1934     END IF;
1935 END;
1936 
1937 
1938 PROCEDURE delete_Node_
1939 (p_ps_node_id    IN  INTEGER,
1940  p_ps_node_type  IN  INTEGER,
1941  p_del_logically IN  VARCHAR2 -- DEFAULT '1'
1942 ) IS
1943 
1944     PROCEDURE delete_it_
1945     (p_expl_id       IN  INTEGER,
1946      p_del_logically IN  VARCHAR2, -- DEFAULT YES_FLAG
1947      p_ps_node_type  IN  INTEGER DEFAULT NULL) IS
1948 
1949     BEGIN
1950         IF p_del_logically=YES_FLAG THEN
1951            UPDATE CZ_MODEL_REF_EXPLS SET deleted_flag=YES_FLAG
1952            WHERE model_ref_expl_id=p_expl_id;
1953         ELSE
1954            DELETE FROM CZ_MODEL_REF_EXPLS WHERE model_ref_expl_id=p_expl_id;
1955         END IF;
1956 
1957         IF p_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) THEN
1958            IF p_del_logically=YES_FLAG THEN
1959               UPDATE CZ_MODEL_REF_EXPLS SET deleted_flag=YES_FLAG
1960               WHERE deleted_flag=NO_FLAG AND  model_ref_expl_id IN
1961               (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1962                START WITH model_ref_expl_id=p_expl_id AND deleted_flag=NO_FLAG
1963                CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND
1964               PRIOR deleted_flag=NO_FLAG);
1965            ELSE
1966               DELETE FROM CZ_MODEL_REF_EXPLS
1967               WHERE model_ref_expl_id IN
1968               (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1969                START WITH model_ref_expl_id=p_expl_id AND deleted_flag=NO_FLAG
1970                CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG);
1971            END IF;
1972         END IF;
1973     END delete_it_;
1974 
1975 BEGIN
1976     IF  p_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) THEN
1977         FOR i IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1978                   WHERE referring_node_id=p_ps_node_id  AND deleted_flag=NO_FLAG)
1979         LOOP
1980             delete_it_(i.model_ref_expl_id, YES_FLAG);
1981         END LOOP;
1982     ELSE
1983         FOR i IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
1987         END LOOP;
1984                   WHERE component_id=p_ps_node_id AND deleted_flag=NO_FLAG)
1985         LOOP
1986            delete_it_(i.model_ref_expl_id, YES_FLAG);
1988     END IF;
1989 END delete_Node_;
1990 
1991 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1992 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
1993 
1994 FUNCTION containsBOM(p_model_id IN INTEGER,p_instanciable OUT NOCOPY INTEGER) RETURN NUMBER IS
1995 
1996     v_exist_bom_nodes VARCHAR2(1);
1997     v_ret             NUMBER:=NULL_VALUE;
1998 
1999 BEGIN
2000     p_instanciable:=0;
2001 
2002     FOR i IN(SELECT model_ref_expl_id,referring_node_id,component_id,expl_node_type FROM CZ_MODEL_REF_EXPLS
2003              START WITH model_id=p_model_id AND parent_expl_node_id IS NULL AND deleted_flag=NO_FLAG
2004              CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND
2005                               deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG
2006                               AND ps_node_type IN(BOM_MODEL_TYPE,COMPONENT_TYPE,REFERENCE_TYPE)
2007                               AND PRIOR ps_node_type IN(BOM_MODEL_TYPE,COMPONENT_TYPE,REFERENCE_TYPE))
2008     LOOP
2009        BEGIN
2010            SELECT '1' INTO v_exist_bom_nodes
2011            FROM dual WHERE
2012            EXISTS(SELECT NULL FROM CZ_PS_NODES WHERE devl_project_id=i.component_id
2013            AND ps_node_type=436 AND deleted_flag=NO_FLAG);
2014 
2015            IF i.referring_node_id IS NOT NULL THEN
2016               v_ret:=i.referring_node_id;
2017            ELSE
2018               v_ret:=i.component_id;
2019            END IF;
2020            IF i.expl_node_type=MINMAX_EXPL_TYPE THEN
2021               p_instanciable:=1;
2022               RETURN v_ret;
2023            END IF;
2024        EXCEPTION
2025           WHEN OTHERS THEN
2026                NULL;
2027        END;
2028     END LOOP;
2029     RETURN v_ret;
2030 END containsBOM;
2031 
2032 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2033 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2034 
2035 PROCEDURE get_from_Node_Up
2036 (p_ps_node_id     IN     INTEGER,
2037  p_project_id     IN     INTEGER,
2038  p_out_ps_node_id IN OUT NOCOPY INTEGER,
2039  p_out_expl_id    IN OUT NOCOPY INTEGER,
2040  p_out_level      IN OUT NOCOPY INTEGER) IS
2041 
2042     v_expl_id    CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE:=NULL_VALUE;
2043     v_parent_id  CZ_PS_NODES.parent_id%TYPE:=NULL_VALUE;
2044 
2045 BEGIN
2046 
2047     p_out_ps_node_id:=NULL_VALUE;
2048     p_out_expl_id:=NULL_VALUE;
2049     p_out_level:=NULL_VALUE;
2050 
2051     BEGIN
2052         --
2053         -- DEBUG ERROR CODE --
2054         --
2055         ERROR_CODE:=1001;
2056 
2057         SELECT parent_id INTO v_parent_id
2058         FROM CZ_PS_NODES WHERE ps_node_id=p_ps_node_id;
2059 
2060         IF v_parent_id IS NULL THEN
2061            p_out_ps_node_id:=p_ps_node_id;
2062            --
2063            -- DEBUG ERROR CODE --
2064            --
2065            ERROR_CODE:=1002;
2066 
2067            SELECT model_ref_expl_id,node_depth
2068            INTO p_out_expl_id,p_out_level
2069            FROM CZ_MODEL_REF_EXPLS WHERE model_id=p_ps_node_id
2070            AND parent_expl_node_id IS NULL AND deleted_flag=NO_FLAG;
2071 
2072            RETURN;
2073         END IF;
2074     EXCEPTION
2075         WHEN OTHERS THEN
2076              LOG_REPORT('get_from_Node_Up','ERROR CODE : '||TO_CHAR(ERROR_CODE)||' ERROR MESSAGE : '||SQLERRM);
2077     END;
2078 
2079     FOR i IN (SELECT ps_node_id,parent_id,virtual_flag FROM CZ_PS_NODES
2080               WHERE ps_node_id=v_parent_id AND deleted_flag=NO_FLAG)
2081     LOOP
2082 
2083        IF i.virtual_flag=NO_FLAG OR i.parent_id IS NULL THEN
2084           p_out_ps_node_id:=i.ps_node_id;
2085 
2086           --
2087           -- DEBUG ERROR CODE --
2088           --
2089           ERROR_CODE:=700;
2090 
2091           SELECT model_ref_expl_id,node_depth
2092           INTO p_out_expl_id,p_out_level
2093           FROM CZ_MODEL_REF_EXPLS WHERE model_id=p_project_id
2094           AND component_id=i.ps_node_id AND deleted_flag=NO_FLAG;
2095 
2096           --
2097           -- DEBUG ERROR CODE --
2098           --
2099           ERROR_CODE:=708;
2100 
2101           EXIT;
2102        ELSE
2103           --
2104           -- DEBUG ERROR CODE --
2105           --
2106           ERROR_CODE:=709;
2107 
2108           get_from_Node_Up(i.ps_node_id,p_project_id,p_out_ps_node_id,p_out_expl_id,p_out_level);
2109 
2110           --
2111           -- DEBUG ERROR CODE --
2112           --
2113           ERROR_CODE:=710;
2114 
2115        END IF;
2116 END LOOP;
2117 
2118 EXCEPTION
2119     WHEN OTHERS THEN
2120          LOG_REPORT('get_from_Node_Up','ERROR CODE : '||TO_CHAR(ERROR_CODE)||' ERROR MESSAGE : '||SQLERRM);
2121 END;
2122 
2123 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2124 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2125 
2126 PROCEDURE update_Rules(p_ps_node_id IN INTEGER) IS
2127 
2128     v_old_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2132     FOR i IN t_old_expl_ids.FIRST..t_old_expl_ids.LAST
2129     v_new_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2130 
2131 BEGIN
2133     LOOP
2134        v_old_expl_id:=t_old_expl_ids(i);
2135        v_new_expl_id:=t_new_expl_ids(i);
2136 
2137        IF v_old_expl_id IS NOT NULL AND  v_new_expl_id IS NOT NULL THEN
2138           FOR n IN(SELECT ps_node_id FROM CZ_PS_NODES
2139                    START WITH ps_node_id=p_ps_node_id AND deleted_flag=NO_FLAG
2140                    CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
2141           LOOP
2142              UPDATE CZ_EXPRESSION_NODES SET model_ref_expl_id=v_new_expl_id
2143              WHERE model_ref_expl_id=v_old_expl_id AND deleted_flag=NO_FLAG
2144              AND ps_node_id=n.ps_node_id;
2145 
2146              UPDATE CZ_COMBO_FEATURES
2147              SET model_ref_expl_id=v_new_expl_id
2148              WHERE model_ref_expl_id=v_old_expl_id AND deleted_flag=NO_FLAG
2149              AND feature_id=n.ps_node_id;
2150 
2151              UPDATE CZ_DES_CHART_FEATURES
2152              SET model_ref_expl_id=v_new_expl_id
2153              WHERE model_ref_expl_id=v_old_expl_id AND deleted_flag=NO_FLAG
2154              AND feature_id=n.ps_node_id;
2155 
2156              UPDATE CZ_DES_CHART_CELLS
2157              SET secondary_feat_expl_id=v_new_expl_id
2158              WHERE secondary_feat_expl_id=v_old_expl_id AND deleted_flag=NO_FLAG
2159              AND (secondary_feature_id=n.ps_node_id OR
2160              primary_opt_id=n.ps_node_id OR secondary_opt_id=n.ps_node_id);
2161 
2162              UPDATE CZ_FUNC_COMP_SPECS
2163              SET model_ref_expl_id=v_new_expl_id
2164              WHERE model_ref_expl_id=v_old_expl_id AND deleted_flag=NO_FLAG AND
2165              component_id=n.ps_node_id;
2166 
2167              UPDATE CZ_DES_CHART_COLUMNS
2168              SET model_ref_expl_id=v_new_expl_id
2169              WHERE model_ref_expl_id=v_old_expl_id AND
2170              option_id=n.ps_node_id;
2171          END LOOP;
2172        END IF;
2173     END LOOP;
2174 END;
2175 
2176 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2177 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2178 
2179 PROCEDURE populate_tree
2180 (p_parent_ref_expl_id IN INTEGER, -- model_ref_expl_id of parent node
2181  p_model_ref_expl_id  IN INTEGER, -- model_ref_expl_id of current node
2182  p_ps_node_id         IN INTEGER, -- ps_node_id of current node
2183  p_ps_node_type       IN INTEGER, -- ps_node_type of current node
2184  p_expl_node_type     IN INTEGER, -- expl_node_type of current node
2185  p_model_id           IN INTEGER, -- model_id of current model
2186  p_child_array        IN IntArray -- array of direct childs ( in PS tree )
2187  ) IS
2188 
2189     t_child_nodes     IntArray;
2190     v_expl_id         CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2191     v_model_id        CZ_MODEL_REF_EXPLS.model_id%TYPE;
2192     v_ps_node_id      CZ_PS_NODES.ps_node_id%TYPE;
2193 
2194 BEGIN
2195     IF t_chain.COUNT=0 THEN
2196        RETURN;
2197     END IF;
2198     FOR i IN t_chain.FIRST..t_chain.LAST
2199     LOOP
2200        IF t_chain(i).parent_model_id=p_model_id THEN
2201           v_model_id:=t_chain(i).model_id;
2202 
2203           FOR l IN(SELECT model_ref_expl_id,node_depth
2204                    FROM CZ_MODEL_REF_EXPLS
2205                    WHERE model_id=t_chain(i).model_id AND
2206                    child_model_expl_id=p_parent_ref_expl_id
2207                    AND deleted_flag=NO_FLAG)
2208           LOOP
2209 
2210              --
2211              -- generate the next PK for CZ_MODEL_REF_EXPLS table
2212              --
2213              v_expl_id:=allocate_Expl_Id;
2214 
2215              --
2216              -- DEBUG ERROR CODE --
2217              --
2218              ERROR_CODE:=800;
2219 
2220              INSERT INTO CZ_MODEL_REF_EXPLS
2221                     (model_ref_expl_id,
2222                      parent_expl_node_id,
2223                      referring_node_id,
2224                      model_id,
2225                      component_id,
2226                      ps_node_type,
2227                      virtual_flag,
2228                      node_depth,
2229                      expl_node_type,
2230                      child_model_expl_id,
2231                      deleted_flag)
2232              VALUES
2233                     (v_expl_id,
2234                      l.model_ref_expl_id,
2235                      NULL,
2236                      v_model_id,
2237                      p_ps_node_id,
2238                      p_ps_node_type,
2239                      NO_FLAG,
2240                      l.node_depth+1,
2241                      p_expl_node_type,
2242                      p_model_ref_expl_id,
2243                      NO_FLAG);
2244 
2245              --
2246              -- DEBUG ERROR CODE --
2247              --
2248              ERROR_CODE:=801;
2249 
2250              --
2251              -- reset childs nodes
2252              --
2253              IF p_child_array.COUNT>0 THEN
2254              FOR t IN p_child_array.FIRST..p_child_array.LAST
2255                  LOOP
2256                     t_child_nodes.DELETE;
2257                     v_ps_node_id:=p_child_array(t);
2258 
2259                     --
2263 
2260                     -- DEBUG ERROR CODE --
2261                     --
2262                     ERROR_CODE:=802;
2264                     UPDATE CZ_MODEL_REF_EXPLS
2265                     SET parent_expl_node_id=v_expl_id
2266                     WHERE parent_expl_node_id=l.model_ref_expl_id
2267                     AND model_id=v_model_id AND
2268                     ((ps_node_type IN(PRODUCT_TYPE,COMPONENT_TYPE,BOM_MODEL_TYPE) AND component_id=v_ps_node_id)
2269                     OR (ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND referring_node_id=v_ps_node_id))
2270                     AND deleted_flag=NO_FLAG
2271                     RETURNING model_ref_expl_id BULK COLLECT INTO t_child_nodes ;
2272 
2273                     --
2274                     -- DEBUG ERROR CODE --
2275                     --
2276                     ERROR_CODE:=803;
2277 
2278                     IF t_child_nodes.COUNT>0 THEN
2279 
2280                        --
2281                        -- DEBUG ERROR CODE --
2282                        --
2283                        ERROR_CODE:=804;
2284 
2285                        FORALL h IN t_child_nodes.FIRST..t_child_nodes.LAST
2286                               UPDATE CZ_MODEL_REF_EXPLS
2287                               SET node_depth=node_depth+1
2288                               WHERE model_ref_expl_id IN
2289                               (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
2290                                START WITH model_ref_expl_id=t_child_nodes(h) AND deleted_flag=NO_FLAG
2291                                CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
2292                                AND PRIOR deleted_flag=NO_FLAG);
2293 
2294                               --
2295                               -- DEBUG ERROR CODE --
2296                               --
2297                               ERROR_CODE:=805;
2298 
2299                     END IF;
2300                  END LOOP;
2301              END IF;
2302 
2303              --
2304              -- DEBUG ERROR CODE --
2305              --
2306              ERROR_CODE:=806;
2307 
2308              populate_tree
2309              (l.model_ref_expl_id,v_expl_id,p_ps_node_id,
2310               p_ps_node_type,p_expl_node_type,v_model_id,p_child_array);
2311 
2312              --
2313              -- DEBUG ERROR CODE --
2314              --
2315              ERROR_CODE:=807;
2316 
2317           END LOOP;
2318 
2319        END IF;
2320     END LOOP;
2321 
2322     --
2323     -- DEBUG ERROR CODE --
2324     --
2325     ERROR_CODE:=809;
2326 
2327 END;
2328 
2329 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2330 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2331 
2332 PROCEDURE populate_expl_tree_internal(
2333  p_parent_model_ref_expl_id          IN NUMBER,
2334  p_model_ref_expl_id          IN NUMBER,
2335  p_model_id        IN NUMBER
2336 ) IS
2337 v_expl_id    NUMBER;
2338 v_model_id   NUMBER;
2339 BEGIN
2340 
2341  IF t_chain.COUNT=0 THEN
2342        RETURN;
2343     END IF;
2344     FOR i IN t_chain.FIRST..t_chain.LAST
2345     LOOP
2346        IF t_chain(i).parent_model_id=p_model_id THEN
2347           v_model_id:=t_chain(i).model_id;
2348 
2349           FOR l IN(SELECT model_ref_expl_id,node_depth
2350                    FROM CZ_MODEL_REF_EXPLS
2351                    WHERE model_id=t_chain(i).model_id AND
2352                    child_model_expl_id=p_parent_model_ref_expl_id
2353                    AND deleted_flag=NO_FLAG)
2354           LOOP
2355 
2356               FOR m IN(SELECT *
2357                    FROM CZ_MODEL_REF_EXPLS
2358                    WHERE model_ref_expl_id = p_model_ref_expl_id
2359                    AND deleted_flag=NO_FLAG)
2360               LOOP
2361              --
2362              -- generate the next PK for CZ_MODEL_REF_EXPLS table
2363              --
2364              v_expl_id:=allocate_Expl_Id;
2365 
2366                INSERT INTO CZ_MODEL_REF_EXPLS
2367                       (model_ref_expl_id,
2368                        parent_expl_node_id,
2369                        referring_node_id,
2370                        model_id,
2371                        component_id,
2372                        ps_node_type,
2373                        virtual_flag,
2374                        node_depth,
2375                        expl_node_type,
2376                        child_model_expl_id,
2377                        deleted_flag)
2378                VALUES
2379                       (v_expl_id,
2380                        l.model_ref_expl_id,
2381                        m.referring_node_id,
2382                        v_model_id,
2383                        m.component_id,
2384                        m.ps_node_type,
2385                        m.virtual_flag,
2386                        l.node_depth+1,
2387                        m.expl_node_type,
2388                        p_model_ref_expl_id,
2389                        NO_FLAG);
2390               END LOOP;
2391 
2392         populate_expl_tree_internal(l.model_ref_expl_id,v_expl_id,v_model_id);
2393         END LOOP;
2394         END IF;
2395     END LOOP;
2396 END populate_expl_tree_internal;
2400  p_model_id        IN NUMBER,
2397 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2398 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2399 PROCEDURE populate_parent_expl_tree_(
2401  p_model_ref_expl_id          IN NUMBER,
2402  p_parent_model_ref_expl_id          IN NUMBER
2403 ) IS
2404 BEGIN
2405 
2406       populate_expl_tree_internal(p_parent_model_ref_expl_id,p_model_ref_expl_id,p_model_id);
2407 
2408       FOR i IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS WHERE parent_expl_node_id = p_model_ref_expl_id AND deleted_flag  = NO_FLAG)
2409       LOOP
2410              populate_parent_expl_tree_(p_model_id => p_model_id, p_model_ref_expl_id => i.model_ref_expl_id, p_parent_model_ref_expl_id => p_model_ref_expl_id);
2411       END LOOP;
2412 
2413 
2414 END populate_parent_expl_tree_;
2415 
2416 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2417 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2418 --
2419 -- vsingava bug7831246 02th Mar '09
2420 -- procedure which populates the set of explosions p_ps_node_id of p_model_id
2421 -- to all model referencing it, up the entire model heirarchy. Usually called when a node
2422 -- in structure is being copied
2423 --
2424 PROCEDURE populate_parent_expl_tree(
2425  p_ps_node_id          IN  NUMBER,  -- ps_node_id of the copied node
2426  p_model_id        IN NUMBER
2427 ) IS
2428 
2429 
2430     l_model_id            NUMBER;
2431     l_component_id        NUMBER;
2432     l_reference_id        NUMBER;
2433     l_expl_id             NUMBER;
2434     l_parent_id           NUMBER;
2435     v_up_id               INTEGER;
2436     v_up_expl_id          INTEGER;
2437     v_up_level            INTEGER;
2438     l_virtual_flag        VARCHAR2(1);
2439     l_curr_node_depth      NUMBER;
2440     l_min_node_depth       NUMBER;
2441     l_ps_node_type         NUMBER;
2442 
2443 BEGIN
2444 
2445     -- get the info from the node to be copied
2446     SELECT devl_project_id,parent_id,reference_id,component_id,virtual_flag, ps_node_type
2447     INTO l_model_id,l_parent_id,l_reference_id,l_component_id,l_virtual_flag, l_ps_node_type
2448     FROM CZ_PS_NODES
2449     WHERE ps_node_id=p_ps_node_id AND deleted_flag = NO_FLAG;
2450 
2451         -- if not a reference node, get the model_refexpl_id record in model ref expls
2452     IF l_reference_id IS NULL THEN
2453        SELECT model_ref_expl_id, node_depth INTO l_expl_id, l_curr_node_depth
2454        FROM CZ_MODEL_REF_EXPLS
2455        WHERE model_id=l_model_id AND component_id=l_component_id AND
2456        child_model_expl_id IS NULL AND deleted_flag = NO_FLAG;
2457     ELSE
2458        SELECT MIN(node_depth) INTO l_min_node_depth
2459        FROM CZ_MODEL_REF_EXPLS
2460        WHERE model_id=l_model_id AND referring_node_id=p_ps_node_id
2461              AND deleted_flag = NO_FLAG;
2462 
2463        SELECT model_ref_expl_id, node_depth INTO l_expl_id, l_curr_node_depth
2464        FROM CZ_MODEL_REF_EXPLS
2465        WHERE model_id=l_model_id AND referring_node_id=p_ps_node_id AND
2466        node_depth=l_min_node_depth AND deleted_flag = NO_FLAG;
2467     END IF;
2468 
2469      t_chain.DELETE;t_projectCache.DELETE;
2470      populate_chain(p_model_id);
2471 
2472        --
2473        -- find nearest non-virtual node above the target node --
2474        --
2475        get_Node_Up(p_ps_node_id,p_model_id,v_up_id,
2476                    v_up_expl_id,v_up_level);
2477 
2478        IF v_up_id = p_ps_node_id THEN
2479           get_Node_Up(l_parent_id,p_model_id,v_up_id,
2480                    v_up_expl_id,v_up_level);
2481        END IF;
2482 
2483     IF (l_virtual_flag='1' OR l_virtual_flag IS NULL) AND l_parent_id IS NOT NULL THEN
2484 
2485        FOR i IN(SELECT model_ref_expl_id, node_depth FROM CZ_MODEL_REF_EXPLS
2486                 WHERE parent_expl_node_id=v_up_expl_id AND
2487                 deleted_flag = NO_FLAG AND
2488                 (referring_node_id IS NULL AND component_id IN
2489                  (SELECT ps_node_id FROM CZ_PS_NODES
2490                   START WITH ps_node_id=p_ps_node_id
2491                   CONNECT BY PRIOR ps_node_id=parent_id AND
2492                   deleted_flag = NO_FLAG AND PRIOR deleted_flag = NO_FLAG)) OR
2493                 (referring_node_id IS NOT NULL AND referring_node_id IN
2494                  (SELECT ps_node_id FROM CZ_PS_NODES
2495                   START WITH ps_node_id=p_ps_node_id
2496                   CONNECT BY PRIOR ps_node_id=parent_id AND
2497                   deleted_flag = NO_FLAG AND PRIOR deleted_flag = NO_FLAG)))
2498        LOOP
2499 	populate_parent_expl_tree_(p_model_id    => p_model_id,
2500 	                  p_model_ref_expl_id    => i.model_ref_expl_id,
2501 	                  p_parent_model_ref_expl_id   => v_up_expl_id);
2502        END LOOP;
2503      ELSIF l_virtual_flag='0' -- OR l_parent_id IS NULL
2504                             THEN
2505         populate_parent_expl_tree_(p_model_id    => p_model_id,
2506 	                  p_model_ref_expl_id    => l_expl_id,
2507 	                  p_parent_model_ref_expl_id   => v_up_expl_id);
2508      END IF;
2509 
2510 
2511 END populate_parent_expl_tree;
2512 
2513 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2514 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2515 
2516 PROCEDURE update_child_nodes(p_model_id IN NUMBER) IS
2520   TYPE IntArrayIndexVC2 IS TABLE   OF NUMBER INDEX BY VARCHAR2(15);
2517 
2518   TYPE t_varchar2_tbl_type IS TABLE OF VARCHAR2(32000) INDEX BY BINARY_INTEGER;
2519   TYPE t_indchar2_tbl_type IS TABLE OF NUMBER INDEX BY VARCHAR2(32000);
2521   l_model_updated_tbl IntArrayIndexVC2;
2522 
2523   l_num_updated_records  NUMBER := 0;
2524 
2525   PROCEDURE update_layer
2526   (
2527   p_current_model_id IN NUMBER
2528   ) IS
2529 
2530      l_paths_tbl          t_varchar2_tbl_type;
2531      l_new_paths_tbl      t_varchar2_tbl_type;
2532      l_expl_path_tbl      t_indchar2_tbl_type;
2533      l_new_expl_path_tbl  t_indchar2_tbl_type;
2534      t_model_ref_expl_tbl IntArray;
2535      t_component_tbl      IntArray;
2536 
2537      l_next_model_level_tbl IntArray;
2538      l_child_expl_id        NUMBER;
2539      l_path1                VARCHAR2(32000);
2540      l_path2                VARCHAR2(32000);
2541      l_loop_char_id         VARCHAR2(32000);
2542      l_ref_expl_id          NUMBER;
2543      l_counter              NUMBER;
2544      l_loop_ind             NUMBER;
2545 
2546   BEGIN
2547 
2548     IF l_model_updated_tbl.EXISTS(p_current_model_id) THEN
2549       RETURN;
2550     ELSE
2551       l_model_updated_tbl(p_current_model_id) := p_current_model_id;
2552     END IF;
2553 
2554     FOR i IN(SELECT model_ref_expl_id, referring_node_id, component_id
2555                FROM CZ_MODEL_REF_EXPLS a
2556               WHERE a.model_id=p_current_model_id AND a.deleted_flag=NO_FLAG)
2557     LOOP
2558 
2559       IF i.referring_node_id IS NULL THEN
2560         l_paths_tbl(i.model_ref_expl_id) := TO_CHAR(i.component_id);
2561       ELSE
2562         l_paths_tbl(i.model_ref_expl_id) := TO_CHAR(i.referring_node_id);
2563       END IF;
2564 
2565       FOR m IN(SELECT model_ref_expl_id,component_id,referring_node_id
2566                  FROM CZ_MODEL_REF_EXPLS
2567                  WHERE model_ref_expl_id<>i.model_ref_expl_id
2568                 START WITH model_ref_expl_id=i.model_ref_expl_id
2569                 CONNECT BY PRIOR parent_expl_node_id=model_ref_expl_id AND deleted_flag=NO_FLAG)
2570       LOOP
2571 
2572         IF m.referring_node_id IS NULL THEN
2573           l_paths_tbl(i.model_ref_expl_id) := l_paths_tbl(i.model_ref_expl_id) || ':' ||TO_CHAR(m.component_id);
2574         ELSE
2575           l_paths_tbl(i.model_ref_expl_id) := l_paths_tbl(i.model_ref_expl_id) || ':' ||TO_CHAR(m.referring_node_id);
2576         END IF;
2577 
2578       END LOOP;
2579 
2580     END LOOP;
2581 
2582     l_loop_ind := l_paths_tbl.FIRST;
2583     LOOP
2584       IF l_loop_ind IS NULL THEN
2585         EXIT;
2586       END IF;
2587 
2588       l_expl_path_tbl(l_paths_tbl(l_loop_ind)) := l_loop_ind;
2589 
2590       l_loop_ind := l_paths_tbl.NEXT(l_loop_ind);
2591     END LOOP;
2592 
2593     FOR n IN (SELECT * FROM CZ_PS_NODES a
2594                WHERE reference_id=p_current_model_id AND
2595                      ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND deleted_flag=NO_FLAG AND
2596                      devl_project_id IN(SELECT object_id FROM CZ_RP_ENTRIES
2597                                          WHERE object_id=a.devl_project_id AND object_type='PRJ' AND deleted_flag=NO_FLAG)
2598               )
2599     LOOP
2600 
2601       l_new_expl_path_tbl.DELETE;
2602 
2603       SELECT model_ref_expl_id INTO l_ref_expl_id FROM CZ_MODEL_REF_EXPLS
2604        WHERE model_id=n.devl_project_id AND referring_node_id=n.ps_node_id;
2605 
2606       l_new_paths_tbl.DELETE;
2607 
2608       FOR k IN(SELECT model_ref_expl_id,component_id,
2609                       referring_node_id,ps_node_type,child_model_expl_id,model_id
2610                  FROM CZ_MODEL_REF_EXPLS
2611                START WITH model_ref_expl_id=l_ref_expl_id AND deleted_flag=NO_FLAG
2612                CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND
2613                           deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
2614       LOOP
2615 
2616         IF k.referring_node_id IS NULL THEN
2617           l_new_paths_tbl(k.model_ref_expl_id) := TO_CHAR(k.component_id);
2618         ELSE
2619             l_new_paths_tbl(k.model_ref_expl_id) := TO_CHAR(k.referring_node_id);
2620 
2621              IF k.model_ref_expl_id=l_ref_expl_id THEN
2622                l_new_paths_tbl(k.model_ref_expl_id) := TO_CHAR(k.component_id);
2623              END IF;
2624 
2625          END IF;
2626 
2627         IF k.model_ref_expl_id <> l_ref_expl_id THEN
2628 
2629           FOR kk IN(SELECT model_ref_expl_id,component_id,referring_node_id
2630                    FROM CZ_MODEL_REF_EXPLS
2631                    WHERE model_ref_expl_id<>k.model_ref_expl_id
2632                    START WITH model_ref_expl_id=k.model_ref_expl_id
2633                    CONNECT BY PRIOR parent_expl_node_id=model_ref_expl_id AND deleted_flag=NO_FLAG)
2634           LOOP
2635 
2636             IF kk.referring_node_id IS NULL THEN
2637               l_new_paths_tbl(k.model_ref_expl_id) := l_new_paths_tbl(k.model_ref_expl_id) || ':' ||TO_CHAR(kk.component_id);
2638 
2639             ELSE
2640 
2641              IF kk.model_ref_expl_id=l_ref_expl_id THEN
2642                l_new_paths_tbl(k.model_ref_expl_id) := l_new_paths_tbl(k.model_ref_expl_id) || ':' || TO_CHAR(kk.component_id);
2643                EXIT;
2644              ELSE
2648             END IF;
2645                l_new_paths_tbl(k.model_ref_expl_id) := l_new_paths_tbl(k.model_ref_expl_id) || ':' ||TO_CHAR(kk.referring_node_id);
2646              END IF;
2647 
2649 
2650           END LOOP;
2651 
2652         END IF;
2653 
2654       END LOOP;
2655 
2656       l_loop_ind := l_new_paths_tbl.FIRST;
2657       LOOP
2658         IF l_loop_ind IS NULL THEN
2659           EXIT;
2660         END IF;
2661 
2662         IF l_expl_path_tbl.EXISTS(l_new_paths_tbl(l_loop_ind)) THEN
2663 
2664           SELECT child_model_expl_id INTO l_child_expl_id FROM CZ_MODEL_REF_EXPLS
2665            WHERE model_ref_expl_id=l_loop_ind;
2666 
2667           IF l_expl_path_tbl(l_new_paths_tbl(l_loop_ind)) <> l_child_expl_id THEN
2668 
2669             l_num_updated_records := l_num_updated_records + 1;
2670 
2671             UPDATE CZ_MODEL_REF_EXPLS
2672                SET child_model_expl_id=l_expl_path_tbl(l_new_paths_tbl(l_loop_ind))
2673              WHERE model_ref_expl_id=l_loop_ind;
2674 
2675           END IF;
2676 
2677         END IF;
2678 
2679         l_loop_ind := l_new_paths_tbl.NEXT(l_loop_ind);
2680       END LOOP;
2681 
2682       l_next_model_level_tbl(l_next_model_level_tbl.COUNT+1) := n.devl_project_id;
2683 
2684     END LOOP;
2685 
2686     IF l_next_model_level_tbl.COUNT > 0 THEN
2687 
2688       FOR v IN l_next_model_level_tbl.FIRST..l_next_model_level_tbl.LAST
2689       LOOP
2690         update_layer(l_next_model_level_tbl(v));
2691       END LOOP;
2692 
2693     END IF;
2694 
2695 
2696   END update_layer;
2697 
2698 BEGIN
2699 
2700   --
2701   -- start with those explosion tree branches which do not have references/connectors to other models
2702   --
2703   FOR i IN(SELECT DISTINCT component_id FROM CZ_MODEL_REF_EXPLS a
2704             WHERE model_id=p_model_id AND deleted_flag=NO_FLAG AND
2705                   ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND NOT EXISTS
2706                   (SELECT NULL FROM CZ_MODEL_REF_EXPLS
2707                    WHERE model_id=a.component_id AND ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND deleted_flag=NO_FLAG))
2708   LOOP
2709     update_layer(i.component_id);
2710   END LOOP;
2711 
2712 END update_child_nodes;
2713 
2714 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2715 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2716 
2717 PROCEDURE delete_duplicates(p_model_id IN NUMBER) IS
2718 
2719 BEGIN
2720     FOR i IN (SELECT DISTINCT model_id FROM CZ_MODEL_REF_EXPLS
2721               WHERE component_id=p_model_id AND referring_node_id IS NOT NULL
2722                     AND deleted_flag=NO_FLAG)
2723     LOOP
2724        UPDATE CZ_MODEL_REF_EXPLS a
2725        SET deleted_flag = '1'
2726        WHERE model_id=i.model_id AND deleted_flag=NO_FLAG
2727              AND referring_node_id IS NOT NULL
2728              AND parent_expl_node_id IN
2729         (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
2730          WHERE model_id=i.model_id AND deleted_flag=NO_FLAG
2731               AND referring_node_id=a.referring_node_id);
2732     END LOOP;
2733 
2734     FOR i IN (SELECT DISTINCT component_id FROM CZ_MODEL_REF_EXPLS
2735               WHERE model_id=p_model_id AND referring_node_id IS NOT NULL
2736                     AND deleted_flag=NO_FLAG)
2737     LOOP
2738        UPDATE CZ_MODEL_REF_EXPLS a
2739        SET deleted_flag = '1'
2740        WHERE model_id=i.component_id AND deleted_flag=NO_FLAG
2741              AND referring_node_id IS NOT NULL
2742              AND parent_expl_node_id IN
2743         (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
2744          WHERE model_id=i.component_id AND deleted_flag=NO_FLAG
2745               AND referring_node_id=a.referring_node_id);
2746     END LOOP;
2747 END delete_duplicates;
2748 
2749 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2750 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2751 
2752 PROCEDURE populate_COMPONENT_ID(p_model_id IN NUMBER) IS
2753 
2754     v_ps_node_id   CZ_PS_NODES.ps_node_id%TYPE;
2755     v_parent_id    CZ_PS_NODES.parent_id%TYPE;
2756     v_ps_id        CZ_PS_NODES.ps_node_id%TYPE;
2757 
2758 BEGIN
2759     FND_MSG_PUB.initialize;
2760 
2761     FOR i IN(SELECT ps_node_id,parent_id,ps_node_type,virtual_flag,devl_project_id,reference_id FROM CZ_PS_NODES
2762              START WITH devl_project_id=p_model_id AND parent_id IS NULL and deleted_flag='0'
2763              CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag='0' AND PRIOR deleted_flag='0')
2764     LOOP
2765        IF i.ps_node_type IN (REFERENCE_TYPE,CONNECTOR_TYPE) THEN
2766           UPDATE CZ_PS_NODES SET component_id=i.reference_id
2767           WHERE ps_node_id=i.ps_node_id AND component_id<>i.reference_id;
2768           GOTO CONTINUE_LOOP;
2769        END IF;
2770        IF  i.parent_id IS NULL OR i.virtual_flag='0' THEN
2771           UPDATE CZ_PS_NODES SET component_id=i.ps_node_id
2772           WHERE ps_node_id=i.ps_node_id AND component_id<>i.ps_node_id;
2773           GOTO CONTINUE_LOOP;
2774        END IF;
2775        IF NVL(i.virtual_flag,'1')='1' AND i.ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND i.parent_id IS NOT NULL THEN
2779           (virtual_flag='0' OR parent_id IS NULL) AND deleted_flag='0')
2776           SELECT ps_node_id,parent_id INTO v_ps_node_id,v_parent_id FROM CZ_PS_NODES a
2777           WHERE devl_project_id=i.devl_project_id AND
2778           EXISTS(SELECT NULL FROM CZ_PS_NODES WHERE ps_node_id=a.parent_id AND
2780           START WITH ps_node_id=i.ps_node_id
2781           CONNECT BY PRIOR parent_id=ps_node_id AND deleted_flag='0' AND NVL(virtual_flag,'1')='1';
2782 
2783           IF v_parent_id IS NULL THEN
2784              v_ps_id:=v_ps_node_id;
2785           ELSE
2786              v_ps_id:=v_parent_id;
2787           END IF;
2788 
2789           UPDATE CZ_PS_NODES SET component_id=v_ps_id
2790           WHERE ps_node_id=i.ps_node_id AND component_id<>v_ps_id;
2791        END IF;
2792 
2793        <<CONTINUE_LOOP>>
2794          NULL;
2795     END LOOP;
2796 END populate_COMPONENT_ID;
2797 
2798 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2799 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
2800 
2801 PROCEDURE check_Node
2802 (p_ps_node_id       IN  INTEGER,
2803  p_model_id         IN  INTEGER,
2804  p_maximum          IN  INTEGER,
2805  p_minimum          IN  INTEGER,
2806  p_reference_id     IN  INTEGER,
2807  p_out_err          OUT NOCOPY INTEGER,
2808  p_out_virtual_flag OUT NOCOPY INTEGER,
2809  p_consequent_flag  IN  VARCHAR2 , -- DEFAULT NO_FLAG,
2810  p_expr_node_id     IN  INTEGER  DEFAULT NULL,
2811  p_ps_type          IN  INTEGER  DEFAULT NULL,
2812  p_expr_subtype     IN  INTEGER  DEFAULT NULL,
2813  p_skip_upd_nod_dep IN  VARCHAR2 DEFAULT NO_FLAG
2814 ) IS
2815 
2816     t_child_nodes         IntArray;
2817     t_childs              IntArray;
2818 
2819     v_expl_id             CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2820     v_model_ref_expl_id   CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2821     v_expl_node_type      CZ_MODEL_REF_EXPLS.expl_node_type%TYPE;
2822     v_del_ref_id          CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2823     v_up_expl_id          CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
2824     v_up_level            CZ_MODEL_REF_EXPLS.node_depth%TYPE;
2825     v_curr_expl_node_type CZ_MODEL_REF_EXPLS.expl_node_type%TYPE;
2826 
2827     v_up_id               CZ_PS_NODES.ps_node_id%TYPE;
2828     v_virtual_flag        CZ_PS_NODES.virtual_flag%TYPE;
2829     v_ps_node_type        CZ_PS_NODES.ps_node_type%TYPE;
2830     v_ps_node_id          CZ_PS_NODES.ps_node_id%TYPE;
2831     v_minimum             CZ_PS_NODES.MINIMUM%TYPE;
2832     v_maximum             CZ_PS_NODES.MAXIMUM%TYPE;
2833     v_instantiable_flag   CZ_PS_NODES.instantiable_flag%TYPE;
2834     v_parent_expl_node_id NUMBER;
2835     v_component_id        NUMBER;
2836     v_comp_expl_id        NUMBER;
2837     v_ndebug              NUMBER;
2838     v_node_Exist          BOOLEAN:=FALSE;
2839 
2840 BEGIN
2841 
2842   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2843     v_ndebug := 0;
2844     cz_utils.log_report('CZ_REFS', 'check_Node', v_ndebug,
2845       'Starting CZ_REFS.check_Node for model node with ps_node_id='||TO_CHAR(p_ps_node_id)||
2846       ' current time : '||TO_CHAR(SYSDATE,'DD-MM-YYYY HH24:MI:SS'),
2847       fnd_log.LEVEL_PROCEDURE);
2848     cz_utils.log_report('CZ_REFS', 'check_Node', v_ndebug,
2849       'Parameters : '||
2850       'p_ps_node_id = '||TO_CHAR(p_ps_node_id)||
2851       'p_model_id = '||TO_CHAR(p_model_id)||
2852       'p_maximum = '||TO_CHAR(p_maximum)||
2853       'p_minimum = '||TO_CHAR(p_minimum)||
2854       'p_reference_id = '||TO_CHAR(p_reference_id)||
2855       'p_consequent_flag = '||p_consequent_flag||
2856       'p_expr_node_id = '||TO_CHAR(p_expr_node_id)||
2857       'p_ps_type = '||TO_CHAR(p_ps_type)||
2858       'p_ps_type = '||TO_CHAR(p_ps_type)
2859       ,fnd_log.LEVEL_PROCEDURE);
2860   END IF;
2861 
2862 BEGIN
2863      Initialize;
2864      p_out_err:=0;
2865      p_out_virtual_flag:=1;
2866 
2867      SELECT instantiable_flag,ps_node_type,minimum,maximum,component_id
2868        INTO v_instantiable_flag,v_ps_node_type,v_minimum,v_maximum,v_component_id
2869        FROM CZ_PS_NODES
2870       WHERE ps_node_id=p_ps_node_id;
2871 
2872      -- Developer passes max/min
2873      v_minimum := p_minimum;
2874      v_maximum := p_maximum;
2875 
2876      IF NOT(v_minimum=1 AND v_maximum=1) AND v_ps_node_type<>BOM_MODEL_TYPE
2877         AND v_instantiable_flag=MANDATORY_EXPL_TYPE THEN
2878         p_out_err:=m_RUN_ID;
2879         LOG_REPORT('check_Node','CZ_PS_NODES.instantiable_flag=2 violates min/max=1/1.');
2880         RETURN;
2881      END IF;
2882 
2883 
2884      IF v_instantiable_flag NOT IN(OPTIONAL_EXPL_TYPE,MANDATORY_EXPL_TYPE,
2885         CONNECTOR_EXPL_TYPE,MINMAX_EXPL_TYPE) THEN
2886 
2887         IF v_minimum=1 AND v_maximum=1 AND
2888           v_ps_node_type<>CONNECTOR_TYPE THEN
2889            v_instantiable_flag:=MANDATORY_EXPL_TYPE;
2890         END IF;
2891 
2892         IF v_minimum=0 AND v_maximum=1 AND
2893           v_ps_node_type<>CONNECTOR_TYPE THEN
2894            v_instantiable_flag:=OPTIONAL_EXPL_TYPE;
2895         END IF;
2896 
2897         IF NOT(v_minimum=1 AND v_maximum=1) AND
2898           v_ps_node_type<>CONNECTOR_TYPE THEN
2899            v_instantiable_flag:=MINMAX_EXPL_TYPE;
2900         END IF;
2901 
2902         IF v_ps_node_type=CONNECTOR_TYPE THEN
2906         UPDATE CZ_PS_NODES
2903            v_instantiable_flag:=CONNECTOR_EXPL_TYPE;
2904         END IF;
2905 
2907            SET minimum=p_minimum,
2908                maximum=p_maximum,
2909                instantiable_flag=v_instantiable_flag
2910          WHERE ps_node_id=p_ps_node_id;
2911 
2912      END IF;
2913 
2914      --
2915      -- DEBUG ERROR CODE --
2916      --
2917      ERROR_CODE:=901;
2918 
2919      v_expl_node_type := v_instantiable_flag;
2920 
2921      --
2922      -- DEBUG ERROR CODE --
2923      --
2924      ERROR_CODE:=902;
2925 
2926      --
2927      -- do check :
2928      -- does Node with ps_node_id=p_ps_node_id exist ? --
2929      --
2930      BEGIN
2931          v_node_Exist:=FALSE;
2932          SELECT model_ref_expl_id,parent_expl_node_id,ps_node_type,virtual_flag,expl_node_type
2933          INTO  v_model_ref_expl_id,v_parent_expl_node_id,v_ps_node_type,v_virtual_flag,v_curr_expl_node_type
2934          FROM CZ_MODEL_REF_EXPLS
2935          WHERE ((component_id=p_ps_node_id AND referring_node_id IS NULL) OR
2936                referring_node_id=p_ps_node_id)
2937          AND model_id=p_model_id AND deleted_flag=NO_FLAG AND ROWNUM<2;
2938          v_node_Exist:=TRUE;
2939      EXCEPTION
2940          WHEN NO_DATA_FOUND THEN
2941               NULL;
2942      END;
2943 
2944      --
2945      -- this is "Root Node"  case --
2946      --
2947      IF p_ps_node_id=p_model_id THEN
2948         IF v_node_Exist=FALSE THEN
2949            --
2950            -- DEBUG ERROR CODE --
2951            --
2952            ERROR_CODE:=903;
2953 
2954            --
2955            -- add root node
2956            --
2957            add_root_Model_record(p_ps_node_id,v_ps_node_type);
2958 
2959            UPDATE CZ_PS_NODES
2960            SET component_id=p_model_id,
2961                minimum=p_minimum,
2962                maximum=p_maximum,
2963                instantiable_flag=MANDATORY_EXPL_TYPE
2964            WHERE devl_project_id=p_model_id AND
2965                  parent_id is null AND deleted_flag='0';
2966 
2967            --
2968            -- DEBUG ERROR CODE --
2969            --
2970            ERROR_CODE:=904;
2971 
2972         END IF;
2973         GOTO FINAL_SECTION;
2974      END IF;
2975 
2976      --
2977      -- case when we have Min=1 and Max=1 for not Connectors/References nodes
2978      -- and this node with ps_node_id=p_ps_node_id does not
2979      -- exist in CZ_MODEL_REF_EXPLS table
2980      -- and no Numeric Rules which contribute to  Min/Max are specified
2981      -- in this case we just need to exit from program
2982      --
2983      IF  (v_expl_node_type=MANDATORY_EXPL_TYPE) AND (v_ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE))
2984          AND v_node_Exist=FALSE THEN
2985           GOTO FINAL_SECTION;
2986      END IF;
2987 
2988      IF v_expl_node_type IN(OPTIONAL_EXPL_TYPE,MINMAX_EXPL_TYPE) THEN
2989         p_out_virtual_flag:=NO_FLAG;
2990      ELSE
2991         p_out_virtual_flag:=YES_FLAG;
2992      END IF;
2993 
2994      UPDATE CZ_PS_NODES
2995         SET virtual_flag=p_out_virtual_flag,
2996             minimum=p_minimum,
2997             maximum=p_maximum
2998      WHERE ps_node_id=p_ps_node_id;
2999 
3000      IF SQL%ROWCOUNT>0 THEN
3001 
3002         IF (v_ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE)) THEN
3003            UPDATE CZ_MODEL_REF_EXPLS
3004            SET virtual_flag=p_out_virtual_flag,
3005                expl_node_type=v_expl_node_type
3006            WHERE component_id=p_ps_node_id AND deleted_flag=NO_FLAG;
3007         ELSE
3008            UPDATE CZ_MODEL_REF_EXPLS
3009            SET virtual_flag=p_out_virtual_flag,
3010                expl_node_type=v_expl_node_type
3011            WHERE referring_node_id=p_ps_node_id AND deleted_flag=NO_FLAG;
3012         END IF;
3013 
3014      END IF;
3015 
3016      IF v_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND v_node_Exist=FALSE THEN
3017         --
3018         -- find "Models Chain" that contains
3019         -- the given model ( CZ_DEVL_PROJECTS.devl_project_id=p_model_id )
3020         -- t_chain array will store Model Ids of this chain
3021         --
3022         t_chain.DELETE;t_projectCache.DELETE;
3023         populate_chain(p_model_id);
3024 
3025         add_Reference(p_ps_node_id,p_reference_id,p_model_id,
3026                       p_out_virtual_flag,p_out_err,v_ps_node_type,v_expl_node_type);
3027 
3028         GOTO FINAL_SECTION;
3029      END IF;
3030 
3031      --
3032      -- this means UPDATE from (n,m) to (1,1)
3033      --
3034      IF p_out_virtual_flag=YES_FLAG  AND
3035         (v_ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE)) AND v_node_Exist THEN
3036 
3037        FOR x IN (SELECT model_ref_expl_id,parent_expl_node_id,model_id FROM CZ_MODEL_REF_EXPLS a
3038                  WHERE component_id=p_ps_node_id AND deleted_flag=NO_FLAG AND
3039                  model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3040                  WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG))
3041        LOOP
3042           BEGIN
3043               IF x.model_id=p_model_id THEN
3044                  v_del_ref_id:=x.model_ref_expl_id;
3045               END IF;
3046 
3047               --
3048               -- DEBUG ERROR CODE --
3049               --
3053                         START WITH model_ref_expl_id=x.model_ref_expl_id  AND deleted_flag=NO_FLAG
3050               ERROR_CODE:=905;
3051 
3052               FOR y IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3054                         CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND
3055                         PRIOR deleted_flag=NO_FLAG)
3056               LOOP
3057                  UPDATE CZ_MODEL_REF_EXPLS SET node_depth=node_depth-1
3058                  WHERE model_ref_expl_id=y.model_ref_expl_id;
3059               END LOOP;
3060 
3061               --
3062               -- DEBUG ERROR CODE --
3063               --
3064               ERROR_CODE:=906;
3065 
3066               UPDATE CZ_MODEL_REF_EXPLS SET parent_expl_node_id=x.parent_expl_node_id
3067               WHERE parent_expl_node_id=x.model_ref_expl_id
3068               AND model_id=x.model_id AND deleted_flag=NO_FLAG;
3069 
3070           EXCEPTION
3071               WHEN NO_DATA_FOUND THEN
3072                    NULL;
3073           END;
3074         END LOOP;
3075 
3076         --
3077         -- DEBUG ERROR CODE --
3078         --
3079         ERROR_CODE:=907;
3080 
3081         delete_Node_(p_ps_node_id,COMPONENT_TYPE, '1');
3082 
3083         --
3084         -- DEBUG ERROR CODE --
3085         --
3086         ERROR_CODE:=908;
3087 
3088         set_Expls(p_model_id,p_ps_node_id,MINUS_MODE,v_del_ref_id);
3089 
3090         --
3091         -- DEBUG ERROR CODE --
3092         --
3093         ERROR_CODE:=909;
3094 
3095         refresh_UI_Expl_Ids(p_ps_node_id   => p_ps_node_id,
3096                             p_component_id => v_component_id,
3097                             p_model_id     => p_model_id,
3098                             p_old_expl_id  => v_model_ref_expl_id,
3099                             p_new_expl_id  => v_parent_expl_node_id);
3100 
3101         GOTO FINAL_SECTION;
3102     END IF;
3103 
3104     --
3105     -- this means UPDATE from (1,1) to (n,m)
3106     --
3107     IF p_out_virtual_flag=NO_FLAG AND (v_ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE))
3108        AND v_node_Exist=FALSE THEN
3109 
3110        --
3111        -- find nearest non-virtual node above the target node --
3112        --
3113        get_Node_Up(p_ps_node_id,p_model_id,v_up_id,
3114                    v_up_expl_id,v_up_level);
3115 
3116        v_expl_id:=allocate_Expl_Id;
3117        --
3118        -- DEBUG ERROR CODE --
3119        --
3120        ERROR_CODE:=910;
3121 
3122        INSERT INTO CZ_MODEL_REF_EXPLS
3123           (model_ref_expl_id,
3124            parent_expl_node_id,
3125            referring_node_id,
3126            model_id,
3127            component_id,
3128            ps_node_type,
3129            virtual_flag,
3130            node_depth,
3131            expl_node_type,
3132            deleted_flag)
3133         VALUES
3134           (v_expl_id,
3135            v_up_expl_id,
3136            NULL,
3137            p_model_id,
3138            p_ps_node_id,
3139            v_ps_node_type,
3140            p_out_virtual_flag,
3141            v_up_level+1,
3142            v_expl_node_type,
3143            NO_FLAG);
3144 
3145         --
3146         -- DEBUG ERROR CODE --
3147         --
3148         ERROR_CODE:=911;
3149 
3150         --
3151         -- reset childs nodes
3152         --
3153         t_childs.DELETE;
3154 
3155         SELECT ps_node_id BULK COLLECT INTO t_childs FROM CZ_PS_NODES
3156         WHERE devl_project_id=p_model_id AND ps_node_id<>p_ps_node_id AND
3157         (
3158          (ps_node_type in(COMPONENT_TYPE,PRODUCT_TYPE) AND ps_node_id IN  ---- fix for bug #3161931
3159            (SELECT component_id FROM CZ_MODEL_REF_EXPLS
3160             WHERE model_id=p_model_id AND deleted_flag=NO_FLAG AND parent_expl_node_id=v_up_expl_id AND
3161             component_id IN(SELECT ps_node_id FROM CZ_PS_NODES
3162                             START WITH ps_node_id=p_ps_node_id AND deleted_flag=NO_FLAG
3163                             CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
3164            )
3165          )
3166         OR
3167         (ps_node_type in(REFERENCE_TYPE,CONNECTOR_TYPE) AND ps_node_id IN ---- fix for bug #3161931
3168            (SELECT referring_node_id FROM CZ_MODEL_REF_EXPLS
3169             WHERE model_id=p_model_id AND deleted_flag=NO_FLAG AND parent_expl_node_id=v_up_expl_id AND
3170             referring_node_id IN(SELECT ps_node_id FROM CZ_PS_NODES
3171                                  START WITH ps_node_id=p_ps_node_id AND deleted_flag=NO_FLAG
3172                                  CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
3173            )
3174         )
3175        ) AND deleted_flag=NO_FLAG;
3176 
3177         --
3178         -- DEBUG ERROR CODE --
3179         --
3180         ERROR_CODE:=912;
3181 
3182         IF t_childs.COUNT>0 THEN
3183            FOR t IN t_childs.FIRST..t_childs.LAST
3184            LOOP
3185               t_child_nodes.DELETE;
3186               v_ps_node_id:= t_childs(t);
3187               UPDATE CZ_MODEL_REF_EXPLS
3188               SET parent_expl_node_id=v_expl_id
3189               WHERE parent_expl_node_id=v_up_expl_id
3190               AND model_id=p_model_id AND
3194               RETURNING model_ref_expl_id BULK COLLECT INTO t_child_nodes ;
3191               ((ps_node_type IN(PRODUCT_TYPE,COMPONENT_TYPE,BOM_MODEL_TYPE) AND component_id=v_ps_node_id)
3192                OR (ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND referring_node_id=v_ps_node_id))
3193               AND deleted_flag=NO_FLAG
3195 
3196               IF t_child_nodes.COUNT>0 THEN
3197 
3198                  --
3199                  -- DEBUG ERROR CODE --
3200                  --
3201                  ERROR_CODE:=913;
3202 
3203                  FORALL h IN t_child_nodes.FIRST..t_child_nodes.LAST
3204                         UPDATE CZ_MODEL_REF_EXPLS
3205                         SET node_depth=node_depth+1
3206                         WHERE model_ref_expl_id IN
3207                         (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3208                          START WITH model_ref_expl_id=t_child_nodes(h) AND deleted_flag=NO_FLAG
3209                          CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
3210                          AND PRIOR deleted_flag=NO_FLAG);
3211 
3212                  --
3213                  -- DEBUG ERROR CODE --
3214                  --
3215                  ERROR_CODE:=914;
3216 
3217               END IF;
3218            END LOOP; -- end of loop for t in t_childs.First..t_childs.Last --
3219         END IF;  -- end of t_childs.Count>0 case --
3220 
3221         --
3222         -- DEBUG ERROR CODE --
3223         --
3224         ERROR_CODE:=915;
3225 
3226         --
3227         -- find "Models Chain" that contains
3228         -- the given model ( CZ_DEVL_PROJECTS.devl_project_id=v_ref_model_id )
3229         -- t_chain array will store Model Ids of this chain
3230         --
3231         t_chain.DELETE;t_projectCache.DELETE;
3232         populate_chain(p_model_id);
3233 
3234         --
3235         -- DEBUG ERROR CODE --
3236         --
3237         ERROR_CODE:=916;
3238 
3239         populate_tree
3240         (v_up_expl_id,v_expl_id,p_ps_node_id,v_ps_node_type,
3241          v_expl_node_type,p_model_id,t_childs);
3242 
3243         --
3244         -- DEBUG ERROR CODE --
3245         --
3246         ERROR_CODE:=917;
3247 
3248         set_Expls(p_model_id,p_ps_node_id, PLUS_MODE);
3249 
3250         SELECT MIN(model_ref_expl_id) INTO v_comp_expl_id
3251         FROM CZ_MODEL_REF_EXPLS
3252         WHERE model_id=p_model_id AND component_id=v_component_id AND
3253               deleted_flag='0';
3254 
3255         refresh_UI_Expl_Ids(p_ps_node_id   => p_ps_node_id,
3256                             p_component_id => v_component_id,
3257                             p_model_id     => p_model_id,
3258                             p_old_expl_id  => v_comp_expl_id,
3259                             p_new_expl_id  => v_expl_id);
3260 
3261     END IF;
3262 
3263 EXCEPTION
3264 WHEN OTHERS THEN
3265      p_out_err:=m_RUN_ID;
3266      LOG_REPORT('check_Node','Error : ps_node_id='||
3267      TO_CHAR(p_ps_node_id)||' < '||ERROR_CODE||' > : '||SQLERRM);
3268 END;
3269 
3270 
3271 <<FINAL_SECTION>>
3272     --
3273     -- fix child_model_expl_id's if they are wrong
3274     -- ( recursion is used )
3275     -- this code was commented out because of
3276     -- perfomance problem
3277     --
3278     --update_child_nodes(p_model_id);
3279 
3280     --
3281     -- fix node_depth's if they are wrong
3282     -- ( recursion is used )
3283     --
3284     --
3285     -- Due to BOM Refresh performance problem reported in bug 9446997
3286     -- conditionalize call update_Node_Depth. update_Node_Depth need to
3287     -- be called explicitly at then end of check_node call
3288     -- if p_skip_upd_nod_dep = YES_FLAG
3289 
3290     IF p_skip_upd_nod_dep = YES_FLAG THEN
3291        t_upd_node_depth_models(p_model_id) := p_model_id;
3292     ELSE
3293        update_Node_Depth(p_model_id);
3294     END IF;
3295 
3296 
3297     --
3298     -- delete duplicates
3299     -- like
3300     --  Reference-n
3301     --     |---------Reference-n
3302     --
3303     --delete_duplicates(p_model_id);
3304 
3305     populate_COMPONENT_ID(p_model_id);
3306 
3307   NULL;
3308 END check_Node;
3309 
3310 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3311 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3312 
3313 PROCEDURE delete_Node
3314 (p_ps_node_id    IN  INTEGER,
3315  p_ps_node_type  IN  INTEGER,
3316  p_out_err       OUT NOCOPY INTEGER,
3317  p_del_logically IN  VARCHAR2 -- DEFAULT '1'
3318 ) IS
3319 
3320   v_component_id  CZ_PS_NODES.component_id%TYPE;
3321   v_virtual_flag  CZ_PS_NODES.virtual_flag%TYPE;
3322   v_ps_node_type  CZ_PS_NODES.ps_node_type%TYPE;
3323 
3324 BEGIN
3325     Initialize;
3326     p_out_err:=0;
3327 
3328     IF  p_ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) THEN
3329 
3330         FOR i IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS a
3331                   WHERE referring_node_id=p_ps_node_id  AND deleted_flag=NO_FLAG AND
3332                   model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3333                   WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG))
3334         LOOP
3335            --
3336            -- DEBUG ERROR CODE --
3337            --
3341 
3338            ERROR_CODE:=1001;
3339 
3340            delete_it(i.model_ref_expl_id, YES_FLAG);
3342            --
3343            -- DEBUG ERROR CODE --
3344            --
3345            ERROR_CODE:=1002;
3346 
3347         END LOOP;
3348     ELSE
3349         SELECT component_id,NVL(virtual_flag,'1') INTO v_component_id,v_virtual_flag FROM CZ_PS_NODES
3350         WHERE ps_node_id=p_ps_node_id;
3351 
3352         IF v_virtual_flag='0' THEN
3353            FOR i IN (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS a
3354                      WHERE component_id=p_ps_node_id AND deleted_flag=NO_FLAG AND
3355                            model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3356                            WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG))
3357            LOOP
3358              --
3359              -- DEBUG ERROR CODE --
3360              --
3361              ERROR_CODE:=1003;
3362 
3363              delete_it(i.model_ref_expl_id, YES_FLAG);
3364 
3365              --
3366              -- DEBUG ERROR CODE --
3367              --
3368              ERROR_CODE:=1004;
3369 
3370           END LOOP;
3371 
3372         ELSE
3373 
3374           FOR i IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS a
3375                    WHERE parent_expl_node_id IN
3376                         (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3377                          WHERE model_id=a.model_id AND component_id=v_component_id AND deleted_flag='0')
3378                          AND (component_id IN
3379                                            (SELECT ps_node_id FROM CZ_PS_NODES
3380                                             START WITH ps_node_id=p_ps_node_id
3381                                             CONNECT BY PRIOR ps_node_id=parent_id)
3382                               OR
3383                               referring_node_id IN
3384                                                 (SELECT ps_node_id FROM cz_ps_nodes
3385                                                  START WITH ps_node_id=p_ps_node_id
3386                                                  CONNECT BY PRIOR ps_node_id=parent_id)
3387                              )
3388                   )
3389           LOOP
3390             --
3391             -- DEBUG ERROR CODE --
3392             --
3393             ERROR_CODE:=1005;
3394 
3395             delete_it(i.model_ref_expl_id, YES_FLAG);
3396 
3397             --
3398             -- DEBUG ERROR CODE --
3399             --
3400             ERROR_CODE:=1006;
3401           END LOOP;
3402 
3403           END IF;
3404 
3405         END IF;
3406 
3407 EXCEPTION
3408     WHEN OTHERS THEN
3409          p_out_err:=m_RUN_ID;
3410          LOG_REPORT('delete_Node',
3411          'Error : ps_node_id='||TO_CHAR(p_ps_node_id)||' < '||ERROR_CODE||' > : '||SQLERRM);
3412 END delete_Node;
3413 
3414 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3415 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3416 
3417 PROCEDURE update_levels
3418 (p_expl_id    IN INTEGER,
3419  p_level      IN INTEGER,
3420  p_tree_level IN INTEGER) IS
3421 
3422 BEGIN
3423     FOR i IN(SELECT model_ref_expl_id,parent_expl_node_id FROM CZ_MODEL_REF_EXPLS
3424              WHERE parent_expl_node_id=p_expl_id AND deleted_flag=NO_FLAG)
3425     LOOP
3426        UPDATE CZ_MODEL_REF_EXPLS SET node_depth=p_level+p_tree_level
3427        WHERE model_ref_expl_id=i.model_ref_expl_id;
3428 
3429        --
3430        -- DEBUG ERROR CODE --
3431        --
3432        ERROR_CODE:=1100;
3433 
3434        update_levels(i.model_ref_expl_id,p_level+p_tree_level,p_tree_level+1);
3435 
3436        --
3437        -- DEBUG ERROR CODE --
3438        --
3439        ERROR_CODE:=1101;
3440 
3441     END LOOP;
3442 END;
3443 
3444 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3445 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3446 
3447 --
3448 -- this is general recursive procedure to reconstruct Parent/Childs
3449 --
3450 PROCEDURE reConstruct
3451 (p_project_id     IN INTEGER,
3452  p_expl_root_id   IN INTEGER,
3453  p_from_expl_id   IN INTEGER,
3454  p_up_expl_id     IN INTEGER,
3455  p_model_ref_expl IN IntArray,
3456  p_levels         IN IntArray) IS
3457 
3458     t_levels            IntArray;
3459     t_levels_           IntArray;
3460     t_refs              IntArray;
3461     t_models            IntArray;
3462     t_model_ref_expl    IntArray;
3463     t_model_ref_expl_   IntArray;
3464     v_expl_root_id    CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
3465     v_from_up_expl_id CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
3466     v_up_expl_id      CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
3467     v_from_expl_id    CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
3468     v_up_level        CZ_MODEL_REF_EXPLS.node_depth%TYPE;
3469     STOP_IT             EXCEPTION;
3470 
3471 BEGIN
3472 
3473     --
3474     -- DEBUG ERROR CODE --
3475     --
3476     ERROR_CODE:=1200;
3477 
3478     --
3479     -- find nodes of parent Models which corresponds with
3480     -- a moved node in source Model
3481     --
3482     SELECT model_ref_expl_id,model_id
3483     BULK COLLECT INTO t_refs,t_models
3487     model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3484     FROM CZ_MODEL_REF_EXPLS a
3485     WHERE child_model_expl_id=p_expl_root_id
3486     AND ps_node_type IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND deleted_flag=NO_FLAG AND
3488     WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG);
3489 
3490     --
3491     -- DEBUG ERROR CODE --
3492     --
3493     ERROR_CODE:=1201;
3494 
3495     IF t_refs.COUNT=0 THEN
3496        RAISE STOP_IT;
3497     END IF;
3498 
3499     FOR i IN t_refs.FIRST..t_refs.LAST
3500     LOOP
3501        --
3502        -- find a root node of subtree in the current parent Model
3503        -- associated with a child referenced Model
3504        --
3505        v_expl_root_id:=t_refs(i);
3506 
3507        --
3508        -- DEBUG ERROR CODE --
3509        --
3510        ERROR_CODE:=1202;
3511 
3512        SELECT model_ref_expl_id INTO v_from_up_expl_id FROM CZ_MODEL_REF_EXPLS a
3513        WHERE child_model_expl_id=p_from_expl_id AND model_ref_expl_id
3514        IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3515           START WITH model_ref_expl_id=t_refs(i) AND deleted_flag=NO_FLAG
3516           CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND
3517                            deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
3518        AND
3519        model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3520        WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG);
3521 
3522        --
3523        -- DEBUG ERROR CODE --
3524        --
3525        ERROR_CODE:=1203;
3526 
3527        SELECT model_ref_expl_id,node_depth
3528        INTO v_up_expl_id,v_up_level FROM CZ_MODEL_REF_EXPLS a
3529        WHERE child_model_expl_id=p_up_expl_id AND model_ref_expl_id
3530        IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3531           START WITH model_ref_expl_id=t_refs(i) AND deleted_flag=NO_FLAG
3532           CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND PRIOR deleted_flag=NO_FLAG)
3533        AND
3534        model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3535        WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG);
3536 
3537        --
3538        -- DEBUG ERROR CODE --
3539        --
3540        ERROR_CODE:=1204;
3541 
3542        FOR k IN p_model_ref_expl.FIRST..p_model_ref_expl.LAST
3543        LOOP
3544           UPDATE CZ_MODEL_REF_EXPLS
3545           SET parent_expl_node_id=v_up_expl_id
3546           WHERE model_ref_expl_id
3547           IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3548           WHERE (parent_expl_node_id=v_from_up_expl_id OR model_ref_expl_id=v_from_up_expl_id)
3549           AND child_model_expl_id=p_model_ref_expl(k)
3550           AND deleted_flag=NO_FLAG);
3551 
3552        END LOOP;
3553 
3554        --
3555        -- DEBUG ERROR CODE --
3556        --
3557        ERROR_CODE:=1205;
3558 
3559        t_old_expl_ids(t_old_expl_ids.COUNT+1):=v_from_up_expl_id;
3560        t_new_expl_ids(t_new_expl_ids.COUNT+1):=v_up_expl_id;
3561 
3562        FOR k IN p_model_ref_expl.FIRST..p_model_ref_expl.LAST
3563        LOOP
3564 
3565           --
3566           -- DEBUG ERROR CODE --
3567           --
3568           ERROR_CODE:=1206;
3569 
3570           --
3571           -- recreate array of child_model_expl_id-s --
3572           --
3573           SELECT model_ref_expl_id,node_depth
3574           BULK COLLECT INTO t_model_ref_expl_,t_levels_
3575           FROM CZ_MODEL_REF_EXPLS
3576           WHERE parent_expl_node_id=v_up_expl_id
3577           AND child_model_expl_id=p_model_ref_expl(k)
3578           AND deleted_flag=NO_FLAG;
3579 
3580           --
3581           -- DEBUG ERROR CODE --
3582           --
3583           ERROR_CODE:=1207;
3584 
3585        END LOOP;
3586 
3587 
3588       IF t_model_ref_expl_.COUNT>0 THEN
3589          --
3590          -- DEBUG ERROR CODE --
3591          --
3592          ERROR_CODE:=1208;
3593 
3594          update_levels(v_up_expl_id,v_up_level,1);
3595          reConstruct(p_project_id    =>p_project_id,
3596                      p_expl_root_id  =>v_expl_root_id,
3597                      p_from_expl_id  =>v_from_up_expl_id,
3598                      p_up_expl_id    =>v_up_expl_id,
3599                      p_model_ref_expl=>t_model_ref_expl_,
3600                      p_levels        =>t_levels_ );
3601 
3602         --
3603         -- DEBUG ERROR CODE --
3604         --
3605         ERROR_CODE:=1209;
3606 
3607       END IF;
3608     END LOOP;
3609 
3610 EXCEPTION
3611     WHEN STOP_IT THEN
3612          NULL;
3613     WHEN OTHERS THEN
3614          LOG_REPORT('reConstruct','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
3615 END reConstruct;
3616 
3617 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3618 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3619 
3620 PROCEDURE move_Node
3621 (p_from_ps_node_id IN  INTEGER,
3622  p_to_ps_node_id   IN  INTEGER,
3623  p_project_id      IN  INTEGER,
3624  p_out_err         OUT NOCOPY INTEGER) IS
3625 
3626     t_levels              IntArray;
3627     t_refs                IntArray;
3628     t_models              IntArray;
3629     t_model_ref_expl      IntArray;
3630     v_up_id               INTEGER;
3634     v_down_expl_id        INTEGER;
3631     v_down_id             INTEGER;
3632     v_up_expl_id          INTEGER;
3633     v_expr_node_id        INTEGER;
3635     v_level               INTEGER;
3636     v_up_level            INTEGER;
3637     v_from_up_id          INTEGER;
3638     v_from_up_expl_id     INTEGER;
3639     v_from_up_level       INTEGER;
3640     v_down_level          INTEGER;
3641     v_delta_level         INTEGER;
3642     v_expl_root_id        INTEGER;
3643     var_subroot_id        INTEGER;
3644     var_subroot_level     INTEGER;
3645     v_temp                INTEGER;
3646     err                   INTEGER;
3647     v_ps_node_type        CZ_PS_NODES.ps_node_type%TYPE;
3648     v_virtual_flag        CZ_PS_NODES.virtual_flag%TYPE;
3649 
3650     v_ref_up_expl_id      CZ_MODEL_REF_EXPLS.model_ref_expl_id%TYPE;
3651     v_ref_up_level        CZ_MODEL_REF_EXPLS.node_depth%TYPE;
3652     v_contains_non_virt   BOOLEAN:=FALSE;
3653     v_circularity_exists  BOOLEAN:=FALSE;
3654     v_comp_expl_id        NUMBER;
3655     v_model_ref_expl_id   NUMBER;
3656     v_component_id        NUMBER;
3657     v_parent_id           NUMBER;
3658     v_ndebug              NUMBER;
3659 
3660 BEGIN
3661 
3662  IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3663     v_ndebug := 0;
3664     cz_utils.log_report('CZ_REFS', 'move_Node', v_ndebug,
3665       'Starting CZ_REFS.move_Node for model node with ps_node_id='||TO_CHAR(p_from_ps_node_id)||
3666       ' current time : '||TO_CHAR(SYSDATE,'DD-MM-YYYY HH24:MI:SS'),
3667       fnd_log.LEVEL_PROCEDURE);
3668     cz_utils.log_report('CZ_REFS', 'move_Node', v_ndebug,
3669       'Parameters : '||
3670       'p_from_ps_node_id = '||TO_CHAR(p_from_ps_node_id)||
3671       'p_to_ps_node_id = '||TO_CHAR(p_to_ps_node_id)||
3672       'p_project_id = '||TO_CHAR(p_project_id)
3673       ,fnd_log.LEVEL_PROCEDURE);
3674  END IF;
3675 
3676  BEGIN -- main try/catch block --
3677     Initialize;
3678     p_out_err:=0;
3679     t_old_expl_ids.DELETE;
3680     t_new_expl_ids.DELETE;
3681 
3682     --
3683     -- DEBUG ERROR CODE --
3684     --
3685     ERROR_CODE:=1300;
3686 
3687     SELECT ps_node_type,NVL(virtual_flag,YES_FLAG),parent_id,component_id
3688     INTO v_ps_node_type,v_virtual_flag,v_parent_id,v_component_id
3689     FROM CZ_PS_NODES
3690     WHERE ps_node_id=p_from_ps_node_id;
3691 
3692 LOG_REPORT('*','p_from_ps_node_id='||to_char(p_from_ps_node_id)||
3693 ' v_parent_id='||to_char(v_parent_id));
3694 
3695     --
3696     -- DEBUG ERROR CODE --
3697     --
3698     ERROR_CODE:=1301;
3699 
3700     --
3701     -- find nearest non-virtual node above the target node --
3702     --
3703     get_Node_Up(p_to_ps_node_id,p_project_id,v_up_id,
3704                 v_up_expl_id,v_up_level);
3705 
3706 
3707     --
3708     -- DEBUG ERROR CODE --
3709     --
3710     ERROR_CODE:=1302;
3711 
3712     IF v_ps_node_type IN (REFERENCE_TYPE,CONNECTOR_TYPE) THEN
3713 
3714        v_from_up_id:=p_from_ps_node_id;
3715        SELECT model_ref_expl_id,node_depth
3716        INTO v_from_up_expl_id,v_from_up_level
3717        FROM CZ_MODEL_REF_EXPLS
3718        WHERE model_id=p_project_id AND referring_node_id=p_from_ps_node_id
3719        AND deleted_flag=NO_FLAG;
3720 
3721        BEGIN
3722            SELECT model_ref_expl_id,node_depth
3723            INTO v_ref_up_expl_id,v_ref_up_level
3724            FROM CZ_MODEL_REF_EXPLS
3725            WHERE component_id=v_up_id
3726            AND model_id=p_project_id AND deleted_flag=NO_FLAG;
3727 
3728            UPDATE CZ_MODEL_REF_EXPLS
3729            SET parent_expl_node_id=v_ref_up_expl_id
3730            WHERE model_ref_expl_id=v_from_up_expl_id
3731            AND deleted_flag=NO_FLAG;
3732 
3733            UPDATE CZ_MODEL_REF_EXPLS SET node_depth=node_depth-v_from_up_level+v_ref_up_level+1
3734            WHERE model_ref_expl_id IN
3735            (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3736             START WITH model_ref_expl_id=v_from_up_expl_id AND deleted_flag=NO_FLAG
3737             CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
3738             AND PRIOR deleted_flag=NO_FLAG);
3739        EXCEPTION
3740            WHEN OTHERS THEN
3741                 p_out_err:=m_RUN_ID;
3742                 LOG_REPORT('move_Node','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
3743                 GOTO FINAL_SECTION;
3744        END;
3745 
3746        t_chain.DELETE;t_projectCache.DELETE;
3747        populate_chain(p_project_id);
3748 
3749        IF t_chain.COUNT>0 THEN
3750           FOR i IN t_chain.FIRST..t_chain.LAST
3751           LOOP
3752              FOR k IN(SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS WHERE
3753                       model_id=t_chain(i).model_id AND ps_node_type IN(REFERENCE_TYPE,264)
3754                      AND component_id=p_project_id AND deleted_flag=NO_FLAG)
3755              LOOP
3756                 BEGIN
3757                     SELECT model_ref_expl_id,node_depth
3758                     INTO v_ref_up_expl_id,v_ref_up_level
3759                     FROM CZ_MODEL_REF_EXPLS
3760                     WHERE component_id=v_up_id
3761                     AND model_ref_expl_id IN
3762                     (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3763                      START WITH model_ref_expl_id=k.model_ref_expl_id AND deleted_flag=NO_FLAG
3767 
3764                      CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
3765                      AND PRIOR deleted_flag=NO_FLAG);
3766 
3768                     UPDATE CZ_MODEL_REF_EXPLS
3769                     SET parent_expl_node_id=v_ref_up_expl_id
3770                     WHERE model_ref_expl_id IN
3771                     (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS a
3772                     WHERE referring_node_id=p_from_ps_node_id
3773                     AND model_ref_expl_id IN
3774                     (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3775                      START WITH model_ref_expl_id=k.model_ref_expl_id AND deleted_flag=NO_FLAG
3776                      CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
3777                                       AND PRIOR deleted_flag=NO_FLAG) AND
3778                      model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
3779                     WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG))
3780                     RETURNING model_ref_expl_id,node_depth INTO var_subroot_id,var_subroot_level ;
3781 
3782                      UPDATE CZ_MODEL_REF_EXPLS SET node_depth=node_depth-var_subroot_level+v_ref_up_level+1
3783                      WHERE model_ref_expl_id IN
3784                      (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3785                      START WITH model_ref_expl_id=var_subroot_id AND deleted_flag=NO_FLAG
3786                      CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND
3787                      PRIOR deleted_flag=NO_FLAG);
3788 
3789                 EXCEPTION
3790                     WHEN OTHERS THEN
3791                          p_out_err:=m_RUN_ID;
3792                          LOG_REPORT('move_Node','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
3793                          GOTO FINAL_SECTION;
3794                 END;
3795              END LOOP;
3796           END LOOP;
3797        END IF;
3798 
3799        GOTO FINAL_SECTION;
3800 
3801     ELSE
3802 
3803        IF v_virtual_flag='1' THEN
3804 
3805           get_from_Node_Up(p_from_ps_node_id,p_project_id,v_from_up_id,
3806                            v_from_up_expl_id,v_from_up_level);
3807 
3808           --
3809           -- DEBUG ERROR CODE --
3810           --
3811           ERROR_CODE:=1303;
3812 
3813           SELECT model_ref_expl_id
3814           BULK COLLECT INTO t_model_ref_expl
3815           FROM CZ_MODEL_REF_EXPLS
3816           WHERE parent_expl_node_id=v_from_up_expl_id AND model_id=p_project_id AND
3817           component_id IN(SELECT ps_node_id FROM CZ_PS_NODES
3818                           START WITH ps_node_id=p_from_ps_node_id AND deleted_flag=NO_FLAG
3819                           CONNECT BY PRIOR ps_node_id=parent_id AND deleted_flag=NO_FLAG
3820                           AND PRIOR deleted_flag=NO_FLAG);
3821 
3822           --
3823           -- DEBUG ERROR CODE --
3824           --
3825           ERROR_CODE:=1304;
3826 
3827        ELSE
3828 
3829           --
3830           -- DEBUG ERROR CODE --
3831           --
3832           ERROR_CODE:=1305;
3833 
3834           v_from_up_id:=p_from_ps_node_id;
3835           SELECT model_ref_expl_id,node_depth
3836           INTO v_from_up_expl_id,v_from_up_level
3837           FROM CZ_MODEL_REF_EXPLS
3838           WHERE model_id=p_project_id AND component_id=v_from_up_id
3839           AND ps_node_type NOT IN(REFERENCE_TYPE,CONNECTOR_TYPE) AND child_model_expl_id IS NULL AND
3840           deleted_flag=NO_FLAG;
3841           t_model_ref_expl(1):=v_from_up_expl_id;
3842 
3843           --
3844           -- DEBUG ERROR CODE --
3845           --
3846           ERROR_CODE:=1306;
3847 
3848        END IF;
3849     END IF;
3850 
3851     IF t_model_ref_expl.COUNT>0 THEN
3852 
3853        FOR i IN t_model_ref_expl.FIRST..t_model_ref_expl.LAST
3854        LOOP
3855 
3856           --
3857           -- DEBUG ERROR CODE --
3858           --
3859           ERROR_CODE:=1307;
3860 
3861           UPDATE CZ_MODEL_REF_EXPLS SET parent_expl_node_id=v_up_expl_id
3862           WHERE model_ref_expl_id=t_model_ref_expl(i)
3863           AND model_id=p_project_id;
3864 
3865           --
3866           -- DEBUG ERROR CODE --
3867           --
3868           ERROR_CODE:=1308;
3869 
3870           UPDATE CZ_MODEL_REF_EXPLS SET node_depth=node_depth-v_from_up_level+v_up_level+1
3871           WHERE model_ref_expl_id IN
3872           (SELECT model_ref_expl_id FROM CZ_MODEL_REF_EXPLS
3873            START WITH model_ref_expl_id=t_model_ref_expl(i) AND deleted_flag=NO_FLAG
3874            CONNECT BY PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG AND
3875            PRIOR deleted_flag=NO_FLAG);
3876 
3877           --
3878           -- DEBUG ERROR CODE --
3879           --
3880           ERROR_CODE:=1309;
3881 
3882        END LOOP;
3883 
3884     END IF;
3885 
3886     --
3887     -- DEBUG ERROR CODE --
3888     --
3889     ERROR_CODE:=1310;
3890 
3891     SELECT model_ref_expl_id INTO v_expl_root_id
3892     FROM CZ_MODEL_REF_EXPLS WHERE model_id=p_project_id AND component_id=p_project_id
3893     AND parent_expl_node_id IS NULL AND deleted_flag=NO_FLAG;
3894 
3895     --
3896     -- DEBUG ERROR CODE --
3900     IF t_model_ref_expl.COUNT>0 THEN
3897     --
3898     ERROR_CODE:=1311;
3899 
3901        FOR t IN  t_model_ref_expl.FIRST..t_model_ref_expl.LAST
3902        LOOP
3903 
3904           --
3905           -- DEBUG ERROR CODE --
3906           --
3907           ERROR_CODE:=1312;
3908 
3909           SELECT node_depth INTO v_temp FROM CZ_MODEL_REF_EXPLS
3910           WHERE model_id=p_project_id AND model_ref_expl_id=t_model_ref_expl(t);
3911           t_levels(t_levels.COUNT+1):=v_temp;
3912 
3913           --
3914           -- DEBUG ERROR CODE --
3915           --
3916           ERROR_CODE:=1313;
3917 
3918        END LOOP;
3919     END IF;
3920 
3921     --
3922     -- DEBUG ERROR CODE --
3923     --
3924     ERROR_CODE:=1314;
3925 
3926     t_old_expl_ids(t_old_expl_ids.COUNT+1):=v_from_up_expl_id;
3927 
3928     t_new_expl_ids(t_new_expl_ids.COUNT+1):=v_up_expl_id;
3929 
3930     reConstruct(p_project_id    =>p_project_id,
3931                 p_expl_root_id  =>v_expl_root_id,
3932                 p_from_expl_id  =>v_from_up_expl_id,
3933                 p_up_expl_id    =>v_up_expl_id,
3934                 p_model_ref_expl=>t_model_ref_expl,
3935                 p_levels        =>t_levels);
3936 
3937     IF v_virtual_flag=YES_FLAG THEN
3938        update_Rules(p_from_ps_node_id);
3939 
3940         SELECT MIN(model_ref_expl_id) INTO v_comp_expl_id
3941         FROM CZ_MODEL_REF_EXPLS
3942         WHERE model_id=p_project_id AND component_id=v_component_id AND
3943               deleted_flag='0';
3944 
3945         SELECT MIN(model_ref_expl_id) INTO v_comp_expl_id
3946         FROM CZ_MODEL_REF_EXPLS
3947         WHERE model_id=p_project_id AND component_id=
3948               (SELECT component_id FROM CZ_PS_NODES WHERE ps_node_id=p_to_ps_node_id) AND
3949               deleted_flag='0';
3950 
3951         refresh_UI_Expl_Ids(p_ps_node_id   => p_from_ps_node_id,
3952                             p_component_id => v_component_id,
3953                             p_model_id     => p_project_id,
3954                             p_old_expl_id  => v_model_ref_expl_id,
3955                             p_new_expl_id  => v_comp_expl_id);
3956 
3957     END IF;
3958 
3959     --
3960     -- DEBUG ERROR CODE --
3961     --
3962     ERROR_CODE:=1315;
3963 
3964  EXCEPTION
3965      WHEN OTHERS THEN
3966           p_out_err:=m_RUN_ID;
3967           LOG_REPORT('move_Node','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
3968  END;
3969 
3970 <<FINAL_SECTION>>
3971     --
3972     -- fix child_model_expl_id's if they are wrong
3973     -- ( recursion is used )
3974     -- this code was commented out because of
3975     -- perfomance problem
3976     --
3977     update_child_nodes(p_project_id);
3978 
3979     --
3980     -- fix node_depth's if they are wrong
3981     -- ( recursion is used )
3982     --
3983     update_Node_Depth(p_project_id);
3984 
3985     --
3986     -- delete duplicates
3987     -- like
3988     --  Reference-n
3989     --     |---------Reference-n
3990     --
3991     -- delete_duplicates(p_project_id);
3992 
3993     populate_COMPONENT_ID(p_project_id);
3994 
3995 END move_Node;
3996 
3997 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3998 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
3999 
4000 PROCEDURE CHECK_REF_REQUEST
4001 (p_refroot_model_id    IN  INTEGER,
4002  p_ref_parent_node_id  IN  INTEGER,
4003  p_ref_target_model_id IN  INTEGER,
4004  p_out_status_code     OUT NOCOPY INTEGER) IS
4005 
4006     v_BOM_node1    CZ_PS_NODES.ps_node_id%TYPE;
4007     v_BOM_node2    CZ_PS_NODES.ps_node_id%TYPE;
4008     v_instanciable INTEGER;
4009 
4010 BEGIN
4011     p_out_status_code:=0;
4012 
4013     --
4014     -- DEBUG ERROR CODE --
4015     --
4016     ERROR_CODE:=1400;
4017 
4018     BEGIN
4019         SELECT ps_node_id INTO v_BOM_node1 FROM CZ_PS_NODES
4020         WHERE devl_project_id=p_refroot_model_id AND ps_node_type=BOM_MODEL_TYPE
4021         AND deleted_flag=NO_FLAG AND rownum<2;
4022     EXCEPTION
4023         WHEN NO_DATA_FOUND THEN
4024              v_BOM_node1:=containsBOM(p_refroot_model_id,v_instanciable);
4025     END;
4026 
4027     --
4028     -- DEBUG ERROR CODE --
4029     --
4030     ERROR_CODE:=1401;
4031 
4032     v_BOM_node2:=containsBOM(p_ref_target_model_id,v_instanciable);
4033 
4034     --
4035     -- DEBUG ERROR CODE --
4036     --
4037     ERROR_CODE:=1402;
4038 
4039     IF v_BOM_node1>0 AND v_BOM_node2>0 THEN
4040        IF v_instanciable=1 THEN
4041           p_out_status_code:=1;
4042        ELSE
4043           p_out_status_code:=2;
4044        END IF;
4045        RETURN;
4046     END IF;
4047 
4048     IF v_BOM_node2>0 THEN
4049       -- check models that reference the current model ( p_refroot_model_id )
4050       FOR n IN(SELECT DISTINCT model_id FROM CZ_MODEL_REF_EXPLS a
4051                WHERE component_id=p_refroot_model_id AND ps_node_type=REFERENCE_TYPE AND
4052                      deleted_flag='0' AND
4053                      EXISTS(SELECT NULL FROM CZ_RP_ENTRIES WHERE object_id=a.model_id AND
4057           p_out_status_code:=1;
4054                             object_type='PRJ' AND deleted_flag='0'))
4055       LOOP
4056         IF containsBOM(n.model_id, v_instanciable) > 0 THEN
4058           RETURN;
4059         END IF;
4060       END LOOP;
4061     END IF;
4062 
4063 EXCEPTION
4064     WHEN NO_DATA_FOUND THEN
4065          NULL;
4066     WHEN TOO_MANY_ROWS THEN
4067          p_out_status_code:=1;
4068          LOG_REPORT('CHECK_REF_REQUEST',
4069          'Wrong PS Tree : there are more than one BOM model in PS Tree');
4070     WHEN OTHERS THEN
4071          LOG_REPORT('CHECK_REF_REQUEST','ERROR CODE :'||ERROR_CODE||' : '||SQLERRM);
4072 END CHECK_REF_REQUEST;
4073 
4074 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4075 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4076 
4077 PROCEDURE SolutionBasedModelcheck
4078 (p_model_id     IN  INTEGER,
4079  p_instanciable OUT NOCOPY INTEGER) IS
4080 
4081     v_bom_node_id CZ_PS_NODES.ps_node_id%TYPE;
4082 
4083 BEGIN
4084     p_instanciable:=0;
4085     v_bom_node_id:=containsBOM(p_model_id,p_instanciable);
4086 END SolutionBasedModelcheck;
4087 
4088 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4089 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4090 
4091 PROCEDURE delete_childs(t_arr IN IntArray) IS
4092     temp_arr  IntArray;
4093     v_arr     IntArray;
4094 BEGIN
4095     IF t_arr.COUNT>0 THEN
4096        FOR i IN t_arr.FIRST..t_arr.LAST
4097        LOOP
4098           temp_arr.DELETE;
4099 
4100           --
4101           -- DEBUG ERROR CODE --
4102           --
4103           ERROR_CODE:=1500;
4104 
4105           UPDATE CZ_MODEL_REF_EXPLS a SET deleted_flag=YES_FLAG
4106           WHERE child_model_expl_id=t_arr(i) AND
4107           model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
4108           WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG)
4109           RETURNING model_ref_expl_id BULK COLLECT INTO temp_arr;
4110 
4111           --
4112           -- DEBUG ERROR CODE --
4113           --
4114           ERROR_CODE:=1501;
4115 
4116           IF temp_arr.COUNT>0 THEN
4117              FOR j IN temp_arr.FIRST..temp_arr.LAST
4118              LOOP
4119                 v_arr(v_arr.COUNT+1):=temp_arr(j);
4120              END LOOP;
4121           END IF;
4122        END LOOP;
4123 
4124        --
4125        -- DEBUG ERROR CODE --
4126        --
4127        ERROR_CODE:=1502;
4128 
4129        delete_childs(v_arr);
4130     END IF;
4131 END;
4132 
4133 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4134 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4135 
4136 PROCEDURE delete_subtree(p_model_id IN INTEGER,p_model_ref_expl_id IN INTEGER) IS
4137     t_arr IntArray;
4138 BEGIN
4139        FOR j IN(SELECT model_ref_expl_id,ps_node_type,component_id FROM CZ_MODEL_REF_EXPLS
4140              WHERE model_id=p_model_id AND parent_expl_node_id=p_model_ref_expl_id AND deleted_flag=NO_FLAG)
4141        LOOP
4142           IF j.ps_node_type=CONNECTOR_TYPE THEN
4143              t_arr.DELETE;
4144 
4145              --
4146              -- DEBUG ERROR CODE --
4147              --
4148              ERROR_CODE:=1600;
4149 
4150              UPDATE CZ_MODEL_REF_EXPLS SET deleted_flag=YES_FLAG
4151              WHERE model_ref_expl_id IN(
4152              SELECT model_ref_expl_id FROM cz_model_ref_expls
4153              START WITH model_ref_expl_id=j.model_ref_expl_id AND deleted_flag=NO_FLAG
4154              CONNECT by PRIOR model_ref_expl_id=parent_expl_node_id AND deleted_flag=NO_FLAG
4155              AND PRIOR deleted_flag=NO_FLAG);
4156 
4157              --
4158              -- DEBUG ERROR CODE --
4159              --
4160              ERROR_CODE:=1601;
4161           ELSE
4162              --
4163              -- DEBUG ERROR CODE --
4164              --
4165              ERROR_CODE:=1602;
4166 
4167              delete_subtree(p_model_id,j.model_ref_expl_id);
4168 
4169              --
4170              -- DEBUG ERROR CODE --
4171              --
4172              ERROR_CODE:=1603;
4173 
4174           END IF;
4175        END LOOP;
4176 END;
4177 
4178 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4179 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4180 
4181 
4182 PROCEDURE change_structure_(p_model_id IN INTEGER) IS
4183 
4184 BEGIN
4185     FOR i IN(SELECT model_ref_expl_id,ps_node_type FROM CZ_MODEL_REF_EXPLS
4186              WHERE model_id=p_model_id AND component_id=p_model_id AND
4187              ps_node_type IN(CONNECTOR_TYPE,REFERENCE_TYPE) AND deleted_flag=NO_FLAG)
4188     LOOP
4189        delete_subtree(p_model_id,i.model_ref_expl_id);
4190     END LOOP;
4191 END;
4192 
4193 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4194 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4195 
4196 PROCEDURE change_structure(p_model_id IN INTEGER) IS
4197 
4198 BEGIN
4199     FOR i IN(SELECT DISTINCT model_id FROM CZ_MODEL_REF_EXPLS
4200              WHERE component_id=p_model_id AND
4201              ps_node_type IN(CONNECTOR_TYPE,REFERENCE_TYPE) AND deleted_flag=NO_FLAG)
4205 END;
4202     LOOP
4203        change_structure_(i.model_id);
4204     END LOOP;
4206 
4207 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4208 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
4209 
4210 PROCEDURE set_Trackable_Children_Flag(p_model_id IN NUMBER) IS
4211 
4212     t_m_chain_tbl  IntArray;
4213     t_trk_tbl      IntArray;
4214     t_nontrk_tbl   IntArray;
4215     v_ib_trackable CZ_PS_NODES.ib_trackable%TYPE;
4216 
4217 BEGIN
4218 
4219     SELECT DISTINCT model_id BULK COLLECT INTO t_m_chain_tbl FROM
4220     (SELECT DISTINCT component_id AS model_id
4221      FROM CZ_MODEL_REF_EXPLS WHERE model_id=p_model_id AND ps_node_type=REFERENCE_TYPE
4222      AND deleted_flag=NO_FLAG
4223      UNION
4224      SELECT DISTINCT model_id FROM CZ_MODEL_REF_EXPLS a
4225      WHERE component_id=p_model_id AND ps_node_type=REFERENCE_TYPE AND deleted_flag=NO_FLAG AND
4226           model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
4227           WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG));
4228 
4229      t_m_chain_tbl(t_m_chain_tbl.COUNT+1):=p_model_id;
4230 
4231      FOR i IN t_m_chain_tbl.First..t_m_chain_tbl.Last
4232      LOOP
4233           --
4234           -- set has_trackable_children to '1' for those references in explosion tree of t_m_chain_tbl(i) model
4235           -- which points to models which have CZ_PS_NODES.ib_trackable='1'. So here we assume
4236           -- that CZ_PS_NODES.ib_trackable is populated correctly by Import
4237           --
4238           UPDATE cz_model_ref_expls
4239           SET has_trackable_children='1'
4240           WHERE model_id=t_m_chain_tbl(i) AND component_id=t_m_chain_tbl(i) AND deleted_flag=NO_FLAG AND
4241           EXISTS(SELECT NULL FROM CZ_MODEL_REF_EXPLS m WHERE model_id=t_m_chain_tbl(i) AND ps_node_type=REFERENCE_TYPE
4242           AND deleted_flag=NO_FLAG AND
4243           EXISTS(SELECT NULL FROM CZ_PS_NODES
4244                  WHERE devl_project_id = m.component_id AND
4245                        ib_trackable = '1' AND deleted_flag = NO_FLAG));
4246 
4247           IF SQL%ROWCOUNT=0 THEN
4248              BEGIN
4249                  v_ib_trackable:=NO_FLAG;
4250                  SELECT '1' INTO v_ib_trackable FROM dual
4251                  WHERE EXISTS(SELECT NULL FROM CZ_PS_NODES WHERE devl_project_id=t_m_chain_tbl(i)
4252                  AND deleted_flag=NO_FLAG AND ib_trackable='1');
4253                  v_ib_trackable:='1';
4254                  t_trk_tbl(t_trk_tbl.COUNT+1):=t_m_chain_tbl(i);
4255              EXCEPTION
4256                 WHEN NO_DATA_FOUND THEN
4257                      NULL;
4258              END;
4259           ELSE
4260              v_ib_trackable:='1';
4261              t_trk_tbl(t_trk_tbl.COUNT+1):=t_m_chain_tbl(i);
4262           END IF;
4263 
4264           IF v_ib_trackable=NO_FLAG THEN
4265              t_nontrk_tbl(t_nontrk_tbl.COUNT+1):=t_m_chain_tbl(i);
4266           END IF;
4267 
4268           UPDATE CZ_MODEL_REF_EXPLS SET has_trackable_children=v_ib_trackable
4269           WHERE model_id=t_m_chain_tbl(i) AND component_id=t_m_chain_tbl(i) AND deleted_flag=NO_FLAG;
4270 
4271     END LOOP;
4272 
4273     IF t_trk_tbl.COUNT>0 THEN
4274        FORALL i IN t_trk_tbl.First..t_trk_tbl.Last
4275           UPDATE CZ_MODEL_REF_EXPLS a SET has_trackable_children='1'
4276           WHERE component_id=t_trk_tbl(i) AND ps_node_type=REFERENCE_TYPE AND deleted_flag=NO_FLAG AND
4277           model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
4278           WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG);
4279     END IF;
4280 
4281     IF t_nontrk_tbl.COUNT>0 THEN
4282        FORALL i IN t_nontrk_tbl.First..t_nontrk_tbl.Last
4283           UPDATE CZ_MODEL_REF_EXPLS a SET has_trackable_children=NO_FLAG
4284           WHERE component_id=t_nontrk_tbl(i) AND ps_node_type=REFERENCE_TYPE AND deleted_flag=NO_FLAG AND
4285           model_id IN(SELECT object_id FROM CZ_RP_ENTRIES
4286           WHERE object_id=a.model_id AND object_type='PRJ' AND deleted_flag=NO_FLAG);
4287     END IF;
4288 
4289 
4290 END set_Trackable_Children_Flag;
4291 
4292 FUNCTION check_Rules_For_Ps_Node(p_ps_node_id IN  NUMBER)
4293   RETURN NUMBER IS
4294 
4295   l_template_id         NUMBER;
4296   l_contribute_min_flag VARCHAR2(1);
4297   l_contribute_max_flag VARCHAR2(1);
4298 
4299 BEGIN
4300 
4301   FND_MSG_PUB.initialize;
4302 
4303   FOR i IN(SELECT expr_node_id,rule_id
4304              FROM CZ_EXPRESSION_NODES
4305              WHERE rule_id IN(SELECT rule_id FROM CZ_RULES
4306                    WHERE devl_project_id IN(SELECT devl_project_id FROM CZ_PS_NODES
4307                    WHERE ps_node_id=p_ps_node_id) AND deleted_flag=NO_FLAG AND disabled_flag=NO_FLAG) AND
4308                    ps_node_id=p_ps_node_id AND expr_type=205 AND deleted_flag=NO_FLAG)
4309   LOOP
4310     BEGIN
4311       SELECT template_id INTO l_template_id
4312         FROM CZ_EXPRESSION_NODES
4313        WHERE rule_id=i.rule_id AND expr_parent_id=i.expr_node_id AND
4314              expr_type=210 AND
4315              template_id in(43,44) AND deleted_flag=NO_FLAG;
4316 
4317       IF l_template_id=43 THEN
4318          l_contribute_min_flag := YES_FLAG;
4319       END IF;
4320 
4321       IF l_template_id=44 THEN
4322          l_contribute_max_flag := YES_FLAG;
4323       END IF;
4324 
4328 
4325       IF l_contribute_min_flag=YES_FLAG AND l_contribute_max_flag=YES_FLAG THEN
4326          RETURN CONTRIBUTE_TO_MINMAX;
4327       END IF;
4329     EXCEPTION
4330       WHEN OTHERS THEN
4331         NULL;
4332     END;
4333   END LOOP;
4334 
4335   IF l_contribute_max_flag=YES_FLAG THEN
4336      RETURN CONTRIBUTE_TO_MAX;
4337   ELSIF  l_contribute_min_flag=YES_FLAG THEN
4338      RETURN CONTRIBUTE_TO_MIN;
4339   ELSE
4340      RETURN 0;
4341   END IF;
4342 
4343 END check_Rules_For_Ps_Node;
4344 
4345 
4346 PROCEDURE validate_Inst_Flag
4347 (
4348  p_ps_node_id        IN  NUMBER,
4349  p_instantiable_flag IN  NUMBER,
4350  x_validation_flag   OUT NOCOPY VARCHAR2,
4351  x_run_id            OUT NOCOPY NUMBER) IS
4352 
4353     l_contribute        NUMBER;
4354     l_instantiable_flag NUMBER;
4355 
4356 BEGIN
4357 
4358   FND_MSG_PUB.initialize;
4359 
4360   x_run_id := 0; x_validation_flag := NO_FLAG;
4361 
4362   SELECT instantiable_flag INTO l_instantiable_flag
4363     FROM CZ_PS_NODES
4364    WHERE ps_node_id=p_ps_node_id;
4365 
4366   l_contribute := check_Rules_For_Ps_Node(p_ps_node_id);
4367 
4368   IF l_instantiable_flag=MINMAX_EXPL_TYPE AND p_instantiable_flag=MANDATORY_EXPL_TYPE THEN
4369     IF l_contribute IN(CONTRIBUTE_TO_MIN,CONTRIBUTE_TO_MAX,CONTRIBUTE_TO_MINMAX) THEN
4370       x_validation_flag := YES_FLAG;
4371     END IF;
4372   ELSIF l_instantiable_flag=MINMAX_EXPL_TYPE AND p_instantiable_flag=OPTIONAL_EXPL_TYPE THEN
4373     IF l_contribute IN(CONTRIBUTE_TO_MAX) THEN
4374       x_validation_flag := YES_FLAG;
4375     END IF;
4376   ELSIF l_instantiable_flag=OPTIONAL_EXPL_TYPE AND p_instantiable_flag=MANDATORY_EXPL_TYPE THEN
4377     IF l_contribute IN(CONTRIBUTE_TO_MIN) THEN
4378       x_validation_flag := YES_FLAG;
4379     END IF;
4380   ELSE
4381     null;
4382  END IF;
4383 
4384 END validate_Inst_Flag;
4385 
4386 PROCEDURE check_Inst_Rule
4387 (
4388  p_rule_id          IN  NUMBER,
4389  x_inst_flag        OUT NOCOPY NUMBER,
4390  x_sys_prop         OUT NOCOPY NUMBER,
4391  x_validation_flag  OUT NOCOPY VARCHAR2) IS
4392 
4393 TYPE tExprNodeTbl IS TABLE OF cz_expression_nodes%ROWTYPE INDEX BY BINARY_INTEGER; --Not Used Anywhere, we should remove this.
4394 TYPE tNumber IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4395 TYPE tNumArrayVc2 IS TABLE OF NUMBER INDEX BY VARCHAR2(15); -- New Array defined
4396 TYPE tExprType IS TABLE OF cz_expression_nodes.expr_type%TYPE INDEX BY BINARY_INTEGER;
4397 
4398 l_children_index tNumArrayVc2;
4399 l_number_of_children tNumArrayVc2;
4400 l_index_by_expr_node_id tNumArrayVc2;
4401 l_param_index tNumber;
4402 l_seq_nbr tNumber;
4403 l_expr_node_id tNumber;
4404 l_expr_parent_id tNumber;
4405 l_expr_type tExprType;
4406 l_template_id tNumber;
4407 l_ps_node_id tNumber;
4408 
4409 l_children number;
4410 
4411 CURSOR C1 IS
4412 SELECT param_index, seq_nbr, expr_type, expr_node_id,
4413 expr_parent_id,template_id, ps_node_id
4414 FROM cz_expression_nodes
4415 WHERE rule_id = p_rule_id
4416 AND deleted_flag = '0'
4417 ORDER BY expr_parent_id, seq_nbr;
4418 
4419 BEGIN
4420 
4421   FND_MSG_PUB.initialize;
4422 
4423   x_inst_flag := NULL;
4424   x_sys_prop := NULL;
4425   x_validation_flag := YES_FLAG;
4426 
4427   OPEN C1;
4428   FETCH C1 BULK COLLECT INTO l_param_index, l_seq_nbr,l_expr_type,
4429   l_expr_node_id, l_expr_parent_id, l_template_id, l_ps_node_id;
4430   CLOSE C1;
4431   IF (l_expr_node_id.COUNT = 0) THEN
4432    RETURN;
4433   END IF;
4434 
4435   FOR i IN l_expr_parent_id.FIRST..l_expr_parent_id.LAST LOOP
4436        IF(l_expr_parent_id(i) IS NOT NULL) THEN
4437          IF(l_number_of_children.EXISTS(l_expr_parent_id(i))) THEN
4438            l_number_of_children(l_expr_parent_id(i)) := l_number_of_children(l_expr_parent_id(i)) + 1;
4439          ELSE
4440            l_number_of_children(l_expr_parent_id(i)) := 1;
4441          END IF;
4442          IF(NOT l_children_index.EXISTS(l_expr_parent_id(i)))THEN
4443            l_children_index(l_expr_parent_id(i)) := i;
4444          END IF;
4445        END IF;
4446        --Add the indexing option.
4447        l_index_by_expr_node_id(l_expr_node_id(i)) := i;
4448   END LOOP;
4449 
4450   IF (l_template_id(l_expr_node_id.COUNT) = 22) THEN /* simple numeric rule */
4451     FOR i IN 1..l_expr_node_id.COUNT lOOP
4452       IF (l_param_index(i)=5) THEN
4453         IF (l_children_index.EXISTS(l_expr_node_id(i))) THEN
4454           l_children := l_number_of_children(l_expr_node_id(i));
4455           FOR j IN l_children_index(l_expr_node_id(i))..l_children_index(l_expr_node_id(i)) + l_children LOOP
4456             IF (l_expr_type(j) IN (207,210) AND l_template_id(j) IN (43,44)) THEN
4457               FOR k IN (SELECT instantiable_flag FROM cz_ps_nodes
4458                         WHERE ps_node_id = l_ps_node_id(i)
4459                         AND deleted_flag = NO_FLAG) LOOP
4460                  IF (k.instantiable_flag = '2') THEN
4461                     IF (l_template_id(j) = 43) THEN
4462                       x_sys_prop := MIN_RULE;
4463                     ELSE
4464                       x_sys_prop := MAX_RULE;
4465                     END IF;
4466                     x_inst_flag := TO_NUMBER(k.instantiable_flag);
4467                     x_validation_flag := NO_FLAG;
4471                     x_validation_flag := NO_FLAG;
4468                  ELSIF (l_template_id(j) = 44 AND k.instantiable_flag = '1') THEN
4469                     x_sys_prop := MAX_RULE;
4470                     x_inst_flag := TO_NUMBER(k.instantiable_flag);
4472                  END IF;
4473               END LOOP;
4474             END IF;
4475                IF (x_validation_flag = NO_FLAG) THEN
4476                  EXIT;
4477                END IF;
4478           END LOOP;
4479         END IF;
4480       END IF;
4481          IF (x_validation_flag = NO_FLAG) THEN
4482             EXIT;
4483          END IF;
4484     END LOOP;
4485   ELSIF (l_template_id(l_expr_node_id.COUNT) IS NULL) THEN  /* statement rule, Developer must call parser */
4486     x_validation_flag := NULL;
4487   END IF;
4488 END check_Inst_Rule;
4489 
4490 END;