diff --git a/app/Http/Controllers/Web/DutyReportController.php b/app/Http/Controllers/Web/DutyReportController.php index 6b4c3a9..84b39ca 100644 --- a/app/Http/Controllers/Web/DutyReportController.php +++ b/app/Http/Controllers/Web/DutyReportController.php @@ -48,7 +48,7 @@ class DutyReportController extends Controller $department = Department::where('department_id', $departmentId)->firstOrFail(); $bedsInDepartment = DepartmentMetrikaDefault::where('rf_department_id', $departmentId) ->where('rf_metrika_item_id', 1)->first()->value ?? 0; - $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user); + $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user, extendRangeEnd: false); $isRangeOneDay = $this->dateRangeService->isRangeOneDay($dateRange->startDate, $dateRange->endDate); $isPastPeriod = $this->dateRangeService->isPastPeriod($dateRange); @@ -331,7 +331,7 @@ class DutyReportController extends Controller $selectedDepartmentId = $request->get('departmentId') ? (int) $request->get('departmentId') : null; $staff = (int) $request->get('staff', 0); - $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user); + $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user, extendRangeEnd: false); $report = $this->dutyReportService->saveReport($dateRange, null, $selectedUserId, $selectedDepartmentId); $stats = $this->dutyReportService->saveSnapshot($dateRange, $report, null, auth()->id()); $this->dutyReportService->saveObservables($observables, $report); @@ -345,7 +345,7 @@ class DutyReportController extends Controller public function closeObservation(Request $request) { $user = auth()->user(); - $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user); + $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user, extendRangeEnd: false); $observable = $request->get('observable'); $observableId = $observable['id'] ?? null; @@ -369,7 +369,7 @@ class DutyReportController extends Controller $queryDepartmentId = $request->query('departmentId', $user->department->department_id); $department = Department::findOrFail($queryDepartmentId); - $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user); + $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user, extendRangeEnd: false); $reportDutyIds = ReportDuty::where('rf_department_id', $department->department_id) ->where('period_start', '>=', $dateRange->startSql()) diff --git a/app/Http/Controllers/Web/NurseReportController.php b/app/Http/Controllers/Web/NurseReportController.php index ce69bc7..1839d76 100644 --- a/app/Http/Controllers/Web/NurseReportController.php +++ b/app/Http/Controllers/Web/NurseReportController.php @@ -34,7 +34,7 @@ class NurseReportController extends Controller $selectedUserId = $request->query('userId') ? (int) $request->query('userId') : null; $departmentId = $request->query('departmentId') ? (int) $request->query('departmentId') : null; $department = Department::where('department_id', $departmentId)->firstOrFail(); - $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user); + $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user, extendRangeEnd: false); $isRangeOneDay = $this->dateRangeService->isRangeOneDay($dateRange->startDate, $dateRange->endDate); // Проверяем, есть ли отчет за этот период @@ -117,7 +117,7 @@ class NurseReportController extends Controller $selectedUserId = $request->input('userId') ? (int) $request->input('userId') : null; $departmentId = $request->input('departmentId') ? (int) $request->input('departmentId') : null; - $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user); + $dateRange = $this->dateRangeService->getDateRangeFromRequest($request, $user, extendRangeEnd: false); $report = $this->nurseReportService->saveReport($dateRange, null, $selectedUserId, $departmentId); $this->nurseReportService->saveSnapshot($dateRange, $report, null, auth()->id()); diff --git a/app/Services/DateRangeService.php b/app/Services/DateRangeService.php index 022303c..9e1e852 100644 --- a/app/Services/DateRangeService.php +++ b/app/Services/DateRangeService.php @@ -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 [