- 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.
447 lines
16 KiB
Markdown
447 lines
16 KiB
Markdown
# Admin Panel — User Flow (React)
|
|
|
|
---
|
|
|
|
## 1. Authentication
|
|
|
|
```
|
|
[Login Page]
|
|
│
|
|
├─► Enter mobile number
|
|
├─► Enter password
|
|
└─► Submit
|
|
│
|
|
├─ Success ──► Store JWT + Refresh Token ──► Redirect to Dashboard
|
|
└─ Fail ─────► Show error message
|
|
```
|
|
|
|
**Pages:** `/login`
|
|
**API:** `POST /api/v1/user/login`
|
|
|
|
---
|
|
|
|
## 2. Dashboard (صفحه اصلی)
|
|
|
|
```
|
|
[Dashboard]
|
|
├─► آمار کلی
|
|
│ ├─ تعداد کل کاربران
|
|
│ ├─ تعداد پزشکان فعال
|
|
│ ├─ تعداد کلینیکها
|
|
│ ├─ نوبتهای امروز
|
|
│ ├─ پرداختهای امروز (مبلغ)
|
|
│ ├─ تعداد نظرات در انتظار تأیید
|
|
│ └─ تعداد درخواستهای تسویهحساب
|
|
│
|
|
├─► فعالیتهای اخیر
|
|
│ ├─ آخرین نوبتهای ثبتشده
|
|
│ ├─ آخرین پرداختها
|
|
│ └─ آخرین کاربران ثبتنامشده
|
|
│
|
|
└─► نمودارها
|
|
├─ درآمد ماهانه (Jalali)
|
|
└─ آمار نوبتها به تفکیک وضعیت
|
|
```
|
|
|
|
**Pages:** `/admin/dashboard`
|
|
|
|
---
|
|
|
|
## 3. مدیریت کاربران (User Management)
|
|
|
|
```
|
|
[لیست کاربران]
|
|
├─► جستجو (mobile, name, email)
|
|
├─► فیلتر بر اساس role / status
|
|
├─► صفحهبندی
|
|
│
|
|
├─── ردیف کاربر ──►
|
|
│ ├─ مشاهده جزئیات ──► [صفحه پروفایل کاربر]
|
|
│ │ ├─ اطلاعات پایه (نام، موبایل، ایمیل، نقش)
|
|
│ │ ├─ پروفایل پزشکی (گروه خونی، بیماریها، ...)
|
|
│ │ ├─ تاریخچه نوبتها
|
|
│ │ └─ تاریخچه پرداختها
|
|
│ │
|
|
│ ├─ ویرایش اطلاعات پایه
|
|
│ ├─ تغییر وضعیت (فعال / غیرفعال)
|
|
│ └─ حذف کاربر ──► [Confirm Dialog]
|
|
│
|
|
└─── دکمه «افزودن کاربر» ──► [فرم ثبت کاربر جدید]
|
|
```
|
|
|
|
**Pages:** `/admin/users`, `/admin/users/:uuid`
|
|
**API:**
|
|
- `GET /api/v1/users` (لیست)
|
|
- `PATCH /api/v1/user/:id` (ویرایش)
|
|
- `DELETE /api/v1/user/:id` (حذف)
|
|
- `GET /api/v1/user-profile/:uuid` (پروفایل)
|
|
|
|
---
|
|
|
|
## 4. مدیریت پزشکان (Doctor Management)
|
|
|
|
```
|
|
[لیست پزشکان]
|
|
├─► فیلتر: استان / شهر / تخصص / جنسیت / درجه / وضعیت فعال
|
|
├─► جستجو: نام / کد نظام پزشکی
|
|
│
|
|
├─── ردیف پزشک ──►
|
|
│ ├─ مشاهده پروفایل ──► [صفحه پزشک]
|
|
│ │ ├─ اطلاعات پایه + تصویر
|
|
│ │ ├─ آدرس مطبها (لیست + نقشه)
|
|
│ │ ├─ تخصصها و خدمات
|
|
│ │ ├─ بیمههای پذیرفتهشده
|
|
│ │ ├─ منشیها
|
|
│ │ ├─ میانگین امتیاز (5 شاخص)
|
|
│ │ └─ آمار نوبتها
|
|
│ │
|
|
│ ├─ ویرایش پروفایل
|
|
│ ├─ فعال/غیرفعال کردن
|
|
│ └─ حذف ──► [Confirm Dialog]
|
|
│
|
|
└─── دکمه «افزودن پزشک»
|
|
```
|
|
|
|
**Pages:** `/admin/doctors`, `/admin/doctors/:uuid`
|
|
**API:**
|
|
- `GET /api/v1/doctors`
|
|
- `POST /api/v1/doctor`
|
|
- `PATCH /api/v1/doctor/:uuid`
|
|
- `DELETE /api/v1/doctor/:uuid`
|
|
|
|
---
|
|
|
|
## 5. مدیریت کلینیکها (Clinic Management)
|
|
|
|
```
|
|
[لیست کلینیکها]
|
|
├─► فیلتر: استان / شهر / تخصص
|
|
│
|
|
├─── ردیف کلینیک ──►
|
|
│ ├─ مشاهده ──► [صفحه کلینیک]
|
|
│ │ ├─ اطلاعات + لوگو + گالری تصاویر
|
|
│ │ ├─ ساعات کاری
|
|
│ │ ├─ پزشکان عضو
|
|
│ │ ├─ بیمههای پذیرفتهشده
|
|
│ │ └─ موقعیت روی نقشه
|
|
│ │
|
|
│ ├─ ویرایش
|
|
│ ├─ فعال/غیرفعال کردن
|
|
│ └─ حذف ──► [Confirm Dialog]
|
|
│
|
|
└─── دکمه «افزودن کلینیک»
|
|
```
|
|
|
|
**Pages:** `/admin/clinics`, `/admin/clinics/:uuid`
|
|
|
|
---
|
|
|
|
## 6. مدیریت نوبتها (Appointment Management)
|
|
|
|
```
|
|
[لیست نوبتها]
|
|
├─► فیلتر: تاریخ / پزشک / وضعیت / نماینده
|
|
├─► جستجو: موبایل بیمار / نام پزشک
|
|
│
|
|
├─── ردیف نوبت ──►
|
|
│ ├─ مشاهده جزئیات ──► [صفحه نوبت]
|
|
│ │ ├─ اطلاعات بیمار
|
|
│ │ ├─ اطلاعات پزشک + آدرس
|
|
│ │ ├─ زمان نوبت
|
|
│ │ ├─ وضعیت (با رنگبندی)
|
|
│ │ └─ اطلاعات پرداخت
|
|
│ │
|
|
│ ├─ تغییر وضعیت (dropdown کامل همه stateها)
|
|
│ └─ لغو نوبت ──► [Confirm + دلیل اختیاری]
|
|
│
|
|
└─── فیلتر سریع بر اساس وضعیت:
|
|
waiting_for_payment | reserved | checked_in | waiting |
|
|
in_progress | visited | completed | cancelled_* | no_show
|
|
```
|
|
|
|
**وضعیتهای نوبت با رنگبندی:**
|
|
| وضعیت | رنگ |
|
|
|--------|------|
|
|
| waiting_for_payment | زرد |
|
|
| reserved | آبی |
|
|
| checked_in | بنفش |
|
|
| waiting | نارنجی |
|
|
| in_progress | آبی تیره |
|
|
| visited / completed | سبز |
|
|
| cancelled_* / no_show | قرمز |
|
|
| auto_cancel_unpaid | خاکستری |
|
|
|
|
**Pages:** `/admin/appointments`, `/admin/appointments/:uuid`
|
|
|
|
---
|
|
|
|
## 7. مدیریت پرداختها (Payment Management)
|
|
|
|
```
|
|
[لیست پرداختها]
|
|
├─► فیلتر: تاریخ / وضعیت / درگاه (mellat/sep)
|
|
├─► جستجو: شماره مرجع / موبایل
|
|
│
|
|
├─── ردیف پرداخت ──►
|
|
│ └─ مشاهده جزئیات ──► [صفحه پرداخت]
|
|
│ ├─ شناسه پرداخت، مبلغ، درگاه
|
|
│ ├─ وضعیت: pending/received/canceled/refund
|
|
│ ├─ زمان پرداخت
|
|
│ ├─ لینک به نوبت مرتبط
|
|
│ └─ دکمه «استرداد» (اگر وضعیت received)
|
|
│
|
|
└─── آمار خلاصه بالای صفحه:
|
|
├─ مجموع پرداختهای موفق امروز
|
|
├─ مجموع مبلغ امروز
|
|
└─ تعداد پرداختهای در انتظار
|
|
```
|
|
|
|
**Pages:** `/admin/payments`, `/admin/payments/:uuid`
|
|
|
|
---
|
|
|
|
## 8. مدیریت تسویهحساب (Settlement Management)
|
|
|
|
```
|
|
[لیست درخواستهای تسویه]
|
|
├─► فیلتر: وضعیت (pending/approved/rejected) / نماینده
|
|
│
|
|
├─── ردیف تسویه ──►
|
|
│ └─ مشاهده ──► [صفحه تسویه]
|
|
│ ├─ نام نماینده + موجودی کیفپول
|
|
│ ├─ مبلغ درخواستشده
|
|
│ ├─ اطلاعات حساب بانکی (شماره کارت، بانک)
|
|
│ ├─ تاریخ درخواست
|
|
│ └─ اقدامات:
|
|
│ ├─ تأیید ──► PATCH approve
|
|
│ └─ رد کردن ──► [فرم دلیل رد] ──► PATCH reject
|
|
│
|
|
└─── آمار: مجموع در انتظار / تأییدشده این ماه
|
|
```
|
|
|
|
**Pages:** `/admin/settlements`, `/admin/settlements/:uuid`
|
|
|
|
---
|
|
|
|
## 9. مدیریت نمایندگان (Representation Management)
|
|
|
|
```
|
|
[لیست نمایندگان]
|
|
│
|
|
├─── ردیف نماینده ──►
|
|
│ └─ مشاهده ──► [صفحه نماینده]
|
|
│ ├─ اطلاعات دامنه، شهر، درصد کمیسیون
|
|
│ ├─ حسابهای بانکی (لیست + افزودن)
|
|
│ ├─ کیفپول: موجودی + تاریخچه تراکنشها
|
|
│ ├─ آمار ماهانه (نمودار Jalali)
|
|
│ └─ آمار سالانه درآمد
|
|
│
|
|
└─── دکمه «افزودن نماینده» ──► [فرم]
|
|
├─ نام دامنه
|
|
├─ شهر
|
|
├─ درصد کمیسیون
|
|
└─ حساب بانکی پیشفرض
|
|
```
|
|
|
|
**Pages:** `/admin/representations`, `/admin/representations/:uuid`
|
|
|
|
---
|
|
|
|
## 10. مدیریت نظرات (Comment Moderation)
|
|
|
|
```
|
|
[صف تأیید نظرات]
|
|
├─► فیلتر: تأییدنشده / تأییدشده / همه
|
|
├─► جستجو: نام پزشک / متن
|
|
│
|
|
├─── ردیف نظر ──►
|
|
│ ├─ نام کاربر، نام پزشک، تاریخ
|
|
│ ├─ عنوان و متن نظر
|
|
│ ├─ تأیید ──► PATCH approve
|
|
│ └─ رد / حذف ──► [Confirm Dialog]
|
|
│
|
|
└─── آمار: تعداد در انتظار تأیید (badge در منو)
|
|
```
|
|
|
|
**Pages:** `/admin/comments`
|
|
|
|
---
|
|
|
|
## 11. مدیریت امتیازدهی (Rating Management)
|
|
|
|
```
|
|
[لیست امتیازها]
|
|
├─► فیلتر: پزشک / بازه زمانی
|
|
│
|
|
├─── ردیف امتیاز ──►
|
|
│ ├─ نام بیمار، نام پزشک، تاریخ
|
|
│ ├─ 5 شاخص (صحت تشخیص، مهارت، رفتار، نظافت، زمان انتظار)
|
|
│ ├─ ستاره کلی
|
|
│ └─ حذف ──► [Confirm Dialog]
|
|
│
|
|
└─── نمودار میانگین امتیازها به تفکیک پزشک
|
|
```
|
|
|
|
**Pages:** `/admin/ratings`
|
|
|
|
---
|
|
|
|
## 12. مدیریت پیامک (SMS Management)
|
|
|
|
```
|
|
[پنل SMS]
|
|
├─► تب «قالبهای نمونه» (قالبهای ادمین)
|
|
│ ├─ لیست قالبهای sample
|
|
│ ├─ افزودن قالب نمونه ──► [فرم]
|
|
│ └─ ویرایش / حذف
|
|
│
|
|
├─► تب «در انتظار تأیید»
|
|
│ ├─ لیست قالبهای submitted توسط پزشکان/کلینیکها
|
|
│ ├─── ردیف قالب ──►
|
|
│ │ ├─ نام، دستهبندی، محتوا، ارسالکننده
|
|
│ │ ├─ تأیید ──► PATCH approve
|
|
│ │ └─ رد ──► [فرم دلیل رد] ──► PATCH reject
|
|
│
|
|
└─► تب «لاگهای ارسال»
|
|
├─ فیلتر: وضعیت (queued/sent/failed) / provider / تاریخ
|
|
└─ مشاهده جزئیات هر پیام
|
|
```
|
|
|
|
**Pages:** `/admin/sms`
|
|
**API:**
|
|
- `GET /api/v1/sms/sample-templates`
|
|
- `PATCH /api/v1/sms/templates/:uuid/approve`
|
|
- `PATCH /api/v1/sms/templates/:uuid/reject`
|
|
|
|
---
|
|
|
|
## 13. مدیریت دستهبندیها (Categories)
|
|
|
|
```
|
|
[صفحه دستهبندیها]
|
|
├─► تببندی بر اساس نوع:
|
|
│ ├─ استانها (state)
|
|
│ ├─ شهرها (city) ──► وابسته به استان انتخابی
|
|
│ ├─ تخصصها (specialty)
|
|
│ ├─ خدمات پزشک (doctor_service)
|
|
│ ├─ نوع بیمه (insurance_type)
|
|
│ ├─ بیمه تکمیلی (supplementary_insurance)
|
|
│ └─ تگهای بلاگ (tag)
|
|
│
|
|
└─── هر تب:
|
|
├─ لیست با جستجو
|
|
├─ افزودن ──► [فرم: نام، کد، parent (اگر نیاز)]
|
|
├─ ویرایش
|
|
└─ حذف ──► [Confirm Dialog]
|
|
```
|
|
|
|
**Pages:** `/admin/categories`
|
|
|
|
---
|
|
|
|
## 14. مدیریت بلاگ (Blog Management)
|
|
|
|
```
|
|
[لیست مقالات]
|
|
├─► فیلتر: وضعیت (draft/published) / نویسنده / تگ
|
|
│
|
|
├─── ردیف مقاله ──►
|
|
│ ├─ عنوان، نویسنده، تاریخ، تعداد بازدید
|
|
│ ├─ مشاهده / ویرایش ──► [ادیتور مقاله]
|
|
│ └─ حذف ──► [Confirm Dialog]
|
|
│
|
|
└─── دکمه «نوشتن مقاله» ──► [ادیتور]
|
|
├─ عنوان، خلاصه، محتوا (Rich Text)
|
|
├─ آپلود تصویر
|
|
├─ انتخاب تگها
|
|
└─ انتشار / ذخیره پیشنویس
|
|
```
|
|
|
|
**Pages:** `/admin/blogs`, `/admin/blogs/new`, `/admin/blogs/:uuid/edit`
|
|
|
|
---
|
|
|
|
## 15. مدیریت منشیها (Secretary Management)
|
|
|
|
```
|
|
[لیست منشیها] (کلی، همه پزشکان)
|
|
├─► فیلتر: پزشک / وضعیت فعال
|
|
│
|
|
├─── ردیف منشی ──►
|
|
│ ├─ نام، موبایل، نام پزشک
|
|
│ ├─ مشاهده دسترسیها (JSON permissions)
|
|
│ ├─ ویرایش دسترسیها ──► [فرم Checkboxها]
|
|
│ │ appointments: view/create/cancel/update_status
|
|
│ │ addresses: view/create/update/delete
|
|
│ │ clinic_info: view/update
|
|
│ │ insurances: view/create/update/delete
|
|
│ ├─ فعال/غیرفعال
|
|
│ └─ حذف ──► [Confirm Dialog]
|
|
```
|
|
|
|
**Pages:** `/admin/secretaries`
|
|
|
|
---
|
|
|
|
## 16. ساختار Navigation (Sidebar)
|
|
|
|
```
|
|
Sidebar
|
|
├─ 📊 داشبورد
|
|
├─ 👥 کاربران
|
|
├─ 🩺 پزشکان
|
|
├─ 🏥 کلینیکها
|
|
├─ 📅 نوبتها
|
|
├─ 💳 پرداختها
|
|
├─ 🏦 تسویهحساب [badge: pending count]
|
|
├─ 🤝 نمایندگان
|
|
├─ 💬 نظرات [badge: pending count]
|
|
├─ ⭐ امتیازها
|
|
├─ 📱 پیامک
|
|
├─ 🗂 دستهبندیها
|
|
├─ 📝 بلاگ
|
|
└─ 🔐 منشیها
|
|
```
|
|
|
|
---
|
|
|
|
## 17. Global Components
|
|
|
|
| Component | توضیح |
|
|
|-----------|--------|
|
|
| `<DataTable>` | جدول با sort، filter، pagination |
|
|
| `<StatusBadge>` | نمایش وضعیت با رنگبندی |
|
|
| `<ConfirmDialog>` | تأیید عملیات حساس |
|
|
| `<SearchInput>` | جستجوی debounced |
|
|
| `<FilterPanel>` | فیلترهای collapsible |
|
|
| `<ImageUpload>` | آپلود تصویر با preview |
|
|
| `<JalaliDatePicker>` | انتخاب تاریخ شمسی |
|
|
| `<PersianNumber>` | نمایش اعداد فارسی |
|
|
| `<Notification>` | Toast notifications |
|
|
| `<PermissionCheckbox>` | ماتریس دسترسیهای منشی |
|
|
|
|
---
|
|
|
|
## 18. Auth Guard & Route Protection
|
|
|
|
```
|
|
[App Router]
|
|
├─ /login ──────────────────► PublicRoute (redirect to /admin/dashboard if logged in)
|
|
└─ /admin/* ─────────────────► PrivateRoute
|
|
├─ Check JWT validity
|
|
├─ Verify ROLE_ADMIN
|
|
├─ Auto refresh token if expired
|
|
└─ Redirect to /login if unauthenticated
|
|
```
|
|
|
|
---
|
|
|
|
## 19. State Management پیشنهادی
|
|
|
|
```
|
|
React Query (TanStack Query) ──► همه API calls (cache + refetch)
|
|
Zustand ──► auth state، sidebar state، notification queue
|
|
React Hook Form + Zod ──► همه فرمها با validation
|
|
React Router v6 ──► routing
|
|
```
|