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)