Buscar

PIM_4semestre2022

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 73 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 73 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 73 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

UNIVERSIDADE PAULISTA 
 
AMIR THALES YOUSSEF MOREIRA – RA N58235-9 
FELIPE GONÇALVES SOARES – RA N58919-1 
LUIZ HENRIQUE RODRIGUES – RA F26803-9 
MARCOS ANJOS DE SANTANA – RA N59502-7 
PHELIPE DE OLIVEIRA COLOMBO – RA F24938-7 
 
 
 
 
 
 
 
 
LEVANTAMENTO E ANÁLISE DE REQUISITOS DE UM SISTEMA DE GESTÃO 
HOTELEIRA 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
São Paulo 
2021
 
 
 
 
AMIR THALES YOUSSEF MOREIRA – RA N58235-9 
FELIPE GONÇALVES SOARES – RA N58919-1 
LUIZ HENRIQUE RODRIGUES – RA F26803-9 
MARCOS ANJOS DE SANTANA – RA N59502-7 
PHELIPE DE OLIVEIRA COLOMBO – RA F24938-7 
 
 
 
 
 
 
 
 
 
 
 
 
LEVANTAMENTO E ANÁLISE DE REQUISITOS DE UM SISTEMA DE GESTÃO 
HOTELEIRA 
 
Projeto Integrado Multidisciplinar do Curso Análise e 
Desenvolvimento de Sistemas da Universidade 
Paulista. 
 
Orientador: Me. Rogério Silva 
 
 
 
 
 
 
 
São Paulo 
2021
 
 
 
 
RESUMO 
 
Projeto de desenvolvimento de um sistema de atendimento de um hotel 
localizado na cidade de Campinas. Durante o projeto, serão analisados os requisitos 
funcionais e não funcionais, produzidos os artefatos UML, definidas a usabilidade e 
aplicação de normas como a LGPD, bem como a fomentação da habilidade de 
trabalhar em grupo em equipe multidisciplinar. 
 
PALAVRAS CHAVE: Hotelaria, Análise de Sistemas, LGPD, UML. 
 
 
 
 
LISTA DE FIGURAS 
 
Figura 1 - Modelo Conceitual .............................................................................. 7 
Figura 2 - Modelo Lógico ..................................................................................... 8 
Figura 3 - Cadastro de Produto........................................................................... 9 
Figura 4 - Cadastro de Funcionário .................................................................... 9 
Figura 5 - Pagamento ........................................................................................ 10 
Figura 6 - Novo Pedido ..................................................................................... 10 
Figura 7 - Nova Reserva ................................................................................... 11 
Figura 8 - Nova Reserva ................................................................................... 11 
Figura 9 - Cadastro ............................................................................................ 12 
Figura 10 - Tela Inicial ....................................................................................... 12 
Figura 11 - Reserva Mobile ............................................................................... 13 
Figura 12 - Cadastro Mobile .............................................................................. 13 
Figura 13 - Diagrama de Caso de Uso ............................................................. 14 
Figura 14 - Diagrama de Classe ....................................................................... 15 
Figura 15 - Diagrama de Sequencia ................................................................. 16 
Figura 16 - Diagrama de Implantação .............................................................. 17 
 
 
 
 
 
 
SUMÁRIO 
 
1 INTRODUÇÃO 5 
1.1 OBJETIVO 5 
1.2 JUSTIFICATIVA 5 
1.3 ABRANGÊNCIA 6 
1.4 ESTRUTURA DO TRABALHO 6 
2 DESENVOLVIMENTO 7 
2.1 BANCO DE DADOS 7 
2.1.1 Modelo Conceitual 7 
2.1.2 Modelo Lógico 7 
2.2 PROJETO DE INTERFACE AO USUÁRIO 8 
2.2.1 Desktop 9 
2.2.2. Modelo Website 11 
2.2.3. Modelo Mobile 12 
2.3 ANÁLISE DE SISTEMAS ORIENTADA A OBJETO 14 
2.3.1 Diagrama de Caso de Uso 14 
2.3.2 Diagrama de Classes 15 
2.3.4 Diagrama de Implantação 16 
2.4 SCRIPTS E HOMOLOGAÇÃO 17 
2.5 MANUAL DE ACESSO AO SISTEMA 17 
2.5.1 Acesso ao Sistema – Modo Funcionário 17 
2.5.2 Menu Principal – Gerente 19 
3 CONCLUSÃO 21 
4 REFERÊNCIAS BIBLIOGRÁFICAS 22 
5 APÊNDICES 23 
 
 
 
 
5 
 
 
 
1 INTRODUÇÃO 
 
O Hotel Casagrande é um tradicional hotel de estrutura familiar, com sede 
cidade de Santos. Apesar de simples, o hotel é reconhecido pela sua excelente 
hospitalidade, proporcionando conforto a todos os hóspedes e turistas que costumam 
passar temporadas no famoso litoral paulista. Fundado em 1970, a gestão do hotel 
vem sendo passada entre gerações da mesma família, e já está em sua terceira 
geração. Ainda que reconhecido e com público cativo, gerir o hotel tornou-se um 
desafio para os netos de seus fundadores, pois não possui um sistema atualizado de 
reservas e gestão do estabelecimento. 
Em busca de atualização tecnológica e otimização de custos e mão de obra 
para gerir o negócio, os netos dos fundadores do hotel solicitaram a uma empresa de 
TI a modernização do sistema, e esta requisição foi devido à grande movimentação 
de turistas que procuram se hospedar no hotel, tendo como principal objetivo agilizar 
o atendimento e melhor gerir a empresa com base na LGPD. 
Para a modernização completa de todo o sistema com o capital disponível, 
seria necessário um total de 4 anos para a finalização do projeto, então, para este 
trabalho foi decidido que somente algumas funcionalidades do sistema serão 
desenvolvidas. 
Este é um caso prático para aplicar a metodologia de análise de sistemas que 
.estamos estudando no quarto semestre de nosso curso, utilizando análise de 
requisitos funcionais e não funcionais da UML, banco de dados, interface com o 
usuário e demais temas que nos permitem projetar e desenvolver um sistema como o 
deste caso. 
Durante este trabalho, iremos detalhar o projeto e seu desenvolvimento 
 
1.1 OBJETIVO 
 
O objetivo deste trabalho é desenvolver o projeto, prototipação e programação 
do sistema de um hotel com base nas linguagens C#, SQLServer, HTML, ASPNET e 
Java. 
 
1.2 JUSTIFICATIVA 
6 
 
 
 
 
A justificativa deste trabalho é utilizar este caso de uso específico para aplicar 
os estudos do quarto semestre do curso de Análise e Desenvolvimento de Sistemas 
da Universidade Paulista. 
 
1.3 ABRANGÊNCIA 
 
O trabalho terá como abrangência a análise de sistemas para a implementação 
do projeto até o seu desenvolvimento. A codificação será anexada ao final deste 
trabalho. 
 
1.4 ESTRUTURA DO TRABALHO 
 
O trabalho seguirá a seguinte premissa para sua estruturação: no segundo 
capítulo, desenvolveremos o estudo ao projeto com base nas matérias que estudamos 
estudando ao longo do curso. 
No terceiro capítulo, concluiremos o trabalho fundamentado nos resultados 
adquiridos neste estudo. 
Nos capítulos seguintes, indicaremos as referências bibliográficas e demais 
apêndices como a codificação do trabalho. 
7 
 
 
 
2 DESENVOLVIMENTO 
 
2.1 BANCO DE DADOS 
 
Abaixo os diagramas conceitual e lógico do banco de dados que será 
implementado no sistema de hotelaria. 
 
2.1.1 Modelo Conceitual 
 
O Diagrama conceitual, que é a “análise dos elementos e fenômenos relevantes 
de uma realidade observada ou imaginada e a posterior formação de um modelo 
abstrato do corpo de conhecimento adquirido (ALMEIDA, 2018), está desenhado 
abaixo 
 
Figura 1 - Modelo Conceitual 
 
Fonte: Autor 
 
 
2.1.2 Modelo Lógico 
 
O item abaixo transforma o modelo conceitual em lógico, já para sua 
8 
 
 
 
implementação na linguagem escolhida: 
 
Figura 2 - Modelo Lógico 
 
Fonte: Autor 
 
2.2 PROTOTIPAÇÃO 
 
Neste item, iremos apresentar a prototipação da interface que será apresentada 
aos usuários, ou seja, o elo que será feito entre o sistema desenvolvido e o usuário. 
Em nosso curso, tivemos uma disciplina dedicada exclusivamente a este tema, a 
interface ao usuário, que é definida como "uma disciplina que se preocupa com o 
design, avaliação e implementação de sistemas computacionais interativos para uso 
9 
 
 
 
humano e como estudo dos principais fenômenos que os cercam“ (ACM 
SIGCHI,1992). Para este projeto, vamos utilizar três interfaces, sendo versões web e 
mobile para acesso ao próprio cliente da rede dehotelaria e a versão desktop, que é 
a que será acessada pelos funcionários do hotel para realizar os demais serviços. A 
seguir os protótipos de tela dos aplicativos desktop, web, e mobile. 
 
2.2.1 Desktop 
 
Os protótipos abaixo definem como serão algumas das aplicações para o uso 
diário do sistema pelos funcionários da rede de hotelaria 
 
Figura 3 - Cadastro de Produto 
 
Fonte: Autor 
 
Figura 4 - Cadastro de Funcionário 
 
Fonte: Autor 
 
10 
 
 
 
Figura 5 - Pagamento 
 
Fonte: Autor 
 
Figura 6 - Novo Pedido 
 
Fonte: Autor 
 
 
11 
 
 
 
Figura 7 - Nova Reserva 
 
Fonte: Autor 
 
2.2.2. Modelo Website 
 
Este modelo será utilizado para que os clientes acessem diretamente a rede de 
hotel para realizar reservas. O foco neste modelo é facilitar o acesso com uma 
interface amigável. 
 
Figura 8 - Nova Reserva 
 
Fonte: Autor 
 
12 
 
 
 
 
 
 
Figura 9 - Cadastro 
 
Fonte: Autor 
 
Figura 10 - Tela Inicial 
 
Fonte: Autor 
 
2.2.3. Modelo Mobile 
 
Esta versão é muito parecida com o acesso via web, mas com foco numa 
aplicação móvel tanto para o sistema Android quanto para iOS. Mais uma vez, o foco 
13 
 
 
 
está em uma interface amigável. 
 
Figura 11 - Reserva Mobile 
 
Fonte: Autor 
 
