<?php
// Bitrix\Bizproc\Automation\Engine\Condition :: check()
// /dist/bitrix/modules/bizproc/lib/automation/engine/condition.php:93
public function check($needle, $fieldType, BaseTarget $target, FieldType $fieldTypeObject = null)
{
$operator = $this->getOperator();
if ($operator === 'empty')
{
return \CBPHelper::isEmptyValue($needle);
}
elseif ($operator === '!empty')
{
return !\CBPHelper::isEmptyValue($needle);
}
$result = false;
$value = $this->getValue();
$documentId = $target->getDocumentType();
$documentId[2] = $target->getDocumentId();
if ($fieldType === 'user')
{
$needle = \CBPHelper::extractUsers($needle, $documentId);
$value = \CBPHelper::extractUsers($value, $documentId);
}
elseif ($fieldType === 'select')
{
if (is_array($needle) && \CBPHelper::isAssociativeArray($needle))
{
$needle = array_keys($needle);
}
}
if (!is_array($needle))
{
$needle = array($needle);
}
if ($operator === 'in')
{
foreach ($needle as $f)
{
if (is_array($value))
{
$result = in_array($f, $value);
}
else
{
$result = (strpos($value, $f) !== false);
}
if (!$result)
{
break;
}
}
return $result;
}
if ($operator === 'contain')
{
if (!is_array($value))
{
$value = array($value);
}
foreach ($value as $v)
{
foreach ($needle as $f)
{
if (is_array($f))
{
$result = in_array($v, $f);
}
else
{
$result = (strpos($f, $v) !== false);
}
if ($result)
{
break;
}
}
if (!$result)
{
break;
}
}
return $result;
}
if (!is_array($value))
{
$value = array($value);
}
if (\CBPHelper::isAssociativeArray($needle))
{
$needle = array_keys($needle);
}
if (\CBPHelper::isAssociativeArray($value))
{
$value = array_keys($value);
}
if (count($needle) === 0)
{
$needle = array(null);
}
if (count($value) === 0)
{
$value = array(null);
}
$i = 0;
$fieldCount = count($needle);
$valueCount = count($value);
$iMax = max($fieldCount, $valueCount);
while ($i < $iMax)
{
$f1 = ($fieldCount > $i) ? $needle[$i] : $needle[$fieldCount - 1];
$v1 = ($valueCount > $i) ? $value[$i] : $value[$valueCount - 1];
if ($fieldType === 'datetime' || $fieldType === 'date')
{
$f1 = \CBPHelper::makeTimestamp($f1);
$v1 = \CBPHelper::makeTimestamp($v1);
}
if ($fieldType === 'bool')
{
$f1 = \CBPHelper::getBool($f1);
$v1 = \CBPHelper::getBool($v1);
}
//normalize "0" == "" comparing
if ($v1 === '' && $f1 === '0' || $f1 === '' && $v1 === '0')
{
$f1 = $v1 = null;
}
/** @var \Bitrix\Bizproc\BaseType\Base $classType */
$classType = \Bitrix\Bizproc\BaseType\Base::class;
if ($fieldTypeObject)
{
$classType = $fieldTypeObject->getTypeClass();
}
$compareResult = $classType::compareValues($f1, $v1);
switch ($operator)
{
case '>':
$result = ($compareResult === 1);
break;
case '>=':
$result = ($compareResult >= 0);
break;
case '<':
$result = ($compareResult === -1);
break;
case '<=':
$result = ($compareResult <= 0);
break;
case '!=':
$result = ($compareResult !== 0);
break;
default:
$result = ($compareResult === 0);
}
if (!$result)
{
break;
}
$i++;
}
return $result;
}