From a9d8dc06ceeaf154372ae7f265f1aa09ca49e77f Mon Sep 17 00:00:00 2001 From: Gustavo Raia Date: Wed, 18 Sep 2024 16:50:12 -0300 Subject: [PATCH 1/3] Desafio Banco Python --- 00 - Fundamentos/desafio.py | 98 +++++++++++++++++++++++++------------ 1 file changed, 67 insertions(+), 31 deletions(-) diff --git a/00 - Fundamentos/desafio.py b/00 - Fundamentos/desafio.py index c2179f64d..88aed9f68 100644 --- a/00 - Fundamentos/desafio.py +++ b/00 - Fundamentos/desafio.py @@ -18,48 +18,84 @@ 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" + ''' + Operação de depósito + + Deve ser possível depositar valores positivos para a minha + conta bancária. A v1 do projeto trabalha apenas com 1 + usuário, dessa forma não precisamos nos preocupar em + identificar qual é o número da agência e conta bancária. Todos + os depósitos devem ser armazenados em uma variável e + exibidos na operação de extrato. + ''' + + valor_deposito = float(input("Digite o valor do depósito: ")) + + if(valor_deposito > 0): + saldo += valor_deposito + extrato += f"Depósito: R$ {valor_deposito}\n" + print("Depósito realizado com sucesso.") + print("Saldo atual: R$", saldo) else: - print("Operação falhou! O valor informado é inválido.") + print("Valor 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" + ''' + Operação de saque + + O sistema deve permitir realizar 3 saques diários com limite + máximo de R$ 500,00 por saque. Caso o usuário não tenha + saldo em conta, o sistema deve exibir uma mensagem + informando que não será possível sacar o dinheiro por falta de + saldo. Todos os saques devem ser armazenados em uma + variável e exibidos na operação de extrato. + ''' + + valor_saque = float(input("Digite o valor do saque: ")) + + if(valor_saque > saldo): + print("Saldo insuficiente para realizar o saque.") + + elif(valor_saque > limite): + print("Valor excede o limite.") + + elif(numero_saques >= LIMITE_SAQUES): + print("Limite de saques diários excedido.") + + elif(valor_saque > 0): + saldo -= valor_saque + extrato += f"Saque: R$ {valor_saque}\n" + print("Saque realizado com sucesso.") + print("Saldo atual: R$", saldo) numero_saques += 1 else: - print("Operação falhou! O valor informado é inválido.") + print("Valor 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("==========================================") + ''' + Operação de extrato + + Essa operação deve listar todos os depósitos e saques + realizados na conta. No fim da listagem deve ser exibido o + saldo atual da conta. Se o extrato estiver em branco, exibir a + mensagem: Não foram realizadas movimentações. + Os valores devem ser exibidos utilizando o formato R$ xxx.xx, + exemplo: + 1500.45 = R$ 1500.45 + ''' + + print("\n-----------------------------------------") + print("\t\tExtrato") + print("-----------------------------------------\n") + if(extrato == ""): + print("Não foram realizadas movimentações.") + print("Saldo: R$", saldo) + print("\n-----------------------------------------") elif opcao == "q": + print("Saindo...") break else: From 2ae9b18d603f73e9f0c536c13317a5a39a6e24f8 Mon Sep 17 00:00:00 2001 From: Gustavo Raia Date: Thu, 19 Sep 2024 11:51:37 -0300 Subject: [PATCH 2/3] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20Desafio=20:=20Adici?= =?UTF-8?q?onando=20Fun=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 00 - Fundamentos/desafio.py | 295 ++++++++++++++++++++++++++---------- 1 file changed, 212 insertions(+), 83 deletions(-) diff --git a/00 - Fundamentos/desafio.py b/00 - Fundamentos/desafio.py index 88aed9f68..c9154393b 100644 --- a/00 - Fundamentos/desafio.py +++ b/00 - Fundamentos/desafio.py @@ -1,91 +1,55 @@ -menu = """ +import textwrap + +def menu(): + menu = """ + [d] Depositar + [s] Sacar + [e] Extrato + [nc]Nova conta + [lc]Listar contas + [nu]Novo usuário + [q] Sair + """ + return input(textwrap.dedent(menu)) + + +def depositar(saldo, valor_deposito, extrato, /): + if(valor_deposito > 0): + saldo += valor_deposito + extrato += f"Depósito: R$ {valor_deposito}\n" + print("Depósito realizado com sucesso.") + print("Saldo atual: R$", saldo) -[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": - ''' - Operação de depósito - - Deve ser possível depositar valores positivos para a minha - conta bancária. A v1 do projeto trabalha apenas com 1 - usuário, dessa forma não precisamos nos preocupar em - identificar qual é o número da agência e conta bancária. Todos - os depósitos devem ser armazenados em uma variável e - exibidos na operação de extrato. - ''' - - valor_deposito = float(input("Digite o valor do depósito: ")) - - if(valor_deposito > 0): - saldo += valor_deposito - extrato += f"Depósito: R$ {valor_deposito}\n" - print("Depósito realizado com sucesso.") - print("Saldo atual: R$", saldo) - - else: - print("Valor inválido") - - elif opcao == "s": - ''' - Operação de saque + else: + print("Valor inválido") - O sistema deve permitir realizar 3 saques diários com limite - máximo de R$ 500,00 por saque. Caso o usuário não tenha - saldo em conta, o sistema deve exibir uma mensagem - informando que não será possível sacar o dinheiro por falta de - saldo. Todos os saques devem ser armazenados em uma - variável e exibidos na operação de extrato. - ''' + return saldo, extrato - valor_saque = float(input("Digite o valor do saque: ")) - if(valor_saque > saldo): - print("Saldo insuficiente para realizar o saque.") +def sacar(*, saldo, valor_saque, extrato, limite, numero_saques, LIMITE_SAQUES): + if(valor_saque > saldo): + print("Saldo insuficiente para realizar o saque.") - elif(valor_saque > limite): - print("Valor excede o limite.") + elif(valor_saque > limite): + print("Valor excede o limite.") - elif(numero_saques >= LIMITE_SAQUES): - print("Limite de saques diários excedido.") - - elif(valor_saque > 0): - saldo -= valor_saque - extrato += f"Saque: R$ {valor_saque}\n" - print("Saque realizado com sucesso.") - print("Saldo atual: R$", saldo) - numero_saques += 1 + elif(numero_saques >= LIMITE_SAQUES): + print("Limite de saques diários excedido.") + + elif(valor_saque > 0): + saldo -= valor_saque + extrato += f"Saque: R$ {valor_saque}\n" + print("Saque realizado com sucesso.") + print("Saldo atual: R$", saldo) + numero_saques += 1 - else: - print("Valor inválido") + else: + print("Valor inválido") - elif opcao == "e": - ''' - Operação de extrato + return saldo, extrato - Essa operação deve listar todos os depósitos e saques - realizados na conta. No fim da listagem deve ser exibido o - saldo atual da conta. Se o extrato estiver em branco, exibir a - mensagem: Não foram realizadas movimentações. - Os valores devem ser exibidos utilizando o formato R$ xxx.xx, - exemplo: - 1500.45 = R$ 1500.45 - ''' +def extrato(saldo, /, *, extrato): print("\n-----------------------------------------") print("\t\tExtrato") print("-----------------------------------------\n") @@ -94,9 +58,174 @@ print("Saldo: R$", saldo) print("\n-----------------------------------------") - elif opcao == "q": - print("Saindo...") - break - else: - print("Operação inválida, por favor selecione novamente a operação desejada.") +def criar_usuario(usuarios): + + cpf = input("Informe o CPF (somente número): ") + usuario = filtrar_usuario(cpf, usuarios) + if usuario: + print("\nEste CPF já está cadastrado.") + 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 êxito!") + + +def filtrar_usuario(cpf, usuarios): + usuarios_filtrados = [] + + for usuario in usuarios: + if usuario["cpf"] == cpf: + usuarios_filtrados.append(usuario) + + 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 êxito!") + return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario} + + print("\nUsuário não encontrado!") + + +def listar_contas(contas): + + print("\n---------------------------------------") + print("\t\tContas") + print("---------------------------------------\n") + + for conta in contas: + linha = f"""\ + --------------------------------------- + \tAgência:\t{conta['agencia']} + \tC/C:\t\t{conta['numero_conta']} + \tTitular:\t{conta['usuario']['nome']} + --------------------------------------- + """ + + print(textwrap.dedent(linha)) + + print("---------------------------------------") + + +def main(): + saldo = 0 + limite = 500 + extrato = "" + numero_saques = 0 + LIMITE_SAQUES = 3 + AGENCIA = "0001" + usuarios = [] + contas = [] + + while True: + + opcao = input(menu) + + if opcao == "d": + ''' + Operação de depósito + + Deve ser possível depositar valores positivos para a minha + conta bancária. A v1 do projeto trabalha apenas com 1 + usuário, dessa forma não precisamos nos preocupar em + identificar qual é o número da agência e conta bancária. Todos + os depósitos devem ser armazenados em uma variável e + exibidos na operação de extrato. + ''' + + valor_deposito = float(input("Digite o valor do depósito: ")) + + saldo, extrato = depositar(saldo, valor_deposito, extrato) + + elif opcao == "s": + ''' + Operação de saque + + O sistema deve permitir realizar 3 saques diários com limite + máximo de R$ 500,00 por saque. Caso o usuário não tenha + saldo em conta, o sistema deve exibir uma mensagem + informando que não será possível sacar o dinheiro por falta de + saldo. Todos os saques devem ser armazenados em uma + variável e exibidos na operação de extrato. + ''' + + valor_saque = float(input("Digite o valor do saque: ")) + + saldo, extrato = sacar(saldo=saldo, + valor_saque=valor_saque, + extrato=extrato, + limite=limite, + numero_saques=numero_saques, + LIMITE_SAQUES=LIMITE_SAQUES) + + elif opcao == "e": + ''' + Operação de extrato + + Essa operação deve listar todos os depósitos e saques + realizados na conta. No fim da listagem deve ser exibido o + saldo atual da conta. Se o extrato estiver em branco, exibir a + mensagem: Não foram realizadas movimentações. + Os valores devem ser exibidos utilizando o formato R$ xxx.xx, + exemplo: + 1500.45 = R$ 1500.45 + ''' + + extrato(saldo, extrato=extrato) + + elif opcao == "nu": + ''' + Criar Usuário (cliente) + + O programa deve armazenar os usuários em uma lista, um + usuário é composto por: nome, data de nascimento, cpf e + endereço. O endereço é uma string com o formato: logradouro, + cidade/sigla estado. Deve ser armazenado + bairro + nro + somente os números do CPF. Não podemos cadastrar 2 + usuários com o mesmo CPF. + ''' + + criar_usuario(usuarios) + + elif opcao == "nc": + ''' + Criar conta corrente + + O programa deve armazenar contas em uma lista, uma conta é + composta por: agência, número da conta e usuário. O número + da conta é sequencial, iniciando em 1. O número da agência é + fixo: "0001". O usuário pode ter mais de uma conta, mas uma + conta pertence a somente um usuário. + ''' + + 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": + print("Saindo...") + break + + else: + print("Operação inválida.") + +main() \ No newline at end of file From 7115b1e937f7b64854fdb4ba8a0488a745b85642 Mon Sep 17 00:00:00 2001 From: Gustavo Raia Date: Thu, 19 Sep 2024 15:00:05 -0300 Subject: [PATCH 3/3] =?UTF-8?q?Adicionando=20Orienta=C3=A7=C3=A3o=20a=20Ob?= =?UTF-8?q?jetos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 00 - Fundamentos/desafio.py | 349 ++++++++++++++++++++++++++++-------- 1 file changed, 271 insertions(+), 78 deletions(-) diff --git a/00 - Fundamentos/desafio.py b/00 - Fundamentos/desafio.py index c9154393b..8977cf83d 100644 --- a/00 - Fundamentos/desafio.py +++ b/00 - Fundamentos/desafio.py @@ -1,4 +1,184 @@ import textwrap +from abc import ABC, abstractmethod +from datetime import datetime + + +class Usuario: + def __init__(self, endereco): + self.endereco = endereco + self.contas = [] + + def realizar_transacao(self, conta, transacao): + transacao.registrar(conta) + + def adicionar_conta(self, conta): + self.contas.append(conta) + + +class PessoaFisica(Usuario): + 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, usuario): + self._saldo = 0 + self._numero = numero + self._agencia = "0001" + self._usuario = usuario + self._historico = Historico() + + @classmethod + def nova_conta(cls, usuario, numero): + return cls(numero, usuario) + + @property + def saldo(self): + return self._saldo + + @property + def numero(self): + return self._numero + + @property + def agencia(self): + return self._agencia + + @property + def usuario(self): + return self._usuario + + @property + def historico(self): + return self._historico + + def sacar(self, valor_saque): + + if(valor_saque > self._saldo): + print("Saldo insuficiente para realizar o saque.") + + # elif(valor_saque > self.limites["saque"]): + # print("Valor excede o limite.") + + elif(valor_saque > 0): + self._saldo -= valor_saque + # extrato += f"Saque: R$ {valor_saque}\n" + print("Saque realizado com êxito.") + print("Saldo atual: R$", self._saldo) + + else: + print("Valor inválido") + + return False + + def depositar(self, valor_deposito): + + if(valor_deposito > 0): + self._saldo += valor_deposito + # extrato += f"Depósito: R$ {valor_deposito}\n" + + print("Depósito realizado com sucesso.") + print("Saldo atual: R$", self.saldo) + + else: + print("Valor inválido") + return False + + return True + + +class ContaCorrente(Conta): + def __init__(self, numero, usuario, limite=500, limite_saques=3): + super().__init__(numero, usuario) + 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__] + ) + + if(valor > self._limite): + print("\nO valor do saque excede o limite!") + + elif(numero_saques >= self._limite_saques): + print("\nNú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.usuario.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 + @abstractmethod + def valor(self): + pass + + @classmethod + @abstractmethod + 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): + validar_transacao = conta.sacar(self.valor) + + if validar_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): + validar_transacao = conta.depositar(self.valor) + + if validar_transacao: + conta.historico.adicionar_transacao(self) + def menu(): menu = """ @@ -8,55 +188,76 @@ def menu(): [nc]Nova conta [lc]Listar contas [nu]Novo usuário - [q] Sair + [q] Sair\n """ return input(textwrap.dedent(menu)) -def depositar(saldo, valor_deposito, extrato, /): - if(valor_deposito > 0): - saldo += valor_deposito - extrato += f"Depósito: R$ {valor_deposito}\n" - print("Depósito realizado com sucesso.") - print("Saldo atual: R$", saldo) +def depositar(usuarios): + cpf = input("Informe o CPF do cliente: ") + usuario = filtrar_usuario(cpf, usuarios) - else: - print("Valor inválido") + if not usuario: + print("\nUsuário não encontrado") + return - return saldo, extrato + valor = float(input("Informe o valor do depósito: ")) + transacao = Deposito(valor) + + conta = recuperar_conta_usuario(usuario) + if not conta: + return + + usuario.realizar_transacao(conta, transacao) + +def sacar(usuarios): + cpf = input("Informe o CPF do usuário: ") + usuario = filtrar_usuario(cpf, usuarios) + + if not usuario: + print("\nUsuário não encontrado!") + return + + valor = float(input("Informe o valor do saque: ")) + transacao = Saque(valor) + + conta = recuperar_conta_usuario(usuario) + if not conta: + return + usuario.realizar_transacao(conta, transacao) -def sacar(*, saldo, valor_saque, extrato, limite, numero_saques, LIMITE_SAQUES): - if(valor_saque > saldo): - print("Saldo insuficiente para realizar o saque.") - elif(valor_saque > limite): - print("Valor excede o limite.") +def extrato(usuarios): + cpf = input("Informe o CPF do usuário: ") + usuario = filtrar_usuario(cpf, usuarios) - elif(numero_saques >= LIMITE_SAQUES): - print("Limite de saques diários excedido.") + if not usuario: + print("\nCliente não encontrado!") + return - elif(valor_saque > 0): - saldo -= valor_saque - extrato += f"Saque: R$ {valor_saque}\n" - print("Saque realizado com sucesso.") - print("Saldo atual: R$", saldo) - numero_saques += 1 + conta = recuperar_conta_usuario(usuario) - else: - print("Valor inválido") + if not conta: + return + + print("\n-----------------------------------------") + print("\t\tExtrato") + print("-----------------------------------------") + transacoes = conta.historico.transacoes + extrato = "" + + if not transacoes: + extrato = "Não foram realizadas movimentações." - return saldo, extrato + else: + for transacao in transacoes: + extrato += f"\n{transacao['tipo']}:\tR$ {transacao['valor']:.2f}" + print(extrato) + print(f"\nSaldo:\tR$ {conta.saldo:.2f}") -def extrato(saldo, /, *, extrato): - print("\n-----------------------------------------") - print("\t\tExtrato") - print("-----------------------------------------\n") - if(extrato == ""): - print("Não foram realizadas movimentações.") - print("Saldo: R$", saldo) - print("\n-----------------------------------------") + print("\n-----------------------------------------") def criar_usuario(usuarios): @@ -73,31 +274,39 @@ def criar_usuario(usuarios): endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ") - usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco}) + usuario = PessoaFisica(nome=nome, data_nascimento=data_nascimento, cpf=cpf, endereco=endereco) + + usuarios.append(usuario) print("Usuário criado com êxito!") def filtrar_usuario(cpf, usuarios): - usuarios_filtrados = [] - - for usuario in usuarios: - if usuario["cpf"] == cpf: - usuarios_filtrados.append(usuario) - + 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): +def criar_conta(numero_conta, usuarios, contas): cpf = input("Informe o CPF do usuário: ") usuario = filtrar_usuario(cpf, usuarios) - if usuario: - print("\nConta criada com êxito!") - return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario} + if not usuario: + print("\nUsuário não encontrado!") + return + + conta = ContaCorrente.nova_conta(usuario=usuario, numero=numero_conta) + contas.append(conta) + usuario.contas.append(conta) - print("\nUsuário não encontrado!") + print("Conta criada com êxito!") +def recuperar_conta_usuario(usuario): + if not usuario.contas: + print("\nUsuário não possui conta.") + return + + # FIXME: não permite usuário escolher a conta + return usuario.contas[0] def listar_contas(contas): @@ -106,32 +315,28 @@ def listar_contas(contas): print("---------------------------------------\n") for conta in contas: - linha = f"""\ - --------------------------------------- - \tAgência:\t{conta['agencia']} - \tC/C:\t\t{conta['numero_conta']} - \tTitular:\t{conta['usuario']['nome']} - --------------------------------------- - """ + # linha = f"""\ + # --------------------------------------- + # \tAgência:\t{conta['agencia']} + # \tC/C:\t\t{conta['numero_conta']} + # \tTitular:\t{conta['usuario']['nome']} + # --------------------------------------- + # """ - print(textwrap.dedent(linha)) + # print(textwrap.dedent(linha)) + + print(textwrap.dedent(str(conta))) print("---------------------------------------") def main(): - saldo = 0 - limite = 500 - extrato = "" - numero_saques = 0 - LIMITE_SAQUES = 3 - AGENCIA = "0001" usuarios = [] contas = [] while True: - opcao = input(menu) + opcao = menu() if opcao == "d": ''' @@ -145,9 +350,7 @@ def main(): exibidos na operação de extrato. ''' - valor_deposito = float(input("Digite o valor do depósito: ")) - - saldo, extrato = depositar(saldo, valor_deposito, extrato) + depositar(usuarios) elif opcao == "s": ''' @@ -161,14 +364,7 @@ def main(): variável e exibidos na operação de extrato. ''' - valor_saque = float(input("Digite o valor do saque: ")) - - saldo, extrato = sacar(saldo=saldo, - valor_saque=valor_saque, - extrato=extrato, - limite=limite, - numero_saques=numero_saques, - LIMITE_SAQUES=LIMITE_SAQUES) + sacar(usuarios) elif opcao == "e": ''' @@ -183,11 +379,11 @@ def main(): 1500.45 = R$ 1500.45 ''' - extrato(saldo, extrato=extrato) + extrato(usuarios) elif opcao == "nu": ''' - Criar Usuário (cliente) + Criar Usuário (usuario) O programa deve armazenar os usuários em uma lista, um usuário é composto por: nome, data de nascimento, cpf e @@ -213,10 +409,7 @@ def main(): ''' numero_conta = len(contas) + 1 - conta = criar_conta(AGENCIA, numero_conta, usuarios) - - if conta: - contas.append(conta) + criar_conta(numero_conta, usuarios, contas) elif opcao == "lc": listar_contas(contas)