102 lines
6.0 KiB
Markdown
102 lines
6.0 KiB
Markdown
# کاربران تستی
|
|
|
|
**پنل ادمین:** https://clinic-pro.ddev.site/admin
|
|
|
|
> رمز عبور همهٔ پرسوناها: `QaTest@1234`
|
|
|
|
این فایل وضعیت واقعی دیتابیس لوکال پس از بازسازی کامل (drop → migrate → seed) را
|
|
توصیف میکند. صحتش با `node .claude/skills/qa-clinicpro/driver.mjs roles` قابل
|
|
تأیید است — اگر ردیفی `✗` گرفت، این فایل کهنه شده است.
|
|
|
|
---
|
|
|
|
## پرسوناها
|
|
|
|
واحد کار «پرسونا» است نه `ROLE_*`؛ پزشک مستقل و پزشک عضو کلینیک هر دو `ROLE_DOCTOR`
|
|
دارند ولی دادهٔ متفاوتی میبینند.
|
|
|
|
| پرسونا | موبایل | نقشها | تمایز |
|
|
|---|---|---|---|
|
|
| `admin` | `09120671756` | `ROLE_ADMIN` | — |
|
|
| `clinic` | `09127000000` | `ROLE_CLINIC` | مالک «کلینیک تست QA» |
|
|
| `secretary` | `09123456778` | `ROLE_SECRETARY` | منشیِ `doctor_solo` |
|
|
| `doctor` | `09390039833` | `ROLE_DOCTOR` | پزشک ساده، بدون کلینیک |
|
|
| `representation` | `09124000001` | `ROLE_REPRESENTATION` | نمایندهٔ شهری |
|
|
| `doctor_solo` | `09129000001` | `ROLE_DOCTOR` | مطب شخصی، بدون کلینیک |
|
|
| `doctor_member` | `09129000002` | `ROLE_DOCTOR` | عضو «کلینیک تست QA» → موقع ورود «انتخاب محیط کاری» میبیند |
|
|
| `clinic_doctor` | `09129000003` | `ROLE_CLINIC` + `ROLE_DOCTOR` | چندنقشی، مالک «کلینیک تست چندنقشی» |
|
|
| `secretary_clinic` | `09129000004` | `ROLE_SECRETARY` | منشیِ `doctor_member` در کلینیک |
|
|
| `unclaimed_doctor` | `09129000005` | `ROLE_UNCLAIMED_DOCTOR` | — |
|
|
| `patient` | `09129000006` | `ROLE_USER` | کاربر عادی سایت |
|
|
| `importer` | `09129000007` | `ROLE_IMPORTER` | — |
|
|
|
|
`patient`، `unclaimed_doctor` و `importer` به پنل مدیریت دسترسی ندارند و در صفحهٔ
|
|
ورود پیام «حساب شما دسترسی به پنل مدیریت را ندارد» میگیرند. این باگ نیست:
|
|
`PasswordAuthenticator` هر کاربری را که `User::isStaff()` نباشد رد میکند.
|
|
|
|
## شناسهها
|
|
|
|
| موجودیت | UUID |
|
|
|---|---|
|
|
| پزشک `doctor_solo` | `01e2a9b4-72f4-4a48-924c-0f95bb77a994` |
|
|
| پزشک `doctor_member` | `439c9935-77bc-4f72-b73d-2432712bb6f5` |
|
|
| پزشک `clinic_doctor` | `e3e4c2bf-170a-479c-a385-4af7d57fcbbe` |
|
|
| پزشک `doctor` | `c3311b98-86b7-4d8e-8538-1390c36c2a90` |
|
|
| پروفایل تصاحبنشده | `ded7a65d-d0fa-47e0-bc16-e801c5c75147` |
|
|
| کلینیک تست QA | `bcb00726-2343-4d63-90c6-d0175cc74591` |
|
|
| کلینیک تست چندنقشی | `e62f69a2-381b-4a6c-9235-7f9c173f3c46` |
|
|
|
|
هر سه پزشکِ `doctor_solo` / `doctor_member` / `clinic_doctor` آدرس مطب، تخصص و
|
|
برنامهٔ هفتگی (شنبه تا چهارشنبه، ۰۹:۰۰–۱۳:۰۰ و ۱۶:۰۰–۱۹:۰۰، اسلات ۲۰ دقیقهای)
|
|
دارند، پس صفحات نوبتدهیشان خالی نیستند.
|
|
|
|
## دادهٔ انبوه
|
|
|
|
`app:seed-demo-data` حدود ۸٬۴۰۰ کاربر، ۱۸۰ پزشک، ۲۰۰ کلینیک، ۲۵ نماینده و ۱۵٬۰۰۰
|
|
نوبت میسازد — برای تست «دادهٔ زیاد» نیازی به seed اضافه نیست.
|
|
|
|
---
|
|
|
|
## بازسازی از صفر
|
|
|
|
ترتیب اجباری است — وابستگیها چرخهایاند:
|
|
|
|
```bash
|
|
ddev exec php bin/console doctrine:schema:drop --full-database --force
|
|
ddev exec php bin/console doctrine:migrations:migrate --no-interaction
|
|
ddev exec php bin/console app:create-admin 09120671756 'QaTest@1234'
|
|
# نمایندهها باید قبل از شهرها باشند: data/seed/cities.json به representation_id
|
|
# های ۱ تا ۳ ارجاع میدهد و app:seed-categories اعتبارسنجیشان میکند.
|
|
# POST /api/v1/representation ×۳ (با توکن ادمین)
|
|
ddev exec php bin/console app:seed-categories --no-interaction
|
|
ddev exec php bin/console app:seed-sms-message-templates --no-interaction
|
|
ddev exec php bin/console app:seed-demo-data --purge --no-interaction
|
|
```
|
|
|
|
`app:seed-demo-data` خودش بازهٔ `09124000%` را مالک است و نمایندههای مرحلهٔ قبل را
|
|
purge و بازسازی میکند؛ بعد از آن `cities.representation_id` به شناسههای قدیمی اشاره
|
|
میکند و باید به شناسههای جدید نگاشت شود.
|
|
|
|
سپس پرسوناها از راه اندپوینتهای خود اپ ساخته میشوند:
|
|
`POST /api/v1/admin/doctors` · `POST /api/v1/admin/clinic` ·
|
|
`POST /api/v1/admin/clinic/{uuid}/invite-doctor` + `POST /api/v1/doctor/invitation/{uuid}/respond` ·
|
|
`POST /api/v1/secretary` · `POST /api/v1/admin/doctors/import` ·
|
|
`send-code → verify-code → register` برای `patient`.
|
|
|
|
`ROLE_IMPORTER` و `ROLE_UNCLAIMED_DOCTOR` **هیچ مسیر اپلیکیشنی ندارند** — نگاشت نقش
|
|
در `AdminApiController::updateUserRole` فقط `admin/doctor/secretary/clinic/patient`
|
|
را میشناسد، پس این دو با SQL مستقیم ست میشوند.
|
|
|
|
## نکتهها
|
|
|
|
- **کپچا:** نصب تازه `ALTCHA_ENABLED=true` دارد و override پنل خالی است، پس لاگین و
|
|
ثبتنام اسکریپتی رد میشود. از پنل ادمین یا
|
|
`PATCH /api/v1/admin/settings {"altcha_enabled":"0"}` غیرفعالش کن.
|
|
- **کد OTP در dev همیشه `12345` است** (`OtpService::sendCode`).
|
|
- **`send-code` سقف ۵ درخواست در ساعت بهازای هر IP دارد.** برای تستهای انبوه توکن را
|
|
مستقیم بساز:
|
|
`ddev exec 'php bin/console lexik:jwt:generate-token <mobile> --user-class="App\\Auth\\Entity\\User"'`
|
|
- **رمز پس از ریست:** `ddev exec php bin/console security:hash-password 'QaTest@1234'`
|
|
و هش را در `users.password_hash` بگذار. کاربرانی که از راه `POST /api/v1/admin/doctors`
|
|
یا `/api/v1/admin/clinic` ساخته میشوند رمز نمیگیرند.
|