/* global React */ const { useState } = React; const { brl, pct, intFmt } = window; function VendaView({ state, setState, calc, viewingMode, onExitView, onSave, savingHint, onExport }) { const v = state.venda; const c = calc; const denom = c.dre.receitaBruta || 1; const produto = state.produtos.find(p => p.id === v.produtoId); const cmvZero = c.cmvUn === 0; const setV = (patch) => setState({ ...state, venda: { ...state.venda, ...patch }}); const dreRows = [ { label: 'Valor total da nota fiscal', val: c.dre.valorNota, cls: 'subtotal' }, { label: '(−) IPI (não compõe receita)', val: -c.dre.ipi, cls: '' }, { label: 'Receita bruta (produtos)', val: c.dre.receitaBruta, cls: 'subtotal' }, { label: c.isNaoContrib && c.aliqIPI > 0 ? '(−) ICMS débito (B2C: base inclui IPI)' : '(−) ICMS débito', val: -c.dre.icmsDeb, cls: '' }, { label: '(−) PIS (base sem ICMS — Tema 69)', val: -c.dre.pis, cls: '' }, { label: '(−) COFINS (base sem ICMS — Tema 69)', val: -c.dre.cofins, cls: '' }, { label: '(−) DIFAL (LC 190/22 base dupla)', val: -c.dre.difal, cls: '' }, { label: 'Receita líquida', val: c.dre.receitaLiq, cls: 'subtotal' }, { label: '(−) CMV', val: -c.dre.cmvTotal, cls: '' }, { label: 'Lucro bruto', val: c.dre.lucroBruto, cls: 'subtotal' }, { label: '(−) Comissão marketplace', val: -c.dre.comissao, cls: '' }, { label: `(−) Custos fixos (${state.params.fixos}%)`, val: -c.dre.custosFixos, cls: '' }, { label: 'Lucro antes de IR/CSLL', val: c.dre.lucroAntesIR, cls: 'subtotal' }, { label: `(−) IRPJ (${state.params.irpj}%)`, val: -c.dre.irpj, cls: '' }, { label: `(−) CSLL (${state.params.csll}%)`, val: -c.dre.csll, cls: '' }, { label: 'Lucro líquido', val: c.dre.lucroLiq, cls: 'final' }, ]; return ( <> {viewingMode && (
Modo visualização — simulação #{String(viewingMode.seq).padStart(4, '0')} salva em {new Date(viewingMode.createdAt).toLocaleString('pt-BR')}
)} {cmvZero && (
CMV unitário = R$ 0,00. O produto "{produto?.nome || ''}" está sem dados de matéria-prima ou produção. O lucro abaixo está inflado artificialmente. Vá até a aba do produto e preencha NF de compra + produção diária.
)}
01 Produto e quantidade
setV({ qtd: n })} />
setV({ valor: n })} />
{brl(c.precoUn, 4)}
{brl(c.cmvUn, 4)}
setV({ ipi: val })} options={[{ value: 'SIM', label: 'Sim' }, { value: 'NAO', label: 'Não' }]} />
02 Cliente e canal
setV({ contrib: val })} options={[{ value: 'SIM', label: 'Sim' }, { value: 'NAO', label: 'Não' }]} />
setV({ mkt: val })} options={[{ value: 'SIM', label: 'Sim' }, { value: 'NAO', label: 'Não' }]} />
setV({ comissao: n })} disabled={v.mkt === 'NAO'} />
Resumo da operação
{c.tipo}
{pct(c.aliqICMS)}
{pct(c.aliqInterna)}
{c.difalAplicavel ? 'Sim' : 'Não'}
03 DRE da venda
Item
Valor
% Receita
R$ / un
{dreRows.map((r, i) => (
{r.label}
{brl(r.val)}
{pct(r.val / denom)}
{brl(v.qtd > 0 ? r.val / v.qtd : 0, 4)}
))}
Salvar registra um snapshot imutável no histórico.
); } window.VendaView = VendaView;