/components/bitrix/bizproc.workflow.start/class.php
PHP | 382 lines | 334 code | 48 blank | 0 comment | 54 complexity | 3a14734c313afafbe94c8efba7b3fc4d MD5 | raw file
- <?php
- if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
- use Bitrix\Main;
- class BizprocWorkflowStart extends \CBitrixComponent
- {
- public function onPrepareComponentParams($arParams)
- {
- $arParams["MODULE_ID"] = trim(empty($arParams["MODULE_ID"]) ? $_REQUEST["module_id"] : $arParams["MODULE_ID"]);
- $arParams["ENTITY"] = trim(empty($arParams["ENTITY"]) ? $_REQUEST["entity"] : $arParams["ENTITY"]);
- $arParams["DOCUMENT_TYPE"] = trim(empty($arParams["DOCUMENT_TYPE"]) ? $_REQUEST["document_type"] : $arParams["DOCUMENT_TYPE"]);
- $arParams["DOCUMENT_ID"] = trim(empty($arParams["DOCUMENT_ID"]) ? $_REQUEST["document_id"] : $arParams["DOCUMENT_ID"]);
- $arParams["TEMPLATE_ID"] = isset($arParams["TEMPLATE_ID"]) ? (int)$arParams["TEMPLATE_ID"] : (int)$_REQUEST["workflow_template_id"];
- $arParams["AUTO_EXECUTE_TYPE"] = isset($arParams["AUTO_EXECUTE_TYPE"]) ? (int)$arParams["AUTO_EXECUTE_TYPE"] : null;
- $arParams["SET_TITLE"] = ($arParams["SET_TITLE"] == "N" ? "N" : "Y");
- return $arParams;
- }
- public function executeComponent()
- {
- if (!Main\Loader::includeModule('bizproc'))
- {
- return false;
- }
- $this->arResult["DOCUMENT_ID"] = $this->arParams["DOCUMENT_ID"];
- $this->arResult["DOCUMENT_TYPE"] = $this->arParams["DOCUMENT_TYPE"];
- $this->arResult["back_url"] = trim($_REQUEST["back_url"]);
- $arError = array();
- if ($this->arParams["MODULE_ID"] == '')
- $arError[] = array(
- "id" => "empty_module_id",
- "text" => GetMessage("BPATT_NO_MODULE_ID"));
- if ($this->arParams["ENTITY"] == '')
- $arError[] = array(
- "id" => "empty_entity",
- "text" => GetMessage("BPABS_EMPTY_ENTITY"));
- if ($this->arParams["DOCUMENT_TYPE"] == '')
- $arError[] = array(
- "id" => "empty_document_type",
- "text" => GetMessage("BPABS_EMPTY_DOC_TYPE"));
- $this->arParams["DOCUMENT_TYPE"] = array($this->arParams["MODULE_ID"], $this->arParams["ENTITY"], $this->arParams["DOCUMENT_TYPE"]);
- if ($this->arParams["DOCUMENT_ID"] == '' && $this->arParams["AUTO_EXECUTE_TYPE"] === null)
- $arError[] = array(
- "id" => "empty_document_id",
- "text" => GetMessage("BPABS_EMPTY_DOC_ID"));
- $this->arParams["DOCUMENT_ID"] = array($this->arParams["MODULE_ID"], $this->arParams["ENTITY"], $this->arParams["DOCUMENT_ID"]);
- $this->arParams["USER_GROUPS"] = $GLOBALS["USER"]->GetUserGroupArray();
- if ($this->arParams["AUTO_EXECUTE_TYPE"] === null && !check_bitrix_sessid())
- {
- $arError[] = array(
- "id" => "access_denied",
- "text" => GetMessage("BPABS_NO_PERMS"));
- }
- if (method_exists($this->arParams["DOCUMENT_TYPE"][1], "GetUserGroups"))
- {
- $this->arParams["USER_GROUPS"] = call_user_func_array(
- array($this->arParams["DOCUMENT_TYPE"][1], "GetUserGroups"),
- array($this->arParams["DOCUMENT_TYPE"], $this->arParams["DOCUMENT_ID"], $GLOBALS["USER"]->GetID()));
- }
- if (empty($arError) && $this->arParams["AUTO_EXECUTE_TYPE"] !== null)
- {
- $this->autoStartParametersAction($this->arParams["AUTO_EXECUTE_TYPE"]);
- return true;
- }
- if (empty($arError))
- {
- $arDocumentStates = CBPDocument::GetDocumentStates($this->arParams["DOCUMENT_TYPE"], $this->arParams["DOCUMENT_ID"]);
- if (!CBPDocument::CanUserOperateDocument(
- CBPCanUserOperateOperation::StartWorkflow,
- $GLOBALS["USER"]->GetID(),
- $this->arParams["DOCUMENT_ID"],
- array(
- "DocumentStates" => $arDocumentStates,
- "UserGroups" => $this->arParams["USER_GROUPS"]))):
- $arError[] = array(
- "id" => "access_denied",
- "text" => GetMessage("BPABS_NO_PERMS"));
- endif;
- }
- if (!empty($arError))
- {
- $e = new CAdminException($arError);
- ShowError($e->GetString());
- return false;
- }
- elseif (!empty($_REQUEST["cancel"]) && !empty($_REQUEST["back_url"]))
- {
- LocalRedirect(str_replace("#WF#", "", $_REQUEST["back_url"]));
- }
- $this->arResult["SHOW_MODE"] = "SelectWorkflow";
- $this->arResult["TEMPLATES"] = array();
- $this->arResult["PARAMETERS_VALUES"] = array();
- $this->arResult["ERROR_MESSAGE"] = "";
- $runtime = CBPRuntime::GetRuntime();
- $runtime->StartRuntime();
- $this->arResult["DocumentService"] = $runtime->GetService("DocumentService");
- $dbWorkflowTemplate = CBPWorkflowTemplateLoader::GetList(
- ['SORT' => 'ASC', 'NAME' => 'ASC'],
- [
- "DOCUMENT_TYPE" => $this->arParams["DOCUMENT_TYPE"],
- "ACTIVE" => "Y",
- 'IS_SYSTEM' => 'N',
- '!AUTO_EXECUTE' => CBPDocumentEventType::Automation
- ],
- false,
- false,
- ["ID", "NAME", "DESCRIPTION", "MODIFIED", "USER_ID", "PARAMETERS"]
- );
- while ($arWorkflowTemplate = $dbWorkflowTemplate->GetNext())
- {
- if (!CBPDocument::CanUserOperateDocument(
- CBPCanUserOperateOperation::StartWorkflow,
- $GLOBALS["USER"]->GetID(),
- $this->arParams["DOCUMENT_ID"],
- array(
- "UserGroups" => $this->arParams["USER_GROUPS"],
- "DocumentStates" => $arDocumentStates,
- "WorkflowTemplateId" => $arWorkflowTemplate["ID"]))):
- continue;
- endif;
- $this->arResult["TEMPLATES"][$arWorkflowTemplate["ID"]] = $arWorkflowTemplate;
- $this->arResult["TEMPLATES"][$arWorkflowTemplate["ID"]]["URL"] =
- htmlspecialcharsex($GLOBALS['APPLICATION']->GetCurPageParam(
- "workflow_template_id=".$arWorkflowTemplate["ID"].'&'.bitrix_sessid_get(),
- Array("workflow_template_id", "sessid")));
- }
- if ($this->arParams["TEMPLATE_ID"] > 0 && $_POST["CancelStartParamWorkflow"] == ''
- && array_key_exists($this->arParams["TEMPLATE_ID"], $this->arResult["TEMPLATES"]))
- {
- $arWorkflowTemplate = $this->arResult["TEMPLATES"][$this->arParams["TEMPLATE_ID"]];
- $arWorkflowParameters = array();
- $bCanStartWorkflow = false;
- $isConstantsTuned = CBPWorkflowTemplateLoader::isConstantsTuned($arWorkflowTemplate["ID"]);
- if (count($arWorkflowTemplate["PARAMETERS"]) <= 0)
- {
- $bCanStartWorkflow = true;
- }
- elseif ($_SERVER["REQUEST_METHOD"] == "POST" && $_POST["DoStartParamWorkflow"] <> '')
- {
- $arErrorsTmp = array();
- $arRequest = $_REQUEST;
- foreach ($_FILES as $k => $v)
- {
- if (array_key_exists("name", $v))
- {
- if (is_array($v["name"]))
- {
- $ks = array_keys($v["name"]);
- for ($i = 0, $cnt = count($ks); $i < $cnt; $i++)
- {
- $ar = array();
- foreach ($v as $k1 => $v1)
- $ar[$k1] = $v1[$ks[$i]];
- $arRequest[$k][] = $ar;
- }
- }
- else
- {
- $arRequest[$k] = $v;
- }
- }
- }
- $arWorkflowParameters = CBPWorkflowTemplateLoader::CheckWorkflowParameters(
- $arWorkflowTemplate["PARAMETERS"],
- $arRequest,
- $this->arParams["DOCUMENT_TYPE"],
- $arErrorsTmp
- );
- if (count($arErrorsTmp) > 0)
- {
- $bCanStartWorkflow = false;
- foreach ($arErrorsTmp as $e)
- $arError[] = array(
- "id" => "CheckWorkflowParameters",
- "text" => $e["message"]);
- }
- else
- {
- $bCanStartWorkflow = true;
- }
- }
- if(!$isConstantsTuned)
- {
- $arError[] = array(
- "id" => "required_constants",
- "text" => GetMessage("BPABS_REQUIRED_CONSTANTS"));
- $bCanStartWorkflow = false;
- }
- if ($bCanStartWorkflow)
- {
- $arErrorsTmp = array();
- $wfId = CBPDocument::StartWorkflow(
- $this->arParams["TEMPLATE_ID"],
- $this->arParams["DOCUMENT_ID"],
- array_merge($arWorkflowParameters, array(
- CBPDocument::PARAM_TAGRET_USER => "user_".intval($GLOBALS["USER"]->GetID()),
- CBPDocument::PARAM_DOCUMENT_EVENT_TYPE => CBPDocumentEventType::Manual
- )),
- $arErrorsTmp
- );
- if (count($arErrorsTmp) > 0)
- {
- $this->arResult["SHOW_MODE"] = "StartWorkflowError";
- foreach ($arErrorsTmp as $e)
- $arError[] = array(
- "id" => "StartWorkflowError",
- "text" => ($e['code'] > 0 ? '['.$e['code'].'] ': '').$e['message']
- );
- }
- else
- {
- $this->arResult["SHOW_MODE"] = "StartWorkflowSuccess";
- if ($this->arResult["back_url"] <> ''):
- LocalRedirect(str_replace("#WF#", $wfId, $_REQUEST["back_url"]));
- die();
- endif;
- }
- }
- else
- {
- $p = ($_SERVER["REQUEST_METHOD"] == "POST" && $_POST["DoStartParamWorkflow"] <> '');
- $keys = array_keys($arWorkflowTemplate["PARAMETERS"]);
- foreach ($keys as $key)
- {
- $v = ($p ? $_REQUEST[$key] : $arWorkflowTemplate["PARAMETERS"][$key]["Default"]);
- if (!is_array($v))
- {
- $this->arResult["PARAMETERS_VALUES"][$key] = CBPHelper::ConvertParameterValues($v);
- }
- else
- {
- $keys1 = array_keys($v);
- foreach ($keys1 as $key1)
- $this->arResult["PARAMETERS_VALUES"][$key][$key1] = CBPHelper::ConvertParameterValues($v[$key1]);
- }
- }
- $this->arResult["SHOW_MODE"] = $isConstantsTuned ? "WorkflowParameters" : "StartWorkflowError";
- }
- if (!empty($arError))
- {
- $e = new CAdminException($arError);
- $this->arResult["ERROR_MESSAGE"] = $e->GetString();
- }
- }
- else
- {
- $this->arResult["SHOW_MODE"] = "SelectWorkflow";
- }
- if ($this->arResult["SHOW_MODE"] === "SelectWorkflow")
- {
- foreach ($this->arResult["TEMPLATES"] as $id => $tpl)
- {
- if ($tpl['AUTO_EXECUTE'] > \CBPDocumentEventType::Delete)
- {
- unset($this->arResult["TEMPLATES"][$id]);
- }
- }
- }
- $this->IncludeComponentTemplate();
- if($this->arParams["SET_TITLE"] == "Y")
- {
- $GLOBALS['APPLICATION']->SetTitle(GetMessage("BPABS_TITLE"));
- }
- }
- protected function autoStartParametersAction($execType)
- {
- $arError = array();
- $arDocumentStates = CBPWorkflowTemplateLoader::GetDocumentTypeStates(
- $this->arParams['DOCUMENT_TYPE'], $execType
- );
- if (!CBPDocument::CanUserOperateDocumentType(
- CBPCanUserOperateOperation::StartWorkflow,
- $GLOBALS["USER"]->GetID(),
- $this->arParams["DOCUMENT_TYPE"],
- array(
- "DocumentStates" => $arDocumentStates,
- "UserGroups" => $this->arParams["USER_GROUPS"])))
- {
- $arError[] = array(
- "id" => "access_denied",
- "text" => GetMessage("BPABS_NO_PERMS"));
- }
- if (!empty($arError))
- {
- $e = new CAdminException($arError);
- ShowError($e->GetString());
- return false;
- }
- $this->arResult["TEMPLATES"] = array();
- foreach ($arDocumentStates as $template)
- {
- if (count($template['TEMPLATE_PARAMETERS']) > 0)
- {
- $parameters = array();
- foreach ($template['TEMPLATE_PARAMETERS'] as $parameterKey => $parameter)
- {
- if ($parameterKey == "TargetUser")
- continue;
- if (!is_array($parameter['Default']))
- {
- $parameter['Default'] = CBPHelper::ConvertParameterValues($parameter['Default']);
- }
- else
- {
- foreach ($parameter['Default'] as $key => $value)
- {
- $parameter['Default'][$key] = CBPHelper::ConvertParameterValues($value);
- }
- }
- $parameters["bizproc".$template['TEMPLATE_ID']."_".$parameterKey] = $parameter;
- }
- $this->arResult["TEMPLATES"][] = array(
- 'ID' => $template['TEMPLATE_ID'],
- 'NAME' => $template['TEMPLATE_NAME'],
- 'DESCRIPTION' => $template['TEMPLATE_DESCRIPTION'],
- 'PARAMETERS' => $parameters,
- );
- }
- }
- if (empty($this->arResult["TEMPLATES"]))
- {
- $arError[] = array(
- "id" => "access_denied",
- "text" => GetMessage("BPABS_NO_AUTOSTART_PARAMETERS")
- );
- $e = new CAdminException($arError);
- ShowError($e->GetString());
- return false;
- }
- $runtime = CBPRuntime::GetRuntime();
- $runtime->StartRuntime();
- $this->arResult["DocumentService"] = $runtime->GetService("DocumentService");
- $this->arResult['EXEC_TYPE'] = $execType;
- $this->IncludeComponentTemplate('autostart');
- }
- }