Solução Proposta - wachsmann/TCC_Senai_Brusque GitHub Wiki

A solução proposta à situação do administrador imobiliário é, desenvolver um sistema migrando todos os possíveis processos feitos fisicamente para serem feitos em um sistema computacional. No sentido de identificar esses processos foram feitas consultas com o administrador imobiliário para entender seu negócio. Assim realizou-se a extração das regras de negócios, quais podem ser visualizadas abaixo:

Regras de negócio

[RNG1] Quantia mínima de móveis

O sistema deverá conter uma quantia de imóveis mínima para ser consultados e avaliados pelo cliente.

[RNG1.1] Nome dos casos de uso que utilizam esta regra:

 01 - Manter imóveis  02 - Agendar imóveis  03 - Manter contratos  05 - Imprimir contrato

[RNG2] Disponibilidade de imóveis

O sistema deverá conter um controle, para ser operado e monitorado sobre as disponibilidades dos imóveis.

[RNG2.1] Nome dos casos de uso que utilizam esta regra:

 01 - Manter imóveis  02 - Agendar imóveis

[RNG3] Consulta de imóvel As consultas de imóveis devem ser agendadas no sistema para que não ocorram conflitos de visitas, e para checar se é possível ser feita a visita caso o imóvel não esteja adequado.

[RNG3.1] Nome dos casos de uso que utilizam esta regra:

 01 - Manter imóveis  02 - Agendar imóveis

[RNG4] Validação da Locação A locação só é válida após ser preenchido o cadastro final de locação, impresso e assinado entre os participantes do negócio.

[RNG4.1] Nome dos casos de uso que utilizam esta regra:

 03 - Manter contrato

[RNG5] Necessidade de pessoas presentes na locação É necessário se ter um fiador e duas testemunhas para realizar a locação do imóvel.

[RNG5.1] Nome dos casos de uso que utilizam esta regra:

 03 – Manter contrato  04 – Manter pessoa

[RNG6] Ajuste de contrato O contrato de locação pode ser ajustado por qualquer prazo, dependendo de permissão conjugal, se igual ou superior a dez anos. O aluguel do contrato de locação pode sofrer reajuste a cada doze meses e nunca antes deste prazo.

[RNG6.1] Nome dos casos de uso que utilizam esta regra:

 03 – Manter contrato

[RNG7] Reaver contrato Durante o prazo estipulado para a duração do contrato, não poderá o locador reaver o imóvel alugado. O locatário, todavia, poderá devolvê-lo, pagando a multa estipulada no contrato assinado, proporcional ao período de cumprimento deste, ou, na sua falta, a que for judicialmente estipulada. A locação também poderá ser desfeita, por mútuo acordo, em decorrência da prática de infração legal ou contratual, em decorrência da falta de pagamento do aluguel e demais encargos. De acordo com a legislação não se estipula percentual máximo sobre a multa ser aplicada sobre a falta de pagamento do aluguel pelo inquilino. Mas o percentual praticado pelo mercado limita-se à 20% de acordo o aluguel. A multa por descumprimentos de cláusulas contratuais é limitada a três aluguéis. Nas locações comerciais o prazo mínimo do contrato a renovar ou a soma dos prazos ininterruptos dos contratos escritos deve ser de cinco anos.

[RNG7.1] Nome dos casos de uso que utilizam esta regra:

 03 – Manter contrato  06 – quitar aluguel [RNG8] Rescisão de contrato A rescisão do contrato sem motivo justo e, antes do prazo previsto, pagara-se uma multa equivalente a três aluguéis, porém este valor será calculado, proporcionalmente ao tempo de estadia. [RNG8.1] Nome dos casos de uso que utilizam esta regra:

 03 – Manter contrato  06 – Quitar aluguel

[RNG9] Percentual tributário Os percentuais tributários são limitados a 1% ao mês.

[RNG9.1] Nome dos casos de uso que utilizam esta regra:

 03 – Manter contrato

[RNG10] Findo contrato Findo o prazo estipulado, se o locatário permanecer no imóvel por mais de trinta dias sem oposição do locador, presume-se que é prorrogada a locação nas condições determinadas e sem prazo determinado. Nos demais casos de locação não residencial, o contrato por prazo determinado cessa de a acordo com o mesmo, independentemente de notificação ou aviso.

[RNG10.1] Nome dos casos de uso que utilizam esta regra:

 03 – Manter contrato;

