Você está na página 1de 20

Arthur Cech Francisco

Heitor Sabino Roberto


Luiz Carlos Araujo Silva

PROJETO LÓGICO E FÍSICO DE UM BANCO DE DADOS PARA


UM HOTEL
CURSO DE ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
Disciplina: Banco de Dados
Período: Matutino

2º Semestre
2020
Projeto de Sistema de Software de Hotel

Este projeto foi solicitado pela disciplina Engenharia de Software 3 – lista 1

Naturalmente, as atividades solicitadas, referem-se ao uso do UML para a e elaboração do


problema do ponto de vista de Engenharia de Software. Mas esta mesma descrição pode ser
usada na elaboração de um modelo lógico (DER) e físico (script SQL) do banco de dados a ser
desenvolvido para apoiar o sistema.

Considere o texto (extraído do documento original) a seguir:

Descrição:
Com base no relato de: Atores, Casos de Uso e Regras de Negócio, crie o modelo lógico
(MER) e o modelo físico (script sql) de um banco de dados que suporte o Sistema de Software
de Hotel proposto.

Atores:
• Hóspede: este ator representa, como o próprio nome diz, os hóspedes que se hospedam no
hotel. O hóspede pode reservar e alugar quartos.
• Recepção: este ator representa os funcionários que também podem reservar e alugar quartos
para os hóspedes, bem como manter o cadastro de hóspedes, realizar serviços e quitar diárias.
• Sistema de Cartão: este ator representa um sistema externo apresentando integração com o
sistema do hotel para possibilitar o pagamento por meio de cartão de débito ou crédito.
• Se necessário, outro(s) ator(es), inclusive sistemas externos, podem ser identificados.

Casos de Uso:
• CSU01: Reservar Quarto: este caso de uso representa o processo pelo qual um hóspede
pode reservar um ou mais quartos no hotel.
• CSU02: Alugar Quarto: este caso de uso representa o processo pelo qual um hóspede aluga
um ou mais quartos no hotel.
• CSU03: Manter Hóspede: este caso de uso representa a manutenção do cadastro de
hóspedes. Observe que existe um relacionamento de extensão entre esse caso de uso e os
casos de uso Reservar Quarto e Alugar Quarto, uma vez que o hóspede não possua cadastro
no hotel ou seus dados tenham sofrido alguma alteração desde a última reserva ou aluguel, é
necessário registrar ou alterar seu cadastro.
• CSU04: Solicitar Serviço: este caso uso apresenta os passos necessários para que o
hóspede solicite algum dos serviços oferecidos pelo hotel.
• CSU05: Quitar Diárias: Este caso de uso apresenta os passos percorridos por um hóspede
para quitar suas diárias. A quitação das diárias não necessariamente significa o encerramento
da estadia do hotel. Na quitação das diárias é necessário quitar também quaisquer serviços
solicitados ou consumo do frigobar. Por esse motivo existe o relacionamento de extensão entre
esse caso de uso e os casos de uso Quitar Serviços e e Quitar Consumo, onde estão
detalhados os passos para que o hóspede possa quitar essas contas.
• CSU06: Encerrar Estadia: este caso de uso representa o processo pelo qual um hóspede
encerra sua estada no estabelecimento. Observe que há um relacionamento de inclusão com o
caso de uso Quitar Diárias, uma vez que ao encerrar sua estadia, o hóspede deverá quitar as
diárias ainda não pagas.

Regras de Negócio:
• RN01: Os quartos podem ser alugados quando o hóspede chega ao hotel (desde que existam
vagas) ou serem reservados via Web.
• RN02: Caso seja a primeira vez que o hóspede aluga quartos, ou seus dados tenham sofrido
alterações, o hóspede deve ser cadastrado antes de finalizar o aluguel do quarto.
• RN03: Além do aluguel do quarto, o hotel oferece serviços diversos como restaurante, lavar
e/ou passar roupas. Qualquer um desses serviços, se solicitado, será cobrado na quitação das
diárias.
• RN04: O hóspede pode também consumir os produtos contidos no frigobar, que também
serão cobrados na quitação das diárias.
• RN05: As diárias vencem ao meio-dia. A política do hotel exige que as diárias sejam quitadas
semanalmente. Quando o cliente for quitar a fatura, quitará não somente as diárias do(s)
quarto(s) que alugou, mas também qualquer serviço que tenha solicitado e os possíveis itens
consumidos no frigobar.
• RN06: O hóspede, depois de quitar a fatura, pode permanecer no hotel ou encerrar sua
estadia.
• RN07: O pagamento pode ser realizado por meio de cartão de débito ou crédito. Quando o
pagamento for à vista, deve ser aplicado 10% de desconto no valor das diárias, sendo que
esse desconto não será atribuído ao valor dos serviços e dos itens do frigobar.

A partir deste texto, abstraia os elementos necessários em termos de Entidade,


Relacionamentos e atributos, ou, mais especificamente :Tabelas e colunas com suas
designações de chave primária, estrangeira etc. ,de forma a criar um banco para o hotel.

ATIVIDADE DE BANCO DE DADOS PARA A P2


Atividade a ser desenvolvida (em grupos de até 4 pessoas), valendo 2 pontos na P2.
As especificações acima devem ser seguidas, mesmo por integrantes de grupos que
não cursam a referida disciplina.
Devem ser apresentados (em PDF)

1) DER do banco

2) O script mysql de geração do banco contendo os seguintes objetos:

a) O objeto database criando o banco de dados, com sua respectiva conexão.

b) Vários objetos table, descrevendo as tabelas do modelo

c) Pelo menos 2 objetos view, que relacionem dados entre tabelas.

O mesmo script deve incluir a inserção de dados para inserir:

e) 3 clientes

f) 4 quartos

g) 3 itens de frigobar

h) 2 reservas (clientes reservando quartos)

i) 2 hospedagens (clientes ocupando quartos por um número x de dias)

