superedit-GRAPH_VIEW_PROCES.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. <?php
  2. class crm_proces_paser {
  3. // var $this->get_proces_init=array();
  4. // [proces_init] - A
  5. // [step] - flat 0
  6. // [step] - flat 3 , tree 2 , cut
  7. // [step] - flat 0 , tree 0
  8. // [step] - flat 1 , tree 1
  9. // [step] - flat 1 , tree 1
  10. // [step] - flat 0 , tree 0
  11. // [step] - flat 1 , tree 1
  12. // [step] - flat 0 , tree 0
  13. //funckcja do szukania proces_init
  14. function get_proces_init($id_proces) {
  15. $sql= "select p.`ID`,p.`DESC` from `CRM_PROCES` as p
  16. LEFT JOIN _CRM_PROCES_INIT_STATS AS cs ON cs.ID = p.ID
  17. where p.`A_STATUS` in('WAITING','NORMAL') and p.`TYPE`='PROCES_INIT'
  18. and (cs.`path` like '%/".$id_proces."/%' or cs.`path` like '%/".$id_proces."' or cs.`path` like '".$id_proces."/%' )
  19. ";
  20. // echo $sql;
  21. $res=DB::query($sql);
  22. while($h=DB::fetch($res)) {
  23. $this->get_proces_init[]=$h->ID;
  24. }
  25. return $this->get_proces_init;
  26. }
  27. function build_proces_init_tree($id_proces) {
  28. // $tree->Childs[$id_proces]=true;
  29. $tree->Childs[$id_proces]->PARENT=0;
  30. $tree->Childs[$id_proces]->SOURCE='build_tree_for_proces';
  31. $tree->Parents[0]->CHILD[$id_proces]=$id_proces;
  32. $obj=DB::get_by_id('CRM_PROCES',$id_proces);
  33. $tree->Childs[$id_proces]->TYPE=$obj->TYPE;
  34. // echo "here for ".$id_proces;
  35. self::build_tree_for_proces($tree,$id_proces,$id_proces);
  36. return $tree;
  37. }
  38. function build_tree_for_proces(&$tree,$cursor,$init_once=null) {
  39. if(!empty($init_once)) $sql_or=" or cp.ID={$init_once} "; else $sql_or="";
  40. $sql="select cp.`ID`,cp.`IF_TRUE_GOTO`,cp.`IF_TRUE_GOTO_FLAG` , cp.`TYPE` from `CRM_PROCES` as cp
  41. where ( cp.PARENT_ID={$cursor} {$sql_or} ) and cp.`A_STATUS` in ('WAITING','NORMAL')";
  42. // echo "<br>sql: ".$sql;
  43. $res=DB::query($sql);
  44. while ($h=DB::fetch($res)) {
  45. if(empty($init_once)) $tree->Childs[$h->ID]->PARENT=$cursor; //wyzwolenie tylko pozniejsze
  46. if(empty($init_once)) $tree->Parents[$cursor]->CHILD[$h->ID]=$h->ID;
  47. $tree->Childs[$h->ID]->TYPE=$h->TYPE;
  48. $tree->Childs[$h->ID]->SOURCE='build_tree_for_proces';
  49. if($h->IF_TRUE_GOTO>0) {
  50. $tree->Childs[$h->ID]->GOTO_FLAG=$h->IF_TRUE_GOTO_FLAG;
  51. $tree->Childs[$h->ID]->IF_TRUE_GOTO=$h->IF_TRUE_GOTO;
  52. $tree->Childs[$h->IF_TRUE_GOTO]->IS_EXECUTED_BY[$h->ID]=$h->ID;
  53. }
  54. self::build_tree_for_proces($tree,$h->ID,null);
  55. }
  56. }
  57. function get_resources_by_proceses_id($id_proces_obj,$id_proces,$filter_zasob) {
  58. $filter="";
  59. if( is_array($filter_zasob) ) $filter=" and cz.ID in (".implode(',', $filter_zasob).") " ;
  60. else if(!empty($filter_zasob)) $filter=" and cz.ID=".$filter_zasob ;
  61. $sql="select cz.ID,cz.PARENT_ID, cz.`DESC`,cz.`TYPE` , czp.`DESC` as DESC_czp, czp.`TYPE` as TYPE_czp
  62. from CRM_WSKAZNIK as cw
  63. left join CRM_LISTA_ZASOBOW as cz on cz.ID=cw.ID_ZASOB
  64. left join CRM_LISTA_ZASOBOW as czp on czp.ID=cz.PARENT_ID
  65. where cw.ID_PROCES in (".implode(',', array_keys($id_proces_obj)).") and cw.A_STATUS in ('NORMAL','WAITING')
  66. and czp.`TYPE` in ('TABELA') ".$filter." ";
  67. $res=DB::query($sql);
  68. while($h=DB::fetch($res)) {
  69. $found['ID'][$h->ID]['PARENT_ID']=$h->PARENT_ID;
  70. $found['ID'][$h->ID]['DESC']=$h->DESC;
  71. $found['PARENT_ID'][$h->PARENT_ID]=$h->DESC_czp;
  72. }
  73. // $this->get_resources_by_proceses_id->$id_proces=$found;
  74. // DEBUG_S(-3,'Found resources',$found,__FILE__,__FUNCTION__,__LINE__);
  75. return $found;
  76. }
  77. function build_tree_flat_info(&$tree,$flat) {
  78. /* >> zbudowanie ile ma dzieci <<
  79. $tree->Childs[3208] => stdClass Object
  80. (
  81. [PARENT] => 3123
  82. [CHILD] => Array
  83. (
  84. >> [3219] => 1 <<
  85. >> [3237] => 0 <<
  86. >> [3209] => 0 <<
  87. */
  88. foreach($tree->Childs as $id=>$obj) {
  89. //sprawdzmy czy nasz parent wymaga wyswietlenia osobnego podkroku w widoku szczegolowego procesu
  90. foreach($tree->Parents[$id]->CHILD as $child) {
  91. $tree->Childs[$id]->CHILD[$child]=count($tree->Parents[$child]->CHILD);
  92. }
  93. }
  94. }
  95. function detect_tree_where_to_detail_cut(&$tree,$flag_not_to_cut=null) {
  96. foreach($tree->Childs as $id=>$obj) {
  97. //sprawdzmy czy nasz parent wymaga wyswietlenia osobnego podkroku w widoku szczegolowego procesu
  98. $control=0;
  99. foreach($obj->CHILD as $child) {
  100. if($child>0) $control++;
  101. }
  102. if(empty($flag_not_to_cut)) {
  103. if($control>1) $tree->Childs[$id]->TO_DETAIL_CUT_FLAG=true; //przeciecie jezeli jest wiecej wyjsc niz jedno z zaglebieniami
  104. //przeciecie, jezeli jest wyjscie z kroku procesu do innego
  105. if(isset($tree->Childs[$id]->GOTO_FLAG)) $tree->Childs[$id]->TO_DETAIL_CUT_FLAG=true;
  106. //trzeba zbadac tez czy nie jest do niego dowiazywany w jakims miejscu proces
  107. if(isset($tree->Childs[$id]->IS_EXECUTED_BY)) { $tree->Childs[$id]->TO_DETAIL_CUT_FLAG=true;
  108. //echo "<br> Is executed by CUT!";
  109. }
  110. } else $tree->Childs[$id]->NO_CUT_FLAG=true;
  111. }
  112. }
  113. function search_parent_ids_till_cut(&$tree,$init,&$find) {
  114. //szukam lancuchow do optymalizacji do miejsca flagi CUT, kojarzac od razu linki
  115. if(isset($tree->Childs[$init]->TO_DETAIL_CUT_FLAG)) {
  116. //if(!empty($find))
  117. //if($init==2444)
  118. self::zoom_process_links($tree,$init,$init);
  119. }
  120. // $tree->Viev_Zpc_Parent_cut[$init]=$find[0];
  121. if(!isset($tree->Childs[$init]->TO_DETAIL_CUT_FLAG)) {
  122. $find[]=$init;
  123. self::zoom_process_links($tree,$init,$find[0]);
  124. foreach($tree->Childs[$init]->CHILD as $id=>$count) {
  125. self::search_parent_ids_till_cut($tree,$id,$find);
  126. }
  127. } //else
  128. // return $find;
  129. }
  130. function zoom_process_links($tree,$id,$root_id) {
  131. //dobudowuje znaczniki dotyczace LINKOW oraz brakujace ID z tym zwiazane
  132. //echo "<br>testuje zoom dla ".$id." root:".$root_id;
  133. if(isset($tree->Childs[$id]->GOTO_FLAG)) {
  134. if(isset( $tree->Childs[$tree->Childs[$id]->IF_TRUE_GOTO])) {
  135. //adding internal link to the same process
  136. //TODO trzeba przemyslec, czy dowiazywac linki do zagregowanych krokow, czy trzeba robic cut w tych miejscach - na ten moment domyslnie CUT
  137. // if(empty($tree->Childs[$id]->NO_CUT_FLAG)) //tylko linki zewnetrzne jak flaga NOCUT!
  138. //echo "... dodaje 218: ".$tree->Childs[$id]->IF_TRUE_GOTO;
  139. if(isset($tree->Childs[$tree->Childs[$id]->IF_TRUE_GOTO]->SOURCE)) {
  140. $tree->Viev_Zpc[$root_id]->INTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO;
  141. //echo "dodalem Linka dla ".$root_id;
  142. } else { //echo "To jest link external - bo referencyjny ID{$tree->Childs[$id]->IF_TRUE_GOTO}nie byl w procesie";
  143. $tree->Viev_Zpc[$root_id]->EXTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO;
  144. }
  145. } else { //echo "<br>Links zewnetrzny do ".$id." - ".$tree->Childs[$id]->IF_TRUE_GOTO;
  146. $tree->Viev_Zpc[$root_id]->EXTERNAL_LINK[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO;
  147. //$tree->Viev_Zpc_found[$tree->Childs[$id]->IF_TRUE_GOTO]=$tree->Childs[$id]->IF_TRUE_GOTO; //zeby tego rekordu nie przetwarzal ? TODO ?
  148. $obj=DB::get_by_id('CRM_PROCES',$tree->Childs[$id]->IF_TRUE_GOTO);
  149. $tree->Viev_Zpc[$tree->Childs[$id]->IF_TRUE_GOTO]->DESC="{".$obj->ID."}".substr($obj->DESC,0,50);
  150. if($tree->Childs[$id]->GOTO_FLAG=='GOTO_AND_RETURN') { //dodanie zwrotnej strzalki TODO dac inny typ strzalki!!
  151. $tree->Viev_Zpc[$tree->Childs[$id]->IF_TRUE_GOTO]->EXTERNAL_LINK[$root_id]=$root_id;
  152. //echo "<br> GOTO_AND_RETURN!!!".$tree->Childs[$id]->IF_TRUE_GOTO." -- ".$root_id;
  153. }
  154. }
  155. }
  156. }
  157. function build_path_zoom_proces_cut(&$tree,$init,$path_zpc=array()) {
  158. //funkcja do pokazania procesow wyplaszczonych, z wypunktowanymi rozgalezieniami - buduje drzewo w sposob inteligentny
  159. //szukam rekordow z gory do pierwszego CUT
  160. foreach($tree->Childs as $id=>$obj) {
  161. if(!isset($tree->Viev_Zpc_found[$id])) {
  162. //echo "<br>szukam parentow dla ".$id;
  163. self::search_parent_ids_till_cut($tree,$id,$find);
  164. // echo "<br>find:238 for id {$id} ".implode(',', $find)." EOL. ";
  165. if(empty($find)) { //echo " - Find empty for ".$id." adding ".$tree->Childs[$id]->PARENT;
  166. //trzeba przeskanowac w find jest dany parent -> Viev_Zpc_found
  167. // if(isset($tree->Childs[$id]->PARENT))
  168. // $tree->Viev_Zpc_Parent[$id]=$tree->Childs[$id]->PARENT;
  169. }
  170. foreach($find as $find_id) {
  171. $tree->Viev_Zpc_found[$find_id]=$find[0];
  172. if($find_id<>$find[0]) $tree->Viev_Zpc_Parent[$find_id]=$find[0]; //todo moze byc to z bledem jak nadrzedny bedzie zbitym ciagiem
  173. else $tree->Viev_Zpc_Parent[$find_id]=$tree->Childs[$find_id]->PARENT;
  174. }
  175. $tree->Viev_Zpc[$id]->PATH=$find;
  176. //wykrycie parenta polega na znalezieniu jego naturalnego parenta i poszukaniu w ktorej jest grupie
  177. //$tree->Viev_Zpc[$id]->PARENT=$tree->Viev_Zpc_Parent[$tree->Childs[$id]->PARENT] ;
  178. $obj=DB::get_by_id('CRM_PROCES',$id);
  179. $tree->Viev_Zpc[$id]->DESC="{".$id."}".substr($obj->DESC,0,50)."...";
  180. unset($find);
  181. }
  182. }
  183. //parenty trzeba zrobic za drugim rzutem
  184. foreach($tree->Viev_Zpc as $id=>$obj) {
  185. // echo "<br>256 wykrywam parenta dla {$id}";
  186. {
  187. //skanujemy wszystkie rekordy w Viev_Zpc w celu znalezienia czy danego ID parent nie jest w ktoryms z ID - tego szukamy
  188. if(!isset($obj->PARENT)) //tylko dla tych ktore nie maja parentow
  189. foreach($tree->Viev_Zpc as $id_=>$obj_) {
  190. if(isset($tree->Childs[$id_]->SOURCE))
  191. if(in_array($tree->Childs[$id]->PARENT, $obj_->PATH)) {
  192. // echo "<br>206 Skanuje dla brakujacego parenta dla ".$id." i znalazlem".$id_;
  193. $tree->Viev_Zpc[$id]->PARENT=$id_;
  194. } //else echo "<br>&nbsp;&nbsp; 199: nie znalazlem w ".$id_." path:".implode(',', $obj_->PATH);
  195. }
  196. if(!isset($tree->Viev_Zpc[$id]->PARENT)) { //jezeli nie znaleziono ta metoda to znaczy ze parent jest naturalny
  197. $tree->Viev_Zpc[$id]->PARENT=$tree->Childs[$id]->PARENT;
  198. // echo " - 204 ustawilem ostatecznie ".$tree->Childs[$id]->PARENT;
  199. }
  200. }
  201. }
  202. }
  203. }
  204. function GRAPH_VIEW_PROCES() {
  205. $id_proces = V::get('id_proces', '', $_REQUEST, 'int');
  206. $id_zasob = V::get('id_zasob', '', $_REQUEST, 'int');
  207. // $id_proces = $_REQUEST['id_proces'];
  208. //TOOD bug funkcji V nie mozna dac INT=0!!!
  209. // if (empty($id_proces)) {
  210. // echo'<p class="err box box-red">'."Wrong ID".'</p>';
  211. // return;
  212. // }
  213. $db = DB::getDB();
  214. //$proces = $db->get_by_id('CRM_PROCES', $id_proces);
  215. //if (empty($proces)) {
  216. // echo'<p class="err box box-red">'."Process {$id_proces} not exists".'</p>';
  217. // return;
  218. //}
  219. $ajaxTask = V::get('ajaxTask', '', $_REQUEST);
  220. if ($ajaxTask == 'getInfo') {
  221. $id = V::get('id', 0, $_REQUEST, 'int');
  222. $id_zasob = V::get('id_zasob', '', $_REQUEST, 'int');
  223. if ($id > 0) {
  224. //TODO najlepiej wyslac to od razu w jsonie i przekazac jakos do uzycia do wykresu!
  225. $step = $db->get_by_id('CRM_PROCES', $id);
  226. $cp=new crm_proces_paser;
  227. $tree=$cp->build_proces_init_tree($id);
  228. $cp->build_tree_flat_info($tree,null);
  229. $cp->detect_tree_where_to_detail_cut($tree);
  230. $cp->build_path_zoom_proces_cut($tree,$id);
  231. //echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($step);echo'</pre>';
  232. ?>
  233. <?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>"; ?>
  234. <?php if(empty($_REQUEST['RESOURCES'])) echo "<a href=?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces={$step->PARENT_ID}&PROCES_INIT_SCAN=1&RESOURCES=1&id_zasob={$id_zasob}> | mapa z zasobami</a>"; ?>
  235. <p> <?php echo "<font color=red><a href=?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces={$id}>".$step->ID."</a> - ".$step->DESC; ?> <?php echo $step->DESC; ?></font>
  236. <?php echo "| <a href=?FUNCTION_INIT=GRAPH_VIEW_PROCES&id_proces={$id}&RESOURCES=1&id_zasob={$id_zasob}> widok procesu z zasobami </a> ";?>
  237. </p>
  238. <p><?php echo $step->OPIS; ?></p>
  239. <?php foreach ($tree->Viev_Zpc[$id]->PATH as $ind=>$id_include) {
  240. if($ind==0) continue; //pierwszy wiersz wyswietlony wyzej
  241. $step = $db->get_by_id('CRM_PROCES', $id_include);
  242. echo "<p><b>".$step->ID."</a> - ".$step->DESC."</b> <font size=-3>".$step->OPIS."</font></p>";
  243. } ?>
  244. <?php
  245. } else { //zasob
  246. $id = V::get('id', 0, $_REQUEST);
  247. if($id[0]=='Z') {
  248. Lib::loadClass('ProcesHelper');
  249. $zasob=ProcesHelper::getZasobInfo(4975);
  250. echo "Zasob: [".$zasob->ID."], Typ: ".$zasob->TYPE.", Nazwa: ".$zasob->DESC." (".$zasob->DESC_PL.")<br>".$zasob->OPIS;
  251. echo "<hr> Nadrzędny: Zasob: [".$zasob->P__ID."] , Typ: ".$zasob->P__TYPE.", Nazwa: ".$zasob->P__DESC." (".$zasob->P__DESC_PL.")<br>".$zasob->P__OPIS;
  252. }
  253. }
  254. exit;
  255. }
  256. $graph = new stdClass();
  257. $graph->htmlID = 'graph_proces_id_' . $id_proces;
  258. $graph->procesTreeFlat = array();
  259. $graph->procesTreeGoto = array();
  260. $graph->treeItems = array();
  261. $graph->elements = new stdClass();
  262. $graph->elements->nodes = array();
  263. $graph->elements->edges = array();
  264. /* elements: {
  265. nodes: [
  266. { data: { id: 'j', name: 'Jerry' } },
  267. { data: { id: 'e', name: 'Elaine' } },
  268. { data: { id: 'k', name: 'Kramer' } },
  269. { data: { id: 'g', name: 'George' } }
  270. ],
  271. edges: [
  272. { data: { source: 'j', target: 'e' } },
  273. { data: { source: 'j', target: 'k' } },
  274. { data: { source: 'j', target: 'g' } },
  275. { data: { source: 'e', target: 'j' } },
  276. { data: { source: 'e', target: 'k' } },
  277. { data: { source: 'k', target: 'j' } },
  278. { data: { source: 'k', target: 'e' } },
  279. { data: { source: 'k', target: 'g' } },
  280. { data: { source: 'g', target: 'j' } }
  281. ]
  282. },
  283. */
  284. function graph__addNodeID($id, &$graph,$name=null,$path,$parent=null,$type,$once=null) {
  285. if (!array_key_exists($id, $graph->treeItems)) {
  286. $graph->treeItems[$id]= true;
  287. if(empty($name)) $name=$id;
  288. if(!empty($path)) { $name=$name." ".implode(',', $path);// $path=array();
  289. }
  290. //DEBUG_S(-3,'added id,name,path,parent',array($id,$name,$path,$parent),__FILE__,__FUNCTION__,__LINE__);
  291. if($type=='PROCES_INIT') $type_init='procesInit';
  292. else if($type=='RESOURCE') $type_init=$type;
  293. else $type_init=null;
  294. // echo "<br>".$type_init." ".$id." ".$name;
  295. // $name=str_replace(array('ś','ż',"ś"), array('s','z',"xxx"), $name);
  296. $graph->elements->nodes[] = array('data'=>array('id'=>"".$id."", 'name'=>$name , 'type'=>$type_init));
  297. //echo "<br> w AddNode:ID".$id." parent".$parent;
  298. }
  299. if(!empty($parent)) {
  300. if(isset($once)) {
  301. if(!isset($graph->used_elements[$parent][$id]) && !isset($graph->used_elements[$id][$parent])) {
  302. $graph->elements->edges[] = array('data'=>array('source'=>$parent, 'target'=>$id ));
  303. }
  304. } else {
  305. $graph->elements->edges[] = array('data'=>array('source'=>$parent, 'target'=>$id ));
  306. }
  307. $graph->used_elements[$parent][$id]=1;
  308. $graph->used_elements[$id][$parent]=1;
  309. }
  310. }
  311. $id_zasob = V::get('id_zasob', '', $_REQUEST, 'int');
  312. $PROCES_INIT_SCAN = V::get('PROCES_INIT_SCAN', '', $_REQUEST, 'int');
  313. if(!empty($PROCES_INIT_SCAN)) {
  314. //mapa procesow
  315. $cp=new crm_proces_paser;
  316. $PROCES_INIT_SCAN_STANOWISKO = V::get('PROCES_INIT_SCAN_STANOWISKO', '', $_REQUEST, 'int');
  317. $PROCES_INIT_SCAN_USER = V::get('PROCES_INIT_SCAN_USER', '', $_REQUEST, 'int');
  318. if(!empty($PROCES_INIT_SCAN_STANOWISKO)) {
  319. Lib::loadClass('ProcesHelper');
  320. $proces_list_obj = ProcesHelper::get_procesy_by_stanowiska( array($PROCES_INIT_SCAN_STANOWISKO) );
  321. foreach($proces_list_obj as $obj) {
  322. $init[$obj->ID]=$obj->ID;
  323. }
  324. } else if(!empty($PROCES_INIT_SCAN_USER)) {
  325. Lib::loadClass('UsersHelper');
  326. $proces_list_obj = UsersHelper::get_group_by_user($PROCES_INIT_SCAN_USER,array('SHOW_IN_PERIOD_MARK'=>'YES'));
  327. foreach($proces_list_obj as $obj) {
  328. $init[$obj->ID]=$obj->ID;
  329. }
  330. } else if(!empty($id_zasob)) {
  331. Lib::LoadClass('ProcesHelper');
  332. $init=ProcesHelper::get_proces_init_by_zasob_id($id_zasob);
  333. } else {
  334. $init=$cp->get_proces_init($id_proces);
  335. }
  336. DEBUG_S(3,'lista procesow init',$init,__FILE__,__FUNCTION__,__LINE__);
  337. foreach($init as $id_proces) {
  338. $tree=$cp->build_proces_init_tree($id_proces);
  339. $cp->build_tree_flat_info($tree,null);
  340. $cp->detect_tree_where_to_detail_cut($tree,'nocut');
  341. $cp->build_path_zoom_proces_cut($tree,$id_proces);
  342. DEBUG_S(3,'get_proces_init',$init);
  343. DEBUG_S(3,'tree->childs',$tree->Childs);
  344. DEBUG_S(3,'tree->Parents',$tree->Parents);
  345. DEBUG_S(3,'tree->Viev_Zpc',$tree->Viev_Zpc);
  346. DEBUG_S(3,'tree->Viev_Zpc_Parent',$tree->Viev_Zpc_Parent);
  347. DEBUG_S(3,'tree->get_resources_by_proceses_id',$tree->get_resources_by_proceses_id);
  348. graph__addNodeID(0, $graph,$name=null,$path,null);
  349. foreach($tree->Viev_Zpc as $id=>$obj) {
  350. graph__addNodeID($id, $graph,$obj->DESC,null,((isset($obj->PARENT)) ? $obj->PARENT : null),$tree->Childs[$id]->TYPE);
  351. // foreach($obj->INTERNAL_LINK as $link) graph__addNodeID($id, &$graph,$tree->Viev_Zpc[$link]->DESC,null,$link,null);
  352. foreach($obj->EXTERNAL_LINK as $link) graph__addNodeID($link, $graph,$tree->Viev_Zpc[$link]->DESC,null,$id,'PROCES_INIT');
  353. }
  354. if(!empty($_REQUEST['RESOURCES'])) {
  355. $resources=$cp->get_resources_by_proceses_id($tree->Childs,$id_proces,$id_zasob);
  356. foreach($resources['PARENT_ID'] as $ID=>$DESC) {
  357. graph__addNodeID("Z_".$ID, $graph,$DESC,null,null,'RESOURCE');
  358. }
  359. foreach($resources['ID'] as $ID=>$DESC) {
  360. graph__addNodeID("Z_".$ID, $graph,$DESC['DESC'],null,$id_proces,'RESOURCE');
  361. graph__addNodeID("Z_".$ID, $graph,$DESC['DESC'],null,"Z_".$DESC['PARENT_ID'],'RESOURCE','once');
  362. }
  363. }
  364. unset($tree);
  365. }
  366. }else {
  367. //dokladnie 1 proces
  368. $cp=new crm_proces_paser;
  369. $tree=$cp->build_proces_init_tree($id_proces);
  370. $cp->build_tree_flat_info($tree,null);
  371. $cp->detect_tree_where_to_detail_cut($tree);
  372. $cp->build_path_zoom_proces_cut($tree,$id_proces);
  373. DEBUG_S(3,'get_proces_init',$init);
  374. DEBUG_S(3,'tree->childs',$tree->Childs);
  375. DEBUG_S(3,'tree->Parents',$tree->Parents);
  376. DEBUG_S(-3,'tree->Viev_Zpc',$tree->Viev_Zpc);
  377. DEBUG_S(3,'tree->Viev_Zpc_Parent',$tree->Viev_Zpc_Parent);
  378. DEBUG_S(3,'tree->Viev_Zpc_Parent_cut',$tree->Viev_Zpc_Parent_cut);
  379. DEBUG_S(3,'tree->Viev_Zpc_found',$tree->Viev_Zpc_found);
  380. graph__addNodeID(0, $graph,$name=null,$path,null);
  381. foreach($tree->Viev_Zpc as $id=>$obj) {
  382. //echo "<br> tst edg:".$id." / ".$tree->Childs[$id]->PARENT;
  383. // : $tree->Viev_Zpc[$tree->Childs[$id]->PARENT])
  384. graph__addNodeID($id, $graph,$obj->DESC,null,((isset($obj->PARENT)) ? $obj->PARENT : null),$tree->Childs[$id]->TYPE);
  385. foreach($obj->INTERNAL_LINK as $link) graph__addNodeID($id, $graph,$tree->Viev_Zpc[$link]->DESC,null,$link,null);
  386. foreach($obj->EXTERNAL_LINK as $link) graph__addNodeID($link, $graph,$tree->Viev_Zpc[$link]->DESC,null,$id,'PROCES_INIT');
  387. }
  388. if(!empty($_REQUEST['RESOURCES'])) {
  389. $resources=$cp->get_resources_by_proceses_id($tree->Childs,$id_proces,$id_zasob);
  390. foreach($resources['PARENT_ID'] as $ID=>$DESC) {
  391. graph__addNodeID("Z_".$ID, $graph,$DESC,null,null,'RESOURCE');
  392. }
  393. foreach($resources['ID'] as $ID=>$DESC) {
  394. graph__addNodeID("Z_".$ID, $graph,$DESC['DESC'],null,$id_proces,'RESOURCE');
  395. graph__addNodeID("Z_".$ID, $graph,$DESC['DESC'],null,"Z_".$DESC['PARENT_ID'],'RESOURCE');
  396. }
  397. }
  398. }
  399. /*
  400. $db = DB::getDB();
  401. $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";
  402. $res=DB::query($sql);
  403. while($h=DB::fetch($res)) {
  404. SearchParentsWithExits($h->ID,$h->ID,$graph,'Proces '.$h->ID,0);
  405. //graph__addNodeID($h->ID, $graph);
  406. graph__addNodeID('1', $graph,'1');
  407. // graph__addNodeID($h->ID, $graph,$h->ID);
  408. // graph__addNodeID('100', $graph,'100');
  409. //$graph->treeItems[$h->ID] = true;
  410. //$graph->treeItems[101] = true;
  411. // $graph->elements->nodes[] = array('data'=>array('id'=>$h->ID, 'name'=>$h->ID , 'type'=>'procesInit'));
  412. // $graph->elements->nodes[] = array('data'=>array('id'=>101, 'name'=>101 , 'type'=>'procesInit'));
  413. // $graph->elements->edges[] = array('data'=>array('source'=>994, 'target'=>101));
  414. }
  415. */
  416. foreach($graph->elements->nodes as $var) {
  417. // echo "<br>\n NODE".$var[data][id];
  418. $nodes[$var[data][id]]=$var[data][id];
  419. }
  420. foreach($graph->elements->edges as $var) {
  421. //echo "<br>\n".$var[data][source]." ".$var[data][target]." ";
  422. if(!isset($nodes[$var[data][source]])) echo "<br>FAIL1 ".$var[data][source];
  423. if(!isset($nodes[$var[data][target]])) echo "<br>FAIL2 ".$var[data][target];
  424. }
  425. DEBUG_S(3,'nodes',$graph->elements->nodes);
  426. DEBUG_S(3,'edges',$graph->elements->edges);
  427. /*
  428. $sql = "select p.`ID`, p.`PARENT_ID`
  429. from `CRM_PROCES` as p
  430. where p.`A_STATUS` in('WAITING','NORMAL')
  431. ";
  432. $res = $db->query($sql);
  433. while ($r = $db->fetch($res)) {
  434. $graph->procesTreeFlat[$r->PARENT_ID] []= $r->ID;
  435. }
  436. $sql = "select p.`IF_TRUE_GOTO` as ID, p.`ID` as PARENT_ID
  437. from `CRM_PROCES` as p
  438. where p.`A_STATUS` in('WAITING','NORMAL')
  439. and p.IF_TRUE_GOTO>0
  440. -- and p.IF_TRUE_GOTO_FLAG='GOTO_AND_RETURN'
  441. ";
  442. $res = $db->query($sql);
  443. while ($r = $db->fetch($res)) {
  444. $graph->procesTreeGoto[$r->PARENT_ID] []= $r->ID;
  445. }
  446. function createGraphRec($id, $tree, &$graph, $lvl = 0) {
  447. $graph->treeItems[$id] = true;
  448. settype($id, 'string');
  449. if ($id == 3122) {
  450. $graph->elements->nodes[] = array('data'=>array('id'=>$id, 'name'=>$id, 'type'=>'procesInit', 'lvl'=>$lvl));
  451. } else {
  452. $graph->elements->nodes[] = array('data'=>array('id'=>$id, 'name'=>$id, 'lvl'=>$lvl));
  453. }
  454. if ($lvl > 1) {
  455. // return;
  456. }
  457. if (!empty($tree[$id])) {
  458. foreach ($tree[$id] as $vChildID) {
  459. $graph->elements->edges[] = array('data'=>array('source'=>$id, 'target'=>$vChildID));
  460. createGraphRec($vChildID, $tree, $graph, $lvl + 1);
  461. }
  462. }
  463. }
  464. createGraphRec($id_proces, $graph->procesTreeFlat, $graph);
  465. */
  466. /*
  467. // addGraphGoto
  468. foreach ($graph->procesTreeGoto as $kID => $vGotoIds) {
  469. //$graph->treeItems[$id] = true;
  470. if (array_key_exists($kID, $graph->treeItems)) {
  471. foreach ($vGotoIds as $vGotoID) {
  472. graph__addNodeID($vGotoID, $graph);
  473. $graph->elements->edges[] = array('data'=>array('source'=>$kID, 'target'=>$vGotoID, 'type'=>'GOTO'));
  474. }
  475. } else {
  476. foreach ($vGotoIds as $vGotoID) {
  477. if (array_key_exists($vGotoID, $graph->treeItems)) {
  478. //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>';
  479. graph__addNodeID($kID, $graph);
  480. //$graph->elements->edges[] = array('data'=>array('source'=>$kID, 'target'=>$vGotoID, 'type'=>'GOTO'));
  481. }
  482. }
  483. }
  484. }
  485. */
  486. ?>
  487. <style type="text/css">
  488. #<?php echo $graph->htmlID; ?>_wrap {
  489. position:relative;
  490. width:1100px;
  491. margin:0 auto;
  492. border:1px solid #ccc;
  493. }
  494. #<?php echo $graph->htmlID; ?> {
  495. height:860px;
  496. border-bottom:1px solid #ccc;
  497. }
  498. #<?php echo $graph->htmlID; ?>_info {
  499. padding:3px;
  500. }
  501. #<?php echo $graph->htmlID; ?>_wrap .actions { position:absolute; top:20px; left:-40px; margin:0; padding:0; list-style:none; }
  502. #<?php echo $graph->htmlID; ?>_wrap .actions button { border-radius:0; background:#fff; border:1px solid #ccc; }
  503. </style>
  504. <script src="./stuff/cytoscape.js/arbor.js"></script>
  505. <script src="./stuff/cytoscape.js/cytoscape.js"></script>
  506. <script>
  507. jQuery(loadInfo = function(nodeID){
  508. $.ajax({
  509. url: 'index.php?MENU_INIT=GRAPH_VIEW_PROCES&id_proces=<?php echo $id_proces; ?>&ajaxTask=getInfo&id=' + nodeID + '&id_zasob=<?php echo $id_zasob; ?>&HEADER_NOT_INIT=YES',
  510. type: 'GET',
  511. dataType: 'text',
  512. data: '',
  513. async: true,
  514. success: function (data) {
  515. jQuery('#<?php echo $graph->htmlID; ?>_info').html(data);
  516. },
  517. error: function (err) {
  518. console.log('err');
  519. }
  520. });
  521. });
  522. jQuery(loadCy = function(){
  523. jQuery('#<?php echo $graph->htmlID; ?>').cytoscape({
  524. layout: {
  525. name: 'arbor'
  526. },
  527. style: cytoscape.stylesheet()
  528. .selector('node')
  529. .css({
  530. 'shape': 'rectangle',
  531. 'width': '100px', 'height': '8px',
  532. 'font-size': '10px',
  533. 'content': 'data(name)',
  534. 'text-valign': 'center',
  535. 'color': 'white',
  536. 'text-outline-width': 2,
  537. 'text-outline-color': '#888'
  538. })
  539. .selector('edge')
  540. .css({
  541. 'target-arrow-shape': 'triangle'
  542. })
  543. .selector(':selected')
  544. .css({
  545. 'background-color': 'black',
  546. 'line-color': 'black',
  547. 'target-arrow-color': 'black',
  548. 'source-arrow-color': 'black'
  549. })
  550. .selector('.faded')
  551. .css({
  552. 'opacity': 0.25,
  553. 'text-opacity': 0
  554. })
  555. .selector('edge.neighborhood')
  556. .css({
  557. 'background-color': 'blue',
  558. 'color': 'orange'
  559. })
  560. .selector('node.procesInit')
  561. .css({
  562. 'background-color': 'red',
  563. 'text-outline-color': 'red',
  564. 'font-weight': 'bold'
  565. })
  566. .selector('node.RESOURCE')
  567. .css({
  568. 'background-color': 'black',
  569. 'text-outline-color': 'black',
  570. 'font-weight': 'normal','font-size': '8'
  571. })
  572. ,
  573. elements: <?php echo json_encode($graph->elements); ?>,
  574. ready: function(){
  575. var cy = this;
  576. window.cy_<?php echo $graph->htmlID; ?> = this;
  577. cy.elements("node[type = 'procesInit']").addClass('procesInit');
  578. cy.elements("node[type = 'RESOURCE']").addClass('RESOURCE');
  579. cy.elements("node[lvl > 1]").hide();
  580. cy.elements().unselectify();
  581. cy.on('tap', 'node', function(e){
  582. //console.log('on tap node', e)
  583. var node = e.cyTarget;
  584. var neighborhood = node.neighborhood().add(node);
  585. var nodeID = node.id();
  586. loadInfo(nodeID);
  587. cy.elements().addClass('faded').unselect();
  588. neighborhood.removeClass('faded');
  589. node.select();
  590. cy.edges().removeClass('neighborhood');
  591. node.connectedEdges().addClass('neighborhood');
  592. neighborhood.show();
  593. cy.center(neighborhood);
  594. });
  595. cy.on('tap', function(e){
  596. if (e.cyTarget === cy){
  597. cy.elements().removeClass('faded');
  598. }
  599. });
  600. },
  601. showOverlay: false
  602. });
  603. });
  604. jQuery(document).ready(function(){
  605. loadCy();
  606. var parent = $('#<?php echo $graph->htmlID; ?>')
  607. .parent()
  608. parent.find('.actions .cy-refresh')
  609. .on('mousedown touchstart', function(){
  610. loadCy();
  611. cy.attr('style', '');
  612. });
  613. parent.find('.actions .cy-zoom-plus')
  614. .on('mousedown touchstart', function(){
  615. window.cy_<?php echo $graph->htmlID; ?>.zoom(window.cy_<?php echo $graph->htmlID; ?>.zoom() + 0.1);
  616. });
  617. parent.find('.actions .cy-zoom-minus')
  618. .on('mousedown touchstart', function(){
  619. window.cy_<?php echo $graph->htmlID; ?>.zoom(window.cy_<?php echo $graph->htmlID; ?>.zoom() - 0.1);
  620. });
  621. });
  622. </script>
  623. <div id="<?php echo $graph->htmlID; ?>_wrap">
  624. <div id="<?php echo $graph->htmlID; ?>"></div>
  625. <div id="<?php echo $graph->htmlID; ?>_info"></div>
  626. <ul class="actions">
  627. <li><button class="btn cy-refresh"><i title="Refresh" class="ico-refresh"></i></button></li>
  628. <li><button class="btn cy-zoom-plus"><i title="Zoom +" class="ico-plus"></i></button></li>
  629. <li><button class="btn cy-zoom-minus"><i title="Zoom -" class="ico-minus"></i></button></li>
  630. </ul>
  631. </div>
  632. <?php
  633. }