Пример #1
0
 /**
  * prevent creating through "new"
  */
 private function __construct()
 {
     if ($this->currentUnixTimeStamp === null) {
         $this->currentUnixTimeStamp = CTasksPerHitOption::getHitTimestamp();
         /** @noinspection PhpDeprecationInspection */
         $this->curBitrixTimeStamp = $this->currentUnixTimeStamp + CTasksTools::getTimeZoneOffset();
         $this->expiredCandidatesBitrixTimeStamp = $this->curBitrixTimeStamp + 86400;
         // Calc current time + 24hours (86400 seconds)
         $this->currentDateTime = ConvertTimeStamp($this->curBitrixTimeStamp, 'FULL');
         $this->expiredCandidatesDateTime = ConvertTimeStamp($this->expiredCandidatesBitrixTimeStamp, 'FULL');
     }
 }
Пример #2
0
 private static function getSqlForTimestamps($key, $val, $userID, $sAliasPrefix, $bGetZombie)
 {
     static $ts = null;
     // some fixed timestamp of "now" (for consistency)
     if ($ts === null) {
         $ts = CTasksPerHitOption::getHitTimestamp();
     }
     $bTzWasDisabled = !CTimeZone::enabled();
     if ($bTzWasDisabled) {
         CTimeZone::enable();
     }
     // Adjust UNIX TS to "Bitrix timestamp"
     $tzOffset = CTimeZone::getOffset();
     $val += $tzOffset;
     $ts += $tzOffset;
     if ($bTzWasDisabled) {
         CTimeZone::disable();
     }
     $arSqlSearch = array();
     $arFilter = array('::LOGIC' => 'AND');
     $key = ltrim($key);
     $res = CTasks::MkOperationFilter($key);
     $fieldName = substr($res["FIELD"], 5, -3);
     // Cutoff prefix "META:" and suffix "_TS"
     $cOperationType = $res["OPERATION"];
     $operationSymbol = substr($key, 0, -1 * strlen($res["FIELD"]));
     if (substr($cOperationType, 0, 1) !== '#') {
         switch ($operationSymbol) {
             case '<':
                 $operationCode = CTaskFilterCtrl::OP_STRICTLY_LESS;
                 break;
             case '>':
                 $operationCode = CTaskFilterCtrl::OP_STRICTLY_GREATER;
                 break;
             case '<=':
                 $operationCode = CTaskFilterCtrl::OP_LESS_OR_EQUAL;
                 break;
             case '>=':
                 $operationCode = CTaskFilterCtrl::OP_GREATER_OR_EQUAL;
                 break;
             case '!=':
                 $operationCode = CTaskFilterCtrl::OP_NOT_EQUAL;
                 break;
             case '':
             case '=':
                 $operationCode = CTaskFilterCtrl::OP_EQUAL;
                 break;
             default:
                 CTaskAssert::log('Unknown operation code: ' . $operationSymbol . '; $key = ' . $key . '; it will be silently ignored, incorrect results expected', CTaskAssert::ELL_ERROR);
                 return $arSqlSearch;
                 break;
         }
     } else {
         $operationCode = (int) substr($cOperationType, 1);
     }
     $date1 = $date2 = $cOperationType1 = $cOperationType2 = null;
     // Convert cOperationType to format accepted by self::FilterCreate
     switch ($operationCode) {
         case CTaskFilterCtrl::OP_EQUAL:
         case CTaskFilterCtrl::OP_DATE_TODAY:
         case CTaskFilterCtrl::OP_DATE_YESTERDAY:
         case CTaskFilterCtrl::OP_DATE_TOMORROW:
         case CTaskFilterCtrl::OP_DATE_CUR_WEEK:
         case CTaskFilterCtrl::OP_DATE_PREV_WEEK:
         case CTaskFilterCtrl::OP_DATE_NEXT_WEEK:
         case CTaskFilterCtrl::OP_DATE_CUR_MONTH:
         case CTaskFilterCtrl::OP_DATE_PREV_MONTH:
         case CTaskFilterCtrl::OP_DATE_NEXT_MONTH:
         case CTaskFilterCtrl::OP_DATE_NEXT_DAYS:
         case CTaskFilterCtrl::OP_DATE_LAST_DAYS:
             $cOperationType1 = '>=';
             $cOperationType2 = '<=';
             break;
         case CTaskFilterCtrl::OP_LESS_OR_EQUAL:
             $cOperationType1 = '<=';
             break;
         case CTaskFilterCtrl::OP_GREATER_OR_EQUAL:
             $cOperationType1 = '>=';
             break;
         case CTaskFilterCtrl::OP_NOT_EQUAL:
             $cOperationType1 = '<';
             $cOperationType2 = '>';
             break;
         case CTaskFilterCtrl::OP_STRICTLY_LESS:
             $cOperationType1 = '<';
             break;
         case CTaskFilterCtrl::OP_STRICTLY_GREATER:
             $cOperationType1 = '>';
             break;
         default:
             CTaskAssert::log('Unknown operation code: ' . $operationCode . '; $key = ' . $key . '; it will be silently ignored, incorrect results expected', CTaskAssert::ELL_ERROR);
             return $arSqlSearch;
             break;
     }
     // Convert/generate dates
     $ts1 = $ts2 = null;
     switch ($operationCode) {
         case CTaskFilterCtrl::OP_DATE_TODAY:
             $ts1 = $ts2 = $ts;
             break;
         case CTaskFilterCtrl::OP_DATE_YESTERDAY:
             $ts1 = $ts2 = $ts - 86400;
             break;
         case CTaskFilterCtrl::OP_DATE_TOMORROW:
             $ts1 = $ts2 = $ts + 86400;
             break;
         case CTaskFilterCtrl::OP_DATE_CUR_WEEK:
             $weekDay = date('N');
             // numeric representation of the day of the week (1 to 7)
             $ts1 = $ts - ($weekDay - 1) * 86400;
             $ts2 = $ts + (7 - $weekDay) * 86400;
             break;
         case CTaskFilterCtrl::OP_DATE_PREV_WEEK:
             $weekDay = date('N');
             // numeric representation of the day of the week (1 to 7)
             $ts1 = $ts - ($weekDay - 1 + 7) * 86400;
             $ts2 = $ts - $weekDay * 86400;
             break;
         case CTaskFilterCtrl::OP_DATE_NEXT_WEEK:
             $weekDay = date('N');
             // numeric representation of the day of the week (1 to 7)
             $ts1 = $ts + (7 - $weekDay + 1) * 86400;
             $ts2 = $ts + (7 - $weekDay + 7) * 86400;
             break;
         case CTaskFilterCtrl::OP_DATE_CUR_MONTH:
             $ts1 = mktime(0, 0, 0, date('n', $ts), 1, date('Y', $ts));
             $ts2 = mktime(23, 59, 59, date('n', $ts) + 1, 0, date('Y', $ts));
             break;
         case CTaskFilterCtrl::OP_DATE_PREV_MONTH:
             $ts1 = mktime(0, 0, 0, date('n', $ts) - 1, 1, date('Y', $ts));
             $ts2 = mktime(23, 59, 59, date('n', $ts), 0, date('Y', $ts));
             break;
         case CTaskFilterCtrl::OP_DATE_NEXT_MONTH:
             $ts1 = mktime(0, 0, 0, date('n', $ts) + 1, 1, date('Y', $ts));
             $ts2 = mktime(23, 59, 59, date('n', $ts) + 2, 0, date('Y', $ts));
             break;
         case CTaskFilterCtrl::OP_DATE_LAST_DAYS:
             $ts1 = $ts - (int) $val * 86400;
             $ts2 = $ts;
             break;
         case CTaskFilterCtrl::OP_DATE_NEXT_DAYS:
             $ts1 = $ts;
             $ts2 = $ts + (int) $val * 86400;
             break;
         case CTaskFilterCtrl::OP_GREATER_OR_EQUAL:
         case CTaskFilterCtrl::OP_LESS_OR_EQUAL:
         case CTaskFilterCtrl::OP_STRICTLY_LESS:
         case CTaskFilterCtrl::OP_STRICTLY_GREATER:
             $ts1 = $val;
             break;
         case CTaskFilterCtrl::OP_EQUAL:
             $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_NOT_EQUAL:
             $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;
         default:
             CTaskAssert::log('Unknown operation code: ' . $operationCode . '; $key = ' . $key . '; it will be silently ignored, incorrect results expected', CTaskAssert::ELL_ERROR);
             return $arSqlSearch;
             break;
     }
     if ($ts1) {
         $date1 = ConvertTimeStamp(mktime(0, 0, 0, date('n', $ts1), date('j', $ts1), date('Y', $ts1)), 'FULL');
     }
     if ($ts2) {
         $date2 = ConvertTimeStamp(mktime(23, 59, 59, date('n', $ts2), date('j', $ts2), date('Y', $ts2)), 'FULL');
     }
     if ($cOperationType1 !== null && $date1 !== null) {
         $arrayKey = $cOperationType1 . $fieldName;
         while (isset($arFilter[$arrayKey])) {
             $arrayKey = ' ' . $arrayKey;
         }
         $arFilter[$arrayKey] = $date1;
     }
     if ($cOperationType2 !== null && $date2 !== null) {
         $arrayKey = $cOperationType2 . $fieldName;
         while (isset($arFilter[$arrayKey])) {
             $arrayKey = ' ' . $arrayKey;
         }
         $arFilter[$arrayKey] = $date2;
     }
     $arSqlSearch[] = self::GetSqlByFilter($arFilter, $userID, $sAliasPrefix, $bGetZombie);
     return $arSqlSearch;
 }