diff --git a/assets/admin/pages/AppointmentCreatePage.test.tsx b/assets/admin/pages/AppointmentCreatePage.test.tsx
index 06ded61a..54a4d306 100644
--- a/assets/admin/pages/AppointmentCreatePage.test.tsx
+++ b/assets/admin/pages/AppointmentCreatePage.test.tsx
@@ -86,4 +86,45 @@ describe('AppointmentCreatePage — افزودن نوبت', () => {
fireEvent.change(screen.getByPlaceholderText('شماره تماس مراجعه کننده'), { target: { value: '09121234567' } });
expect(btn).toBeDisabled();
});
+
+ it('picking an existing patient WITH a national code enables submit and posts it (happy path)', async () => {
+ get.mockImplementation((url: string) => {
+ if (url.startsWith('/api/v1/patients?'))
+ return Promise.resolve({ success: true, data: [{ uuid: 'rec1', user_name: 'حامد حسینی', user_mobile: '09210671745', user_national_code: '0012345675' }] });
+ return Promise.resolve({ success: true, data: [] });
+ });
+
+ renderWithProviders(, { route: '/admin/appointments/new' });
+
+ fireEvent.change(screen.getByPlaceholderText('جستجوی نام، شماره تماس، شماره پرونده...'), { target: { value: 'حامد' } });
+ fireEvent.click(await screen.findByText(/حامد حسینی/));
+
+ const btn = screen.getByText('ثبت اطلاعات') as HTMLButtonElement;
+ await waitFor(() => expect(btn).not.toBeDisabled());
+
+ fireEvent.click(btn);
+ await waitFor(() => expect(post).toHaveBeenCalled());
+ const [, body] = post.mock.calls[0];
+ expect(body).toMatchObject({ patient_name: 'حامد حسینی', patient_mobile: '09210671745', patient_national_code: '0012345675' });
+ });
+
+ it('picking an existing patient WITHOUT a national code keeps submit disabled until one is entered (boundary)', async () => {
+ get.mockImplementation((url: string) => {
+ if (url.startsWith('/api/v1/patients?'))
+ return Promise.resolve({ success: true, data: [{ uuid: 'rec2', user_name: 'حامد حسینی', user_mobile: '09210671745', user_national_code: null }] });
+ return Promise.resolve({ success: true, data: [] });
+ });
+
+ renderWithProviders(, { route: '/admin/appointments/new' });
+
+ fireEvent.change(screen.getByPlaceholderText('جستجوی نام، شماره تماس، شماره پرونده...'), { target: { value: 'حامد' } });
+ fireEvent.click(await screen.findByText(/حامد حسینی/));
+
+ const btn = screen.getByText('ثبت اطلاعات') as HTMLButtonElement;
+ expect(btn).toBeDisabled();
+
+ // کد ملیِ خالیِ رکورد را دستی وارد کن → فعال میشود
+ fireEvent.change(screen.getByPlaceholderText('کد ملی مراجعه کننده'), { target: { value: '0012345675' } });
+ await waitFor(() => expect(btn).not.toBeDisabled());
+ });
});
diff --git a/assets/admin/pages/AppointmentCreatePage.tsx b/assets/admin/pages/AppointmentCreatePage.tsx
index fd84cb45..91008fc5 100644
--- a/assets/admin/pages/AppointmentCreatePage.tsx
+++ b/assets/admin/pages/AppointmentCreatePage.tsx
@@ -194,15 +194,35 @@ export default function AppointmentCreatePage() {
{!picked && patients.length > 0 && (
{patients.map(p => (
-
)}
+
+ {/* کارت بیمارِ انتخابشده + کد ملی (برای ثبت نوبت الزامی است) */}
+ {picked && (
+
+
+
+ {picked.user_name} {picked.user_mobile}
+
+ { setPicked(null); setNationalCode(''); }}>تغییر
+
+
+
+ setNationalCode(e.target.value.replace(/\D/g, '').slice(0, 10))}
+ placeholder="کد ملی مراجعه کننده" dir="ltr" inputMode="numeric" maxLength={10} />
+
+
+ )}
>
)}