Desenvolva um sistema de controle de imobiliária, levando em consideração os pontos abaixo, construa também um diagrama de classes.

  • A imobiliária negocia com muitos donos de imóveis, que desejam vendê-los ou alugá-los. Os imóveis podem ser de diversos tipos, como casas, apartamentos, chácaras ou terrenos. A imobiliária considera dono a pessoa física ou jurídica possuidora de um ou mais imóveis.
  • Para que um imóvel possa ser vendido ou alugado, é necessário que o dono do imóvel preencha um contrato de intermediação de compra ou aluguel com a imobiliária. Nesse contrato, a imobiliária se compromete em oferecer o imóvel em questão a interessados e intermediar o processo de venda/aluguel.
  • A imobiliária também se compromete a pagar ao dono do imóvel os valores relativos à transação de compra ou aluguel, descontadas a comissão da imobiliária, possíveis taxas governamentais ou quaisquer outras taxas pendentes, como gastos da imobiliária no reparo do imóvel, por exemplo.
  • A empresa possui muitos corretores trabalhando para ela. É responsabilidade deles atender os clientes da imobiliária e intermediar a venda ou aluguel de imóveis. A imobiliária considera clientes as pessoas físicas ou jurídicas que compram ou alugam imóveis oferecidos pela empresa, bem como os donos desses imóveis.
  • A imobiliária precisa manter registros de quem era o dono de um imóvel vendido e quem o comprou. Da mesma forma, a empresa precisa saber quem é o dono de um determinado imóvel que está sendo alugado, quem já o alugou (incluindo o início e o fim da locação e os valores pagos durante a locação) e quem o aluga atualmente ou, ainda, se o imóvel encontra-se sem locador.
  • A imobiliária intermedeia a venda ou aluguel de muitos imóveis. Sendo assim, precisa manter informações sobre todos os imóveis com que já trabalhou, estando eles em oferta ou já vendidos ou locados. Os imóveis podem ser de diversos tipos, como casas, apartamentos, salas comerciais, chácaras ou terrenos.
  • A imobiliária negocia com muitos donos de imóveis que desejam vendê-los ou alugá-los. A imobiliária considera dono a pessoa física ou jurídica possuidora de um ou mais imóveis. Um dono deve possuir (ou ter possuído em algum momento) ao menos um imóvel, mas pode possuir muitos.
  • Um imóvel pode ser vendido ou alugado diversas vezes (em tempos diferentes obviamente). É necessário registrar cada venda ou locação intermediada pela imobiliária. Essa informação deve incluir os dados do dono e os do comprador/locador, bem como o corretor que intermediou a operação. No caso de venda, deve-se incluir o valor pago pelo imóvel, as taxas e impostos pagos, bem como o percentual recebido pela imobiliária. No caso de locação, deve-se registrar o valor mensal do aluguel, o tempo de vigência do aluguel, os dados dos fiadores ou o valor da caução.
  • No caso de locações, a imobiliária se compromete em repassar o valor dos aluguéis ao dono do imóvel, após descontar seu percentual. Assim, sempre que um locador pagar o aluguel (com possível juro em caso de atraso), a imobiliária repassará ao dono o valor pago descontado de sua comissão. Dessa forma, todos os pagamentos de aluguel devem ser registrados.
  • A empresa possui muitos corretores trabalhando para ela. É responsabilidade
    dos corretores atender os clientes da imobiliária e intermediar a venda ou aluguel de imóveis. É necessário, portanto, registrar todos os corretores que trabalham ou já trabalharam para a imobiliária.
  • A imobiliária considera clientes as pessoas físicas ou jurídicas que compram ou alugam imóveis oferecidos pela empresa, bem como os donos desses imóveis. Sendo assim, é preciso manter registros dos dados de todos os clientes da imobiliária, atuais ou anteriores.