j) 3 itens de serviços (tais como lavagem de roupa, algum tipo de refeição servido no
quarto, etc

O banco de dados deve conter informações para que o sistema seja capaz de informar qual o
valor a ser pago pelo cliente no fechamento de sua conta de hospedagem incluindo diárias e
itens de consumo (serviço e frigobar).
1.
Model
oLógi
co-Hot
el
2.
a) O objeto database criando o banco de dados, com sua respectiva
conexão.
-- CRIANDO BANCO DE DADOS HOTEL
CREATE DATABASE DB_HOTEL;
USE DB_HOTEL;

b)Vários objetos table, descrevendo as tabelas do modelo


-- CRIANDO TABELA TIPO_DOCUMENTO
CREATE TABLE TB_TIPO_DOCUMENTO (
ID_TIPO_DOCUMENTO TINYINT AUTO_INCREMENT PRIMARY KEY,
TIPO_DOCUMENTO VARCHAR(15) NOT NULL
);

--CRIANDO TABELA HOSPEDE


CREATE TABLE TB_HOSPEDE (
DOCUMENTO_HOSPEDE VARCHAR(14) PRIMARY KEY,
ID_TIPO_DOCUMENTO TINYINT DEFAULT 1,
NOME VARCHAR(70) NOT NULL,
SENHA VARCHAR(60) NOT NULL,
CONSTRAINT FK_HOSPEDE_TP_DOCUMENTO
FOREIGN KEY (ID_TIPO_DOCUMENTO)
REFERENCES TB_TIPO_DOCUMENTO(ID_TIPO_DOCUMENTO)
);

-- CRIANDO TABELA TELEFONE HOSPEDE


CREATE TABLE TB_TELEFONE (
ID_TELEFONE INT PRIMARY KEY AUTO_INCREMENT,
DOCUMENTO_HOSPEDE VARCHAR(14) NOT NULL,
DDI VARCHAR(5) NOT NULL,
DDD VARCHAR(5) NOT NULL,
NUMERO VARCHAR(15) NOT NULL,
CONSTRAINT FK_HOSPEDE_TELEFONE
FOREIGN KEY (DOCUMENTO_HOSPEDE)
REFERENCES TB_HOSPEDE(DOCUMENTO_HOSPEDE)
);

-- CRIANDO TABELA TIPO_LONGRADOURO


CREATE TABLE TB_TIPO_LOGRADOURO (
ID_LOGRADOURO SMALLINT PRIMARY KEY AUTO_INCREMENT,
COD VARCHAR(5) NOT NULL,
TIPO VARCHAR(30) NOT NULL
);
-- CRIANDO TABELA ENDERECO
CREATE TABLE TB_ENDERECO (
ID_ENDERECO INT PRIMARY KEY AUTO_INCREMENT,
DOCUMENTO_HOSPEDE VARCHAR(14) NOT NULL,
ZIP_CODE VARCHAR(12) NOT NULL,
ID_LOGRADOURO SMALLINT NOT NULL,
ENDERECO VARCHAR(50) NOT NULL,
NUMERO VARCHAR(8) NOT NULL,
BAIRRO VARCHAR(30),
CIDADE VARCHAR(30) NOT NULL,
UF CHAR(2),
PAIS VARCHAR(30) NOT NULL,
CONSTRAINT FK_HOSPEDE_ENDERECO
FOREIGN KEY (DOCUMENTO_HOSPEDE)
REFERENCES TB_HOSPEDE(DOCUMENTO_HOSPEDE),
CONSTRAINT FK_LOGRADOURO_ENDERECO
FOREIGN KEY (ID_LOGRADOURO)
REFERENCES TB_TIPO_LOGRADOURO(ID_LOGRADOURO)
);

-- CRIANDO TABELA EMAIL


CREATE TABLE TB_EMAIL (
ID_EMAIL INT AUTO_INCREMENT PRIMARY KEY,
DOCUMENTO_HOSPEDE VARCHAR(14) NOT NULL,
EMAIL VARCHAR(50) NOT NULL,
CONSTRAINT FK_HOSPEDE_EMAIL
FOREIGN KEY (DOCUMENTO_HOSPEDE)
REFERENCES TB_HOSPEDE(DOCUMENTO_HOSPEDE)
);

-- CRIANDO TABELA TIPO_QUARTO


CREATE TABLE TB_TIPO_QUARTO (
ID TINYINT AUTO_INCREMENT PRIMARY KEY,
TIPO_QUARTO VARCHAR(15) NOT NULL,
DESCRICAO VARCHAR(100) NOT NULL,
CAPACIDADE_MAXIMA TINYINT NOT NULL
);

-- CRIANDO TABELA QUARTO


CREATE TABLE TB_QUARTO (
NUM_QUARTO VARCHAR(5) PRIMARY KEY,
ID_TIPO_QUARTO TINYINT NOT NULL,
ANDAR TINYINT NOT NULL,
CORREDOR VARCHAR(3),
STATUS_QUARTO BIT DEFAULT 0,
VALOR_DIARIA DECIMAL(15,2),
CONSTRAINT FK_QUARTO_TIPO_QUARTO
FOREIGN KEY (ID_TIPO_QUARTO)
REFERENCES TB_TIPO_QUARTO(ID)
);

-- CRIANDO TABELA RESERVA


CREATE TABLE TB_RESERVA (
NUM_RESERVA INT PRIMARY KEY AUTO_INCREMENT,
NUM_QUARTO VARCHAR(5) NOT NULL,
DATA_CHECKIN DATE NOT NULL,
DATA_CHECKOUT DATE NOT NULL,
CONSTRAINT FK_RESERVA_QUARTO
FOREIGN KEY (NUM_QUARTO)
REFERENCES TB_QUARTO(NUM_QUARTO)
);

-- CRIANDO TABELA RESERVA_CLIENTE


