Skip to content

Commit

Permalink
feat: challenge resolution
Browse files Browse the repository at this point in the history
  • Loading branch information
guicarvalho committed Sep 12, 2022
1 parent a328301 commit 334f15a
Show file tree
Hide file tree
Showing 2 changed files with 516 additions and 0 deletions.
174 changes: 174 additions & 0 deletions 02 - Programação Orientada a Objetos/10 - desafio/desafio_v1.py
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)
Loading

0 comments on commit 334f15a

Please sign in to comment.