// Módulo LOJA — PDV (Caixa), Crediário, Financeiro
// ---------- PDV ----------
const PdvPage = () => {
const [cart, setCart] = React.useState([
{ ...PRODUTOS[2], tam: "P", qty: 1, desc: 0 },
{ ...PRODUTOS[5], tam: "M", qty: 1, desc: 0 },
]);
const [cliente, setCliente] = React.useState(CLIENTES[0]);
const [step, setStep] = React.useState("carrinho"); // cliente | produtos | carrinho | pagamento | confirmacao
const [pgMix, setPgMix] = React.useState([{ tipo: "Pix", valor: 0 }]);
const subtotal = cart.reduce((s, i) => s + (i.preco - i.desc) * i.qty, 0);
const descCashback = 50;
const frete = 0;
const total = subtotal - descCashback + frete;
const removeItem = (i) => setCart(cart.filter((_, idx) => idx !== i));
return (
Caixa aberto desde 09:14 · Saldo R$ 1.420
Caixa (PDV)
Operação de loja física · Bruna Carvalho · Terminal 01
{/* LEFT — produtos */}
{/* Cliente bar */}
CLIENTE
{cliente.instagram}
·
{cliente.telefone}
·
Última compra {cliente.ultimaCompra}
Cashback
{brl(cliente.cashback)}
Crédito
{brl(cliente.credito)}
{/* Search */}
{/* Quick-pick grid */}
{PRODUTOS.slice(0, 8).map(p => (
{p.foto}
{p.id}
{p.nome}
{brl(p.preco)}
))}
{/* RIGHT — cart + pagamento */}
Carrinho
{cart.reduce((s,i)=>s+i.qty,0)} itens
{cart.map((i, idx) => (
{i.foto}
{i.nome}
Tam {i.tam} · {i.id}
{brl(i.preco)}
))}
Subtotal{brl(subtotal)}
Desc. cashback aplicado- {brl(descCashback)}
Frete{brl(frete)}
TOTAL
{brl(total)}
Forma de pagamento
Pagamento misto · em uso
Pix · QR code 5 min
{brl(total - 50)}
Cashback do cliente
{brl(50)}
);
};
const PaymentChip = ({ icon, label, active }) => (
);
// ---------- CREDIÁRIO ----------
const CrediarioPage = () => {
const total = PARCELAS_CREDIARIO.reduce((s,p) => s + p.valor, 0);
const vencidas = PARCELAS_CREDIARIO.filter(p => p.status.includes("Vencido"));
const vencendo = PARCELAS_CREDIARIO.filter(p => p.status.includes("Vence"));
const emDia = PARCELAS_CREDIARIO.filter(p => p.status === "Em dia");
return (
Carteira de crediário
Crediário
Parcelas em aberto · cobrança automática · renegociação.
s+p.valor,0))}/>
{}} tabs={[
{ id: "parcelas", label: "Parcelas", count: PARCELAS_CREDIARIO.length },
{ id: "renegociacao", label: "Renegociações" },
{ id: "regras", label: "Regras de cobrança" },
{ id: "ranking", label: "Ranking devedores" },
]}/>
| Cliente | @Instagram | Parcela | Valor | Vencimento | Status | Ações |
{PARCELAS_CREDIARIO.map((p, i) => (
| {p.cliente} |
{p.instagram} |
{p.parcela} |
{brl(p.valor)} |
{p.vencimento} |
|
|
))}
Automações de cobrança
| Quando | Canal | Mensagem | Disparos · 30d | Status |
| 3 dias antes do vencimento | WhatsApp | "Oi {`{primeiro_nome}`}! Sua parcela de R$ {`{parcela_valor}`} vence em 3 dias…" | 41 | |
| No dia do vencimento | WhatsApp | "Lembrete: sua parcela vence hoje. Pague pelo Pix…" | 28 | |
| 3 dias após atraso | Equipe | Notificação interna para equipe de cobrança | 12 | |
);
};
// ---------- FINANCEIRO / DRE ----------
const FinanceiroPage = () => {
const [tab, setTab] = React.useState("dre");
return (
Maio 2026
Financeiro
DRE, fluxo de caixa, contas e lançamentos.
{tab === "dre" &&
}
{tab === "fluxo" &&
}
{tab === "contas" &&
}
{tab === "lancamentos" &&
}
{tab === "apagar" &&
}
);
};
const DreLine = ({ label, value, sub, indent = 0, kind, total }) => (
0 ? 'var(--text-2)' : 'var(--text)') }}>{label}
{sub && {sub}}
{value}
);
const DreView = () => (
Demonstrativo · Mai 2026
Comparado a Abr/26
+18.2%
);
const FluxoView = () => (
Fluxo realizado vs. previsto · próximos 30 dias
);
const ContasView = () => (
Contas cadastradas
| Conta | Tipo | Saldo | Última mov. | |
| Caixa físico — Loja | Espécie | {brl(1420.00)} | há 14m | ⋯ |
| Conta Inter PJ | Conta bancária | {brl(28740.50)} | há 2h | ⋯ |
| Mercado Pago | Maquininha + Pix | {brl(12018.30)} | há 8m | ⋯ |
| Reserva poupança | Conta bancária | {brl(15000.00)} | há 12d | ⋯ |
);
const LancamentosView = () => (
| Data | Tipo | Categoria | Descrição | Conta | Valor |
| 19/05 | Receita | Vendas Live | Live #48 · 31 pedidos pagos | Mercado Pago | + {brl(5870.40)} |
| 19/05 | Despesa | Marketing | Recarga WhatsApp · 5.000 envios | Inter PJ | - {brl(450.00)} |
| 18/05 | Receita | Vendas Loja | Fechamento caixa 18/05 | Caixa físico | + {brl(2840.00)} |
| 18/05 | Despesa | Logística | Postagem Correios · 28 etiquetas | Inter PJ | - {brl(842.30)} |
| 17/05 | Despesa | Fornecedor | NF Aurora Studio · pedido OC-184 | Inter PJ | - {brl(3420.00)} |
| 15/05 | Despesa | Aluguel | Aluguel loja maio/26 | Inter PJ | - {brl(4800.00)} |
);
const APagarView = () => (
| Descrição | Categoria | Fornecedor | Vencimento | Valor | Status | |
| Fornecedor Aurora · OC-186 | Mercadorias | Aurora Studio Atacado | 22/05 | {brl(4280.00)} | | |
| Salários · maio | Folha | — | 25/05 | {brl(8420.00)} | | |
| Energia loja | Operacional | Equatorial | 15/05 | {brl(840.00)} | | |
| Internet + telefone | Operacional | Vivo Empresas | 28/05 | {brl(380.00)} | | |
);
Object.assign(window, { PdvPage, CrediarioPage, FinanceiroPage });