Figura 12 - Cadastro Mobile 
 
Fonte: Autor 
14 
 
 
 
2.3 ANÁLISE DE SISTEMAS ORIENTADA A OBJETO 
 
Neste capítulo, estamos estudando a UML (Unified Modeling Language), que é 
basicamente uma “linguagem de notação (um jeito de escrever, ilustrar, comunicar) 
para uso em projetos de sistemas” (VENTURA, 2019). Com esta linguagem faremos 
alguns diagramas para apresentar o desenvolvimento de todo o sistema, antes de o 
transformarmos em códigos e scripts. 
 
2.3.1 Diagrama de Caso de Uso 
 
Com este diagrama, apresentamos como os atores se relacionam entre si e 
entre os diferentes casos de uso do sistema. Conseguimos ilustrar, por exemplo, como 
um caso de uso comum na rede de hotelaria como reservar um quarto, pode ter atores 
diferentes, o que simplifica para sua codificação. 
 
Figura 13 - Diagrama de Caso de Uso 
 
Fonte: Autor 
 
15 
 
 
 
2.3.2 Diagrama de Classes 
 
Com estes diagramas, conseguimos identificar as classes, seus atributos e 
métodos. Isso facilita para que possamos criar os bancos de dados e também os 
comportamentos de cada classe quando fizermos a codificação com uma linguagem 
orientada a objetos. 
 
Figura 14 - Diagrama de Classe 
 
Fonte: Autor 
 
 
2.3.3. Diagrama de Sequência 
 
Este diagrama nos ajuda a verificar a sequência de mensagens, respostas e 
afins de nosso sistema. 
16 
 
 
 
Figura 15 - Diagrama de Sequencia 
 
Fonte: Autor 
 
 
2.3.4 Diagrama de Implantação 
 
No diagrama de implantação, temos a visão dos artefatos que iremos utilizar 
no sistema de acordo com os aplicativos e acessos. 
 
17 
 
 
 
Figura 16 - Diagrama de Implantação 
 
Fonte: Autor 
 
 
2.4 SCRIPTS E HOMOLOGAÇÃO 
 
Foram realizados os scripts para criação do banco de dados, testes e 
homologação. Os scripts estão encontrados nos apêndices deste documento. Os 
testes de homologação, basicamente simulam a criação de funcionários, hóspedes, 
produtos, reservas e pedidos, com seus devidos relacionamentos. Isso faz com que 
todo o banco de dados da criação dos dados possa ser testado na prática. 
 
2.5 MANUAL DE ACESSO AO SISTEMA 
 
Este manual básico mostra passo a passo como operar o sistema. 
 
2.5.1 Acesso ao Sistema – Modo Funcionário 
 
Depois de instalada a aplicação, clique no ícone que você será levado à 
primeira tela, de login. Digite seu usuário e senha fornecida por seu gerente e acesse 
o menu principal. 
 
2.5.1.1 Menu Principal - Funcionário 
 
No Menu Principal, você tem acesso aos seguintes itens: 
18 
 
 
 
 
• Alterar Senha 
• Cadastro de Hóspede 
• Check-In 
• Pedidos 
• Check-Out 
 
Clique sobre cada um deles para selecionar a ação desejada. 
 
2.5.1.2 Alterar senha 
 
Ao clicar nesta tela, digite sua nova senha, a mesma senha novamente no 
campo de confirmação e clique em finalizar ou cancelar. 
 
2.5.1.3 Cadastrar Hóspede 
 
Ao clicar sobre o cadastro, você pode fazer uma pesquisa por nome e CPF. 
Caso o hóspede não seja encontrado, clique em “Novo” e inicie o cadastro de novo 
Hóspede. Na tela seguinte, entre com os dados de Nome, CPF, Telefone e Endereço 
do novo hóspede e clique em finalizar o cadastro. É possível alterar algum dado de 
cadastro de hóspede ao selecionar seu cadastro e clicando em “altera”. Para remover 
o registro de algum hóspede, solicite ao seu gerente. 
 
2.5.1.4 Check-In 
 
Para realizar o check-in, digite a data de check-in, a categoria de quarto 
realizada pelo hóspede, a data de check-out e o código do hóspede (este pode ser 
encontrado na tela de cadastro de hóspedes). A tela já mostra o valor da hospedagem 
e clicando em avançar, a tela de pagamento é apresentada. É necessário concluir o 
pagamento para finalizar o check-in. 
 
2.5.1.5 Pedidos 
 
19 
 
 
 
Ao clicar na tela de pedidos, é possível fazer uma pesquisa por pedidos 
realizados pelo número da suíte do hóspede, e também realizar um novo pedido. Ao 
clicar em “Novo”, apresentar o número da suíte do hóspede, o código do produto e a 
quantidade. O valor do pedido é apresentado para que seja informado ao hóspede, e 
ao clicar em “confirmar”, o pedido é adicionado à conta do hóspede. 
 
2.5.1.6 Check Out 
 
Ao clicar em check-out, digite o número da suíte. O sistema faz o cálculo de 
pedidos realizados pelo hóspede e dias adicionais de sua estadia. O sistema faz o 
cálculo, e caso haja algum valor a ser pago pelo hóspede, clique em “realizar 
pagamento” para ser levado à tela de pagamento e finalizar o check-out. 
 
2.5.2 Menu Principal – Gerente 
 
No Menu Principal, o gerente possui todos os acessos de funcionário e mais 
alguns: 
• Funcionário 
• Produto 
Nos acessos já descritos para funcionário, o gerente tem ainda alguns botões 
e a possibilidade de remover hóspedes, remover pedidos e editar valores para check-
in e check-out. Abaixo, descritos os acessos que somente o gerente possui: 
 
2.5.2.1 Funcionário 
 
Neste menu, o gerente possui a possibilidade de adicionar novo funcionário, 
editar cadastro, remover cadastro e pesquisar. Ao clicar em pesquisar, é possível 
pesquisar pela matrícula, nome ou CPF do funcionário. Ao clicar sobre o funcionário, 
é possível editar e remover seu cadastro. Na tela de edição, é possível fazer um reset 
da senha de login, para gerar uma senha temporária ao usuário. Caso deseje criar um 
novo funcionário, clique em “novo”. Insira todos os dados, como nome, matrícula, 
endereço, CPF e login e clique em finalizar. 
 
20 
 
 
 
2.5.2.2 Produto 
 
No menu de produtos, é possível adicionar novos produtos, removê-los do 
catálogo, alterar o estoque e o valor. Na pesquisa, é possível encontrar os produtos 
pelo ID ou nome do produto. Ao pesquisar, clique em altera para alterar valor e 
quantidade ou em remover para removê-lo do catálogo. Ao clicar em “novo”, digite 
todos os dados do produto e clique em finalizar. 
21 
 
 
 
3 CONCLUSÃO 
 
Nesta pesquisa, iniciamos o desenvolvimento de um complexo sistema de uma 
rede de hotelaria. Pudemos desenvolver, com base nas disciplinas que tivemos ao 
longo de todo o curso, o projeto para a instalação do sistema. É possível verificar, 
neste projeto, cada parte necessária para a formação de um sistema, como na 
Engenharia de Software, onde verificamos e aplicamos métodos e técnicas para o 
desenvolvimento; Banco de Dados, que vai armazenar e manipular, em nosso sistema 
todos os diversos dados necessários ao sistema; Programação Orientada a Objetos, 
que nos ajuda, no projeto, a separar todas as classes e fazer sua codificação sobre 
objetos e classes, que facilita muito ao invés de fazer uma programação totalmente 
complexa como uma linguagemestruturada; A interface ao usuário, que faz a união 
deste complexo sistema com o usuário, e será a apresentação do nosso sistema à 
pessoa humana; e na Análise de Sistemas Orientada a Objetos, pudemos fazer todo 
o nosso projeto e desenvolvimento com linguagem como a UML, onde pudemos ter a 
visão de todo o nosso sistema antes de sua codificação; Já com o desenvolvimento 
das linguagens de programação que estudamos no último semestre, pudemos aplicar 
toda essa teoria em um sistema totalmente funcional. 
Houve um grande desafio ao se aplicar, na prática, todos os conceitos que 
estudamos, o que nos mostra que o universo de Análise e Desenvolvimento de 
Sistemas é bem grande, com muito material disponível e muita possibilidade. 
Acreditamos que em um ano, com mais experiência e mais conhecimento técnico, 
seria possível entregar um projeto ainda mais completo e funcional 
22 
 
 
 
4 REFERÊNCIAS BIBLIOGRÁFICAS 
 
ALMEIDA, F. Guia da Modelagem de Dados: introdução & modelo conceitual. 
Disponível em <https://medium.com/@felipeozalmeida/guia-da-modelagem-de-
dados-introdu%C3%A7%C3%A3o-modelo-conceitual-238c1f8be48>. Acesso em 10 
de maio de 2021. 
 
VENTURA, P. O que é UML (Unified Modeling Language). Disponível em 
<https://www.ateomomento.com.br/diagramas-uml/>. Acesso em 18 de maio de 
2021. 
 
ACM SIGCHI.Curricula For Human-Computer Interaction. New York: Association 
for Computing Machinery, 1992 
 
CARDOSO, V.; CARDOSO, G. Sistemas de banco de dados: uma abordagem 
introdutória aplicada. Saraiva, 2012 
 
SEABRA, J. UML. Unified Modelling Language. Uma ferramenta para o Design 
de Software. Ciência Moderna, 2013. 
 
 
 
23 
 
 
 
5 APÊNDICES 
 
Neste item, iremos detalhar os script para implantação de todo o sistema, bem 
como seus testes para homologação. 
 
5.1. BANCO DE DADOS 
/* Lógico_PIM: */ 
 
CREATE DATABASE BDPIM 
 
USE BDPIM 
 
CREATE TABLE Hospede ( 
 codHos INT PRIMARY KEY, 
 Logradouro VARCHAR(255), 
 Endereco1 VARCHAR(255), 
 Endereco2 VARCHAR(255), 
 Numero INT, 
 Nome VARCHAR(255), 
 Sobrenome VARCHAR(255), 
 fk_Telefone_Telefone_PK INT, 
 fk_Reserva_idReserva INT 
); 
 
CREATE TABLE Funcionario ( 
 codFunc INT PRIMARY KEY, 
 Nome VARCHAR(255), 
 Sobrenome VARCHAR(255), 
 CPF VARCHAR(15), 
 Telefone VARCHAR(15), 
 Logradouro VARCHAR(255), 
 Endereco1 VARCHAR(255), 
 Endereco2 VARCHAR(255), 
 Numero INT, 
 fk_Reserva_idReserva INT 
); 
 
