• Модуль: timeman
  • Путь к файлу: ~/bitrix/modules/timeman/classes/general/timeman_entry.php
  • Класс: CAllTimeManEntry
  • Вызов: CAllTimeManEntry::CheckFields
static function CheckFields($action, &$arFields)
{
	global $DB, $USER;

	$tz_diff = 0;
	if ($action == 'UPDATE')
	{
		$dbRes = CTimeManEntry::GetList([], ['ID' => $arFields['ID']]);
		if (!($arEntry = $dbRes->Fetch()))
		{
			return false;
		}

		$tz_diff = (MakeTimeStamp($arEntry['DATE_START']) % 86400) - $arEntry['TIME_START'];

		if (
			isset($arFields["DATE_START"])
			|| isset($arFields["DATE_FINISH"])
			|| isset($arFields["TIME_START"])
			|| isset($arFields["TIME_FINISH"])
		)
		{
			if (!isset($arFields['DATE_START']))
			{
				if (!isset($arFields['TIME_START']))
				{
					$arFields['DATE_START'] = $arEntry['DATE_START'];
				}
				else
				{
					$arFields['DATE_START'] = ConvertTimeStamp(
						MakeTimeStamp($arEntry['DATE_START']) + $arFields['TIME_START'] - $arEntry['TIME_START'] - $tz_diff,
						'FULL'
					);
				}
			}

			if (!isset($arFields['DATE_FINISH']))
			{
				if (!isset($arFields['TIME_FINISH']))
				{
					$arFields['DATE_FINISH'] = $arEntry['DATE_FINISH'];
				}
				else
				{
					if ($arEntry['DATE_FINISH'])
					{
						$arFields['DATE_FINISH'] = ConvertTimeStamp(
							MakeTimeStamp($arEntry['DATE_FINISH']) + $arFields['TIME_FINISH'] - $arEntry['TIME_FINISH'] - $tz_diff,
							'FULL'
						);
					}
					else
					{
						$arFields['DATE_FINISH'] = ConvertTimeStamp(
							MakeTimeStamp($arFields['DATE_START']) - $arFields['TIME_START'] + $arFields['TIME_FINISH'],
							'FULL'
						);
					}
				}
			}
		}
	}

	if ($action == 'ADD' && (!$arFields['USER_ID'] || !$arFields['DATE_START']))
	{
		return false;
	}

	$ts_start = MakeTimeStamp($arFields['DATE_START'] ?? '');
	$ts_finish = MakeTimeStamp($arFields['DATE_FINISH'] ?? '');

	if ($ts_start > 0 && $ts_finish > 0)
	{
		if ($ts_finish < $ts_start)
		{
			$ts_finish += $ts_start;
			$ts_start = $ts_finish - $ts_start;
			$ts_finish -= $ts_start;

			$arFields['DATE_START'] = ConvertTimeStamp($ts_start, 'FULL');
			$arFields['DATE_FINISH'] = ConvertTimeStamp($ts_finish, 'FULL');
		}
	}

	//ts_start and ts_finish are with correct time but for server timezone offset
	if ($ts_start > 0 && !isset($arFields['TIME_START']))
	{
		$arFields['TIME_START'] = (($ts_start + date('Z')) % 86400);
	}
	if ($ts_finish > 0 && !isset($arFields['TIME_FINISH']))
	{
		$arFields['TIME_FINISH'] = (($ts_finish + date('Z')) % 86400);
	}

	if ($action == 'ADD' || isset($arFields['ACTIVE']))
	{
		$arFields['ACTIVE'] = $arFields['ACTIVE'] == 'N' ? 'N' : 'Y';
	}
	if ($action == 'ADD' || isset($arFields['PAUSED']))
	{
		$arFields['PAUSED'] = $arFields['PAUSED'] == 'Y' ? 'Y' : 'N';
	}

	if (isset($arFields['TASKS']) && is_array($arFields['TASKS']))
	{
		$arFields['TASKS'] = serialize($arFields['TASKS']);
	}

	if (isset($arFields['TIME_LEAKS']))
	{
		$arFields['TIME_LEAKS'] = intval($arFields['TIME_LEAKS']);
	}
	elseif ($action == 'UPDATE')
	{
		$arFields['TIME_LEAKS'] = intval($arEntry['TIME_LEAKS']);
	}

	if ($ts_start > 0 && $ts_finish > 0 && $arFields['PAUSED'] != 'Y' && !isset($arFields['DURATION']))
	{
		$arFields['DURATION'] = $arFields['TIME_FINISH'] - $arFields['TIME_START'] - $arFields['TIME_LEAKS'];
	}

	if (isset($arFields['DURATION']))
	{
		$arFields['DURATION'] = intval($arFields['DURATION']);
	}
	elseif (
		$arFields['DATE_FINISH'] ?? null
		&& $arFields['PAUSED'] != 'Y'
	)
	{
		$arFields['DURATION'] = $arFields['TIME_FINISH'] - $arFields['TIME_START'] - $arFields['TIME_LEAKS'];
	}

	if (isset($arFields['TIME_LEAKS_ADD']))
	{
		$arFields['TIME_LEAKS'] += intval($arFields['TIME_LEAKS_ADD']);

		if ($arFields['DATE_FINISH'])
		{
			$arFields['DURATION'] -= intval($arFields['TIME_LEAKS_ADD']);
		}

		unset($arFields['TIME_LEAKS_ADD']);
	}

	unset($arFields['ID']);
	unset($arFields['TIMESTAMP_X']);

	$arFields['MODIFIED_BY'] = $USER->GetID();

	if (isset($arFields['LAT_OPEN']))
	{
		$arFields['LAT_OPEN'] = doubleval($arFields['LAT_OPEN']);
	}

	if (isset($arFields['LON_OPEN']))
	{
		$arFields['LON_OPEN'] = doubleval($arFields['LON_OPEN']);
	}

	if (isset($arFields['LAT_CLOSE']))
	{
		$arFields['LAT_CLOSE'] = doubleval($arFields['LAT_CLOSE']);
	}

	if (isset($arFields['LON_CLOSE']))
	{
		$arFields['LON_CLOSE'] = doubleval($arFields['LON_CLOSE']);
	}

	$arFields['~TIMESTAMP_X'] = $DB->GetNowFunction();

	return true;
}