CREATE TABLE TB_RESERVA_CLIENTE (
NUM_RESERVA INT PRIMARY KEY,
DOCUMENTO_HOSPEDE VARCHAR(14) NOT NULL,
ALUGOU BIT DEFAULT 0,
VENCIDO BIT DEFAULT 0,
CONSTRAINT FK_RESERVA_CLIENTE_RESERVA
FOREIGN KEY (NUM_RESERVA)
REFERENCES TB_RESERVA(NUM_RESERVA),
CONSTRAINT FK_CLIENTE_RESERVA
FOREIGN KEY (DOCUMENTO_HOSPEDE)
REFERENCES TB_HOSPEDE(DOCUMENTO_HOSPEDE)
);

-- CRIANDO TABELA ALUGA


CREATE TABLE TB_ALUGA (
NUM_ALUGA INT PRIMARY KEY AUTO_INCREMENT,
NUM_RESERVA INT,
NUM_QUARTO VARCHAR(5) NOT NULL,
DATA_CHECKIN DATE NOT NULL,
DATA_CHECKOUT DATE NOT NULL,
CONSTRAINT FK_RESERVA_ALUGA
FOREIGN KEY (NUM_RESERVA)
REFERENCES TB_RESERVA_CLIENTE(NUM_RESERVA),
CONSTRAINT FK_QUARTO_ALUGA
FOREIGN KEY (NUM_QUARTO)
REFERENCES TB_QUARTO(NUM_QUARTO)
);

-- CRIANDO TABELA ALUGA_CLIENTE


CREATE TABLE TB_ALUGA_CLIENTE (
NUM_ALUGA INT PRIMARY KEY,
DOCUMENTO_HOSPEDE VARCHAR(14) NOT NULL,
CONSTRAINT FK_ALUGA_CLIENTE_ALUGA
FOREIGN KEY (NUM_ALUGA)
REFERENCES TB_ALUGA(NUM_ALUGA),
CONSTRAINT FK_HOSPEDE_ALUGA
FOREIGN KEY (DOCUMENTO_HOSPEDE)
REFERENCES TB_HOSPEDE(DOCUMENTO_HOSPEDE)
);

-- CRIANDO TABELA PAGAMENTO


CREATE TABLE TB_PAGAMENTO (
ID_PGTO TINYINT AUTO_INCREMENT PRIMARY KEY,
A_VISTA BIT DEFAULT 0
);

-- CRIANDO TABELA DESCONTO


CREATE TABLE TB_DESCONTO (
ID_DESCONTO TINYINT AUTO_INCREMENT PRIMARY KEY,
ID_PGTO TINYINT NOT NULL,
DESCONTO TINYINT DEFAULT 0,
CONSTRAINT FK_PAGAMENTO_DESCONTO
FOREIGN KEY (ID_PGTO)
REFERENCES TB_PAGAMENTO(ID_PGTO)
);

-- CRIANDO TABELA QUITAR_DIARIAS


CREATE TABLE TB_QUITAR_DIARIAS (
ID_QUITAR_DIARIAS INT AUTO_INCREMENT PRIMARY KEY,
NUM_ALUGA INT NOT NULL,
NUM_QUARTO VARCHAR(5) NOT NULL,
ID_PGTO TINYINT NOT NULL,
ID_DESCONTO TINYINT NOT NULL,
STATUS_QUITAR_DIARIA BIT DEFAULT 0,
VALOR_TOTAL_DIARIA DECIMAL(15,2) NOT NULL,
DATA_QUITAR DATE,
CONSTRAINT FK_ALUGA_QUITAR_DIARIAS
FOREIGN KEY (NUM_ALUGA)
REFERENCES TB_ALUGA_CLIENTE(NUM_ALUGA),
CONSTRAINT FK_QUARTO_QUITAR_DIARIAS
FOREIGN KEY (NUM_QUARTO)
REFERENCES TB_QUARTO(NUM_QUARTO),
CONSTRAINT FK_PGTO_QUITAR_DIARIAS
FOREIGN KEY (ID_PGTO)
REFERENCES TB_PAGAMENTO(ID_PGTO),
CONSTRAINT FK_DESCONTO_QUITAR_DIARIAS
FOREIGN KEY (ID_DESCONTO)
REFERENCES TB_DESCONTO(ID_DESCONTO)
);

-- CRIANDO TABELA TIPO_SERVICO


CREATE TABLE TB_TIPO_SERVICO (
COD_TIPO TINYINT AUTO_INCREMENT PRIMARY KEY,
TIPO VARCHAR(20) NOT NULL,
DESCRICAO VARCHAR(100) NOT NULL
);

-- CRIANDO TABELA SERVICO


CREATE TABLE TB_SERVICO (
COD_SERVICO SMALLINT AUTO_INCREMENT PRIMARY KEY,
COD_TIPO TINYINT NOT NULL,
NOME VARCHAR(60) NOT NULL,
VALOR DECIMAL(15,2),
DESCRICAO VARCHAR(300),
CONSTRAINT FK_SERVICO_TIPO_SERVICO
FOREIGN KEY (COD_TIPO)
REFERENCES TB_TIPO_SERVICO(COD_TIPO)
);

-- CRIANDO TABELA SERVICO_PRESTADO


CREATE TABLE TB_SERVICO_PRESTADO (
NUM_SERVICO INT AUTO_INCREMENT,
NUM_ALUGA INT NOT NULL,
PRIMARY KEY(NUM_SERVICO, NUM_ALUGA),
CONSTRAINT FK_ALUGA_CLIENTE_SERVICO
FOREIGN KEY (NUM_ALUGA)
REFERENCES TB_ALUGA_CLIENTE(NUM_ALUGA)
);

-- CRIANDO TABELA ITEM_SERVICO


