Исправление календаря в отчетах
This commit is contained in:
@@ -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 [
|
||||
|
||||
Reference in New Issue
Block a user