- Add SendSmsMessage class for encapsulating SMS message data. - Create KavehNegarProvider and RanginehProvider classes implementing SmsProviderInterface for sending SMS. - Implement SmsLogRepository and SmsTemplateRepository for managing SMS logs and templates. - Develop SendSmsHandler for handling SMS sending messages. - Create SmsService to manage SMS dispatching and logging. - Add UserProfileController for managing user profiles with CRUD operations. - Implement UserProfile entity and repository for user profile data management. - Update symfony.lock and bootstrap.php for project dependencies and environment setup.
3.6 KiB
3.6 KiB
پایگاه داده — تسک ۱۰: ماژول نوبتدهی
جدول: appointments
(entity_type=appointment — از DB backup تأیید شده)
| ستون | نوع | نام Drupal | توضیح |
|---|---|---|---|
| id | INT UNSIGNED AUTO_INCREMENT PK | id | |
| uuid | CHAR(36) UNIQUE NOT NULL | uuid | |
| patient_id | INT FK → users.id NOT NULL | uid | بیمار (owner) |
| doctor_id | INT FK → doctors.id NOT NULL | field_doctor_id | entity ref → clinic_pro |
| address_id | INT FK → doctor_addresses.id NULL | field_address | entity ref → clinic_pro |
| representation_id | INT FK → representations.id NULL | field_representation | entity ref → clinic_pro |
| start_time | INT NOT NULL | field_start_time | Unix timestamp (Asia/Tehran) |
| end_time | INT NOT NULL | field_end_time | Unix timestamp |
| slot | LONGTEXT NULL | field_slot | JSON (ساختار زیر) |
| status | VARCHAR(40) DEFAULT 'waiting_for_payment' | field_status | وضعیت |
| visited_at | INT NULL | field_visited_at | زمان ویزیت (Unix timestamp) |
| info | LONGTEXT NULL | field_info | یادداشت |
| created_at | INT NOT NULL | created | Unix timestamp |
| updated_at | INT NOT NULL | changed | Unix timestamp |
ساختار واقعی JSON فیلد slot (از DB backup)
{
"time": "17:00",
"status": "available",
"start_time_timestamp": 1763472600,
"end_time_timestamp": 1763473800,
"duration_per_patient": 20,
"location_id": 38
}
وضعیتهای کامل (field_status) — از config
waiting_for_payment → پیشفرض — منتظر پرداخت
reserved → رزروشده (پرداخت انجام شده)
auto_cancel_unpaid → لغو خودکار (عدم پرداخت)
cancelled_by_patient → لغو توسط بیمار
cancelled_by_doctor → لغو توسط دکتر
checked_in → بیمار آمده
waiting → در صف انتظار
in_progress → در حال ویزیت
visited → ویزیت تمام شده
no_show → غایب
postponed → به تعویق افتاده
completed → تکمیل شده
⚠️ وضعیتهایی که slot را آزاد میکنند (قابل رزرو مجدد):
auto_cancel_unpaid, cancelled_by_patient, cancelled_by_doctor
ایندکسها
CREATE INDEX idx_appointments_patient ON appointments(patient_id);
CREATE INDEX idx_appointments_doctor ON appointments(doctor_id);
CREATE INDEX idx_appointments_doctor_time ON appointments(doctor_id, start_time);
CREATE INDEX idx_appointments_status ON appointments(status);
CREATE INDEX idx_appointments_representation ON appointments(representation_id);
نمونه داده واقعی از DB backup
id=1, uuid='617f78af-...', uid=32, doctor_id=29
start_time=1763472600, end_time=1763473800
slot: {"time":"17:00","status":"available","start_time_timestamp":1763472600,
"end_time_timestamp":1763473800,"duration_per_patient":20,"location_id":38}
روابط
appointments.patient_id→users.idappointments.doctor_id→doctors.id(clinic_pro entity)appointments.address_id→doctor_addresses.id(clinic_pro entity)appointments.representation_id→representations.id(clinic_pro entity)appointments←payments.field_reference_id(OneToOne)
نکات مهم
- تایمزون:
Asia/Tehran start_timeوend_timeهر دو Unix timestamp هستند (INT)slot.timeساعت شروع برای نمایش است (HH:MM)- نوبت ابتدا
waiting_for_payment→ بعد پرداخت →reserved