| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667 |
- <?php
- class crm_proces_paser {
- // var $this->get_proces_init=array();
- // [proces_init] - A
- // [step] - flat 0
- // [step] - flat 3 , tree 2 , cut
- // [step] - flat 0 , tree 0
- // [step] - flat 1 , tree 1
- // [step] - flat 1 , tree 1
- // [step] - flat 0 , tree 0
- // [step] - flat 1 , tree 1
- // [step] - flat 0 , tree 0
-
-
- //funckcja do szukania proces_init
- function get_proces_init($id_proces) {
- $sql= "select p.`ID`,p.`DESC` from `CRM_PROCES` as p
- LEFT JOIN _CRM_PROCES_INIT_STATS AS cs ON cs.ID = p.ID
- where p.`A_STATUS` in('WAITING','NORMAL') and p.`TYPE`='PROCES_INIT'
- and (cs.`path` like '%/".$id_proces."/%' or cs.`path` like '%/".$id_proces."' or cs.`path` like '".$id_proces."/%' )
- ";
- // echo $sql;
- $res=DB::query($sql);
- while($h=DB::fetch($res)) {
- $this->get_proces_init[]=$h->ID;
- }
- return $this->get_proces_init;
-
- }
- function build_proces_init_tree($id_proces) {
- // $tree->Childs[$id_proces]=true;
- $tree->Childs[$id_proces]->PARENT=0;
- $tree->Childs[$id_proces]->SOURCE='build_tree_for_proces';
- $tree->Parents[0]->CHILD[$id_proces]=$id_proces;
- $obj=DB::get_by_id('CRM_PROCES',$id_proces);
- $tree->Childs[$id_proces]->TYPE=$obj->TYPE;
- // echo "here".$id_proces;
- self::build_tree_for_proces($tree,$id_proces,$id_proces);
- return $tree;
- }
-
- function build_tree_for_proces(&$tree,$cursor,$init_once=null) {
- if(!empty($init_once)) $sql_or=" or ID={$init_once} "; else $sql_or="";
- $sql="select `ID`,`IF_TRUE_GOTO`,`IF_TRUE_GOTO_FLAG` , `TYPE` from `CRM_PROCES` where ( PARENT_ID={$cursor} {$sql_or} ) and `A_STATUS` in ('WAITING','NORMAL')";
- // echo "<br>sql: ".$sql;
- $res=DB::query($sql);
- while ($h=DB::fetch($res)) {
- if(empty($init_once)) $tree->Childs[$h->ID]->PARENT=$cursor; //wyzwolenie tylko pozniejsze
- if(empty($init_once)) $tree->Parents[$cursor]->CHILD[$h->ID]=$h->ID;
- $tree->Childs[$h->ID]->TYPE=$h->TYPE;
- $tree->Childs[$h->ID]->SOURCE='build_tree_for_proces';
- if($h->IF_TRUE_GOTO>0) {
- $tree->Childs[$h->ID]->GOTO_FLAG=$h->IF_TRUE_GOTO_FLAG;
- $tree->Childs[$h->ID]->IF_TRUE_GOTO=$h->IF_TRUE_GOTO;
- $tree->Childs[$h->IF_TRUE_GOTO]->IS_EXECUTED_BY[$h->ID]=$h->ID;
- }
- self::build_tree_for_proces($tree,$h->ID,null);
- }
- }
- function build_tree_flat_info(&$tree,$flat) {
- /* >> zbudowanie ile ma dzieci <<
- $tree->Childs[3208] => stdClass Object
- (
- [PARENT] => 3123
- [CHILD] => Array
- (
- >> [3219] => 1 <<
- >> [3237] => 0 <<
- >> [3209] => 0 <<
-
- */
- foreach($tree->Childs as $id=>$obj) {
- //sprawdzmy czy nasz parent wymaga wyswietlenia osobnego podkroku w widoku szczegolowego procesu
- foreach($tree->Parents[$id]->CHILD as $child) {
- $tree->Childs[$id]->CHILD[$child]=count($tree->Parents[$child]->CHILD);
- }
- }
- }
-
-
- function detect_tree_where_to_detail_cut(&$tree,$flag_not_to_cut=null) {
- foreach($tree->Childs as $id=>$obj) {
- //sprawdzmy czy nasz parent wymaga wyswietlenia osobnego podkroku w widoku szczegolowego procesu
- $control=0;
- foreach($obj->CHILD as $child) {
- if($child>0) $control++;
- }
- if(empty($flag_not_to_cut)) {
-
- if($control>1) $tree->Childs[$id]->TO_DETAIL_CUT_FLAG=true; //przeciecie jezeli jest wiecej wyjsc niz jedno z zaglebieniami
- //przeciecie, jezeli jest wyjscie z kroku procesu do innego
- if(isset($tree->Childs[$id]->GOTO_FLAG)) $tree->Childs[$id]->TO_DETAIL_CUT_FLAG=true;
- //trzeba zbadac tez czy nie jest do niego dowiazywany w jakims miejscu proces
- if(isset($tree->Childs[$id]->IS_EXECUTED_BY)) { $tree->Childs[$id]->TO_DETAIL_CUT_FLAG=true;
- //echo "<br> Is executed by CUT!";
- }
- } else $tree->Childs[$id]->NO_CUT_FLAG=true;
- }
- }
- function search_parent_ids_till_cut(&$tree,$init,&$find) {
- //szukam lancuchow do optymalizacji do miejsca flagi CUT, kojarzac od razu linki
- if(isset($tree->Childs[$init]->TO_DETAIL_CUT_FLAG)) {
- //if(!empty($find))
- //if($init==2444)
- self::zoom_process_links($tree,$init,$init);
- }
- // $tree->Viev_Zpc_Parent_cut[$init]=$find[0];
- if(!isset($tree->Childs[$init]->TO_DETAIL_CUT_FLAG)) {
-
- $find[]=$init;
- self::zoom_process_links($tree,$init,$find[0]);
- foreach($tree->Childs[$init]->CHILD as $id=>$count) {
- self::search_parent_ids_till_cut($tree,$id,$find);
- }
- } //else
- // return $find;
- }
-
- function zoom_process_links($tree,$id,$root_id) {
- //dobudowuje znaczniki dotyczace LINKOW oraz brakujace ID z tym zwiazane
- //echo "<br>testuje zoom dla ".$id." root:".$root_id;
- if(isset($tree->Childs[$id]->GOTO_FLAG)) {
- if(isset( $tree->Childs[$tree->Childs[$id]->IF_TRUE_GOTO])) {
- //adding internal link to the same process
- //TODO trzeba przemyslec, czy dowiazywac linki do zagregowanych krokow, czy trzeba robic cut w tych miejscach - na ten moment domyslnie CUT
- // if(empty($tree->Childs[$id]->NO_CUT_FLAG)) //tylko linki zewnetrzne jak flaga NOCUT!
- //echo "... dodaje 218: ".$tree->Childs[$id]->IF_TRUE_GOTO;
- if(isset($tree->Childs[$tree->Childs[$id]->IF_TRUE_GOTO]->SOURCE)) {
- $tree->Viev_Zpc[$root_id]->INTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO;
- //echo "dodalem Linka dla ".$root_id;
- } else { //echo "To jest link external - bo referencyjny ID{$tree->Childs[$id]->IF_TRUE_GOTO}nie byl w procesie";
- $tree->Viev_Zpc[$root_id]->EXTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO;
- }
-
- } else { //echo "<br>Links zewnetrzny do ".$id." - ".$tree->Childs[$id]->IF_TRUE_GOTO;
- $tree->Viev_Zpc[$root_id]->EXTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO;
- //$tree->Viev_Zpc_found[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO; //zeby tego rekordu nie przetwarzal ? TODO ?
- $obj=DB::get_by_id('CRM_PROCES',$tree->Childs[$id]->IF_TRUE_GOTO);
- $tree->Viev_Zpc[$tree->Childs[$id]->IF_TRUE_GOTO]->DESC="{".$obj->ID."}".substr($obj->DESC,0,50);
- if($tree->Childs[$id]->GOTO_FLAG=='GOTO_AND_RETURN') { //dodanie zwrotnej strzalki TODO dac inny typ strzalki!!
- $tree->Viev_Zpc[$tree->Childs[$id]->IF_TRUE_GOTO]->EXTERNAL_LINK[$root_id]=$root_id;
- //echo "<br> GOTO_AND_RETURN!!!".$tree->Childs[$id]->IF_TRUE_GOTO." -- ".$root_id;
- }
-
- }
- }
-
- }
-
- function build_path_zoom_proces_cut(&$tree,$init,$path_zpc=array()) {
- //funkcja do pokazania procesow wyplaszczonych, z wypunktowanymi rozgalezieniami - buduje drzewo w sposob inteligentny
- //szukam rekordow z gory do pierwszego CUT
- foreach($tree->Childs as $id=>$obj) {
- if(!isset($tree->Viev_Zpc_found[$id])) {
- //echo "<br>szukam parentow dla ".$id;
- self::search_parent_ids_till_cut($tree,$id,$find);
- // echo "<br>find:238 for id {$id} ".implode(',', $find)." EOL. ";
- if(empty($find)) { //echo " - Find empty for ".$id." adding ".$tree->Childs[$id]->PARENT;
- //trzeba przeskanowac w find jest dany parent -> Viev_Zpc_found
- // if(isset($tree->Childs[$id]->PARENT))
- // $tree->Viev_Zpc_Parent[$id]=$tree->Childs[$id]->PARENT;
- }
- foreach($find as $find_id) {
- $tree->Viev_Zpc_found[$find_id]=$find[0];
- if($find_id<>$find[0]) $tree->Viev_Zpc_Parent[$find_id]=$find[0]; //todo moze byc to z bledem jak nadrzedny bedzie zbitym ciagiem
- else $tree->Viev_Zpc_Parent[$find_id]=$tree->Childs[$find_id]->PARENT;
- }
- $tree->Viev_Zpc[$id]->PATH=$find;
- //wykrycie parenta polega na znalezieniu jego naturalnego parenta i poszukaniu w ktorej jest grupie
- //$tree->Viev_Zpc[$id]->PARENT=$tree->Viev_Zpc_Parent[$tree->Childs[$id]->PARENT] ;
- $obj=DB::get_by_id('CRM_PROCES',$id);
- $tree->Viev_Zpc[$id]->DESC="{".$id."}".substr($obj->DESC,0,50)."...";
- unset($find);
- }
-
-
- }
- //parenty trzeba zrobic za drugim rzutem
- foreach($tree->Viev_Zpc as $id=>$obj) {
- // echo "<br>256 wykrywam parenta dla {$id}";
- {
- //skanujemy wszystkie rekordy w Viev_Zpc w celu znalezienia czy danego ID parent nie jest w ktoryms z ID - tego szukamy
- if(!isset($obj->PARENT)) //tylko dla tych ktore nie maja parentow
- foreach($tree->Viev_Zpc as $id_=>$obj_) {
- if(isset($tree->Childs[$id_]->SOURCE))
- if(in_array($tree->Childs[$id]->PARENT, $obj_->PATH)) {
- // echo "<br>206 Skanuje dla brakujacego parenta dla ".$id." i znalazlem".$id_;
- $tree->Viev_Zpc[$id]->PARENT=$id_;
- } //else echo "<br> 199: nie znalazlem w ".$id_." path:".implode(',', $obj_->PATH);
- }
-
- if(!isset($tree->Viev_Zpc[$id]->PARENT)) { //jezeli nie znaleziono ta metoda to znaczy ze parent jest naturalny
- $tree->Viev_Zpc[$id]->PARENT=$tree->Childs[$id]->PARENT;
- // echo " - 204 ustawilem ostatecznie ".$tree->Childs[$id]->PARENT;
- }
-
- }
-
- }
-
-
- }
-
-
- }
- function GRAPH_VIEW_PROCES() {
- $id_proces = V::get('id_proces', '', $_REQUEST, 'int');
- // $id_proces = $_REQUEST['id_proces'];
- //TOOD bug funkcji V nie mozna dac INT=0!!!
- // if (empty($id_proces)) {
- // echo'<p class="err box box-red">'."Wrong ID".'</p>';
- // return;
- // }
- $db = DB::getDB();
- //$proces = $db->get_by_id('CRM_PROCES', $id_proces);
- //if (empty($proces)) {
- // echo'<p class="err box box-red">'."Process {$id_proces} not exists".'</p>';
- // return;
- //}
- $ajaxTask = V::get('ajaxTask', '', $_REQUEST);
- if ($ajaxTask == 'getInfo') {
- $id = V::get('id', 0, $_REQUEST, 'int');
- if ($id > 0) {
- //TODO najlepiej wyslac to od razu w jsonie i przekazac jakos do uzycia do wykresu!
- $step = $db->get_by_id('CRM_PROCES', $id);
- $cp=new crm_proces_paser;
- $tree=$cp->build_proces_init_tree($id);
- $cp->build_tree_flat_info($tree,null);
- $cp->detect_tree_where_to_detail_cut($tree);
- $cp->build_path_zoom_proces_cut($tree,$id);
- //echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($step);echo'</pre>';
- ?>
- <?php if($step->TYPE=='PROCES_INIT') echo "<a href=?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces={$step->PARENT_ID}&PROCES_INIT_SCAN=1>Widok mapy {$step->PARENT_ID}</a>"; ?>
- <p><code><?php echo "<a href=?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces={$id}>".$step->ID."</a> - ".$step->DESC; ?></code> <?php echo $step->DESC; ?></p>
- <p><?php echo $step->OPIS; ?></p>
- <?php foreach ($tree->Viev_Zpc[$id]->PATH as $ind=>$id_include) {
- if($ind==0) continue; //pierwszy wiersz wyswietlony wyzej
- $step = $db->get_by_id('CRM_PROCES', $id_include);
- echo "<p><b>".$step->ID."</a> - ".$step->DESC."</b> <font size=-3>".$step->OPIS."</font></p>";
- } ?>
- <?php
- }
- exit;
- }
- $graph = new stdClass();
- $graph->htmlID = 'graph_proces_id_' . $id_proces;
- $graph->procesTreeFlat = array();
- $graph->procesTreeGoto = array();
- $graph->treeItems = array();
- $graph->elements = new stdClass();
- $graph->elements->nodes = array();
- $graph->elements->edges = array();
- /* elements: {
- nodes: [
- { data: { id: 'j', name: 'Jerry' } },
- { data: { id: 'e', name: 'Elaine' } },
- { data: { id: 'k', name: 'Kramer' } },
- { data: { id: 'g', name: 'George' } }
- ],
- edges: [
- { data: { source: 'j', target: 'e' } },
- { data: { source: 'j', target: 'k' } },
- { data: { source: 'j', target: 'g' } },
- { data: { source: 'e', target: 'j' } },
- { data: { source: 'e', target: 'k' } },
- { data: { source: 'k', target: 'j' } },
- { data: { source: 'k', target: 'e' } },
- { data: { source: 'k', target: 'g' } },
- { data: { source: 'g', target: 'j' } }
- ]
- },
- */
- function graph__addNodeID($id, &$graph,$name=null,$path,$parent=null,$type) {
- if (!array_key_exists($id, $graph->treeItems)) {
- $graph->treeItems[$id]= true;
- if(empty($name)) $name=$id;
- if(!empty($path)) { $name=$name." ".implode(',', $path);// $path=array();
- }
- //DEBUG_S(-3,'added id,name,path,parent',array($id,$name,$path,$parent),__FILE__,__FUNCTION__,__LINE__);
- if($type=='PROCES_INIT') $type_init='procesInit'; else $type_init=null;
- //echo $type_init.$id;
- $graph->elements->nodes[] = array('data'=>array('id'=>"".$id."", 'name'=>$name , 'type'=>$type_init));
-
- //echo "<br> w AddNode:ID".$id." parent".$parent;
- }
- if(!empty($parent)) $graph->elements->edges[] = array('data'=>array('source'=>$parent, 'target'=>$id ));
- }
-
-
-
-
-
-
- $PROCES_INIT_SCAN = V::get('PROCES_INIT_SCAN', '', $_REQUEST, 'int');
- if(!empty($PROCES_INIT_SCAN)) {
- //mapa procesow
-
- $cp=new crm_proces_paser;
- $PROCES_INIT_SCAN_STANOWISKO = V::get('PROCES_INIT_SCAN_STANOWISKO', '', $_REQUEST, 'int');
- $PROCES_INIT_SCAN_USER = V::get('PROCES_INIT_SCAN_USER', '', $_REQUEST, 'int');
-
-
- if(!empty($PROCES_INIT_SCAN_STANOWISKO)) {
- Lib::loadClass('ProcesHelper');
- $proces_list_obj = ProcesHelper::get_procesy_by_stanowiska( array($PROCES_INIT_SCAN_STANOWISKO) );
- foreach($proces_list_obj as $obj) {
- $init[$obj->ID]=$obj->ID;
- }
- } else if(!empty($PROCES_INIT_SCAN_USER)) {
- Lib::loadClass('UsersHelper');
- $proces_list_obj = UsersHelper::get_group_by_user($PROCES_INIT_SCAN_USER,array('SHOW_IN_PERIOD_MARK'=>'YES'));
- //echo "here";
- foreach($proces_list_obj as $obj) {
- $init[$obj->ID]=$obj->ID;
- }
- } else {
- $init=$cp->get_proces_init($id_proces);
- }
-
- DEBUG_S(3,'lista procesow init',$init);
- foreach($init as $id_proces) {
- $tree=$cp->build_proces_init_tree($id_proces);
- $cp->build_tree_flat_info($tree,null);
- $cp->detect_tree_where_to_detail_cut($tree,'nocut');
- $cp->build_path_zoom_proces_cut($tree,$id_proces);
- DEBUG_S(3,'get_proces_init',$init);
- DEBUG_S(3,'tree->childs',$tree->Childs);
- DEBUG_S(3,'tree->Parents',$tree->Parents);
- DEBUG_S(3,'tree->Viev_Zpc',$tree->Viev_Zpc);
- DEBUG_S(3,'tree->Viev_Zpc_Parent',$tree->Viev_Zpc_Parent);
-
- graph__addNodeID(0, $graph,$name=null,$path,null);
- foreach($tree->Viev_Zpc as $id=>$obj) {
- graph__addNodeID($id, $graph,$obj->DESC,null,((isset($obj->PARENT)) ? $obj->PARENT : null),$tree->Childs[$id]->TYPE);
- // foreach($obj->INTERNAL_LINK as $link) graph__addNodeID($id, &$graph,$tree->Viev_Zpc[$link]->DESC,null,$link,null);
- foreach($obj->EXTERNAL_LINK as $link) graph__addNodeID($link, $graph,$tree->Viev_Zpc[$link]->DESC,null,$id,'PROCES_INIT');
-
- }
- unset($tree);
- }
-
-
- }else {
- //dokladnie 1 proces
- $cp=new crm_proces_paser;
- $tree=$cp->build_proces_init_tree($id_proces);
- $cp->build_tree_flat_info($tree,null);
- $cp->detect_tree_where_to_detail_cut($tree);
- $cp->build_path_zoom_proces_cut($tree,$id_proces);
- DEBUG_S(3,'get_proces_init',$init);
- DEBUG_S(3,'tree->childs',$tree->Childs);
- DEBUG_S(3,'tree->Parents',$tree->Parents);
- DEBUG_S(3,'tree->Viev_Zpc',$tree->Viev_Zpc);
- DEBUG_S(3,'tree->Viev_Zpc_Parent',$tree->Viev_Zpc_Parent);
- DEBUG_S(3,'tree->Viev_Zpc_Parent_cut',$tree->Viev_Zpc_Parent_cut);
- DEBUG_S(3,'tree->Viev_Zpc_found',$tree->Viev_Zpc_found);
- graph__addNodeID(0, $graph,$name=null,$path,null);
- foreach($tree->Viev_Zpc as $id=>$obj) {
- //echo "<br> tst edg:".$id." / ".$tree->Childs[$id]->PARENT;
- // : $tree->Viev_Zpc[$tree->Childs[$id]->PARENT])
- graph__addNodeID($id, $graph,$obj->DESC,null,((isset($obj->PARENT)) ? $obj->PARENT : null),$tree->Childs[$id]->TYPE);
- foreach($obj->INTERNAL_LINK as $link) graph__addNodeID($id, $graph,$tree->Viev_Zpc[$link]->DESC,null,$link,null);
- foreach($obj->EXTERNAL_LINK as $link) graph__addNodeID($link, $graph,$tree->Viev_Zpc[$link]->DESC,null,$id,'PROCES_INIT');
-
- }
-
- }
-
-
-
-
- /*
- $db = DB::getDB();
-
- $sql= "select p.`ID`,`DESC` from `CRM_PROCES` as p where p.`A_STATUS` in('WAITING','NORMAL') and p.`TYPE`='PROCES_INIT' and ID=994 limit 1";
- $res=DB::query($sql);
- while($h=DB::fetch($res)) {
- SearchParentsWithExits($h->ID,$h->ID,$graph,'Proces '.$h->ID,0);
- //graph__addNodeID($h->ID, $graph);
- graph__addNodeID('1', $graph,'1');
- // graph__addNodeID($h->ID, $graph,$h->ID);
- // graph__addNodeID('100', $graph,'100');
- //$graph->treeItems[$h->ID] = true;
- //$graph->treeItems[101] = true;
- // $graph->elements->nodes[] = array('data'=>array('id'=>$h->ID, 'name'=>$h->ID , 'type'=>'procesInit'));
- // $graph->elements->nodes[] = array('data'=>array('id'=>101, 'name'=>101 , 'type'=>'procesInit'));
- // $graph->elements->edges[] = array('data'=>array('source'=>994, 'target'=>101));
- }
- */
- foreach($graph->elements->nodes as $var) {
- // echo "<br>\n NODE".$var[data][id];
- $nodes[$var[data][id]]=$var[data][id];
- }
- foreach($graph->elements->edges as $var) {
- //echo "<br>\n".$var[data][source]." ".$var[data][target]." ";
- if(!isset($nodes[$var[data][source]])) echo "<br>FAIL1 ".$var[data][source];
- if(!isset($nodes[$var[data][target]])) echo "<br>FAIL2 ".$var[data][target];
- }
- DEBUG_S(3,'nodes',$graph->elements->nodes);
- DEBUG_S(3,'edges',$graph->elements->edges);
- /*
- $sql = "select p.`ID`, p.`PARENT_ID`
- from `CRM_PROCES` as p
- where p.`A_STATUS` in('WAITING','NORMAL')
- ";
- $res = $db->query($sql);
- while ($r = $db->fetch($res)) {
- $graph->procesTreeFlat[$r->PARENT_ID] []= $r->ID;
- }
- $sql = "select p.`IF_TRUE_GOTO` as ID, p.`ID` as PARENT_ID
- from `CRM_PROCES` as p
- where p.`A_STATUS` in('WAITING','NORMAL')
- and p.IF_TRUE_GOTO>0
- -- and p.IF_TRUE_GOTO_FLAG='GOTO_AND_RETURN'
- ";
-
- $res = $db->query($sql);
- while ($r = $db->fetch($res)) {
- $graph->procesTreeGoto[$r->PARENT_ID] []= $r->ID;
- }
- function createGraphRec($id, $tree, &$graph, $lvl = 0) {
- $graph->treeItems[$id] = true;
- settype($id, 'string');
- if ($id == 3122) {
- $graph->elements->nodes[] = array('data'=>array('id'=>$id, 'name'=>$id, 'type'=>'procesInit', 'lvl'=>$lvl));
- } else {
- $graph->elements->nodes[] = array('data'=>array('id'=>$id, 'name'=>$id, 'lvl'=>$lvl));
- }
- if ($lvl > 1) {
- // return;
- }
- if (!empty($tree[$id])) {
- foreach ($tree[$id] as $vChildID) {
- $graph->elements->edges[] = array('data'=>array('source'=>$id, 'target'=>$vChildID));
- createGraphRec($vChildID, $tree, $graph, $lvl + 1);
- }
- }
- }
- createGraphRec($id_proces, $graph->procesTreeFlat, $graph);
- */
- /*
- // addGraphGoto
- foreach ($graph->procesTreeGoto as $kID => $vGotoIds) {
- //$graph->treeItems[$id] = true;
- if (array_key_exists($kID, $graph->treeItems)) {
- foreach ($vGotoIds as $vGotoID) {
- graph__addNodeID($vGotoID, $graph);
- $graph->elements->edges[] = array('data'=>array('source'=>$kID, 'target'=>$vGotoID, 'type'=>'GOTO'));
- }
- } else {
- foreach ($vGotoIds as $vGotoID) {
- if (array_key_exists($vGotoID, $graph->treeItems)) {
- //echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r("TODO: add node ($kID); add edge from $kID to $vGotoID");echo'</pre>';
- graph__addNodeID($kID, $graph);
- //$graph->elements->edges[] = array('data'=>array('source'=>$kID, 'target'=>$vGotoID, 'type'=>'GOTO'));
- }
- }
- }
- }
- */
- ?>
- <style type="text/css">
- #<?php echo $graph->htmlID; ?>_wrap {
- position:relative;
- width:1100px;
- margin:0 auto;
- border:1px solid #ccc;
- }
- #<?php echo $graph->htmlID; ?> {
- height:560px;
- border-bottom:1px solid #ccc;
- }
- #<?php echo $graph->htmlID; ?>_info {
- padding:3px;
- }
- #<?php echo $graph->htmlID; ?>_wrap .actions { position:absolute; top:20px; left:-40px; margin:0; padding:0; list-style:none; }
- #<?php echo $graph->htmlID; ?>_wrap .actions button { border-radius:0; background:#fff; border:1px solid #ccc; }
- </style>
- <script src="./stuff/cytoscape.js/arbor.js"></script>
- <script src="./stuff/cytoscape.js/cytoscape.js"></script>
- <script>
- jQuery(loadInfo = function(nodeID){
- $.ajax({
- url: 'index.php?MENU_INIT=GRAPH_VIEW_PROCES&id_proces=<?php echo $id_proces; ?>&ajaxTask=getInfo&id=' + nodeID + '&HEADER_NOT_INIT=YES',
- type: 'GET',
- dataType: 'text',
- data: '',
- async: true,
- success: function (data) {
- jQuery('#<?php echo $graph->htmlID; ?>_info').html(data);
- },
- error: function (err) {
- console.log('err');
- }
- });
- });
- jQuery(loadCy = function(){
- jQuery('#<?php echo $graph->htmlID; ?>').cytoscape({
- layout: {
- name: 'arbor'
- },
- style: cytoscape.stylesheet()
- .selector('node')
- .css({
- 'shape': 'rectangle',
- 'width': '100px', 'height': '8px',
- 'font-size': '10px',
- 'content': 'data(name)',
- 'text-valign': 'center',
- 'color': 'white',
- 'text-outline-width': 2,
- 'text-outline-color': '#888'
- })
- .selector('edge')
- .css({
- 'target-arrow-shape': 'triangle'
- })
- .selector(':selected')
- .css({
- 'background-color': 'black',
- 'line-color': 'black',
- 'target-arrow-color': 'black',
- 'source-arrow-color': 'black'
- })
- .selector('.faded')
- .css({
- 'opacity': 0.25,
- 'text-opacity': 0
- })
- .selector('edge.neighborhood')
- .css({
- 'background-color': 'blue',
- 'color': 'orange'
- })
- .selector('node.procesInit')
- .css({
- 'background-color': 'red',
- 'text-outline-color': 'red',
- 'font-weight': 'bold'
- }),
- elements: <?php echo json_encode($graph->elements); ?>,
- ready: function(){
- var cy = this;
- window.cy_<?php echo $graph->htmlID; ?> = this;
- cy.elements("node[type = 'procesInit']").addClass('procesInit');
- cy.elements("node[lvl > 1]").hide();
- cy.elements().unselectify();
- cy.on('tap', 'node', function(e){
- //console.log('on tap node', e)
- var node = e.cyTarget;
- var neighborhood = node.neighborhood().add(node);
- var nodeID = node.id();
- loadInfo(nodeID);
- cy.elements().addClass('faded').unselect();
- neighborhood.removeClass('faded');
- node.select();
- cy.edges().removeClass('neighborhood');
- node.connectedEdges().addClass('neighborhood');
- neighborhood.show();
- cy.center(neighborhood);
- });
- cy.on('tap', function(e){
- if (e.cyTarget === cy){
- cy.elements().removeClass('faded');
- }
- });
- },
- showOverlay: false
- });
- });
- jQuery(document).ready(function(){
- loadCy();
- var parent = $('#<?php echo $graph->htmlID; ?>')
- .parent()
- parent.find('.actions .cy-refresh')
- .on('mousedown touchstart', function(){
- loadCy();
- cy.attr('style', '');
- });
- parent.find('.actions .cy-zoom-plus')
- .on('mousedown touchstart', function(){
- window.cy_<?php echo $graph->htmlID; ?>.zoom(window.cy_<?php echo $graph->htmlID; ?>.zoom() + 0.1);
- });
- parent.find('.actions .cy-zoom-minus')
- .on('mousedown touchstart', function(){
- window.cy_<?php echo $graph->htmlID; ?>.zoom(window.cy_<?php echo $graph->htmlID; ?>.zoom() - 0.1);
- });
- });
- </script>
- <div id="<?php echo $graph->htmlID; ?>_wrap">
- <div id="<?php echo $graph->htmlID; ?>"></div>
- <div id="<?php echo $graph->htmlID; ?>_info"></div>
- <ul class="actions">
- <li><button class="btn cy-refresh"><i title="Refresh" class="ico-refresh"></i></button></li>
- <li><button class="btn cy-zoom-plus"><i title="Zoom +" class="ico-plus"></i></button></li>
- <li><button class="btn cy-zoom-minus"><i title="Zoom -" class="ico-minus"></i></button></li>
- </ul>
- </div>
- <?php
- }
|