Classe Deposit

module.exports = class Deposit {
  constructor(value) {
    this.value = value
    this.createdAt = new Date()
  }
}

Classe Transfer

module.exports = class Transfer {
  constructor(fromUser, toUser, value) {
    this.fromUser = fromUser
    this.toUser = toUser
    this.value = value
    this.createdAt = new Date()
  }
}

Classe Installment

module.exports = class Installment {
  constructor(value, number) {
    this.value = value
    this.number = number
    this.status = 'pending'
  }
}

Classe Loan

const Installment = require("./Installment")

module.exports = class Loan {
  static #fee = 1.05

  constructor(value, installments) {
    this.value = value
    this.installments = []
    for (let i = 1; i <= installments; i++) {
      this.installments.push(new Installment((value * Loan.#fee) / installments, i))
    }
    this.createdAt = new Date()
  }

  static get fee() {
    return Loan.#fee
  }

  static set fee(newFeePercentage) {
    Loan.#fee = 1 + (newFeePercentage / 100)
  }
}

Classe Account

module.exports = class Account {
  #balance
  // #deposits
  // #loans
  // #transfers

  constructor(user) {
    this.owner = user
    this.#balance = 0
    this.deposits = []
    this.loans = []
    this.transfers = []
  }

  get balance() {
    return this.#balance
  }

  addDeposit(deposit) {
    this.#balance += deposit.value
    this.deposits.push(deposit)
  }

  addLoan(loan) {
    this.#balance =+ loan.value
    this.loans.push(loan)
  }

  addTransfer(transfer) {
    if (transfer.toUser.email === this.owner.email) {
      this.#balance += transfer.value
      this.transfers.push(transfer)
    } else if (transfer.fromUser.email === this.owner.email) {
      this.#balance -= transfer.value
      this.transfers.push(transfer)
    }
  }
}

Classe User

const Account = require("./Account")

module.exports = class User {
  constructor(email, fullname) {
    this.email = email
    this.fullname = fullname
    this.account = new Account(this)
  }
}

Classe App

const Deposit = require("./Deposit")
const Loan = require("./Loan")
const Transfer = require("./Transfer")
const User = require("./User")

module.exports = class App {
  static #users = []

  static findUser(email) {
    const user = this.#users.find(user => user.email === email)
    return user ?? null
  }

  static createUser(email, fullname) {
    const userExists = App.findUser(email)
    if (!userExists) {
      this.#users.push(new User(email, fullname))
    }
  }

  static deposit(email, value) {
    const user = App.findUser(email)
    if (user) {
      const newDeposit = new Deposit(value)
      user.account.addDeposit(newDeposit)
    }
  }

  static transfer(fromUserEmail, toUserEmail, value) {
    const fromUser = App.findUser(fromUserEmail)
    const toUser = App.findUser(toUserEmail)
    if (fromUser && toUser) {
      const newTransfer = new Transfer(fromUser, toUser, value)
      fromUser.account.addTransfer(newTransfer)
      toUser.account.addTransfer(newTransfer)
    }
  }

  static takeLoan(email, value, numberOfInstallments) {
    const user = App.findUser(email)
    if (user) {
      const newLoan = new Loan(value, numberOfInstallments)
      user.account.addLoan(newLoan)
    }
  }

  static changeLoanFee(newFeePercentage) {
    Loan.fee = newFeePercentage
  }
}

Arquivo de teste

const App = require("./App")

App.createUser("[email protected]", "Isaac Pontes")
App.createUser("[email protected]", "Lucas Queiroga")
App.createUser("[email protected]", "Juliana Conde")

App.deposit("[email protected]", 100)

App.transfer("[email protected]", "[email protected]", 20)

App.changeLoanFee(10)
App.takeLoan("[email protected]", 2000, 24)

console.log(App.findUser("[email protected]"))
console.log(App.findUser("[email protected]").account)
console.log(App.findUser("[email protected]"))
console.log(App.findUser("[email protected]").account)
console.log(App.findUser("[email protected]"))
console.log(App.findUser("[email protected]").account)
console.log(App.findUser("[email protected]").account.loans[0].installments)