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

## مهم: ساختار واقعی 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)

```json
[
  {
    "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 | |

## ایندکس‌ها
```sql
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}` است، بقیه فیلدها ندارد
