static function getFieldRuntimeOptions($key, $value, $parameters)
{
$runtimeOptions = [
'FIELDS' => [],
'FILTERS' => [],
];
$dates = ['DEADLINE', 'CREATED_DATE', 'CLOSED_DATE', 'DATE_START', 'START_DATE_PLAN', 'END_DATE_PLAN'];
switch ($key)
{
case 'ID':
case 'PRIORITY':
case 'MARK':
case 'ALLOW_TIME_TRACKING':
case 'DEADLINE':
case 'CREATED_DATE':
case 'CLOSED_DATE':
case 'DATE_START':
case 'START_DATE_PLAN':
case 'END_DATE_PLAN':
foreach ($value as $name => $val)
{
if (in_array($key, $dates))
{
$val = new TypeDateTime($val);
}
$fieldKeyData = static::parseFieldKey($name, $key);
$runtimeOptions['FILTERS'][$key] = Query::filter()->where($key, $fieldKeyData['OPERATOR'], $val);
}
break;
case 'TITLE':
foreach ($value as $name => $val)
{
$fieldKeyData = static::parseFieldKey($name, $key);
$field = Query::expr()->upper($key);
$val = '%' . ToUpper($val) . '%';
$runtimeOptions['FILTERS'][$key] = Query::filter()->where($field, $fieldKeyData['OPERATOR'], $val);
}
break;
case 'CREATED_BY':
case 'RESPONSIBLE_ID':
case 'GROUP_ID':
$fieldKeyData = static::parseFieldKey(key($value), $key, 'in');
$runtimeOptions['FILTERS'][$key] = Query::filter()
->where($key, $fieldKeyData['OPERATOR'], current($value));
break;
case 'STATUS':
if (!empty($value['REAL_STATUS']))
{
$runtimeOptions['FILTERS'][$key] = Query::filter()->where($key, 'in', $value['REAL_STATUS']);
}
break;
case 'ACCOMPLICE':
case 'AUDITOR':
case 'TAG':
$parameters['USER_ID'] = $parameters['NAME'] = current($value);
$parameters['TYPE_CONDITION'] = true;
$runtimeOptions['FILTERS'][$key] = Query::filter()
->whereExists(static::getSelectionExpressionByType($key, $parameters));
break;
case 'ROLEID':
case 'PROBLEM':
if ($key === 'ROLEID')
{
$filterOptions = static::getFilterOptionsFromRoleField($value);
}
else
{
$filterOptions = static::getFilterOptionsFromProblemField($value, $parameters);
}
$runtimeOptions['FIELDS'] = $filterOptions['FIELDS'];
$runtimeOptions['FILTERS'] = $filterOptions['FILTERS'];
break;
case 'ACTIVE':
$date = $value[$key];
$dateStart = $dateEnd = false;
if (MakeTimeStamp($date['START']) > 0)
{
$dateStart = new TypeDateTime($date['START']);
}
if (MakeTimeStamp($date['END']))
{
$dateEnd = new TypeDateTime($date['END']);
}
if ($dateStart !== false && $dateEnd !== false)
{
$runtimeOptions['FILTERS'][$key] = Query::filter()->where(
Query::filter()
->logic('or')
->where(
Query::filter()
->where('CREATED_DATE', '>=', $dateStart)
->where('CLOSED_DATE', '<=', $dateEnd)
)
->where(
Query::filter()
->where('CHANGED_DATE', '>=', $dateStart)
->where('CHANGED_DATE', '<=', $dateEnd)
)
->where(
Query::filter()
->where('CREATED_DATE', '<=', $dateStart)
->where('CLOSED_DATE', '=', null)
)
);
}
break;
case 'PARAMS':
foreach ($value as $name => $val)
{
$fieldKeyData = static::parseFieldKey($name);
$fieldName = $fieldKeyData['FIELD_NAME'];
if ($fieldName == 'MARK' || $fieldName == 'ADD_IN_REPORT')
{
$operator = $fieldKeyData['OPERATOR'];
$runtimeOptions['FILTERS'][$fieldName] = Query::filter()->where($fieldName, $operator, $val);
}
elseif ($fieldName == 'FAVORITE')
{
$runtimeOptions['FIELDS'][$fieldName] = new EntityReferenceField(
'FVT',
FavoriteTable::class,
Join::on('ref.TASK_ID', 'this.ID')
->where('ref.USER_ID', $parameters['USER_ID'])
);
$runtimeOptions['FILTERS'][$fieldName] = Query::filter()->where('FVT.TASK_ID', '!=', null);
}
elseif ($fieldName == 'OVERDUED')
{
$runtimeOptions['FILTERS'][$fieldName] = Query::filter()
->where('DEADLINE', '!=', null)
->where('CLOSED_DATE', '!=', null)
->whereColumn('DEADLINE', '<', 'CLOSED_DATE');
}
}
break;
}
return $runtimeOptions;
}