From 569c9a6a8491e0d7be29946cd01aa9c5b2556518 Mon Sep 17 00:00:00 2001 From: Alexsandro <111327858+alexxs2@users.noreply.github.com> Date: Tue, 17 Sep 2024 20:34:13 -0300 Subject: [PATCH 1/4] Update and rename desafio.py to Menu_Banco.py --- 00 - Fundamentos/Menu_Banco.py | 58 ++++++++++++++++++++++++++++++ 00 - Fundamentos/desafio.py | 66 ---------------------------------- 2 files changed, 58 insertions(+), 66 deletions(-) create mode 100644 00 - Fundamentos/Menu_Banco.py delete mode 100644 00 - Fundamentos/desafio.py diff --git a/00 - Fundamentos/Menu_Banco.py b/00 - Fundamentos/Menu_Banco.py new file mode 100644 index 000000000..05a5ae76c --- /dev/null +++ b/00 - Fundamentos/Menu_Banco.py @@ -0,0 +1,58 @@ +menu = """ + --------Bem Vindo(a) -------- + [1] - Depositar + [2] - Sacar + [3] - Extrato + [0] - Sair + ----------------------------- + -- """ +saldo = 0 +LIMITE_DIARIO = 500 +extrato = "" +numero_saques = 0 +LIMITE_SAQUES = 3 + +while True: + + opcao = input(menu) + + if opcao == "1": + valor = float(input("\nInforme o valor do depósito: ")) + + if valor > 0: + saldo += valor + extrato += f"Depósito: R$ {valor:.2f} realizado com sucesso\n" + else: + print("\nOperação falhou! O valor informado é inválido.") + + elif opcao == "2": + valor = float(input("\nInforme o valor do saque: ")) + + excedeu_saldo = valor > saldo + excedeu_limite_diario = valor > LIMITE_DIARIO + excedeu_saques_diarios = numero_saques >= LIMITE_SAQUES + + if excedeu_saldo: + print("\nOperação falhou! Você não tem saldo suficiente.") + elif excedeu_limite_diario: + print("\nOperação falhou! O valor do saque excede o limite diário.") + elif excedeu_saques_diarios: + print("\nOperação falhou! Número máximo de saques excedido.") + elif valor > 0: + saldo -= valor + extrato += f"Saque: R$ {valor:.2f}\n" + numero_saques += 1 + else: + print("\nOperação falhou! O valor informado é inválido.") + + elif opcao == "3": + print("\n--------------EXTRATO--------------") + print("Não foram realizadas movimentações." if not extrato else extrato) + print(f"\nSaldo: R$ {saldo:.2f}") + print("-------------------------------------") + + elif opcao == "0": + break + + else: + print("\nOperação inválida, por favor selecione novamente a operação desejada.") diff --git a/00 - Fundamentos/desafio.py b/00 - Fundamentos/desafio.py deleted file mode 100644 index c2179f64d..000000000 --- a/00 - Fundamentos/desafio.py +++ /dev/null @@ -1,66 +0,0 @@ -menu = """ - -[d] Depositar -[s] Sacar -[e] Extrato -[q] Sair - -=> """ - -saldo = 0 -limite = 500 -extrato = "" -numero_saques = 0 -LIMITE_SAQUES = 3 - -while True: - - opcao = input(menu) - - if opcao == "d": - valor = float(input("Informe o valor do depósito: ")) - - if valor > 0: - saldo += valor - extrato += f"Depósito: R$ {valor:.2f}\n" - - else: - print("Operação falhou! O valor informado é inválido.") - - elif opcao == "s": - valor = float(input("Informe o valor do saque: ")) - - excedeu_saldo = valor > saldo - - excedeu_limite = valor > limite - - excedeu_saques = numero_saques >= LIMITE_SAQUES - - if excedeu_saldo: - print("Operação falhou! Você não tem saldo suficiente.") - - elif excedeu_limite: - print("Operação falhou! O valor do saque excede o limite.") - - elif excedeu_saques: - print("Operação falhou! Número máximo de saques excedido.") - - elif valor > 0: - saldo -= valor - extrato += f"Saque: R$ {valor:.2f}\n" - numero_saques += 1 - - else: - print("Operação falhou! O valor informado é inválido.") - - elif opcao == "e": - print("\n================ EXTRATO ================") - print("Não foram realizadas movimentações." if not extrato else extrato) - print(f"\nSaldo: R$ {saldo:.2f}") - print("==========================================") - - elif opcao == "q": - break - - else: - print("Operação inválida, por favor selecione novamente a operação desejada.") From 2f607c18dffc0f790164de8cf6d5ccf4daade24d Mon Sep 17 00:00:00 2001 From: Alexsandro <111327858+alexxs2@users.noreply.github.com> Date: Sat, 28 Sep 2024 12:44:56 -0300 Subject: [PATCH 2/4] =?UTF-8?q?Update=20and=20rename=20desafio.py=20to=20D?= =?UTF-8?q?esafio=5Fdo=5Fbanco=5Fcom=5Ffun=C3=A7=C3=B5es.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...fio_do_banco_com_fun\303\247\303\265es.py" | 140 +++++++++++++++ 01 - Estrutura de dados/desafio.py | 160 ------------------ 2 files changed, 140 insertions(+), 160 deletions(-) create mode 100644 "01 - Estrutura de dados/Desafio_do_banco_com_fun\303\247\303\265es.py" delete mode 100644 01 - Estrutura de dados/desafio.py diff --git "a/01 - Estrutura de dados/Desafio_do_banco_com_fun\303\247\303\265es.py" "b/01 - Estrutura de dados/Desafio_do_banco_com_fun\303\247\303\265es.py" new file mode 100644 index 000000000..03c7a41da --- /dev/null +++ "b/01 - Estrutura de dados/Desafio_do_banco_com_fun\303\247\303\265es.py" @@ -0,0 +1,140 @@ +def menu(): + menu = """\n + --------Bem Vindo(a) -------- + [1] - Depositar + [2] - Sacar + [3] - Extrato + [4] - Nova Conta + [5] - Listar Contas + [6] - Novo usuário + [0] - Sair + ----------------------------- + --- """ + return input(menu) + +def depositar(saldo, valor, extrato, /): + if valor > 0: + saldo += valor + extrato += f"Depósito: R$ {valor:.2f} realizado com sucesso\n" + else: + print("\nOperação falhou! O valor informado é inválido.") + return saldo, extrato + +def sacar(*, saldo, valor, extrato, LIMITE_DIARIO, numero_saques, limite_saques): + excedeu_saldo = valor > saldo + excedeu_limite_diario = valor > LIMITE_DIARIO + excedeu_saques_diarios = numero_saques >= limite_saques + + if excedeu_saldo: + print("\nOperação falhou! Você não tem saldo suficiente.") + elif excedeu_limite_diario: + print("\nOperação falhou! O valor do saque excede o limite diário.") + elif excedeu_saques_diarios: + print("\nOperação falhou! Número máximo de saques excedido.") + elif valor > 0: + saldo -= valor + extrato += f"Saque: R$ {valor:.2f}\n" + numero_saques += 1 + print("\nSaque realizado com sucesso!") + else: + print("\nOperação falhou! O valor informado é inválido.") + + return saldo, extrato, numero_saques + +def exibir_extrato(saldo, /, *, extrato): + print("\n--------------EXTRATO--------------") + print("Não foram realizadas movimentações." if not extrato else extrato) + print(f"\nSaldo: R$ {saldo:.2f}") + print("-------------------------------------") + +def criar_usuario(usuarios): + cpf = input("Informe o CPF (somente números): ") + usuario = filtrar_usuario(cpf, usuarios) + + if usuario: + print("\nJá existe um usuário com esse CPF") + return + nome = input("Informe o nome completo: ") + data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ") + endereco = input("Informe o endereço (Logradouro, nro - bairro - cidade/sigla estado): ") + + usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco}) + + print("--- Usuário criado com sucesso! ---") + +def filtrar_usuario(cpf, usuarios): + usuarios_filtrados = [usuario for usuario in usuarios if usuario["cpf"] == cpf] + return usuarios_filtrados[0] if usuarios_filtrados else None + +def criar_conta(agencia, numero_conta, usuarios): + cpf = input("Informe o CPF do usuário: ") + usuario = filtrar_usuario(cpf, usuarios) + + if usuario: + print("\nConta Criada com Sucesso!") + return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario} + + print("\nUsuário não encontrado, fluxo de criação de conta encerrado!") + +def listar_contas(contas): + for conta in contas: + linha = f"""\n + Agência: {conta['agencia']} + C/C: {conta['numero_conta']} + Titular: {conta['usuario']['nome']} + """ + print("-" * 100) + print(linha) + +def main(): + AGENCIA = "0001" + saldo = 0 + LIMITE_DIARIO = 500 + extrato = "" + numero_saques = 0 + LIMITE_SAQUES = 3 + usuarios = [] + contas = [] + numero_conta = 0 + + while True: + opcao = menu() + + if opcao == "1": + valor = float(input("\nInforme o valor do depósito: ")) + saldo, extrato = depositar(saldo, valor, extrato) + + elif opcao == "2": + valor = float(input("\nInforme o valor do saque: ")) + saldo, extrato, numero_saques = sacar( + saldo=saldo, + valor=valor, + extrato=extrato, + LIMITE_DIARIO=LIMITE_DIARIO, + numero_saques=numero_saques, + limite_saques=LIMITE_SAQUES, + ) + + elif opcao == "3": + exibir_extrato(saldo, extrato=extrato) + + elif opcao == "6": + criar_usuario(usuarios) + + elif opcao == "4": + conta = criar_conta(AGENCIA, numero_conta, usuarios) + + if conta: + contas.append(conta) + numero_conta += 1 + + elif opcao == "5": + listar_contas(contas) + + elif opcao == "0": + break + + else: + print("\nOperação inválida, por favor selecione novamente a operação desejada.") + +main() diff --git a/01 - Estrutura de dados/desafio.py b/01 - Estrutura de dados/desafio.py deleted file mode 100644 index 2ce9ef270..000000000 --- a/01 - Estrutura de dados/desafio.py +++ /dev/null @@ -1,160 +0,0 @@ -import textwrap - - -def menu(): - menu = """\n - ================ MENU ================ - [d]\tDepositar - [s]\tSacar - [e]\tExtrato - [nc]\tNova conta - [lc]\tListar contas - [nu]\tNovo usuário - [q]\tSair - => """ - return input(textwrap.dedent(menu)) - - -def depositar(saldo, valor, extrato, /): - if valor > 0: - saldo += valor - extrato += f"Depósito:\tR$ {valor:.2f}\n" - print("\n=== Depósito realizado com sucesso! ===") - else: - print("\n@@@ Operação falhou! O valor informado é inválido. @@@") - - return saldo, extrato - - -def sacar(*, saldo, valor, extrato, limite, numero_saques, limite_saques): - excedeu_saldo = valor > saldo - excedeu_limite = valor > limite - excedeu_saques = numero_saques >= limite_saques - - if excedeu_saldo: - print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@") - - elif excedeu_limite: - print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@") - - elif excedeu_saques: - print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@") - - elif valor > 0: - saldo -= valor - extrato += f"Saque:\t\tR$ {valor:.2f}\n" - numero_saques += 1 - print("\n=== Saque realizado com sucesso! ===") - - else: - print("\n@@@ Operação falhou! O valor informado é inválido. @@@") - - return saldo, extrato - - -def exibir_extrato(saldo, /, *, extrato): - print("\n================ EXTRATO ================") - print("Não foram realizadas movimentações." if not extrato else extrato) - print(f"\nSaldo:\t\tR$ {saldo:.2f}") - print("==========================================") - - -def criar_usuario(usuarios): - cpf = input("Informe o CPF (somente número): ") - usuario = filtrar_usuario(cpf, usuarios) - - if usuario: - print("\n@@@ Já existe usuário com esse CPF! @@@") - return - - nome = input("Informe o nome completo: ") - data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ") - endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ") - - usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco}) - - print("=== Usuário criado com sucesso! ===") - - -def filtrar_usuario(cpf, usuarios): - usuarios_filtrados = [usuario for usuario in usuarios if usuario["cpf"] == cpf] - return usuarios_filtrados[0] if usuarios_filtrados else None - - -def criar_conta(agencia, numero_conta, usuarios): - cpf = input("Informe o CPF do usuário: ") - usuario = filtrar_usuario(cpf, usuarios) - - if usuario: - print("\n=== Conta criada com sucesso! ===") - return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario} - - print("\n@@@ Usuário não encontrado, fluxo de criação de conta encerrado! @@@") - - -def listar_contas(contas): - for conta in contas: - linha = f"""\ - Agência:\t{conta['agencia']} - C/C:\t\t{conta['numero_conta']} - Titular:\t{conta['usuario']['nome']} - """ - print("=" * 100) - print(textwrap.dedent(linha)) - - -def main(): - LIMITE_SAQUES = 3 - AGENCIA = "0001" - - saldo = 0 - limite = 500 - extrato = "" - numero_saques = 0 - usuarios = [] - contas = [] - - while True: - opcao = menu() - - if opcao == "d": - valor = float(input("Informe o valor do depósito: ")) - - saldo, extrato = depositar(saldo, valor, extrato) - - elif opcao == "s": - valor = float(input("Informe o valor do saque: ")) - - saldo, extrato = sacar( - saldo=saldo, - valor=valor, - extrato=extrato, - limite=limite, - numero_saques=numero_saques, - limite_saques=LIMITE_SAQUES, - ) - - elif opcao == "e": - exibir_extrato(saldo, extrato=extrato) - - elif opcao == "nu": - criar_usuario(usuarios) - - elif opcao == "nc": - numero_conta = len(contas) + 1 - conta = criar_conta(AGENCIA, numero_conta, usuarios) - - if conta: - contas.append(conta) - - elif opcao == "lc": - listar_contas(contas) - - elif opcao == "q": - break - - else: - print("Operação inválida, por favor selecione novamente a operação desejada.") - - -main() From 5573e1ccab42593a4483feb113ee394dfedd3425 Mon Sep 17 00:00:00 2001 From: Alexsandro <111327858+alexxs2@users.noreply.github.com> Date: Tue, 1 Oct 2024 17:17:47 -0300 Subject: [PATCH 3/4] Add files via upload --- .../10 - desafio/Desafio_do_banco_com_POO.py" | 305 ++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 "02 - Programa\303\247\303\243o Orientada a Objetos/10 - desafio/Desafio_do_banco_com_POO.py" diff --git "a/02 - Programa\303\247\303\243o Orientada a Objetos/10 - desafio/Desafio_do_banco_com_POO.py" "b/02 - Programa\303\247\303\243o Orientada a Objetos/10 - desafio/Desafio_do_banco_com_POO.py" new file mode 100644 index 000000000..6222f58f8 --- /dev/null +++ "b/02 - Programa\303\247\303\243o Orientada a Objetos/10 - desafio/Desafio_do_banco_com_POO.py" @@ -0,0 +1,305 @@ +from abc import ABC, abstractclassmethod, abstractproperty +from datetime import datetime + +class Cliente: + def __init__(self, endereco): + self.endereco = endereco + self.contas = [] + + def realizar_transacao(self, conta, transacao): + transacao.registra(conta) + + def adicionar_conta(self, conta): + self.contas.append(conta) + +class PessoaFisica(Cliente): + def __init__(self, nome, data_nascimento, cpf, endereco): + super().__init__(endereco) + self.nome = nome + self.data_nascimento = data_nascimento + self.cpf = cpf + +class Conta; + def __init__(self, numero, cliente): + self.saldo = 0 + self._numero = numero + self._agencia = "0001" + self._cliente = cliente + self._historico = Historico() + + @classmethod + def nova_conta(cls, cliente, numero): + return cls(numero, cliente) + + @property + def saldo(self): + return self._saldo + + @property + def numero(self): + return self._numero + + @property + def agencia(self): + return self._agencia + + @property + def cliente(self): + return self._cliente + + @property + def historico(self): + return self._historico + + def sacar(self,valor): + saldo = self.saldo + excedeu_saldo = valor > saldo + + if excedeu_saldo: + print("\nOperação falhou! você não tem saldo suficiente.") + + elif valor > 0: + self._saldo -= valor + print("\nSaque realizado com sucesso!") + return True + + else: + print("\nOperação falhou! o valor informado é inválido.") + + return False + + def depositar(self, valor): + if valor > 0: + self._saldo += valor + print("\nDepósito realizado com sucesso!") + else: + print("\nOperação falhou! o valor informado é inválido.") + return False + + return True + +class ContaCorrente(Conta): + def __init__(self, numero, cliente, limite=500, limite_saques=3): + super().__init__(numero, cliente) + self.limite = limite + self.limite_saques = limite_saques + + def sacar(self, valor): + numero_saques = len( + [transacao for transacao in self.historico.transacoes if transacao["tipo"] == Saque.__name__] + ) + + excedeu_limite = valor > self.limite + excedeu_saques = numero_saques >= self.limite_saques + + if excedeu_limite: + print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@") + + elif excedeu_saques: + print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@") + + else: + return super().sacar(valor) + + return False + + def __str__(self): + return f"""\ + Agência:\t{self.agencia} + C/C:\t\t{self.numero} + Titular:\t{self.cliente.nome} + """ + +class Historico: + def __init__(self): + self.transacoes = [] + + @property + def transacoes(self): + return self._transacoes + + def adicionar_transacao(self, transacao): + self._transacoes.append( + { + "tipo": transacao.__class__.__name__, + "valor":transacao.valor, + "data": datetime.now().strftime("%d-%m-%Y %H:%M:%s"), + } + ) + +class Transacao(ABC): + @property + @abstractproperty + def valor(self): + pass + + @abstractclassmethod + def registrar(self, conta): + pass + + +class Saque(Transacao): + def __init__(self, valor): + self._valor = valor + + @property + def valor(self): + return self._valor + + def registrar(self, conta): + sucesso_transacao = conta.sacar(self.valor) + + if sucesso_transacao: + conta.historico.adicionar_transacao(self) + + +class Deposito(Transacao): + def __init__(self, valor): + self._valor = valor + + @property + def valor(self): + return self._valor + + def registrar(self, conta): + sucesso_transacao = conta.depositar(self.valor) + + if sucesso_transacao: + conta.historico.adicionar_transacao(self) + +def menu(): + menu = """\n + --------Bem Vindo(a) -------- + [1] - Depositar + [2] - Sacar + [3] - Extrato + [4] - Nova Conta + [5] - Listar Contas + [6] - Novo usuário + [0] - Sair + ----------------------------- + --- """ + return input(menu) + + +def filtrar_cliente(cpf, clientes): + clientes_filtrados = [cliente for cliente in clientes if cliente.cpf == cpf] + return clientes_filtrados[0] if clientes_filtrados else None + + +def recuperar_conta_cliente(cliente): + if not cliente.contas: + print("\nCliente não possui conta!") + return + + return cliente.contas[0] + + +def depositar(clientes): + cpf = input("Informe o CPF do cliente: ") + cliente = filtrar_cliente(cpf, clientes) + + if not cliente: + print("\nCliente não encontrado!") + return + + valor = float(input("Informe o valor do depósito: ")) + transacao = Deposito(valor) + + conta = recuperar_conta_cliente(cliente) + if not conta: + return + + cliente.realizar_transacao(conta, transacao) + + +def sacar(clientes): + cpf = input("Informe o CPF do cliente: ") + cliente = filtrar_cliente(cpf, clientes) + + if not cliente: + print("\nCliente não encontrado!") + return + + valor = float(input("Informe o valor do saque: ")) + transacao = Saque(valor) + + conta = recuperar_conta_cliente(cliente) + if not conta: + return + + cliente.realizar_transacao(conta, transacao) + + +def exibir_extrato(clientes): + cpf = input("Informe o CPF do cliente: ") + cliente = filtrar_cliente(cpf, clientes) + + if not cliente: + print("\nCliente não encontrado!") + return + + conta = recuperar_conta_cliente(cliente) + if not conta: + return + + print("\n--------------EXTRATO--------------") + transacoes = conta.historico.transacoes + + extrato = "" + if not transacoes: + extrato = "Não foram realizadas movimentações." + else: + for transacao in transacoes: + extrato += f"\n{transacao['tipo']}:\n\tR$ {transacao['valor']:.2f}" + + print(extrato) + print(f"\nSaldo:\n\tR$ {conta.saldo:.2f}") + print("------------------------------------------") + + +def criar_cliente(clientes): + cpf = input("Informe o CPF (somente número): ") + cliente = filtrar_cliente(cpf, clientes) + + if cliente: + print("\nJá existe cliente com esse CPF!") + return + + nome = input("Informe o nome completo: ") + data_nascimento = input("Informe a data de nascimento (dd-mm-aaaa): ") + endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ") + + cliente = PessoaFisica(nome=nome, data_nascimento=data_nascimento, cpf=cpf, endereco=endereco) + + clientes.append(cliente) + + print("\nCliente criado com sucesso!") + + +def criar_conta(numero_conta, clientes, contas): + cpf = input("Informe o CPF do cliente: ") + cliente = filtrar_cliente(cpf, clientes) + + if not cliente: + print("\nCliente não encontrado, fluxo de criação de conta encerrado!") + return + + conta = ContaCorrente.nova_conta(cliente=cliente, numero=numero_conta) + contas.append(conta) + cliente.contas.append(conta) + + print("\nConta criada com sucesso!") + + +def listar_contas(contas): + for conta in contas: + print("=" * 100) + print((str(conta))) + + + + + + + From d644c844a66a0e18896056a18c15a30846281656 Mon Sep 17 00:00:00 2001 From: Alexsandro <111327858+alexxs2@users.noreply.github.com> Date: Tue, 1 Oct 2024 17:45:29 -0300 Subject: [PATCH 4/4] Update Desafio_do_banco_com_POO.py --- .../10 - desafio/Desafio_do_banco_com_POO.py" | 101 ++++++++---------- 1 file changed, 42 insertions(+), 59 deletions(-) diff --git "a/02 - Programa\303\247\303\243o Orientada a Objetos/10 - desafio/Desafio_do_banco_com_POO.py" "b/02 - Programa\303\247\303\243o Orientada a Objetos/10 - desafio/Desafio_do_banco_com_POO.py" index 6222f58f8..9abf17776 100644 --- "a/02 - Programa\303\247\303\243o Orientada a Objetos/10 - desafio/Desafio_do_banco_com_POO.py" +++ "b/02 - Programa\303\247\303\243o Orientada a Objetos/10 - desafio/Desafio_do_banco_com_POO.py" @@ -1,4 +1,4 @@ -from abc import ABC, abstractclassmethod, abstractproperty +from abc import ABC, abstractmethod from datetime import datetime class Cliente: @@ -7,7 +7,7 @@ def __init__(self, endereco): self.contas = [] def realizar_transacao(self, conta, transacao): - transacao.registra(conta) + transacao.registrar(conta) def adicionar_conta(self, conta): self.contas.append(conta) @@ -19,9 +19,9 @@ def __init__(self, nome, data_nascimento, cpf, endereco): self.data_nascimento = data_nascimento self.cpf = cpf -class Conta; +class Conta: def __init__(self, numero, cliente): - self.saldo = 0 + self._saldo = 0 self._numero = numero self._agencia = "0001" self._cliente = cliente @@ -35,6 +35,10 @@ def nova_conta(cls, cliente, numero): def saldo(self): return self._saldo + @saldo.setter + def saldo(self, valor): + self._saldo = valor + @property def numero(self): return self._numero @@ -51,33 +55,29 @@ def cliente(self): def historico(self): return self._historico - def sacar(self,valor): + def sacar(self, valor): saldo = self.saldo excedeu_saldo = valor > saldo if excedeu_saldo: print("\nOperação falhou! você não tem saldo suficiente.") - elif valor > 0: - self._saldo -= valor + self.saldo -= valor print("\nSaque realizado com sucesso!") return True - else: print("\nOperação falhou! o valor informado é inválido.") - return False def depositar(self, valor): if valor > 0: - self._saldo += valor + self.saldo += valor print("\nDepósito realizado com sucesso!") else: print("\nOperação falhou! o valor informado é inválido.") return False - return True - + class ContaCorrente(Conta): def __init__(self, numero, cliente, limite=500, limite_saques=3): super().__init__(numero, cliente) @@ -88,56 +88,45 @@ def sacar(self, valor): numero_saques = len( [transacao for transacao in self.historico.transacoes if transacao["tipo"] == Saque.__name__] ) - excedeu_limite = valor > self.limite excedeu_saques = numero_saques >= self.limite_saques if excedeu_limite: - print("\n@@@ Operação falhou! O valor do saque excede o limite. @@@") - + print("\nOperação falhou! O valor do saque excede o limite.") elif excedeu_saques: - print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@") - + print("\nOperação falhou! Número máximo de saques excedido.") else: return super().sacar(valor) - return False def __str__(self): - return f"""\ - Agência:\t{self.agencia} - C/C:\t\t{self.numero} - Titular:\t{self.cliente.nome} - """ - + return f"Agência: {self.agencia}\nC/C: {self.numero}\nTitular: {self.cliente.nome}" + class Historico: def __init__(self): - self.transacoes = [] + self._transacoes = [] @property def transacoes(self): return self._transacoes def adicionar_transacao(self, transacao): - self._transacoes.append( - { - "tipo": transacao.__class__.__name__, - "valor":transacao.valor, - "data": datetime.now().strftime("%d-%m-%Y %H:%M:%s"), - } - ) + self._transacoes.append({ + "tipo": transacao.__class__.__name__, + "valor": transacao.valor, + "data": datetime.now().strftime("%d-%m-%Y %H:%M:%S"), + }) class Transacao(ABC): @property - @abstractproperty + @abstractmethod def valor(self): pass - @abstractclassmethod + @abstractmethod def registrar(self, conta): pass - class Saque(Transacao): def __init__(self, valor): self._valor = valor @@ -152,7 +141,6 @@ def registrar(self, conta): if sucesso_transacao: conta.historico.adicionar_transacao(self) - class Deposito(Transacao): def __init__(self, valor): self._valor = valor @@ -181,20 +169,16 @@ def menu(): --- """ return input(menu) - def filtrar_cliente(cpf, clientes): clientes_filtrados = [cliente for cliente in clientes if cliente.cpf == cpf] return clientes_filtrados[0] if clientes_filtrados else None - def recuperar_conta_cliente(cliente): if not cliente.contas: print("\nCliente não possui conta!") return - return cliente.contas[0] - def depositar(clientes): cpf = input("Informe o CPF do cliente: ") cliente = filtrar_cliente(cpf, clientes) @@ -203,16 +187,19 @@ def depositar(clientes): print("\nCliente não encontrado!") return - valor = float(input("Informe o valor do depósito: ")) - transacao = Deposito(valor) + try: + valor = float(input("Informe o valor do depósito: ")) + except ValueError: + print("\nValor inválido! Tente novamente.") + return + transacao = Deposito(valor) conta = recuperar_conta_cliente(cliente) + if not conta: return - cliente.realizar_transacao(conta, transacao) - def sacar(clientes): cpf = input("Informe o CPF do cliente: ") cliente = filtrar_cliente(cpf, clientes) @@ -221,16 +208,19 @@ def sacar(clientes): print("\nCliente não encontrado!") return - valor = float(input("Informe o valor do saque: ")) - transacao = Saque(valor) + try: + valor = float(input("Informe o valor do saque: ")) + except ValueError: + print("\nValor inválido! Tente novamente.") + return + transacao = Saque(valor) conta = recuperar_conta_cliente(cliente) + if not conta: return - cliente.realizar_transacao(conta, transacao) - def exibir_extrato(clientes): cpf = input("Informe o CPF do cliente: ") cliente = filtrar_cliente(cpf, clientes) @@ -240,24 +230,22 @@ def exibir_extrato(clientes): return conta = recuperar_conta_cliente(cliente) + if not conta: return print("\n--------------EXTRATO--------------") transacoes = conta.historico.transacoes - extrato = "" if not transacoes: - extrato = "Não foram realizadas movimentações." + print("Não foram realizadas movimentações.") else: for transacao in transacoes: - extrato += f"\n{transacao['tipo']}:\n\tR$ {transacao['valor']:.2f}" + print(f"\n{transacao['tipo']}:\n\tR$ {transacao['valor']:.2f}") - print(extrato) print(f"\nSaldo:\n\tR$ {conta.saldo:.2f}") print("------------------------------------------") - def criar_cliente(clientes): cpf = input("Informe o CPF (somente número): ") cliente = filtrar_cliente(cpf, clientes) @@ -271,12 +259,9 @@ def criar_cliente(clientes): endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ") cliente = PessoaFisica(nome=nome, data_nascimento=data_nascimento, cpf=cpf, endereco=endereco) - clientes.append(cliente) - print("\nCliente criado com sucesso!") - def criar_conta(numero_conta, clientes, contas): cpf = input("Informe o CPF do cliente: ") cliente = filtrar_cliente(cpf, clientes) @@ -291,12 +276,10 @@ def criar_conta(numero_conta, clientes, contas): print("\nConta criada com sucesso!") - def listar_contas(contas): for conta in contas: print("=" * 100) - print((str(conta))) - + print(str(conta))