import { useMemo, useState } from 'react' import { useStore } from '../store/AppStore' import { Badge, Button, Card, ConfirmDialog, DataTable, Field, Input, Modal, PageHeader, Select, type Column, } from '../components/ui' import type { Account, AccountType } from '../types' import { createId } from '../utils/id' import { formatMoney, toFa } from '../utils/format' const typeLabels: Record = { asset: 'دارایی', liability: 'بدهی', equity: 'سرمایه', income: 'درآمد', expense: 'هزینه', } const typeTones: Record = { asset: 'blue', liability: 'rose', equity: 'indigo', income: 'green', expense: 'amber', } const emptyDraft = (): Account => ({ id: '', code: '', name: '', type: 'asset', parentId: null, isGroup: false, openingBalance: 0, }) export function Accounts() { const { data, upsertAccount, removeAccount } = useStore() const [search, setSearch] = useState('') const [draft, setDraft] = useState(null) const [toDelete, setToDelete] = useState(null) const groups = useMemo( () => data.accounts.filter((account) => account.isGroup), [data.accounts], ) const filtered = useMemo(() => { const query = search.trim().toLowerCase() if (!query) return data.accounts return data.accounts.filter( (account) => account.name.toLowerCase().includes(query) || account.code.includes(query), ) }, [data.accounts, search]) const handleSave = () => { if (!draft) return if (!draft.code.trim() || !draft.name.trim()) return upsertAccount({ ...draft, id: draft.id || createId('acc-') }) setDraft(null) } const confirmDelete = () => { if (!toDelete) return removeAccount(toDelete.id) setToDelete(null) } const columns: Array> = [ { key: 'code', header: 'کد حساب', render: (a) => {toFa(a.code)}, }, { key: 'name', header: 'عنوان حساب', render: (a) => ( {a.isGroup && } {a.name} ), }, { key: 'type', header: 'ماهیت', render: (a) => {typeLabels[a.type]}, }, { key: 'kind', header: 'نوع', render: (a) => (a.isGroup ? گروه : معین), }, { key: 'opening', header: 'مانده افتتاحیه', align: 'end', render: (a) => (a.isGroup ? '—' : {formatMoney(a.openingBalance)}), }, { key: 'actions', header: '', align: 'end', render: (a) => (
), }, ] return (
setDraft(emptyDraft())}> حساب جدید } /> setSearch(e.target.value)} className="mb-4 max-w-sm" /> a.id} emptyTitle="حسابی یافت نشد" emptyDescription="برای شروع یک حساب جدید تعریف کنید." /> setDraft(null)} footer={ <> } > {draft && (
setDraft({ ...draft, code: e.target.value })} placeholder="مثال: 1001" /> setDraft({ ...draft, name: e.target.value })} placeholder="مثال: صندوق" /> {!draft.isGroup && ( setDraft({ ...draft, openingBalance: Number(e.target.value) || 0 })} /> )}
)}
setToDelete(null)} onConfirm={confirmDelete} />
) }