diff --git a/src/app/dashboard/finance/page.tsx b/src/app/dashboard/finance/page.tsx new file mode 100644 index 0000000..0a9e71c --- /dev/null +++ b/src/app/dashboard/finance/page.tsx @@ -0,0 +1,195 @@ +'use client'; + +import Link from 'next/link'; +import { useQuery } from '@tanstack/react-query'; +import { apiFetch, type Transaction } from '../../../lib/api'; +import { useSession } from '../../../components/session-provider'; + +function fmt(minorUnits: string, currency: string): string { + return new Intl.NumberFormat('ro-RO', { style: 'currency', currency }).format( + Number(minorUnits) / 100, + ); +} + +export default function FinancePage() { + const { activeTenant } = useSession(); + const tenantId = activeTenant?.tenantId ?? ''; + + const { data: transactions = [], isLoading } = useQuery({ + queryKey: ['transactions-finance', tenantId], + queryFn: () => apiFetch('/v1/transactions', { tenantId }), + enabled: Boolean(tenantId), + }); + + const byCurrency: Record = {}; + for (const t of transactions) + byCurrency[t.currency] = (byCurrency[t.currency] ?? 0) + Number(t.amountMinorUnits); + + const byEvidence = { missing: 0, partial: 0, complete: 0 }; + for (const t of transactions) + byEvidence[t.evidenceStatus as keyof typeof byEvidence] = + (byEvidence[t.evidenceStatus as keyof typeof byEvidence] ?? 0) + 1; + + const byType: Record = {}; + for (const t of transactions) byType[t.type] = (byType[t.type] ?? 0) + 1; + const topTypes = Object.entries(byType) + .sort((a, b) => b[1] - a[1]) + .slice(0, 8); + + const evidenceBar: Record = { + complete: 'bg-signal-ok', + partial: 'bg-signal-warn', + missing: 'bg-signal-danger', + }; + const evidenceBadge: Record = { + complete: 'bg-signal-ok text-white', + partial: 'bg-signal-warn text-white', + missing: 'bg-signal-danger text-white', + }; + + return ( +
+
+
+

Finanțe

+

+ Sumar tranzacții și status evidențe contabile. +

+
+ + Gestionează tranzacțiile → + +
+ + {isLoading ? ( +

Se încarcă…

+ ) : transactions.length === 0 ? ( +
+

Nicio tranzacție înregistrată

+

Adaugă tranzacții din modulul Tranzacții.

+ + Deschide Tranzacții + +
+ ) : ( + <> +
+
+

+ Total tranzacții +

+

+ {transactions.length} +

+
+ {Object.entries(byCurrency).map(([cur, total]) => ( +
+

+ Total {cur} +

+

+ {fmt(String(total), cur)} +

+
+ ))} +
+ +
+
+

+ Status dovezi contabile +

+
+ {(['complete', 'partial', 'missing'] as const).map((status) => { + const count = byEvidence[status]; + const pct = + transactions.length > 0 ? (count / transactions.length) * 100 : 0; + return ( +
+
+ {status} + {count} +
+
+
+
+
+ ); + })} +
+
+ +
+

+ Tipuri tranzacție +

+ {topTypes.length === 0 ? ( +

+ ) : ( +
    + {topTypes.map(([type, count]) => ( +
  • + {type} + + {count} + +
  • + ))} +
+ )} +
+
+ +
+

+ Tranzacții recente +

+
+ + + + + + + + + + + {transactions.slice(0, 10).map((t) => ( + + + + + + + ))} + +
DataTip + Sumă + Dovezi
+ {new Date(t.transactionDate).toLocaleDateString('ro-RO')} + {t.type} + {fmt(t.amountMinorUnits, t.currency)} + + + {t.evidenceStatus} + +
+
+
+ + )} +
+ ); +}