Classes

  • Imovel e classes especializadas - Essa é uma classe abstrata que contém os atributos gerais de um imóvel, como endereço, bairro, CEP, cidade, descrição, área total, valor e situação do imóvel. Esse último atributo é do tipo Situacao, uma classe de enumeração que contém as possíveis situações porque pode passar um imóvel. Essa classe é especializada em quatro classes concretas que representam os tipos de imóveis com os quais a imobiliária trabalha, que são Terreno, Casa, Apartamento e Chácara, cujos atributos acreditamos ser autoexplicativos. A única exceção seria, talvez, o atributo tipoApartamento, que pertence ao tipo da classe TipoApto, uma classe de enumeração que contém todos os tipos de apartamento que a imobiliária opera. Todas as classes especializadas possuem um método para consultar um objeto específico e outro para listar os objetos de sua respectiva classe.
  • Tipolmovel - Essa classe armazena os tipos de imóvel com que a imobiliária trabalha. Seu único atributo é a descrição do tipo de imóvel.
  • Corretor - Essa classe representa os corretores que trabalharam ou já trabalharam para a imobiliária. Seus atributos e métodos são autoexplicativos.
  • Pessoa, Pessoa Física e Pessoa Jurídica - A classe Pessoa é uma classe abstrata que contém os atributos comuns às classes especializadas PessoaFisica e PessoaJuridica, que, por sua vez, contêm, respectivamente, um atributo para armazenar o CPF e o CNPJ da pessoa. Cada classe especializada contém um método para consultar uma pessoa (por seu CPF ou por seu CNPJ, dependendo da classe) e outro para listar todos os objetos da classe.
  • Contrato - Essa é uma classe associativa que contém as informações relativas a um contrato estabelecido para a compra ou venda de um imóvel. É produzida pela associação entre a classe Pessoa e a classe Imóvel, cuja multiplicidade é muitos para muitos. Seus atributos são a data em que o contrato foi redigido, o caminho onde o arquivo do contrato se encontra e o tipo de contrato que se refere a uma classe de enumeração que identifica todos os contratos aceitos pela imobiliária. A classe contém ainda um método para registrar um contrato.
  • Compra - Essa classe representa as compras de imóveis intermediadas pela imobiliária. Seus atributos são a data em que a compra foi realizada, do tipo Date, e o valor da compra, o percentual da imobiliária e a comissão do corretor, do tipo double. A classe possui ainda um método para registrar a compra. Observe que essa classe se relaciona com a classe Corretor, já que um corretor deve intermediar a compra, com a classe Imovel, posto que a compra refere-se a um imóvel, e com a classe Pessoa, que representa a pessoa que realiza a compra do imóvel.
  • Taxa - Essa classe representa as taxas (impostos, taxas de cartório etc.) pagas ao ser realizada uma compra. Seus atributos são descrição e valor da taxa. A classe possui ainda um método para registrar o pagamento de uma taxa.
  • Aluguel - Essa classe representa os contratos de aluguel de imóvel intermediados pela imobiliária. Seus atributos são início, vigência e encerramento do aluguel, do tipo Date, e valor, caução e comissão do corretor, do tipo double. Observe que os atributos encerramento e caução possuem multiplicidade [0…1], o que significa que podem ser deixados vazios, uma vez que a data de encerramento não é determinada, o aluguel possui uma vigência, mas o contrato pode ser rescindido pelo dono do imóvel ou locatário. Além disso, o valor da caução só é exigido se não forem fornecidos fiadores. Os métodos dessa classe permitem registrar um novo contrato de aluguel ou encerrar um contrato já existente. A classe Aluguel possui muitas associações e relaciona-se com a classe Pessoa por meio de duas associações: a primeira dela refere-se à contratação de um aluguel por uma pessoa e a segunda determina que uma pessoa compromete-se a ser fiador de um aluguel (note que um aluguel pode não ter nenhum fiador, conforme demonstra a multiplicidade). Além disso, a classe Aluguel relaciona-se com a classe Corretor, pela necessidade de um corretor intermediar o aluguel, com a classe Imovel, uma vez que um aluguel refere-se a um imóvel, e com a classe PagamentoAluguel, já que é necessário registrar todos os possíveis pagamentos relativos a um determinado aluguel.
  • PagamentoAluguel - Essa classe representa os pagamentos de um determinado aluguel. Seus atributos referem-se à data do vencimento e à data do pagamento (não são necessariamente os mesmos, podendo haver atrasos), do tipo Date, além do valor pago, dos eventuais juros pagos e do percentual da imobiliária, do tipo double. Vários desses atributos podem não ser realmente preenchidos, conforme demonstra a sua multiplicidade. A classe possui ainda um método para registrar o pagamento.

