import { useState } from 'react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { ChevronDownIcon } from '@heroicons/react/24/outline'; import { toast } from 'sonner'; import { api } from '../../lib/api'; import { formatRial } from '../../lib/utils'; import type { SessionCardData } from '../SessionServiceCard'; import SearchableSelect from '../ui/SearchableSelect'; import PersianDateInput from '../ui/PersianDateInput'; import { Step2PaymentCard, FilesServiceBalanceWallet, TrashRed } from '../icons/FilesServiceIcons'; /** روش‌های پرداخت — همان چهار گزینه‌ی آکاردئون tauri Step2Payment. */ const METHODS: { key: string; label: string }[] = [ { key: 'wallet', label: 'پرداخت از طریق کیف پول' }, { key: 'pos', label: 'پرداخت از طریق کارت خوان' }, { key: 'cash', label: 'پرداخت نقدی' }, { key: 'card', label: 'کارت به کارت' }, ]; export const METHOD_LABELS: Record = { wallet: 'پرداخت از کیف پول', pos: 'پرداخت کارتخوان', cash: 'پرداخت نقدی', card: 'کارت به کارت', }; const todayISO = () => new Date().toISOString().slice(0, 10); /** YYYY-MM-DD → unix (ظهر همان روز تا با هر timezone یک روز بماند) */ const isoToUnix = (iso: string) => Math.floor(new Date(`${iso}T12:00:00`).getTime() / 1000); const fieldLabel: React.CSSProperties = { fontSize: 14, color: '#6B7280', marginBottom: 8, display: 'block' }; 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 { recordUuid: string; session: SessionCardData; walletBalance: number; onContinue: () => void; onCancel: () => void; } /** * گام «پرداخت» — پورت tauri Step2Payment با دیتای واقعی: * تخفیف تسویه (PATCH /session/{uuid}) + پرداخت چندتکه (POST /session/{uuid}/payments). * بین NewSessionPage (ویزارد سه‌گامه) و SessionPaymentPage (دوگامه) مشترک است. */ export default function PaymentStep({ recordUuid, session, walletBalance, onContinue, onCancel }: Props) { const qc = useQueryClient(); const sessionUuid = session.uuid; const [discountType, setDiscountType] = useState(''); const [discountValue, setDiscountValue] = useState(''); const [paymentDate, setPaymentDate] = useState(todayISO()); const [expanded, setExpanded] = useState(null); const [amount, setAmount] = useState(''); const invalidate = () => { qc.invalidateQueries({ queryKey: ['patient-sessions', recordUuid] }); qc.invalidateQueries({ queryKey: ['patient-wallet', recordUuid] }); }; const discountMut = useMutation({ mutationFn: (body: object) => api.patch(`/api/v1/session/${sessionUuid}`, body), onSuccess: () => { invalidate(); toast.success('تخفیف به‌روزرسانی شد'); }, onError: (e: Error) => toast.error(e.message), }); const payMut = useMutation({ mutationFn: (body: object) => api.post(`/api/v1/session/${sessionUuid}/payments`, body), onSuccess: () => { invalidate(); setAmount(''); toast.success('پرداخت ثبت شد'); }, onError: (e: Error) => toast.error(e.message), }); const applyDiscount = () => { if (!discountType || !discountValue) return; discountMut.mutate({ discount_type: discountType, discount_value: Number(discountValue) }); }; const removeDiscount = () => { setDiscountType(''); setDiscountValue(''); discountMut.mutate({ discount_type: null }); }; const submitPayment = (method: string) => { if (!amount) return; payMut.mutate({ method, amount_rials: Number(amount), paid_at: isoToUnix(paymentDate) }); }; const finalPrice = session.final_price_rials ?? 0; const discountRials = session.discount_rials ?? 0; const debt = session.patient_debt_rials ?? 0; const payments = session.payments ?? []; return ( <> {/* هزینه سرویس */}
هزینه سرویس: {formatRial(finalPrice)}
{/* تخفیف — port of tauri DiscountInput (نوع + مقدار + ثبت) */} تخفیف:
setDiscountType(v ? String(v) : '')} placeholder="مبلغ تخفیف" />
setDiscountValue(e.target.value)} style={{ flex: 1, minWidth: 0, height: 40, padding: '0 12px', fontSize: 13, border: 'none', outline: 'none', background: 'transparent', color: 'inherit' }} />
حذف تخفیف

مبلغ تخفیف:{' '} {formatRial(discountRials)}

{/* تاریخ پرداخت */} تاریخ پرداخت {/* روش‌های پرداخت */} انتخاب روش های پرداخت:
موجودی کیف پول:
{formatRial(walletBalance)}
{/* آکاردئون چهار روش — باز شدن هر روش: مبلغ + ثبت پرداخت */}
{METHODS.map((m) => { const open = expanded === m.key; return (
{open && (
setAmount(e.target.value)} style={{ flex: 1, height: 40 }} />
)}
); })}
{/* پرداخت شده‌ها — باکس خط‌چین tauri */}
پرداخت شده ها: {payments.length === 0 ? ( پرداختی ثبت نشده است ) : (
{payments.map((p) => (
{METHOD_LABELS[p.method] ?? p.method} مبلغ : {formatRial(p.amount_rials)}
))}
)}
مبلغ باقی‌مانده : {formatRial(debt)}
{/* ACTIONS */}
); }