CREATE TABLE Reserva ( 
 idReserva INT PRIMARY KEY, 
 Categoria VARCHAR(50), 
 Num_quarto INT, 
 DataCheckin DATE 
); 
 
CREATE TABLE Pedido ( 
 codProd INT, 
 idPedido INT PRIMARY KEY, 
 Quant INT, 
 DataPedido DATE, 
 fk_Reserva_idReserva INT 
); 
 
CREATE TABLE Produto ( 
 Quantidade INT, 
 codProd INT PRIMARY KEY, 
 Descricao VARCHAR(255), 
 Categoria VARCHAR(255), 
 Unidade FLOAT, 
 Valor FLOAT 
); 
 
CREATE TABLE Telefone ( 
 Telefone_PK INT NOT NULL 
PRIMARY KEY, 
 Telefone VARCHAR(15) 
); 
 
CREATE TABLE possui ( 
 fk_Pedido_idPedido INT, 
 fk_Produto_codProd INT 
); 
 
ALTER TABLE Hospede ADD CONSTRAINT 
FK_Hospede_2 
 FOREIGN KEY 
(fk_Telefone_Telefone_PK) 
 REFERENCES Telefone 
(Telefone_PK) 
 ON DELETE NO ACTION; 
 
ALTER TABLE Hospede ADD CONSTRAINT 
FK_Hospede_3 
 FOREIGN KEY 
(fk_Reserva_idReserva) 
 REFERENCES Reserva 
(idReserva) 
 ON DELETE NO ACTION; 
 
ALTER TABLE Funcionario ADD 
CONSTRAINT FK_Funcionario_2 
 FOREIGN KEY 
(fk_Reserva_idReserva) 
 REFERENCES Reserva 
(idReserva) 
 ON DELETE CASCADE; 
 
ALTER TABLE Pedido ADD CONSTRAINT 
FK_Pedido_2 
 FOREIGN KEY 
(fk_Reserva_idReserva) 
 REFERENCES Reserva 
(idReserva) 
 ON DELETE CASCADE; 
 
INSERT INTO Funcionario (codFunc, 
Nome, Sobrenome, CPF, Telefone, 
24 
 
 
 
Logradouro, Endereco1, Numero) 
VALUES (1, 'Adrian', 'Smith', 
'111.111.111-11','11-99999-9999', 'Rua', 
'Pamplona', 600); 
 
INSERT INTO Produto (Quantidade, 
CodProd, Descricao, Categoria, Unidade, 
Valor) 
VALUES (500, 5, 'Agua Mineral', 
'Bebida', '500', 2.50) 
 
INSERT INTO Hospede (CodHos, 
Logradouro, Endereco1, Numero, Nome, 
Sobrenome) 
VALUES (1, 'Avenida', 'Paulista', 
1000, 'Joe', 'Satriani') 
 
INSERT INTO Reserva (idReserva, 
Categoria, Num_quarto, DataCheckin) 
VALUES (200, 'Suite Simples', 
1402, '2021-06-04') 
 
INSERT INTO Pedido (codProd, 
idPedido, Quant, DataPedido, 
fk_Reserva_idReserva) 
VALUES (5, 10, 1, '2021-06-04', 
200) 
 
SELECT * FROM Funcionario 
SELECT * FROM Produto 
SELECT * FROM Hospede 
SELECT * FROM Reserva 
SELECT * FROM Pedido 
 
 
 
 
5.2. MOBILE 
 
5.2.1. Form Activity Login 
 
<?xml version="1.0" 
encoding="utf-8"?> 
<androidx.core.widget.NestedSc
rollView 
 
android:layout_width="match_parent" 
 
android:layout_height="match_parent" 
 android:fillViewport="true" 
 
xmlns:android="http://schemas.android
.com/apk/res/android"> 
 
 
<androidx.constraintlayout.widget.Con
straintLayout 
 
xmlns:app="http://schemas.android.co
m/apk/res-auto" 
 
xmlns:tools="http://schemas.android.co
m/tools" 
 
android:layout_width="match_parent" 
 
android:layout_height="match_parent" 
 
android:background="@drawable/back
ground" 
 
tools:context=".FormLogin"> 
 
 <TextView 
 
android:id="@+id/text_logo" 
 
25 
 
 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
 
android:text="@string/Hotel" 
 android:textSize="30sp" 
 
android:textColor="@color/black" 
 android:textStyle="bold" 
 
android:layout_marginTop="20dp" 
 
app:layout_constraintTop_toTopOf="p
arent" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 /> 
 
 <ImageView 
 android:id="@+id/logo" 
 
android:layout_width="200dp" 
 
android:layout_height="200dp" 
 
android:src="@drawable/chale" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintTop_toBottomOf
="@id/text_logo" 
 /> 
 
 <View 
 
android:id="@+id/containerComponent
s" 
 
style="@style/ContainerComponents" 
 
app:layout_constraintStart_toEndOf="p
arent" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 
app:layout_constraintTop_toBottomOf
="@id/logo" 
 
 /> 
 
 <EditText 
 
android:id="@+id/edit_email" 
 style="@style/Edit_Text" 
 android:hint="Email" 
 
android:drawableRight="@drawable/ic
26 
 
 
 
_email" 
 
android:inputType="textEmailAddress" 
 
app:layout_constraintStart_toEndOf="
@id/containerComponents" 
 
app:layout_constraintEnd_toEndOf="
@id/containerComponents" 
 
app:layout_constraintTop_toTopOf="@
id/containerComponents" 
 /> 
 
 <EditText 
 
android:id="@+id/edit_senha" 
 style="@style/Edit_Text" 
 android:hint="Senha" 
 
android:drawableRight="@drawable/ic
_eye" 
 
android:inputType="numberPassword" 
 
app:layout_constraintStart_toEndOf="
@id/containerComponents" 
 
app:layout_constraintEnd_toEndOf="
@id/containerComponents" 
 
app:layout_constraintTop_toBottomOf
="@id/edit_email" 
 /> 
 
 
<androidx.appcompat.widget.AppCom
patButton 
 
android:id="@+id/bt_entrar" 
 style="@style/Button" 
 
android:text="@string/entrar" 
 
app:layout_constraintStart_toEndOf="p
arent" 
 
app:layout_constraintEnd_toEndOf="p
arent"app:layout_constraintTop_toBottomOf
="@id/edit_senha" 
 /> 
 
 <ProgressBar 
 
android:id="@+id/progressbar" 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
 
android:layout_marginTop="20dp" 
 
android:indeterminateTint="@color/whi
te" 
27 
 
 
 
 
android:visibility="invisible" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 
app:layout_constraintTop_toBottomOf
="@id/containerComponents" 
 /> 
 
 <TextView 
 
android:id="@+id/text_tela_cadastro" 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
 
android:text="@string/text_cadastro" 
 android:textSize="20sp" 
 
android:textColor="@color/white" 
 android:textStyle="bold" 
 
android:layout_marginTop="20dp" 
 
android:layout_marginBottom="30dp" 
 
app:layout_constraintTop_toBottomOf
="@id/progressbar" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 /> 
 
 
</androidx.constraintlayout.widget.Con
straintLayout> 
 
</androidx.core.widget.NestedS
crollView> 
 
 
5.2.2. Activity Cadastro 
 
<?xml version="1.0" 
encoding="utf-8"?> 
<androidx.core.widget.NestedSc
rollView 
 
android:layout_width="match_parent" 
 
android:layout_height="match_parent" 
 android:fillViewport="true" 
 
xmlns:android="http://schemas.android
.com/apk/res/android"> 
 
 
 
28 
 
 
 
<androidx.constraintlayout.widget.Con
straintLayout 
xmlns:android="http://schemas.android
.com/apk/res/android" 
 
xmlns:app="http://schemas.android.co
m/apk/res-auto" 
 
xmlns:tools="http://schemas.android.co
m/tools" 
 
android:layout_width="match_parent" 
 
android:layout_height="match_parent" 
 
android:background="@drawable/back
ground" 
 
tools:context=".CadastroForm"> 
 
 <TextView 
 
android:id="@+id/text_logo" 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
 
android:text="@string/Hotel" 
 android:textSize="30sp" 
 
android:textColor="@color/black" 
 android:textStyle="bold" 
 
android:layout_marginTop="20dp" 
 
app:layout_constraintTop_toTopOf="p
arent" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 /> 
 
 <TextView 
 
android:id="@+id/title_cadastrese" 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
 
android:text="@string/title_cadastro" 
 android:textSize="50sp" 
 
android:textColor="@color/black" 
 android:textStyle="bold" 
 
android:layout_marginTop="100dp" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
29 
 
 
 
arent" 
 
app:layout_constraintTop_toTopOf="p
arent"/> 
 
 <View 
 
android:id="@+id/containerComponent
s" 
 
style="@style/ContainerComponents" 
 
app:layout_constraintTop_toBottomOf
="@id/title_cadastrese" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
arent"/> 
 
 <EditText 
 
android:id="@+id/edit_nome" 
 style="@style/Edit_Text" 
 android:hint="Nome" 
 android:inputType="text" 
 
app:layout_constraintTop_toTopOf="@
id/containerComponents" 
 
app:layout_constraintStart_toStartOf="
@id/containerComponents" 
 
app:layout_constraintEnd_toEndOf="
@id/containerComponents" 
 /> 
 
 <EditText 
 
android:id="@+id/edit_email" 
 style="@style/Edit_Text" 
 android:hint="Email" 
 
android:inputType="textEmailAddress" 
 
android:drawableRight="@drawable/ic
_email" 
 
app:layout_constraintTop_toBottomOf
="@id/edit_nome" 
 
app:layout_constraintStart_toStartOf="
@id/containerComponents" 
 
app:layout_constraintEnd_toEndOf="
@id/containerComponents" 
 /> 
 
 <EditText 
 
android:id="@+id/edit_senha" 
 style="@style/Edit_Text" 
 android:hint="Senha" 
 
android:drawableRight="@drawable/ic
30 
 
 
 
_eye" 
 
android:inputType="numberPassword" 
 
app:layout_constraintTop_toBottomOf
="@id/edit_email" 
 
app:layout_constraintStart_toStartOf="
@id/containerComponents" 
 
app:layout_constraintEnd_toEndOf="
@id/containerComponents" 
 /> 
 
 
<androidx.appcompat.widget.AppCom
patButton 
 
