matab-panel/app/Filament/Resources/SurgeryAppointmentResource/Pages/CreateSurgeryAppointment.php

119 lines
3.9 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Filament\Resources\SurgeryAppointmentResource\Pages;
use App\Filament\Resources\SurgeryAppointmentResource;
use App\Models\Patient;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord;
use Filament\Support\Enums\Width;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Morilog\Jalali\Jalalian;
class CreateSurgeryAppointment extends CreateRecord
{
protected static string $resource = SurgeryAppointmentResource::class;
protected Width|string|null $maxContentWidth = Width::SevenExtraLarge;
protected function mutateFormDataBeforeCreate(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 beforeCreate(): 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 = 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 [];
}
}