Files
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.0 KiB

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

اولویت‌بندی تنظیمات (از Manual — بخش ۲.۸.۴)

هنگام محاسبه اسلات‌های خالی (تسک ۱۰):

1. DateOverride (بالاترین) → اگر Override فعال برای این تاریخ وجود دارد، تعطیلی نادیده گرفته می‌شود
2. Holiday               → اگر تاریخ تعطیل است AND override ندارد → روز بسته است
3. WeeklySchedule (پایین) → در صورت نبود override و تعطیلی → برنامه هفتگی

UUID در URL endpoint لیست override ها

مسیر GET /api/v1/appointment-settings/date-override/list/{uuid} → این uuid برابر است با UUID دکتر (نه DateOverride)

ساختار واقعی هر session در weekly schedule (از Manual و API request)

{
  "active": 1,
  "number_of_turns": 10,      تعداد نوبت (نه patient_limit!)
  "turn_time": 10,            مدت هر نوبت به دقیقه (نه duration_per_patient!)
  "location": { "id": 48 },  آدرس مطب (object، نه فقط ID)
  "start_time": "10:00",
  "end_time": "13:00"
}

ساختار کامل weekly schedule (7 روز — از "0"=شنبه تا "6"=جمعه):

{
  "0": {
    "morning": { "active": 1, "number_of_turns": 10, "turn_time": 10, "location": {"id": 48}, "start_time": "10:00", "end_time": "13:00" },
    "evening": { "active": 0 }
  },
  "1": { "morning": {"active": 0}, "evening": { "active": 1, ... } },
  ...
}

مهم: در DB backup، فیلدهای patient_limit و duration_per_patient استفاده شده بود.
در API (کلاینت) از number_of_turns و turn_time استفاده می‌شود.
در Symfony باید هر دو نام را پشتیبانی کنی یا از نام‌های API استفاده کنی.

مهم: ذخیره‌سازی field_setting (از کد واقعی)

// در Drupal:
$normalized['field_setting'] = json_encode($data['setting'][0]);
// یعنی اولین المان آرایه‌ای که فرانت می‌فرستد ذخیره می‌شود

// در Symfony هم همین رویکرد:
$weeklySchedule->setSetting(json_encode($request->getSetting()[0]));

GET از UUID دکتر (نه UUID schedule)

// weeklyScheduleService.get($uuid) در Drupal:
// 1. ابتدا دکتر با این uuid را پیدا کن → $doctorEntity
// 2. سپس schedule با field_doctor_id = $doctorId را پیدا کن

// در Symfony:
$doctor = $this->doctorRepo->findByUuid($uuid);
$schedule = $this->scheduleRepo->findByDoctor($doctor);

مجوزها

تمام endpoint های این ماژول نیاز به احراز هویت دارند:

POST/PATCH/DELETE → دکتر مرتبط (owner) یا ROLE_ADMIN
GET               → دکتر مرتبط یا ROLE_ADMIN یا منشی دکتر

user_flow

جریان کامل در فایل جداگانه user_flow.md توضیح داده شده است.