+ {/* پذیرش کننده — tauri UserTick + کاربر لاگینشده */}
+
+
+ پذیرش کننده: {userName || '—'}
+
+
+ {/* تاریخ و ساعت پذیرش */}
+
+
+
+
ساعت پذیرش
+
+
+ setTime(e.target.value)}
+ style={{ border: 'none', outline: 'none', background: 'transparent', fontSize: '0.875rem', color: 'inherit', flex: 1 }}
+ />
+
+
+
+
+ {/* انتخاب بخش */}
+
+ انتخاب بخش
+ { setSectionUuid(v ? String(v) : ''); setItemUuid(''); }} placeholder="انتخاب کنید..." />
+
+
+ {/* انتخاب سرویس + قیمت + افزودن */}
+
+
+ انتخاب سرویس
+ setItemUuid(v ? String(v) : '')} placeholder="انتخاب کنید..." isDisabled={!sectionUuid} />
+
+
+
+
+ قیمت: {currentItem ? formatRial(currentItem.price_rials) : '—'}
+
+
+
+
+
+ {/* خدمات انتخاب شده */}
+ {selectedServices.length > 0 && (
+
+
خدمات انتخاب شده
+ {selectedServices.map(item => (
+
+ {item.name}
+ {counter(item.qty, (q) => setServiceQty(item.uuid, q))}
+ قیمت: {formatRial(item.price * item.qty)}
+
+ ))}
+
مجموع قیمت خدمات: {formatRial(servicesTotal)}
+
+ )}
+
+ {/* پرسنل */}
+
+ پرسنل
+ setStaffUuid(v ? String(v) : '')} placeholder="انتخاب کنید..." isClearable />
+
+
+ {/* انتخاب کالای مصرفی */}
+
+
انتخاب کالای مصرفی
+
+
+ setConsumableUuid(v ? String(v) : '')} placeholder="انتخاب کنید..." />
+
+
+
+
+ قیمت: {currentConsumable ? formatRial(currentConsumable.price) : '—'}
+
+
+
+
+
+
+ {/* کالاهای انتخاب شده — باکس خطچین tauri */}
+
+
کالاهای انتخاب شده
+ {selectedConsumables.length === 0 ? (
+
کالایی انتخاب نشده است
+ ) : selectedConsumables.map(item => (
+
+ {item.name}
+ {counter(item.qty, (q) => setConsumableQty(item.uuid, q))}
+ قیمت: {formatRial(item.price * item.qty)}
+
+ ))}
+
مجموع قیمت کالاها: {formatRial(consumablesTotal)}
+
+
+ {/* انتخاب پکیج */}
+
+ انتخاب پکیج
+ setPackageUuid(v ? String(v) : '')} placeholder="انتخاب کنید..." isClearable />
+
+
+ {/* قیمت ویزیت */}
+
+ قیمت ویزیت (تومان)
+ setVisitPrice(e.target.value)} />
+
+
+ {/* بیمه — منطق موجود NewSessionPage؛ فقط وقتی سرویس تحت پوشش یا بیمار بیمه دارد */}
+ {showInsurance && (
+
+
بیمه
+
+
+ بیمه پایه
+ applyBase(v ? String(v) : '')} placeholder="بدون بیمه پایه" isClearable />
+
+
+ بیمه تکمیلی
+ applySupp(v ? String(v) : '')} placeholder="بدون بیمه تکمیلی" isClearable />
+
+
+
+
+ )}
+
+ {/* یادداشت */}
+
+ یادداشت
+
+
+ {/* خلاصه مبلغ */}
+
+
ویزیت{formatRial(afterSupp)}
+ {servicesTotal > 0 &&
سهم بیمار خدمات{formatRial(servicesPatient)}
}
+ {consumablesTotal > 0 &&
کالاهای مصرفی{formatRial(consumablesTotal)}
}
+
+ مبلغ نهایی (سهم بیمار)
+ {formatRial(finalPrice)}
+
+
+
+ {/* ACTIONS — tauri: انصراف / ایجاد سرویس */}
+
+
+
+
+
+ );
+}
diff --git a/assets/admin/components/session/DetailsStep.tsx b/assets/admin/components/session/DetailsStep.tsx
new file mode 100644
index 00000000..eeb0f11e
--- /dev/null
+++ b/assets/admin/components/session/DetailsStep.tsx
@@ -0,0 +1,78 @@
+import { formatRial } from '../../lib/utils';
+import type { SessionCardData } from '../SessionServiceCard';
+import { METHOD_LABELS } from './PaymentStep';
+
+const primaryBtn: React.CSSProperties = { background: '#5559CE', color: '#fff', border: 'none', borderRadius: 4, height: 46, fontSize: 14, fontWeight: 500, cursor: 'pointer' };
+const ghostBtn: React.CSSProperties = { background: 'transparent', color: '#5559CE', border: '1px solid #5559CE', borderRadius: 4, height: 46, fontSize: 14, fontWeight: 500, cursor: 'pointer' };
+
+interface Props {
+ session: SessionCardData;
+ onBack: () => void;
+ onFinish: () => void;
+}
+
+/**
+ * گام «جزییات» — پورت tauri Step3Final با دیتای واقعی:
+ * خلاصهی سرویس/هزینه/تخفیف + لیست پرداختشدهها + مانده. مشترک بین
+ * NewSessionPage (ویزارد سهگامه) و SessionPaymentPage (دوگامه).
+ */
+export default function DetailsStep({ session, onBack, onFinish }: Props) {
+ const finalPrice = session.final_price_rials ?? 0;
+ const discountRials = session.discount_rials ?? 0;
+ const debt = session.patient_debt_rials ?? 0;
+ const payments = session.payments ?? [];
+ const serviceNames = (session.services ?? []).map((s) => s.service_name || s.name).filter(Boolean) as string[];
+ if ((session.visit_price_rials ?? 0) > 0) serviceNames.unshift('ویزیت');
+
+ return (
+ <>
+ {/* گام جزییات — پورت tauri Step3Final با دیتای واقعی */}
+
+
+
+ {serviceNames.length ? serviceNames.join(' - ') : 'ویزیت'}
+
+
+ {session.doctor_name || '—'}
+
+
+
+
+ هزینه سرویس:
+ {formatRial(finalPrice)}
+
+
+
+ تخفیف:
+ {formatRial(discountRials)}
+
+
+
+
پرداخت شده ها:
+ {payments.length === 0 ? (
+
پرداختی ثبت نشده است
+ ) : payments.map((p) => (
+
+
+
+ {METHOD_LABELS[p.method] ?? p.method}
+
+ مبلغ: {formatRial(p.amount_rials)}
+
+ ))}
+
+
+
+ مبلغ باقی مانده:
+ {formatRial(debt)}
+
+
+
+
+