`); w.document.close(); w.focus(); setTimeout(()=>{ w.print(); }, 250); }; // ── Cierre de caja (totales del día de las ventas por caja) ── window.abrirCierre = async () => { const ov = document.getElementById('cierreOverlay'); ov.style.display = 'flex'; const body = document.getElementById('cierreBody'); body.innerHTML = '
Calculando…
'; try { const today = new Date(); today.setHours(0,0,0,0); const snap = await getDocs(query(collection(db,'pedidos'), where('created_at','>=',today))); let count = 0, total = 0; const porMetodo = {}; snap.forEach(d => { const o = d.data(); if (o.canal !== 'caja' || o.estado === 'cancelado') return; count++; total += o.total||0; const m = o.medioPago||'otro'; porMetodo[m] = (porMetodo[m]||0) + (o.total||0); }); const rows = Object.entries(porMetodo).sort((a,b)=>b[1]-a[1]).map(([m,v]) => `
${PAGO_LBL[m]||m}$${v.toLocaleString('es-AR')}
`).join(''); body.innerHTML = `
Ventas por caja hoy${count}
Total$${total.toLocaleString('es-AR')}
Desglose por método de pago
${rows || '
Sin ventas por caja hoy.
'}`; } catch(e) { body.innerHTML = '
No se pudo calcular el cierre.
'; } }; let _toastT; function toast(msg){ const el = document.getElementById('posToast'); el.textContent = msg; el.classList.add('show'); clearTimeout(_toastT); _toastT = setTimeout(()=>el.classList.remove('show'), 2600); }