/* Site DTF — The grade shown to the customer, and the reservations attached to it. Extracted verbatim from the single inline script in web/index.html. Loaded as classic scripts in the order listed there: they share one global scope and run top to bottom, exactly as the original did. */ // ── enviar // Avalia sozinho conforme o cliente sobe e preenche. Devolve o que ainda falta, // para a fila dizer em texto em vez de travar num botão. function avaliar(){ if(ehFolha()){ if(!folhas.length) return {pronto:false, falta:'Arraste sua folha montada para começar.'}; const pdfInvalido=folhas.find(x=>x.measurementError); if(pdfInvalido) return {pronto:false, falta:pdfInvalido.f.name+': '+pdfInvalido.measurementError}; const larga=folhas.find(x=>x.med && x.med.larg > larguraFilme()); if(larga) return {pronto:false, falta:'A folha '+larga.f.name+' tem '+n1(larga.med.larg)+ ' cm e não cabe no filme de '+n1(larguraFilme())+' cm.'}; const semMedida=folhas.filter(x=>!(x.m>0)).length; if(semMedida) return {pronto:false, falta:'Informe o comprimento de '+semMedida+ ' folha'+(semMedida>1?'s':'')+'.'}; metros=folhaTotalM(); reencaixado=false; const ans=folhas.map(x=>x.an).filter(Boolean); if(ans.length!==folhas.length){ // A nota precisa cobrir cada folha faturada. Uma folha sem análise não // herda a nota/desconto de outra folha que o navegador conseguiu abrir. const ausentes=folhas.filter(f=>!f.an); const exts=[...new Set(ausentes.map(f=>extDe(f.f.name)))].join(', '); mostraNota([ ['av','Sem nota · '+exts+' sem análise completa', ausentes.length+' de '+folhas.length+' folha(s) precisam de conferência manual'], ['er','Metro pela tabela · '+rs(TABELA[modo]), 'exportando em PNG ou PDF, cai até '+rs(pisoEscada())], ['fix','Alguém abre seu arquivo','a conferência é feita na mão, na sala'] ], 0, folhas.length>1? folhas.length+' folhas' : folhas[0].f.name, larguraFilme()+' cm · '+fmtM(metros)+' m · preço de tabela'); return {pronto:true}; } const dpi=Math.min(...ans.map(a=>a.dpi)); const n=Math.max(6,Math.min(100,Math.round(dpi/DPI_AVISA*100))); const soma=(k)=>ans.reduce((t,a)=>t+a[k],0); const itens=[ ans.every(a=>a.vetor) ? ['ok','Arte vetorial','sem imagem embutida · imprime em qualquer tamanho'] : [dpi>=DPI_AVISA?'ok':dpi>=DPI_RECUSA?'av':'er','Resolução '+dpi+' DPI', ans.some(a=>a.fonteDpi==='imagens') ? 'média por área das imagens dentro do PDF · pior em '+ Math.min(...ans.map(a=>a.res? a.res.pior : a.dpi))+' DPI' : 'resolução do arquivo · arte ampliada antes de exportar não aparece aqui'], ans.some(a=>a.grande) ? ['ok','Arquivo grande','peças, resíduos e fundo conferidos pela equipe'] : null, ans.some(a=>a.grande) ? null : ['ok', soma('artes')+' peças na folha', Math.round(soma('aproveitamento')/ans.length)+'% da folha virou arte'], ans.some(a=>a.grande) ? null : soma('residuos') ? ['er','Resíduo de recorte', soma('residuos')+' ponto'+(soma('residuos')>1?'s':'')+' abaixo de 2 mm · a impressora imprime'] : ['ok','Sem resíduo de recorte','nada solto na folha'], ans.some(a=>a.grande) ? null : soma('encostadas') ? ['fix', soma('encostadas')+' peças a menos de 5 mm', 'se forem artes diferentes, separamos com 5 mm sem custo'] : ['ok','Espaço entre peças','nenhuma abaixo de 6 mm'], ans.some(a=>a.grande) ? null : ans.some(a=>a.fundoChapado) ? ['er','Fundo chapado','a folha está sem transparência'] : ['ok','Fundo transparente','canal alfa conferido'], null ].filter(Boolean); mostraNota(itens, n, folhas.length>1? folhas.length+' folhas' : folhas[0].f.name, larguraFilme()+' cm · '+fmtM(metros)+' m'); return {pronto:true}; } if(!artes.length) return {pronto:false, falta:'Arraste suas artes para começar.'}; if(artes.some(a=>a.lendo!=null)) return {pronto:false, falta:'Gerando a prévia das artes grandes…'}; if(artes.some(a=>a.decodeError || !(a.src||a.semPrevia) || !(a.px>0) || !(a.py>0))) return {pronto:false, falta:'Não conseguimos ler uma das imagens. Exporte-a novamente em PNG ou JPG antes de continuar.'}; if(artes.some(a=>!Number.isFinite(a.cm) || a.cm>larguraFilme())) return {pronto:false, falta:'A largura da arte precisa caber no filme de '+ n1(larguraFilme())+' cm. Reduza a medida solicitada antes de continuar.'}; const sem=artes.filter(a=>!a.cm).length; if(sem) return {pronto:false, falta:'Informe a largura de '+sem+' arte'+(sem>1?'s':'')+ ' para ver a nota e o preço.'}; // metragem = altura da folha depois de montada, com os 5 mm entre peças metros=+(montagemCm/100).toFixed(4); if(!(metros>0)) return {pronto:false, falta:'Montando a folha…'}; const notas=artes.map(a=>Math.max(6,Math.min(100,Math.round(dpiDe(a)/300*100)))); const media=Math.round(notas.reduce((s,n)=>s+n,0)/notas.length), pior=Math.min(...notas); mostraNota([ ['ok','Montagem por nossa conta','5 mm garantidos'], [cls(pior),'Pior arte em '+pior+'%',pior>=85?'todas em boa resolução':'reenviar maior sai mais barato'] ],media,artes.length+' arte'+(artes.length>1?'s':''), 'folha montada por nós · '+fmtM(metros)+' m'); return {pronto:true}; } // redesenha 220 ms depois da última mexida, para não avaliar a cada tecla let tAval=null; function agendaAvaliacao(){ clearTimeout(tAval); tAval=setTimeout(()=>{ // o produto pode ter sido fechado nesses 220 ms (item foi para o carrinho) if(!modo) return; const r=avaliar(); const el=$('aoVivo'); if(!el) return; if(r.pronto){ el.className='aoVivo pronto'; el.innerHTML='Nota e preço calculados. '+ 'Confira abaixo e feche o pedido.'; }else{ el.className='aoVivo'; el.innerHTML=''+escapeHTML(r.falta)+''; limpaPaineis(); // o carrinho só some se o pedido estiver vazio } },220); } function mostraNota(itens,n,titulo,sub){ nota=n; $('qual').classList.add('on'); $('qNome').textContent=titulo; $('qSub').textContent=sub; const semNota = n===0; $('pct').innerHTML = semNota? '—/100' : n+'/100'; const c = semNota? 'var(--fraco)' : n>=85?'var(--verde)':n>=50?'var(--laranja)':'var(--vermelho)'; $('pct').style.color=c; $('qbi').style.width=(semNota?0:n)+'%'; $('qbi').style.background=c; $('qitens').innerHTML=itens.map(i=> '
A média da folha ficou abaixo de '+DPI_RECUSA+' DPI. Nesse ponto a peça '+ 'sai serrilhada a ponto de não valer o filme. Reenvie maior ou reduza a largura.
'+ 'Parte da arte está abaixo de '+DPI_AVISA+' DPI. Essas peças podem sair '+ 'com traço serrilhado, e isso não tem conserto depois de impresso. '+ 'O resto da folha sai normal.
'+ '