Casos de Uso

Os atores:
  • Administrador - Este ator representa o funcionário responsável por gerenciar a corretora de imóveis.
  • Corretor - Este ator representa os corretores que trabalham para a imobiliária, responsáveis por intermediar os processos de aluguel e venda de imóveis, bem como o pagamento de aluguéis.
  • Cliente - Este ator representa os clientes da imobiliária que podem tanto ser donos de imóveis sob aluguel ou venda como pessoas que compram ou alugam esses imóveis. Observe que existem duas especializações a partir do ator Cliente, chamadas Pessoa Física e Pessoa Jurídica, indicando que o cliente pode tanto constituir-se de uma pessoa física quanto de uma pessoa jurídica.
A seguir, descreveremos os casos de uso que compõem esse diagrama:
  • Gerenciar Corretores - Este caso de uso representa o cadastro simples por meio do qual são registrados os dados dos corretores que trabalham para a corretora.
  • Preencher Contrato - Este caso de uso representa o processo por meio do qual um contrato de venda ou locação é firmado entre o dono do imóvel e a locadora.
  • Realizar Login - Este caso de uso representa o processo por meio do qual o administrador ou os corretores se logan no sistema.
  • Vender Imóvel - Este caso de uso representa o processo por meio do qual um imóvel à venda passa a ser definido como tendo sido vendido. Esse processo inclui o pagamento ao dono do imóvel do valor pago, descontada a comissão da imobiliária.
  • Alugar Imóvel - Este caso de uso representa o processo por meio do qual um imóvel posto para alugar passa a ser definido como tendo sido locado. Esse processo inclui o pagamento de uma comissão ao corretor que intermediou o aluguel.
  • Registrar Pagamento de Aluguel - Este caso de uso representa o processo por meio do qual um cliente paga um ou mais meses de aluguel. O processo inclui o depósito do aluguel ao dono do imóvel, descontanda a comissão da imobiliária.
  • Gerenciar Clientes - Este caso de uso representa o processo para registrar ou alterar o cadastro dos clientes da imobiliária, que podem tanto ser donos de imóveis como pessoas que compram ou alugam imóveis. Os clientes da imobiliária podem ser tanto pessoas físicas como jurídicas.

Passo 1

O que o problema pede (em linguagem clara) e quais informações foram dadas:
  • Pedem um sistema de controle para uma imobiliária que:
    • Gerencie donos (pessoas físicas ou jurídicas) e clientes (compradores/locatários e também donos);
    • Cadastre e controle todos os imóveis (venda/locação), com histórico de vendas e locações;
    • Registre contratos de intermediação (venda/locação) entre dono e imobiliária;
    • Registre operações de Compra (venda) e de Aluguel, incluindo taxas, comissões e repasses ao dono;
    • Registre corretores e associe o corretor que intermediou cada operação;
    • Registre pagamentos de aluguéis (com juros por atraso quando houver) e o repasse ao dono descontando comissões;
    • Mantenha histórico de proprietários anteriores e locadores anteriores.
  • Informações importantes extraídas do enunciado:
    • Um dono (Pessoa Física ou Jurídica) possui (ou já possuía) um ou mais imóveis.
    • Um imóvel pode ser vendido ou alugado várias vezes (historicamente).
    • Para cada venda/locação é obrigatório registrar: dono, comprador/locatário, corretor, valores, taxas, percentual da imobiliária, comissão do corretor, datas e documentos.
    • Contrato de intermediação é uma entidade (associativa) entre Pessoa e Imóvel.
    • Aluguel tem início, vigência, eventual encerramento, valor mensal, caução ou fiadores; pagamentos mensais precisam ser registrados.
    • Pagamentos de aluguel podem ter juros por atraso e a imobiliária retém percentual antes de repassar ao dono.
    • Existem tipos de imóvel (Terreno, Casa, Apartamento, Chácara, Sala comercial etc.) e enumerações como Situação e TipoApto.
  • O que a solução deve entregar: um projeto de classes (diagrama de classes) e explicação de como as classes se relacionam e como o sistema trata os casos de uso (venda, locação, repasses, contratos, cadastro de corretores e clientes).