[RNG11] Tipos de cadastro de contrato O usuário deve considerar locação não residencial quando o locatário for pessoa jurídica e o imóvel, destinar-se ao uso de seus titulares, diretores, sócios, gerentes, executivos ou empregados. Nos demais deve-se considerar se o imóvel será para temporada (residência temporária do locatário, para prática de lazer, realização de cursos, tratamento de saúde, feitura de obras em seu imóvel, e outros fatos que decorrem somente de determinado tempo, e contratada por prazo não superior a noventa dias, esteja ou não mobiliado o imóvel.) ou para estadia regular selecionando então temporada ou residencial.

[RNG11.1] Nome dos casos de uso que utilizam esta regra:

 03 – Manter contrato [RNG12] Cadastro de pessoas O sistema deverá conter uma tela para cadastro de pessoas, com filtro pessoal onde terá a escolha entre locador, locatário e fiador. Abaixo deste os dados básicos para cadastros pessoais, nome completo, data de nascimento, rua, bairro, cidade, telefone, celular, e-mail, cpf, rg, CEP, etnia, profissão, estado civil. Por fim a confirmação do cadastro.

 04 – Manter pessoa

[RNG13] Cadastro de imóvel O sistema deverá conter uma tela para cadastro de imóveis, com filtro de tipo de imóveis, onde terá a escolha entre comercial ou residencial. Abaixo destes deverá conter os dados básicos para o cadastro de imóveis, nome, tipo, preço da locação taxada, data do imóvel e endereço.

[RNG13.1] Nome dos casos de uso que utilizam esta regra:

 01 – Manter imóvel [RNG14] Cadastro da locação O sistema deverá conter uma tela para cadastro da locação, onde nesta será a junção dos outros cadastros com algumas adições, gerando assim um documento pronto para ser assinado e então validando a locação.

[RNG14.1] Nome dos casos de uso que utilizam esta regra:

 03 – Manter contrato; Com as regras de negócio escritas, deve-se começar a planejar como estas se aplicam no sistema, pois ele deverá conte-las, seguindo estritamente elas. Essa aplicações de regras ao sistemas, junto aos usos normais chamam se casos de uso. Vejamos como foram aplicadas: Atores Atores são as pessoas que tem participação direta ou indireta com o sistema. Compõe os casos de uso, sendo eles os usuários dos casos. Ator 01 - Usuário Pessoa responsável por, manter os dados necessitados, como atualizar, deletar, cadastrar buscar, quitar alugueis, imprimir contratos e recibos do sistema.

Ator 02 - Locatário Pessoa que fornece os dados para o Ator 01, para que ele possa ser cadastrado e ofertado sobre os imóveis disponíveis. Quem assina o contrato impresso pelo Ator 01 e recebe o boleto de pagamento.

Ator 03 - Locador Pessoa que fornece os dados para o Ator 01, para que ele possa ser cadastrado, seus dados impressos e seu imóvel ofertado para o Ator 02. Assina o contrato impresso pelo Ator 01 locando seu imóvel ao mesmo.

Ator 04 - Fiador Pessoa que fornece os dados para o Ator 01, para que ele possa ser cadastrado e seus dados sejam impressos no contrato. Assina o contrato impresso pelo Ator 01 garantindo da dívida entre o locador e o locatário.

				Casos de uso (Use Cases)

Abaixo visualizamos os casos de uso, separados cada um por UC, seu respectivo número e nome. Após o reconhecimento descrevemos do que se trata, suas pré-condições para serem realizadas, seu fluxo de acontecimentos por ordem de uso e se houver possíveis fluxos alternativos, exceções ou erros.

UC01: Manter imóveis Descrição: Neste caso de uso o usuário poderá, atualizar, deletar, buscar, pesquisar, cadastrar e quitar alugueis de imóveis. Pré-Condições:

  • Iniciar a aplicação. Fluxo de Eventos: Normal:
  1. O usuário inicia a aplicação.
    1.1. Escolhe as opções que deseja realizar sobre manter imóveis. Alternativo/Exceções/Erros:
  • Não existem erros e exceções.

UC02: Agendar imóveis

Descrição: Neste caso de uso o usuário poderá, agendar no quadro de horários do imóvel em questão a visita a este.
Pré-Condições:

  • Iniciar a aplicação. Fluxo de Eventos: Normal:
  1. O usuário inicia a aplicação;
  2. Seleciona a Agenda de imóveis; 2.1. Seleciona imóvel desejado e visualiza sua agenda. Alternativo/Exceções/Erros:
  • Não existem erros e exceções.

