feat(patient): complete "اطلاعات پرونده" demographic form
Backend:
- Add profile columns field_of_study, province_id, city_id, postal_code,
referral_source (UserProfile + migration).
- Extend PATCH /api/v1/patient/{uuid} to persist all demographic fields
and return them in the patient profile payload.
- Support editable mobile (login identifier): validation, uniqueness,
User.setMobileNumber, new ERR_PROFILE_002.
- Update docs/api/patient.md.
Frontend:
- New reusable Input, Field, and PatientRecordInfoForm (RHF + Zod).
- usePatient/useUpdatePatient hooks and patientForm mapping helpers.
- Extend the existing "info" tab in MyPatientsPage to the full field set
via the shared form (province/city/insurance options, Jalali date).
Tests: Patient entity + PATCH integration (PHPUnit); form, hooks, and
mapping helpers (Vitest).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+28
-2
@@ -141,13 +141,21 @@ Returns a single patient record, enriched with the patient's full profile (`prof
|
||||
"full_name": "محمد محمدی",
|
||||
"name": "محمد",
|
||||
"family": "محمدی",
|
||||
"fathers_name": "رضا",
|
||||
"national_code": "0012345678",
|
||||
"gender": "male",
|
||||
"date_of_birth": 700000000,
|
||||
"blood_type": "O+",
|
||||
"marital_status": "single",
|
||||
"education": "کارشناسی",
|
||||
"field_of_study": "نرمافزار",
|
||||
"job": "...",
|
||||
"address": "...",
|
||||
"province_id": 8,
|
||||
"city_id": 42,
|
||||
"postal_code": "8913746351",
|
||||
"referral_source": "اینستاگرام",
|
||||
"description": "...",
|
||||
"home_phone": "...",
|
||||
"work_phone": "...",
|
||||
"mobile": "0912...",
|
||||
@@ -181,7 +189,7 @@ PATCH /api/v1/patient/{uuid}
|
||||
|
||||
بهروزرسانی **partial** است — فقط کلیدهای ارسالشده اعمال میشوند. مقدار `""`/`null` برای فیلدهای پروفایل یعنی «پاککردن». `name` روی `User.realName` و بقیهی فیلدها روی `UserProfile` مینشینند (در صورت نبود پروفایل، ساخته میشود).
|
||||
|
||||
> **شماره موبایل قابل ویرایش نیست** — شناسهی حساب کاربر است و در این endpoint نادیده گرفته میشود.
|
||||
> **شماره موبایل قابل ویرایش است** — موبایل همان شناسهی ورود کاربر است، پس ارسال `mobile` علاوه بر شمارهی تماس، **نامکاربری ورود کاربر را نیز تغییر میدهد**. باید `^09\d{9}$` و در سطح کاربران یکتا باشد.
|
||||
|
||||
**Request body:**
|
||||
|
||||
@@ -189,14 +197,23 @@ PATCH /api/v1/patient/{uuid}
|
||||
{
|
||||
"name": "محمد",
|
||||
"family": "محمدی",
|
||||
"fathers_name": "رضا",
|
||||
"mobile": "09131234567",
|
||||
"national_code": "0012345678",
|
||||
"gender": "male",
|
||||
"blood_type": "O+",
|
||||
"marital_status": "single",
|
||||
"education": "کارشناسی",
|
||||
"field_of_study": "نرمافزار",
|
||||
"job": "مهندس",
|
||||
"home_phone": "03511111111",
|
||||
"work_phone": "03512222222",
|
||||
"address": "...",
|
||||
"province_id": 8,
|
||||
"city_id": 42,
|
||||
"postal_code": "8913746351",
|
||||
"referral_source": "اینستاگرام",
|
||||
"description": "...",
|
||||
"basic_insurance_id": 3,
|
||||
"supplementary_insurance_id": 9
|
||||
}
|
||||
@@ -206,13 +223,21 @@ PATCH /api/v1/patient/{uuid}
|
||||
|-------|------|-------|
|
||||
| `name` | string | اگر ارسال شود و خالی نباشد → `User.realName`. رشتهی خالی نادیده گرفته میشود. |
|
||||
| `family` | string\|null | `UserProfile.family` |
|
||||
| `fathers_name` | string\|null | `UserProfile.fathersName` (نام پدر) |
|
||||
| `mobile` | string\|null | اگر خالی نباشد و با موبایل فعلی فرق کند باید `^09\d{9}$` و یکتا باشد؛ روی `User.mobileNumber` ست میشود و **شناسهی ورود** را عوض میکند |
|
||||
| `national_code` | string\|null | اگر خالی نباشد باید ۱۰ رقم و در سطح بیمار یکتا باشد؛ روی `User.nationalCode` و `UserProfile.nationalCode` ست میشود |
|
||||
| `gender` | `male`\|`female`\|null | |
|
||||
| `blood_type` | string\|null | |
|
||||
| `marital_status` | string\|null | |
|
||||
| `education` | string\|null | مقطع تحصیلی (`UserProfile.education`) |
|
||||
| `field_of_study` | string\|null | رشتهی تحصیلی (`UserProfile.fieldOfStudy`) |
|
||||
| `job` | string\|null | |
|
||||
| `home_phone`, `work_phone` | string\|null | |
|
||||
| `address` | string\|null | |
|
||||
| `province_id`, `city_id` | int\|null | id استان/شهر (category؛ `null` = حذف) |
|
||||
| `postal_code` | string\|null | کد پستی |
|
||||
| `referral_source` | string\|null | نحوهی آشنایی |
|
||||
| `description` | string\|null | توضیحات |
|
||||
| `basic_insurance_id`, `supplementary_insurance_id` | int\|null | id بیمه؛ `null` = حذف |
|
||||
|
||||
**Response 200:** مثل `GET /api/v1/patient/{uuid}` (رکورد + `profile` تازه).
|
||||
@@ -222,8 +247,9 @@ PATCH /api/v1/patient/{uuid}
|
||||
| Code | HTTP | Description |
|
||||
|------|------|-------------|
|
||||
| `ERR_PATIENT_NOT_FOUND` | 404 | Record not found or not owned by caller |
|
||||
| `ERR_VALIDATION_001` | 422 | کد ملی باید ۱۰ رقم باشد (`field: national_code`) |
|
||||
| `ERR_VALIDATION_001` | 422 | کد ملی باید ۱۰ رقم باشد (`field: national_code`) یا موبایل نامعتبر است (`field: mobile`) |
|
||||
| `ERR_PROFILE_NATIONAL_CODE_TAKEN` | 409 | کد ملی متعلق به بیمار دیگری است (`field: national_code`) |
|
||||
| `ERR_PROFILE_002` | 409 | موبایل متعلق به کاربر دیگری است (`field: mobile`) |
|
||||
| `ERR_SUBSCRIPTION_REQUIRED` | 403 | No `patient_records` feature |
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user