Merge branch 'feat/appointment-lock-patient'
# Conflicts: # src/Appointment/Controller/AppointmentController.php
This commit is contained in:
@@ -5,6 +5,7 @@ namespace App\Appointment\Controller;
|
||||
use App\Appointment\Entity\Appointment;
|
||||
use App\Appointment\Entity\WeeklySchedule;
|
||||
use App\Appointment\Repository\AppointmentRepository;
|
||||
use App\Appointment\Repository\SlotTakenException;
|
||||
use App\Appointment\Repository\WeeklyScheduleRepository;
|
||||
use App\Appointment\Service\SlotCalculatorService;
|
||||
use App\Auth\Entity\User;
|
||||
@@ -230,14 +231,34 @@ class AppointmentController extends BaseController
|
||||
return $this->error(ErrorCodes::ERR_VALIDATION_002, 'دکتر یافت نشد', 404);
|
||||
}
|
||||
|
||||
if ($this->appointmentRepo->isSlotTaken($doctor, $slotStart, $slotEnd)) {
|
||||
return $this->error(ErrorCodes::ERR_CONFLICT_001, 'این نوبت قبلاً رزرو شده است', 409);
|
||||
}
|
||||
$forSelf = (bool) ($data['for_self'] ?? true);
|
||||
|
||||
$appointment = new Appointment($doctor, $user, $slotStart, $slotEnd);
|
||||
if (isset($data['note'])) $appointment->setNote($data['note']);
|
||||
|
||||
$this->appointmentRepo->save($appointment);
|
||||
if ($forSelf) {
|
||||
$appointment->setPatientName($user->getRealName());
|
||||
$appointment->setPatientMobile($user->getMobileNumber());
|
||||
} else {
|
||||
$patientName = trim($data['patient_name'] ?? '');
|
||||
$patientMobile = trim($data['patient_mobile'] ?? '');
|
||||
if ($patientName === '' || $patientMobile === '') {
|
||||
return $this->error(ErrorCodes::ERR_VALIDATION_001, 'نام و شماره موبایل بیمار الزامی است', 422);
|
||||
}
|
||||
$appointment->setPatientName($patientName);
|
||||
$appointment->setPatientMobile($patientMobile);
|
||||
$appointment->setPatientNationalCode($data['patient_national_code'] ?? null);
|
||||
$appointment->setPatientGender($data['patient_gender'] ?? null);
|
||||
$appointment->setPatientReason($data['patient_reason'] ?? null);
|
||||
}
|
||||
|
||||
$appointment->markPendingWithTtl(Appointment::PAYMENT_TTL);
|
||||
|
||||
try {
|
||||
$this->appointmentRepo->bookAtomically($appointment);
|
||||
} catch (SlotTakenException) {
|
||||
return $this->error(ErrorCodes::ERR_CONFLICT_001, 'این نوبت قبلاً رزرو شده است', 409);
|
||||
}
|
||||
|
||||
return $this->success(['data' => $appointment->toArray()], 201);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user