import { useState, useEffect, useCallback } from 'react'; import { api } from '../../api.js'; import { memberLabel } from '../../utils/format.js'; import ConfirmModal from '../../components/ConfirmModal.jsx'; import Modal from '../../components/Modal.jsx'; const EXONERATION_LABELS = { aucune: 'Aucune', pfnl_5ans: 'PFnl 5 ans', }; const TYPE_COMPTE_LABELS = { compte_courant: 'Compte courant', pea_pme: 'PEA-PME', }; const EMPTY_COMPTE = { nom: '', type: 'compte_courant', investisseur_id: null, banque: '', exoneration_fiscale: 'aucune' }; function compteInvestisseur(c) { if (!c.investisseur_id) return null; return { id: c.investisseur_id, nom: c.investisseur_nom, prenom: c.investisseur_prenom, type: c.investisseur_type, type_fiscal: c.investisseur_type_fiscal }; } function CompteFormFields({ state, setter, investisseurs }) { return ( <>
setter({ ...state, nom: e.target.value })} placeholder="ex. Compte courant BNP" />
setter({ ...state, banque: e.target.value })} placeholder="ex. BNP Paribas" />
); } export default function ComptesSection() { const [comptes, setComptes] = useState([]); const [investisseurs, setInvestisseurs] = useState([]); const reload = useCallback(async () => { const [cpts, invs] = await Promise.all([ api.get('/comptes'), api.get('/investisseurs'), ]); setComptes(cpts); setInvestisseurs(invs); }, []); useEffect(() => { reload(); }, [reload]); const [showNew, setShowNew] = useState(false); const [newCompte, setNewCompte] = useState(EMPTY_COMPTE); const [editCompte, setEditCompte] = useState(null); const [err, setErr] = useState(null); const [confirmDel, setConfirmDel] = useState(null); const openNew = () => { setNewCompte(EMPTY_COMPTE); setErr(null); setShowNew(true); }; const addCompte = async (e) => { e.preventDefault(); setErr(null); try { await api.post('/comptes', { nom: newCompte.nom, type: newCompte.type, banque: newCompte.banque || null, investisseur_id: newCompte.investisseur_id ? Number(newCompte.investisseur_id) : null, exoneration_fiscale: newCompte.exoneration_fiscale ?? 'aucune', }); setShowNew(false); setNewCompte(EMPTY_COMPTE); reload(); } catch (ex) { setErr(ex.message); } }; const saveEdit = async (e) => { e.preventDefault(); setErr(null); try { await api.put(`/comptes/${editCompte.id}`, { nom: editCompte.nom, type: editCompte.type, banque: editCompte.banque || null, investisseur_id: editCompte.investisseur_id ? Number(editCompte.investisseur_id) : null, exoneration_fiscale: editCompte.exoneration_fiscale ?? 'aucune', }); setEditCompte(null); reload(); } catch (ex) { setErr(ex.message); } }; const openEdit = (c) => { setErr(null); setEditCompte({ id: c.id, nom: c.nom, type: c.type, banque: c.banque || '', investisseur_id: c.investisseur_id ?? null, exoneration_fiscale: c.exoneration_fiscale ?? 'aucune' }); }; const del = (c) => { setConfirmDel({ message: `Supprimer le compte "${c.nom}" ?`, onConfirm: async () => { try { await api.del(`/comptes/${c.id}`); reload(); } catch (ex) { setErr(ex.message); } finally { setConfirmDel(null); } }, }); }; const multiDetenteur = investisseurs.length > 1; return ( <>

Mes comptes courants

Comptes bancaires et enveloppes financières associés à vos investisseurs.

{err &&
{err}
} {multiDetenteur && } {comptes.length === 0 && ( )} {comptes.map(c => { const inv = compteInvestisseur(c); return ( {multiDetenteur && } ); })}
Nom TypeDétenteurBanque Exonération
Aucun compte défini.
{c.nom} {TYPE_COMPTE_LABELS[c.type] ?? c.type}{inv ? memberLabel(inv) : }{c.banque || } {c.exoneration_fiscale && c.exoneration_fiscale !== 'aucune' ? ( Oui ) : ( Non )}
{/* ── Modal création ── */} { setShowNew(false); setNewCompte(EMPTY_COMPTE); setErr(null); }} footer={
} >
{err &&
{err}
}
{/* ── Modal édition ── */} { setEditCompte(null); setErr(null); }} footer={
} >
{err &&
{err}
}
{/* ── ConfirmModal suppression ── */} setConfirmDel(null)} /> ); }