O restaurante do Papai Noel, localizado no coração do Polo Norte, enfrenta desafios para gerenciar o fluxo mágico de clientes durante a temporada de Natal. Com elfos atendentes, renas como clientes e itens exclusivos do cardápio inspirados no espírito natalino, o restaurante precisa de uma base de dados eficiente para organizar suas operações. Os desafios incluem:
Um banco de dados relacional robusto e encantado será a base para organizar todas essas informações e garantir que o restaurante do Papai Noel continue a oferecer uma experiência mágica e impecável durante o Natal.
CREATE DATABASE restaurante;
USE restaurante;
CREATE TABLE cliente (
cpf VARCHAR(11) PRIMARY KEY,
nome VARCHAR(50) NOT NULL,
ativo BOOLEAN NOT NULL DEFAULT 1,
atendente BOOLEAN NOT NULL DEFAULT 0
);
CREATE TABLE categoria (
codigo INTEGER AUTO_INCREMENT PRIMARY KEY,
descricao VARCHAR(50) NOT NULL
);
CREATE TABLE item (
codigo INTEGER AUTO_INCREMENT PRIMARY KEY,
descricao VARCHAR(50) NOT NULL,
valor FLOAT NOT NULL DEFAULT 0,
ativo BOOLEAN NOT NULL DEFAULT 1,
qtdEstoque FLOAT NOT NULL DEFAULT 0,
codCategoria INTEGER NOT NULL,
FOREIGN KEY(codCategoria) REFERENCES categoria(codigo)
);
CREATE TABLE comanda (
codigo INTEGER AUTO_INCREMENT PRIMARY KEY,
mesa INTEGER NOT NULL,
estado VARCHAR(20) NOT NULL DEFAULT 'aberta',
dtHrAbertura DATETIME NOT NULL DEFAULT NOW(),
dtHrEncerramento DATETIME,
valorTotal FLOAT NOT NULL DEFAULT 0,
cpfCliente VARCHAR(11) NOT NULL,
cpfAtendente VARCHAR(11) NOT NULL,
FOREIGN KEY(cpfCliente) REFERENCES cliente(cpf),
FOREIGN KEY(cpfAtendente) REFERENCES cliente(cpf)
);
CREATE TABLE comanda_item (
codComanda INTEGER NOT NULL,
codItem INTEGER NOT NULL,
qtdItem FLOAT NOT NULL,
obs VARCHAR(100),
FOREIGN KEY(codComanda) REFERENCES comanda(codigo),
FOREIGN KEY(codItem) REFERENCES item(codigo)
);
# Inserção de dados de clientes:
INSERT INTO cliente (cpf, nome) VALUES
('12345678901', 'Rodolfo, o Renegado'),
('23456789012', 'Maria, a Estrela Guia'),
('34567890123', 'Jingle Bells'),
('45678901234', 'Clara, a Mãe Natalina');
# Inserção de dados de atendentes:
INSERT INTO cliente (cpf, nome, atendente) VALUES
('56789012345', 'Filó, o Mordomo', 1),
('67890123456', 'Lúcia, a Mamãe Noel', 1);
# Inserção de categorias:
INSERT INTO categoria (descricao) VALUES
('Ceia dos Elfos'),
('Delícias do Trenó'),
('Sabores do Pólo Norte');
# Inserção de itens:
INSERT INTO item (descricao, valor, qtdEstoque, codCategoria) VALUES
('Pernil do Papai Noel', 49.90, 100, 1),
('Rabanada Encantada', 19.90, 150, 2),
('Sopa de Neve Mágica', 29.90, 80, 1),
('Torta do Treno', 24.90, 120, 2),
('Capuccino do Pólo Norte', 9.90, 200.4, 3);
# Inserção de comandas:
INSERT INTO comanda (mesa, cpfCliente, cpfAtendente) VALUES
(1, '12345678901', '56789012345'),
(2, '23456789012', '67890123456');
# Inserção de itens em comandas:
INSERT INTO comanda_item (codComanda, codItem, qtdItem) VALUES (2, 3, 1);
INSERT INTO comanda_item (codComanda, codItem, qtdItem, obs) VALUES
(1, 2, 4, 'Rabanadas com bengalas doces'),
(2, 4, 2, 'Torta de chocolate e frutas vermelhas');
# Ver descrição, código e categoria:
SELECT i.*, c.descricao FROM item as i, categoria as c WHERE i.codCategoria = c.codigo;
# Ver CPFs com seus nomes:
SELECT
c.mesa,
ca.cpf AS cpf_atendente,
ca.nome AS nome_atendente,
cl.cpf AS cpf_cliente,
cl.nome AS nome_cliente
FROM
comanda c, cliente ca, cliente cl
WHERE
c.cpfAtendente = ca.cpf
AND c.cpfCliente = cl.cpf;
# Ver itens de comandas:
SELECT ci.codComanda, ci.codItem, i.descricao, ci.qtdItem, ci.obs FROM comanda_item as ci, item as i WHERE ci.codItem = i.codigo;
# Ver comandas abertas:
SELECT
c.codigo AS comanda_codigo,
c.mesa,
c.estado,
c.dtHrAbertura,
c.dtHrEncerramento,
c.valorTotal,
c.cpfCliente AS cpf_cliente,
cl.nome AS nome_cliente,
c.cpfAtendente AS cpf_atendente,
a.nome AS nome_atendente,
ci.codItem AS item_codigo,
i.descricao AS item_nome,
ci.qtdItem,
ci.obs
FROM comanda c
JOIN cliente cl ON c.cpfCliente = cl.cpf
JOIN cliente a ON c.cpfAtendente = a.cpf
JOIN comanda_item ci ON c.codigo = ci.codComanda
JOIN item i ON ci.codItem = i.codigo
WHERE c.estado="aberta"
ORDER BY codComanda;
# Fechar comanda aberta:
UPDATE comanda SET estado="fechada", dtHrEncerramento=NOW() WHERE codigo=1;
# Atualizar valor total da comanda fechada (valor total é a soma do valor total dos seus itens (qtdItem * valor)):
UPDATE comanda c
JOIN (
SELECT
ci.codComanda,
SUM(ci.qtdItem * i.valor) AS total
FROM
comanda_item ci
JOIN
item i ON ci.codItem = i.codigo
GROUP BY
ci.codComanda
) AS subquery ON c.codigo = subquery.codComanda
SET
c.valorTotal = subquery.total
WHERE
c.codigo = 1;
# Fechar comanda 2:
UPDATE comanda SET estado="fechada", dtHrEncerramento=NOW() WHERE codigo=2;
UPDATE comanda c
JOIN (
SELECT
ci.codComanda,
SUM(ci.qtdItem * i.valor) AS total
FROM
comanda_item ci
JOIN
item i ON ci.codItem = i.codigo
GROUP BY
ci.codComanda
) AS subquery ON c.codigo = subquery.codComanda
SET
c.valorTotal = subquery.total
WHERE
c.codigo = 2;
Exportar base de dados via phpMyAdmin
Elaborado por Mateus Schwede
ubsocial.github.io