Files
clinicpro/.claude/prompt/patient-record-profile-binding.md
T
hamedandClaude Opus 4.8 2206f02396 feat: enrich patient record with full profile
GET /api/v1/patient/{uuid} now returns a `profile` object from UserProfile
(demographics, contact, insurance names resolved). Admin record detail shows
a "patient info" section. Empty fields render as "ثبت نشده".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 17:21:33 +03:30

4.9 KiB

اتصال پرونده‌ی بیمار به پروفایل بیمار

پروژه

clinicpro (backend + admin frontend)

زمینه

پرونده‌ی بیمار (PatientRecord) فعلاً فقط به User وصل است و در پنل صرفاً نام و موبایل (و اخیراً کد ملی) نمایش داده می‌شود. اطلاعات کامل دموگرافیک بیمار که در UserProfile ذخیره شده، برای کلینیک/مطب قابل مشاهده نیست.

مشکل / هدف

وقتی کاربری به یک مطب یا کلینیک اضافه می‌شود، اطلاعات پروفایل او باید برای آن کلینیک مشخص باشد: نام و نام خانوادگی، کد ملی، جنسیت، تاریخ تولد، بیمه‌ی پایه/مکمل، تماس و … . یعنی پرونده‌ی بیمار باید بر اساس UserProfile غنی شود.

فایل‌های مرتبط

فایل نقش
src/UserProfile/Entity/UserProfile.php پروفایل کامل بیمار
src/Patient/Entity/PatientRecord.php پرونده؛ toArray() فعلاً فقط user_name/user_mobile/user_national_code
src/Patient/Controller/PatientController.php list + show
src/Patient/Repository/PatientRecordRepository.php کوئری‌ها
assets/admin/pages/MyPatientsPage.tsx لیست کارتی + صفحه‌ی جزئیات پرونده (بنر بالای پرونده)
assets/admin/types/index.ts PatientRecord type
docs/api/patient.md مستندات

وضعیت فعلی

UserProfile فیلدهای موجود (نمونه):

private ?string $family;
private ?string $fathersName;
private ?string $nationalCode;
private ?string $gender;
private ?int    $dateOfBirth;       // unix
private ?string $bloodType;
private ?string $maritalStatus;
private ?string $job;
private ?string $address;
private ?string $homePhone;
private ?int    $basicInsuranceId;
private ?int    $supplementaryInsuranceId;

PatientRecord::toArray():

return [
    'uuid'               => $this->uuid,
    'entity_type'        => $this->entityType,
    'entity_id'          => $this->entityId,
    'user_uuid'          => $this->user->getUuid(),
    'user_name'          => $this->user->getRealName(),
    'user_mobile'        => $this->user->getMobileNumber(),
    'user_national_code' => $this->user->getNationalCode(),
    'created_by_type'    => $this->createdByType,
    'created_at'         => $this->createdAt,
];

پروفایل بیمار اصلاً در پاسخ نیست.

وظایف

۱. تحلیل رابطه User ↔ UserProfile

UserProfile را کامل بخوان: رابطه به User، repository، و اینکه آیا یک‌به‌یک است. روش گرفتن پروفایل از روی User را پیدا کن.

۲. غنی‌سازی پاسخ پرونده

  • در show (و در صورت نیاز list) اطلاعات پروفایل بیمار را به پاسخ اضافه کن. توصیه: یک کلید profile در پاسخِ show (جزئیات کامل)، و در list فقط فیلدهای سبک (نام، جنسیت، کد ملی) برای کارت.
  • نام بیمه‌ها از id به نام resolve شود (LEFT JOIN یا lookup روی insurances).
  • اگر پروفایل وجود نداشت، مقادیر null برگردد (نه خطا).

برای list از kept-light استفاده کن تا کوئری سنگین نشود؛ برای show می‌توان پروفایل کامل را join کرد.

۳. Admin Frontend — نمایش پروفایل در پرونده

  • در صفحه‌ی جزئیات پرونده (بنر بالای تاریخچه‌ی مراجعات)، یک بخش «اطلاعات بیمار» با فیلدهای پروفایل (نام کامل، کد ملی، جنسیت، تاریخ تولد شمسی با formatDate، بیمه پایه/مکمل، تماس) اضافه کن.
  • PatientRecord type در types/index.ts را با profile به‌روز کن.
  • اگر فیلدی خالی بود، «ثبت نشده» نشان بده.

۴. مستندات

docs/api/patient.md را با ساختار جدید پاسخ (profile) برای show و فیلدهای سبک list به‌روز کن.

نکات مهم

  • تاریخ تولد unix timestamp است؛ با formatDate() شمسی نمایش بده.
  • entity_type می‌تواند doctor یا clinic باشد؛ نمایش پروفایل برای هر دو یکسان.
  • این پرامپت مکمل create-patient-without-signup.md است؛ اگر بیمار جدید بدون ثبت‌نام ساخته می‌شود، همان فیلدهای پروفایل باید قابل ذخیره و سپس قابل نمایش باشند — ساختار UserProfile را یکدست نگه‌دار.
  • کوئری list نباید N+1 شود؛ از join استفاده کن.