- Removed the "دکتر" prefix from doctor names in various components and API responses to ensure consistency and clarity. - Updated the AppointmentDetailPage, CommentsPage, DashboardPage, RatingsPage, SecretariesPage, and other relevant files to reflect the changes in doctor name formatting. - Adjusted API documentation to align with the new naming conventions. - Implemented validation to prevent the creation of clinics without a name and restricted users to a single clinic. - Added tests to verify that doctor names are stored without titles and that clinic creation adheres to the new validation rules.
6.8 KiB
کاربران تستی
پنل ادمین: 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 اضافه نیست.
بازسازی از صفر
ترتیب اجباری است — وابستگیها چرخهایاند:
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ساخته میشوند رمز نمیگیرند.
نام پزشک بدون عنوان
نام ذخیرهشدهٔ پزشک هرگز پیشوند «دکتر» ندارد؛ همهٔ مسیرهای ثبت و ویرایش آن را با
PersianText::stripDoctorTitle() حذف میکنند. افزودن عنوان کار لایهٔ نمایش است —
nobat724_front برای عنوان صفحه و JSON-LD از doctorTitle() استفاده میکند (idempotent)،
و پنل ادمین اصلاً عنوان اضافه نمیکند.
پاکسازی دادهٔ قدیمی: php bin/console app:doctors:fix-irimc-names --all --dry-run