# ذخیره و نمایش صحیح تاریخ تولد در پروفایل (Unix) ## پروژه `clinicpro` (Backend — منبع حقیقت). > **Cross-repo:** سایت عمومی `nobat724_front` تاریخ تولد را به‌صورت **Unix timestamp** با کلید `birthday` می‌فرستد (تبدیل جلالی↔Unix کاملاً سمت فرانت با `changeDateType` انجام می‌شود) و انتظار دارد همان Unix را برای نمایش بگیرد. پرامپت همتای فرانت: `nobat724_front/.claude/prompt/profile-birthday-send-direction-fix.md`. این پرامپت **اول** اجرا شود. ## زمینه در فرم اطلاعات کاربری (`/dashboard`)، فیلد «تاریخ تولد» مقدارش با کلید `birthday` به‌صورت **Unix timestamp** ارسال می‌شود (فرانت با `moment(jalali,"jYYYY/jMM/jDD").unix()` تبدیل می‌کند). اما در `UserProfileController::hydrate` این مقدار **عمداً نادیده گرفته و `null` ذخیره می‌شود** (یک TODO نیمه‌کاره). در نتیجه تاریخ تولد هرگز ذخیره نمی‌شود؛ و `toArray` کلید `birthday` را اصلاً برنمی‌گرداند (فقط `date_of_birth`)، پس فرانت چیزی برای نمایش ندارد. ## مشکل / هدف ۱. ورودی: `birthday` (Unix integer) را در ستون `date_of_birth` ذخیره کن (به‌جای `null`). ۲. خروجی: `toArray` کلید `birthday` = همان Unix (`date_of_birth`) را برگرداند تا فرانت با `changeDateType` به جلالی نمایش دهد. ## فایل‌های مرتبط | فایل | نقش | |------|-----| | `src/UserProfile/Controller/UserProfileController.php` | `hydrate` — ذخیره `birthday`(Unix) در `date_of_birth` | | `src/UserProfile/Entity/UserProfile.php` | `toArray` — افزودن کلید `birthday` (= Unix `date_of_birth`) | ## وضعیت فعلی (کد واقعی) `hydrate` — مقدار دور ریخته می‌شود: ```php // birthday: accept Jalali string "1370-05-15" stored as-is converted to Unix if (array_key_exists('birthday', $data) && $data['birthday'] !== null) { // Will be replaced with JalaliDateService in Task 16 $profile->setDateOfBirth(null); // ❌ هرگز ذخیره نمی‌شود } if (array_key_exists('date_of_birth', $data)) $profile->setDateOfBirth($data['date_of_birth']); ``` `UserProfile`: ```php #[ORM\Column(name: 'date_of_birth', type: 'integer', nullable: true)] private ?int $dateOfBirth = null; // toArray(): 'date_of_birth' => $this->dateOfBirth, // کلید birthday وجود ندارد ``` > فرانت `birthday` را Unix می‌فرستد (مثلاً `-405...` یا یک integer مثبت/منفی برای تاریخ‌های قبل/بعد ۱۹۷۰). ممکن است به‌صورت string-encoded integer هم بیاید؛ با `(int)` ایمن تبدیل کن. ## وظایف ### ۱. ذخیره `birthday` (Unix) در `hydrate` بلوک نیمه‌کاره را با ذخیره‌ی واقعی جایگزین کن: ```php if (array_key_exists('birthday', $data)) { $b = $data['birthday']; $profile->setDateOfBirth(($b === null || $b === '') ? null : (int) $b); } if (array_key_exists('date_of_birth', $data)) { $profile->setDateOfBirth($data['date_of_birth'] === null ? null : (int) $data['date_of_birth']); } ``` ### ۲. خروجی `birthday` در `toArray` در `UserProfile::toArray`، کنار `date_of_birth`، کلید `birthday` را هم برگردان (همان مقدار Unix): ```php 'date_of_birth' => $this->dateOfBirth, 'birthday' => $this->dateOfBirth, ``` > هر دو کلید همان Unix‌اند؛ `birthday` برای مصرف مستقیم فرانت (که `moment.unix(birthday)` می‌زند) و `date_of_birth` برای سازگاری عقب‌رو. ### ۳. مستندسازی اگر سند پروفایلی در `docs/api/` هست، فیلد `birthday` (Unix در ورودی و خروجی) را اضافه کن. اگر نیست، نیازی به ساخت فایل جدید نیست. ## نکات مهم - **هیچ تبدیل جلالی در بک‌اند لازم نیست** — `JalaliDateService` استفاده نمی‌شود؛ تبدیل کاملاً سمت فرانت است. ساده نگه‌دار. - `birthday` ممکن است integer یا string-encoded-integer باشد → `(int)` ایمن. - migration لازم نیست (`date_of_birth` integer از قبل هست). - پاسخ‌ها از `BaseController`. - تست: `PATCH /api/v1/user-profile/{uuid}` با `{"birthday": 12345678}` → در DB `date_of_birth = 12345678`؛ سپس `GET` → هم `birthday` و هم `date_of_birth` برابر `12345678`. round-trip سالم.