Исправление календаря в отчетах
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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