import { useState, useEffect } from 'react' import { Loader2, ShieldCheck, CreditCard, Banknote, RefreshCw, ArrowLeft } from 'lucide-react' import { Link } from 'react-router-dom' import { api, type BookingDeposit } from '../lib/api' import { useAuth } from '../contexts/AuthContext' import { cn, formatCurrency } from '../lib/utils' import { format } from 'date-fns' const STATUS_LABEL: Record = { hold_created: { label: 'Ожидает оплаты', cls: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400' }, hold_confirmed: { label: 'Холд подтверждён', cls: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400' }, paid_cash: { label: 'Наличными', cls: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400' }, captured: { label: 'Списано', cls: 'bg-slate-100 text-slate-600 dark:bg-slate-700 dark:text-slate-300' }, refunded: { label: 'Возвращён', cls: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400' }, cancelled: { label: 'Отменён', cls: 'bg-slate-100 text-slate-500 dark:bg-slate-700 dark:text-slate-400' }, } export function DepositHistoryPage() { const { user } = useAuth() const slug = user?.hotelSlug ?? '' const [deposits, setDeposits] = useState([]) const [loading, setLoading] = useState(true) const [filter, setFilter] = useState('all') const load = () => { if (!slug) return setLoading(true) api.deposits.history(slug) .then(setDeposits) .catch(() => setDeposits([])) .finally(() => setLoading(false)) } useEffect(() => { load() }, [slug]) const filtered = filter === 'all' ? deposits : deposits.filter(d => d.status === filter) return (
Назад

История депозитов

{/* Filter tabs */}
{[ { id: 'all', label: 'Все' }, { id: 'hold_created', label: 'Ожидают' }, { id: 'hold_confirmed', label: 'Холд' }, { id: 'paid_cash', label: 'Наличные' }, { id: 'captured', label: 'Списаны' }, { id: 'refunded', label: 'Возвращены' }, ].map(f => ( ))}
{loading ? (
) : filtered.length === 0 ? (

Нет депозитов

) : (
{filtered.map(dep => { const st = STATUS_LABEL[dep.status] ?? { label: dep.status, cls: 'bg-slate-100 text-slate-600' } return ( ) })}
Дата Номер Гость Метод Сумма Статус Удержано
{format(new Date(dep.createdAt), 'dd.MM.yyyy')} {dep.roomNumber ? `№${dep.roomNumber}` : '—'}
{dep.guestName ?? '—'}
{dep.guestEmail && (
{dep.guestEmail}
)}
{dep.paymentMethod === 'yookassa_hold' ? (
{dep.cardBrand ? `${dep.cardBrand} ` : ''} {dep.cardLast4 ? `•••• ${dep.cardLast4}` : 'ЮКасса'}
) : dep.paymentMethod === 'cash' ? (
Наличные
) : '—'}
{formatCurrency(dep.amount)} {st.label} {dep.retentionReason && (
{dep.retentionReason}
)}
{dep.capturedAmount != null && dep.capturedAmount > 0 ? formatCurrency(dep.capturedAmount) : dep.status === 'refunded' ? '0 ₽' : '—'}
)}
) }