forked from digitalinnovationone/trilha-python-dio
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
a328301
commit 334f15a
Showing
2 changed files
with
516 additions
and
0 deletions.
There are no files selected for viewing
174 changes: 174 additions & 0 deletions
174
02 - Programação Orientada a Objetos/10 - desafio/desafio_v1.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,174 @@ | ||
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.registrar(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("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@") | ||
|
||
elif valor > 0: | ||
self._saldo -= valor | ||
print("\n=== Saque realizado com sucesso! ===") | ||
return True | ||
|
||
else: | ||
print("\n@@@ Operação falhou! O valor informado é inválido. @@@") | ||
|
||
return False | ||
|
||
def depositar(self, valor): | ||
if valor > 0: | ||
self._saldo += valor | ||
print("\n=== Depósito realizado com sucesso! ===") | ||
else: | ||
print("\n@@@ Operaçã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) |
Oops, something went wrong.