• Модуль: timeman
  • Путь к файлу: ~/bitrix/modules/timeman/lib/service/agent/worktimeagentmanager.php
  • Класс: BitrixTimemanServiceAgentWorktimeAgentManager
  • Вызов: WorktimeAgentManager::buildPeriodDates
private function buildPeriodDates($schedule, $fromDateTime)
{
	$toDateTime = null;
	$today = DateTime::createFromFormat('Y-m-d',
		TimeHelper::getInstance()->getCurrentServerDateFormatted()
	);
	if ($fromDateTime)
	{
		$fromDateTime->add(new DateInterval('P1D'));
	}
	switch ($schedule->getReportPeriod())
	{
		case ScheduleTable::REPORT_PERIOD_MONTH:
			if ($fromDateTime === null)
			{
				$fromDateTime = clone $today;
				$fromDateTime->modify('first day of next month');
			}
			$fromDateTime->setTime(0, 0, 0);

			$toDateTime = clone $fromDateTime;
			$toDateTime->modify('last day of');
			$toDateTime->setTime(23, 59, 59);
			break;

		case ScheduleTable::REPORT_PERIOD_QUARTER:
			$ranges = [
				1 => ['01.01', '31.03'],
				2 => ['01.04', '30.06'],
				3 => ['01.07', '30.09'],
				4 => ['01.10', '31.12'],
			];
			if ($fromDateTime === null)
			{
				$currentQuarter = intval(((int)$today->format('n') + 2) / 3);

				if ($currentQuarter === 4)
				{
					$fromDateTime = DateTime::createFromFormat('d.m.Y H:i:s', $ranges[1][0] . '.' . $today->format('Y') . ' 00:00:00');
					$fromDateTime->add(new DateInterval('P1Y'));
					$toDateTime = DateTime::createFromFormat('d.m.Y H:i:s', $ranges[1][1] . '.' . $today->format('Y') . ' 23:59:59');
					$toDateTime->add(new DateInterval('P1Y'));
				}
				else
				{
					$fromDateTime = DateTime::createFromFormat('d.m.Y H:i:s', $ranges[$currentQuarter + 1][0] . '.' . $today->format('Y') . ' 00:00:00');
					$toDateTime = DateTime::createFromFormat('d.m.Y H:i:s', $ranges[$currentQuarter + 1][1] . '.' . $today->format('Y') . ' 23:59:59');
				}
			}
			else
			{
				$fromDateTime->setTime(0, 0, 0);
				$currentQuarter = intval(((int)$fromDateTime->format('n') + 2) / 3);
				$toDateTime = DateTime::createFromFormat('d.m.Y H:i:s', $ranges[$currentQuarter][1] . '.' . $fromDateTime->format('Y') . ' 23:59:59');
			}

			break;
		case ScheduleTable::REPORT_PERIOD_WEEK:
		case ScheduleTable::REPORT_PERIOD_TWO_WEEKS:
			if ($fromDateTime !== null)
			{
				$fromDateTime->setTime(0, 0, 0);
			}
			else
			{
				$fromDateTime = clone $today;
				$startDay = (int)$schedule->getReportPeriodOptions()[ScheduleTable::REPORT_PERIOD_OPTIONS_START_WEEK_DAY];
				switch ($startDay)
				{
					case ScheduleTable::REPORT_PERIOD_OPTIONS_START_WEEK_DAY_MONDAY:
						$fromDateTime->modify('next monday');
						break;
					case ScheduleTable::REPORT_PERIOD_OPTIONS_START_WEEK_DAY_TUESDAY:
						$fromDateTime->modify('next tuesday');
						break;
					case ScheduleTable::REPORT_PERIOD_OPTIONS_START_WEEK_DAY_WEDNESDAY:
						$fromDateTime->modify('next wednesday');
						break;
					case ScheduleTable::REPORT_PERIOD_OPTIONS_START_WEEK_DAY_THURSDAY:
						$fromDateTime->modify('next thursday');
						break;
					case ScheduleTable::REPORT_PERIOD_OPTIONS_START_WEEK_DAY_FRIDAY:
						$fromDateTime->modify('next friday');
						break;
					case ScheduleTable::REPORT_PERIOD_OPTIONS_START_WEEK_DAY_SUNDAY:
						$fromDateTime->modify('next sunday');
						break;
					case ScheduleTable::REPORT_PERIOD_OPTIONS_START_WEEK_DAY_SATURDAY:
						$fromDateTime->modify('next saturday');
						break;
				}
			}
			$fromDateTime->setTime(0, 0, 0);

			$toDateTime = clone $fromDateTime;
			$toDateTime->setTime(23, 59, 59);
			$toDateTime->add(new DateInterval(
				$schedule->getReportPeriod() === ScheduleTable::REPORT_PERIOD_WEEK ? 'P6D' : 'P13D'
			));
			break;
		default:
			break;
	}


	return [$fromDateTime, $toDateTime];
}