ACL.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. class ACL {
  3. /**
  4. * Ids List of Proces Init for given tabel (skip filters)
  5. */
  6. public static function getTableProcesInitIds($idTable) {
  7. $procesInitList = self::getTableProcesInitList($idTable);
  8. return array_keys($procesInitList);
  9. }
  10. /**
  11. * List of Proces Init for given table (skip filters)
  12. */
  13. public static function getTableProcesInitList($idTable) {
  14. $tableProcesInitList = array();
  15. $sqlIdProcesListSql = <<<SQL
  16. select tpv.`ID_PROCES`
  17. from `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
  18. where tpv.`ID_TABLE`='{$idTable}'
  19. SQL;
  20. $fetchTableProcesInitListSql = <<<SQL
  21. -- time ~0.07 -- no goto and return
  22. select p.`ID`, p.`DESC`
  23. from `CRM_PROCES` p
  24. where p.`ID` in(
  25. select i.`idx_PROCES_INIT_ID`
  26. from `CRM_PROCES_idx` i
  27. where i.`ID_PROCES` in({$sqlIdProcesListSql})
  28. )
  29. and p.`TYPE`='PROCES_INIT'
  30. order by p.`SORT_PRIO`
  31. SQL;
  32. /*
  33. SELECT p.`ID` , p.`DESC`
  34. FROM `CRM_PROCES` p
  35. WHERE p.`ID`
  36. IN (
  37. SELECT i.`idx_PROCES_INIT_ID`
  38. FROM `CRM_PROCES_idx` i
  39. WHERE i.`ID_PROCES`
  40. IN (
  41. SELECT tpv.`ID_PROCES`
  42. FROM `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
  43. WHERE tpv.`ID_TABLE` = '13051'
  44. )
  45. )
  46. AND p.`TYPE` = 'PROCES_INIT'
  47. order by p.`SORT_PRIO`
  48. */
  49. $fetchTableProcesInitListSql = <<<SQL
  50. -- time ~0.15s
  51. select p.`ID`, p.`DESC`
  52. from `CRM_PROCES` p
  53. where p.`ID` in(
  54. select i.`idx_PROCES_INIT_ID`
  55. from `CRM_PROCES_idx` i
  56. where i.`ID_PROCES` in({$sqlIdProcesListSql})
  57. union
  58. select ig.`idx_PROCES_INIT_ID`
  59. from `CRM_PROCES_idx` i
  60. join `CRM_PROCES_idx` ig on(ig.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`)
  61. where i.`ID_PROCES` in({$sqlIdProcesListSql})
  62. )
  63. and p.`TYPE`='PROCES_INIT'
  64. order by p.`SORT_PRIO`
  65. SQL;
  66. $fetchTableProcesInitListSql = <<<SQL
  67. -- time ~0.14
  68. select p.`ID`, p.`DESC`
  69. from `CRM_PROCES` p
  70. where p.`ID` in(
  71. select i.`idx_PROCES_INIT_ID`
  72. from `CRM_PROCES_idx` i
  73. where i.`ID_PROCES` in({$sqlIdProcesListSql})
  74. or i.`ID_PROCES` in(
  75. select ig.`idx_PROCES_WITH_GROUPS_ID`
  76. from `CRM_PROCES_idx` ig
  77. where ig.`ID_PROCES` in({$sqlIdProcesListSql})
  78. )
  79. )
  80. and p.`TYPE`='PROCES_INIT'
  81. order by p.`SORT_PRIO`
  82. SQL;
  83. //echo'<pre>$fetchTableProcesInitListSql('.$idTable.') ';print_r($fetchTableProcesInitListSql);echo'</pre>';
  84. $tableProcesInitList = array();
  85. $db = DB::getDB();
  86. $res = $db->query($fetchTableProcesInitListSql);
  87. while ($r = $db->fetch($res)) {
  88. $tableProcesInitList[$r->ID] = $r->DESC;
  89. }
  90. return $tableProcesInitList;
  91. }
  92. public static function getProcesInitMapTreeOnlyIds($ids) {
  93. $mapTree = array();
  94. $map = self::getProcesInitMapOnlyIds($ids);
  95. foreach ($map as $r) {
  96. if ('PROCES_INIT' == $r->TYPE) {
  97. $mapTree[$r->ID_PROCES] = array();
  98. }
  99. }
  100. foreach ($map as $r) {
  101. if ('GOTO_AND_RETURN' == $r->TYPE) {
  102. $mapTree[$r->idx_MAIN_PROCES_INIT_ID][$r->ID_PROCES] = array();
  103. }
  104. }
  105. foreach ($map as $r) {
  106. if ('GOTO_AND_RETURN_LVL2' == $r->TYPE) {
  107. $mapTree[$r->idx_MAIN_PROCES_INIT_ID][$r->idx_GOTO_LVL2_INIT_ID][$r->ID_PROCES] = true;
  108. }
  109. }
  110. return $mapTree;
  111. }
  112. public static function getProcesInitMapOnlyIds($ids) {
  113. $map = array();
  114. $sqlIds = V::filter($ids, array('V', 'filterPositiveInteger'));
  115. $sqlIds = implode(',', $sqlIds);
  116. if (empty($sqlIds)) return $map;
  117. $sql = <<<SQL
  118. select i.`ID_PROCES`
  119. , i.`PARENT_ID`
  120. , i.`TYPE`
  121. , i.`idx_PROCES_INIT_ID`
  122. , i.`idx_MAIN_PROCES_INIT_ID`
  123. , i.`idx_PROCES_WITH_GROUPS_ID`
  124. , IF(i.`TYPE`='GOTO_AND_RETURN_LVL2'
  125. , (select ig.`idx_PROCES_INIT_ID`
  126. from `CRM_PROCES_idx` ig
  127. where ig.`ID_PROCES`=i.`PARENT_ID`
  128. limit 1)
  129. , 0
  130. ) as idx_GOTO_LVL2_INIT_ID
  131. from `CRM_PROCES_idx` i
  132. where i.`ID_PROCES` in({$sqlIds})
  133. and i.`idx_MAIN_PROCES_INIT_ID` in({$sqlIds})
  134. SQL;
  135. DBG::_('DBG_MAP', '1', "MAP SQL", $sql, __CLASS__, __FUNCTION__, __LINE__);
  136. $db = DB::getDB();
  137. $res = $db->query($sql);
  138. while ($r = $db->fetch($res)) {
  139. $map[] = $r;
  140. }
  141. //DBG::table("MAP", $map, __CLASS__, __FUNCTION__, __LINE__);
  142. return $map;
  143. }
  144. public static function canGroupViewProces($idGroup, $idProcesInit) {
  145. $isAllowed = false;
  146. $idProcesInit = (int)$idProcesInit;
  147. if (!$idProcesInit) return false;
  148. $checkProcesAccessSql = <<<SQL
  149. select count(*) as cnt
  150. from `CRM_PROCES_idx_GROUP_to_INIT_VIEW` giv
  151. where giv.`ID_GROUP` = '{$idGroup}'
  152. and giv.`ID_PROCES_INIT` = '{$idProcesInit}'
  153. SQL;
  154. $db = DB::getDB();
  155. $res = $db->query($checkProcesAccessSql);
  156. if ($r = $db->fetch($res)) {
  157. if ($r->cnt > 0) {
  158. $isAllowed = true;
  159. }
  160. }
  161. return $isAllowed;
  162. }
  163. }