UC03: Manter Contrato

Descrição: Neste caso de uso o usuário poderá, atualizar, deletar, buscar, pesquisar e cadastrar contratos. Pré-Condições:

  • Iniciar a aplicação. Fluxo de Eventos: Normal:
  1. O usuário inicia a aplicação.
    1.1. Escolhe as opções que deseja realizar sobre manter contratos. Alternativo/Exceções/Erros:
  • Não existem erros e exceções.

UC04: Manter Pessoa

Descrição: Neste caso de uso o usuário poderá, atualizar, deletar, buscar, pesquisar e cadastrar pessoas. Pré-Condições:

  • Iniciar a aplicação. Fluxo de Eventos: Normal:
  1. O usuário inicia a aplicação.
    1.1. Escolhe as opções que deseja realizar sobre manter pessoas. Alternativo/Exceções/Erros:
  • Não existem erros e exceções.

UC05: Imprimir contrato Descrição: Neste caso de uso o usuário poderá imprimir o contrato já pronto. Pré-Condições:

  • Iniciar a aplicação.
  • Preencher os campos do contrato; Fluxo de Eventos: Normal:
  1. O usuário inicia a aplicação.
    1.1. Escolhe a opção de contrato;
  2. Preenche os campos do contrato; 2.1 Clica em imprimir; Alternativo/Exceções/Erros:
  • Impressora não estar instalada.
  • Campos não serem preenchidos
  • Falta de papel no dispositivo de impressão.

UC06: Quitar aluguel Descrição: Neste caso de uso o locatário paga o aluguel ao usuário e este quita o aluguel no sistema e caso haja multa, cobra-a e retira ela do sistema. Pré-Condições:

  • Iniciar a aplicação. Fluxo de Eventos: Normal:
  1. O usuário inicia a aplicação.
    1.1. Escolhe a opção de aluguéis;
  2. Quita a dívida mensal pendente; 2.1 Clica em imprimir o comprovante; Alternativo/Exceções/Erros:
  • Impressora não estar instalada.
  • Multas;
  • Falta de papel no dispositivo de impressão.

Diagrama dos casos de uso

Fonte: autor

Acima podemos com mais clareza entender os casos de uso escritos, onde os bonecos de palito são atores, e os casos de uso representados pelos balões amarelados. As ligações feitas, mostram quando contendo “include” (incluso), que os balões se relacionam em forma de que estão juntos aos outros, ou seja, fazem parte do mesmo fluxo de uso. Já os balões que contém as ligações “extend” (estendido), mostram que o caso segue até este, ou seja, ele se estende até o outro caso.

Diagrama de classes Abaixo visualiza-se as classes que devem ser implementadas no desenvolvimento do projeto. As ligações com flechas brancas significam herança e as com losangos pretos Associação de composição. Fonte: autor

Temos assim a análise de como o sistema deve ser, de modo que possa ser desenvolvido em qualquer linguagem de programação básica, possibilitando que o desenvolvedor possa usar esse documento para consulta. A linguagem que se sugere para ser desenvolvido é C# da qual foram construídos os protótipos das telas abaixo.

Visualizamos a seguir na tela inicial o menu do sistema, onde pode ser escolhido as opções de cadastro de pessoas (locatário, locador e fiador), imóvel, contrato e agendar visita. Em busca temos as opções de, pessoa/imóvel e agenda de visita. E por sequência podemos imprimir o contrato desejado.

Fonte: autor

Fonte: autor

Acima temos a tela de Contrato, onde deve ser cadastrado os contratos de locação.

A seguinte tela trata-se do cadastro de Locador, Locatário e Fiador. Fonte: autor

Adiante na agenda de visitas pode-se manter as visitas dos imóveis, procurando, atualizando informações, deletando visitas, gerando relatórios de visitas ou cancelando a busca. Fonte: autor

Fonte: autor

Além de feito o protótipo das telas, foi desenvolvido e atingido as expectativas dos requisitos funcionais seguintes.

Requisitos funcionais para o módulo de “Cadastro de Imóvel”

RF01 - Campo "Nome" - O usuário deverá preencher neste campo o nome do imóvel em questão.

RF02 - Campo "CEP" - O usuário deverá preencher neste campo o CEP do imóvel em questão.

