Files
clinicpro/docs/admin-ui/user-flow.md
T
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

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/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