Обновлен стартовый экран

Переписаны запросы для статистики, отчетов
Добавлена интеграция отчета сестры
This commit is contained in:
brusnitsyn
2026-05-28 22:10:00 +09:00
parent 90e0d04dfd
commit 739168d427
96 changed files with 6663 additions and 1465 deletions

View File

@@ -47,16 +47,14 @@ class DateRangeService
{
$endAtInput = $request->query('endAt', $request->get('endAt'));
$startAtInput = $request->query('startAt', $request->get('startAt'));
$endDate = $endAtInput
? $this->parseDate($endAtInput)
: Carbon::now('Asia/Yakutsk');
$startDate = $startAtInput
? $this->parseDate($startAtInput)
: Carbon::now('Asia/Yakutsk');
$endDate = $endDate->copy()->setTime(9, 0);
$startDate = $startDate->copy()->subDay()->setTime(9, 0);
if (!$endAtInput && !$startAtInput) {
[$startDate, $endDate] = $this->currentShiftBoundaries();
} else {
$endDate = ($endAtInput ? $this->parseDate($endAtInput) : Carbon::now('Asia/Yakutsk'))
->copy()->setTime(9, 0);
$startDate = ($startAtInput ? $this->parseDate($startAtInput) : Carbon::now('Asia/Yakutsk'))
->copy()->subDay()->setTime(9, 0);
}
return new DateRange(
startDate: $startDate,
@@ -138,12 +136,7 @@ class DateRangeService
private function getDefaultDateRange($user): array
{
$startDate = Carbon::now('Asia/Yakutsk')
->subDay()
->setTime(9, 0);
$endDate = Carbon::now('Asia/Yakutsk')
->setTime(9, 0);
[$startDate, $endDate] = $this->currentShiftBoundaries();
return [
$startDate->format('Y-m-d H:i:s'),
@@ -151,6 +144,18 @@ class DateRangeService
];
}
private function currentShiftBoundaries(): array
{
$now = Carbon::now('Asia/Yakutsk');
$todayAt9 = $now->copy()->setTime(9, 0, 0);
if ($now->gte($todayAt9)) {
return [$todayAt9, $todayAt9->copy()->addDay()];
}
return [$todayAt9->copy()->subDay(), $todayAt9];
}
public function parseDate($dateInput): Carbon
{
if (is_numeric($dateInput)) {
@@ -214,7 +219,26 @@ class DateRangeService
*/
public function isPastPeriod(DateRange $dateRange): bool
{
// Период считается "прошлым", если его конец строго раньше начала текущих суток
return $dateRange->end()->lt(now()->startOfDay());
$periodStart = $dateRange->start();
$now = now();
// Получаем начало текущей смены (сегодня 09:00)
$currentShiftStart = $now->copy()->setTime(9, 0, 0);
if ($now->lt($currentShiftStart)) {
$currentShiftStart->subDay();
}
// Если период начался ДО начала текущей смены - он прошедший
// (даже если формально он еще не закончился)
return $periodStart->lt($currentShiftStart);
}
public function dateInPeriod(Carbon|string|null $date, DateRange $dateRange): bool
{
$date = self::toCarbon($date);
return $date
&& $date->gt($dateRange->startDate)
&& $date->lte($dateRange->endDate);
}
}