Sistema de Gestão da Lanchonete
Caso Prático • Gerenciamento de pedidos, cardápio e mesas
Desenvolva um sistema completo para gerenciar uma lanchonete, incluindo controle de mesas, pedidos, cardápio e relatórios de vendas.
Configuração da Conexão
Configure sua conexão com o Supabase para testar o sistema:
Estrutura do Banco de Dados
categorias
- • id (SERIAL PRIMARY KEY)
- • nome (VARCHAR(100))
- • descricao (TEXT)
- • ativo (BOOLEAN)
- • created_at (TIMESTAMP)
produtos
- • id (SERIAL PRIMARY KEY)
- • nome (VARCHAR(200))
- • categoria_id (INTEGER FK)
- • preco (DECIMAL(10,2))
- • descricao (TEXT)
- • tempo_preparo (INTEGER)
- • disponivel (BOOLEAN)
- • created_at (TIMESTAMP)
mesas
- • id (SERIAL PRIMARY KEY)
- • numero (INTEGER UNIQUE)
- • capacidade (INTEGER)
- • status (VARCHAR(20))
- • localizacao (VARCHAR(100))
- • ativo (BOOLEAN)
- • created_at (TIMESTAMP)
pedidos
- • id (SERIAL PRIMARY KEY)
- • mesa_id (INTEGER FK)
- • cliente_nome (VARCHAR(200))
- • data_pedido (TIMESTAMP)
- • valor_total (DECIMAL(10,2))
- • status (VARCHAR(20))
- • observacoes (TEXT)
- • forma_pagamento (VARCHAR(50))
itens_pedido
- • id (SERIAL PRIMARY KEY)
- • pedido_id (INTEGER FK)
- • produto_id (INTEGER FK)
- • quantidade (INTEGER)
- • preco_unitario (DECIMAL(10,2))
- • subtotal (DECIMAL(10,2))
- • observacoes (TEXT)
- • status (VARCHAR(20))
funcionarios
- • id (SERIAL PRIMARY KEY)
- • nome (VARCHAR(200))
- • cargo (VARCHAR(100))
- • turno (VARCHAR(20))
- • salario (DECIMAL(10,2))
- • data_admissao (DATE)
- • ativo (BOOLEAN)
Layout do Restaurante
Livre
Ocupada
Reservada
Inativa
Novo Pedido
Cardápio
Itens do Cardápio
Pedidos Ativos
Relatórios
Selecione um relatório acima para visualizar os dados
Consultas SQL Úteis
Consultas Comuns
Mesas Ocupadas
SELECT m.numero, m.capacidade, p.cliente_nome
FROM mesas m
JOIN pedidos p ON m.id = p.mesa_id
WHERE m.status = 'ocupada'
AND p.status IN ('preparando', 'servindo');
Pedidos do Dia
SELECT COUNT(*) as total_pedidos,
SUM(valor_total) as faturamento
FROM pedidos
WHERE DATE(data_pedido) = CURRENT_DATE
AND status = 'finalizado';
Itens Mais Pedidos
SELECT pr.nome, SUM(ip.quantidade) as total
FROM produtos pr
JOIN itens_pedido ip ON pr.id = ip.produto_id
JOIN pedidos p ON ip.pedido_id = p.id
WHERE p.status = 'finalizado'
GROUP BY pr.id, pr.nome
ORDER BY total DESC
LIMIT 5;
Consultas Avançadas
Faturamento por Categoria
SELECT c.nome as categoria,
SUM(ip.subtotal) as faturamento,
COUNT(ip.id) as itens_vendidos
FROM categorias c
JOIN produtos pr ON c.id = pr.categoria_id
JOIN itens_pedido ip ON pr.id = ip.produto_id
JOIN pedidos p ON ip.pedido_id = p.id
WHERE p.status = 'finalizado'
GROUP BY c.id, c.nome
ORDER BY faturamento DESC;
Tempo Médio de Atendimento
SELECT m.numero as mesa,
AVG(EXTRACT(EPOCH FROM
(p.updated_at - p.data_pedido))/60) as tempo_medio_min
FROM pedidos p
JOIN mesas m ON p.mesa_id = m.id
WHERE p.status = 'finalizado'
AND DATE(p.data_pedido) = CURRENT_DATE
GROUP BY m.id, m.numero
ORDER BY tempo_medio_min;
Taxa de Ocupação das Mesas
SELECT m.numero,
COUNT(p.id) as total_atendimentos,
SUM(p.valor_total) as faturamento_mesa,
ROUND(AVG(p.valor_total), 2) as ticket_medio
FROM mesas m
LEFT JOIN pedidos p ON m.id = p.mesa_id
AND DATE(p.data_pedido) = CURRENT_DATE
AND p.status = 'finalizado'
WHERE m.ativo = true
GROUP BY m.id, m.numero
ORDER BY faturamento_mesa DESC;