Passo 2

Visão geral do método de modelagem que vou usar (como pensar o diagrama):
  • Vamos modelar primeiro as entidades do domínio (Imóvel, Pessoa, Contrato, Compra, Aluguel, PagamentoAluguel, Taxa, Corretor, etc.).
  • Aplicar conceitos de orientação a objetos:
    • Herança para especializações (ex.: Pessoa → PessoaFisica / PessoaJuridica; Imovel → Casa / Apartamento / …).
    • Associação para relacionamentos entre entidades (ex.: Imóvel — dono — Pessoa).
    • Classe associativa quando a associação possui atributos próprios (ex.: Contrato entre Pessoa e Imóvel).
    • Enumerações para valores fixos (ex.: Situação do imóvel, TipoContrato, TipoApto).
  • Vou também definir multiplicidades essenciais (quantos de A para B) e indicar agregação/composição quando fizer sentido.
  • Ensinar rapidinho: multiplicidade indica quantas instâncias de uma classe se relacionam com outra. Ex.: 1 significa exatamente um; 0..1 significa opcional; 1..* ou 1..\infty significa um ou muitos; 0..* significa zero ou muitos.

Passo 3

Identificação das entidades principais e por que cada uma é necessária (aqui ensino o raciocínio):
  • Imovel (abstrata): representa qualquer bem imobiliário. Precisa porque toda venda/locação refere-se a um imóvel.
  • Pessoa (abstrata) → PessoaFisica / PessoaJuridica: para representar donos, compradores, locatários e fiadores. Separação porque CPF/CNPJ têm regras diferentes.
  • Contrato: é a prova do vínculo entre dono e imobiliária para intermediação; possui atributos próprios (data, arquivo, tipo).
  • Compra: representa uma venda (historicamente importante: quem vendeu, quem comprou, valores e taxas).
  • Aluguel: representa um contrato de locação em vigor ou histórico (com início, vigência, encerramento, caução, fiadores).
  • PagamentoAluguel: registra cada pagamento mensal (com data de vencimento, data de pagamento, juros, valor, percentual da imobiliária).
  • Taxa: taxas associadas a uma compra (impostos, cartório).
  • Corretor: profissional que intermedia; associado a Compra e Aluguel.
  • TipoImovel / Situcao / TipoContrato / TipoApto: enumerações para valores fixos que evitam erros de string e facilitam regras de negócio.
  • Histórico de propriedade e histórico de locações: podem ser derivados das entidades Compra e Aluguel — ensinar: não duplicar dados desnecessariamente; registre eventos (transações) e consulte o histórico quando necessário.

Passo 4

Como modelar propriedade e histórico (explicação prática para a prova):
  • Não armazenar apenas o “dono atual”. Armazenar cada transferência de propriedade como uma instância de Compra com referências ao vendedor (dono anterior) e comprador (novo dono). Assim, histórico é natural.
  • Para locações: cada contrato de Aluguel é uma instância com referência ao dono atual do imóvel (no momento do início do aluguel), ao locatário, aos fiadores (lista de Pessoa) e aos pagamentos (PagamentosAluguel). O histórico de locadores/locatários é obtido consultando todas as instâncias de Aluguel para esse imóvel.
  • Por que isso é legal? Porque permite consultas como “quem foi dono em dada data?” ou “quem alugou no período X” através de filtros por data nas transações.

Passo 5