RF03 – Campo de escolha “Tipo de imóvel” – Este campo deve conter escolhas relacionadas ao tipo de móvel desejado para cadastro.

RF04 – Campo “Preço de locação” – O usuário deverá preencher neste campo o preço de locação do imóvel em questão.

RF05 – Campo “Rua” - O usuário deverá preencher neste campo a rua onde o imóvel é localizado.

RF06 – Campo “Bairro” - O usuário deverá preencher neste campo o bairro onde o imóvel é localizado.

RF05 – Campo “Cidade” – O usuário deverá preencher neste campo a cidade onde o imóvel é localizado.

RF06 – Campo “Tamanho” – O usuário deverá preencher neste campo as dimensões do imóvel de acordo com o exemplo (ex: 10x30).

RF07 – Campo “Cômodos” – O usuário deverá preencher neste campo os cômodos existentes no imóvel.

RF08 – Campo “Garagem” – O usuário deverá preencher neste campo se existir, quantas vagas na garagem ou estacionamento do imóvel.

RF09 – Campo de escolha “Status” – Este campo deve conter escolhas relacionadas a disponibilidade do imóvel.

RF10 – Botão “Confirmar” – Ao clicar neste botão o cadastro deve ser confirmado e se válidos os dados inseridos no banco de dados.

RF11 – Botão “Cancelar” – Ao clicar neste botão o cadastro deve ser cancelado e a tela fechada.

Logo abaixo visualizamos a tela de cadastro de imóvel, aonde deve ser cadastrado os imóveis referentes a locação.


Fonte: autor

Requisitos funcionais para o módulo de “Busca”

RF01 - Campo de escolha de Busca Imóvel - Este campo deve conter as escolhas de busca, neste caso imóvel, onde o usuário selecionará se desejado buscar imóveis.

RF02 - Campo "Nome" - O usuário deverá preencher neste campo o nome do imóvel que está buscado.

RF03 - Campo "CEP" - O usuário deverá preencher neste campo o CEP do imóvel que está buscado.

RF04 - Botão "Procurar" - Ao clicar neste botão deve-se exibir abaixo do formulário preenchido o resultado da busca feita.

RF05 - Botão "Atualizar" - Ao clicar neste botão deve-se atualizar as mudanças feitas na busca.

RF05 - Botão "Deletar" - Ao clicar neste botão deve-se deletar a linha selecionado pelo usuário.

RF06 - Botão "Gerar Relatório" - Ao clicar neste botão deve-se gerar um relatório da busca feita.

RF07 - Botão "Cancelar" - Ao clicar neste botão a tela deve ser fechada cancelando a busca.

Fonte: autor

Diagrama ER, Script SQL, Código fonte do módulo de Cadastro e busca de imóveis (Adendo)

Abaixo o diagrama de entidade e relacionamento expressa os dados e relações para armazenamento do sistema.

Fonte:autor

Segue o script SQL gerado sobre o diagrama acima:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

CREATE SCHEMA IF NOT EXISTS mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; USE mydb ;


-- Table mydb.Pessoa


DROP TABLE IF EXISTS mydb.Pessoa ;

CREATE TABLE IF NOT EXISTS mydb.Pessoa ( idPessoa INT NOT NULL, nome VARCHAR(60) NULL, telefone INT NULL, celular INT NULL, email VARCHAR(25) NULL, rua VARCHAR(45) NULL, bairro VARCHAR(45) NULL, cidade VARCHAR(45) NULL, cep INT NULL, estado VARCHAR(45) NULL, PRIMARY KEY (idPessoa)) ENGINE = InnoDB;


-- Table mydb.Juridica


DROP TABLE IF EXISTS mydb.Juridica ;

