OP {venda.op}
{cliente?.nome}
}
subtitle={venda.descricao}
footer={
<>
>
}
>
{/* Status + meta */}
{tipo?.nome}
{vendedor?.nome}
{/* Resumo financeiro */}
Valor da venda
{fmtBRL(venda.valor)}
Peso total
{fmtNumber(venda.peso)} kg
Faturado
{fmtBRL(fat)}
Saldo a faturar: {fmtBRL(saldo)}
Recebido
{fmtBRL(ent)}
A receber: {fmtBRL(aReceber)}
{/* Cliente / Obra */}
Cliente · Obra
{cliente?.nome}
{cliente?.cnpj} · {cliente?.contato} · {cliente?.telefone}
Endereço da obra
{venda.enderecoObra}
Início
{fmtDate(venda.dataInicio)}
{/* Faturamento por CNPJ */}
Faturamento por CNPJ
{venda.faturamentos.length === 0 ? (
Nenhuma parcela faturada. Adicione a primeira parcela quando emitir a NF.
) : (
{venda.faturamentos.map((f, i) => (
{fmtDateShort(f.data)}
NF {f.nf}
Parcela {i + 1} de {venda.faturamentos.length}
{fmtBRL(f.valor)}
))}
)}
{/* Entradas */}
Entradas financeiras
{venda.entradas.length === 0 ? (
Nenhuma entrada registrada ainda.
) : (
{venda.entradas.map((e) => (
{fmtDateShort(e.data)}
{e.forma}
{e.obs || "Sem observação"}
+ {fmtBRL(e.valor)}
))}
)}
{/* Modais inline */}
setNovaEntrada(null)}
onSave={(payload) => { onAddEntrada(venda.op, payload); setNovaEntrada(null); }}
/>
setNovoFat(null)}
onSave={(payload) => { onAddFaturamento(venda.op, payload); setNovoFat(null); }}
/>
);
}
function NovaEntradaModal({ open, valor, saldo, onClose, onSave }) {
const [data, setData] = React.useState("");
const [v, setV] = React.useState(0);
const [forma, setForma] = React.useState("Transferência");
const [obs, setObs] = React.useState("");
React.useEffect(() => {
if (open && valor) { setData(valor.data); setV(valor.valor); setForma(valor.forma); setObs(valor.obs); }
}, [open]);
if (!open) return null;
return (
>
}
>
);
}
window.VendaDetail = VendaDetail;
window.NovaVendaModal = NovaVendaModal;