- 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.
122 lines
4.1 KiB
Markdown
122 lines
4.1 KiB
Markdown
# پایگاه داده — تسک ۰۹: ماژول تنظیمات نوبتدهی
|
||
|
||
## مهم: ساختار واقعی 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}` است، بقیه فیلدها ندارد
|