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:
hamed
2026-06-09 22:00:34 +03:30
commit de1a78a235
222 changed files with 36388 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
# پایگاه داده — تسک ۰۶: ماژول کلینیک
## جدول: clinics
_(entity_type=clinic_pro, bundle=clinic — از config تأیید شده)_
| ستون | نوع | نام Drupal | توضیح |
|------|-----|-----------|-------|
| id | INT UNSIGNED AUTO_INCREMENT PK | id | |
| uuid | CHAR(36) UNIQUE NOT NULL | uuid | |
| user_id | INT FK → users.id NOT NULL | uid | مالک کلینیک |
| name | VARCHAR(255) NULL | field_name | نام کلینیک |
| info | LONGTEXT NULL | field_info | توضیحات (نه description!) |
| address | LONGTEXT NULL | field_address | آدرس |
| telephone | VARCHAR(50) NULL | field_telephone | تلفن (نه phone!) |
| is_24_7 | TINYINT(1) DEFAULT 0 | field_24_7 | باز ۲۴/۷ |
| working_days | VARCHAR(255) NULL | field_working_days | روزهای کاری (متن آزاد، مثال: 'شنبه تا سه شنبه ساعت ۱۲:۲۰') |
| latitude | FLOAT NULL | field_latitude | |
| longitude | FLOAT NULL | field_longitude | |
| logo_id | INT FK → files.id NULL | field_clinic_logo | لوگو کلینیک (image, cardinality=1) |
| city_id | INT FK → categories.id NULL | field_city | شهر (entity ref → category/city) |
| state_id | INT FK → categories.id NULL | field_state | استان (entity ref → category/state) |
| representation_id | INT FK → representations.id NULL | field_agent | نماینده کلینیک (entity ref → user — در Drupal به user اشاره دارد، در Symfony به representation) |
| created_at | INT NOT NULL | created | Unix timestamp |
| updated_at | INT NOT NULL | changed | Unix timestamp |
## جدول: clinic_doctors (ManyToMany)
| ستون | نوع | نام Drupal | توضیح |
|------|-----|-----------|-------|
| clinic_id | INT FK → clinics.id CASCADE | | |
| doctor_id | INT FK → doctors.id CASCADE | field_doctors | cardinality نامحدود |
## جدول: clinic_specialties (ManyToMany)
| ستون | نوع | توضیح |
|------|-----|-------|
| clinic_id | INT FK → clinics.id CASCADE | |
| category_id | INT FK → categories.id | field_clinic_specialty |
## جدول: clinic_services (ManyToMany)
| ستون | نوع | توضیح |
|------|-----|-------|
| clinic_id | INT FK → clinics.id CASCADE | |
| category_id | INT FK → categories.id | field_doctor_services |
## جدول: clinic_insurances (ManyToMany)
| ستون | نوع | توضیح |
|------|-----|-------|
| clinic_id | INT FK → clinics.id CASCADE | |
| category_id | INT FK → categories.id | field_insurance (insurance_type یا supplementary_insurance bundle) |
## جدول: clinic_images (تصاویر اضافی)
| ستون | نوع | نام Drupal | توضیح |
|------|-----|-----------|-------|
| id | INT AUTO_INCREMENT PK | | |
| clinic_id | INT FK → clinics.id CASCADE | | |
| file_id | INT FK → files.id | field_image_clinic | حداکثر ۵ تصویر (cardinality=5) |
| sort_order | INT DEFAULT 0 | delta | ترتیب |
## ایندکس‌ها
```sql
CREATE INDEX idx_clinics_owner ON clinics(user_id);
CREATE INDEX idx_clinics_city ON clinics(city_id);
CREATE INDEX idx_clinics_state ON clinics(state_id);
CREATE INDEX idx_clinics_representation ON clinics(representation_id);
```
## نکات مهم
- `field_agent` در Drupal به user اشاره دارد (cardinality=-1 نامحدود) — در Symfony ساده‌تر شده و فقط یک representation دارد
- `field_working_days` متن آزاد است، مثل 'شنبه تا سه‌شنبه ۸ تا ۱۲'، نه فرمت ساختاریافته
- `field_telephone` نه `phone` — اسم فیلد از Drupal config گرفته شده