Detalhamento das principais classes — atributos e métodos (ensinando notação de atributos e decisões de projeto).
  • Observação: abaixo uso o formato: NomeClasse — atributos: nome: Tipo; métodos: operacao(). Tipos comuns: \text{String}, \text{Date}, \text{Decimal}, \text{UUID}, boolean; e enums específicos.
  • Imovel (abstrata)
    • atributos: id: \text{UUID}, endereco: \text{String}, bairro: \text{String}, cep: \text{String}, cidade: \text{String}, descricao: \text{String}, area: \text{Decimal}, valorSugerido: \text{Decimal}, situacao: \text{Situacao}.
    • métodos: consultar(id), listar(filtros).
    • observação: situacao é enum (ex.: \text{DISPONIVEL\_VENDA}, \text{EM\_LOCACAO}, \text{VENDIDO}, \text{INATIVO}).
  • Especializações de Imovel: Casa, Apartamento, Terreno, Chacara, SalaComercial
    • cada uma com atributos específicos (ex.: Apartamento tem andar: \text{Integer}, tipoApartamento: \text{TipoApto}, condominio: \text{Decimal}).
    • métodos: herdam consultar e listar.
  • Pessoa (abstrata)
    • atributos: id: \text{UUID}, nome: \text{String}, telefone: \text{String}, email: \text{String}, endereco: \text{String}, dataCadastro: \text{Date}.
    • métodos: consultar(id), listar(filtros).
  • PessoaFisica extends Pessoa
    • atributos: cpf: \text{String}, dataNascimento: \text{Date}.
  • PessoaJuridica extends Pessoa
    • atributos: cnpj: \text{String}, razaoSocial: \text{String}.
  • Corretor
    • atributos: id: \text{UUID}, nome: \text{String}, creci: \text{String}, email: \text{String}, ativo: \text{Boolean}.
    • métodos: registrarVenda(Compra), registrarAluguel(Aluguel).
  • Contrato (classe associativa entre Pessoa e Imovel)
    • atributos: id: \text{UUID}, data: \text{Date}, arquivoCaminho: \text{String}, tipoContrato: \text{TipoContrato} (enum: \text{INTERMEDIACAO\_VENDA}, \text{INTERMEDIACAO\_ALUGUEL}), observacoes: \text{String}.
    • relações: associa \text{Pessoa (dono)} com \text{Imovel}. Multiplicidade: uma Pessoa pode ter 0..\ast Contratos; um Imovel pode ter 0..\ast Contratos (ex.: contratos antigos).
  • Compra
    • atributos: id: \text{UUID}, dataVenda: \text{Date}, valorPago: \text{Decimal}, percentualImobiliaria: \text{Decimal}, comissaoCorretor: \text{Decimal}.
    • relações: imovel: \text{Imovel}, vendedor: \text{Pessoa} (dono no momento da venda), comprador: \text{Pessoa}, corretor: \text{Corretor}, taxas: \text{List<Taxa>}.
    • método: registrarCompra().
  • Taxa
    • atributos: id: \text{UUID}, descricao: \text{String}, valor: \text{Decimal}, compra: \text{Compra} (FK).
    • método: registrarTaxa().
  • Aluguel
    • atributos: id: \text{UUID}, inicio: \text{Date}, vigenciaMeses: \text{Integer}, encerramento: \text{Date} (opcional, multiplicidade 0..1), valorMensal: \text{Decimal}, caucao: \text{Decimal} (opcional), percentualImobiliaria: \text{Decimal}, comissaoCorretor: \text{Decimal}.
    • relações: imovel: \text{Imovel}, donoAoInicio: \text{Pessoa}, locatario: \text{Pessoa}, fiadores: \text{List<Pessoa>} (multiplicidade 0..\ast), corretor: \text{Corretor}, pagamentos: \text{List<PagamentoAluguel>}.
    • métodos: registrarAluguel(), encerrarAluguel(dataEncerramento).
  • PagamentoAluguel
    • atributos: id: \text{UUID}, vencimento: \text{Date}, dataPagamento: \text{Date} (opcional se não pago), valorPago: \text{Decimal}, juros: \text{Decimal} (opcional), percentualImobiliaria: \text{Decimal}.
    • relações: aluguel: \text{Aluguel}, possivelmente recebedor: \text{Pessoa} (dono no momento do repasse).
    • métodos: registrarPagamento() — ao registrar, calcula-se o repasse ao dono.
  • Observação didática sobre métodos: os métodos de registrar (Compra, Aluguel, Pagamento) devem validar regras de negócio e persistir transações atomica e consistentemente.

Passo 6

