# تعریف بیمار جدید بدون ثبت‌نام قبلی در سایت ## پروژه `clinicpro` (backend + admin frontend) ## زمینه در حال حاضر برای ایجاد پرونده‌ی بیمار، کاربر باید **از قبل در سیستم ثبت‌نام کرده باشد**: مودال «ایجاد پرونده بیمار» با شماره موبایل جستجو می‌کند و اگر `User` پیدا نشد، خطا می‌دهد. ```php // src/Patient/Controller/PatientController.php — searchUser $patient = $this->userRepo->findByMobile($mobile); if ($patient === null) { return $this->error(ErrorCodes::ERR_NOT_FOUND_001, 'کاربری با این شماره یافت نشد', 404); } ``` و `create` فقط با `user_uuid` کار می‌کند: ```php $userUuid = trim($data['user_uuid'] ?? ''); $patient = $this->userRepo->findByUuid($userUuid); ``` ## مشکل / هدف کلینیک/مطب باید بتواند بیمار جدیدی تعریف کند که **هرگز در سایت ثبت‌نام نکرده**. یعنی اگر با شماره موبایل کاربری پیدا نشد، به‌جای خطا، امکان ساخت `User` جدید (به‌همراه پروفایل پایه: نام، کد ملی، جنسیت و …) و سپس ساخت `PatientRecord` فراهم شود. ## فایل‌های مرتبط | فایل | نقش | |------|-----| | `src/Patient/Controller/PatientController.php` | `searchUser` + `create` | | `src/Patient/Service/PatientService.php` | منطق ساخت پرونده | | `src/Auth/Entity/User.php` | کاربر؛ دارای `nationalCode`, `realName`, `mobileNumber` | | `src/UserProfile/Entity/UserProfile.php` | پروفایل کامل بیمار (family, gender, dateOfBirth, insurance ids و …) | | `src/Auth/Repository/UserRepository.php` | `findByMobile`, `findByUuid`, `save` | | `assets/admin/pages/MyPatientsPage.tsx` | مودال «ایجاد پرونده بیمار» (state: `createRecordOpen`, `searchMobile`, `foundUser`) | | `docs/api/patient.md` | مستندات API بیمار | ## وضعیت فعلی - مودال فعلی: شماره موبایل می‌گیرد → `GET /api/v1/patient/search-user?mobile=` → اگر یافت شد کارت نتیجه + دکمه‌ی «ایجاد پرونده» (`POST /api/v1/patient` با `user_uuid`). - اگر یافت نشد: فقط پیغام خطا «کاربری با این شماره یافت نشد»؛ راهی برای ساخت بیمار جدید نیست. - `User` ساختنی است با `new User($mobileNumber)` و `setRealName`, `setNationalCode`. - `UserProfile` فیلدهای دموگرافیک کامل دارد (`family`, `gender`, `dateOfBirth`, `basicInsuranceId`, `supplementaryInsuranceId` …). ## وظایف ### ۱. Backend — endpoint ساخت بیمار جدید دو رویکرد ممکن (یکی را انتخاب و توضیح بده): - **الف)** گسترش `POST /api/v1/patient`: اگر `user_uuid` نبود ولی `mobile` + `name` (+ فیلدهای اختیاری پروفایل) آمد، `User` جدید بساز (با نقش `ROLE_USER`)، در صورت نیاز `UserProfile` بساز، سپس `PatientRecord`. - **ب)** endpoint جدا `POST /api/v1/patient/new-user`. > توصیه: رویکرد الف. در `create`: اول با `user_uuid`؛ اگر نبود، با `mobile` جستجو کن؛ اگر `User` نبود و `name` آمده بود، بساز. نکات: - اگر شماره موبایل قبلاً وجود دارد (کاربر ثبت‌نام‌کرده)، همان `User` استفاده شود (نه duplicate). - validation: موبایل `^09\d{9}$`, کد ملی در صورت ارسال `^\d{10}$`. - فیلدهای پروفایل اختیاری ذخیره شوند (در `User` یا `UserProfile` طبق مدل واقعی). ### ۲. Admin Frontend — مودال مودال «ایجاد پرونده بیمار» را گسترش بده: - بعد از جستجو، اگر کاربر **یافت نشد**، به‌جای خطای صرف، یک فرم «ساخت بیمار جدید» نشان بده (نام، کد ملی، جنسیت، و فیلدهای پایه) با موبایل از پیش پرشده. - دکمه‌ی «ایجاد پرونده» این بار `User` جدید را هم می‌سازد. - اگر یافت شد، رفتار فعلی حفظ شود. ### ۳. مستندات `docs/api/patient.md` را با تغییر `POST /api/v1/patient` (یا endpoint جدید) به‌روز کن: body جدید، حالت‌های یافت‌شد/ساخت جدید، error codeها. ## نکات مهم - entity owner از `#[CurrentUser]` resolve می‌شود (`PatientController::resolveEntity`). - duplicate موبایل را مدیریت کن. - این پرامپت با `patient-record-profile-binding.md` هم‌پوشانی دارد (هر دو روی پروفایل بیمار کار می‌کنند)؛ اگر آن اجرا شده، از همان ساختار `UserProfile` استفاده کن. - بیمار ساخته‌شده بدون رمز عبور است (بعداً می‌تواند با OTP وارد شود)؛ مطمئن شو ساخت `User` بدون `passwordHash` مجاز است (هست — `nullable: true`).