Исправление календаря в отчетах

This commit is contained in:
Brusnitsyn
2026-07-07 01:16:30 +00:00
parent fec4b798bd
commit cd794b17cc
3 changed files with 25 additions and 15 deletions

View File

@@ -11,9 +11,9 @@ class DateRangeService
/**
* Получить унифицированный объект диапазона дат
*/
public function getNormalizedDateRange(User $user, ?string $startAt = null, ?string $endAt = null): DateRange
public function getNormalizedDateRange(User $user, ?string $startAt = null, ?string $endAt = null, bool $extendRangeEnd = true): DateRange
{
[$startDate, $endDate] = $this->getDateRangeForUser($user, $startAt, $endAt);
[$startDate, $endDate] = $this->getDateRangeForUser($user, $startAt, $endAt, $extendRangeEnd);
$startCarbon = Carbon::parse($startDate)->setTimeZone('Asia/Yakutsk');
$endCarbon = Carbon::parse($endDate)->setTimeZone('Asia/Yakutsk');
@@ -35,13 +35,19 @@ class DateRangeService
/**
* Получить диапазон дат из запроса
*
* @param bool $extendRangeEnd Сдвигать конец многодневного диапазона на +1 сутки,
* чтобы захватить смену, начинающуюся в последний выбранный день (нужно для
* агрегированной статистики за период; для отчёта дежурного по конкретной
* смене/сменам не нужно, там диапазон должен быть ровно тем, что выбрали).
*/
public function getDateRangeFromRequest(Request $request, User $user): DateRange
public function getDateRangeFromRequest(Request $request, User $user, bool $extendRangeEnd = true): DateRange
{
return $this->getNormalizedDateRange(
$user,
$request->query('startAt', $request->get('startAt')),
$request->query('endAt', $request->get('endAt'))
$request->query('endAt', $request->get('endAt')),
$extendRangeEnd
);
}
@@ -100,10 +106,10 @@ class DateRangeService
];
}
public function getDateRangeForUser($user, $startAt = null, $endAt = null): array
public function getDateRangeForUser($user, $startAt = null, $endAt = null, bool $extendRangeEnd = true): array
{
if ($startAt && $endAt) {
return $this->getCustomDateRange($startAt, $endAt, $user);
return $this->getCustomDateRange($startAt, $endAt, $user, $extendRangeEnd);
}
return $this->getDefaultDateRange($user);
@@ -121,7 +127,7 @@ class DateRangeService
return $startDate->isSameDay($endDate) || $startDate->diffInDays($endDate) === 1.0;
}
private function getCustomDateRange($startAt, $endAt, $user): array
private function getCustomDateRange($startAt, $endAt, $user, bool $extendRangeEnd = true): array
{
$startDate = $this->parseDate($startAt);
$endDate = $this->parseDate($endAt);
@@ -137,8 +143,12 @@ class DateRangeService
} else {
$startDate = $startDate->setTime(9, 0);
// Смена длится сутки и "принадлежит" дню, в который начинается (см. currentShiftBoundaries).
// Поэтому смена последнего выбранного дня захватывает следующие календарные сутки.
$endDate = $endAlreadyResolved ? $endDate : $endDate->addDay()->setTime(9, 0);
// Поэтому смена последнего выбранного дня захватывает следующие календарные сутки
// но только там, где нужен захват целиком (агрегированная статистика за период,
// $extendRangeEnd = true). Для конкретной смены/отчёта диапазон должен быть ровно тем,
// что выбрали.
$shouldExtend = $extendRangeEnd && ! $endAlreadyResolved;
$endDate = $shouldExtend ? $endDate->addDay()->setTime(9, 0) : $endDate->setTime(9, 0);
}
return [