Baixe o app para aproveitar ainda mais
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,
Compartilhar