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.
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# نکات پیادهسازی — تسک ۰۹: ماژول تنظیمات نوبتدهی
|
||||
|
||||
## اولویتبندی تنظیمات (از 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)
|
||||
```json
|
||||
{
|
||||
"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"=جمعه):
|
||||
```json
|
||||
{
|
||||
"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 (از کد واقعی)
|
||||
```php
|
||||
// در Drupal:
|
||||
$normalized['field_setting'] = json_encode($data['setting'][0]);
|
||||
// یعنی اولین المان آرایهای که فرانت میفرستد ذخیره میشود
|
||||
|
||||
// در Symfony هم همین رویکرد:
|
||||
$weeklySchedule->setSetting(json_encode($request->getSetting()[0]));
|
||||
```
|
||||
|
||||
## GET از UUID دکتر (نه UUID schedule)
|
||||
```php
|
||||
// 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 توضیح داده شده است.
|
||||
Reference in New Issue
Block a user