format('Y-m-d'); $data['surgery_date_time'] = $date->format('H:i'); } return $data; } protected function mutateFormDataBeforeSave(array $data): array { $dateStr = $data['surgery_date_date'] ?? ''; $timeStr = $data['surgery_date_time'] ?? '09:00'; $data['surgery_date'] = \Carbon\Carbon::parse($dateStr . ' ' . $timeStr); unset($data['surgery_date_date'], $data['surgery_date_time']); return $data; } protected function beforeSave(): void { $data = $this->form->getState(); $dateStr = $data['surgery_date_date'] ?? ''; $timeStr = $data['surgery_date_time'] ?? '09:00'; $surgeryDateTime = \Carbon\Carbon::parse($dateStr . ' ' . $timeStr); $jalaliDate = Jalalian::fromCarbon($surgeryDateTime)->format('Y/m/d'); $patient = $this->getRecord()->patient; try { $response = Http::timeout(30) ->withHeader('X-API-Key', \App\Models\OsurgInitial::val('sms_api_key', config('sms.api_key'))) ->asJson() ->post(\App\Models\OsurgInitial::val('sms_api_url', config('sms.api_url')) . '/surgery-reminder', [ 'phoneNumber' => $patient->hand_phone ?? '', 'patientName' => $patient->full_name, 'surgeryDate' => $jalaliDate, 'appointmentId' => $this->getRecord()->id, 'patientId' => $patient->id, 'surgeryDateFull' => $surgeryDateTime->toDateTimeString(), ]); if (! ($response->json('success') ?? false)) { Notification::make() ->title(__('patients.actions.api_failed')) ->body($response->json('message') ?? '') ->danger() ->send(); $this->halt(); } } catch (\Throwable $e) { Log::warning('Surgery appointment API failed', [ 'patient_id' => $patient->id, 'error' => $e->getMessage(), ]); Notification::make() ->title(__('patients.actions.api_failed')) ->body($e->getMessage()) ->danger() ->send(); $this->halt(); } } protected function afterSave(): void { Notification::make() ->title(__('patients.actions.appointment_saved')) ->body(__('patients.actions.sms_sent')) ->success() ->send(); } protected function getFormActions(): array { return []; } }