66 lines
2.4 KiB
PHP
66 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace App\Infrastructure\Http\Controllers\Web;
|
|
|
|
use App\Domain\ReportDuty\Actions\CreateReportDutyAction;
|
|
use App\Domain\ReportDuty\Actions\GenerateAndSaveReportSnapshotAction;
|
|
use App\Domain\ReportDuty\Actions\SaveObservablePatientsAction;
|
|
use App\Domain\ReportDuty\DTO\CreateReportDutyDto;
|
|
use App\Infrastructure\Http\Requests\CreateDutyReportRequest;
|
|
use App\Services\DateRange;
|
|
use Inertia\Inertia;
|
|
|
|
class DutyReportController
|
|
{
|
|
public function store(
|
|
CreateDutyReportRequest $request,
|
|
CreateReportDutyAction $createAction,
|
|
GenerateAndSaveReportSnapshotAction $snapshotAction
|
|
) {
|
|
// Валидация уже выполнена в FormRequest
|
|
$validated = $request->validated();
|
|
|
|
// Создаём DTO и DateRange
|
|
$dateRange = new DateRange(
|
|
$validated['period_start'],
|
|
$validated['period_end']
|
|
);
|
|
|
|
$dto = new CreateReportDutyDto(
|
|
reportDate: $dateRange->endSql(),
|
|
periodStart: $dateRange->startSql(),
|
|
periodEnd: $dateRange->endSql(),
|
|
periodType: $validated['period_type'] ?? 'day',
|
|
statusId: $validated['status_id'] ?? 2,
|
|
rfLpuDoctorId: $request->user()->rf_lpudoctor_id,
|
|
rfDepartmentId: $request->user()->rf_department_id,
|
|
rfUserId: $request->user()->id,
|
|
);
|
|
|
|
// Вызов Use Case для создания отчёта
|
|
$report = $createAction->execute($dto);
|
|
|
|
// Вызов Use Case для сохранения снимка и расчёта статистики
|
|
$stats = $snapshotAction->execute(
|
|
$report,
|
|
$dateRange,
|
|
$request->user()->rf_department_id,
|
|
$request->user()->id
|
|
);
|
|
|
|
// Сохраняем наблюдаемых пациентов и нежелательные события
|
|
if ($request->has('observables')) {
|
|
$observableAction = app(SaveObservablePatientsAction::class);
|
|
$observableAction->execute($report, $validated['observables']);
|
|
}
|
|
|
|
if ($request->has('unwanted_events')) {
|
|
$unwantedAction = app(SaveUnwantedEventsAction::class);
|
|
$unwantedAction->execute($report, $validated['unwanted_events']);
|
|
}
|
|
|
|
// Возвращаем Inertia-ответ (редирект или рендер)
|
|
return Inertia::location(route('reports.duty.show', $report->id));
|
|
}
|
|
}
|