feat(treatment): select treatment behaviour by practice domain, not by if-branch
Everything that differs between specialties as data is already stored as data. What is left is behaviour — when a case opens, what happens once a session ends — so it becomes a TreatmentWorkflow resolved through a tagged-service registry. The booking path calls one collaborator and never names a specialty; adding dentistry is a new class, not an edit to confirmation. A clinic that has chosen no practice domain still gets working multi-session courses: DefaultTreatmentWorkflow answers for null and for any code without a dedicated implementation, keeping "unset means behave as today, not error". LaserTreatmentWorkflow is deliberately empty beyond claiming `beauty` — it is the seam where laser-specific behaviour will land without disturbing anyone else. Session due dates are anchored to the previous session's actual finish, so a patient who comes twenty days late shifts the rest of their course instead of getting the next session while it can still do nothing. Only the next session is recomputed; later ones keep their estimate because they are anchored to nothing yet. Attachment targets the first session without an appointment rather than the first open one: a patient booking again mid-course was otherwise matched to the session that already had a booking, and the second appointment went nowhere. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,7 @@ class AppointmentConfirmationService
|
||||
private readonly PaymentRepository $paymentRepo,
|
||||
private readonly CommissionService $commissionService,
|
||||
private readonly DomainContextResolver $domainResolver,
|
||||
private readonly \App\Treatment\Service\TreatmentCaseStarter $treatmentCases,
|
||||
private readonly EntityManagerInterface $em,
|
||||
private readonly LoggerInterface $logger,
|
||||
) {}
|
||||
@@ -72,7 +73,15 @@ class AppointmentConfirmationService
|
||||
$this->splitPaymentShares($appointment);
|
||||
|
||||
try {
|
||||
return $this->patientService->autoCreateOnAppointmentConfirm($appointment);
|
||||
$session = $this->patientService->autoCreateOnAppointmentConfirm($appointment);
|
||||
|
||||
// هسته نمیداند دورهٔ درمان چیست: اگر سرویسِ نوبت پروتکل داشته باشد،
|
||||
// workflowِ حوزهٔ فعالیت تصمیم میگیرد چه اتفاقی بیفتد.
|
||||
if ($session !== null) {
|
||||
$this->treatmentCases->onAppointmentConfirmed($appointment, $session);
|
||||
}
|
||||
|
||||
return $session;
|
||||
} catch (\Throwable $e) {
|
||||
$this->logger->error('Auto-creating the patient record on confirm failed', [
|
||||
'appointment_uuid' => $appointment->getUuid(),
|
||||
|
||||
Reference in New Issue
Block a user