PageRenderTime 43ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/modules/workflow/classes/general/status.php

https://gitlab.com/alexprowars/bitrix
PHP | 356 lines | 314 code | 38 blank | 4 comment | 62 complexity | 11e590d9104d718dbdc8a6732f0b2164 MD5 | raw file
  1. <?php
  2. IncludeModuleLangFile(__FILE__);
  3. class CWorkflowStatus
  4. {
  5. public static function err_mess()
  6. {
  7. $module_id = "workflow";
  8. @include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$module_id."/install/version.php");
  9. return "<br>Module: ".$module_id." <br>Class: CWorkflowStatus<br>File: ".__FILE__;
  10. }
  11. //Despite this function is not documented it should be version compatible
  12. public static function GetList($by = 's_c_sort', $order = 'asc', $arFilter = [], $is_filtered = null, $arSelect = [])
  13. {
  14. $err_mess = (CWorkflowStatus::err_mess())."<br>Function: GetList<br>Line: ";
  15. global $DB;
  16. if(!is_array($arSelect))
  17. $arSelect = array();
  18. if(count($arSelect) <= 0)
  19. $arSelect = array("ID", "C_SORT", "ACTIVE", "TITLE", "DESCRIPTION", "IS_FINAL", "TIMESTAMP_X", "DOCUMENTS", "NOTIFY");
  20. if($by == "s_id")
  21. {
  22. $strSqlOrder = "ORDER BY S.ID";
  23. $arSelect[] = "ID";
  24. }
  25. elseif($by == "s_timestamp")
  26. {
  27. $strSqlOrder = "ORDER BY S.TIMESTAMP_X";
  28. $arSelect[] = "TIMESTAMP_X";
  29. }
  30. elseif($by == "s_active")
  31. {
  32. $strSqlOrder = "ORDER BY S.ACTIVE";
  33. $arSelect[] = "ACTIVE";
  34. }
  35. elseif($by == "s_c_sort")
  36. {
  37. $strSqlOrder = "ORDER BY S.C_SORT";
  38. $arSelect[] = "C_SORT";
  39. }
  40. elseif($by == "s_title")
  41. {
  42. $strSqlOrder = "ORDER BY S.TITLE ";
  43. $arSelect[] = "TITLE";
  44. }
  45. elseif($by == "s_description")
  46. {
  47. $strSqlOrder = "ORDER BY S.DESCRIPTION";
  48. $arSelect[] = "DESCRIPTION";
  49. }
  50. elseif($by == "s_documents")
  51. {
  52. $strSqlOrder = "ORDER BY DOCUMENTS";
  53. $arSelect[] = "DOCUMENTS";
  54. }
  55. else
  56. {
  57. $strSqlOrder = "ORDER BY S.C_SORT";
  58. $arSelect[] = "C_SORT";
  59. }
  60. if($order != "desc")
  61. $order = "asc";
  62. $strSqlOrder .= " $order ";
  63. $arSelectFields = array(
  64. "ID" => "S.ID",
  65. "C_SORT" => "S.C_SORT",
  66. "ACTIVE" => "S.ACTIVE",
  67. "NOTIFY" => "S.NOTIFY",
  68. "TITLE" => "S.TITLE",
  69. "DESCRIPTION" => "S.DESCRIPTION",
  70. "IS_FINAL" => "S.IS_FINAL",
  71. "TIMESTAMP_X" => "S.TIMESTAMP_X TIMESTAMP_X_TEMP, ".$DB->DateToCharFunction("S.TIMESTAMP_X"),
  72. "DOCUMENTS" => "count(DISTINCT D.ID)",
  73. "REFERENCE_ID" => "S.ID",
  74. "REFERENCE" => ($DB->type=="MSSQL"?
  75. $DB->Concat("'['", "convert(varchar(8000), S.ID)" , "'] '", "S.TITLE"):
  76. $DB->Concat("'['", "S.ID" , "'] '", "S.TITLE")
  77. ),
  78. );
  79. $arSqlSelect = array();
  80. foreach($arSelect as $field)
  81. if(array_key_exists($field, $arSelectFields))
  82. $arSqlSelect[$field] = $arSelectFields[$field]." ".$field;
  83. $bGroup = false;
  84. $arGroupFields = array(
  85. "ID" => "S.ID",
  86. "C_SORT" => "S.C_SORT",
  87. "ACTIVE" => "S.ACTIVE",
  88. "NOTIFY" => "S.NOTIFY",
  89. "TITLE" => "S.TITLE",
  90. "DESCRIPTION" => "S.DESCRIPTION",
  91. "IS_FINAL" => "S.IS_FINAL",
  92. "TIMESTAMP_X" => "S.TIMESTAMP_X",
  93. "REFERENCE_ID" => "S.ID",
  94. "REFERENCE" => ($DB->type=="MSSQL"?
  95. $DB->Concat("'['", "convert(varchar(8000), S.ID)" , "'] '", "S.TITLE"):
  96. $DB->Concat("'['", "S.ID" , "'] '", "S.TITLE")
  97. ),
  98. );
  99. $arSqlGroup = array();
  100. foreach($arSelect as $field)
  101. if(array_key_exists($field, $arGroupFields))
  102. $arSqlGroup[$field] = $arGroupFields[$field];
  103. elseif(array_key_exists($field, $arSelectFields))
  104. {
  105. $arSqlGroup["ID"] = "S.ID";
  106. $bGroup = true;
  107. }
  108. $arSqlSearch = $arSqlSearch_h = $arSqlSearch_g = array();
  109. if(is_array($arFilter))
  110. {
  111. foreach($arFilter as $key => $val)
  112. {
  113. if(is_array($val))
  114. {
  115. if(count($val) <= 0) continue;
  116. }
  117. else
  118. {
  119. if((string)$val == '' || "$val"=="NOT_REF") continue;
  120. }
  121. $match_value_set = array_key_exists($key."_EXACT_MATCH", $arFilter);
  122. $key = strtoupper($key);
  123. $predicate = "";
  124. switch($key)
  125. {
  126. case "ID":
  127. $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N";
  128. $predicate = GetFilterQuery("S.ID", $val, $match);
  129. break;
  130. case "ACTIVE":
  131. $predicate = ($val=="Y") ? "S.ACTIVE='Y'" : "S.ACTIVE='N'";
  132. break;
  133. case "!=ACTIVE":
  134. if($val === "Y" || $val === "N")
  135. $arSqlSearch[] = "S.ACTIVE <> '".$val."'";
  136. break;
  137. case "TITLE":
  138. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  139. $predicate = GetFilterQuery("S.TITLE", $val, $match);
  140. break;
  141. case "DESCRIPTION":
  142. $match = ($arFilter[$key."_EXACT_MATCH"]=="Y" && $match_value_set) ? "N" : "Y";
  143. $predicate = GetFilterQuery("S.DESCRIPTION", $val, $match);
  144. break;
  145. case "DOCUMENTS_1":
  146. $arSqlSearch_h[] = "count(D.ID) >= ".intval($val);
  147. $bGroup = true;
  148. break;
  149. case "DOCUMENTS_2":
  150. $arSqlSearch_h[] = "count(D.ID) <= ".intval($val);
  151. $bGroup = true;
  152. break;
  153. case "GROUP_ID":
  154. if(!is_array($val))
  155. $val = array($val);
  156. $groups = array();
  157. foreach($val as $i => $v)
  158. {
  159. $v = intval($v);
  160. if($v > 0)
  161. $groups[$v] = $v;
  162. }
  163. if(count($groups) > 0)
  164. {
  165. $arSqlSearch_g[] = "G.GROUP_ID in (".implode(", ",$groups).")";
  166. $bGroup = true;
  167. }
  168. break;
  169. case "PERMISSION_TYPE_1":
  170. $val = intval($val);
  171. if($val > 0)
  172. {
  173. $arSqlSearch_g[] = "G.PERMISSION_TYPE >= ".$val;
  174. $bGroup = true;
  175. }
  176. break;
  177. case "PERMISSION_TYPE_2":
  178. $val = intval($val);
  179. if($val > 0)
  180. {
  181. $arSqlSearch_g[] = "G.PERMISSION_TYPE <= ".$val;
  182. $bGroup = true;
  183. }
  184. break;
  185. }
  186. if($predicate <> '' && $predicate!="0")
  187. $arSqlSearch[] = $predicate;
  188. }
  189. }
  190. if(count($arSqlSearch) > 0)
  191. $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
  192. else
  193. $strSqlSearch = "";
  194. if(count($arSqlSearch_h) > 0)
  195. $strSqlSearch_h = "(".implode(") and (", $arSqlSearch_h).") ";
  196. else
  197. $strSqlSearch_h = "";
  198. if(count($arSqlSearch_g) > 0)
  199. {
  200. if($strSqlSearch <> '')
  201. {
  202. $strSqlSearch .= " AND ";
  203. }
  204. $strSqlSearch .= "(".implode(") and (", $arSqlSearch_g).") ";
  205. }
  206. $strSql = "
  207. SELECT
  208. ".implode(", ", $arSqlSelect)."
  209. FROM
  210. b_workflow_status S
  211. ".($strSqlSearch_h <> '' || array_key_exists("DOCUMENTS", $arSqlSelect)? "LEFT JOIN b_workflow_document D ON (D.STATUS_ID = S.ID)": "")."
  212. ".(count($arSqlSearch_g) > 0? "LEFT JOIN b_workflow_status2group G ON (G.STATUS_ID = S.ID)": "")."
  213. ".($strSqlSearch <> ''? "WHERE ".$strSqlSearch: "")."
  214. ".($bGroup? "GROUP BY ".implode(", ", $arSqlGroup): "")."
  215. ".($strSqlSearch_h <> ''? "HAVING ".$strSqlSearch_h: "")."
  216. $strSqlOrder
  217. ";
  218. $res = $DB->Query($strSql, false, $err_mess.__LINE__);
  219. return $res;
  220. }
  221. public static function GetByID($ID)
  222. {
  223. return CWorkflowStatus::GetList('', '', array("ID" => $ID, "ID_EXACT_MATCH" => "Y"));
  224. }
  225. public static function GetDropDownList($SHOW_ALL="N", $strOrder = "desc", $arFilter = array())
  226. {
  227. global $USER;
  228. if(strtolower($strOrder) != "asc")
  229. $strOrder = "desc";
  230. else
  231. $strOrder = "asc";
  232. $arFilter["!=ACTIVE"] = "N";
  233. if(!(CWorkflow::IsAdmin() || $SHOW_ALL=="Y"))
  234. {
  235. $arGroups = $USER->GetUserGroupArray();
  236. if(!is_array($arGroups))
  237. $arGroups = array(2);
  238. $arFilter["GROUP_ID"] = $arGroups;
  239. $arFilter["PERMISSION_TYPE_1"] = 1;
  240. }
  241. return CWorkflowStatus::GetList("s_c_sort", $strOrder, $arFilter, null, array("REFERENCE_ID", "REFERENCE", "IS_FINAL", "C_SORT"));
  242. }
  243. public static function GetNextSort()
  244. {
  245. $err_mess = (CWorkflowStatus::err_mess())."<br>Function: GetNextSort<br>Line: ";
  246. global $DB;
  247. $strSql = "SELECT max(C_SORT) MAX_SORT FROM b_workflow_status";
  248. $z = $DB->Query($strSql, false, $err_mess.__LINE__);
  249. $zr = $z->Fetch();
  250. return intval($zr["MAX_SORT"])+100;
  251. }
  252. //check fields before writing
  253. function CheckFields($ID, $arFields)
  254. {
  255. $aMsg = array();
  256. $ID = intval($ID);
  257. if(($ID <= 0) && (trim($arFields["TITLE"]) == ''))
  258. $aMsg[] = array("id"=>"TITLE", "text"=> GetMessage("FLOW_FORGOT_TITLE"));
  259. if(!empty($aMsg))
  260. {
  261. $e = new CAdminException($aMsg);
  262. $GLOBALS["APPLICATION"]->ThrowException($e);
  263. return false;
  264. }
  265. return true;
  266. }
  267. //add
  268. function Add($arFields)
  269. {
  270. global $DB;
  271. if(!$this->CheckFields(0, $arFields))
  272. return false;
  273. $ID = $DB->Add("b_workflow_status", $arFields);
  274. if(($ID == 1) && ($arFields["ACTIVE"] != "Y"))
  275. {
  276. $this->Update($ID, array("ACTIVE" => "Y"));
  277. }
  278. return $ID;
  279. }
  280. //update
  281. function Update($ID, $arFields)
  282. {
  283. global $DB;
  284. $ID = intval($ID);
  285. if(($ID == 1) && array_key_exists("ACTIVE", $arFields))
  286. $arFields["ACTIVE"] = "Y";
  287. if(!$this->CheckFields($ID, $arFields))
  288. return false;
  289. $strUpdate = $DB->PrepareUpdate("b_workflow_status", $arFields);
  290. if($strUpdate != "")
  291. {
  292. $strSql = "UPDATE b_workflow_status SET ".$strUpdate." WHERE ID = ".$ID;
  293. $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  294. }
  295. return true;
  296. }
  297. function SetPermissions($STATUS_ID, $arGroups, $PERMISSION_TYPE = 1)
  298. {
  299. global $DB;
  300. $STATUS_ID = intval($STATUS_ID);
  301. $PERMISSION_TYPE = intval($PERMISSION_TYPE);
  302. $err_mess = (CWorkflowStatus::err_mess())."<br>Function: SetPermissions<br>Line: ";
  303. $DB->Query("DELETE FROM b_workflow_status2group WHERE STATUS_ID = ".$STATUS_ID." AND PERMISSION_TYPE = ".$PERMISSION_TYPE, false, $err_mess.__LINE__);
  304. if(is_array($arGroups) && ($PERMISSION_TYPE == 1 || $PERMISSION_TYPE == 2))
  305. {
  306. foreach ($arGroups as $GROUP_ID)
  307. {
  308. $GROUP_ID = intval($GROUP_ID);
  309. $arFields = array(
  310. "STATUS_ID" => $STATUS_ID,
  311. "GROUP_ID" => $GROUP_ID,
  312. "PERMISSION_TYPE" => $PERMISSION_TYPE,
  313. );
  314. $DB->Insert("b_workflow_status2group", $arFields, $err_mess.__LINE__);
  315. }
  316. }
  317. }
  318. }