PageRenderTime 36ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/components/bitrix/bizproc.workflow.start/class.php

https://gitlab.com/alexprowars/bitrix
PHP | 382 lines | 334 code | 48 blank | 0 comment | 54 complexity | 3a14734c313afafbe94c8efba7b3fc4d MD5 | raw file
  1. <?php
  2. if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
  3. use Bitrix\Main;
  4. class BizprocWorkflowStart extends \CBitrixComponent
  5. {
  6. public function onPrepareComponentParams($arParams)
  7. {
  8. $arParams["MODULE_ID"] = trim(empty($arParams["MODULE_ID"]) ? $_REQUEST["module_id"] : $arParams["MODULE_ID"]);
  9. $arParams["ENTITY"] = trim(empty($arParams["ENTITY"]) ? $_REQUEST["entity"] : $arParams["ENTITY"]);
  10. $arParams["DOCUMENT_TYPE"] = trim(empty($arParams["DOCUMENT_TYPE"]) ? $_REQUEST["document_type"] : $arParams["DOCUMENT_TYPE"]);
  11. $arParams["DOCUMENT_ID"] = trim(empty($arParams["DOCUMENT_ID"]) ? $_REQUEST["document_id"] : $arParams["DOCUMENT_ID"]);
  12. $arParams["TEMPLATE_ID"] = isset($arParams["TEMPLATE_ID"]) ? (int)$arParams["TEMPLATE_ID"] : (int)$_REQUEST["workflow_template_id"];
  13. $arParams["AUTO_EXECUTE_TYPE"] = isset($arParams["AUTO_EXECUTE_TYPE"]) ? (int)$arParams["AUTO_EXECUTE_TYPE"] : null;
  14. $arParams["SET_TITLE"] = ($arParams["SET_TITLE"] == "N" ? "N" : "Y");
  15. return $arParams;
  16. }
  17. public function executeComponent()
  18. {
  19. if (!Main\Loader::includeModule('bizproc'))
  20. {
  21. return false;
  22. }
  23. $this->arResult["DOCUMENT_ID"] = $this->arParams["DOCUMENT_ID"];
  24. $this->arResult["DOCUMENT_TYPE"] = $this->arParams["DOCUMENT_TYPE"];
  25. $this->arResult["back_url"] = trim($_REQUEST["back_url"]);
  26. $arError = array();
  27. if ($this->arParams["MODULE_ID"] == '')
  28. $arError[] = array(
  29. "id" => "empty_module_id",
  30. "text" => GetMessage("BPATT_NO_MODULE_ID"));
  31. if ($this->arParams["ENTITY"] == '')
  32. $arError[] = array(
  33. "id" => "empty_entity",
  34. "text" => GetMessage("BPABS_EMPTY_ENTITY"));
  35. if ($this->arParams["DOCUMENT_TYPE"] == '')
  36. $arError[] = array(
  37. "id" => "empty_document_type",
  38. "text" => GetMessage("BPABS_EMPTY_DOC_TYPE"));
  39. $this->arParams["DOCUMENT_TYPE"] = array($this->arParams["MODULE_ID"], $this->arParams["ENTITY"], $this->arParams["DOCUMENT_TYPE"]);
  40. if ($this->arParams["DOCUMENT_ID"] == '' && $this->arParams["AUTO_EXECUTE_TYPE"] === null)
  41. $arError[] = array(
  42. "id" => "empty_document_id",
  43. "text" => GetMessage("BPABS_EMPTY_DOC_ID"));
  44. $this->arParams["DOCUMENT_ID"] = array($this->arParams["MODULE_ID"], $this->arParams["ENTITY"], $this->arParams["DOCUMENT_ID"]);
  45. $this->arParams["USER_GROUPS"] = $GLOBALS["USER"]->GetUserGroupArray();
  46. if ($this->arParams["AUTO_EXECUTE_TYPE"] === null && !check_bitrix_sessid())
  47. {
  48. $arError[] = array(
  49. "id" => "access_denied",
  50. "text" => GetMessage("BPABS_NO_PERMS"));
  51. }
  52. if (method_exists($this->arParams["DOCUMENT_TYPE"][1], "GetUserGroups"))
  53. {
  54. $this->arParams["USER_GROUPS"] = call_user_func_array(
  55. array($this->arParams["DOCUMENT_TYPE"][1], "GetUserGroups"),
  56. array($this->arParams["DOCUMENT_TYPE"], $this->arParams["DOCUMENT_ID"], $GLOBALS["USER"]->GetID()));
  57. }
  58. if (empty($arError) && $this->arParams["AUTO_EXECUTE_TYPE"] !== null)
  59. {
  60. $this->autoStartParametersAction($this->arParams["AUTO_EXECUTE_TYPE"]);
  61. return true;
  62. }
  63. if (empty($arError))
  64. {
  65. $arDocumentStates = CBPDocument::GetDocumentStates($this->arParams["DOCUMENT_TYPE"], $this->arParams["DOCUMENT_ID"]);
  66. if (!CBPDocument::CanUserOperateDocument(
  67. CBPCanUserOperateOperation::StartWorkflow,
  68. $GLOBALS["USER"]->GetID(),
  69. $this->arParams["DOCUMENT_ID"],
  70. array(
  71. "DocumentStates" => $arDocumentStates,
  72. "UserGroups" => $this->arParams["USER_GROUPS"]))):
  73. $arError[] = array(
  74. "id" => "access_denied",
  75. "text" => GetMessage("BPABS_NO_PERMS"));
  76. endif;
  77. }
  78. if (!empty($arError))
  79. {
  80. $e = new CAdminException($arError);
  81. ShowError($e->GetString());
  82. return false;
  83. }
  84. elseif (!empty($_REQUEST["cancel"]) && !empty($_REQUEST["back_url"]))
  85. {
  86. LocalRedirect(str_replace("#WF#", "", $_REQUEST["back_url"]));
  87. }
  88. $this->arResult["SHOW_MODE"] = "SelectWorkflow";
  89. $this->arResult["TEMPLATES"] = array();
  90. $this->arResult["PARAMETERS_VALUES"] = array();
  91. $this->arResult["ERROR_MESSAGE"] = "";
  92. $runtime = CBPRuntime::GetRuntime();
  93. $runtime->StartRuntime();
  94. $this->arResult["DocumentService"] = $runtime->GetService("DocumentService");
  95. $dbWorkflowTemplate = CBPWorkflowTemplateLoader::GetList(
  96. ['SORT' => 'ASC', 'NAME' => 'ASC'],
  97. [
  98. "DOCUMENT_TYPE" => $this->arParams["DOCUMENT_TYPE"],
  99. "ACTIVE" => "Y",
  100. 'IS_SYSTEM' => 'N',
  101. '!AUTO_EXECUTE' => CBPDocumentEventType::Automation
  102. ],
  103. false,
  104. false,
  105. ["ID", "NAME", "DESCRIPTION", "MODIFIED", "USER_ID", "PARAMETERS"]
  106. );
  107. while ($arWorkflowTemplate = $dbWorkflowTemplate->GetNext())
  108. {
  109. if (!CBPDocument::CanUserOperateDocument(
  110. CBPCanUserOperateOperation::StartWorkflow,
  111. $GLOBALS["USER"]->GetID(),
  112. $this->arParams["DOCUMENT_ID"],
  113. array(
  114. "UserGroups" => $this->arParams["USER_GROUPS"],
  115. "DocumentStates" => $arDocumentStates,
  116. "WorkflowTemplateId" => $arWorkflowTemplate["ID"]))):
  117. continue;
  118. endif;
  119. $this->arResult["TEMPLATES"][$arWorkflowTemplate["ID"]] = $arWorkflowTemplate;
  120. $this->arResult["TEMPLATES"][$arWorkflowTemplate["ID"]]["URL"] =
  121. htmlspecialcharsex($GLOBALS['APPLICATION']->GetCurPageParam(
  122. "workflow_template_id=".$arWorkflowTemplate["ID"].'&'.bitrix_sessid_get(),
  123. Array("workflow_template_id", "sessid")));
  124. }
  125. if ($this->arParams["TEMPLATE_ID"] > 0 && $_POST["CancelStartParamWorkflow"] == ''
  126. && array_key_exists($this->arParams["TEMPLATE_ID"], $this->arResult["TEMPLATES"]))
  127. {
  128. $arWorkflowTemplate = $this->arResult["TEMPLATES"][$this->arParams["TEMPLATE_ID"]];
  129. $arWorkflowParameters = array();
  130. $bCanStartWorkflow = false;
  131. $isConstantsTuned = CBPWorkflowTemplateLoader::isConstantsTuned($arWorkflowTemplate["ID"]);
  132. if (count($arWorkflowTemplate["PARAMETERS"]) <= 0)
  133. {
  134. $bCanStartWorkflow = true;
  135. }
  136. elseif ($_SERVER["REQUEST_METHOD"] == "POST" && $_POST["DoStartParamWorkflow"] <> '')
  137. {
  138. $arErrorsTmp = array();
  139. $arRequest = $_REQUEST;
  140. foreach ($_FILES as $k => $v)
  141. {
  142. if (array_key_exists("name", $v))
  143. {
  144. if (is_array($v["name"]))
  145. {
  146. $ks = array_keys($v["name"]);
  147. for ($i = 0, $cnt = count($ks); $i < $cnt; $i++)
  148. {
  149. $ar = array();
  150. foreach ($v as $k1 => $v1)
  151. $ar[$k1] = $v1[$ks[$i]];
  152. $arRequest[$k][] = $ar;
  153. }
  154. }
  155. else
  156. {
  157. $arRequest[$k] = $v;
  158. }
  159. }
  160. }
  161. $arWorkflowParameters = CBPWorkflowTemplateLoader::CheckWorkflowParameters(
  162. $arWorkflowTemplate["PARAMETERS"],
  163. $arRequest,
  164. $this->arParams["DOCUMENT_TYPE"],
  165. $arErrorsTmp
  166. );
  167. if (count($arErrorsTmp) > 0)
  168. {
  169. $bCanStartWorkflow = false;
  170. foreach ($arErrorsTmp as $e)
  171. $arError[] = array(
  172. "id" => "CheckWorkflowParameters",
  173. "text" => $e["message"]);
  174. }
  175. else
  176. {
  177. $bCanStartWorkflow = true;
  178. }
  179. }
  180. if(!$isConstantsTuned)
  181. {
  182. $arError[] = array(
  183. "id" => "required_constants",
  184. "text" => GetMessage("BPABS_REQUIRED_CONSTANTS"));
  185. $bCanStartWorkflow = false;
  186. }
  187. if ($bCanStartWorkflow)
  188. {
  189. $arErrorsTmp = array();
  190. $wfId = CBPDocument::StartWorkflow(
  191. $this->arParams["TEMPLATE_ID"],
  192. $this->arParams["DOCUMENT_ID"],
  193. array_merge($arWorkflowParameters, array(
  194. CBPDocument::PARAM_TAGRET_USER => "user_".intval($GLOBALS["USER"]->GetID()),
  195. CBPDocument::PARAM_DOCUMENT_EVENT_TYPE => CBPDocumentEventType::Manual
  196. )),
  197. $arErrorsTmp
  198. );
  199. if (count($arErrorsTmp) > 0)
  200. {
  201. $this->arResult["SHOW_MODE"] = "StartWorkflowError";
  202. foreach ($arErrorsTmp as $e)
  203. $arError[] = array(
  204. "id" => "StartWorkflowError",
  205. "text" => ($e['code'] > 0 ? '['.$e['code'].'] ': '').$e['message']
  206. );
  207. }
  208. else
  209. {
  210. $this->arResult["SHOW_MODE"] = "StartWorkflowSuccess";
  211. if ($this->arResult["back_url"] <> ''):
  212. LocalRedirect(str_replace("#WF#", $wfId, $_REQUEST["back_url"]));
  213. die();
  214. endif;
  215. }
  216. }
  217. else
  218. {
  219. $p = ($_SERVER["REQUEST_METHOD"] == "POST" && $_POST["DoStartParamWorkflow"] <> '');
  220. $keys = array_keys($arWorkflowTemplate["PARAMETERS"]);
  221. foreach ($keys as $key)
  222. {
  223. $v = ($p ? $_REQUEST[$key] : $arWorkflowTemplate["PARAMETERS"][$key]["Default"]);
  224. if (!is_array($v))
  225. {
  226. $this->arResult["PARAMETERS_VALUES"][$key] = CBPHelper::ConvertParameterValues($v);
  227. }
  228. else
  229. {
  230. $keys1 = array_keys($v);
  231. foreach ($keys1 as $key1)
  232. $this->arResult["PARAMETERS_VALUES"][$key][$key1] = CBPHelper::ConvertParameterValues($v[$key1]);
  233. }
  234. }
  235. $this->arResult["SHOW_MODE"] = $isConstantsTuned ? "WorkflowParameters" : "StartWorkflowError";
  236. }
  237. if (!empty($arError))
  238. {
  239. $e = new CAdminException($arError);
  240. $this->arResult["ERROR_MESSAGE"] = $e->GetString();
  241. }
  242. }
  243. else
  244. {
  245. $this->arResult["SHOW_MODE"] = "SelectWorkflow";
  246. }
  247. if ($this->arResult["SHOW_MODE"] === "SelectWorkflow")
  248. {
  249. foreach ($this->arResult["TEMPLATES"] as $id => $tpl)
  250. {
  251. if ($tpl['AUTO_EXECUTE'] > \CBPDocumentEventType::Delete)
  252. {
  253. unset($this->arResult["TEMPLATES"][$id]);
  254. }
  255. }
  256. }
  257. $this->IncludeComponentTemplate();
  258. if($this->arParams["SET_TITLE"] == "Y")
  259. {
  260. $GLOBALS['APPLICATION']->SetTitle(GetMessage("BPABS_TITLE"));
  261. }
  262. }
  263. protected function autoStartParametersAction($execType)
  264. {
  265. $arError = array();
  266. $arDocumentStates = CBPWorkflowTemplateLoader::GetDocumentTypeStates(
  267. $this->arParams['DOCUMENT_TYPE'], $execType
  268. );
  269. if (!CBPDocument::CanUserOperateDocumentType(
  270. CBPCanUserOperateOperation::StartWorkflow,
  271. $GLOBALS["USER"]->GetID(),
  272. $this->arParams["DOCUMENT_TYPE"],
  273. array(
  274. "DocumentStates" => $arDocumentStates,
  275. "UserGroups" => $this->arParams["USER_GROUPS"])))
  276. {
  277. $arError[] = array(
  278. "id" => "access_denied",
  279. "text" => GetMessage("BPABS_NO_PERMS"));
  280. }
  281. if (!empty($arError))
  282. {
  283. $e = new CAdminException($arError);
  284. ShowError($e->GetString());
  285. return false;
  286. }
  287. $this->arResult["TEMPLATES"] = array();
  288. foreach ($arDocumentStates as $template)
  289. {
  290. if (count($template['TEMPLATE_PARAMETERS']) > 0)
  291. {
  292. $parameters = array();
  293. foreach ($template['TEMPLATE_PARAMETERS'] as $parameterKey => $parameter)
  294. {
  295. if ($parameterKey == "TargetUser")
  296. continue;
  297. if (!is_array($parameter['Default']))
  298. {
  299. $parameter['Default'] = CBPHelper::ConvertParameterValues($parameter['Default']);
  300. }
  301. else
  302. {
  303. foreach ($parameter['Default'] as $key => $value)
  304. {
  305. $parameter['Default'][$key] = CBPHelper::ConvertParameterValues($value);
  306. }
  307. }
  308. $parameters["bizproc".$template['TEMPLATE_ID']."_".$parameterKey] = $parameter;
  309. }
  310. $this->arResult["TEMPLATES"][] = array(
  311. 'ID' => $template['TEMPLATE_ID'],
  312. 'NAME' => $template['TEMPLATE_NAME'],
  313. 'DESCRIPTION' => $template['TEMPLATE_DESCRIPTION'],
  314. 'PARAMETERS' => $parameters,
  315. );
  316. }
  317. }
  318. if (empty($this->arResult["TEMPLATES"]))
  319. {
  320. $arError[] = array(
  321. "id" => "access_denied",
  322. "text" => GetMessage("BPABS_NO_AUTOSTART_PARAMETERS")
  323. );
  324. $e = new CAdminException($arError);
  325. ShowError($e->GetString());
  326. return false;
  327. }
  328. $runtime = CBPRuntime::GetRuntime();
  329. $runtime->StartRuntime();
  330. $this->arResult["DocumentService"] = $runtime->GetService("DocumentService");
  331. $this->arResult['EXEC_TYPE'] = $execType;
  332. $this->IncludeComponentTemplate('autostart');
  333. }
  334. }