android:id="@+id/bt_cadastrar" 
 style="@style/Button" 
 android:text="Cadastrar" 
 
android:layout_marginTop="30dp" 
 
app:layout_constraintTop_toBottomOf
="@id/containerComponents" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 /> 
 
 
</androidx.constraintlayout.widget.Con
straintLayout> 
 
</androidx.core.widget.NestedS
crollView> 
 
5.2.3. Activity Dados Cadastro 
 
<?xml version="1.0" 
encoding="utf-8"?> 
<androidx.core.widget.NestedSc
rollView 
 
android:layout_width="match_parent" 
 
android:layout_height="match_parent" 
 android:fillViewport="true" 
 
xmlns:android="http://schemas.android
.com/apk/res/android"> 
 
 
<androidx.constraintlayout.widget.Con
straintLayout 
xmlns:android="http://schemas.android
.com/apk/res/android" 
 
xmlns:app="http://schemas.android.co
m/apk/res-auto" 
 
xmlns:tools="http://schemas.android.co
31 
 
 
 
m/tools" 
 
android:layout_width="match_parent" 
 
android:layout_height="match_parent" 
 
android:background="@drawable/back
ground" 
 
tools:context=".DadosCadastro"> 
 
 <TextView 
 
android:id="@+id/text_logo" 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
 
android:text="@string/Hotel" 
 android:textSize="30sp" 
 
android:textColor="@color/black" 
 android:textStyle="bold" 
 
android:layout_marginTop="20dp" 
 
app:layout_constraintTop_toTopOf="p
arent" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 /> 
 
 <ImageView 
 
android:id="@+id/iconeUser" 
 
android:layout_width="50dp" 
 
android:layout_height="50dp" 
 
android:src="@drawable/ic_user" 
 
android:layout_marginLeft="20dp" 
 
android:layout_marginTop="30dp" 
 
app:layout_constraintTop_toBottomOf
="@id/text_logo" 
 
app:layout_constraintStart_toStartOf="
parent" 
 /> 
 
 <TextView 
 
android:id="@+id/textNomeUsuario" 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
 android:text="" 
32 
 
 
 
 
android:textColor="@color/black" 
 android:textStyle="bold" 
 android:textSize="20sp" 
 
android:layout_marginTop="40dp" 
 
android:layout_marginLeft="20dp" 
 
app:layout_constraintTop_toBottomOf="@id/text_logo" 
 
app:layout_constraintStart_toEndOf="
@id/iconeUser" 
 /> 
 
 <ImageView 
 
android:id="@+id/iconeEmail" 
 
android:layout_width="50dp" 
 
android:layout_height="50dp" 
 
android:src="@drawable/ic_email" 
 
android:layout_marginLeft="20dp" 
 
android:layout_marginTop="20dp" 
 
app:layout_constraintTop_toBottomOf
="@id/iconeUser" 
 
app:layout_constraintStart_toStartOf="
parent" 
 /> 
 
 <TextView 
 
android:id="@+id/textEmailUsuario" 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
 android:text="" 
 
android:textColor="@color/black" 
 android:textStyle="bold" 
 android:textSize="20sp" 
 
android:layout_marginTop="40dp" 
 
android:layout_marginLeft="20dp" 
 
app:layout_constraintTop_toBottomOf
="@id/textNomeUsuario" 
 
app:layout_constraintStart_toEndOf="
@id/iconeEmail" 
 /> 
 
 <Button 
 
android:id="@+id/bt_reserva" 
 
android:layout_width="match_parent" 
33 
 
 
 
 
android:layout_height="wrap_content" 
 android:text="Reservas" 
 
android:textColor="@color/white" 
 android:textStyle="bold" 
 android:textSize="18sp" 
 
android:textAllCaps="false" 
 
android:backgroundTint="@color/dark_
blue" 
 android:padding="20dp" 
 
android:layout_margin="20dp" 
 
app:layout_constraintTop_toBottomOf
="@id/textEmailUsuario" 
 /> 
 
 <Button 
 
android:id="@+id/bt_deslogar" 
 
android:layout_width="match_parent" 
 
android:layout_height="wrap_content" 
 android:text="Deslogar" 
 
android:textColor="@color/white" 
 android:textStyle="bold" 
 android:textSize="18sp" 
 
android:textAllCaps="false" 
 
android:backgroundTint="@color/dark_
blue" 
 android:padding="20dp" 
 
android:layout_margin="20dp" 
 
app:layout_constraintTop_toBottomOf
="@id/bt_reserva" 
 /> 
 
 
</androidx.constraintlayout.widget.Con
straintLayout> 
 
</androidx.core.widget.NestedS
crollView> 
 
5.2.4. Activity Reservas 
 
<?xml version="1.0" 
encoding="utf-8"?> 
<androidx.core.widget.NestedSc
rollView 
 
android:layout_width="match_parent" 
 
android:layout_height="match_parent" 
 android:fillViewport="true" 
 
xmlns:android="http://schemas.android
.com/apk/res/android"> 
34 
 
 
 
 
 
<androidx.constraintlayout.widget.Con
straintLayout 
xmlns:android="http://schemas.android
.com/apk/res/android" 
 
xmlns:app="http://schemas.android.co
m/apk/res-auto" 
 
xmlns:tools="http://schemas.android.co
m/tools" 
 
android:layout_width="match_parent" 
 
android:layout_height="match_parent" 
 
android:background="@drawable/back
ground" 
 
tools:context=".ReservaForm"> 
 
 <TextView 
 
android:id="@+id/text_logo" 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
 
android:text="@string/Hotel" 
 android:textSize="30sp" 
 
android:textColor="@color/black" 
 android:textStyle="bold" 
 
android:layout_marginTop="20dp" 
 
app:layout_constraintTop_toTopOf="p
arent" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 /> 
 
 <TextView 
 
android:id="@+id/title_reserva" 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
 
android:text="@string/Suites" 
 android:textSize="50sp" 
 
android:textColor="@color/black" 
 android:textStyle="bold" 
 
android:layout_marginTop="100dp" 
 
app:layout_constraintStart_toStartOf="
parent" 
35 
 
 
 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 
app:layout_constraintTop_toTopOf="p
arent"/> 
 
 <ImageView 
 
android:id="@+id/diarias" 
 
android:layout_width="300dp" 
 
android:layout_height="300dp" 
 
android:src="@drawable/table_diaria" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintTop_toBottomOf
="@id/title_reserva" 
 /> 
 
 <TextView 
 
android:id="@+id/text_contato" 
 
android:layout_width="match_parent" 
 
android:layout_height="wrap_content" 
 
android:text="@string/contato" 
 android:textSize="18sp" 
 
android:textColor="@color/white" 
 android:textStyle="bold" 
 
android:layout_marginTop="20dp" 
 
android:layout_marginBottom="30dp" 
 
android:layout_marginLeft="40dp" 
 
android:layout_marginRight="20dp" 
 
app:layout_constraintTop_toBottomOf
="@id/diarias" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 /> 
 
 <TextView 
 
android:id="@+id/text_website" 
 
android:layout_width="wrap_content" 
 
android:layout_height="wrap_content" 
36 
 
 
 
 
android:text="@string/website" 
 android:textSize="20sp" 
 
android:textColor="@color/white" 
 android:textStyle="bold" 
 
android:layout_marginTop="20dp" 
 
android:layout_marginBottom="30dp" 
 
android:layout_marginLeft="40dp" 
 
android:layout_marginRight="40dp" 
 
app:layout_constraintTop_toBottomOf
="@id/text_contato" 
 
app:layout_constraintStart_toStartOf="
parent" 
 
app:layout_constraintEnd_toEndOf="p
arent" 
 /> 
 
 
</androidx.constraintlayout.widget.Con
straintLayout> 
 
</androidx.core.widget.NestedS
crollView> 
 
5.1.4. Java Class CadastroForm 
 
package br.unip.pim; 
 
import 
androidx.annotation.NonNull; 
import 
androidx.appcompat.app.AppCompatA
ctivity; 
 
import android.graphics.Color; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
 
import 
com.google.android.gms.tasks.OnCom
pleteListener; 
import 
com.google.android.gms.tasks.OnFailu
reListener; 
import 
com.google.android.gms.tasks.OnSucc
essListener; 
import 
com.google.android.gms.tasks.Task; 
import 
com.google.android.material.snackbar.
Snackbar; 
import 
com.google.firebase.auth.AuthResult; 
import 
37 
 
 
 
com.google.firebase.auth.FirebaseAut
h; 
import 
com.google.firebase.auth.FirebaseAut
hInvalidCredentialsException; 
import 
com.google.firebase.auth.FirebaseAut
hUserCollisionException; 
import 
com.google.firebase.auth.FirebaseAut
hWeakPasswordException; 
import 
com.google.firebase.firestore.Docume
ntReference; 
import 
com.google.firebase.firestore.Firebase
Firestore; 
 
import java.util.HashMap; 
import java.util.Map; 
 