CREATE TABLE TB_ITEM_SERVICO (
NUM_SERVICO INT,
COD_SERVICO SMALLINT,
DATA_ITEM_SERVICO DATE NOT NULL,
QUANTIDADE TINYINT NOT NULL,
VALOR DECIMAL (15,2),
PRIMARY KEY (NUM_SERVICO, COD_SERVICO),
CONSTRAINT FK_SERVICO_PRESTADO_ITEM_SERVICO
FOREIGN KEY (NUM_SERVICO)
REFERENCES TB_SERVICO_PRESTADO(NUM_SERVICO),
CONSTRAINT FK_SERVICO_ITEM_SERVICO
FOREIGN KEY (COD_SERVICO)
REFERENCES TB_SERVICO(COD_SERVICO)
);

-- CRIANDO TABELA QUITAR_SERVICO


CREATE TABLE TB_QUITAR_SERVICO (
ID_QUITAR_SERVICO INT AUTO_INCREMENT,
NUM_ALUGA INT,
PRIMARY KEY(ID_QUITAR_SERVICO, NUM_ALUGA),
STATUS_QUITAR_SERVICO BIT DEFAULT 0,
VALOR_TOTAL_SERVICOS DECIMAL(15,2) NOT NULL,
CONSTRAINT FK_ALUGA_QUITAR
FOREIGN KEY (NUM_ALUGA)
REFERENCES TB_SERVICO_PRESTADO(NUM_ALUGA)
);

-- CRIANDO TABELA FRIGOBAR


CREATE TABLE TB_FRIGOBAR (
COD_FRIGOBAR SMALLINT AUTO_INCREMENT PRIMARY KEY,
NUM_QUARTO VARCHAR(5) NOT NULL,
CONSTRAINT FK_QUARTO_FRIGOBAR
FOREIGN KEY (NUM_QUARTO)
REFERENCES TB_QUARTO(NUM_QUARTO)
);

-- CRIANDO TABELA TIPO_ITEM


CREATE TABLE TB_TIPO_ITEM (
COD_TIPO_ITEM TINYINT AUTO_INCREMENT PRIMARY KEY,
TIPO_ITEM VARCHAR(20),
DESCRICAO VARCHAR(100)
);

-- CRIANDO TABELA ITEM


CREATE TABLE TB_ITEM (
COD_ITEM SMALLINT AUTO_INCREMENT PRIMARY KEY,
COD_TIPO TINYINT NOT NULL,
NOME VARCHAR(60) NOT NULL,
DESCRICAO VARCHAR(100),
VALOR DECIMAL(15,2),
CONSTRAINT FK_ITEM_TIPO_ITEM
FOREIGN KEY (COD_TIPO)
REFERENCES TB_TIPO_ITEM(COD_TIPO_ITEM)
);

-- CRIANDO TABELA FRIGOBAR


CREATE TABLE TB_ITENS_FRIGOBAR (
COD_ITEM SMALLINT,
COD_FRIGOBAR SMALLINT,
QUANTIDADE TINYINT NOT NULL DEFAULT 1,
PRIMARY KEY(COD_ITEM, COD_FRIGOBAR),
CONSTRAINT FK_ITEM_ITENS_FRIGOBAR
FOREIGN KEY (COD_ITEM)
REFERENCES TB_ITEM(COD_ITEM),
CONSTRAINT FK_FRIGOBAR_ITENS_FRIGOBAR
FOREIGN KEY (COD_FRIGOBAR)
REFERENCES TB_FRIGOBAR(COD_FRIGOBAR)
);

-- CRIANDO TABELA CONSUMO


CREATE TABLE TB_CONSUMO (
NUM_CONSUMO INT AUTO_INCREMENT,
NUM_ALUGA INT,
PRIMARY KEY(NUM_CONSUMO, NUM_ALUGA),
CONSTRAINT FK_ALUGA_CONSUMO
FOREIGN KEY (NUM_ALUGA)
REFERENCES TB_ALUGA_CLIENTE(NUM_ALUGA)
);

-- CRIANDO TABELA ITEM_CONSUMO


CREATE TABLE TB_ITEM_CONSUMO (
NUM_CONSUMO INT AUTO_INCREMENT ,
COD_ITEM SMALLINT,
COD_FRIGOBAR SMALLINT,
QUANTIDADE TINYINT NOT NULL DEFAULT 1,
DATA_CONSUMO DATE NOT NULL,
PRIMARY KEY (NUM_CONSUMO, COD_ITEM, COD_FRIGOBAR),
CONSTRAINT FK_CONSUMO_ITEM_CONSUMO
FOREIGN KEY (NUM_CONSUMO)
REFERENCES TB_CONSUMO(NUM_CONSUMO),
CONSTRAINT FK_ITENS_FRIGOBAR_ITEM_CONSUMO
FOREIGN KEY (COD_ITEM)
REFERENCES TB_ITENS_FRIGOBAR(COD_ITEM),
CONSTRAINT FK_ITENS_FRIGOBAR_ITEM_CONSUMO2
FOREIGN KEY (COD_FRIGOBAR)
REFERENCES TB_ITENS_FRIGOBAR(COD_FRIGOBAR)
);

-- CRIANDO TABELA QUITAR_CONSUMO


CREATE TABLE TB_QUITAR_CONSUMO (
ID_QUITAR_CONSUMO INT AUTO_INCREMENT PRIMARY KEY,
NUM_ALUGA INT NOT NULL,
STATUS_QUITAR_CONSUMO BIT DEFAULT 0,
VALOR_TOTAL_CONSUMO DECIMAL(15,2),
CONSTRAINT FK_CONSUMO_QUITAR_CONSUMO
FOREIGN KEY (NUM_ALUGA)
REFERENCES TB_CONSUMO(NUM_ALUGA)
);

c) Pelo menos 2 objetos view, que relacionem dados entre tabelas.


-- CRIANDO VIEW QUARTO_ALUGA_CLIENTE_STATUS
CREATE VIEW VIEW_QUARTO_ALUGA_CLIENTE_STATUS AS
SELECT Q.NUM_QUARTO, A.NUM_ALUGA, AC.DOCUMENTO_HOSPEDE,
Q.STATUS_QUARTO, A.DATA_CHECKIN AS ENTRADA, A.DATA_CHECKOUT AS SAIDA
FROM TB_QUARTO Q, TB_ALUGA A, TB_ALUGA_CLIENTE AC
WHERE Q.NUM_QUARTO = A.NUM_QUARTO AND A.NUM_ALUGA =
AC.NUM_ALUGA;

