// Bellia — Module Automatisation (variante A : grille uniforme de cartes d'agents) const AGENTS = [ { id: 'tva', name: 'TVA', icon: 'percent', desc: 'Collecte TVA mensuelle et prépare l\'écriture comptable', freq: 'Mensuel · 1er du mois', last: 'il y a 12 min', next: '1 juin 06:00', status: 'actif', actions: 12, cost: 1.80 }, { id: 'compta', name: 'Comptabilité', icon: 'euro', desc: 'Pré-saisit les écritures et synchronise avec le cabinet', freq: 'Quotidien · 06:00', last: 'ce matin', next: 'demain 06:00', status: 'actif', actions: 18, cost: 2.40 }, { id: 'emp', name: 'Employés', icon: 'users', desc: 'Tient à jour les contrats, heures et absences de l\'équipe', freq: 'Sur déclencheur', last: 'hier', next: 'auto', status: 'actif', actions: 6, cost: 0.65 }, { id: 'plan', name: 'Planning', icon: 'cal', desc: 'Génère le planning hebdo et alerte si trous de couverture', freq: 'Hebdo · dim. 18:00', last: 'dim. 18:00', next: 'dim. 18:00', status: 'actif', actions: 4, cost: 0.95 }, { id: 'tdb', name: 'Tableau de bord', icon: 'dashboard', desc: 'Met à jour les KPI et alertes du dashboard principal', freq: 'Temps réel', last: 'à l\'instant', next: 'continu', status: 'actif', actions: 0, cost: 0.10 }, { id: 'rap', name: 'Rapports', icon: 'file', desc: 'Génère et envoie le rapport hebdo aux destinataires', freq: 'Hebdo · lun. 08:00', last: 'lun. 08:00', next: 'lun. 08:00', status: 'actif', actions: 1, cost: 0.45 }, { id: 'ana', name: 'Analyse', icon: 'chart', desc: 'Détecte les dérives et propose des leviers d\'optimisation', freq: 'Hebdo · ven. 09:00', last: 'ven. 09:00', next: 'ven. 09:00', status: 'actif', actions: 3, cost: 0.80 }, { id: 'use', name: 'Utilisations', icon: 'activity', desc: 'Suit l\'usage de Bellia par votre équipe et coache les retards', freq: 'Quotidien · 22:00', last: 'hier 22:00', next: 'ce soir 22:00', status: 'actif', actions: 2, cost: 0.30 }, { id: 'ven', name: 'Ventes', icon: 'bag', desc: 'Consolide les ventes des caisses et détecte les anomalies', freq: 'Toutes les 4 h', last: 'il y a 2 h', next: 'dans 2 h', status: 'actif', actions: 1, cost: 0.55 }, { id: 'dep', name: 'Dépenses', icon: 'receipt', desc: 'Traite les factures fournisseurs et les pré-impute', freq: 'Sur réception', last: 'il y a 5 h', next: 'auto', status: 'en cours', actions: 4, cost: 1.20 }, { id: 'fou', name: 'Fournisseurs', icon: 'truck', desc: 'Compare prix d\'achat et alerte sur les hausses inhabituelles', freq: 'Hebdo · mar. 10:00', last: '—', next: 'mar. 10:00', status: 'inactif', actions: 0, cost: 0 }, { id: 'pay', name: 'Paiements', icon: 'card', desc: 'Programme les paiements fournisseurs selon les échéances', freq: 'Quotidien · 11:00', last: '—', next: '—', status: 'inactif', actions: 0, cost: 0 }, ]; const STATUS_META = { actif: { c: C.ok, bg: C.okSft, label: 'Actif' }, 'en cours': { c: C.warn, bg: C.warnSft, label: 'En cours' }, inactif: { c: C.mute, bg: C.cardSoft, label: 'Inactif' }, }; const AutomationScreen = ({ onNav }) => { const [open, setOpen] = React.useState(null); // agent ID const active = AGENTS.filter(a => a.status === 'actif').length; const totalActions = AGENTS.reduce((a, b) => a + b.actions, 0); const totalCost = AGENTS.reduce((a, b) => a + b.cost, 0); return (
onNav('chat')} icon={}>Parler à un agent }>Nouveau workflow } /> {/* ====== STATUS BANNER ====== */}
}>Lancer un test
{/* ====== TOOLBAR ====== */}
{[ { id: 'all', l: 'Tous', n: 12 }, { id: 'on', l: 'Actifs', n: 9 }, { id: 'busy',l: 'En cours', n: 1 }, { id: 'off', l: 'Inactifs', n: 2 }, ].map((f, i) => ( ))}
Trier par
{/* ====== GRID ====== */}
{AGENTS.map(a => ( setOpen(a.id)} /> ))}
{/* ====== SIDE PANEL ====== */} {open && a.id === open)} onClose={() => setOpen(null)} />} ); }; const AgentCard = ({ agent, onOpen }) => { const s = STATUS_META[agent.status]; const [on, setOn] = React.useState(agent.status !== 'inactif'); return (
{ e.currentTarget.style.boxShadow = '0 12px 28px -22px rgba(36,27,18,0.28)'; e.currentTarget.style.borderColor = C.orangeSft; }} onMouseLeave={e => { e.currentTarget.style.boxShadow = 'none'; e.currentTarget.style.borderColor = C.line; }} >
{ setOn(v); }} stop />
{agent.name}
{agent.desc}
}>{s.label}
); }; const Row = ({ k, v, accent }) => (
{k} {v}
); const Switch = ({ on, onChange, stop }) => ( ); const BannerStat = ({ label, value, icon, delta, deltaPlain }) => (
{label.toUpperCase()}
{value}
{delta && {delta}}
); // ====== SIDE PANEL ====== const AgentPanel = ({ agent, onClose }) => { const s = STATUS_META[agent.status]; return ( <>
); }; const SectionTitle = ({ children, right, style }) => (

{children}

{right}
); const MiniStat = ({ label, value }) => (
{label.toUpperCase()}
{value}
); const Param = ({ label, value }) => (
{label} {value}
); window.AutomationScreen = AutomationScreen;