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)