Como calcular o repasse ao dono (fórmula detalhada e exemplos para a prova)
  • Regras gerais (explicadas passo a passo):
    • Ao receber um pagamento de venda ou aluguel, a imobiliária retém sua comissão (percentual sobre o valor bruto) e desconta taxas e despesas pagas pela imobiliária.
    • Fórmula geral para o repasse em uma venda: \text{repasse\_venda} = \text{valorPago} - (\text{percentualImobiliaria}\times\text{valorPago}) - \sum \text{taxas} - \text{despesasReais}
    • Para um pagamento de aluguel (mensal): \text{repasse\_mensal} = \text{valorPago} + \text{juros} - (\text{percentualImobiliaria}\times(\text{valorPago}+\text{juros})) - \text{despesas\_eventuais}
    • Exemplo numérico rápido (ensino prático):
      • Suponha \text{valorPago}= \,2000{,}00, \text{percentualImobiliaria}=0{,}10 (ou seja 10\%), sem taxas. Então: \text{repasse\_mensal} = 2000{,}00 - 0{,}10\times2000{,}00 = 2000{,}00 - 200{,}00 = 1800{,}00.
  • Observação: sempre armazenar o cálculo do repasse por pagamento (auditável), para permitir conferência histórica.

Passo 7

Regras de integridade e transações (como implementar de forma segura)
  • Ao registrar uma Compra/Aluguel/Pagamento, executar dentro de uma transação ACID:
    • Iniciar transação;
    • Validar pré-condições (por exemplo: imóvel disponível para venda/locação; contrato de intermediação assinado; corretor ativo);
    • Persistir o evento (Compra/Aluguel/Pagamento);
    • Atualizar o estado corrente do imóvel (ex.: marcar como \text{VENDIDO} após compra, ou \text{EM\_LOCACAO} ao iniciar aluguel);
    • Calcular e persistir repasse e lançamentos financeiros (contas a pagar ao dono, retenção de comissão);
    • Commit se tudo ok; rollback caso erro.
  • Ensinar: assim evita que um pagamento seja registrado sem que o estado do imóvel seja atualizado (consistência).

Passo 8

Modelagem relacional (mapa rápido de tabelas) — como virar prova prática:
  • Para cada classe principal crie uma tabela: Imovel, Casa, Apartamento (com chave estrangeira para Imovel), Pessoa, PessoaFisica, PessoaJuridica, Corretor, Contrato, Compra, Taxa, Aluguel, PagamentoAluguel.
  • Chaves:
    • Cada tabela tem id como PK ( \text{UUID} ou serial).
    • FK entre Compra.imovelId \to Imovel.id, Compra.vendedorId \to Pessoa.id, Compra.compradorId \to Pessoa.id, Compra.corretorId \to Corretor.id.
    • Aluguel.imovelId \to Imovel.id, PagamentoAluguel.aluguelId \to Aluguel.id, etc.
  • Índices:
    • Índices em Imovel.situacao, Pessoa.cpf, PessoaJuridica.cnpj, Aluguel.inicio, Compra.dataVenda.
  • Dica prática para prova: desenhe a tabela e as FKs ao lado do seu diagrama de classes; professor gosta de ver a correspondência OO → relacional.

Passo 9

Mapeamento de casos de uso para operações do sistema (fluxos simplificados)
  • Gerenciar Corretores:
    • CRUD de Corretor; validações (único \text{creci}); histórico de atuação (campo dataFim se sair).
  • Preencher Contrato:
    • Criar Contrato ligando Pessoa (dono) e Imovel; armazenar arquivo; validar assinatura (fluxo offline: armazenar caminho para arquivo assinado).
  • Vender Imóvel:
    • Pré-condições: existe Contrato de intermediação ativo entre dono e imobiliária; imóvel disponível.
    • Processo: registrar Compra + Taxas → calcular repasse → gerar lançamento financeiro de repasse ao dono → alterar Imovel.situacao para \text{VENDIDO}.
  • Alugar Imóvel:
    • Pré-condições: contrato de intermediação de locação assinado; imóvel disponível.
    • Processo: registrar Aluguel → cronograma de pagamentos (gera instâncias PagamentoAluguel com vencimentos) → marcar Imovel.situacao = \text{EM\_LOCACAO}.
  • Registrar Pagamento de Aluguel:
    • Localizar o \text{PagamentoAluguel} pendente, registrar dataPagamento, calcular juros se dataPagamento > vencimento, calcular repasse e gravar lançamento a pagar ao dono.
  • Gerenciar Clientes:
    • CRUD de Pessoa (Física/Jurídica), com validações de CPF/CNPJ; vincular como dono, comprador, locatário ou fiador.

