Your IP : 18.118.186.62


Current Path : /home/bitrix/ext_www/ballu.in.ua/bitrix/modules/bizproc/lib/automation/engine/
Upload File :
Current File : /home/bitrix/ext_www/ballu.in.ua/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();

		$documentService = \CBPRuntime::getRuntime(true)->getDocumentService();
		$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)->getDocumentService();
		$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)->getDocumentService();
		$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;
	}
}