public class CadastroForm 
extends AppCompatActivity { 
 private EditText edit_nome, 
edit_email, edit_senha; 
 private Button bt_cadastrar; 
 String[] mensagens = 
{"Preencha todos os campos", 
"Cadastro realizado com sucesso"}; 
 String usuarioID; 
 
 
 @Override 
 protected void 
onCreate(Bundle savedInstanceState){ 
 
super.onCreate(savedInstanceState); 
 
setContentView(R.layout.activity_cada
stro_form); 
 
 
getSupportActionBar().hide(); 
 IniciarComponentes(); 
 
 
bt_cadastrar.setOnClickListener(new 
View.OnClickListener() { 
 @Override 
 public void onClick(View 
v) { 
 
 String nome = 
edit_nome.getText().toString(); 
 String email = 
edit_email.getText().toString(); 
 String senha = 
edit_senha.getText().toString(); 
 
 if(nome.isEmpty() || 
email.isEmpty() || senha.isEmpty()){ 
 Snackbar snackbar 
= 
Snackbar.make(v,mensagens[0],Snack
bar.LENGTH_SHORT); 
38 
 
 
 
 
snackbar.setBackgroundTint(Color.WH
ITE); 
 
snackbar.setTextColor(Color.BLACK); 
 snackbar.show(); 
 
 }else{ 
 
CadastrarUsuario(v); 
 } 
 
 } 
 }); 
 } 
 
 private void 
CadastrarUsuario(View v){ 
 
 String email = 
edit_email.getText().toString(); 
 String senha = 
edit_senha.getText().toString(); 
 
 
FirebaseAuth.getInstance().createUser
WithEmailAndPassword(email, 
senha).addOnCompleteListener(new 
OnCompleteListener<AuthResult>() { 
 @Override 
 public void 
onComplete(@NonNull 
Task<AuthResult> task) { 
 
 if 
(task.isSuccessful()){ 
 
 
SalvarDadosUsuario(); 
 
 Snackbar snackbar 
= 
Snackbar.make(v,mensagens[1],Snack
bar.LENGTH_SHORT); 
 
snackbar.setBackgroundTint(Color.WH
ITE); 
 
snackbar.setTextColor(Color.BLACK); 
 snackbar.show(); 
 }else{ 
 String erro; 
 try { 
 throw 
task.getException(); 
 
 }catch 
(FirebaseAuthWeakPasswordExceptio
n e) { 
 erro = "Digite 
uma senha com no mínimo 6 
caracteres"; 
 }catch 
(FirebaseAuthUserCollisionException 
e) { 
 erro = "Esta conta 
39 
 
 
 
já foi cadastrada;"; 
 }catch 
(FirebaseAuthInvalidCredentialsExcept
ion e) { 
 erro = "Email 
Inválido"; 
 
 }catch (Exception 
e){ 
 erro = "Erro ao 
cadastrar usuário"; 
 
 } 
 
 Snackbar snackbar 
= 
Snackbar.make(v,erro,Snackbar.LENG
TH_SHORT); 
 
snackbar.setBackgroundTint(Color.WH
ITE); 
 
snackbar.setTextColor(Color.BLACK); 
 snackbar.show(); 
 
 } 
 
 } 
 }); 
 
 } 
 
 
 private void 
SalvarDadosUsuario(){ 
 String nome = 
edit_nome.getText().toString(); 
 
 FirebaseFirestore db = 
FirebaseFirestore.getInstance(); 
 
 Map<String,Object> 
usuarios = new HashMap<>(); 
 
usuarios.put("nome",nome); 
 
 usuarioID = 
FirebaseAuth.getInstance().getCurrent
User().getUid(); 
 
 DocumentReference 
documentReference = 
db.collection("Usuarios").document(us
uarioID); 
 
documentReference.set(usuarios).add
OnSuccessListener(new 
OnSuccessListener<Void>() { 
 @Override 
 public void 
onSuccess(Void unused) { 
 Log.d("db","Sucesso 
ao salvar os dados" ); 
 
 } 
 }) 
40 
 
 
 
 
.addOnFailureListener(new 
OnFailureListener() { 
 @Override 
 public void 
onFailure(@NonNull Exception e) { 
 
Log.d("db_error","Erro ao salvar os 
dados"+e.toString()); 
 
 } 
 }); 
 
 } 
 
 private void 
IniciarComponentes(){ 
 
 edit_nome = 
findViewById(R.id.edit_nome); 
 edit_email = 
findViewById(R.id.edit_email); 
 edit_senha = 
findViewById(R.id.edit_senha); 
 bt_cadastrar = 
findViewById(R.id.bt_cadastrar); 
 
 } 
 
 
} 
 
 
5.2.5. Java Class Dados 
Cadastro 
 
package br.unip.pim; 
 
import 
androidx.annotation.Nullable; 
import 
androidx.appcompat.app.AppCompatA
ctivity; 
 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
 
import 
com.google.firebase.auth.FirebaseAut
h; 
import 
com.google.firebase.firestore.Docume
ntReference; 
import 
com.google.firebase.firestore.Docume
ntSnapshot; 
import 
com.google.firebase.firestore.EventList
ener; 
import 
com.google.firebase.firestore.Firebase
Firestore; 
import 
41 
 
 
 
com.google.firebase.firestore.Firebase
FirestoreException; 
 
public class DadosCadastro 
extends AppCompatActivity { 
 
 private TextView 
nomeUsuario,emailUsuario; 
 private Button bt_reserva; 
 private Button bt_deslogar; 
 
 FirebaseFirestore db = 
FirebaseFirestore.getInstance(); 
 String usuarioID; 
 
 @Override 
 protected void 
onCreate(Bundle savedInstanceState) 
{ 
 
super.onCreate(savedInstanceState); 
 
setContentView(R.layout.activity_dado
s_cadastro); 
 
 
getSupportActionBar().hide(); 
 IniciarComponentes(); 
 
 
bt_deslogar.setOnClickListener(new 
View.OnClickListener() { 
 @Override 
 public void onClick(View 
v) { 
 
 
FirebaseAuth.getInstance().signOut(); 
 Intent intent = new 
Intent(DadosCadastro.this,LoginForm.
class); 
 startActivity(intent); 
 finish(); 
 
 } 
 }); 
 
 
bt_reserva.setOnClickListener(new 
View.OnClickListener() { 
 @Override 
 public void onClick(View 
view) { 
 
 Intent intent = new 
Intent(DadosCadastro.this,ReservaFor
m.class); 
 startActivity(intent); 
 finish(); 
 
 } 
 }); 
 
 } 
 
 @Override 
42 
 
 
 
 protected void onStart() { 
 super.onStart(); 
 
 String email = 
FirebaseAuth.getInstance().getCurrent
User().getEmail(); 
 usuarioID = 
FirebaseAuth.getInstance().getCurrent
User().getUid(); 
 
 DocumentReference 
documentReference = 
db.collection("Usuarios").document(us
uarioID); 
 
documentReference.addSnapshotListe
ner(new 
EventListener<DocumentSnapshot>() { 
 @Override 
 public void 
onEvent(@Nullable 
DocumentSnapshot 
documentSnapshot, @Nullable 
FirebaseFirestoreException error) { 
 if (documentSnapshot 
!= null){ 
 
nomeUsuario.setText(documentSnaps
hot.getString("nome")); 
 
emailUsuario.setText(email); 
 } 
 } 
 }); 
 
 } 
 
 private void 
IniciarComponentes(){ 
 nomeUsuario = 
findViewById(R.id.textNomeUsuario); 
 emailUsuario = 
findViewById(R.id.textEmailUsuario); 
 bt_reserva = 
findViewById(R.id.bt_reserva); 
 bt_deslogar = 
findViewById(R.id.bt_deslogar); 
 
 
 
 } 
} 
 
5.2.6. Java Class Login Form 
 
package br.unip.pim; 
 
import 
androidx.annotation.NonNull; 
import 
androidx.appcompat.app.AppCompatA
ctivity; 
 
import android.content.Intent; 
import android.graphics.Color; 
import android.os.Bundle; 
43 
 
 
 
import android.os.Handler; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import 
android.widget.ProgressBar; 
import android.widget.TextView; 
 
import 
com.google.android.gms.tasks.OnCom
pleteListener; 
import 
com.google.android.gms.tasks.Task; 
import 
com.google.android.material.snackbar.Snackbar; 
import 
com.google.firebase.auth.AuthResult; 
import 
com.google.firebase.auth.FirebaseAut
h; 
import 
com.google.firebase.auth.FirebaseUse
r; 
 
public class LoginForm extends 
AppCompatActivity { 
 
 private TextView 
text_tela_cadastro; 
 private EditText edit_email, 
edit_senha; 
 private Button bt_entrar; 
 private ProgressBar 
progressBar; 
 String[] mensagens = 
{"Preencha todos os campos", "Login 
efetuado com sucesso"}; 
 
 @Override 
 protected void 
onCreate(Bundle savedInstanceState) 
{ 
 
super.onCreate(savedInstanceState); 
 
setContentView(R.layout.activity_login
_form); 
 
 
getSupportActionBar().hide(); 
 IniciarComponentes(); 
 
 
bt_entrar.setOnClickListener(new 
View.OnClickListener() { 
 @Override 
 public void onClick(View 
v) { 
 
 String email = 
edit_email.getText().toString(); 
 String senha = 
edit_senha.getText().toString(); 
 
 if(email.isEmpty() 
44 
 
 
 
||senha.isEmpty()){ 
 Snackbar snackbar 
= 
Snackbar.make(v,mensagens[0],Snack
bar.LENGTH_SHORT); 
 
snackbar.setBackgroundTint(Color.WH
ITE); 
 
snackbar.setTextColor(Color.BLACK); 
 snackbar.show(); 
 
 }else{ 
 
AutenticarUsuario(v); 
 } 
 
 
 } 
 }); 
 
 
text_tela_cadastro.setOnClickListener(
new View.OnClickListener() { 
 @Override 
 public void onClick(View 
v) { 
 
 Intent intent = new 
Intent(LoginForm.this,CadastroForm.cl
ass); 
 startActivity(intent); 
 
 
 
 } 
 }); 
 } 
 
 private void 
AutenticarUsuario(View view){ 
 
 String email = 
edit_email.getText().toString(); 
 String senha = 
edit_senha.getText().toString(); 
 
 
FirebaseAuth.getInstance().signInWith
EmailAndPassword(email,senha).add
OnCompleteListener(new 
OnCompleteListener<AuthResult>() { 
 @Override 
 public void 
onComplete(@NonNull 
Task<AuthResult> task) { 
 
 if 
(task.isSuccessful()){ 
 
progressBar.setVisibility(View.VISIBLE
); 
 
 new 
Handler().postDelayed(new Runnable() 
{ 
45 
 
 
 
 @Override 
 public void run() { 
 
TelaCadastro(); 
 
 } 
 },3000); 
 }else{ 
 String erro; 
 
 try { 
 throw 
task.getException(); 
 
 }catch (Exception 
e){ 
 erro = "Erro ao 
logar o usuário"; 
 
 } 
 Snackbar snackbar 
= 
Snackbar.make(view,erro,Snackbar.LE
NGTH_SHORT); 
 
snackbar.setBackgroundTint(Color.WH
ITE); 
 
snackbar.setTextColor(Color.BLACK); 
 snackbar.show(); 
 } 
 
 } 
 }); 
 } 
 
 @Override 
 protected void onStart() { 
 super.onStart(); 
 
 FirebaseUser usuarioAtual 
= 
FirebaseAuth.getInstance().getCurrent
User(); 
 
 if(usuarioAtual != null){ 
 TelaCadastro(); 
 
 } 
 } 
 
 private void TelaCadastro(){ 
 Intent intent = new 
Intent(LoginForm.this,DadosCadastro.
class); 
 startActivity(intent); 
 finish(); 
 
 
 } 
 
 private void 
IniciarComponentes(){ 
 text_tela_cadastro = 
findViewById(R.id.text_tela_cadastro); 
 edit_email = 
46 
 
 
 
findViewById(R.id.edit_email); 
 edit_senha = 
findViewById(R.id.edit_senha); 
 bt_entrar = 
findViewById(R.id.bt_entrar); 
 progressBar = 
findViewById(R.id.progressbar); 
 
 } 
} 
 
5.2.7. Java Class ReservaForm 
 
package br.unip.pim; 
 
import 
androidx.appcompat.app.AppCompatA
ctivity; 
 
import android.os.Bundle; 
 
public class ReservaForm 
extends AppCompatActivity { 
 
 @Override 
 protected void 
onCreate(Bundle savedInstanceState) 
{ 
 
super.onCreate(savedInstanceState); 
 
setContentView(R.layout.activity_reser
va_form); 
 } 
} 
 
 
5.3. PÁGINA WEB 
 
5.3.1. Aplicando As 
Referências Para Cadastro e 
Consulta de Cliente 
 
 
public class usuarioDAL 
 { 
 
 public tabUsuario 
consultarUsuarioPorEmail (string 
email) 
 { 
 using (DEV0102Entities 
ctx = new DEV0102Entities()) 
 { 
 return 
ctx.tabUsuario.Where(c => c.email == 
email ).FirstOrDefault(); 
 } 
 } 
 
 public void 
cadastrarUsuario (tabUsuario objU) 
 { 
 using (DEV0102Entities 
ctx = new DEV0102Entities()) 
 { 
47 
 
 
 
 
ctx.tabUsuario.Add(objU); 
 ctx.SaveChanges(); 
 } 
 } 
 
 
 } 
} 
 
 
5.3.2. Formulário Cadastro 
Cliente 
 
<!DOCTYPE html> 
 
<html 
xmlns="http://www.w3.org/1999/xhtml"
> 
<head runat="server"> 
<meta http-equiv="Content-Type" 
content="text/html; charset=utf-8"/> 
 <title>Cadastro de Usuários</title> 
</head> 
<body> 
 
 <form id="form1" runat="server"> 
 <center><div> 
 
 <h1><center>Cadastro de 
Cliente</center></h1> 
 <label>Nome:</label><br /> 
 <asp:TextBox ID="txtNome" 
runat="server"></asp:TextBox><br /> 
 
<label><center>CEP:</center></label> 
 <asp:TextBox ID="txtCEP" 
runat="server"></asp:TextBox> 
 <center><asp:Button 
ID="btnConsultaCEP" runat="server" 
Text="Consultar CEP" 
OnClick="btnConsultaCEP_Click" 
/></center><br /> 
 <label>Endereço</label><br /> 
 <asp:TextBox ID="txtEndereco" 
runat="server"></asp:TextBox><br /> 
 <label>Bairro</label><br /> 
 <asp:TextBox ID="txtBairro" 
runat="server"></asp:TextBox><br /> 
 <label>Cidade</label><br /> 
 <asp:TextBox ID="txtCidade" 
runat="server"></asp:TextBox><br /> 
 <label>UF</label><br /> 
 <asp:TextBox ID="txtUF" 
runat="server"></asp:TextBox><br /> 
 <label>Email</label><br /> 
 <asp:TextBox ID="txtEmail" 
runat="server"></asp:TextBox><br /> 
 <label>Senha</label><br /> 
 <asp:TextBox ID="txtSenha" 
runat="server" 
TextMode="Password"></asp:TextBox
><br /> 
 <br /> 
 <asp:FileUpload ID="fupFoto" 
runat="server" /><br /> <br /> 
48 
 
 
 
 <asp:Button ID="btnCadastrar" 
runat="server" Text="Cadastrar" 
OnClick="btnCadastrar_Click" /><br 
/><br /> 
 <br /> 
 <h4>Hospedes 
Cadastrados</h4> 
 <asp:GridView 
ID="gridUsuario" runat="server" 
AutoGenerateColumns="False" 
DataKeyNames="codigo" 
DataSourceID="SqlDataSourceUsuario
" AllowPaging="True" 
AllowSorting="True"> 
 <Columns> 
 <asp:ImageField 
DataImageUrlField="caminhoFoto" 
ControlStyle-Height="50px" 
HeaderText="Foto"></asp:ImageField> 
 <asp:BoundField 
DataField="codigo" Visible="false" 
HeaderText="codigo" 
ReadOnly="True" InsertVisible="False" 
SortExpression="codigo"></asp:Bound
Field> 
 <asp:BoundField 
DataField="nome" 
HeaderText="Nome" 
SortExpression="nome"></asp:BoundF
ield> 
 <asp:BoundField 
DataField="cep" HeaderText="CEP" 
SortExpression="cep"></asp:BoundFie
ld> 
 <asp:BoundField 
DataField="endereco" 
HeaderText="Endereço" 
SortExpression="endereco"></asp:Bou
ndField><asp:BoundField 
DataField="bairro" 
HeaderText="Bairro" 
SortExpression="bairro"></asp:Bound
Field> 
 <asp:BoundField 
DataField="cidade" 
HeaderText="Cidade" 
SortExpression="cidade"></asp:Bound
Field> 
 <asp:BoundField 
DataField="uf" HeaderText="UF" 
SortExpression="uf"></asp:BoundField
> 
 <asp:BoundField 
DataField="email" HeaderText="Email" 
SortExpression="email"></asp:BoundF
ield> 
 <asp:BoundField 
DataField="senha" Visible="false" 
HeaderText="senha" 
SortExpression="senha"></asp:Bound
Field> 
 <asp:BoundField 
DataField="nomeFoto" Visible="false" 
HeaderText="nomeFoto" 
SortExpression="nomeFoto"></asp:Bo
49 
 
 
 
undField> 
 </Columns> 
 </asp:GridView> 
 <asp:SqlDataSource 
runat="server" 
ID="SqlDataSourceUsuario" 
ConnectionString='<%$ 
ConnectionStrings:DEV0102Connectio
nString %>' SelectCommand="select 
'~/fotoUsuario/' + nomeFoto as 
caminhoFoto, * from 
tabusuario"></asp:SqlDataSource> 
 <br /> 
 
 </div></center> 
 </form> 
</body> 
</html> 
 
5.3.3. Cadastro dos Botões 
Cadastrar e Consultar 
 
namespace DEV0102 
{ 
 public partial class cadUsuario 
: System.Web.UI.Page 
 { 
 protected void 
Page_Load(object sender, EventArgs 
e) 
 { 
 
 } 
 
 
 
 protected void 
btnConsultaCEP_Click(object sender, 
EventArgs e) 
 { 
 try 
 { 
 using (var ws = new 
wsCorreios.AtendeClienteService()) 
 
 { 
 
 var resultado = 
ws.consultaCEP(txtCEP.Text); 
 
 txtEndereco.Text = 
resultado.end; 
 txtBairro.Text = 
resultado.bairro; 
 txtCidade.Text = 
resultado.cidade; 
 txtUF.Text = 
resultado.uf; 
 
 } 
 } 
 
 catch (Exception ex) 
 { 
 
ExibirMensagem(ex.Message); 
50 
 
 
 
 } 
 } 
 
 public void 
ExibirMensagem(string msg) 
 { 
 
Response.Write("<script>alert('" + msg 
+ "')</script"); 
 } 
 
 public void 
LimparCampos() 
 { 
 txtBairro.Text = ""; 
 txtCEP.Text = ""; 
 txtCidade.Text = ""; 
 txtEmail.Text = ""; 
 txtEndereco.Text = ""; 
 txtNome.Text = ""; 
 txtSenha.Text = ""; 
 txtUF.Text = ""; 
 } 
 
 protected void 
btnCadastrar_Click(object sender, 
EventArgs e) 
 { 
 try 
 { 
 
 if (fupFoto.HasFile) 
 { 
 
 string 
caminhoArquivo = 
Server.MapPath("/fotoUsuario/"); 
 string nomeArquivo 
= fupFoto.FileName; 
 
 
fupFoto.SaveAs(caminhoArquivo + 
nomeArquivo); 
 
 tabUsuario 
objusuario = new tabUsuario(); 
 objusuario.bairro = 
txtBairro.Text; 
 objusuario.cep = 
txtCEP.Text; 
 objusuario.cidade = 
txtCidade.Text; 
 objusuario.email = 
txtEmail.Text; 
 
objusuario.endereco = 
txtEndereco.Text; 
 objusuario.nome = 
txtNome.Text; 
 objusuario.senha = 
txtSenha.Text; 
 objusuario.uf = 
txtUF.Text; 
 
objusuario.nomeFoto = 
fupFoto.FileName; 
51 
 
 
 
 
 
 tabUsuario 
objValidador = new tabUsuario(); 
 usuarioDAL uDal = 
new usuarioDAL(); 
 
 
 objValidador = 
uDal.consultarUsuarioPorEmail(txtEma
il.Text); 
 
 if (objValidador != 
null) 
 { 
 
ExibirMensagem("Usuario já existe no 
banco de dados"); 
 } 
 
 else 
 { 
 
uDal.cadastrarUsuario(objusuario); 
 
gridUsuario.DataBind(); 
 
ExibirMensagem("Usuario cadastrado 
com sucesso !! "); 
 Suporte objsup = 
new Suporte(); 
 string corpoEmail 
= "Olá " + txtNome.Text + ", Bem vindo 
ao nosso hotel, voce ja esta cadastrado 
em nosso sistema!! "; 
 
objsup.EnviarEmail("Bem vindo ao 
Nosso Hotel ", txtEmail.Text, 
corpoEmail); 
 LimparCampos(); 
 } 
 
 } 
 else 
 { 
 
ExibirMensagem("Selecione uma foto 
para usuário"); 
 } 
 
 } 
 catch (Exception ex) 
 { 
 
 ExibirMensagem("Erro 
ao salvar cadastro! Entre em contato 
com o administrador do sistema."); 
 } 
 } 
 
 } 
} 
 
5.3.4. Enviar Email Cliente 
 
 
52 
 
 
 
 
{ 
 public class Suporte 
 { 
 public void EnviarEmail(string 
Assunto, string emailDestinatario, string 
corpoEmail) 
 { 
 MailMessage objmail = 
new MailMessage(); 
 
objmail.To.Add(emailDestinatario); 
 objmail.From = new 
MailAddress("amir.moreira@aluno.uni
p.br"); 
 objmail.Body = 
corpoEmail; 
 objmail.Subject = 
Assunto; 
 
 
 SmtpClient objsmtp = 
new SmtpClient(); 
 objsmtp.Host = 
"smtp.gmail.com"; 
 objsmtp.Port = 587; 
 
objsmtp.UseDefaultCredentials = false; 
 objsmtp.Credentials = 
new 
NetworkCredential("thalescadastro19
@gmail.com", "fenix241415"); 
 objsmtp.EnableSsl = 
true; 
 objsmtp.Send(objmail); 
 } 
 } 
} 
 
 
-------------------------------------------
----------------------------------------------------
----------- 
 
Model1.edmx 
 
<#@ template language="C#" 
debug="false" hostspecific="true"#> 
<#@ include 
file="EF6.Utility.CS.ttinclude"#><#@ 
 output extension=".cs"#><# 
 
const string inputFile = 
@"Model1.edmx"; 
var textTransform = 
DynamicTextTransformation.Create(thi
s); 
var code = new 
CodeGenerationTools(this); 
var ef = new 
MetadataTools(this); 
var typeMapper = new 
TypeMapper(code, ef, 
textTransform.Errors); 
var loader = new 
EdmMetadataLoader(textTransform.Ho
st, textTransform.Errors); 
var itemCollection = 
loader.CreateEdmItemCollection(input
File); 
var modelNamespace = 
loader.GetModelNamespace(inputFile)
; 
var codeStringGenerator = new 
CodeStringGenerator(code, 
typeMapper, ef); 
 
var container = 
itemCollection.OfType<EntityContainer
>().FirstOrDefault(); 
if (container == null) 
{ 
 return string.Empty; 
} 
#> 
//-----------------------------------------
------------------------------------- 
// <auto-generated> 
// 
<#=CodeGenerationTools.GetResourc
eString("Template_GeneratedCodeCo
mmentLine1")#> 
// 
// 
<#=CodeGenerationTools.GetResourc
eString("Template_GeneratedCodeCo
mmentLine2")#> 
// 
53 
 
 
 
<#=CodeGenerationTools.GetResourc
eString("Template_GeneratedCodeCo
mmentLine3")#> 
// </auto-generated> 
//-----------------------------------------
------------------------------------- 
 
<# 
 
var codeNamespace = 
code.VsNamespaceSuggestion(); 
if 
(!String.IsNullOrEmpty(codeNamespac
e)) 
{ 
#> 
namespace 
<#=code.EscapeNamespace(codeNa
mespace)#> 
{ 
<# 
 PushIndent(" "); 
} 
 
#> 
using System; 
using System.Data.Entity; 
using 
System.Data.Entity.Infrastructure; 
<# 
if 
(container.FunctionImports.Any()) 
{ 
#> 
using 
System.Data.Entity.Core.Objects; 
using System.Linq; 
<# 
} 
#> 
 
<#=Accessibility.ForType(contai
ner)#> partial class 
<#=code.Escape(container)#> : 
DbContext 
{ 
 public 
<#=code.Escape(container)#>(): 
base("name=<#=container.Name#>") 
 { 
<# 
if 
(!loader.IsLazyLoadingEnabled(contain
er)) 
{ 
#> 
 
this.Configuration.LazyLoadingEnabled 
= false; 
<# 
} 
 
foreach (var entitySet in 
container.BaseEntitySets.OfType<Entit
ySet>()) 
{ 
 // Note: the DbSet members 
are defined below such that the getter 
and 
 // setter always have the same 
accessibility as the DbSet definition 
 if 
(Accessibility.ForReadOnlyProperty(en
titySet) != "public") 
 { 
#> 
 
<#=codeStringGenerator.DbSetInitializ
er(entitySet)#> 
<# 
 } 
} 
#> 
 } 
 
 protected override void 
OnModelCreating(DbModelBuilder 
modelBuilder) 
 { 
 throw new 
UnintentionalCodeFirstException(); 
 } 
 
<# 
 foreach (var entitySet in 
container.BaseEntitySets.OfType<Entit
ySet>()) 
54 
 
 
 
 { 
#> 
 
<#=codeStringGenerator.DbSet(entity
Set)#> 
<# 
 } 
 
 foreach (var edmFunction in 
container.FunctionImports) 
 { 
 
WriteFunctionImport(typeMapper, 
codeStringGenerator, edmFunction, 
modelNamespace, 
includeMergeOption: false); 
 } 
#> 
} 
<# 
 
if 
(!String.IsNullOrEmpty(codeNamespac
e)) 
{ 
 PopIndent(); 
#> 
} 
<# 
} 
#> 
<#+ 
 
private void 
WriteFunctionImport(TypeMapper 
typeMapper, CodeStringGenerator 
codeStringGenerator, EdmFunction 
edmFunction, string modelNamespace, 
bool includeMergeOption) 
{ 
 if 
(typeMapper.IsComposable(edmFuncti
on)) 
 { 
#> 
 
 
[DbFunction("<#=edmFunction.Names
paceName#>", 
"<#=edmFunction.Name#>")] 
 
<#=codeStringGenerator.Composable
FunctionMethod(edmFunction, 
modelNamespace)#> 
 { 
<#+ 
 
codeStringGenerator.WriteFunctionPar
ameters(edmFunction, 
WriteFunctionParameter); 
#> 
 
<#=codeStringGenerator.Composable
CreateQuery(edmFunction, 
modelNamespace)#> 
 } 
<#+ 
 } 
 else 
 { 
#> 
 
 
<#=codeStringGenerator.FunctionMeth
od(edmFunction, modelNamespace, 
includeMergeOption)#> 
 { 
<#+ 
 
codeStringGenerator.WriteFunctionPar
ameters(edmFunction, 
WriteFunctionParameter); 
#> 
 
<#=codeStringGenerator.ExecuteFunct
ion(edmFunction, modelNamespace, 
includeMergeOption)#> 
 } 
<#+ 
 if 
(typeMapper.GenerateMergeOptionFu
nction(edmFunction, 
includeMergeOption)) 
 { 
 
WriteFunctionImport(typeMapper, 
codeStringGenerator, edmFunction, 
modelNamespace, 
55 
 
 
 
includeMergeOption: true); 
 } 
 } 
} 
 
public void 
WriteFunctionParameter(string name, 
string isNotNull, string notNullInit, string 
nullInit) 
{ 
#> 
 var <#=name#> = 
<#=isNotNull#> ? 
 <#=notNullInit#> : 
 <#=nullInit#>; 
 
<#+ 
} 
 
public const string TemplateId = 
"CSharp_DbContext_Context_EF6"; 
 
public class 
CodeStringGenerator 
{ 
 private readonly 
CodeGenerationTools _code; 
 private readonly TypeMapper 
_typeMapper; 
 private readonly 
MetadataTools _ef; 
 
 public 
CodeStringGenerator(CodeGeneration
Tools code, TypeMapper typeMapper, 
MetadataTools ef) 
 { 
 ArgumentNotNull(code, 
"code"); 
 
ArgumentNotNull(typeMapper, 
"typeMapper"); 
 ArgumentNotNull(ef, "ef"); 
 
 _code = code; 
 _typeMapper = 
typeMapper; 
 _ef = ef; 
 } 
 
 public string 
Property(EdmProperty edmProperty) 
 { 
 return string.Format( 
 
CultureInfo.InvariantCulture, 
 "{0} {1} {2} {{ {3}get; 
{4}set; }}", 
 
Accessibility.ForProperty(edmProperty)
, 
 
_typeMapper.GetTypeName(edmProp
erty.TypeUsage), 
 
_code.Escape(edmProperty), 
 
_code.SpaceAfter(Accessibility.ForGett
er(edmProperty)), 
 
_code.SpaceAfter(Accessibility.ForSett
er(edmProperty))); 
 } 
 
 public string 
NavigationProperty(NavigationProperty 
navProp) 
 { 
 var endType = 
_typeMapper.GetTypeName(navProp.
ToEndMember.GetEntityType()); 
 return string.Format( 
 
CultureInfo.InvariantCulture, 
 "{0} {1} {2} {{ {3}get; 
{4}set; }}", 
 
AccessibilityAndVirtual(Accessibility.Fo
rNavigationProperty(navProp)), 
 
navProp.ToEndMember.RelationshipM
ultiplicity == 
RelationshipMultiplicity.Many ? 
("ICollection<" + endType + ">") : 
endType, 
 _code.Escape(navProp), 
 
_code.SpaceAfter(Accessibility.ForGett
56 
 
 
 
er(navProp)), 
 
_code.SpaceAfter(Accessibility.ForSett
er(navProp))); 
 } 
 
 public string 
AccessibilityAndVirtual(string 
accessibility) 
 { 
 return accessibility + 
(accessibility != "private" ? " virtual" : ""); 
 } 
 
 public string 
EntityClassOpening(EntityType entity) 
 { 
 return string.Format( 
 
CultureInfo.InvariantCulture, 
 "{0} {1}partial class 
{2}{3}", 
 
Accessibility.ForType(entity), 
 
_code.SpaceAfter(_code.AbstractOptio
n(entity)), 
 _code.Escape(entity), 
 _code.StringBefore(" : ", 
_typeMapper.GetTypeName(entity.Bas
eType))); 
 } 
 
 public string 
EnumOpening(SimpleType enumType) 
 { 
 return string.Format( 
 
CultureInfo.InvariantCulture, 
 "{0} enum {1} : {2}", 
 
Accessibility.ForType(enumType), 
 
_code.Escape(enumType), 
 
_code.Escape(_typeMapper.Underlyin
gClrType(enumType))); 
 } 
 
 public void 
WriteFunctionParameters(EdmFunctio
n edmFunction, Action<string, string, 
string, string> writeParameter) 
 { 
 var parameters = 
FunctionImportParameter.Create(edm
Function.Parameters, _code, _ef); 
 foreach (var parameter in 
parameters.Where(p => 
p.NeedsLocalVariable)) 
 { 
 var isNotNull = 
parameter.IsNullableOfT ? 
parameter.FunctionParameterName + 
".HasValue" : 
parameter.FunctionParameterName + " 
!= null"; 
 var notNullInit = "new 
ObjectParameter(\"" + 
parameter.EsqlParameterName + "\", " 
+ parameter.FunctionParameterName 
+ ")"; 
 var nullInit = "new 
ObjectParameter(\"" + 
parameter.EsqlParameterName + "\", 
typeof(" + 
TypeMapper.FixNamespaces(paramet
er.RawClrTypeName) + "))"; 
 
writeParameter(parameter.LocalVariab
leName, isNotNull, notNullInit, nullInit); 
 } 
 } 
 
 public string 
ComposableFunctionMethod(EdmFunc
tion edmFunction, string 
modelNamespace) 
 { 
 var parameters = 
_typeMapper.GetParameters(edmFunc
tion); 
 
 return string.Format( 
 
CultureInfo.InvariantCulture, 
 "{0} IQueryable<{1}> 
{2}({3})", 
57 
 
 
 
 
AccessibilityAndVirtual(Accessibility.Fo
rMethod(edmFunction)), 
 
_typeMapper.GetTypeName(_typeMap
per.GetReturnType(edmFunction), 
modelNamespace), 
 
_code.Escape(edmFunction), 
 string.Join(", ", 
parameters.Select(p => 
TypeMapper.FixNamespaces(p.Functi
onParameterType) + " " + 
p.FunctionParameterName).ToArray())
); 
 } 
 
 public string 
ComposableCreateQuery(EdmFunctio
n edmFunction, string 
modelNamespace) 
 { 
 var parameters = 
_typeMapper.GetParameters(edmFunc
tion); 
 
 return string.Format( 
 
CultureInfo.InvariantCulture, 
 "return 
((IObjectContextAdapter)this).ObjectC
ontext.CreateQuery<{0}>(\"[{1}].[{2}]({3
})\"{4});", 
 
_typeMapper.GetTypeName(_typeMap
per.GetReturnType(edmFunction), 
modelNamespace), 
 
edmFunction.NamespaceName, 
 edmFunction.Name, 
 string.Join(", ", 
parameters.Select(p => "@" + 
p.EsqlParameterName).ToArray()), 
 _code.StringBefore(", ", 
string.Join(", ", parameters.Select(p => 
p.ExecuteParameterName).ToArray()))
); 
 } 
 
 public string 
FunctionMethod(EdmFunction 
edmFunction, string modelNamespace, 
bool includeMergeOption) 
 { 
 var parameters = 
_typeMapper.GetParameters(edmFunction); 
 var returnType = 
_typeMapper.GetReturnType(edmFun
ction); 
 
 var paramList = 
String.Join(", ", parameters.Select(p => 
TypeMapper.FixNamespaces(p.Functi
onParameterType) + " " + 
p.FunctionParameterName).ToArray())
; 
 if (includeMergeOption) 
 { 
 paramList = 
_code.StringAfter(paramList, ", ") + 
"MergeOption mergeOption"; 
 } 
 
 return string.Format( 
 
CultureInfo.InvariantCulture, 
 "{0} {1} {2}({3})", 
 
AccessibilityAndVirtual(Accessibility.Fo
rMethod(edmFunction)), 
 returnType == null ? "int" 
: "ObjectResult<" + 
_typeMapper.GetTypeName(returnTyp
e, modelNamespace) + ">", 
 
_code.Escape(edmFunction), 
 paramList); 
 } 
 
 public string 
ExecuteFunction(EdmFunction 
edmFunction, string modelNamespace, 
bool includeMergeOption) 
 { 
 var parameters = 
_typeMapper.GetParameters(edmFunc
tion); 
58 
 
 
 
 var returnType = 
_typeMapper.GetReturnType(edmFun
ction); 
 
 var callParams = 
_code.StringBefore(", ", String.Join(", ", 
parameters.Select(p => 
p.ExecuteParameterName).ToArray()))
; 
 if (includeMergeOption) 
 { 
 callParams = ", 
mergeOption" + callParams; 
 } 
 
 return string.Format( 
 
CultureInfo.InvariantCulture, 
 "return 
((IObjectContextAdapter)this).ObjectC
ontext.ExecuteFunction{0}(\"{1}\"{2});", 
 returnType == null ? "" : 
"<" + 
_typeMapper.GetTypeName(returnTyp
e, modelNamespace) + ">", 
 edmFunction.Name, 
 callParams); 
 } 
 
 public string DbSet(EntitySet 
entitySet) 
 { 
 return string.Format( 
 
CultureInfo.InvariantCulture, 
 "{0} virtual DbSet<{1}> 
{2} {{ get; set; }}", 
 
Accessibility.ForReadOnlyProperty(enti
tySet), 
 
_typeMapper.GetTypeName(entitySet.
ElementType), 
 
_code.Escape(entitySet)); 
 } 
 
 public string 
DbSetInitializer(EntitySet entitySet) 
 { 
 return string.Format( 
 
CultureInfo.InvariantCulture, 
 "{0} = Set<{1}>();", 
 
_code.Escape(entitySet), 
 
_typeMapper.GetTypeName(entitySet.
ElementType)); 
 } 
 
 public string 
UsingDirectives(bool inHeader, bool 
includeCollections = true) 
 { 
 return inHeader == 
string.IsNullOrEmpty(_code.VsNamesp
aceSuggestion()) 
 ? string.Format( 
 
CultureInfo.InvariantCulture, 
 "{0}using System;{1}" 
+ 
 "{2}", 
 inHeader ? 
Environment.NewLine : "", 
 includeCollections ? 
(Environment.NewLine + "using 
System.Collections.Generic;") : "", 
 inHeader ? "" : 
Environment.NewLine) 
 : ""; 
 } 
} 
 
public class TypeMapper 
{ 
 private const string 
ExternalTypeNameAttributeName = 
@"http://schemas.microsoft.com/ado/2
006/04/codegeneration:ExternalTypeN
ame"; 
 
 private readonly 
System.Collections.IList _errors; 
 private readonly 
CodeGenerationTools _code; 
 private readonly 
59 
 
 
 
MetadataTools _ef; 
 
 public static string 
FixNamespaces(string typeName) 
 { 
 return 
typeName.Replace("System.Data.Spat
ial.", "System.Data.Entity.Spatial."); 
 } 
 
 public 
TypeMapper(CodeGenerationTools 
code, MetadataTools ef, 
System.Collections.IList errors) 
 { 
 ArgumentNotNull(code, 
"code"); 
 ArgumentNotNull(ef, "ef"); 
 ArgumentNotNull(errors, 
"errors"); 
 
 _code = code; 
 _ef = ef; 
 _errors = errors; 
 } 
 
 public string 
GetTypeName(TypeUsage typeUsage) 
 { 
 return typeUsage == null ? 
null : 
GetTypeName(typeUsage.EdmType, 
_ef.IsNullable(typeUsage), 
modelNamespace: null); 
 } 
 
 public string 
GetTypeName(EdmType edmType) 
 { 
 return 
GetTypeName(edmType, isNullable: 
null, modelNamespace: null); 
 } 
 
 public string 
GetTypeName(TypeUsage typeUsage, 
string modelNamespace) 
 { 
 return typeUsage == null ? 
null : 
GetTypeName(typeUsage.EdmType, 
_ef.IsNullable(typeUsage), 
modelNamespace); 
 } 
 
 public string 
GetTypeName(EdmType edmType, 
string modelNamespace) 
 { 
 return 
GetTypeName(edmType, isNullable: 
null, modelNamespace: 
modelNamespace); 
 } 
 
 public string 
GetTypeName(EdmType edmType, 
bool? isNullable, string 
modelNamespace) 
 { 
 if (edmType == null) 
 { 
 return null; 
 } 
 
 var collectionType = 
edmType as CollectionType; 
 if (collectionType != null) 
 { 
 return 
String.Format(CultureInfo.InvariantCult
ure, "ICollection<{0}>", 
GetTypeName(collectionType.TypeUs
age, modelNamespace)); 
 } 
 
 var typeName = 
_code.Escape(edmType.MetadataProp
erties 
 .Where(p => 
p.Name == 
ExternalTypeNameAttributeName) 
 .Select(p => 
(string)p.Value) 
 
.FirstOrDefault()) 
 ?? (modelNamespace != 
null && edmType.NamespaceName != 
60 
 
 
 
modelNamespace ? 
 
_code.CreateFullName(_code.Escape
Namespace(edmType.NamespaceNa
me), _code.Escape(edmType)) : 
 
_code.Escape(edmType)); 
 
 if (edmType is 
StructuralType) 
 { 
 return typeName; 
 } 
 
 if (edmType is SimpleType) 
 { 
 var clrType = 
UnderlyingClrType(edmType); 
 if 
(!IsEnumType(edmType)) 
 { 
 typeName = 
_code.Escape(clrType); 
 } 
 
 typeName = 
FixNamespaces(typeName); 
 
 return 
clrType.IsValueType && isNullable == 
true ? 
 
String.Format(CultureInfo.InvariantCult
ure, "Nullable<{0}>", typeName) : 
 typeName; 
 } 
 
 throw new 
ArgumentException("edmType"); 
 } 
 
 public Type 
UnderlyingClrType(EdmType 
edmType) 
 { 
 
ArgumentNotNull(edmType, 
"edmType"); 
 
 var primitiveType = 
edmType as PrimitiveType; 
 if (primitiveType != null) 
 { 
 return 
primitiveType.ClrEquivalentType; 
 } 
 
 if (IsEnumType(edmType)) 
 { 
 return 
GetEnumUnderlyingType(edmType).Cl
rEquivalentType; 
 } 
 
 return typeof(object); 
 } 
 
 public object 
GetEnumMemberValue(MetadataItem 
enumMember) 
 { 
 
ArgumentNotNull(enumMember, 
"enumMember"); 
 
 var valueProperty = 
enumMember.GetType().GetProperty("
Value"); 
 return valueProperty == null 
? null : 
valueProperty.GetValue(enumMember, 
null); 
 } 
 
 public string 
GetEnumMemberName(MetadataItem 
enumMember) 
 { 
 
ArgumentNotNull(enumMember, 
"enumMember"); 
 
 var nameProperty = 
enumMember.GetType().GetProperty("
Name"); 
 return nameProperty == null 
? null : 
(string)nameProperty.GetValue(enum
61 
 
 
 
Member, null); 
 } 
 
 public 
System.Collections.IEnumerable 
GetEnumMembers(EdmType 
enumType) 
 { 
 
ArgumentNotNull(enumType, 
"enumType"); 
 
 var membersProperty = 
enumType.GetType().GetProperty("Me
mbers"); 
 return membersProperty != 
null 
 ? 
(System.Collections.IEnumerable)mem
bersProperty.GetValue(enumType, 
null) 
 : 
Enumerable.Empty<MetadataItem>(); 
 } 
 
 public bool 
EnumIsFlags(EdmType enumType) 
 { 
 
ArgumentNotNull(enumType, 
"enumType"); 
 
 var isFlagsProperty = 
enumType.GetType().GetProperty("IsF
lags"); 
 return isFlagsProperty != 
null && 
(bool)isFlagsProperty.GetValue(enumT
ype, null); 
 } 
 
 public bool 
IsEnumType(GlobalItem edmType) 
 { 
 
ArgumentNotNull(edmType,

Continue navegando