Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] eu fiz a mesma coisa que o instrutor passou porem quando eu faço umas tranferencia maior que meu saldo ainda sim fica negativado

import { Transacao } from "../types/Transacao.js";
import { TipoTransacao } from "../types/TipoTransacao.js";
import SaldoComponent from "./saldo-component.js";
import Conta from "../types/Conta.js";

const elementoFormulario = document.querySelector(".block-nova-transacao form") as HTMLFormElement;
elementoFormulario.addEventListener("submit", function (event) {

    try {
        event.preventDefault();
        if (!elementoFormulario.checkValidity()) {
            alert("Por favor, preencha todos os campos da transação!");
            return;
        }

        const inputTipoTransacao = elementoFormulario.querySelector("#tipoTransacao") as HTMLSelectElement;
        const inputValor = elementoFormulario.querySelector("#valor") as HTMLInputElement;
        const inputData = elementoFormulario.querySelector("#data") as HTMLInputElement;

        let tipoTransacao: TipoTransacao = inputTipoTransacao.value as TipoTransacao;
        let valor: number = inputValor.valueAsNumber;
        let data: Date = new Date(inputData.value);

        const novaTransacao: Transacao = {
            tipoTransacao: tipoTransacao,
            valor: valor,
            data: data
        };

        Conta.registrarTransacao(novaTransacao);
        SaldoComponent.atualizar();
        elementoFormulario.reset();
    }
    catch (erro) {
        alert(erro.message);
    }
});
import { Transacao } from "./Transacao.js";
import { TipoTransacao } from "./TipoTransacao.js";

let saldo: number = 3000;

function debitar(valor: number): void {
    if (valor <= 0) {
        throw new Error("O valor a ser debitado deve ser maior que zero!");
    }
    if (valor > saldo) {
        throw new Error("Saldo insuficiente!");
    }
    saldo -= valor;
}

function depositar(valor: number): void {
    if (valor <= 0) {
        throw new Error("O valor a ser depositado deve ser maior que zero!");
    }
    saldo += valor;
}


const Conta = {
    getSaldo() {
        return saldo;
    },

    getDataAcesso(): Date {
        return new Date();
    },

    registrarTransacao(novaTransacao: Transacao): void {
        if (novaTransacao.tipoTransacao == TipoTransacao.DEPOSITO) {
            depositar(novaTransacao.valor);
        }
        else if (novaTransacao.tipoTransacao == TipoTransacao.TRANSFERENCIA || novaTransacao.tipoTransacao == TipoTransacao.PAGAMENTO_BOLETO) {
            debitar(novaTransacao.valor);
        }
        else {
            throw new Error("Tipo de Transação é inválido!");
        }

        console.log(novaTransacao);
    }
}


export default Conta;
2 respostas
solução!

O problema parece estar relacionado à lógica de registro de transações no método registrarTransacao da classe Conta. O código que você compartilhou está estruturado corretamente, mas o problema provavelmente ocorre devido à maneira como o saldo é manipulado durante o registro das transações.

Primeiro, vamos analisar o método registrarTransacao e os métodos auxiliares debitar e depositar:

const Conta = {
    getSaldo() {
        return saldo;
    },

    getDataAcesso(): Date {
        return new Date();
    },

    registrarTransacao(novaTransacao: Transacao): void {
        if (novaTransacao.tipoTransacao == TipoTransacao.DEPOSITO) {
            depositar(novaTransacao.valor);
        }
        else if (novaTransacao.tipoTransacao == TipoTransacao.TRANSFERENCIA || novaTransacao.tipoTransacao == TipoTransacao.PAGAMENTO_BOLETO) {
            debitar(novaTransacao.valor);
        }
        else {
            throw new Error("Tipo de Transação é inválido!");
        }

        console.log(novaTransacao);
    }
}

Aqui, o método registrarTransacao verifica o tipo da transação e chama depositar ou debitar de acordo. Os métodos debitar e depositar são responsáveis por atualizar o saldo.

Verifique os métodos debitar e depositar:

function debitar(valor: number): void {
    if (valor <= 0) {
        throw new Error("O valor a ser debitado deve ser maior que zero!");
    }
    if (valor > saldo) {
        throw new Error("Saldo insuficiente!");
    }
    saldo -= valor;
}

function depositar(valor: number): void {
    if (valor <= 0) {
        throw new Error("O valor a ser depositado deve ser maior que zero!");
    }
    saldo += valor;
}

Aqui está um ajuste que você pode fazer para garantir que o saldo não fique negativo ao realizar uma transferência:

  1. Verifique se o saldo é suficiente antes de realizar a transação: Embora você já tenha essa verificação no método debitar, é importante garantir que essa lógica esteja sendo chamada corretamente no registrarTransacao.

  2. Adicione logs para depuração: Isso ajuda a entender melhor o que está acontecendo quando a transação é registrada.

  3. Verifique se o método debitar está sendo chamado corretamente: Assegure-se de que a verificação de saldo ocorra antes da atualização.

Aqui está a versão ajustada:

const Conta = {
    getSaldo() {
        return saldo;
    },

    getDataAcesso(): Date {
        return new Date();
    },

    registrarTransacao(novaTransacao: Transacao): void {
        try {
            console.log(`Registrando transação: ${JSON.stringify(novaTransacao)}`);
            if (novaTransacao.tipoTransacao == TipoTransacao.DEPOSITO) {
                depositar(novaTransacao.valor);
            }
            else if (novaTransacao.tipoTransacao == TipoTransacao.TRANSFERENCIA || novaTransacao.tipoTransacao == TipoTransacao.PAGAMENTO_BOLETO) {
                debitar(novaTransacao.valor);
            }
            else {
                throw new Error("Tipo de Transação é inválido!");
            }
        } catch (error) {
            console.error(`Erro ao registrar transação: ${error.message}`);
            throw error;
        }

        console.log(`Saldo após transação: ${saldo}`);
    }
}

Ao fazer uma transferência ou pagamento de boleto, certifique-se de que o saldo é suficiente. Caso contrário, o método debitar lançará um erro, e a transação não será registrada, evitando que o saldo fique negativo.

perfeito agradeço a ajuda, eu consegui