07:00) целиком. $start = \Carbon\Carbon::createFromFormat('Y-m-d', $startDate, 'Asia/Yakutsk'); $end = \Carbon\Carbon::createFromFormat('Y-m-d', $endDate, 'Asia/Yakutsk'); $periodEnd = $start->equalTo($end) ? $end->copy() : $end->copy()->addDay(); // Создаем период по дням $period = CarbonPeriod::create($start->toDateString(), $periodEnd->toDateString()); foreach ($period as $date) { $dateRange = $this->dateRangeService->getNormalizedDateRange($user, $date, $date); try { $reportCreated = $this->createReportForDate($user, $department, $dateRange, $force); if ($reportCreated) { $createdCount++; } } catch (\Exception $e) { Log::error("Ошибка создания отчета для {$user->id} на {$date->format('Y-m-d')}: {$e->getMessage()}"); throw $e; // или continue в зависимости от требований } } return $createdCount; } /** * Создать отчет для конкретной даты */ public function createReportForDate(User $user, Department $department, DateRange $dateRange, bool $force = false): bool { $scopedUser = $this->scopeUserToDepartment($user, $department); // Проверяем, существует ли уже отчет на эту дату $existingReport = Report::where('rf_department_id', $department->department_id) ->exactPeriod($dateRange->startSql(), $dateRange->endSql()) ->first(); if ($existingReport && ! $force) { return false; // Отчет уже существует } // Если есть существующий отчет и force=true - удаляем его if ($existingReport && $force) { $this->deleteExistingReport($existingReport); } DB::transaction(function () use ($scopedUser, $department, $dateRange) { $this->reportSavePathService->saveAutoFill($scopedUser, $department, $dateRange); }); return true; } private function scopeUserToDepartment(User $user, Department $department): User { $scopedUser = clone $user; $scopedUser->rf_department_id = $department->department_id; $scopedUser->setRelation('department', $department); return $scopedUser; } private function deleteExistingReport(Report $report): void { DB::transaction(function () use ($report) { MetrikaResult::where('rf_report_id', $report->report_id)->delete(); MedicalHistorySnapshot::where('rf_report_id', $report->report_id)->delete(); UnwantedEvent::where('rf_report_id', $report->report_id)->delete(); ObservationPatient::where('rf_report_id', $report->report_id)->delete(); DB::table('reports')->where('report_id', $report->report_id)->delete(); }); } }