Files
clinicpro/docs/tasks/task-09-appointment-settings/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

4.1 KiB
Raw Blame History

پایگاه داده — تسک ۰۹: ماژول تنظیمات نوبت‌دهی

مهم: ساختار واقعی field_setting از DB backup

تفاوت اساسی با طراحی اولیه:

  • یک فیلد JSON به نام field_setting کل برنامه هفتگی را ذخیره می‌کند
  • ساختار: آرایه ۷ المان (ایندکس 0=شنبه تا 6=جمعه)
  • هر روز دو نوبت صبح و عصر دارد (نه slot‌های آرایه‌ای)

جدول: weekly_schedules

(entity_type=appointment_settings, bundle=weekly_schedule)

ستون نوع توضیح
id INT UNSIGNED AUTO_INCREMENT PK
uuid CHAR(36) UNIQUE NOT NULL
doctor_id INT FK → doctors.id UNIQUE یک رکورد به‌ازای هر دکتر
setting LONGTEXT NOT NULL JSON برنامه کامل هفتگی
created_at INT NOT NULL Unix timestamp
updated_at INT NOT NULL Unix timestamp

ساختار واقعی JSON فیلد setting (از DB backup)

[
  {
    "morning": {
      "active": 1,
      "location_id": 48,
      "start_time": "08:00",
      "end_time": "12:00",
      "patient_limit": 10,
      "duration_per_patient": 15,
      "has_rest": true,
      "rest_interval": 60,
      "time_to_rest": 10
    },
    "evening": {
      "active": 0
    }
  },
  {
    "morning": { "active": 0 },
    "evening": {
      "active": 1,
      "location_id": 49,
      "start_time": "15:00",
      "end_time": "18:00",
      "patient_limit": 8,
      "duration_per_patient": 20,
      "has_rest": false
    }
  },
  ...
]

ایندکس روزها:

ایندکس روز
0 شنبه
1 یکشنبه
2 دوشنبه
3 سه‌شنبه
4 چهارشنبه
5 پنجشنبه
6 جمعه

فیلدهای هر session (morning/evening):

فیلد نوع توضیح
active 0/1 آیا این نوبت فعال است
location_id int ID آدرس مطب (→ doctor_addresses)
start_time "HH:MM" ساعت شروع
end_time "HH:MM" ساعت پایان
patient_limit int حداکثر تعداد بیمار
duration_per_patient int (دقیقه) مدت هر ویزیت
has_rest boolean آیا استراحت دارد
rest_interval int (دقیقه) فاصله استراحت
time_to_rest int (دقیقه) مدت استراحت

جدول: date_overrides

(entity_type=appointment_settings, bundle=date_override)

ستون نوع توضیح
id INT UNSIGNED AUTO_INCREMENT PK
uuid CHAR(36) UNIQUE NOT NULL
doctor_id INT FK → doctors.id دکتر
date INT NOT NULL تاریخ (Unix timestamp) — field_date
active TINYINT(1) DEFAULT 0 آیا کار می‌کند — field_active
setting LONGTEXT NULL JSON اسلات‌های سفارشی (همان ساختار field_setting)
created_at INT NOT NULL
updated_at INT NOT NULL

جدول: holidays

(entity_type=appointment_settings, bundle=holidays)

ستون نوع توضیح
id INT UNSIGNED AUTO_INCREMENT PK
uuid CHAR(36) UNIQUE NOT NULL
doctor_id INT FK → doctors.id دکتر
start_date INT NOT NULL تاریخ شروع (Unix timestamp)
end_date INT NOT NULL تاریخ پایان (Unix timestamp)
active TINYINT(1) DEFAULT 1 field_active
created_at INT NOT NULL
updated_at INT NOT NULL

ایندکس‌ها

CREATE UNIQUE INDEX idx_weekly_schedules_doctor ON weekly_schedules(doctor_id);
CREATE INDEX idx_date_overrides_doctor_date ON date_overrides(doctor_id, date);
CREATE INDEX idx_holidays_doctor_range ON holidays(doctor_id, start_date, end_date);

نکات مهم

  • GET /appointment-settings/{uuid} — uuid دکتر است، نه uuid schedule
  • setting[0] ایندکس 0=شنبه تا 6=جمعه (هفته ایرانی)
  • هر روز دقیقاً ۲ نوبت (morning و evening) دارد
  • session غیرفعال فقط {"active": 0} است، بقیه فیلدها ندارد