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

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

@@ -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())

View File

@@ -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());

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 [