-- CRIANDO VIEW VALOR_TOTAL_DIARIAS


CREATE VIEW VIEW_VALOR_TOTAL_DIARIA AS
SELECT V.NUM_ALUGA, V.DOCUMENTO_HOSPEDE, V.NUM_QUARTO,
V.ENTRADA, V.SAIDA, Q.VALOR_DIARIA, Q.VALOR_DIARIA * TIMESTAMPDIFF(DAY,
V.ENTRADA, V.SAIDA) AS VALOR_TOTAL_DIARIA, Q.STATUS_QUARTO
FROM VIEW_QUARTO_ALUGA_CLIENTE_STATUS V, TB_QUARTO Q
WHERE V.NUM_QUARTO = Q.NUM_QUARTO;

-- CRIANDO VIEW FRIGOBAR_QUARTO


CREATE VIEW VIEW_FRIGOBAR_QUARTO AS
SELECT H.DOCUMENTO_HOSPEDE, F.COD_FRIGOBAR, Q.NUM_QUARTO
FROM TB_ALUGA Q, TB_FRIGOBAR F, TB_ALUGA_CLIENTE H
WHERE Q.NUM_QUARTO = F.NUM_QUARTO AND H.NUM_ALUGA =
Q.NUM_ALUGA;
-- CRIANDO VIEW ITENS_CONSUMIDOS_FRIGOBAR
CREATE VIEW VIEW_ITENS_CONSUMIDOS_FRIGOBAR AS
SELECT C.NUM_ALUGA, AC.DOCUMENTO_HOSPEDE, IC.NUM_CONSUMO,
IC.COD_ITEM, I.NOME, I.VALOR AS V_UNITARIO, IC.QUANTIDADE * I.VALOR AS
VALOR_TOTAL
FROM TB_CONSUMO C, TB_ALUGA_CLIENTE AC, TB_ITEM_CONSUMO IC,
TB_ITEM I
WHERE IC.COD_ITEM = I.COD_ITEM AND IC.NUM_CONSUMO =
C.NUM_CONSUMO AND C.NUM_ALUGA = AC.NUM_ALUGA;

-- CRIANDO VIEW SERVICOS_PRESTADOS


CREATE VIEW VIEW_SERVICOS_PRESTADOS AS
SELECT SP.NUM_ALUGA, S2.NUM_SERVICO, AC.DOCUMENTO_HOSPEDE,
S.COD_SERVICO, S2.DATA_ITEM_SERVICO, S.NOME, S.VALOR, S.VALOR *
S2.QUANTIDADE AS VALOR_TOTAL
FROM TB_SERVICO S, TB_ITEM_SERVICO S2, TB_SERVICO_PRESTADO SP,
TB_ALUGA_CLIENTE AC
WHERE S2.COD_SERVICO = S.COD_SERVICO AND S2.NUM_SERVICO =
SP.NUM_SERVICO AND SP.NUM_ALUGA = AC.NUM_ALUGA;

-- CRIANDO VIEW PARA TELEFONES_NOMES


CREATE VIEW VIEW_TELEFONE_NOME AS
SELECT H.NOME, T.DOCUMENTO_HOSPEDE, CONCAT(T.DDI, " ", T.DDD, " ",
T.NUMERO) AS NUMERO_TELEFONE FROM TB_TELEFONE T
JOIN TB_HOSPEDE H ON T.DOCUMENTO_HOSPEDE =
H.DOCUMENTO_HOSPEDE ORDER BY H.NOME;

O mesmo script deve incluir a inserção de dados para inserir:


d) 3 clientes
-- INSERINDO TIPOS DE DOCUMENTOS
INSERT INTO TB_TIPO_DOCUMENTO (TIPO_DOCUMENTO) VALUES ("CPF"),
("PASSAPORTE");

-- INSERINDO HÓSPEDES
INSERT INTO TB_HOSPEDE (DOCUMENTO_HOSPEDE, ID_TIPO_DOCUMENTO, NOME,
SENHA) VALUES
("754.152.745-85", 1, "Luiz Araujo",
"$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtV"),
("787.191.444-15", 1, "Arthur Cech",
"$2a$10$KssILxWNR6k62B7yiX0GAe2Q7w"),
("133.155.785-12", 1, "Heitor Sabino",
"%fg$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrz"),
("C014215AB", 2, "Erika Mustermann",
"$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3Lq");

e) 4 quartos
-- INSERINDO TIPO DE QUARTOS
INSERT INTO TB_TIPO_QUARTO (TIPO_QUARTO, DESCRICAO,
CAPACIDADE_MAXIMA) VALUES
("Solteiro", "Como o próprio nome sugere, ele é o quarto indicado para quem
viaja sozinho.", 1),
("Duplo Solteiro", "Ideal para quem viaja em grupo de amigos ou de família.",
5),
("Casal", "Possui uma cama de casal.", 2),
("Master","Quartos mais luxuosos.", 8),
("Master Superior", "Quartos mais luxusos.", 10);

-- INSERINDO QUARTOS
INSERT INTO TB_QUARTO (NUM_QUARTO, ID_TIPO_QUARTO, ANDAR, CORREDOR,
STATUS_QUARTO, VALOR_DIARIA) VALUES
("15A", 2, 1, "1B", 0, 85.00), ("179D", 1, 17, "1", 0, 450.00),
("1710", 4, 17, "1", 0, 450.00), ("178A", 3, 17, "1", 0, 450.00),
("138", 3, 13, "13", 0, 120.00), ("35A", 4, 3, "1", 0, 200.00),
("17", 2, 1, "1", 0, 450.00), ("95D", 3, 9, "1", 0, 450.00),
("25B", 1, 2, "1", 0, 450.00), ("17b", 4, 1, "1", 0, 450.00);

f) 3 itens de frigobar
-- INSERINDO FRIGOBARES EM TODOS OS QUARTOS
INSERT INTO TB_FRIGOBAR (NUM_QUARTO) VALUES ("15A"), ("179D"), ("1710"),
("178A"), ("138"), ("35A"), ("17"), ("95D"), ("25B"), ("17B");

