/* global React */ const { useState, useRef } = React; const { brl, pct, intFmt } = window; function ProdutoView({ produto, params, setProduto, viewingMode, onExitView, onSave, savingHint, onShowToast }) { if (!produto) return null; const c = window.calcProduto(produto, params); // Estado do XML const [xmlText, setXmlText] = useState(''); const [xmlModalOpen, setXmlModalOpen] = useState(false); const [xmlParsed, setXmlParsed] = useState(null); const setNF = (patch) => setProduto({ ...produto, nf: { ...produto.nf, ...patch } }); const setProd = (patch) => setProduto({ ...produto, prod: { ...produto.prod, ...patch } }); const setInsumo = (idx, patch) => { const novo = [...produto.insumos]; novo[idx] = { ...novo[idx], ...patch }; setProduto({ ...produto, insumos: novo }); }; const addInsumo = () => { setProduto({ ...produto, insumos: [...produto.insumos, { nome: 'Novo insumo', valor: 0, credPC: false, credICMS: false, aliqICMS: 18, nota: '', custom: true }] }); }; const removeInsumo = (idx) => { const novo = [...produto.insumos]; novo.splice(idx, 1); setProduto({ ...produto, insumos: novo }); }; const processarXml = () => { const texto = (xmlText || '').trim(); if (!texto) { onShowToast('Cole o XML da NF-e no campo acima', 'err'); return; } const parsed = window.parseXmlNFe(texto); if (!parsed.ok) { onShowToast(parsed.erro || 'Falha ao processar XML', 'err'); return; } // Agrupa para decidir se precisa de seleção const grupos = window.agruparItensXml(parsed.itens); if (grupos.length === 1) { // Item único: aplica direto sem abrir modal const selecao = window.calcularSelecaoXml(grupos, parsed); aplicarXml(selecao, parsed); } else { // Múltiplos itens: abre modal de seleção setXmlParsed(parsed); setXmlModalOpen(true); } }; const aplicarXml = (selecao, parsed) => { const { produtoAtualizado, kgPreenchido } = window.aplicarXmlAoProduto(produto, selecao, parsed); setProduto(produtoAtualizado); setXmlText(''); // limpa textarea let msg = `XML importado: ${parsed.fornecedor || 'fornecedor'} — ${selecao.qtdItens} item(s)`; if (selecao.hasST) msg += ' · ⚠ contém ICMS-ST (sem crédito)'; if (!kgPreenchido) msg += ` · ⚠ unidade "${selecao.unidade}" — preencha kg manualmente`; onShowToast(msg, selecao.hasST || !kgPreenchido ? 'warn' : 'ok'); }; const onXmlModalConfirm = ({ selecao, parsed }) => { setXmlModalOpen(false); aplicarXml(selecao, parsed); setXmlParsed(null); }; const onXmlModalCancel = () => { setXmlModalOpen(false); setXmlParsed(null); }; const kgWarn = produto.nf.xmlInfo && produto.nf.xmlInfo.isKg === false; return ( <> {viewingMode && (
Modo visualização — versão v#{String(viewingMode.seq).padStart(4, '0')} salvo em {new Date(viewingMode.createdAt).toLocaleString('pt-BR')}
)} setProduto({ ...produto, nome: e.target.value })} placeholder="Nome do produto" />
CMV {brl(c.cmv.cmvUn, 4)} / un {intFmt(produto.prod.qtd)} un / dia {produto.nf.kg} kg / nota
XML Importar NF-e
Cole o XML para preencher os campos da NF