%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/bizproc/lib/automation/engine/ |
Current File : //home/bitrix/www/bitrix/modules/bizproc/lib/automation/engine/conditiongroup.php |
<?php namespace Bitrix\Bizproc\Automation\Engine; use Bitrix\Bizproc\Automation\Target\BaseTarget; use Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); class ConditionGroup { const TYPE_FIELD = 'field'; //const TYPE_VARIABLE = 'variable'; //reserved const JOINER_AND = 'AND';// 0 const JOINER_OR = 'OR';// 1 private $type; private $items = []; public function __construct(array $params = null) { $this->setType(static::TYPE_FIELD); if ($params) { if (isset($params['type'])) { $this->setType($params['type']); } if (isset($params['items']) && is_array($params['items'])) { foreach ($params['items'] as list($item, $joiner)) { if (!empty($item['field'])) { $condition = new Condition($item); $this->addItem($condition, $joiner); } } } } } /** * @param BaseTarget $target Automation target. * @return bool */ public function evaluate(BaseTarget $target) { if (empty($this->items)) { return true; } $documentType = $target->getDocumentType(); $documentId = $documentType; $documentId[2] = $target->getDocumentId(); $runtime = \CBPRuntime::getRuntime(); $runtime->startRuntime(); $documentService = $runtime->getService("DocumentService"); $document = $documentService->getDocument($documentId, $documentType); $documentFields = $documentService->getDocumentFields($documentType); $result = array(0 => true); $i = 0; foreach ($this->items as $item) { /** @var Condition $condition */ $condition = $item[0]; $conditionField = $condition->getField(); $joiner = ($item[1] === static::JOINER_OR) ? static::JOINER_OR : static::JOINER_AND; $conditionResult = true; if (array_key_exists($conditionField, $document)) { $fld = $document[$conditionField]; $type = null; $fieldType = null; if (isset($documentFields[$conditionField])) { $type = $documentFields[$conditionField]["BaseType"]; if ($documentFields[$conditionField]['Type'] === 'UF:boolean') { $type = 'bool'; } $fieldType = $documentService->getFieldTypeObject($documentType, $documentFields[$conditionField]); } if (!$condition->check($fld, $type, $target, $fieldType)) { $conditionResult = false; } } if ($joiner == static::JOINER_OR) { ++$i; $result[$i] = $conditionResult; } elseif (!$conditionResult) { $result[$i] = false; } } return (count(array_filter($result)) > 0); } /** * @param string $type Type of condition. * @return ConditionGroup This instance. */ public function setType($type) { if ($type === static::TYPE_FIELD) { $this->type = $type; } return $this; } /** * @return mixed */ public function getType() { return $this->type; } /** * @param Condition $condition Condition instance. * @param string $joiner Condition joiner. * @return $this This instance. */ public function addItem(Condition $condition, $joiner = self::JOINER_AND) { $this->items[] = [$condition, $joiner]; return $this; } /** * @return array Condition items. */ public function getItems() { return $this->items; } /** * @return array Array presentation of condition group. */ public function toArray() { $itemsArray = []; /** @var Condition $condition */ foreach ($this->getItems() as list($condition, $joiner)) { $itemsArray[] = [$condition->toArray(), $joiner]; } return ['type' => $this->getType(), 'items' => $itemsArray]; } /** * @param array $childActivity Child activity array. * @param array $documentType * @return array New activity array. */ public function createBizprocActivity(array $childActivity, array $documentType) { $title = Loc::getMessage('BIZPROC_AUTOMATION_CONDITION_TITLE'); $fieldCondition = []; $bizprocJoiner = 0; $documentService = \CBPRuntime::GetRuntime(true)->GetService("DocumentService"); $documentFields = $documentService->GetDocumentFields($documentType); /** @var Condition $condition */ foreach ($this->getItems() as list($condition, $joiner)) { $field = $condition->getField(); $value = $condition->getValue(); $property = isset($documentFields[$field]) ? $documentFields[$field] : null; if ($property) { $valueInternal = $documentService->GetFieldInputValue( $documentType, $property, 'field', ['field' => $value], $errors ); if (!$errors) { $value = $valueInternal; } } $fieldCondition[] = [ $field, $condition->getOperator(), $value, $bizprocJoiner ]; $bizprocJoiner = ($joiner === static::JOINER_OR) ? 1 : 0; } $activity = array( 'Type' => 'IfElseActivity', 'Name' => Robot::generateName(), 'Properties' => array('Title' => $title), 'Children' => array( array( 'Type' => 'IfElseBranchActivity', 'Name' => Robot::generateName(), 'Properties' => array( 'Title' => $title, 'fieldcondition' => $fieldCondition ), 'Children' => array($childActivity) ), array( 'Type' => 'IfElseBranchActivity', 'Name' => Robot::generateName(), 'Properties' => array( 'Title' => $title, 'truecondition' => '1', ), 'Children' => array() ) ) ); return $activity; } /** * @param array &$activity Target activity array. * @param array $documentType * @return false|ConditionGroup Instance of false. */ public static function convertBizprocActivity(array &$activity, array $documentType) { $conditionGroup = false; $documentService = \CBPRuntime::GetRuntime(true)->GetService("DocumentService"); $documentFields = $documentService->GetDocumentFields($documentType); if ( count($activity['Children']) === 2 && $activity['Children'][0]['Type'] === 'IfElseBranchActivity' && $activity['Children'][1]['Type'] === 'IfElseBranchActivity' && !empty($activity['Children'][0]['Properties']['fieldcondition']) && !empty($activity['Children'][1]['Properties']['truecondition']) && count($activity['Children'][0]['Children']) === 1 && count($activity['Children'][0]['Properties']['fieldcondition']) > 0 ) { $conditionGroup = new static(); $bizprocConditions = $activity['Children'][0]['Properties']['fieldcondition']; foreach ($bizprocConditions as $index => $fieldCondition) { $property = isset($documentFields[$fieldCondition[0]]) ? $documentFields[$fieldCondition[0]] : null; if ($property && $property['Type'] === 'user') { $fieldCondition[2] = \CBPHelper::UsersArrayToString( $fieldCondition[2], null, $documentType ); } $conditionItem = new Condition(array( 'field' => $fieldCondition[0], 'operator' => $fieldCondition[1], 'value' => $fieldCondition[2], )); $nextCondition = isset($bizprocConditions[$index + 1]) ? $bizprocConditions[$index + 1] : null; $joiner = ($nextCondition && !empty($nextCondition[3])) ? static::JOINER_OR : static::JOINER_AND; $conditionGroup->addItem($conditionItem, $joiner); } $activity = $activity['Children'][0]['Children'][0]; } return $conditionGroup; } }