Projeto 2 - concessionária de aluguel de carros
Componentes: Thiago Pasternak
Objetivos: Tentar replicar um sistema de aluguel de carros para uma concessionária
Metodologia de desenvolvimento: A metodologia utilizada para desenvolver o sistema de aluguel de carros da concessionária envolve várias etapas estruturadas. Primeiro, foi feita a análise e especificação dos requisitos para entender as necessidades e funcionalidades desejadas, como cadastro de clientes e gerenciamento de carros. Em seguida, a modelagem de dados definiu as principais entidades (Carro, Cliente, Garagem) e suas relações. Para garantir a segurança e a integridade dos dados, os atributos foram encapsulados, utilizando dois underline's (__) para evitar acessos diretos, e métodos getter e setter foram implementados.
O desenvolvimento foi incremental, começando com a implementação das classes principais e seus métodos. Um menu de linha de comando foi criado para facilitar a interação do usuário com o sistema, permitindo operações como cadastro e aluguel de carros. Testes unitários e de integração foram realizados para assegurar que cada parte do sistema funcionasse corretamente, tanto isoladamente quanto em conjunto.
Projeto 2 - código fonte
class Carro:
def __init__(self, marca, modelo, ano, placa, disponivel=True, cpf_cliente=None):
self.__marca = marca
self.__modelo = modelo
self.__ano = ano
self.__placa = placa
self.__disponivel = disponivel
self.__cpf_cliente = cpf_cliente
@property
def marca(self):
return self.__marca
@property
def modelo(self):
return self.__modelo
@property
def ano(self):
return self.__ano
@property
def placa(self):
return self.__placa
@property
def disponivel(self):
return self.__disponivel
@disponivel.setter
def disponivel(self, valor):
self.__disponivel = valor
@property
def cpf_cliente(self):
return self.__cpf_cliente
@cpf_cliente.setter
def cpf_cliente(self, valor):
self.__cpf_cliente = valor
def __str__(self):
disponibilidade = "Disponível" if self.__disponivel else "Alugado"
return f"{self.__marca} {self.__modelo} ({self.__ano}) - Placa: {self.__placa} - {disponibilidade}"
class Cliente:
def __init__(self, nome, cpf):
self.__nome = nome
self.__cpf = self.formatar_cpf(cpf)
@property
def nome(self):
return self.__nome
@property
def cpf(self):
return self.__cpf
def __str__(self):
return f"{self.__nome} - CPF: {self.__cpf}"
@staticmethod
def formatar_cpf(cpf):
cpf = cpf.replace(".", "").replace("-", "")
return f"{cpf[:3]}.{cpf[3:6]}.{cpf[6:9]}-{cpf[9:]}"
class Garagem:
def __init__(self):
self.__carros = []
self.__clientes = []
@property
def carros(self):
return self.__carros
@property
def clientes(self):
return self.__clientes
def adicionar_carro(self, carro):
self.__carros.append(carro)
def listar_carros(self):
carros_disponiveis = [carro for carro in self.__carros if carro.disponivel]
if not carros_disponiveis:
print("Não há carros disponíveis.")
else:
for carro in carros_disponiveis:
print(carro)
def cadastrar_cliente(self, cliente):
self.__clientes.append(cliente)
def listar_clientes(self):
if not self.__clientes:
print("Não há clientes cadastrados.")
else:
for cliente in self.__clientes:
print(cliente)
def deletar_cliente(self, cpf):
cpf = Cliente.formatar_cpf(cpf)
for cliente in self.__clientes:
if cliente.cpf == cpf:
self.__clientes.remove(cliente)
print(f"Cliente {cliente.nome} removido.")
return
print("Cliente não encontrado.")
def alugar_carro(self, placa, cliente):
carro = next((car for car in self.__carros if car.placa == placa), None)
if not carro:
print("Carro não encontrado.")
return
if not carro.disponivel:
print("Carro já está alugado.")
else:
carro.disponivel = False
carro.cpf_cliente = cliente.cpf
print(f"Carro {carro.marca} {carro.modelo} alugado para {cliente.nome}.")
def listar_carros_alugados_por_cliente(self, cpf):
carros_alugados = [carro for carro in self.__carros if carro.cpf_cliente == cpf]
if not carros_alugados:
print("Não há carros alugados por este cliente.")
else:
for i, carro in enumerate(carros_alugados):
print(f"{i}. {carro}")
return carros_alugados
def devolver_carro(self, placa, cliente):
carro = next((car for car in self.__carros if car.placa == placa and car.cpf_cliente == cliente.cpf), None)
if not carro:
print("Carro não encontrado ou não está alugado por este cliente.")
return
carro.disponivel = True
carro.cpf_cliente = None
print(f"Carro {carro.marca} {carro.modelo} devolvido.")
def mostrar_menu(garagem):
while True:
print("\n=== Sistema de Aluguel de Carros ===")
print("1. Ver carros disponíveis")
print("2. Adicionar novo carro para aluguel")
print("3. Cadastrar novo cliente")
print("4. Deletar cliente")
print("5. Alugar carro")
print("6. Devolver carro")
print("0. Sair")
opcao = input("Escolha uma opção: ")
if opcao == "1":
garagem.listar_carros()
elif opcao == "2":
marca = input("Marca do carro: ")
modelo = input("Modelo do carro: ")
ano = int(input("Ano do carro: "))
placa = input("Placa do carro: ")
garagem.adicionar_carro(Carro(marca, modelo, ano, placa))
print("Carro adicionado com sucesso.")
elif opcao == "3":
nome = input("Nome do cliente: ")
cpf = input("CPF do cliente: ")
garagem.cadastrar_cliente(Cliente(nome, cpf))
print("Cliente cadastrado com sucesso.")
elif opcao == "4":
cpf = input("CPF do cliente a ser deletado: ")
garagem.deletar_cliente(cpf)
elif opcao == "5":
garagem.listar_carros()
placa = input("Placa do carro para alugar: ")
cpf_cliente = input("CPF do cliente que está alugando: ")
cliente = next((c for c in garagem.clientes if c.cpf == Cliente.formatar_cpf(cpf_cliente)), None)
if cliente:
garagem.alugar_carro(placa, cliente)
else:
print("Cliente não encontrado.")
elif opcao == "6":
cpf_cliente = input("CPF do cliente que está devolvendo: ")
cliente = next((c for c in garagem.clientes if c.cpf == Cliente.formatar_cpf(cpf_cliente)), None)
if cliente:
carros_alugados = garagem.listar_carros_alugados_por_cliente(cliente.cpf)
if carros_alugados:
placa = input("Placa do carro para devolver: ")
garagem.devolver_carro(placa, cliente)
else:
print("Cliente não encontrado.")
elif opcao == "0":
print("Saindo do programa.")
break
else:
print("Opção inválida. Tente novamente.")
input("Pressione Enter para continuar...")
if __name__ == "__main__":
garagem = Garagem()
garagem.adicionar_carro(Carro("Toyota", "Corolla", 2023, "ABC-1234"))
garagem.adicionar_carro(Carro("Honda", "Civic", 2022, "DEF-5678"))
garagem.cadastrar_cliente(Cliente("João", "123.456.789-00"))
garagem.cadastrar_cliente(Cliente("Maria", "987.654.321-00"))
mostrar_menu(garagem)