-- INSERINDO TIPOS DE ITEMS DO FRIGOBAR


INSERT INTO TB_TIPO_ITEM (TIPO_ITEM, DESCRICAO) VALUES
("Aperitivo", "biscoitos, chocolates, castanhas, etc..."),
("Bebida", "água, cerveja, refrigerante, etc...");

-- INSERINDO ITEMS DE FRIGOBAR


INSERT INTO TB_ITEM (COD_TIPO, NOME, DESCRICAO, VALOR) VALUES (1, "Biscoito
Salgado", "150g", 15.00),
(1, "Biscoito Doce", "150g", 19.00),
(1, "Chocolate", "90g", 17.00),
(1, "Barra de Cereal", "80g", 12.00),
(1, "Castanha de Caju", "100g", 28.00),
(1, "Amendoim", "100g", 20.00),
(1, "Salgadinho de Batata", "120g", 22.00),
(2, "Água Mineral", "500ml", 12.00),
(2, "Água com Gás", "500ml", 15.00),
(2, "Água de Coco", "500ml", 18.00),
(2, "Refrigerante Guaraná", "Normal, 310ml", 13.00),
(2, "Refrigerabte Guaraná", "Light, 310ml", 15.00),
(2, "Refrigerante Cola", "Normal, 600ml", 20.00),
(2, "Refrigerante COla", "Light, 600ml", 22.00),
(2, "Cerveja", "4,7% de volume alcoolico, 310ml", 17.00);

-- INSERINDO ITENS NO FRIGOBAR


INSERT INTO TB_ITENS_FRIGOBAR (COD_ITEM, COD_FRIGOBAR, QUANTIDADE)
VALUES (1, 1, 2), (1, 2, 2), (1, 3, 2), (1, 4, 2), (2, 8, 2), (2, 9, 2), (2, 10, 2), (3, 6, 2), (3, 7,
2), (3, 8, 2), (3, 9, 2), (3, 10, 2), (5, 3, 2), (5, 4, 2), (5, 5, 2), (5, 6, 2), (5, 7, 2), (5, 8, 2), (5,
9, 2), (5, 10, 2), (6, 1, 2), (6, 2, 2), (13, 4, 2), (13, 5, 2), (13, 6, 2), (13, 7, 2), (13, 8, 2),
(13, 9, 2), (13, 10, 2), (14, 1, 2), (14, 2, 2), (14, 3, 2), (14, 4, 2), (14, 5, 2), (14, 6, 2), (14,
7, 2), (14, 8, 2), (14, 9, 2), (14, 10, 2), (15, 1, 2), (15, 2, 2), (15, 3, 2), (15, 4, 2), (15, 5,
2), (15, 6, 2), (15, 7, 2), (15, 8, 2), (15, 9, 2), (15, 10, 2);

g) 2 reservas (clientes reservando quartos)

-- FAZENDO UMA RESERVA DE QUARTO


INSERT INTO TB_RESERVA (NUM_QUARTO, DATA_CHECKIN, DATA_CHECKOUT)
VALUES
("15A", "2020-12-12", "2020-12-21");
INSERT INTO TB_RESERVA_CLIENTE (NUM_RESERVA, DOCUMENTO_HOSPEDE)
VALUES
((SELECT LAST_INSERT_ID()), (SELECT DOCUMENTO_HOSPEDE FROM
TB_HOSPEDE WHERE DOCUMENTO_HOSPEDE = "754.152.745-85"));

-- FAZENDO MAIS UMA RESERVA DE QUARTO


INSERT INTO TB_RESERVA (NUM_QUARTO, DATA_CHECKIN, DATA_CHECKOUT)
VALUES
("178A", "2020-12-15", "2020-12-18");
INSERT INTO TB_RESERVA_CLIENTE (NUM_RESERVA, DOCUMENTO_HOSPEDE)
VALUES
((SELECT LAST_INSERT_ID()), (SELECT DOCUMENTO_HOSPEDE FROM
TB_HOSPEDE WHERE DOCUMENTO_HOSPEDE = "787.191.444-15"));
h) 2 hospedagens (clientes ocupando quartos por um número x de
dias)
-- ALUGANDO UM QUARTO COM RESERVA
INSERT INTO TB_ALUGA (NUM_RESERVA, NUM_QUARTO, DATA_CHECKIN,
DATA_CHECKOUT)
VALUES (1, (SELECT NUM_QUARTO FROM TB_RESERVA
WHERE NUM_RESERVA = 1), CURDATE(), (SELECT DATA_CHECKOUT FROM
TB_RESERVA WHERE NUM_RESERVA = 1));
SET @reserva = (SELECT NUM_RESERVA FROM TB_ALUGA
WHERE NUM_ALUGA = LAST_INSERT_ID());
INSERT INTO TB_ALUGA_CLIENTE
VALUES ((SELECT NUM_ALUGA FROM TB_ALUGA
WHERE NUM_ALUGA = LAST_INSERT_ID()),
(SELECT H.DOCUMENTO_HOSPEDE FROM TB_RESERVA_CLIENTE H
WHERE H.NUM_RESERVA = (SELECT NUM_RESERVA FROM TB_ALUGA WHERE
NUM_ALUGA = LAST_INSERT_ID())));
SET SQL_SAFE_UPDATES=0;
UPDATE TB_QUARTO SET STATUS_QUARTO = 1 WHERE NUM_QUARTO = (SELECT
NUM_QUARTO FROM TB_ALUGA WHERE NUM_RESERVA = @reserva);

