diff --git a/assets/admin/pages/MyPatientsPage.tsx b/assets/admin/pages/MyPatientsPage.tsx index cf837274..77a39caa 100644 --- a/assets/admin/pages/MyPatientsPage.tsx +++ b/assets/admin/pages/MyPatientsPage.tsx @@ -2,7 +2,9 @@ import { Bars3Icon, CheckCircleIcon, ChevronRightIcon, + ClockIcon, FolderOpenIcon, + FunnelIcon, MagnifyingGlassIcon, PencilIcon, PhoneIcon, @@ -1126,52 +1128,37 @@ function MyPatientsPageInner() { {detailTab === "services" && ( sessionsLoading ? (
در حال بارگذاری…
- ) : sessions.length === 0 ? ( -
- هنوز سرویسی برای این بیمار ثبت نشده است. -
) : ( -
- {sessions.map((s) => { - const svcNames = (s.services ?? []).map((x) => x.service_name).join("، ") || "ویزیت"; - const debt = s.patient_debt_rials ?? 0; - return ( -
-
-
{svcNames}
- {s.is_paid - ? تسویه شده - : تسویه نشده} -
-
انجام‌دهنده{s.doctor_name || "—"}
-
تاریخ{formatDate(s.created_at)}
-
هزینه{formatRial(s.final_price_rials)}
-
- مانده بدهی - 0 ? "var(--danger)" : "var(--success)" }}> - {debt > 0 ? formatRial(debt) : "ندارد"} - -
- {s.is_paid ? ( - s.invoice_uuid ? ( - - ) : ( - - ) - ) : ( - - )} -
- ); - })} -
+ <> +
+ + +
+ {sessions.length === 0 ? ( +
+ هنوز سرویسی برای این بیمار ثبت نشده است. +
+ ) : ( +
+ {sessions.map((s) => ( + settleSessionMut.mutate(uuid)} + onViewInvoice={(uuid) => setInvoiceUuid(uuid)} + /> + ))} +
+ )} + ) )} @@ -1719,6 +1706,110 @@ function PatientRow({ ); } +// کارت هر مراجعه در تب «سرویس‌ها»: اول مراجعه (سرویس‌ها در سرِ کارت)، سپس جزئیات و پرداخت. +function ServiceVisitCard({ + session, + settling, + onSettle, + onViewInvoice, +}: { + session: PatientSession; + settling: boolean; + onSettle: (uuid: string) => void; + onViewInvoice: (uuid: string) => void; +}) { + const services = session.services ?? []; + const title = services[0]?.service_name || "ویزیت"; + const subtitle = services.length + ? services.map((s) => s.service_name).join(" - ") + : "ویزیت"; + const assistant = services.find((s) => s.staff_name)?.staff_name || null; + const debt = session.patient_debt_rials ?? 0; + const paid = !!session.is_paid; + + const row = ( + label: string, + value: React.ReactNode, + danger = false, + ) => ( +
+ {label} + {value} +
+ ); + + const divider =
; + + return ( +
+ {/* سرِ کارت: سرویس‌ها + وضعیت + منو */} +
+
+
+ {title} + {subtitle} +
+
+ {paid + ? + : } +
+
+ +
+ + {divider} + +
+ {row("انجام دهنده:", session.doctor_name || "—")} + {row("دستیار:", assistant || "—")} + {row("تاریخ:", formatDate(session.created_at))} + {session.notes && ( +
+ توضیحات:{" "} + {session.notes} +
+ )} +
+ + {divider} + +
+ {row("هزینه:", formatRial(session.final_price_rials))} + {row("مانده بدهی:", debt > 0 ? formatRial(debt) : "ندارد", debt > 0)} +
+ +
+ {paid ? ( + session.invoice_uuid ? ( + + ) : ( + + ) + ) : ( + + )} +
+
+ ); +} + function SessionRow({ session, onEdit,