import React from 'react'; import { formatDate, formatRial } from '../lib/utils'; import { useAppointmentInvoice } from '../hooks/useAppointmentInvoice'; interface Props { appointmentUuid: string; } /** * فاکتور تفکیک‌شدهٔ نوبت. * * اعدادش snapshot لحظهٔ ثبت‌اند، نه محاسبهٔ امروز: تغییر تعرفه هرگز فاکتور صادرشده را * عوض نمی‌کند (قانون پنجم مستند). همین جمله زیر کارت هم نوشته می‌شود، چون کاربری که * قیمت را دیروز عوض کرده و امروز عدد قدیمی می‌بیند وگرنه فکر می‌کند سیستم خراب است. */ export default function AppointmentInvoiceCard({ appointmentUuid }: Props) { const { invoice, loading, missing } = useAppointmentInvoice(appointmentUuid); if (loading) { return (
در حال بارگذاری فاکتور…
); } // نبودِ فاکتور خطا نیست: نوبتی که هنوز ثبت نهایی نشده، فاکتوری هم ندارد. if (missing || !invoice) { return (
برای این نوبت فاکتوری ثبت نشده است.
); } const rows: { label: string; value: number; muted?: boolean }[] = [ { label: 'قیمت پایه', value: invoice.base_rials }, { label: 'آیتم‌های اضافه', value: invoice.items_rials }, { label: 'تخفیف', value: -invoice.discount_rials }, { label: 'سهم بیمهٔ پایه', value: -invoice.insurance_base_rials }, { label: 'سهم بیمهٔ تکمیلی', value: -invoice.insurance_supplementary_rials }, { label: 'مالیات', value: invoice.tax_rials }, ]; return (

فاکتور

{invoice.created_at !== undefined && ( ثبت‌شده در {formatDate(invoice.created_at)} )}
{rows .filter((row) => row.value !== 0) .map((row) => (
{row.label} {formatRial(Math.abs(row.value))} {row.value < 0 ? ' −' : ''}
))} {/* فاکتور قدیمی ممکن است ریز تخفیف نداشته باشد؛ نبودنش نباید کل صفحه را ببندد. */} {(invoice.breakdown?.discounts ?? []).map((line, index) => (
{line.label} {formatRial(Math.abs(line.rials))}
))}
مبلغ نهایی {formatRial(invoice.final_rials)}
{invoice.deposit_rials > 0 && (
بیعانه {formatRial(invoice.deposit_rials)}
)} قیمت‌ها بر اساس تاریخ همین نوبت محاسبه و ثبت شده‌اند؛ تغییر بعدی تعرفه این فاکتور را عوض نمی‌کند.
); }