} function formatDate(dateString) { const date = new Date(dateString); return date.toLocaleDateString('pt-BR'); } /* -------------------- EXPORT / CLEAR -------------------- */ function downloadSales(){ if(state.sales.length===0) return alert('Sem vendas para exportar'); let csv = 'id,table,method,total,ts,items\n'; state.sales.forEach(s=>{ const items = s.items.map(i=>`${i.name} x${i.qty}`).join('; '); csv += `${s.id},"${s.tableName}",${s.method},${s.total},${s.ts},"${items}"\n`; }); const blob=new Blob([csv],{type:'text/csv'}); const url=URL.createObjectURL(blob); const a=document.createElement('a'); a.href=url; a.download='vendas_espeto.csv'; a.click(); URL.revokeObjectURL(url); } function clearAllData(){ if(!confirm('Apagar TODOS os dados (produtos, mesas, vendas e despesas)?')) return; state={products:[],tables:[],sales:[],expenses:[]}; localStorage.removeItem(K_PRODUCTS); localStorage.removeItem(K_TABLES); localStorage.removeItem(K_SALES); localStorage.removeItem(K_EXPENSES); render(); closeModal(); } /* -------------------- DESPESAS (mantidos) -------------------- */ function addExpense(){ const name = document.getElementById('expenseName').value.trim(); const value = parseFloat(document.getElementById('expenseValue').value); if(!name || isNaN(value)) return alert('Preencha nome e valor válidos'); state.expenses.push({id: Date.now(), name, amount: Math.round(value*100)/100, ts: new Date().toISOString()}); document.getElementById('expenseName').value=''; document.getElementById('expenseValue').value=''; saveState(); renderExpenses(); } function editExpense(id){ const e = state.expenses.find(x=>x.id===id); if(!e) return; const n = prompt('Nome da despesa', e.name); if(n===null) return; const v = prompt('Valor (R$)', e.amount); const value = parseFloat(v); if(!n.trim() || isNaN(value)) return alert('Dados inválidos'); e.name = n.trim(); e.amount = Math.round(value*100)/100; saveState(); renderExpenses(); } function removeExpense(id){ if(!confirm('Remover despesa?')) return; state.expenses = state.expenses.filter(x=>x.id!==id); saveState(); renderExpenses(); } function renderExpenses(){ const el = document.getElementById('expensesList'); el.innerHTML=''; if(state.expenses.length===0){ el.innerHTML='
Nenhuma despesa registrada.
'; document.getElementById('expensesTotalText').textContent = 'Total despesas: R$ 0.00'; return; } // mostrar as despesas mais recentes primeiro state.expenses.slice().reverse().forEach(e=>{ const div = document.createElement('div'); div.className='expense'; const date = new Date(e.ts).toLocaleString(); div.innerHTML = `
${escapeHtml(e.name)}
R$ ${Number(e.amount).toFixed(2)} • ${date}
`; el.appendChild(div); }); const total = state.expenses.reduce((s,x)=>s + Number(x.amount||0),0); document.getElementById('expensesTotalText').textContent = `Total despesas: R$ ${total.toFixed(2)}`; } function loadExpenseSamples(){ const samples = [ {id:Date.now()+1, name:'Espetos', amount: 30.00, ts: new Date().toISOString()}, {id:Date.now()+2, name:'Guarnições', amount: 20.00, ts: new Date().toISOString()}, {id:Date.now()+3, name:'Descartáveis', amount: 10.00, ts: new Date().toISOString()}, {id:Date.now()+4, name:'Refrigerantes', amount: 25.00, ts: new Date().toISOString()}, {id:Date.now()+5, name:'Água', amount: 5.00, ts: new Date().toISOString()}, {id:Date.now()+6, name:'Cerveja', amount: 40.00, ts: new Date().toISOString()}, {id:Date.now()+7, name:'Carvão', amount: 35.00, ts: new Date().toISOString()}, {id:Date.now()+8, name:'Gelo', amount: 12.00, ts: new Date().toISOString()}, {id:Date.now()+9, name:'Verduras', amount: 18.00, ts: new Date().toISOString()}, ]; state.expenses = state.expenses.concat(samples); saveState(); renderExpenses(); } /* -------------------- UTIL -------------------- */ fum