Passo 10

Regras extra e boas práticas (dicas pra prova e para a implementação)
  • Validar sempre CPF/CNPJ com rotinas próprias antes de persistir.
  • Ao vender um imóvel, remover (ou encerrar) contratos de intermediação futuros ligados ao imóvel antigo ou atualizá-los conforme política.
  • Manter logs/auditoria: quem registrou tal pagamento, quando e qual cálculo de repasse foi usado.
  • Evitar duplicidade: um imóvel não pode ter dois aluguéis ativos simultâneos; regra: verificar existência de Aluguel ativo (sem encerramento) antes de registrar novo.
  • Versionamento de contratos: mantenha Contrato.versao ou registre data e arquivo, não sobrescreva o arquivo original.
  • Segurança: controle de acesso por papéis (Administrador, Corretor); operações financeiras somente por usuários com permissão.

Passo 11

Como representar o diagrama de classes no desenho (breve instrução para desenhar na prova)
  • Use retângulos com três seções: nome da classe, atributos, métodos.
  • Use seta com triângulo preenchido (generalização) de Pessoa → PessoaFisica / PessoaJuridica e de Imovel → Casa/Apartamento/…
  • Use linha simples com multiplicidade ao lado para associações; para Contrato use uma linha conectando Pessoa e Imovel e desenhe Contrato como classe associativa ligada às duas.
  • Marque enums com estereótipo «enumeration».
  • Marque atributos opcionais com multiplicidade 0..1 (ex.: Aluguel.encerramento: 0..1).

Passo 12

Checklist final que eu faria na hora da prova (resumo prático, motivador)
  • Liste entidades principais antes de desenhar (Imovel, Pessoa, Contrato, Compra, Aluguel, PagamentoAluguel, Taxa, Corretor).
  • Decida heranças (Pessoa e Imovel).
  • Decida onde usar classe associativa (Contrato).
  • Coloque multiplicidades e chaves (quem tem muitos de quem).
  • Acrescente enums (Situação, TipoContrato, TipoApto).
  • Escreva as regras de negócio mais importantes ao lado (por exemplo: fórmula do repasse).
  • Desenhe e entregue: professor costuma aceitar diagrama + explicação curta das associações e principais regras.

Resposta

