feat(treatment): bind an appointment to a chosen session, and free it on cancel
Two holes in how a course's later appointments were made.
The link from the unbooked queue carried nothing — `/admin/appointments/new`
with no parameters — so the secretary retyped the patient and the service, and
which case the appointment joined was inferred from the service they happened to
pick. A patient with two open courses had no way to say which one they meant,
and picking the wrong service silently opened a third case. (The suggestion link
did pass slot_start and resource_uuid, but the create page never read either.)
POST /api/v1/my/appointment now takes an optional treatment_session_uuid.
SessionBookingLink validates it — same tenant, still unbooked, case open, same
patient — and reserves that session. Confirm-time attachment steps aside when
the appointment already holds a session. The booking form states in words which
session, which course and which patient it is about to book, read from a new
GET /api/v1/treatment-session/{uuid}.
Nothing ever detached a session from its appointment, so a cancelled booking
left the session `booked` forever, and since findNextUnbooked requires
"has no appointment", it could never return to the queue. Cancellation and
no-show now release it back to `planned`. A finished session is history and is
left alone.
The system still never books the next appointment by itself — it only suggests.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -140,6 +140,28 @@ class TreatmentCaseController extends BaseController
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* یک جلسه بهتنهایی — برای فرمِ «ثبت نوبت این جلسه».
|
||||
*
|
||||
* فرم باید بگوید نوبت برای کدام دوره و کدام بیمار ثبت میشود؛ بیمارِ چنددورهای
|
||||
* بدون این، اتصال را به حدسِ سرویس میسپارد.
|
||||
*/
|
||||
#[Route('/api/v1/treatment-session/{uuid}', name: 'treatment_session_show', methods: ['GET'])]
|
||||
public function showSession(#[CurrentUser] User $user, string $uuid): JsonResponse
|
||||
{
|
||||
$session = $this->requireSession($user, $uuid);
|
||||
$case = $session->getTreatmentCase();
|
||||
|
||||
return $this->success($session->toArray() + [
|
||||
'case_uuid' => $case->getUuid(),
|
||||
'service' => ['uuid' => $case->getServiceItem()->getUuid(), 'name' => $case->getServiceItem()->getName()],
|
||||
'patient' => [
|
||||
'record_uuid' => $case->getPatientRecord()->getUuid(),
|
||||
'name' => $case->getPatientRecord()->getUser()->getRealName(),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* اسلاتهای پیشنهادی برای این جلسه.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user