// 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 (
);
};
// =============================================================
// 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.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 ? (
) : (
{prefix && {prefix}}
)}
);
const drawerInput = {
width: '100%', padding: '10px 12px', borderRadius: 8, fontSize: 13,
background: 'var(--bg-2)', border: '1px solid var(--line-2)', color: 'var(--text-0)',
};
const selectStyle = {
padding: '7px 12px', borderRadius: 8, fontSize: 12.5,
background: 'var(--bg-2)', border: '1px solid var(--line-2)', color: 'var(--text-1)',
};
// =============================================================
// 3. Contas Bancárias
// =============================================================
const PageBancos = ({ onNavigate }) => {
const bancos = [
{ id: 1, nome: 'Itaú Empresarial', agencia: '0412', conta: '18293-4', saldo: 187420.40, sync: 'há 12 min', status: 'sync', color: '#ec7000', bg: '#ec7000', short: 'ITÚ' },
{ id: 2, nome: 'Banco do Brasil PJ', agencia: '1847', conta: '29-018428-3', saldo: 62840.00, sync: 'há 1h', status: 'sync', color: '#fcc200', bg: '#003469', short: 'BB' },
{ id: 3, nome: 'Nubank PJ', agencia: '0001', conta: '82947-1', saldo: 24180.00, sync: 'há 34 min', status: 'sync', color: '#8a05be', bg: '#8a05be', short: 'NU' },
{ id: 4, nome: 'Caixa Tesouraria', agencia: '3215', conta: '0093-4', saldo: 8420.00, sync: 'há 3 dias', status: 'stale', color: '#0070af', bg: '#0070af', short: 'CEF' },
{ id: 5, nome: 'Inter PJ', agencia: '0001', conta: '10293-8', saldo: 1860.00, sync: 'erro', status: 'error', color: '#ff7a00', bg: '#ff7a00', short: 'INT' },
];
const total = bancos.reduce((s, b) => s + b.saldo, 0);
return (
>}
>
{bancos.map(b => (
{b.short}
{b.nome}
Ag {b.agencia} · CC {b.conta}
Saldo atual
{BRL(b.saldo)}
b.saldo * (0.9 + Math.sin(i) * 0.05 + i * 0.006))} stroke="var(--accent-text-2)" fill="var(--accent-soft-14)" height={36}/>
{b.status === 'sync' && <>Sincronizado {b.sync}>}
{b.status === 'stale' && <>Desatualizado · {b.sync}>}
{b.status === 'error' && <>Erro na conexão>}
{b.status === 'error' ? (
) : (
)}
))}
{/* Connect new card */}
{/* Open finance partners */}
Bancos suportados · certificados BACEN
Open Finance v3.0
{['Itaú', 'Bradesco', 'Santander', 'Banco do Brasil', 'Caixa', 'Nubank', 'Inter', 'Sicoob', 'Sicredi', 'BTG Pactual', 'C6 Bank', 'Banrisul', 'XP', 'Original'].map(b => (
{b}
))}
+ 35 outros
);
};
// =============================================================
// 4. Conciliação OFX (split view)
// =============================================================
const PageConciliacao = ({ onNavigate }) => {
const [matches, setMatches] = React.useState({ m1: true, m2: true, m3: false, m4: true });
const toggle = (k) => setMatches({ ...matches, [k]: !matches[k] });
const confidence = (score) => {
if (score >= 95) return { c: '#22c55e', l: 'Alta' };
if (score >= 80) return { c: '#f59e0b', l: 'Média' };
return { c: '#ef4444', l: 'Baixa' };
};
const suggestions = [
{ id: 'm1', score: 98, ofx: { date: '17/04', desc: 'TED RECEBIDA SUPERMERCADO VILA RICA ME', val: 8400 }, sys: { date: '15/04', desc: 'Supermercado Vila Rica · NF 1204', val: 8400 }},
{ id: 'm2', score: 95, ofx: { date: '17/04', desc: 'PAG FORNECEDOR FARINHA SP NF5892', val: -3680 }, sys: { date: '17/04', desc: 'Fornecedor Farinha SP · NF 5892', val: -3680 }},
{ id: 'm3', score: 82, ofx: { date: '16/04', desc: 'PIX CPF ***.458.291-**', val: 1249.90 }, sys: { date: '17/04', desc: 'Venda #2847 · Cliente PF', val: 1249.90 }},
{ id: 'm4', score: 99, ofx: { date: '16/04', desc: 'DEB AUTOMATIZA TECH MENSALIDADE', val: -499 }, sys: { date: '16/04', desc: 'Mensalidade Automatiza', val: -499 }},
];
return (
>}
>
{/* Suggestions matching IA */}
Correspondências sugeridas pela IA
Matches automáticos por valor, data e texto · 4 de 38 exibidos
{suggestions.map((s, i) => {
const conf = confidence(s.score);
const checked = matches[s.id];
return (
{/* OFX side */}
Extrato OFX · {s.ofx.date}
{s.ofx.desc}
0 ? '#86efac' : '#fca5a5', fontVariantNumeric: 'tabular-nums' }}>
{s.ofx.val > 0 ? '+' : ''}{BRL(Math.abs(s.ofx.val))}
{/* Match indicator */}
{/* System side */}
Sistema · {s.sys.date}
{s.sys.desc}
0 ? '#86efac' : '#fca5a5', fontVariantNumeric: 'tabular-nums' }}>
{s.sys.val > 0 ? '+' : ''}{BRL(Math.abs(s.sys.val))}
{/* Actions */}
);
})}
{/* Unmatched */}
Extrato sem correspondência
3
{[
{ date: '15/04', desc: 'TED ENVIADA PJ BCO FITNESS LTDA', val: -1800 },
{ date: '13/04', desc: 'TARIFA PACOTE SERVIÇOS', val: -49.90 },
{ date: '12/04', desc: 'RENDIMENTO CDB 103%', val: 182.40 },
].map((r, i) => (
0 ? '#86efac' : '#fca5a5', fontVariantNumeric: 'tabular-nums' }}>
{r.val > 0 ? '+' : ''}{BRL(Math.abs(r.val))}
))}
Lançamentos sem extrato
2
{[
{ date: '14/04', desc: 'Comissão Bruno Tavares · mar', val: -2480 },
{ date: '12/04', desc: 'Aporte sócio · Rafael', val: 15000 },
].map((r, i) => (
{r.desc}
Sistema · {r.date}
0 ? '#86efac' : '#fca5a5', fontVariantNumeric: 'tabular-nums' }}>
{r.val > 0 ? '+' : ''}{BRL(Math.abs(r.val))}
))}
);
};
// =============================================================
// 5. Contratos
// =============================================================
const PageContratos = ({ onNavigate }) => {
const [selected, setSelected] = React.useState(1);
const contracts = [
{ id: 1, num: 'CT-2026-014', parte: 'Supermercado Vila Rica ME', cnpj: '18.293.472/0001-82', tipo: 'Fornecimento recorrente', valor: 8400, freq: 'mensal', vigencia: '01/04/26 → 31/03/27', dias: 348, status: 'ativo', assinado: true },
{ id: 2, num: 'CT-2026-013', parte: 'Distribuidora RC Ltda', cnpj: '82.471.029/0001-34', tipo: 'Fornecimento recorrente', valor: 3200, freq: 'mensal', vigencia: '15/03/26 → 14/03/27', dias: 331, status: 'ativo', assinado: true },
{ id: 3, num: 'CT-2026-012', parte: 'Construtora AV SA', cnpj: '20.194.028/0001-91', tipo: 'Prestação de serviços', valor: 24000, freq: 'único', vigencia: '01/02/26 → 31/07/26', dias: 105, status: 'expirando', assinado: true },
{ id: 4, num: 'CT-2026-011', parte: 'Mecânica Rápida Eireli', cnpj: '40.201.837/0001-20', tipo: 'Locação equipamento', valor: 1200, freq: 'mensal', vigencia: '10/01/26 → 09/01/27', dias: 267, status: 'ativo', assinado: true },
{ id: 5, num: 'CT-2026-010', parte: 'Hamburgueria 22', cnpj: '31.804.728/0001-01', tipo: 'Fornecimento recorrente', valor: 1240, freq: 'mensal', vigencia: '01/01/26 → 31/12/26', dias: 258, status: 'ativo', assinado: false },
];
const sel = contracts.find(c => c.id === selected);
const statusStyle = (s) => ({
ativo: { bg: 'rgba(34,197,94,.14)', c: '#86efac', l: 'Ativo' },
expirando: { bg: 'rgba(245,158,11,.14)', c: '#fcd34d', l: 'Expira em 105d' },
encerrado: { bg: 'rgba(239,68,68,.14)', c: '#fca5a5', l: 'Encerrado' },
})[s];
return (
>}
>
{/* List */}
| Contrato |
Parte |
Valor |
Vigência |
Status |
{contracts.map(c => {
const st = statusStyle(c.status);
return (
setSelected(c.id)} style={{
cursor: 'pointer',
background: selected === c.id ? 'var(--accent-soft-10)' : 'transparent',
}}>
|
{c.num}
{c.tipo}
|
{c.parte}
{c.cnpj}
|
{BRL(c.valor)}
/{c.freq}
|
{c.dias} dias restantes |
{st.l} |
);
})}
{/* Detail */}
{sel.num}
{(() => { const st = statusStyle(sel.status); return {st.l}; })()}
{sel.assinado ? Assinado : Aguardando}
{sel.parte}
{sel.tipo} · CNPJ {sel.cnpj}
Valor
{BRL(sel.valor)}
recorrência {sel.freq}
Vigência
{sel.vigencia}
{sel.dias} dias restantes
Cláusulas principais
{[
{ t: 'Reajuste', v: 'IPCA anual, janela de 30 dias' },
{ t: 'Multa rescisória', v: '3 mensalidades no caso de rescisão antecipada' },
{ t: 'Garantia', v: 'Avalista solidário identificado · CPF ***.472.18**' },
{ t: 'Foro', v: 'Comarca de Belo Horizonte / MG' },
].map((c, i) => (
{c.t}
{c.v}
))}
Anexos (3)
{[
{ n: 'Contrato original.pdf', sz: '284 KB' },
{ n: 'Aditivo 1 · reajuste.pdf', sz: '92 KB' },
{ n: 'Certificado digital ICP-Brasil.p7s', sz: '18 KB' },
].map((a, i) => (
))}
);
};
Object.assign(window, { PageFluxo, PageLancamentos, PageBancos, PageConciliacao, PageContratos });