- 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.
16 KiB
16 KiB
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/doctorsPOST /api/v1/doctorPATCH /api/v1/doctor/:uuidDELETE /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-templatesPATCH /api/v1/sms/templates/:uuid/approvePATCH /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