-- ALUGANDO UM QUARTO SEM RESERVA


INSERT INTO TB_ALUGA (NUM_QUARTO, DATA_CHECKIN, DATA_CHECKOUT)
VALUES("1710", CURDATE(), "2020-12-25");
UPDATE TB_QUARTO SET STATUS_QUARTO = 1 WHERE NUM_QUARTO = (SELECT
NUM_QUARTO FROM TB_ALUGA WHERE NUM_ALUGA = LAST_INSERT_ID());
INSERT INTO TB_ALUGA_CLIENTE
VALUES ((SELECT NUM_ALUGA FROM TB_ALUGA WHERE NUM_ALUGA =
LAST_INSERT_ID()), (SELECT DOCUMENTO_HOSPEDE FROM TB_HOSPEDE WHERE
DOCUMENTO_HOSPEDE = "133.155.785-12"));

-- ALUGANDO MAIS UM QUARTO SEM RESERVA


INSERT INTO TB_ALUGA (NUM_QUARTO, DATA_CHECKIN, DATA_CHECKOUT)
VALUES("179D", CURDATE(), "2020-12-23");
UPDATE TB_QUARTO SET STATUS_QUARTO = 1 WHERE NUM_QUARTO = (SELECT
NUM_QUARTO FROM TB_ALUGA WHERE NUM_ALUGA = LAST_INSERT_ID());
INSERT INTO TB_ALUGA_CLIENTE
VALUES ((SELECT NUM_ALUGA FROM TB_ALUGA WHERE NUM_ALUGA =
LAST_INSERT_ID()), (SELECT DOCUMENTO_HOSPEDE FROM TB_HOSPEDE WHERE
DOCUMENTO_HOSPEDE = "C014215AB"));
i) 3 itens de serviços (tais como lavagem de roupa, algum tipo de
refeição servido no quarto, etc
-- INSERINDO TIPOS DE SERVIÇOS
INSERT INTO TB_TIPO_SERVICO (TIPO, DESCRICAO)
VALUES ("Cozinha", "Produção de refeições, pratos de salgados e sobremesas"),
("Lavanderia", "Lavagem de roupas pessoais e de cama."),
("Camareira", "Arrumação de quarto");

-- INSERINDO SERVIÇOS
INSERT INTO TB_SERVICO (COD_TIPO, NOME, VALOR, DESCRICAO) VALUES
(1, "Almoço do Hotel", 52.00, "Arroz, Feijão, Batata, Frango a Milanesa, 1
bebida"),
(1, "Jantar do Hotel", 83.00, "Paeja de Frutos do Mar, 1 bebida"), (1,
"Almoço do Hotel", 52.00, "Arroz, Feijão, Batata, Frango a Milanesa, 1 bebida"),
(1, "Hotel Burguer Picanha", 26.00, "Picanha filetada temperada com alho
frito, queijo mussarela, mostarda, maionese da casa e pão com gergelim."),
(1, "Picanha Cheddar Burguer", 22.00, "Hambúrguer de picanha, queijo
cheddar, cebola caramelizada, maionese da casa e pão brioche."), (2, "Lavagem
até 10kg", 63.00, "Lavagem de roupa até 10kg"), (2, "Lavagem de 10kg a 25kg",
110.00, "Lavagem de roupa de 10kg a 25kg"),
(2, "Passadora de roupa até 10 peças", 45.00, "Passar até 10 peças de
roupa"),
(3, "Arrumar quarto fora do horário", 50.00, "Arrumar quarto fora do horário
de arrumação"),
(3, "Organização local", 65.00, "Organiza locais");

-- ATRIBUIR SERVIÇOS A UM QUARTO ALUGADO - MAIS DE 1 PARA CADA NUMERO


DE SERVIÇO
INSERT INTO TB_SERVICO_PRESTADO (NUM_ALUGA)
VALUES ((SELECT NUM_ALUGA FROM TB_ALUGA_CLIENTE WHERE
DOCUMENTO_HOSPEDE = "C014215AB"));
SET @id = LAST_INSERT_ID();
INSERT INTO TB_ITEM_SERVICO (NUM_SERVICO, COD_SERVICO,
DATA_ITEM_SERVICO, QUANTIDADE, VALOR)
VALUES (@id, 2, "2020-11-17", 3, (SELECT VALOR FROM TB_SERVICO WHERE
COD_SERVICO = 2)),
(@id, 4, "2020-11-17", 3, (SELECT VALOR FROM TB_SERVICO WHERE
COD_SERVICO = 4)),
(@id, 5, "2020-11-17", 1, (SELECT VALOR FROM TB_SERVICO WHERE
COD_SERVICO = 5));
-- ATRIBUIR MAIS SERVIÇOS EM OUTRA DATA
INSERT INTO TB_SERVICO_PRESTADO (NUM_ALUGA)
VALUES ((SELECT NUM_ALUGA FROM TB_ALUGA_CLIENTE WHERE
DOCUMENTO_HOSPEDE = "C014215AB"));
SET @id = LAST_INSERT_ID();
INSERT INTO TB_ITEM_SERVICO (NUM_SERVICO, COD_SERVICO,
DATA_ITEM_SERVICO, QUANTIDADE, VALOR) VALUES
(@id, 8, "2020-11-18", 1, (SELECT VALOR FROM TB_SERVICO WHERE
COD_SERVICO = 8)),
(@id, 10, "2020-11-18", 1, (SELECT VALOR FROM TB_SERVICO WHERE
COD_SERVICO = 10)),
(@id, 9, "2020-11-18", 1, (SELECT VALOR FROM TB_SERVICO WHERE
COD_SERVICO = 11)),
(@id, 7, "2020-11-18", 1, (SELECT VALOR FROM TB_SERVICO WHERE
COD_SERVICO = 12));

O banco de dados deve conter informações para que o sistema seja capaz de informar
qual o valor a ser pago pelo cliente no fechamento de sua conta de hospedagem
incluindo diárias e itens de consumo (serviço e frigobar).

A PARTIR DAQUI TEMOS OUTROS SCRIPTS COMO ATRIBUIR CONSUMO


DO FRIGOBAR, QUITAR SERVIÇOS, QUITAR CONSUMOS, QUITAR
DIÁRIAS.
-- ATRIBUIR CONSUMO DO FRIGOBAR DE UM QUARTO
INSERT INTO TB_CONSUMO (NUM_ALUGA)
VALUES ((SELECT NUM_ALUGA FROM TB_ALUGA_CLIENTE WHERE
DOCUMENTO_HOSPEDE = "C014215AB"));
SET @id = LAST_INSERT_ID();
INSERT INTO TB_ITEM_CONSUMO (NUM_CONSUMO, COD_ITEM,
COD_FRIGOBAR, QUANTIDADE, DATA_CONSUMO)
VALUES (@id, 1, (SELECT COD_FRIGOBAR FROM
VIEW_FRIGOBAR_QUARTO WHERE DOCUMENTO_HOSPEDE =
"C014215AB"), 2, "2020-12-03"),(@id, 5,
(SELECT COD_FRIGOBAR FROM VIEW_FRIGOBAR_QUARTO WHERE
DOCUMENTO_HOSPEDE = "C014215AB"), 2, "2020-12-03"), (@id, 4,
(SELECT COD_FRIGOBAR FROM VIEW_FRIGOBAR_QUARTO WHERE
DOCUMENTO_HOSPEDE = "C014215AB"), 2, "2020-12-03");
-- QUITAR SERVIÇOS
INSERT INTO TB_QUITAR_SERVICO (NUM_ALUGA,
VALOR_TOTAL_SERVICOS)
VALUES ((SELECT NUM_ALUGA FROM TB_ALUGA_CLIENTE WHERE
DOCUMENTO_HOSPEDE = "C014215AB"),
(SELECT SUM(VALOR_TOTAL) FROM
VIEW_SERVICOS_PRESTADOS WHERE DOCUMENTO_HOSPEDE =
"C014215AB"));

-- ATUALIZANDO PAGAMENTO DE SERVIÇOS QUANDO PAGO


UPDATE TB_QUITAR_SERVICO SET STATUS_QUITAR_SERVICO = 1
WHERE NUM_ALUGA =
(SELECT NUM_ALUGA FROM VIEW_VALOR_TOTAL_DIARIA
WHERE DOCUMENTO_HOSPEDE = "C014215AB");

-- QUITAR CONSUMOS
INSERT INTO TB_QUITAR_CONSUMO (NUM_ALUGA,
VALOR_TOTAL_CONSUMO)VALUES
((SELECT DISTINCT NUM_ALUGA FROM
VIEW_ITENS_CONSUMIDOS_FRIGOBAR WHERE DOCUMENTO_HOSPEDE
= "C014215AB"),
(SELECT SUM(VALOR_TOTAL) FROM
VIEW_ITENS_CONSUMIDOS_FRIGOBAR WHERE DOCUMENTO_HOSPEDE
= "C014215AB"));

-- ATUALIZANDO PAGAMENTO DE CONSUMOS QUANDO PAGO


UPDATE TB_QUITAR_CONSUMO SET STATUS_QUITAR_CONSUMO = 1
WHERE NUM_ALUGA =
(SELECT NUM_ALUGA FROM VIEW_VALOR_TOTAL_DIARIA
WHERE DOCUMENTO_HOSPEDE = "C014215AB");

-- QUITAR DIÁRIA
INSERT INTO TB_PAGAMENTO (A_VISTA) VALUES (0);
SET @pag = LAST_INSERT_ID();
SET @a_vista = (SELECT A_VISTA FROM TB_PAGAMENTO WHERE
ID_PGTO = @pag);
-- SE A VISTA IGUAL A 1 RECEBE 10% DE DESCONTO NO VALOR FINAL
INSERT INTO TB_DESCONTO (ID_PGTO, DESCONTO) VALUES(@pag,
(SELECT CASE WHEN @a_vista = 0 THEN 0 WHEN @a_vista = 1 THEN 10
END));
SET @valor_total =
(SELECT VALOR_TOTAL_DIARIA
FROM VIEW_VALOR_TOTAL_DIARIA
WHERE DOCUMENTO_HOSPEDE = "C014215AB");

INSERT INTO TB_QUITAR_DIARIAS (NUM_ALUGA, NUM_QUARTO,


ID_PGTO, ID_DESCONTO, VALOR_TOTAL_DIARIA) VALUES (
(SELECT NUM_ALUGA FROM VIEW_VALOR_TOTAL_DIARIA
WHERE DOCUMENTO_HOSPEDE = "C014215AB"),
(SELECT NUM_QUARTO FROM VIEW_VALOR_TOTAL_DIARIA
WHERE DOCUMENTO_HOSPEDE = "C014215AB"),@pag,
(SELECT ID_DESCONTO FROM TB_DESCONTO WHERE ID_PGTO =
@pag),
(@valor_total - @valor_total * (SELECT DESCONTO FROM
TB_DESCONTO WHERE ID_PGTO = @pag) / 100));

-- ATUALIZANDO PAGAMENTO DAS DIÁRIAS QUANDO PAGO


UPDATE TB_QUITAR_DIARIAS SET STATUS_QUITAR_DIARIA = 1,
DATA_QUITAR =
(SELECT SAIDA FROM VIEW_VALOR_TOTAL_DIARIA WHERE
DOCUMENTO_HOSPEDE = "C014215AB");

-- ATUALIZANDO STATUS DO QUARTO


SET @up = (SELECT NUM_QUARTO FROM VIEW_VALOR_TOTAL_DIARIA
WHERE DOCUMENTO_HOSPEDE = "C014215AB" AND STATUS_QUARTO
= 1);
UPDATE TB_QUARTO SET STATUS_QUARTO = 0 WHERE NUM_QUARTO =
(@up);

Você também pode gostar