`;const url=URL.createObjectURL(new Blob([html],{type:'text/html;charset=utf-8'}));fecharModal();setTimeout(()=>{const win=window.open(url,'_blank');if(!win){const a=document.createElement('a');a.href=url;a.download='etiquetas_pedido.html';document.body.appendChild(a);a.click();document.body.removeChild(a);return;}win.addEventListener('load',()=>setTimeout(()=>win.print(),400));setTimeout(()=>URL.revokeObjectURL(url),60000);clShowToast('🏷 '+blocos.length+' etiquetas para impressão!','ent');},150);} function cancelarRomaneio(romId){const rom=S.romaneios.find(r=>r.id===romId);if(!rom||!confirm('Cancelar "'+rom.nome+'"?'))return;rom.status='cancelado';delaySalvar();renderRomaneios();} function confirmarDelRomaneio(romId){const rom=S.romaneios.find(r=>r.id===romId);if(!rom)return;showModal(``);} function execDelRomaneio(romId){S.romaneios=S.romaneios.filter(r=>r.id!==romId);delaySalvar();fecharModal();renderRomaneios();} function renderRomaneios(){const el=document.getElementById('rom-lista');if(!el)return;if(!S.romaneios||!S.romaneios.length){el.innerHTML=`
🚛
Nenhum pedido criado ainda
`;return;}el.innerHTML='';S.romaneios.forEach(rom=>{const tP=rom.itens.reduce((a,i)=>a+(i.qtdPedida||0),0);const tC=rom.itens.reduce((a,i)=>a+(i.qtdConferida||0),0);const pct=tP>0?Math.round((tC/tP)*100):0;const canal=S.canais[rom.canal];const pc=rom.status==='concluido'?'#4ade80':pct>=100?'#4ade80':pct>0?'#fbbf24':'var(--blue-bright)';const sL={montando:'📦 Montando',aguardando:'⏳ Aguardando',conferindo:'🔍 Conferindo',concluido:'✅ Concluído',cancelado:'❌ Cancelado'};const sC={montando:'aberto',aguardando:'aberto',conferindo:'conferindo',concluido:'concluido',cancelado:'cancelado'}[rom.status]||'aberto';const div=document.createElement('div');div.className='rom-card '+sC;div.innerHTML=`
${rom.nome}${sL[rom.status]||rom.status}${canal?`${canal.nome}`:''}
${rom.criadoEm}${rom.obs?' · '+rom.obs:''}${rom.concluidoEm?' · Concluído: '+rom.concluidoEm:''}${rom.mlPedidoId?` · 🛒 ML #${rom.mlPedidoId} · R$ ${rom.mlTotal?.toLocaleString('pt-BR',{minimumFractionDigits:2})}`:''}
${rom.status==='aguardando'?``:''} ${rom.status==='conferindo'?``:''} ${rom.status==='montando'?``:''}${rom.itens.length?``:''} ${['montando','aguardando','conferindo'].includes(rom.status)?``:''}
${rom.itens.length?`${rom.status!=='montando'?`
${rom.itens.length} prod · ${tP} un. · ${tC} conf.${pct}%
`:`
${rom.itens.length} prod · ${tP} un.
`}
ProdutoPedido${rom.status!=='montando'?'Conf.Status':''}
${rom.itens.map(it=>{const ok=it.qtdConferida>=it.qtdPedida&&rom.status!=='montando';return`
${it.nome.length>30?it.nome.slice(0,30)+'…':it.nome}${it.qtdPedida}${rom.status!=='montando'?`${it.qtdConferida}${ok?'✅':`${it.qtdConferida>0?'⏳ '+it.qtdConferida+'/'+it.qtdPedida:'—'}`}`:''}
`;}).join('')}
`:''}`;el.appendChild(div);});} // ETIQUETAS let etqFmt='CODE128',etqSvg='',etqPidSel=null,etqFila=[]; function renderEtqProdList(){const q=(document.getElementById('etq-busca')?.value||'').toLowerCase().trim();const wrap=document.getElementById('etq-prod-list');if(!wrap)return;let prods=Object.entries(S.products||{});if(q)prods=prods.filter(([pid,p])=>{if(p.nome.toLowerCase().includes(q))return true;if(codigoProd(pid).includes(q))return true;if(p.codigos&&p.codigos.some(c=>c.toLowerCase().includes(q)))return true;return false;});prods.sort((a,b)=>a[1].nome.localeCompare(b[1].nome,'pt-BR',{sensitivity:'base'}));let kits=(S.kits||[]);if(q)kits=kits.filter(k=>{if(k.nome.toLowerCase().includes(q))return true;if(k.codigos&&k.codigos.some(c=>c.toLowerCase().includes(q)))return true;return false;});kits.sort((a,b)=>a.nome.localeCompare(b.nome,'pt-BR',{sensitivity:'base'}));if(!prods.length&&!kits.length){wrap.innerHTML='
Nenhum produto encontrado.
';return;}const btnFila=(id,isKit)=>{const naFila=etqFila.find(i=>i.itemId===id);const c=isKit?'purple':'green';return naFila?`
${naFila.qtd}
`:``;};let html='';if(kits.length){html+=`
🔗 Kits
`;html+=kits.map(k=>{const cod=k.codigos?.[0]||'(sem código)';const sel=etqPidSel==='kit:'+k.id;return`
${k.nome} 🔗 Kit
${cod}
${k.preco?`
${fmt(k.preco)}
`:''}${btnFila('kit:'+k.id,true)}
`;}).join('');}if(prods.length){html+=`
📦 Produtos
`;html+=prods.map(([pid,p])=>{const cod=getCodigoProd(pid);const sel=etqPidSel===pid;return`
${p.nome}
${cod}
${p.preco?`
${fmt(p.preco)}
`:''}${btnFila(pid,false)}
`;}).join('');}wrap.innerHTML=html;} function selecionarEtqKit(kitId){const k=(S.kits||[]).find(k=>k.id===kitId);if(!k)return;etqPidSel='kit:'+kitId;const cod=k.codigos?.[0]||'';document.getElementById('etq-codigo').value=cod;const sp=document.getElementById('etq-prod-selecionado');if(sp){sp.style.display='block';sp.style.borderColor='var(--purple-bd)';sp.style.background='var(--purple-lt)';}const av=document.getElementById('etq-sem-prod-aviso');if(av)av.style.display='none';const nm=document.getElementById('etq-prod-nome');if(nm)nm.textContent=k.nome;const cd=document.getElementById('etq-prod-cod-disp');if(cd)cd.textContent='Código: '+(cod||'(sem código)');const te=document.getElementById('etq-texto');if(te)te.value=k.nome;renderEtqProdList();etqGerar();} function selecionarEtqProd(pid){etqPidSel=pid;const p=S.products[pid];if(!p)return;const cod=getCodigoProd(pid);document.getElementById('etq-codigo').value=cod;const sp=document.getElementById('etq-prod-selecionado');if(sp){sp.style.display='block';sp.style.borderColor='var(--blue-bd)';sp.style.background='var(--blue-lt)';}const av=document.getElementById('etq-sem-prod-aviso');if(av)av.style.display='none';const nm=document.getElementById('etq-prod-nome');if(nm)nm.textContent=p.nome;const cd=document.getElementById('etq-prod-cod-disp');if(cd)cd.textContent='Código: '+cod+(p.codigos?.length?' (personalizado)':' (automático)');const te=document.getElementById('etq-texto');if(te)te.value=p.nome;renderEtqProdList();etqGerar();} function etqSetFmt(el){document.getElementById('etq-fmt-btns').querySelectorAll('.pill').forEach(p=>p.classList.remove('on'));el.classList.add('on');etqFmt=el.dataset.fmt;etqGerar();} function etqSyncSlider(k){const el=document.getElementById('etq-lbl-'+k);if(el)el.textContent=document.getElementById('etq-sl-'+k).value;} function etqGetDim(){return{w:Math.max(10,parseInt(document.getElementById('etq-inp-dimw')?.value)||60),h:Math.max(10,parseInt(document.getElementById('etq-inp-dimh')?.value)||40)};} function etqGerarBarcodeSVG(codigo,cfg){const tmp=document.createElementNS('http://www.w3.org/2000/svg','svg');const ghost=document.createElement('div');ghost.style.cssText='position:fixed;left:-9999px;top:0;visibility:hidden;width:600px';ghost.appendChild(tmp);document.body.appendChild(ghost);try{JsBarcode(tmp,codigo,cfg);}catch(e){document.body.removeChild(ghost);throw e;}const bw=parseFloat(tmp.getAttribute('width')||300);const bh=parseFloat(tmp.getAttribute('height')||100);tmp.setAttribute('viewBox','0 0 '+bw+' '+bh);const str=new XMLSerializer().serializeToString(tmp);document.body.removeChild(ghost);return{str,w:bw,h:bh};} function etqMedirTexto(txt,fontSize){return txt.length*fontSize*0.62;} function etqQuebrarLinha(txt,fontSize,maxW){if(etqMedirTexto(txt,fontSize)<=maxW)return[txt];const words=txt.split(' ');const lines=[];let cur='';for(const w of words){const test=cur?cur+' '+w:w;if(etqMedirTexto(test,fontSize)<=maxW){cur=test;}else{if(cur)lines.push(cur);cur=w;}}if(cur)lines.push(cur);return lines.length?lines:[txt];} function etqCompor(bStr,bW,bH,texto,fontSize,pos,align,lineColor,bgcolor){const rawLines=texto.trim().split('\n').map(l=>l.trim()).filter(Boolean);if(!rawLines.length)return{str:bStr,w:bW,h:bH};const maxW=bW-16;let fs=fontSize;let allLines=rawLines.flatMap(ln=>etqQuebrarLinha(ln,fs,maxW));while(fs>7&&allLines.some(ln=>etqMedirTexto(ln,fs)>maxW)){fs--;}const lh=fs*1.45;const tbH=allLines.length*lh+6;const totalH=bH+tbH;const x=align==='middle'?bW/2:align==='start'?8:bW-8;const textEls=allLines.map((ln,i)=>{const safe=ln.replace(/&/g,'&').replace(//g,'>');const y=pos==='top'?fs+i*lh+3:bH+fs+i*lh+4;return`${safe}`;}).join('');const imgY=pos==='top'?tbH:0;const b64=btoa(unescape(encodeURIComponent(bStr)));const str=`${textEls}`;return{str,w:bW,h:totalH};} function etqGerar(){const codigo=document.getElementById('etq-codigo')?.value.trim();const errEl=document.getElementById('etq-err');if(!codigo){if(errEl)errEl.textContent='';etqSvg='';const pw=document.getElementById('etq-preview-wrap');if(pw)pw.innerHTML='Selecione um produto ou informe um código';return;}const lineColor=document.getElementById('etq-linecolor')?.value||'#000000';const bgcolor=document.getElementById('etq-bgcolor')?.value||'#ffffff';const cfg={format:etqFmt,width:parseFloat(document.getElementById('etq-sl-width')?.value||2.5),height:parseInt(document.getElementById('etq-sl-height')?.value||60),displayValue:document.getElementById('etq-displayvalue')?.value!=='0',fontSize:parseInt(document.getElementById('etq-fontsize')?.value||14),font:'Arial',textAlign:'center',textPosition:'bottom',textMargin:3,margin:parseInt(document.getElementById('etq-sl-margin')?.value||8),lineColor,background:bgcolor,valid:ok=>{if(errEl)errEl.textContent=ok?'':'Código inválido para este formato.'}};let bResult;try{bResult=etqGerarBarcodeSVG(codigo,cfg);if(errEl)errEl.textContent='';}catch(e){if(errEl)errEl.textContent='Erro: '+e.message;return;}const{str}=etqCompor(bResult.str,bResult.w,bResult.h,document.getElementById('etq-texto')?.value||'',parseInt(document.getElementById('etq-textofonte')?.value||13),document.getElementById('etq-textopos')?.value||'bottom',document.getElementById('etq-textoalign')?.value||'middle',lineColor,bgcolor);etqSvg=str;const blob=new Blob([str],{type:'image/svg+xml;charset=utf-8'});const url=URL.createObjectURL(blob);const pw=document.getElementById('etq-preview-wrap');if(pw)pw.innerHTML=``;} function etqBaixarSVG(){if(!etqSvg){alert('Gere a etiqueta primeiro.');return;}const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([etqSvg],{type:'image/svg+xml;charset=utf-8'}));a.download='etiqueta.svg';a.click();} function etqBaixarPNG(){if(!etqSvg){alert('Gere a etiqueta primeiro.');return;}const url=URL.createObjectURL(new Blob([etqSvg],{type:'image/svg+xml;charset=utf-8'}));const img=new Image();img.onload=()=>{const s=3;const c=document.createElement('canvas');c.width=(img.naturalWidth||300)*s;c.height=(img.naturalHeight||100)*s;const ctx=c.getContext('2d');ctx.scale(s,s);ctx.drawImage(img,0,0);URL.revokeObjectURL(url);const a=document.createElement('a');a.href=c.toDataURL('image/png');a.download='etiqueta.png';a.click();};img.onerror=()=>{URL.revokeObjectURL(url);alert('Erro ao gerar PNG.');};img.src=url;} function etqImprimir(){if(!etqSvg){alert('Gere a etiqueta primeiro.');return;}const{w:pw,h:ph}=etqGetDim();const b64=btoa(unescape(encodeURIComponent(etqSvg)));const html=`
`;const url=URL.createObjectURL(new Blob([html],{type:'text/html;charset=utf-8'}));const win=window.open(url,'_blank');if(!win){const a=document.createElement('a');a.href=url;a.download='etiqueta.html';document.body.appendChild(a);a.click();document.body.removeChild(a);return;}win.addEventListener('load',()=>setTimeout(()=>win.print(),400));setTimeout(()=>URL.revokeObjectURL(url),60000);} function etqAdicionarFila(){if(!etqSvg){alert('Gere a etiqueta primeiro.');return;}const nome=document.getElementById('etq-prod-nome')?.textContent||document.getElementById('etq-codigo')?.value||'Produto';const itemId=etqPidSel||'_manual';const ex=etqFila.findIndex(i=>i.itemId===itemId);const isKit=itemId.startsWith('kit:');if(ex>=0){etqFila[ex].qtd++;clShowToast('➕ +1 cópia de "'+nome+'"',isKit?'kit':'ent');}else{etqFila.push({svg:etqSvg,nome,itemId,qtd:1});clShowToast('✅ "'+nome+'" adicionado!',isKit?'kit':'ent');}renderFilaImpressao();renderEtqProdList();} function adicionarFilaDireto(itemId,isKit){const cfg={format:etqFmt,width:parseFloat(document.getElementById('etq-sl-width')?.value||2.5),height:parseInt(document.getElementById('etq-sl-height')?.value||60),displayValue:document.getElementById('etq-displayvalue')?.value!=='0',fontSize:parseInt(document.getElementById('etq-fontsize')?.value||14),font:'Arial',textAlign:'center',textPosition:'bottom',textMargin:3,margin:parseInt(document.getElementById('etq-sl-margin')?.value||8),lineColor:document.getElementById('etq-linecolor')?.value||'#000000',background:document.getElementById('etq-bgcolor')?.value||'#ffffff',valid:()=>{}};let nome,cod,texto;if(isKit){const k=(S.kits||[]).find(k=>k.id===itemId.replace('kit:',''));if(!k)return;nome=k.nome;cod=k.codigos?.[0]||'';texto=k.nome;if(!cod){clShowToast('⚠ Kit sem código de barras.','sai');return;}}else{const p=S.products[itemId];if(!p)return;nome=p.nome;cod=getCodigoProd(itemId);texto=p.nome;}let bResult;try{bResult=etqGerarBarcodeSVG(cod,cfg);}catch(e){clShowToast('❌ Código inválido para "'+nome+'"','sai');return;}const{str}=etqCompor(bResult.str,bResult.w,bResult.h,texto,parseInt(document.getElementById('etq-textofonte')?.value||13),document.getElementById('etq-textopos')?.value||'bottom',document.getElementById('etq-textoalign')?.value||'middle',cfg.lineColor,cfg.background);const ex=etqFila.findIndex(i=>i.itemId===itemId);if(ex>=0){etqFila[ex].qtd++;etqFila[ex].svg=str;clShowToast('➕ +1 "'+nome+'"',isKit?'kit':'ent');}else{etqFila.push({svg:str,nome,itemId,qtd:1});clShowToast('✅ "'+nome+'" adicionado!',isKit?'kit':'ent');}renderFilaImpressao();renderEtqProdList();} function etqFilaDireto_inc(itemId,isKit){const ex=etqFila.findIndex(i=>i.itemId===itemId);if(ex>=0){etqFila[ex].qtd++;renderFilaImpressao();renderEtqProdList();}else adicionarFilaDireto(itemId,isKit);} function etqFilaDireto_dec(itemId,isKit){const ex=etqFila.findIndex(i=>i.itemId===itemId);if(ex<0)return;etqFila[ex].qtd--;if(etqFila[ex].qtd<=0)etqFila.splice(ex,1);renderFilaImpressao();renderEtqProdList();} function renderFilaImpressao(){const wrap=document.getElementById('fila-lista');const count=document.getElementById('fila-count');const btn=document.getElementById('fila-imprimir-btn');const total=etqFila.reduce((a,i)=>a+i.qtd,0);if(count)count.textContent=etqFila.length+' prod · '+total+' etiq.';if(btn){btn.disabled=!etqFila.length;btn.style.opacity=etqFila.length?'1':'0.4';btn.style.cursor=etqFila.length?'pointer':'not-allowed';}if(!wrap)return;if(!etqFila.length){wrap.style.display='none';return;}wrap.style.display='block';wrap.innerHTML=`
ProdutoCópias
`+etqFila.map((item,idx)=>`
${item.nome.length>28?item.nome.slice(0,28)+'…':item.nome}
${item.qtd}
`).join('');} function etqFilaQtd(idx,delta){if(!etqFila[idx])return;etqFila[idx].qtd=Math.max(1,etqFila[idx].qtd+delta);renderFilaImpressao();} function etqFilaRemover(idx){etqFila.splice(idx,1);renderFilaImpressao();renderEtqProdList();} function etqLimparFila(){etqFila=[];renderFilaImpressao();renderEtqProdList();} function etqImprimirFila(){if(!etqFila.length){alert('Fila vazia!');return;}const{w:pw,h:ph}=etqGetDim();const blocos=etqFila.flatMap(item=>Array(item.qtd).fill(item.svg)).map(svg=>{const b64=btoa(unescape(encodeURIComponent(svg)));return`
`;}).join('');const html=`${blocos} `;const url=URL.createObjectURL(new Blob([html],{type:'text/html;charset=utf-8'}));const win=window.open(url,'_blank');if(!win){const a=document.createElement('a');a.href=url;a.download='fila_etiquetas.html';document.body.appendChild(a);a.click();document.body.removeChild(a);return;}win.addEventListener('load',()=>setTimeout(()=>win.print(),400));setTimeout(()=>URL.revokeObjectURL(url),60000);} // BACKUP function exportarBackupCompleto(){const dados={versao:'4a_loja_v1',exportadoEm:new Date().toLocaleString('pt-BR'),products:S.products,kits:S.kits||[],movs:S.movs||[],devolucoes:S.devolucoes||[],romaneios:S.romaneios||[],canais:S.canais,responsaveis:S.responsaveis||[],motivosAjuste:S.motivosAjuste||[]};const json=JSON.stringify(dados,null,2);const blob=new Blob([json],{type:'application/json;charset=utf-8'});const url=URL.createObjectURL(blob);const a=document.createElement('a');const dataStr=new Date().toLocaleDateString('pt-BR').replace(/\//g,'-');a.href=url;a.download=`4a_loja_backup_${dataStr}.json`;document.body.appendChild(a);a.click();setTimeout(()=>{URL.revokeObjectURL(url);document.body.removeChild(a);},500);clShowToast('✅ Backup exportado!','ent');} function importarBackup(event){const file=event.target.files[0];if(!file)return;const reader=new FileReader();reader.onload=e=>{try{const dados=JSON.parse(e.target.result);if(!dados.versao||!dados.products){mostrarStatusImport('error','❌ Arquivo inválido.');return;}const nProds=Object.keys(dados.products||{}).length;const nMovs=(dados.movs||[]).length;const nKits=(dados.kits||[]).length;const nDevs=(dados.devolucoes||[]).length;window._importDados=dados;showModal(``);}catch(err){mostrarStatusImport('error','❌ Erro: '+err.message);}};reader.readAsText(file);event.target.value='';} function confirmarImport(){const dados=window._importDados;if(!dados)return;S.products=dados.products||{};S.kits=dados.kits||[];S.movs=dados.movs||[];S.devolucoes=dados.devolucoes||[];S.romaneios=dados.romaneios||[];S.canais=dados.canais||S.canais;S.responsaveis=dados.responsaveis||[];S.motivosAjuste=dados.motivosAjuste||[];salvar();fecharModal();renderEst();renderHist();renderDev();renderKits();renderRomaneios();renderBipHist();mostrarStatusImport('ok','✅ Backup importado! '+Object.keys(S.products).length+' produtos carregados.');clShowToast('✅ Backup importado!','ent');window._importDados=null;} function mostrarStatusImport(tipo,msg){const el=document.getElementById('import-status');if(!el)return;el.style.display='block';el.style.background=tipo==='ok'?'var(--green-lt)':'var(--red-lt)';el.style.border='1px solid '+(tipo==='ok'?'var(--green-bd)':'var(--red-bd)');el.style.color=tipo==='ok'?'#4ade80':'#f87171';el.textContent=msg;if(tipo==='ok')setTimeout(()=>{el.style.display='none';},5000);} function exportEstCSV(){const rows=[['Produto','Preço','Estoque Inicial','Entradas','Saídas','Saldo']];Object.entries(S.products||{}).forEach(([pid,p])=>{const t=getTotais(pid);rows.push([p.nome,p.preco||0,t.inicial,t.entradas,t.saidasMov,t.saldo]);});dlCSV(rows,'estoque.csv');} function exportDevCSV(){const rows=[['Data','Produto','Qtd','Valor Unit.','Prejuízo','Canal','Motivo','Voltou Estoque','Responsável','Obs.']];(S.devolucoes||[]).forEach(d=>{const c=S.canais[d.canalId];rows.push([d.data,d.produto,d.qtd,d.valorUnit,d.prejuizo,c?c.nome:'',d.motivo||'',d.voltouEstoque?'Sim':'Não',d.resp||'',d.obs||'']);});dlCSV(rows,'devolucoes.csv');} function dlCSV(rows,fname){const csv='\uFEFF'+rows.map(r=>r.map(v=>`"${String(v).replace(/"/g,'""')}"`).join(';')).join('\n');const blob=new Blob([csv],{type:'text/csv;charset=utf-8;'});const url=URL.createObjectURL(blob);const a=document.createElement('a');a.href=url;a.download=fname;document.body.appendChild(a);a.click();setTimeout(()=>{URL.revokeObjectURL(url);document.body.removeChild(a);},500);} // BIP SEARCH let bipSearchState={}; function toggleBipSearch(inputId,renderFn){const st=bipSearchState[inputId]||(bipSearchState[inputId]={active:false,buffer:'',timer:null});const btn=document.getElementById(inputId+'-bip-btn');if(st.active){st.active=false;if(st.timer)clearTimeout(st.timer);if(btn){btn.style.background='none';btn.style.borderColor='var(--border)';btn.textContent='📷';}const inp=document.getElementById(inputId);if(inp)inp.placeholder='🔍 Buscar produto ou código de barras...';return;}st.active=true;st.buffer='';if(btn){btn.style.background='var(--blue-lt)';btn.style.borderColor='var(--blue-bd)';btn.textContent='🟢';}const inp=document.getElementById(inputId);if(inp){inp.value='';inp.focus();inp.placeholder='⚡ Bipe o produto agora...';}function bipListener(e){if(e.key!=='Enter')return;e.preventDefault();const val=(inp?.value||'').trim();if(val){const found=buscarPorCodigo(val);if(found){const[,p]=found;if(inp)inp.value=p.nome;}if(renderFn)renderFn();atualizarX(inputId);}fecharBipSearch(inputId,renderFn,bipListener);}if(inp)inp.addEventListener('keydown',bipListener);st.timer=setTimeout(()=>fecharBipSearch(inputId,renderFn,bipListener),30000);st._listener=bipListener;} function fecharBipSearch(inputId,renderFn,listener){const st=bipSearchState[inputId];if(!st)return;st.active=false;if(st.timer)clearTimeout(st.timer);const inp=document.getElementById(inputId);if(inp){inp.removeEventListener('keydown',listener||st._listener);inp.placeholder='🔍 Buscar produto ou código de barras...';}const btn=document.getElementById(inputId+'-bip-btn');if(btn){btn.style.background='none';btn.style.borderColor='var(--border)';btn.textContent='📷';}} function searchBarKeydown(e,inputId,renderFn){if(e.key!=='Enter')return;const val=e.target.value.trim();if(!val)return;const found=buscarPorCodigo(val);if(found){const[,p]=found;e.target.value=p.nome;if(renderFn)renderFn();atualizarX(inputId);}} // MODAL function showModal(html){document.getElementById('modal-root').innerHTML=``;} function fecharModal(){document.getElementById('modal-root').innerHTML='';} function bgClose(e){if(e.target===e.currentTarget)fecharModal();} document.addEventListener('keydown',e=>{if(e.key==='Escape')fecharModal();}); // BANNER MOTIVACIONAL const BANCO_FRASES={madrugada:{cor:[['#0e7490','#6d28d9'],['#1a4fcc','#0e7490'],['#6d28d9','#0a6b3c'],['#092b3a','#1a4fcc'],['#0a6b3c','#0e7490'],['#1a4fcc','#6d28d9'],['#6d28d9','#0e7490']],frases:[['Enquanto o mundo dorme, você está construindo algo grande. 🌙','A madrugada é dos guerreiros. Continue! ⚡'],['A persistência vence o talento quando o talento não persiste. 🌙','Cada hora trabalhada agora é um investimento no futuro. ⭐'],['O sucesso não tem horário marcado. Você prova isso agora. 🌟','Foco total. Resultado garantido. 🎯'],['Os grandes resultados acontecem fora da zona de conforto. 🌙','Continue. Você é mais forte do que pensa. 💪'],['O esforço de hoje planta a colheita de amanhã. 🌱','Silêncio da madrugada + foco total = produtividade máxima. 🎯'],['Trabalho duro na madrugada, liberdade durante o dia. ⚡','Persistência é o caminho entre o sonho e a realidade. 🌙'],['Final de semana ou não, os determinados não param. 🔥','A madrugada pertence aos que querem mais. É você. ⭐']]},manha:{cor:[['#92400e','#b91c1c'],['#0a6b3c','#92400e'],['#1a4fcc','#0a6b3c'],['#92400e','#6d28d9'],['#b91c1c','#92400e'],['#0a6b3c','#1a4fcc'],['#6d28d9','#92400e']],frases:[['Bom dia! Semana nova, oportunidades novas. Bora vender! 🚀','Cada manhã é uma nova chance de ser ainda melhor. ☀️'],['Bom dia! Organize o estoque, organize o sucesso. ☀️','A jornada de mil vendas começa com a primeira. 🎯'],['Bom dia! Foco no processo, o resultado vem naturalmente. 🏆','Vendas acontecem para quem está preparado. Você está! ✅'],['Bom dia! Mantenha o ritmo, você está indo muito bem! 💪','Estoque organizado é dinheiro no caixa. 📦'],['Bom dia! Mais um dia para bater a meta e se superar. 🎯','Cada venda é um passo mais perto do seu objetivo. 💰'],['Bom dia! Sprint final da semana. Dê o seu melhor! ⚡','Os melhores fechamentos acontecem nas sextas. 💪'],['Bom dia! Finais de semana são para os determinados. 🔥','Trabalhar sábado hoje = folgar com qualidade amanhã. 🌟']]},tarde:{cor:[['#1a4fcc','#0a6b3c'],['#6d28d9','#1a4fcc'],['#0a6b3c','#0e7490'],['#b91c1c','#6d28d9'],['#0e7490','#0a6b3c'],['#6d28d9','#b91c1c'],['#1a4fcc','#0e7490']],frases:[['Continue o ritmo! 💪','Tarde de segunda define a semana. 🎯'],['Tarde de terça: a semana está pegando velocidade! 🚀','Organização agora = menos estresse amanhã. 📋'],['Tarde de quarta: pique total! ⚡','Quarta à tarde é quando os fortes aceleram. 💨'],['Tarde de quinta: sprint final! 🏁','Quinta à tarde: foco, velocidade e resultado. 🎯'],['Tarde de sexta: últimas horas da semana. Use bem! ⏰','Sprint final! A semana perfeita está ao seu alcance. 🚀'],['Tarde de sábado: você merece orgulho. 😊','Finalizar sábado com organização é a melhor sensação. ✅'],['Domingo à tarde: preparar agora é vencer segunda. 🔑','Quem organiza o domingo, domina a semana. 📋']]},noite:{cor:[['#6d28d9','#0a6b3c'],['#0e7490','#6d28d9'],['#1a4fcc','#b91c1c'],['#0a6b3c','#6d28d9'],['#6d28d9','#0e7490'],['#b91c1c','#1a4fcc'],['#0a6b3c','#1a4fcc']],frases:[['Noite de segunda: você terminou o dia que 70% das pessoas temem. 🏆','Cada noite bem concluída planta uma manhã de vitória. 🌙'],['Terça à noite: mais um dia de conquistas. 💪','Você fez a diferença hoje. Continue amanhã! 🚀'],['Metade da semana vencida! Orgulho é pouco. 🏆','Organize para amanhã agora e durma tranquilo. 📋'],['Quinta à noite: amanhã é sexta! Você chegou quase lá. 🎉','O esforço de hoje vai aparecer nos resultados. 📈'],['Sexta à noite: PARABÉNS! Semana encerrada. 🥳','Você merece descansar. Semana bem executada! 🌟'],['Sábado à noite: você trabalhou, você conquistou. 💎','Sábado encerrado. Amanhã é domingo — recarregue! 🌙'],['Domingo à noite: amanhã começa uma nova semana de vitórias. ☀️','O domingo bem usado garante a semana bem iniciada. 🎯']]}}; function bannerGetPeriodo(){const h=new Date().getHours();if(h<6)return'madrugada';if(h<14)return'manha';if(h<18)return'tarde';return'noite';} function bannerGetDiaSemana(){const d=new Date().getDay();return d===0?6:d-1;} function bannerGetFrasesHoje(){const p=bannerGetPeriodo(),d=bannerGetDiaSemana();return{frases:BANCO_FRASES[p].frases[d],cor:BANCO_FRASES[p].cor[d]};} let _bannerIdx=0,_bannerTimer=null,_bannerPausado=false,_bannerFrases=[],_bannerCor=['#0a8a4e','#1565c0']; function bannerInit(){const b=document.getElementById('motivacional-banner');if(!b)return;const{frases,cor}=bannerGetFrasesHoje();_bannerFrases=frases;_bannerCor=cor;_bannerIdx=0;const periodo={madrugada:'🌙 Madrugada',manha:'☀️ Bom dia',tarde:'🌤️ Boa tarde',noite:'🌆 Boa noite'}[bannerGetPeriodo()];b.innerHTML=`
${periodo}
`;b.style.height='52px';bannerMostrar(0);_bannerTimer=setInterval(()=>{if(!_bannerPausado)bannerNext();},6000);} function bannerMostrar(idx){if(!_bannerFrases.length)return;_bannerIdx=(idx+_bannerFrases.length)%_bannerFrases.length;const b=document.getElementById('motivacional-banner');const fr=document.getElementById('bfrase');const dots=document.getElementById('banner-dots');if(b)b.style.background=`linear-gradient(90deg,${_bannerCor[0]},${_bannerCor[1]})`;if(fr){fr.style.opacity='0';setTimeout(()=>{fr.textContent=_bannerFrases[_bannerIdx];fr.style.opacity='1';},280);}if(dots)dots.innerHTML=_bannerFrases.map((_,i)=>`
`).join('');} function bannerNext(){bannerMostrar(_bannerIdx+1);} function bannerPrev(){bannerMostrar(_bannerIdx-1);} function bannerPausar(){_bannerPausado=!_bannerPausado;const btn=document.getElementById('banner-pause-btn');if(btn)btn.textContent=_bannerPausado?'▶':'⏸';} function fecharBanner(){const b=document.getElementById('motivacional-banner');if(!b)return;clearInterval(_bannerTimer);b.style.height='0';setTimeout(()=>{b.innerHTML='';},500);} // MERCADO LIVRE const ML_BACKEND='https://foura-loja-backend.onrender.com'; let mlPedidosTodos=[],mlAnunciosTodos=[]; let mlTabAtual='pedidos'; function mlSetTab(tab){ mlTabAtual=tab; ['pedidos','anuncios'].forEach(t=>{ const btn=document.getElementById('mltab-'+t); const content=document.getElementById('mltab-content-'+t); if(btn)btn.style.cssText=`padding:8px 20px;font-size:13px;font-weight:700;border-radius:var(--r);border:none;cursor:pointer;font-family:var(--font-sans);transition:all .15s;background:${t===tab?'var(--blue)':'transparent'};color:${t===tab?'#fff':'var(--text2)'}`; if(content)content.style.display=t===tab?'block':'none'; }); if(tab==='anuncios'&&!mlAnunciosTodos.length)mlCarregarAnuncios(); } async function mlChecarStatus(){ const dot=document.getElementById('ml-status-dot'); const txt=document.getElementById('ml-status-txt'); const exp=document.getElementById('ml-status-exp'); const live=document.getElementById('ml-live-badge'); const lbl=document.getElementById('ml-sync-label'); try{ const r=await fetch(ML_BACKEND+'/status'); const d=await r.json(); if(d.conectado){ if(dot){dot.style.background='#4ade80';dot.style.boxShadow='0 0 0 3px rgba(74,222,128,.2)';} if(txt)txt.textContent='✅ Conectado ao Mercado Livre · User ID: '+d.user_id; if(exp)exp.textContent='Expira: '+d.expira_em; if(live)live.style.display='flex'; if(lbl)lbl.textContent='Última sync: '+new Date().toLocaleTimeString('pt-BR',{hour:'2-digit',minute:'2-digit'}); }else{ if(dot){dot.style.background='#f87171';dot.style.boxShadow='0 0 0 3px rgba(248,113,113,.2)';} if(txt)txt.innerHTML='❌ Não conectado — Clique aqui para conectar'; if(live)live.style.display='none'; } }catch(e){ if(dot){dot.style.background='#f59e0b';dot.style.boxShadow='0 0 0 3px rgba(245,158,11,.2)';} if(txt)txt.textContent='⚠ Backend offline — aguarde...'; if(live)live.style.display='none'; } } async function mlCarregarPedidos(){ const body=document.getElementById('ml-body'); if(body)body.innerHTML='
🔄
Buscando pedidos...
'; try{ const r=await fetch(ML_BACKEND+'/pedidos?limite=100'); const d=await r.json(); mlPedidosTodos=d.pedidos||[]; mlAtualizarMets(); mlFiltrar(); mlCriarRomaneiosAutomaticos(mlPedidosTodos); }catch(e){ if(body)body.innerHTML='
⚠
Erro ao carregar pedidos.
'+e.message+'
'; } } function mlCriarRomaneiosAutomaticos(pedidos){ if(!S.romaneios)S.romaneios=[]; const jaImportados=new Set(S.romaneios.filter(r=>r.mlPedidoId).map(r=>r.mlPedidoId)); const pagos=pedidos.filter(p=>p.status==='paid'&&!jaImportados.has(String(p.id))); if(!pagos.length)return; let criados=0; pagos.forEach(p=>{ const itens=[]; (p.itens||[]).forEach(i=>{ const match=buscarPorCodigo(i.sku||'')||buscarPorNome(i.titulo); if(match){ const[pid,prod]=match; itens.push({pid,nome:prod.nome,qtdPedida:i.quantidade,qtdConferida:0}); }else{ itens.push({pid:'_ml_'+Date.now(),nome:i.titulo,qtdPedida:i.quantidade,qtdConferida:0,semEstoque:true}); } }); // Calcular data de despacho let dataDespacho=p.data_despacho||null; if(!dataDespacho){ // fallback: 3 dias úteis após a venda const dt=new Date(p.dataTs||Date.now()); let dias=0,d=new Date(dt); while(dias<3){d.setDate(d.getDate()+1);if(d.getDay()!==0&&d.getDay()!==6)dias++;} dataDespacho=d.toLocaleDateString('pt-BR'); } const num=gerarNumeroPedido(); S.romaneios.unshift({ id:'rom_ml_'+p.id, nome:`${num} · ML #${p.id}`, canal:'ml', obs:'Comprador: '+p.comprador, status:'montando', itens, criadoEm:p.data+' (ML)', criadoTs:p.dataTs||Date.now(), mlPedidoId:String(p.id), mlTotal:p.total, mlComprador:p.comprador, dataDespacho, dataDespachoTs:dataDespacho?parseDateBR(dataDespacho):0, }); criados++; }); if(criados>0){ delaySalvar(); clShowToast('🛒 '+criados+' pedido(s) ML → Romaneio criado!','kit'); if(document.getElementById('sec-romaneio')?.classList.contains('active'))renderRomaneios(); } } function parseDateBR(str){ if(!str)return 0; const[d,m,a]=str.split('/').map(Number); return new Date(a,m-1,d).getTime(); } function buscarPorNome(nome){ if(!nome)return null; const n=nome.toLowerCase(); return Object.entries(S.products||{}).find(([,p])=>p.nome.toLowerCase()===n||n.includes(p.nome.toLowerCase())||p.nome.toLowerCase().includes(n.split(' ').slice(0,3).join(' '))); } function mlAtualizarMets(){ const el=document.getElementById('ml-mets');if(!el)return; const pagos=mlPedidosTodos.filter(p=>p.status==='paid'); const total=pagos.reduce((a,p)=>a+(p.total||0),0); const cancelados=mlPedidosTodos.filter(p=>p.status==='cancelled').length; const pendentes=mlPedidosTodos.filter(p=>p.status==='pending').length; const ticket=pagos.length?total/pagos.length:0; el.innerHTML=[ ['📦','Pedidos',mlPedidosTodos.length,'no período','',''], ['✅','Pagos',pagos.length,'confirmados','border-color:var(--green-bd)','color:#4ade80'], ['💰','Faturamento',fmtK(total),'ticket médio: '+fmt(ticket),'border-color:var(--green-bd)','color:#4ade80'], ['❌','Cancelados',cancelados,pendentes+' pendentes','border-color:var(--orange-bd)','color:#fbbf24'], ].map(([icon,lbl,val,sub,st,valSt])=>`
${icon}
${lbl}
${val}
${sub}
`).join(''); } function mlFiltrar(){ const q=(document.getElementById('ml-q')?.value||'').toLowerCase(); const sf=document.getElementById('ml-status-f')?.value||''; const dias=parseInt(document.getElementById('ml-period-f')?.value||30); const agr=Date.now(); let lista=mlPedidosTodos.filter(p=>{ if(sf&&p.status!==sf)return false; if(dias>0){const[d,m,a]=(p.data||'').split('/').map(Number);const dt=new Date(a,m-1,d).getTime();if(agr-dt>dias*86400000)return false;} if(q){const txt=(p.id+p.comprador+(p.itens||[]).map(i=>i.titulo).join(' ')).toLowerCase();if(!txt.includes(q))return false;} return true; }); const cnt=document.getElementById('ml-filtro-count'); if(cnt)cnt.textContent=lista.length+' pedido(s)'; mlRenderPedidos(lista); } function mlRenderPedidos(lista){ const body=document.getElementById('ml-body'); if(!body)return; if(!lista.length){body.innerHTML='
🔍
Nenhum pedido encontrado.
';return;} const statusCfg={ paid:{cor:'#4ade80',bg:'var(--green-lt)',bd:'var(--green-bd)',txt:'✅ Pago'}, pending:{cor:'#fbbf24',bg:'var(--orange-lt)',bd:'var(--orange-bd)',txt:'⏳ Pendente'}, cancelled:{cor:'#f87171',bg:'var(--red-lt)',bd:'var(--red-bd)',txt:'❌ Cancelado'} }; body.innerHTML=lista.slice(0,80).map(p=>{ const sc=statusCfg[p.status]||{cor:'#aaa',bg:'var(--surface2)',bd:'var(--border)',txt:p.status}; const itens=(p.itens||[]).map(i=>`
${i.quantidade}×${i.titulo.length>42?i.titulo.slice(0,42)+'…':i.titulo}
`).join(''); const despacho=p.data_despacho||'—'; const hoje=new Date();hoje.setHours(0,0,0,0); const dts=p.dataDespachoTs||0; const diff=dts?Math.round((dts-hoje.getTime())/86400000):99; const despColor=diff<0?'#f87171':diff===0?'#f87171':diff===1?'#fbbf24':'var(--text2)'; const despLabel=diff<0?'⚠ ATRASADO':diff===0?'🔴 HOJE':diff===1?'🟠 AMANHÃ':despacho; return` ${p.data} #${p.id} ${itens} ${despLabel} ${fmt(p.total)} ${sc.txt} ${p.comprador} `; }).join(''); } async function mlCarregarAnuncios(){ const body=document.getElementById('ml-anuncios-body'); const cnt=document.getElementById('ml-anuncios-count'); if(body)body.innerHTML='
🔄
Carregando anúncios...
'; try{ const r=await fetch(ML_BACKEND+'/anuncios?limite=50'); const d=await r.json(); mlAnunciosTodos=Array.isArray(d)?d:[]; if(cnt)cnt.textContent=mlAnunciosTodos.length+' anúncios'; mlRenderAnuncios(); }catch(e){ if(body)body.innerHTML='
Erro ao carregar anúncios.
'; } } function mlRenderAnuncios(){ const body=document.getElementById('ml-anuncios-body'); if(!body)return; if(!mlAnunciosTodos.length){body.innerHTML='
📦
Nenhum anúncio encontrado.
';return;} body.innerHTML=mlAnunciosTodos.map(a=>{ const match=buscarPorCodigo(a.sku||a.titulo); const est4a=match?getSaldo(match[0]):null; const diff=est4a!==null?est4a-a.quantidade:null; const diffColor=diff===null?'#555':diff===0?'#4ade80':diff>0?'#fbbf24':'#f87171'; const diffTxt=diff===null?'—':diff===0?'✅ OK':diff>0?'↑ +'+diff:'↓ '+diff; const statusColor=a.status==='active'?'#4ade80':'#f87171'; return`
${a.titulo.length>45?a.titulo.slice(0,45)+'…':a.titulo}
${a.status==='active'?'ATIVO':'PAUSADO'} 🔗 ver anúncio
${a.sku||'—'} ${fmt(a.preco)} ${a.quantidade} ${est4a!==null?est4a:'—'} ${diffTxt} ${diff!==null&&diff!==0?``:'—'} `; }).join(''); } async function mlSincUm(itemId, quantidade){ try{ await fetch(ML_BACKEND+'/anuncios/'+itemId+'/estoque',{method:'PATCH',headers:{'Content-Type':'application/json'},body:JSON.stringify({quantidade})}); clShowToast('✅ Estoque sincronizado!','ent'); mlCarregarAnuncios(); }catch(e){clShowToast('❌ Erro ao sincronizar','sai');} } async function mlSincEstoque(){ if(!mlAnunciosTodos.length){clShowToast('⚠ Carregue os anúncios primeiro','sai');return;} let ok=0,err=0; for(const a of mlAnunciosTodos){ const match=buscarPorCodigo(a.sku||''); if(!match)continue; const est4a=getSaldo(match[0]); if(est4a===a.quantidade)continue; try{ await fetch(ML_BACKEND+'/anuncios/'+a.id+'/estoque',{method:'PATCH',headers:{'Content-Type':'application/json'},body:JSON.stringify({quantidade:est4a})}); ok++; }catch(e){err++;} } clShowToast('⚡ Sincronizado: '+ok+' anúncios'+(err?' · '+err+' erros':''),'ent'); mlCarregarAnuncios(); } async function mlCarregar(){ await mlChecarStatus(); await mlCarregarPedidos(); await mlCarregarAnuncios(); } // ── POLLING DE EVENTOS AUTOMÁTICOS ─────────────────────────── let mlUltimoEvento=parseInt(localStorage.getItem('ml_ultimo_evento')||'0'); let mlPollingTimer=null; let mlAutoSyncTimer=null; let mlUltimoPedidoTs=parseInt(localStorage.getItem('ml_ultimo_pedido_ts')||'0'); function mlIniciarPolling(){ if(mlPollingTimer)return; // Verifica eventos do webhook a cada 30s mlPollingTimer=setInterval(mlVerificarEventos, 30000); mlVerificarEventos(); // Verifica novos pedidos direto na API a cada 60s (fallback do webhook) mlAutoSyncTimer=setInterval(mlAutoSyncPedidos, 60000); // Keep-alive: acorda o backend a cada 8 minutos setInterval(()=>{fetch(ML_BACKEND+'/status').catch(()=>{});}, 8*60*1000); console.log('✅ Polling ML iniciado'); } async function mlAutoSyncPedidos(){ // Busca pedidos recentes e processa os novos automaticamente try{ const r=await fetch(ML_BACKEND+'/pedidos?limite=20'); const d=await r.json(); if(!d.pedidos?.length)return; const novos=d.pedidos.filter(p=>p.dataTs>mlUltimoPedidoTs&&p.status==='paid'); if(novos.length){ novos.forEach(p=>{ mlCriarRomaneiosAutomaticos([p]); clShowToast('🛒 Novo pedido pago! ML #'+p.id,'ent'); mlNotificar('🛒 Novo pedido pago!','ML #'+p.id+' · '+p.comprador+' · R$ '+(p.total||0).toLocaleString('pt-BR',{minimumFractionDigits:2})); }); // Atualiza timestamp do pedido mais recente const maisRecente=Math.max(...d.pedidos.map(p=>p.dataTs||0)); if(maisRecente>mlUltimoPedidoTs){ mlUltimoPedidoTs=maisRecente; localStorage.setItem('ml_ultimo_pedido_ts',mlUltimoPedidoTs); } // Atualiza lista se aba ML estiver aberta if(document.getElementById('sec-mercadolivre')?.classList.contains('active')){ mlPedidosTodos=d.pedidos; mlAtualizarMets(); mlFiltrar(); } } // Verifica cancelamentos const cancelados=d.pedidos.filter(p=>p.status==='cancelled'); cancelados.forEach(p=>{ const rom=S.romaneios?.find(r=>r.mlPedidoId===String(p.id)&&r.status!=='concluido'&&r.status!=='cancelado'); if(rom){rom.status='cancelado';delaySalvar();clShowToast('❌ Pedido ML #'+p.id+' cancelado','sai');} }); }catch(e){} } async function mlVerificarEventos(){ try{ const r=await fetch(ML_BACKEND+'/eventos?desde='+mlUltimoEvento); const d=await r.json(); if(!d.eventos||!d.eventos.length)return; d.eventos.forEach(ev=>{ if(ev.tipo==='pedido')mlProcessarEventoPedido(ev); if(ev.tipo==='devolucao')mlProcessarEventoDevolucao(ev); if(ev.ts>mlUltimoEvento)mlUltimoEvento=ev.ts; }); localStorage.setItem('ml_ultimo_evento', mlUltimoEvento); }catch(e){} } function mlProcessarEventoPedido(ev){ const p=ev.pedido; if(!p)return; if(p.status==='paid'){ // Criar romaneio automático mlCriarRomaneiosAutomaticos([p]); clShowToast('🛒 Novo pedido pago! ML #'+p.id,'ent'); mlNotificar('🛒 Novo pedido pago!','ML #'+p.id+' · '+p.comprador+' · R$ '+p.total?.toLocaleString('pt-BR',{minimumFractionDigits:2})); } if(p.status==='cancelled'){ // Marcar romaneio como cancelado se existir const rom=S.romaneios?.find(r=>r.mlPedidoId===String(p.id)); if(rom&&rom.status!=='concluido'){ rom.status='cancelado'; delaySalvar(); if(document.getElementById('sec-romaneio')?.classList.contains('active'))renderRomaneios(); } clShowToast('❌ Pedido ML #'+p.id+' cancelado','sai'); mlNotificar('❌ Pedido cancelado','ML #'+p.id+' · '+p.comprador); } // Atualizar lista ML se a aba estiver aberta if(document.getElementById('sec-mercadolivre')?.classList.contains('active')){ const ex=mlPedidosTodos.findIndex(x=>x.id===p.id); if(ex>=0)mlPedidosTodos[ex]=p;else mlPedidosTodos.unshift(p); mlAtualizarMets();mlFiltrar(); } } function mlProcessarEventoDevolucao(ev){ const c=ev.claim; if(!c)return; // Registrar devolução automática if(!S.devolucoes)S.devolucoes=[]; const jaExiste=S.devolucoes.find(d=>d.mlClaimId===String(c.id)); if(jaExiste)return; const motivoMap={'ITEM_NOT_AS_DESCRIBED':'Divergência de descrição','ITEM_NOT_RECEIVED':'Produto não chegou','DAMAGED_ITEM':'Produto avariado no transporte','WRONG_ITEM':'Produto errado enviado'}; (c.itens||[{titulo:c.itens?.[0]?.titulo||'Produto ML',quantidade:1,preco:0}]).forEach(item=>{ S.devolucoes.push({ id:'dev_ml_'+c.id+'_'+Date.now(), ts:Date.now(), data:c.data||new Date().toLocaleDateString('pt-BR'), produtoId:'', produto:item.titulo||'Produto ML', canalId:'ml', qtd:item.quantidade||1, valorUnit:item.preco||0, prejuizo:(item.quantidade||1)*(item.preco||0), motivo:motivoMap[c.motivo]||c.motivo||'Devolução ML', obs:'[ML AUTO] Claim #'+c.id, resp:'ML Automático', voltouEstoque:false, mlClaimId:String(c.id), }); }); delaySalvar(); clShowToast('↩ Devolução ML registrada automaticamente!','dev'); mlNotificar('↩ Nova devolução ML!','Claim #'+c.id+' · '+c.motivo); if(document.getElementById('sec-devolucoes')?.classList.contains('active'))renderDev(); } function mlNotificar(titulo,corpo){ if(!('Notification'in window))return; if(Notification.permission==='granted'){ new Notification(titulo,{body:corpo,icon:'https://http2.mlstatic.com/frontend-assets/ml-web-navigation/ui-navigation/6.6.92/mercadolibre/logo__large_plus.png'}); }else if(Notification.permission!=='denied'){ Notification.requestPermission().then(p=>{if(p==='granted')new Notification(titulo,{body:corpo});}); } } // INIT gerenciado pelo Firebase Auth observer function atualizarRelogio(){const el=document.getElementById('hd-datetime');if(!el)return;const agr=new Date();const dias=['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'];el.textContent=`${dias[agr.getDay()]} ${agr.toLocaleDateString('pt-BR')} · ${agr.toLocaleTimeString('pt-BR',{hour:'2-digit',minute:'2-digit'})}`;} atualizarRelogio(); setInterval(atualizarRelogio,1000); // Inicia polling ML automaticamente ao abrir o sistema setTimeout(()=>mlIniciarPolling(), 3000);