PDV Food - Mesas e Comandas

Voltar
0
Total
0
Livres
0
Ocupadas
0
Atenção
0
Críticas
R$ 0,00
Faturamento Aberto
Livre
Ocupada (consumo recente)
+15min sem consumo
+30min sem consumo
`; let printWindow = window.open('', '_blank', 'width=400,height=600'); printWindow.document.write(html); printWindow.document.close(); } function desbloquearComanda() { if (!mesaSelecionada) return; if (!confirm('Desbloquear comanda?\n\nIsso permitirá adicionar novos itens ao pedido.')) { return; } document.getElementById('loading').style.display = 'flex'; fetch(`/food/mesas/${mesaSelecionada.id}/desbloquear`, { method: 'POST', headers: {'Content-Type': 'application/json'} }) .then(r => r.json()) .then(data => { document.getElementById('loading').style.display = 'none'; if (data.success) { // Recarregar detalhes da mesa (agora desbloqueada) carregarDetalhesMesa(mesaSelecionada.id); carregarMesas(); } else { alert(data.message || 'Erro ao desbloquear comanda'); } }) .catch(err => { document.getElementById('loading').style.display = 'none'; alert('Erro: ' + err.message); }); } // ============================================================ // TAXAS // ============================================================ function abrirModalTaxas() { if (!mesaSelecionada || !window.comandaAtual) return; const data = window.comandaAtual; // Preencher campos com valores atuais document.getElementById('taxaServico').value = data.taxa_servico || ''; document.getElementById('taxaCouver').value = data.taxa_couver || ''; document.getElementById('taxaDelivery').value = data.taxa_delivery || ''; // Atualizar totais document.getElementById('taxasSubtotal').textContent = `R$ ${(data.subtotal || 0).toFixed(2).replace('.', ',')}`; atualizarTotalTaxas(); // Carregar motoboys carregarMotoboys(); new bootstrap.Modal(document.getElementById('modalTaxas')).show(); } function carregarMotoboys() { fetch('/food/api/motoboys') .then(r => r.json()) .then(data => { if (data.success) { const select = document.getElementById('motoboySelect'); select.innerHTML = ''; data.motoboys.forEach(m => { select.innerHTML += ''; }); // Selecionar motoboy atual se houver if (window.comandaAtual && window.comandaAtual.motoboy_id) { select.value = window.comandaAtual.motoboy_id; } } }); } function calcularTaxaServico() { if (!window.comandaAtual) return; const subtotal = window.comandaAtual.subtotal || 0; const taxa10 = subtotal * 0.10; document.getElementById('taxaServico').value = taxa10.toFixed(2); atualizarTotalTaxas(); } function atualizarTotalTaxas() { const servico = parseFloat(document.getElementById('taxaServico').value) || 0; const couver = parseFloat(document.getElementById('taxaCouver').value) || 0; const delivery = parseFloat(document.getElementById('taxaDelivery').value) || 0; const totalTaxas = servico + couver + delivery; const subtotal = window.comandaAtual ? (window.comandaAtual.subtotal || 0) : 0; const desconto = window.comandaAtual ? (window.comandaAtual.desconto || 0) : 0; const valorFinal = subtotal + totalTaxas - desconto; document.getElementById('taxasTotal').textContent = `R$ ${totalTaxas.toFixed(2).replace('.', ',')}`; document.getElementById('taxasValorFinal').textContent = `R$ ${valorFinal.toFixed(2).replace('.', ',')}`; } // Adicionar listeners para atualizar em tempo real (dentro do DOMContentLoaded) document.addEventListener('DOMContentLoaded', function() { var taxaServicoEl = document.getElementById('taxaServico'); var taxaCouverEl = document.getElementById('taxaCouver'); var taxaDeliveryEl = document.getElementById('taxaDelivery'); var numPessoasEl = document.getElementById('numPessoas'); if (taxaServicoEl) taxaServicoEl.addEventListener('input', atualizarTotalTaxas); if (taxaCouverEl) taxaCouverEl.addEventListener('input', atualizarTotalTaxas); if (taxaDeliveryEl) taxaDeliveryEl.addEventListener('input', atualizarTotalTaxas); if (numPessoasEl) numPessoasEl.addEventListener('input', calcularDivisao); }); function salvarTaxas() { if (!window.comandaAtual) return; const dados = { taxa_servico: parseFloat(document.getElementById('taxaServico').value) || 0, taxa_servico_tipo: 'valor', taxa_couver: parseFloat(document.getElementById('taxaCouver').value) || 0, taxa_delivery: parseFloat(document.getElementById('taxaDelivery').value) || 0, motoboy_id: document.getElementById('motoboySelect').value || null }; document.getElementById('loading').style.display = 'flex'; fetch(`/food/api/comandas/${window.comandaAtual.comanda_id}/taxas`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(dados) }) .then(r => r.json()) .then(data => { document.getElementById('loading').style.display = 'none'; if (data.success) { bootstrap.Modal.getInstance(document.getElementById('modalTaxas')).hide(); carregarDetalhesMesa(mesaSelecionada.id); carregarMesas(); } else { alert(data.message || 'Erro ao salvar taxas'); } }) .catch(err => { document.getElementById('loading').style.display = 'none'; alert('Erro: ' + err.message); }); } // ============================================================ // JUNTAR MESAS // ============================================================ function abrirModalJuntar() { if (!mesaSelecionada) return; // Carregar mesas ocupadas (exceto a atual) const select = document.getElementById('mesaDestinoSelect'); select.innerHTML = ''; mesasData.filter(m => m.status !== 'livre' && m.id !== mesaSelecionada.id ).forEach(m => { select.innerHTML += ''; }); new bootstrap.Modal(document.getElementById('modalJuntar')).show(); } function confirmarJuntar() { const mesaDestinoId = document.getElementById('mesaDestinoSelect').value; if (!mesaDestinoId) { alert('Selecione a mesa de destino'); return; } if (!confirm('Confirma a junção das mesas?\n\nTodos os itens serão transferidos para a mesa selecionada.')) { return; } document.getElementById('loading').style.display = 'flex'; fetch('/food/api/mesas/juntar', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ mesa_origem_id: mesaSelecionada.id, mesa_destino_id: mesaDestinoId }) }) .then(r => r.json()) .then(data => { document.getElementById('loading').style.display = 'none'; if (data.success) { bootstrap.Modal.getInstance(document.getElementById('modalJuntar')).hide(); bootstrap.Modal.getInstance(document.getElementById('modalMesa')).hide(); carregarMesas(); alert(data.message); } else { alert(data.message || 'Erro ao juntar mesas'); } }) .catch(err => { document.getElementById('loading').style.display = 'none'; alert('Erro: ' + err.message); }); } // ============================================================ // SEPARAR MESA // ============================================================ function abrirModalSeparar() { if (!mesaSelecionada || !window.comandaAtual) return; const data = window.comandaAtual; // Listar itens para seleção const container = document.getElementById('itensSeparar'); container.innerHTML = ''; if (data.itens && data.itens.length > 0) { data.itens.forEach(item => { container.innerHTML += ''; }); } // Carregar mesas livres const select = document.getElementById('mesaDestinoSeparar'); select.innerHTML = ''; mesasData.filter(m => m.status === 'livre').forEach(m => { select.innerHTML += ''; }); new bootstrap.Modal(document.getElementById('modalSeparar')).show(); } function confirmarSeparar() { const checkboxes = document.querySelectorAll('#itensSeparar input[type="checkbox"]:checked'); if (checkboxes.length === 0) { alert('Selecione pelo menos um item para separar'); return; } const itensIds = Array.from(checkboxes).map(cb => parseInt(cb.value)); const mesaDestinoId = document.getElementById('mesaDestinoSeparar').value; if (!confirm(`Separar ${itensIds.length} item(ns) para outra mesa?`)) { return; } document.getElementById('loading').style.display = 'flex'; fetch('/food/api/mesas/separar', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ mesa_origem_id: mesaSelecionada.id, itens_ids: itensIds, mesa_destino_id: mesaDestinoId || null }) }) .then(r => r.json()) .then(data => { document.getElementById('loading').style.display = 'none'; if (data.success) { bootstrap.Modal.getInstance(document.getElementById('modalSeparar')).hide(); carregarDetalhesMesa(mesaSelecionada.id); carregarMesas(); alert(data.message); } else { alert(data.message || 'Erro ao separar itens'); } }) .catch(err => { document.getElementById('loading').style.display = 'none'; alert('Erro: ' + err.message); }); } // ============================================================ // DIVIDIR CONTA // ============================================================ function abrirModalDividir() { if (!mesaSelecionada || !window.comandaAtual) return; const data = window.comandaAtual; const numPessoas = data.dividir_em || 2; document.getElementById('numPessoas').value = numPessoas; document.getElementById('dividirTotal').textContent = `R$ ${(data.valor_total || 0).toFixed(2).replace('.', ',')}`; calcularDivisao(); new bootstrap.Modal(document.getElementById('modalDividir')).show(); } function alterarDivisao(delta) { const input = document.getElementById('numPessoas'); let valor = parseInt(input.value) + delta; if (valor < 1) valor = 1; if (valor > 20) valor = 20; input.value = valor; calcularDivisao(); } function calcularDivisao() { if (!window.comandaAtual) return; const numPessoas = parseInt(document.getElementById('numPessoas').value) || 1; const valorTotal = window.comandaAtual.valor_total || 0; const valorPorPessoa = valorTotal / numPessoas; document.getElementById('dividirPorPessoa').textContent = `R$ ${valorPorPessoa.toFixed(2).replace('.', ',')}`; } function confirmarDividir() { if (!window.comandaAtual) return; const numPessoas = parseInt(document.getElementById('numPessoas').value) || 1; document.getElementById('loading').style.display = 'flex'; fetch(`/food/api/comandas/${window.comandaAtual.comanda_id}/dividir`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ dividir_em: numPessoas }) }) .then(r => r.json()) .then(data => { document.getElementById('loading').style.display = 'none'; if (data.success) { bootstrap.Modal.getInstance(document.getElementById('modalDividir')).hide(); carregarDetalhesMesa(mesaSelecionada.id); } else { alert(data.message || 'Erro ao dividir conta'); } }) .catch(err => { document.getElementById('loading').style.display = 'none'; alert('Erro: ' + err.message); }); }