Add consultation-nested assessment create and show routes.
Deploy Ladill Care / deploy (push) Successful in 32s

Index alone still left /consultations/{uuid}/assessments/create and
/consultations/{uuid}/assessments/{uuid} unmatched (404). Wire those
paths, redirect store into the nested show, and cover the doctor form
open flow with feature tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-18 20:47:57 +00:00
co-authored by Cursor
parent 1128ea31cc
commit 3854fc6471
8 changed files with 194 additions and 25 deletions
@@ -75,6 +75,42 @@ class AssessmentController extends Controller
return $this->index($request, $consultation->patient);
}
/**
* Start-form picker under a consultation (parity with prescriptions create).
* GET /consultations/{uuid}/assessments/create
*/
public function createForConsultation(Request $request, Consultation $consultation): View
{
$this->authorizeConsultation($request, $consultation);
$consultation->loadMissing(['patient', 'visit']);
$return = app(ConsultationReturnContext::class);
$return->remember($consultation);
$request->query->set('consultation_uuid', $consultation->uuid);
if ($consultation->visit?->uuid) {
$request->query->set('visit_uuid', $consultation->visit->uuid);
}
$request->query->set(ConsultationReturnContext::QUERY_KEY, $consultation->uuid);
return $this->create($request, $consultation->patient);
}
/**
* Open an assessment while staying on the consultation URL tree.
* GET /consultations/{uuid}/assessments/{assessment}
*/
public function showForConsultation(Request $request, Consultation $consultation, Assessment $assessment): View
{
$this->authorizeConsultation($request, $consultation);
abort_unless((int) $assessment->patient_id === (int) $consultation->patient_id, 404);
$return = app(ConsultationReturnContext::class);
$return->remember($consultation);
$request->query->set(ConsultationReturnContext::QUERY_KEY, $consultation->uuid);
return $this->show($request, $assessment);
}
public function create(Request $request, Patient $patient): View
{
$this->assertEngineEnabled($request);
@@ -99,15 +135,19 @@ class AssessmentController extends Controller
}
})->values();
$returnConsultation = app(ConsultationReturnContext::class)
->resolve($request, (int) $patient->id);
$returnConsultation?->loadMissing('visit');
return view('care.assessments.create', [
'patient' => $patient,
'templates' => $capturable,
'categories' => config('care.assessment_template_categories'),
'consultationUuid' => $request->query('consultation_uuid'),
'visitUuid' => $request->query('visit_uuid'),
'consultationUuid' => $request->query('consultation_uuid') ?? $returnConsultation?->uuid,
'visitUuid' => $request->query('visit_uuid') ?? $returnConsultation?->visit?->uuid,
'returnConsultation' => $returnConsultation,
]);
}
public function store(Request $request, Patient $patient): RedirectResponse
{
$this->assertEngineEnabled($request);
@@ -130,6 +170,16 @@ class AssessmentController extends Controller
);
$return = app(ConsultationReturnContext::class);
if (! empty($context['consultation'])) {
$return->remember($context['consultation']);
return redirect()
->route('care.consultations.assessments.show', [
'consultation' => $context['consultation'],
'assessment' => $assessment,
])
->with('success', 'Assessment started.');
}
return redirect()
->route('care.assessments.show', array_filter([
@@ -168,10 +218,10 @@ class AssessmentController extends Controller
$return->remember($consultation);
return redirect()
->route('care.assessments.show', array_filter([
->route('care.consultations.assessments.show', [
'consultation' => $consultation,
'assessment' => $assessment,
...$return->query($consultation),
]))
])
->with('success', 'Assessment started.');
}
@@ -240,11 +290,7 @@ class AssessmentController extends Controller
$return = app(ConsultationReturnContext::class);
return redirect()
->route('care.assessments.show', array_filter([
'assessment' => $assessment,
...$return->routeQuery($request),
]))
return $this->redirectToAssessmentShow($request, $assessment, $return)
->with('success', 'Assessment saved.');
}
@@ -280,11 +326,7 @@ class AssessmentController extends Controller
$return = app(ConsultationReturnContext::class);
return redirect()
->route('care.assessments.show', array_filter([
'assessment' => $assessment,
...$return->routeQuery($request),
]))
return $this->redirectToAssessmentShow($request, $assessment, $return)
->with('success', 'Assessment completed.');
}
@@ -301,11 +343,41 @@ class AssessmentController extends Controller
$this->ownerRef($request),
);
$return = app(ConsultationReturnContext::class);
$consultation = $return->resolve($request, (int) $assessment->patient_id);
if ($consultation) {
return redirect()
->route('care.consultations.assessments.index', $consultation)
->with('success', 'Assessment cancelled.');
}
return redirect()
->route('care.assessments.index', $assessment->patient)
->with('success', 'Assessment cancelled.');
}
/**
* Prefer consultation-nested show when the doctor is mid-consult.
*/
protected function redirectToAssessmentShow(
Request $request,
Assessment $assessment,
ConsultationReturnContext $return,
): RedirectResponse {
$consultation = $return->resolve($request, (int) $assessment->patient_id)
?? $return->resolveLinked($request, $assessment->consultation);
if ($consultation) {
return redirect()->route('care.consultations.assessments.show', [
'consultation' => $consultation,
'assessment' => $assessment,
]);
}
return redirect()->route('care.assessments.show', $assessment);
}
/**
* FHIR R4 Bundle (Questionnaire + QuestionnaireResponse) download.
*/