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 = Patient::find($data['patient_id'] ?? null); $apiKey = \App\Models\OsurgInitial::val('sms_api_key', config('sms.api_key')); $apiUrl = \App\Models\OsurgInitial::val('sms_api_url', config('sms.api_url')); $smsPayload = [ 'phoneNumber' => $patient?->hand_phone ?? '', 'patientName' => $patient?->full_name ?? '', 'surgeryDate' => $jalaliDate, 'patientId' => $patient?->id, 'surgeryDateFull' => $surgeryDateTime->toDateTimeString(), ]; try { $response = Http::timeout(30) ->withHeader('X-API-Key', $apiKey) ->asJson() ->post($apiUrl . '/surgery-reminder', $smsPayload); if (! ($response->json('success') ?? false)) { Notification::make() ->title(__('patients.actions.api_failed')) ->body($response->json('message') ?? '') ->danger() ->send(); $this->halt(); return; } } catch (\Throwable $e) { Log::warning('Surgery appointment SMS failed', [ 'patient_id' => $patient?->id, 'error' => $e->getMessage(), ]); Notification::make() ->title(__('patients.actions.api_failed')) ->body($e->getMessage()) ->danger() ->send(); $this->halt(); return; } $this->smsApiKey = $apiKey; $this->smsApiUrl = $apiUrl; $this->smsSentPayload = $smsPayload; } public string $smsApiKey = ''; public string $smsApiUrl = ''; public array $smsSentPayload = []; protected function afterCreate(): void { if (! empty($this->smsSentPayload) && $this->record) { try { Http::timeout(30) ->withHeader('X-API-Key', $this->smsApiKey) ->asJson() ->post($this->smsApiUrl . '/surgery-reminder', array_merge($this->smsSentPayload, [ 'appointmentId' => $this->record->id, ])); } catch (\Throwable) { } } Notification::make() ->title(__('patients.actions.appointment_saved')) ->body(__('patients.actions.sms_sent')) ->success() ->send(); } protected function getFormActions(): array { return []; } }