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;
Anterior: Sistema da Padaria Próximo: Sistema da Farmácia