- Модуль: 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];
}