Files
clinicpro/docs/tasks/task-10-appointment/database.md
T
hamed de1a78a235 feat: Implement SMS sending functionality with KavehNegar and Rangineh providers
- 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.
2026-06-09 22:00:34 +03:30

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_idusers.id
  • appointments.doctor_iddoctors.id (clinic_pro entity)
  • appointments.address_iddoctor_addresses.id (clinic_pro entity)
  • appointments.representation_idrepresentations.id (clinic_pro entity)
  • appointmentspayments.field_reference_id (OneToOne)

نکات مهم

  • تایم‌زون: Asia/Tehran
  • start_time و end_time هر دو Unix timestamp هستند (INT)
  • slot.time ساعت شروع برای نمایش است (HH:MM)
  • نوبت ابتدا waiting_for_payment → بعد پرداخت → reserved