Segue o diagrama de classes descrito de forma compacta (modelo final que responde ao enunciado). Cada linha indica: Classe — atributos (tipo) ; métodos ; relações principais com multiplicidades.
Imovel (abstract) — id: \text{UUID} ; endereco: \text{String} ; bairro: \text{String} ; cep: \text{String} ; cidade: \text{String} ; descricao: \text{String} ; area: \text{Decimal} ; valorSugerido: \text{Decimal} ; situacao: \text{Situacao}
; métodos: consultar(id), listar(filtros)
Relações: possui 0..\ast Contrato; referenciado por 0..\ast Compra; referenciado por 0..\ast Aluguel.
Casa extends Imovel — atributos específicos (ex.: numeroQuartos: \text{Integer}, numeroBanheiros: \text{Integer})
Apartamento extends Imovel — andar: \text{Integer} ; tipoApartamento: \text{TipoApto} ; condominio: \text{Decimal}
Terreno extends Imovel — areaConstruivel: \text{Decimal}
Chacara extends Imovel — areaVerde: \text{Decimal}
SalaComercial extends Imovel — andar: \text{Integer}, vaga: \text{Integer}
Pessoa (abstract) — id: \text{UUID} ; nome: \text{String} ; telefone: \text{String} ; email: \text{String} ; endereco: \text{String} ; dataCadastro: \text{Date}
; métodos: consultar(id), listar(filtros)
Relações: pode ser dono de 1..\ast Imovel (via histórico/transações); atua como comprador/locatario/fiador em 0..\ast Compra/Aluguel/Pagamento.
PessoaFisica extends Pessoa — cpf: \text{String} ; dataNascimento: \text{Date}
PessoaJuridica extends Pessoa — cnpj: \text{String} ; razaoSocial: \text{String}
Corretor — id: \text{UUID} ; nome: \text{String} ; creci: \text{String} ; email: \text{String} ; ativo: \text{Boolean}
; métodos: registrarVenda(Compra), registrarAluguel(Aluguel)
Relações: intermedia 0..\ast Compra; intermedia 0..\ast Aluguel.
Contrato — id: \text{UUID} ; data: \text{Date} ; arquivoCaminho: \text{String} ; tipoContrato: \text{TipoContrato} ; observacoes: \text{String}
; métodos: registrarContrato()
Relações: associação entre Pessoa (dono) 1 e Imovel 1 — multiplicidades: Pessoa 0..\ast — Contrato — Imovel 0..\ast. (Classe associativa).
Compra — id: \text{UUID} ; dataVenda: \text{Date} ; valorPago: \text{Decimal} ; percentualImobiliaria: \text{Decimal} ; comissaoCorretor: \text{Decimal}
; métodos: registrarCompra()
Relações: imovel: \text{Imovel} (1) ; vendedor: \text{Pessoa} (1) ; comprador: \text{Pessoa} (1) ; corretor: \text{Corretor} (0..1) ; taxas: 0..\ast\\ \text{Taxa}.
Taxa — id: \text{UUID} ; descricao: \text{String} ; valor: \text{Decimal}
; métodos: registrarTaxa()
Relações: pertence a 1 Compra.
Aluguel — id: \text{UUID} ; inicio: \text{Date} ; vigenciaMeses: \text{Integer} ; encerramento: \text{Date} (0..1) ; valorMensal: \text{Decimal} ; caucao: \text{Decimal} (0..1) ; percentualImobiliaria: \text{Decimal} ; comissaoCorretor: \text{Decimal}
; métodos: registrarAluguel(), encerrarAluguel(data)
Relações: imovel: \text{Imovel} (1) ; donoAoInicio: \text{Pessoa} (1) ; locatario: \text{Pessoa} (1) ; fiadores: 0..\ast\\ \text{Pessoa} ; corretor: \text{Corretor} (0..1) ; pagamentos: 0..\ast\\ \text{PagamentoAluguel}.
PagamentoAluguel — id: \text{UUID} ; vencimento: \text{Date} ; dataPagamento: \text{Date} (0..1) ; valorPago: \text{Decimal} (0..1) ; juros: \text{Decimal} (0..1) ; percentualImobiliaria: \text{Decimal}
; métodos: registrarPagamento() — ao registrar, calcula repasse e gera lançamento financeiro.
Relações: pertence a 1 Aluguel.
Enums:
  • Situacao = { \text{DISPONIVEL\_VENDA}, \text{DISPONIVEL\_ALUGUEL}, \text{EM\_LOCACAO}, \text{VENDIDO}, \text{INATIVO} }.
  • TipoContrato = { \text{INTERMEDIACAO\_VENDA}, \text{INTERMEDIACAO\_ALUGUEL} }.
  • TipoApto = { \text{STUDIO}, \text{1\_DORM}, \text{2\_DORM}, \text{COBERTURA}, … }.
Regras financeiras essenciais (resumidas):
  • Repasse venda: \text{repasse\_venda} = \text{valorPago} - (\text{percentualImobiliaria}\times\text{valorPago}) - \sum \text{taxas} - \text{despesasReais}.
  • Repasse aluguel (por pagamento): \text{repasse\_mensal} = (\text{valorPago} + \text{juros}) - (\text{percentualImobiliaria}\times(\text{valorPago} + \text{juros})) - \text{despesas\_eventuais}.
Restrições e integrações importantes (resumo final):
  • Validar existência de Contrato de intermediação antes de vender/alugar.
  • Garantir transação ACID ao registrar Compra/Aluguel/Pagamento para atualizar estado do Imovel e registrar lançamento financeiro.
  • Não permitir dois Aluguel ativos para o mesmo Imovel (validar antes de registrar).
  • Manter histórico completo via instâncias de Compra e Aluguel (não sobrescrever dados históricos).
(Esse conjunto representa o sistema de controle da imobiliária e o diagrama de classes necessário — basta desenhar as caixas/classes acima com as relações e multiplicidades indicadas para obter o diagrama UML solicitado.)

Exercícios relacionados