private function translateFilterTs(string $key, $val): ?ConditionTree
{
$timestamp = time();
if (!CTimeZone::enabled())
{
CTimeZone::enable();
}
$tzOffset = CTimeZone::getOffset();
$timestamp += $tzOffset;
if (!CTimeZone::enabled())
{
CTimeZone::disable();
}
$filter = [
'::LOGIC' => 'AND'
];
$key = ltrim($key);
$operation = $this->parseOperation($key);
if (mb_substr($operation, 0, 1) === self::OPERATION_LEGACY)
{
$operationCode = (int) mb_substr($operation, 1);
$arManifest = CTaskFilterCtrl::getManifest();
$arOperationsMap = $arManifest['Operations map'];
$operationPrefix = $arOperationsMap[$operationCode];
$fieldName = mb_substr($key, mb_strlen($operationPrefix) + 5, -3); // Cutoff operation, prefix "META:" and suffix "_TS"
}
else
{
$fieldName = mb_substr($key, 0, mb_strlen($key) - 3);
if ($operation !== self::OPERATION_DEFAULT)
{
$fieldName = mb_substr($fieldName, mb_strlen($operation));
}
switch ($operation)
{
case self::OPERATION_LESS:
$operationCode = CTaskFilterCtrl::OP_STRICTLY_LESS;
break;
case self::OPERATION_GREAT:
$operationCode = CTaskFilterCtrl::OP_STRICTLY_GREATER;
break;
case self::OPERATION_LESS_EQ:
$operationCode = CTaskFilterCtrl::OP_LESS_OR_EQUAL;
break;
case self::OPERATION_GREAT_EQ:
$operationCode = CTaskFilterCtrl::OP_GREATER_OR_EQUAL;
break;
case self::OPERATION_NOT_EQUAL:
$operationCode = CTaskFilterCtrl::OP_NOT_EQUAL;
break;
case self::OPERATION_DEFAULT:
case self::OPERATION_EQUAL:
$operationCode = CTaskFilterCtrl::OP_EQUAL;
break;
default:
return null;
}
}
if (
$operationCode !== CTaskFilterCtrl::OP_DATE_NEXT_DAYS
&& $operationCode !== CTaskFilterCtrl::OP_DATE_LAST_DAYS
)
{
$val += $tzOffset;
}
$dateFinish = null;
$operationB = null;
$ts2 = null;
$weekDay = date('N');
switch ($operationCode)
{
case CTaskFilterCtrl::OP_DATE_TODAY:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = $ts2 = $timestamp;
break;
case CTaskFilterCtrl::OP_DATE_YESTERDAY:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = $ts2 = $timestamp - 86400;
break;
case CTaskFilterCtrl::OP_DATE_TOMORROW:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = $ts2 = $timestamp + 86400;
break;
case CTaskFilterCtrl::OP_DATE_CUR_WEEK:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = $timestamp - ($weekDay - 1) * 86400;
$ts2 = $timestamp + (7 - $weekDay) * 86400;
break;
case CTaskFilterCtrl::OP_DATE_PREV_WEEK:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = $timestamp - ($weekDay - 1 + 7) * 86400;
$ts2 = $timestamp - $weekDay * 86400;
break;
case CTaskFilterCtrl::OP_DATE_NEXT_WEEK:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = $timestamp + (7 - $weekDay + 1) * 86400;
$ts2 = $timestamp + (7 - $weekDay + 7) * 86400;
break;
case CTaskFilterCtrl::OP_DATE_CUR_MONTH:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = mktime(0, 0, 0, date('n', $timestamp), 1, date('Y', $timestamp));
$ts2 = mktime(23, 59, 59, date('n', $timestamp) + 1, 0, date('Y', $timestamp));
break;
case CTaskFilterCtrl::OP_DATE_PREV_MONTH:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = mktime(0, 0, 0, date('n', $timestamp) - 1, 1, date('Y', $timestamp));
$ts2 = mktime(23, 59, 59, date('n', $timestamp), 0, date('Y', $timestamp));
break;
case CTaskFilterCtrl::OP_DATE_NEXT_MONTH:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = mktime(0, 0, 0, date('n', $timestamp) + 1, 1, date('Y', $timestamp));
$ts2 = mktime(23, 59, 59, date('n', $timestamp) + 2, 0, date('Y', $timestamp));
break;
case CTaskFilterCtrl::OP_DATE_LAST_DAYS:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = $timestamp - ((int)$val) * 86400; // val in days
$ts2 = $timestamp;
break;
case CTaskFilterCtrl::OP_DATE_NEXT_DAYS:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = $timestamp;
$ts2 = $timestamp + ((int)$val) * 86400; // val in days
break;
case CTaskFilterCtrl::OP_EQUAL:
$operationA = self::OPERATION_GREAT_EQ;
$operationB = self::OPERATION_LESS_EQ;
$ts1 = mktime(0, 0, 0, date('n', $val), date('j', $val), date('Y', $val));
$ts2 = mktime(23, 59, 59, date('n', $val), date('j', $val), date('Y', $val));
break;
case CTaskFilterCtrl::OP_LESS_OR_EQUAL:
$operationA = self::OPERATION_LESS_EQ;
$ts1 = $val;
break;
case CTaskFilterCtrl::OP_GREATER_OR_EQUAL:
$operationA = self::OPERATION_GREAT_EQ;
$ts1 = $val;
break;
case CTaskFilterCtrl::OP_NOT_EQUAL:
$operationA = self::OPERATION_LESS;
$operationB = self::OPERATION_GREAT;
$ts1 = mktime(0, 0, 0, date('n', $val), date('j', $val), date('Y', $val));
$ts2 = mktime(23, 59, 59, date('n', $val), date('j', $val), date('Y', $val));
break;
case CTaskFilterCtrl::OP_STRICTLY_LESS:
$operationA = self::OPERATION_LESS;
$ts1 = $val;
break;
case CTaskFilterCtrl::OP_STRICTLY_GREATER:
$operationA = self::OPERATION_GREAT;
$ts1 = $val;
break;
default:
return null;
}
$dateStart = ConvertTimeStamp(mktime(0, 0, 0, date('n', $ts1), date('j', $ts1), date('Y', $ts1)), 'FULL');
if ($ts2)
{
$dateFinish = ConvertTimeStamp(mktime(23, 59, 59, date('n', $ts2), date('j', $ts2), date('Y', $ts2)), 'FULL');
}
if ($dateStart)
{
$arrayKey = $operationA.$fieldName;
while (isset($filter[$arrayKey]))
{
$arrayKey = ' '.$arrayKey;
}
$filter[$arrayKey] = $dateStart;
}
if (
$operationB
&& $dateFinish
)
{
$arrayKey = $operationB.$fieldName;
while (isset($filter[$arrayKey]))
{
$arrayKey = ' '.$arrayKey;
}
$filter[$arrayKey] = $dateFinish;
}
return $this->translateFilter($filter);
}