// Wave 2a — Financeiro (5 telas): Fluxo, Lançamentos, Bancos, Conciliação, Contratos // Uses shared atoms from pages_dashboards.jsx: PageContainer, Tile, Spark, Donut, Bars. // ============================================================= // 1. Fluxo de Caixa // ============================================================= const PageFluxo = ({ onNavigate }) => { const [range, setRange] = React.useState('6m'); const labels = ['Nov', 'Dez', 'Jan', 'Fev', 'Mar', 'Abr']; const entradas = [68400, 74200, 71800, 82300, 85900, 91200]; const saidas = [41200, 44100, 46700, 48900, 51200, 52900]; return (
{['30d', '3m', '6m', '12m'].map(r => ( ))}
} >
Entradas × Saídas · últimos 6 meses
Entradas Saídas Saldo
Contas a receber · próximos 30d
{BRL(48290)}
16 faturas em aberto · 2 em atraso
{[ { name: 'Supermercado Vila Rica', date: '22/abr', val: 8400, overdue: false }, { name: 'Distribuidora RC', date: '25/abr', val: 3200, overdue: false }, { name: 'Hamburgueria 22', date: '18/abr', val: 1240, overdue: true }, { name: 'Farmácia Bem Estar', date: '28/abr', val: 960, overdue: false }, ].map((r, i) => (
{r.name}
{r.overdue ? '⚠ ' : ''}Vence {r.date}
{BRL(r.val)}
))}
Contas a pagar · próximos 30d
{BRL(31840)}
22 despesas · 4 agendadas para hoje
{[ { name: 'Folha CLT · Abril/26', date: '25/abr', val: 14820, cat: 'RH' }, { name: 'Aluguel sede', date: '10/mai', val: 4200, cat: 'Imóvel' }, { name: 'Fornecedor Farinha SP', date: '22/abr', val: 3680, cat: 'Insumos' }, { name: 'Energia CEMIG', date: '19/abr', val: 1240, cat: 'Utilidades' }, ].map((r, i) => (
{r.name}
{r.cat} · Vence {r.date}
-{BRL(r.val)}
))}
); }; const CashflowChart = ({ labels, entradas, saidas }) => { const saldo = entradas.map((e, i) => e - saidas[i]); const all = [...entradas, ...saidas]; const max = Math.max(...all) * 1.1, min = 0; const w = 1000, h = 280, pad = 40; const line = (data, color) => { const pts = data.map((v, i) => [pad + i * ((w - pad * 2) / (data.length - 1)), h - pad - ((v - min) / (max - min)) * (h - pad * 2)]); const path = pts.map((p, i) => (i === 0 ? `M${p[0]},${p[1]}` : `L${p[0]},${p[1]}`)).join(' '); return { path, pts }; }; const ent = line(entradas, '#22c55e'); const sai = line(saidas, '#ef4444'); const sal = line(saldo, 'var(--accent-1)'); return ( {[0,1,2,3,4].map(i => { const y = pad + i * ((h - pad*2) / 4); return ( {BRLShort(max - i * ((max-min)/4))} ); })} {ent.pts.map((p, i) => )} {sai.pts.map((p, i) => )} {sal.pts.map((p, i) => )} {labels.map((l, i) => ( {l} ))} ); }; // ============================================================= // 2. Lançamentos // ============================================================= const PageLancamentos = ({ onNavigate }) => { const [drawer, setDrawer] = React.useState(false); const [selected, setSelected] = React.useState(new Set()); const [filter, setFilter] = React.useState('todos'); const rows = [ { id: 101, data: '17/04', desc: 'Venda #2847 · Cliente PF', cat: 'Receita Venda', conta: 'Itaú Emp', tipo: 'entrada', valor: 1249.90, status: 'conciliado' }, { id: 102, data: '17/04', desc: 'Fornecedor Farinha SP · NF 5892', cat: 'Insumos', conta: 'BB PJ', tipo: 'saida', valor: -3680.00, status: 'pago' }, { id: 103, data: '16/04', desc: 'Mensalidade Automatiza', cat: 'Software', conta: 'Nubank PJ', tipo: 'saida', valor: -499.00, status: 'pago' }, { id: 104, data: '16/04', desc: 'Recebimento boleto #18291', cat: 'Receita Venda', conta: 'Itaú Emp', tipo: 'entrada', valor: 3200.00, status: 'conciliado' }, { id: 105, data: '15/04', desc: 'Supermercado Vila Rica · NF 1204', cat: 'Receita Venda', conta: 'Itaú Emp', tipo: 'entrada', valor: 8400.00, status: 'pendente' }, { id: 106, data: '15/04', desc: 'Energia Elétrica CEMIG · abril', cat: 'Utilidades', conta: 'BB PJ', tipo: 'saida', valor: -1240.55, status: 'pendente' }, { id: 107, data: '14/04', desc: 'Comissão Bruno Tavares · mar', cat: 'Folha CLT', conta: 'Itaú Emp', tipo: 'saida', valor: -2480.00, status: 'pago' }, { id: 108, data: '14/04', desc: 'Tarifa bancária Itaú', cat: 'Taxas', conta: 'Itaú Emp', tipo: 'saida', valor: -89.90, status: 'conciliado' }, { id: 109, data: '12/04', desc: 'Aporte sócio · Rafael', cat: 'Movimentação', conta: 'Itaú Emp', tipo: 'entrada', valor: 15000.00, status: 'conciliado' }, { id: 110, data: '10/04', desc: 'Aluguel sede · abril', cat: 'Imóvel', conta: 'BB PJ', tipo: 'saida', valor: -4200.00, status: 'pago' }, { id: 111, data: '08/04', desc: 'Assinatura NetShoes · devolução', cat: 'Receita Venda', conta: 'Itaú Emp', tipo: 'entrada', valor: 680.00, status: 'conciliado' }, { id: 112, data: '05/04', desc: 'Folha CLT · março/26', cat: 'Folha CLT', conta: 'Itaú Emp', tipo: 'saida', valor: -14820.00, status: 'pago' }, ]; const filtered = filter === 'todos' ? rows : rows.filter(r => r.tipo === filter); const toggle = (id) => { const s = new Set(selected); s.has(id) ? s.delete(id) : s.add(id); setSelected(s); }; const statusChip = (s) => ({ conciliado: { bg: 'rgba(34,197,94,.14)', color: '#86efac', label: 'Conciliado' }, pago: { bg: 'rgba(59,130,246,.14)', color: '#93c5fd', label: 'Pago' }, pendente: { bg: 'rgba(245,158,11,.14)', color: '#fcd34d', label: 'Pendente' }, })[s]; return ( } >
{/* Filter chips + search */}
{[ { id: 'todos', l: 'Todos', c: rows.length }, { id: 'entrada', l: 'Entradas', c: rows.filter(r => r.tipo === 'entrada').length }, { id: 'saida', l: 'Saídas', c: rows.filter(r => r.tipo === 'saida').length }, ].map(c => ( ))}
{/* Bulk actions bar */} {selected.size > 0 && (
{selected.size} selecionado{selected.size > 1 ? 's' : ''}
)}
{filtered.map(r => { const st = statusChip(r.status); return ( ); })}
setSelected(e.target.checked ? new Set(filtered.map(r => r.id)) : new Set())}/> Data Descrição Categoria Conta Valor Status
toggle(r.id)}/> {r.data}
{r.desc}
{r.cat} {r.conta} 0 ? '#86efac' : '#fca5a5', fontWeight: 600, fontVariantNumeric: 'tabular-nums' }}> {r.valor > 0 ? '+' : ''}{BRL(Math.abs(r.valor))} {st.label}
{filtered.length} de 247 lançamentos Página 1 de 21
{drawer && setDrawer(false)}/>}
); }; const LancDrawer = ({ onClose }) => { const [tipo, setTipo] = React.useState('saida'); return ( <>

Novo lançamento

{/* Tipo toggle */}
{[ { id: 'entrada', l: 'Entrada', icon: 'arrowDown', color: '#22c55e' }, { id: 'saida', l: 'Saída', icon: 'arrowUp', color: '#ef4444' }, ].map(t => ( ))}
IA sugere: "Insumos"
Com base em padrões anteriores de "Farinha SP" (92% de confiança).
); }; const drawerLabel = { fontSize: 12, fontWeight: 500, color: 'var(--text-2)', display: 'block', marginBottom: 6 }; const DField = ({ label, placeholder, prefix, type = 'text', defaultValue, select, options = [], textarea }) => (
{select ? ( ) : textarea ? (