CREATE TABLE IF NOT EXISTS mydb.Juridica ( cnpj INT NULL, fundacao DATE NULL, idPessoa INT NOT NULL, PRIMARY KEY (idPessoa), CONSTRAINT fk_Juridica_Pessoa1 FOREIGN KEY (idPessoa) REFERENCES mydb.Pessoa (idPessoa) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;


-- Table mydb.Fisica


DROP TABLE IF EXISTS mydb.Fisica ;

CREATE TABLE IF NOT EXISTS mydb.Fisica ( dataNascimento DATE NULL, cpf INT NULL, rg INT NULL, etnia VARCHAR(20) NULL, profissão VARCHAR(30) NULL, estadoCivil VARCHAR(20) NULL, idPessoa INT NOT NULL, PRIMARY KEY (idPessoa), CONSTRAINT fk_Fisica_Pessoa1 FOREIGN KEY (idPessoa) REFERENCES mydb.Pessoa (idPessoa) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;


-- Table mydb.Contrato


DROP TABLE IF EXISTS mydb.Contrato ;

CREATE TABLE IF NOT EXISTS mydb.Contrato ( idContrato INT NOT NULL, dadoCliente VARCHAR(145) NULL, dadoLocador VARCHAR(145) NULL, dadoImovel VARCHAR(145) NULL, aluguel FLOAT NULL, documento VARCHAR(1000) NULL, clausulas VARCHAR(500) NULL, PRIMARY KEY (idContrato)) ENGINE = InnoDB;


-- Table mydb.Pagamento


DROP TABLE IF EXISTS mydb.Pagamento ;

CREATE TABLE IF NOT EXISTS mydb.Pagamento ( idPagamento INT NOT NULL, forma VARCHAR(45) NULL, parcelas INT NULL, dataPagamento DATE NULL, banco VARCHAR(45) NULL, agencia VARCHAR(45) NULL, contaPagamento INT NULL, idPessoa INT NOT NULL, PRIMARY KEY (idPagamento), INDEX fk_Pagamento_Pessoa1_idx (idPessoa ASC), CONSTRAINT fk_Pagamento_Pessoa1 FOREIGN KEY (idPessoa) REFERENCES mydb.Pessoa (idPessoa) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;


-- Table mydb.Imovel


DROP TABLE IF EXISTS mydb.Imovel ;

CREATE TABLE IF NOT EXISTS mydb.Imovel ( idImovel INT NOT NULL AUTO_INCREMENT, nome VARCHAR(45) NULL, rua VARCHAR(45) NULL, cep VARCHAR(25) NULL, bairro VARCHAR(45) NULL, cidade VARCHAR(45) NULL, tamanho VARCHAR(45) NULL, comodos VARCHAR(45) NULL, garagem VARCHAR(45) NULL, aluguel FLOAT NULL, tipo VARCHAR(45) NULL, status VARCHAR(45) NULL, multa FLOAT NULL, PRIMARY KEY (idImovel)) ENGINE = InnoDB;


-- Table mydb.Agenda


DROP TABLE IF EXISTS mydb.Agenda ;

CREATE TABLE IF NOT EXISTS mydb.Agenda ( idAgenda INT NOT NULL, dia DATE NULL, hora TIME NULL, local VARCHAR(60) NULL, idPessoa INT NOT NULL, Imovel_idImovel INT NOT NULL, PRIMARY KEY (idAgenda), INDEX fk_Agenda_Pessoa1_idx (idPessoa ASC), INDEX fk_Agenda_Imovel1_idx (Imovel_idImovel ASC), CONSTRAINT fk_Agenda_Pessoa1 FOREIGN KEY (idPessoa) REFERENCES mydb.Pessoa (idPessoa) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT fk_Agenda_Imovel1 FOREIGN KEY (Imovel_idImovel) REFERENCES mydb.Imovel (idImovel) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;


-- Table mydb.Renovacao


DROP TABLE IF EXISTS mydb.Renovacao ;

CREATE TABLE IF NOT EXISTS mydb.Renovacao ( idRenovacao INT NOT NULL, dataDesocupacao DATE NOT NULL, dataRenovacao DATE NULL, PRIMARY KEY (idRenovacao)) ENGINE = InnoDB;


-- Table mydb.Locacao


DROP TABLE IF EXISTS mydb.Locacao ;

CREATE TABLE IF NOT EXISTS mydb.Locacao ( dataDesocupacao DATE NOT NULL, periodo DATE NULL, garantia VARCHAR(60) NULL, fiador VARCHAR(45) NULL, idContrato INT NOT NULL, PRIMARY KEY (dataDesocupacao), INDEX fk_Locacao_Contrato1_idx (idContrato ASC), CONSTRAINT fk_Locacao_Contrato1 FOREIGN KEY (idContrato) REFERENCES mydb.Contrato (idContrato) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;


-- Table mydb.Login


DROP TABLE IF EXISTS mydb.Login ;

CREATE TABLE IF NOT EXISTS mydb.Login ( idLogin INT NOT NULL, login VARCHAR(60) NULL, senha INT NULL, PRIMARY KEY (idLogin)) ENGINE = InnoDB;


-- Table mydb.Agenda_has_Imovel


DROP TABLE IF EXISTS mydb.Agenda_has_Imovel ;

CREATE TABLE IF NOT EXISTS mydb.Agenda_has_Imovel ( idAgenda INT NOT NULL, idImovel INT NOT NULL, PRIMARY KEY (idAgenda, idImovel), INDEX fk_Agenda_has_Imovel_Imovel1_idx (idImovel ASC), INDEX fk_Agenda_has_Imovel_Agenda1_idx (idAgenda ASC), CONSTRAINT fk_Agenda_has_Imovel_Agenda1 FOREIGN KEY (idAgenda) REFERENCES mydb.Agenda (idAgenda) ON DELETE CASCADE ON UPDATE NO ACTION, CONSTRAINT fk_Agenda_has_Imovel_Imovel1 FOREIGN KEY (idImovel) REFERENCES mydb.Imovel (idImovel) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;


-- Table mydb.Renovacao_has_Contrato


DROP TABLE IF EXISTS mydb.Renovacao_has_Contrato ;

CREATE TABLE IF NOT EXISTS mydb.Renovacao_has_Contrato ( idRenovacao INT NOT NULL, idContrato INT NOT NULL, PRIMARY KEY (idRenovacao, idContrato), INDEX fk_idRenovacao (idContrato ASC), INDEX fk_idContrato (idRenovacao ASC), CONSTRAINT fk_Renovacao_has_Contrato_Renovacao1 FOREIGN KEY (idRenovacao) REFERENCES mydb.Renovacao (idRenovacao) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT fk_Renovacao_has_Contrato_Contrato1 FOREIGN KEY (idContrato) REFERENCES mydb.Contrato (idContrato) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;


-- Table mydb.Pessoa_has_Imovel


DROP TABLE IF EXISTS mydb.Pessoa_has_Imovel ;

CREATE TABLE IF NOT EXISTS mydb.Pessoa_has_Imovel ( idPessoa INT NOT NULL, idImovel INT NOT NULL, PRIMARY KEY (idPessoa, idImovel), INDEX fk_Pessoa_has_Imovel_Imovel1_idx (idImovel ASC), INDEX fk_Pessoa_has_Imovel_Pessoa1_idx (idPessoa ASC), CONSTRAINT fk_Pessoa_has_Imovel_Pessoa1 FOREIGN KEY (idPessoa) REFERENCES mydb.Pessoa (idPessoa) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT fk_Pessoa_has_Imovel_Imovel1 FOREIGN KEY (idImovel) REFERENCES mydb.Imovel (idImovel) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;

SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

##Tela Cadastro de imóvel

namespace ContratosImobiliarios { public partial class CadastroImovel : Form { public CadastroImovel() { InitializeComponent(); } //instancia a classe de cadastro de imóvel ClasseCadastroImovel n = new ClasseCadastroImovel();

  //Botão cancelar, que fecha a janela
    private void buttonCancelar_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    //Botão confirmar, que confirma e envia os dados cadastrados
    private void buttonConfirmar_Click(object sender, EventArgs e)
    {
        // VERIFICA CAMPOS VAZIOS
        foreach (Panel p in this.Controls.OfType<Panel>())
        {
           
            foreach (TextBox txt in p.Controls.OfType<TextBox>())
            {

               

                    if (txt.Text == "")
                    {
                        MessageBox.Show("Favor Preenher todos os campos");
                        return;
                    }
                    
               
                }
            }
        
     n.Nome = textBoxNome.Text;
     n.Rua = textBoxRua.Text;
     n.Bairro = textBoxBairro.Text;
     n.Cidade = textBoxCidade.Text;
     n.Estado = comboBoxEstado.Text;
     n.Tamanho = textBoxTamanho.Text;
     n.Comodos = textBoxComodos.Text;
     n.Garagem = textBoxGaragem.Text;
     n.Aluguel = maskedTextBoxPreco.Text;
     n.Tipo = comboBoxTipo.Text;
     n.Status = comboBoxStatus.Text;
     n.Cep = maskedTextBoxCep.Text;
     n.Insert();
     

     MessageBox.Show("Candidato Cadastrado Com Sucesso");           
     this.Close();
}  

}

}

##Classe Cadastro de imóveis

namespace ContratosImobiliarios { public class ClasseCadastroImovel {

    // Tabela Candidato
    public string Nome { get; set; }
    public string Tipo { get; set; }
    public string Aluguel { get; set; }
    public string Data { get; set; }
    public string Rua { get; set; }
    public string Bairro { get; set; }
    public string Cidade { get; set; }
    public string Estado { get; set; }
    public string Complemento { get; set; }
    public string Cep { get; set; }
    public string Tamanho { get; set; }
    public string Comodos { get; set; }
    public string Garagem { get; set; }
    public string Status { get; set; }
  	
    //Inseri os dados recebidos no banco de dados
    public void Insert()
    {

        ConexaoBD.ExecutarComando(@"INSERT INTO imovel(nome,rua,bairro,cidade,tamanho,comodos,garagem,aluguel,tipo,status,cep)   
        VALUES ('" + Nome + "','" + Rua + "','" + Bairro + "','" + Cidade + "','" + Tamanho + "','" + Comodos + "','" + Garagem + "','" + Aluguel + "','" + Tipo + "','" + Status + "','" + Cep + "')");
        
       
    }


}

} Classe de conexão com o Bando de dados using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data.MySqlClient; using System.Windows.Forms; using System.Data;

namespace ContratosImobiliarios { public static class ConexaoBD { public static MySqlConnection conexao = null;

    //Abre a conexão com o banco de dados
    public static void AbrirConexao()
    {
       
        try
        {
              
             // Verifica se existe um conexão ativa com o banco de dados
            if (conexao != null)
            {
                conexao.Close();
            }

            // Cria o objeto de conexão e define os parametros
            // de conexão com o banco de dados
            conexao = new MySqlConnection("server=localhost;port=3306;database=mydb;uid=root;pwd='admin'");

            // Abre a conexão com o banco de dados
            conexao.Open();
        }
        catch (MySqlException me)
        {
            throw new Exception(me.Message);

        }
        catch (Exception e)
        {
            throw new Exception(e.Message);

        }
       
    }
    //Fecha a conexão com o banco de dados
    public static void FecharConexao()
    {
        try
        {
            conexao.Close();
            conexao.Dispose();
        }
        catch (MySqlException me)
        {
            throw new Exception(me.Message);

        }
        catch (Exception e)
        {
            throw new Exception(e.Message);

        }
    }
	
 //Executa o commando enviado pela classe de cadastro de imóvel
    public static int ExecutarComando(string SQL)
    {
        try
        {
            AbrirConexao();

            MySqlCommand comando = new MySqlCommand();

            comando.Connection = conexao;
            comando.CommandText = SQL;
            comando.CommandType = CommandType.Text;
            
            return comando.ExecuteNonQuery();
        }
        catch (MySqlException me)
        {
            throw new Exception(me.Message);

        }
        catch (Exception e)
        {
            throw new Exception(e.Message);

        }
        finally
        {
            FecharConexao();
        }
    }
}

}

##Tela de busca de imóvel

namespace ContratosImobiliarios { public partial class BuscaPessoa : Form { public BuscaPessoa() { InitializeComponent(); } //Dados de conexão MySqlConnection conexao = new MySqlConnection("server=localhost;port=3306;database=mydb;uid=root;pwd='admin'"); int cont = 0;

    MySqlDataAdapter dataAdapter = new MySqlDataAdapter();
    DataTable dataTable = new DataTable();
    string comandoString;

    bool rowHave = false;

 //Botão Cancelar, fecha a tela
    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }

 //Escolha de pesquisa
    private void radioButton2_CheckedChanged(object sender, EventArgs e)
    {
        textBoxCNPJ.Enabled = false;
        textBoxCPF.Enabled = false;
              }

 //Pesquisa no banco de dados
    private void GetData()
    {

        try
        {
            conexao.Open();

            MySqlCommand comando = new MySqlCommand();

            comando.Connection = conexao;
            comando.CommandText = comandoString;
            comando.CommandType = CommandType.Text;

            MySqlDataAdapter dataAdapter = new MySqlDataAdapter(comando);

            dataAdapter.Fill(dataTable);

            dataGridView1.DataSource = dataTable;
        }
        catch (MySqlException mex)
        {
            MessageBox.Show(mex.Message);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            conexao.Dispose();
            conexao.Close();
        }
    }
	// Gera relatório da busca
    private void buttonGerar_Click(object sender, EventArgs e)
    {
        string[,] upInfo = new string[100, 5];
        string caminho = @"C:/Relatorio/Relatorio"; ;


        string passa = "";

        try
        {

            caminho += cont++ + ".txt";
            System.IO.File.Create(caminho).Close();

            for (int i = 0; i < dataGridView1.RowCount; i++)
            {
                for (int j = 0; j < dataGridView1.ColumnCount; j++)
                {
                    if (dataGridView1[j, i].Value != null)
                    {
                        upInfo[j, i] = dataGridView1[j, i].Value.ToString();
                        passa += "  " + upInfo[j, i] + "  ";
                        File.WriteAllText(caminho, passa);

                    }
                    if (j == 4)
                    {
                        passa += "\r\n";
                    }
                }
            }
            MessageBox.Show("Relatório gerado com sucesso!\r\n  Caminho: " + "C:/Relatorio/Relatorio" + " ");
        }
        catch (UnauthorizedAccessException ex)
        {

        }
        catch (Exception ex)
        {
            MessageBox.Show("Crie uma pasta chamada Relatorio no disco local C!");
        }
    }
	
 // Botão procurar, faz a pesquisa dos dados
    private void buttonProcurar_Click(object sender, EventArgs e)
    {
        if (dataGridView1.DataSource != null)
        {
            dataGridView1.DataSource = null;
        }
        else
        {
            dataGridView1.Rows.Clear();
        }

        comandoString = (@"SELECT * FROM imovel  WHERE nome LIKE '%" + textBoxNome.Text + "%' AND cep LIKE'%" + textBoxCEP.Text + "%';");


        GetData();

        if (dataGridView1.Columns.Equals(0))
        {
            dataGridView1.Columns[0].Visible = false;
        }


      
        if (dataGridView1.ColumnCount > 0)
        {
           
            foreach (TextBox txt in this.Controls.OfType<TextBox>())
            {
                txt.Enabled = false;
            }



            foreach (Button btn in this.Controls.OfType<Button>())
            {
                btn.Enabled = true;
            }

            buttonProcurar.Enabled = false;

        }
    }

  // Botão atualizar, atualiza os dados modificados da pesquisa
    private void buttonAtualizar_Click(object sender, EventArgs e)
    {
        //LIMPA AS TEXT BOX PARA UMA NOVA PROCURA
        foreach (TextBox txt in this.Controls.OfType<TextBox>())
        {
            txt.Text = null;
        }

        //TODOS OS BUTTONS BLOQUIADOS COM EXCESSAO DO buttonProcurar
        foreach (Button btn in this.Controls.OfType<Button>())
        {
            if (btn.Enabled)
            {
                btn.Enabled = false;
            }
        }

        buttonProcurar.Enabled = true;

        MySqlCommandBuilder commandBuilder;
        DataTable dtChanges;
        MySqlCommand cmd = new MySqlCommand(comandoString, conexao);

        try
        {
            if (dataGridView1.DataSource != null)
            {
                dataAdapter.SelectCommand = cmd;
                commandBuilder = new MySqlCommandBuilder(dataAdapter);

                dataAdapter.UpdateCommand = commandBuilder.GetUpdateCommand();

                dtChanges = dataTable.GetChanges();

                if (dtChanges != null)
                {
                    dataAdapter.Update(dtChanges);

                    dataTable.AcceptChanges();
                    // 
                    MessageBox.Show("Atualização realizada com sucesso...");
                }
            }
        }

        catch (MySqlException mex)
        {
            MessageBox.Show(mex.Message);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

        dataTable.Clear();
        dataGridView1.Refresh();

        textBoxCEP.Enabled = true;
        textBoxNome.Enabled = true;

    }
  // Botão deletar, deleta a linha selecionada
    private void buttonDeletar_Click(object sender, EventArgs e)
    {
        try
        {
            foreach (DataGridViewCell oneCell in dataGridView1.SelectedCells)
            {
                if (oneCell.Selected && rowHave && !oneCell.Selected.Equals(""))
                {
                    dataGridView1.Rows.RemoveAt(oneCell.RowIndex);

                }
            }
        }
        catch (Exception a)
        {
            MessageBox.Show("Valor nulo não pode ser deletado!");
        }
    }


 // informa se alguma linha foi clicada
    private void dataGridView1_CellClick_1(object sender, DataGridViewCellEventArgs e)
    {
        rowHave = true;
    }
}

}

⚠️ **GitHub.com Fallback** ⚠️