trilha-python-dio icon indicating copy to clipboard operation
trilha-python-dio copied to clipboard

sistema bancario com poo

Open vinirgg opened this issue 7 months ago • 0 comments

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)

vinirgg avatar Jul 15 '24 21:07 vinirgg