diff --git a/Class Diagram.png b/Class Diagram.png new file mode 100644 index 000000000..570f03893 Binary files /dev/null and b/Class Diagram.png differ diff --git a/Domain Model Java Bank Challenge.md b/Domain Model Java Bank Challenge.md new file mode 100644 index 000000000..f6932717d --- /dev/null +++ b/Domain Model Java Bank Challenge.md @@ -0,0 +1,55 @@ +``` +As a customer, +So I can safely store and use my money, +I want to create a current account. +``` + +| Classes | Member var. | Methods | Scenario | Output | +| ------- | -------------- | ------------ | ------------ | ------- | +| Account | String accName | getBalance() | balance == 0 | 0 | +| | float balance | | balance >0 | balance | +| CurrAcc | String accName | | | | +| | float balance | | | | + + +``` +As a customer, +So I can save for a rainy day, +I want to create a savings account. +``` + +| Classes | Member var. | Methods | Scenario | Output | +| ------- | -------------- | ------------ | ------------ | ------- | +| Account | String accName | getBalance() | balance == 0 | 0 | +| | int Balance | | balance >0 | balance | +| SavAcc | String accName | | | | +| | int Balance | | | | +``` +As a customer, +So I can keep a record of my finances, +I want to generate bank statements with transaction dates, amounts, and balance at the time of transaction. +``` +| Classes | Member var. | Methods | Scenario | Output | +| ------------- | -------------------------------- | ---------------------- | ----------------------------- | --------------------------------------------- | +| BankStatement | List<`Transaction`> Transactions | generate() | transactions is empty | header of bankstatements | +| | | | transactions got transactions | return string of transactions in right format | +| Transaction | localDate currDate | | | | +| | float credit | | | | +| | float debit | | | | +| | float balance | | | | +| Account | BankStatement bankStatement | getBankStatementOutput | | | + +``` +As a customer, +So I can use my account, +I want to deposit and withdraw funds. +``` + +| Classes | Member var. | Methods | Scenario | Output | +| ------- | -------------- | -------------------- | ----------------------------- | ------ | +| Account | String accName | deposit(int Amount) | amount =< 0 | False | +| | float balance | | amount > 0 | True | +| | | withdraw(int Amount) | amount =< 0 | False | +| | | | amount > 0 && amount 0 && amount >balance | False | + diff --git a/src/main/java/com/booleanuk/core/Account.java b/src/main/java/com/booleanuk/core/Account.java new file mode 100644 index 000000000..de519fbd2 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Account.java @@ -0,0 +1,59 @@ +package com.booleanuk.core; + +public class Account{ + private String accName; + private float balance; + private BankStatement bankStatement; + + public Account(String accName){ + this.accName = accName; + this.balance = 0.0f; + bankStatement = new BankStatement(); + } + + public String getAccName() { + return accName; + } + + public float getBalance() { + return balance; + } + + public BankStatement getBankStatement() { + return bankStatement; + } + + public boolean deposit(float amount){ + if(amount > 0) { + this.balance += amount; + makeTransaction(amount, "Credit"); + return true; + } + return false; + } + + public boolean withdraw(float amount){ + if(amount>0 && this.balance>amount){ + this.balance -= amount; + makeTransaction(amount, "Debit"); + return true; + } + return false; + } + + public boolean makeTransaction(float amount, String type){ + Transaction transaction; + if(type == "Credit") { + transaction = new Transaction(amount, 0f, this.balance); + bankStatement.getTransactions().add(transaction); + }else if(type == "Debit") { + transaction = new Transaction(0f, amount, this.balance); + bankStatement.getTransactions().add(transaction); + } + return true; + } + + public String getBankStatementOutput(){ + return bankStatement.generate(); + } +} diff --git a/src/main/java/com/booleanuk/core/BankStatement.java b/src/main/java/com/booleanuk/core/BankStatement.java new file mode 100644 index 000000000..ffeef032d --- /dev/null +++ b/src/main/java/com/booleanuk/core/BankStatement.java @@ -0,0 +1,48 @@ +package com.booleanuk.core; + +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +public class BankStatement { + private List transactions; + + BankStatement(){ + this.transactions = new ArrayList(); + } + + public List getTransactions() { + return transactions; + } + + public String generate() { + String result = "date || credit || debit || balance\n"; + + List reversedList = new ArrayList<>(transactions); + Collections.reverse(reversedList); + + for (Transaction tran : reversedList) { + String date = tran.getCurrDate().getDayOfMonth() + "/" + + tran.getCurrDate().getMonthValue() + "/" + + tran.getCurrDate().getYear(); + + String credit = ""; + if (tran.getCredit() != 0) { + credit = String.format(Locale.US,"%.2f", tran.getCredit()); + } + + String debit = ""; + if (tran.getDebit() != 0) { + debit = String.format(Locale.US,"%.2f", tran.getDebit()); + } + + String balance = String.format(Locale.US,"%.2f", tran.getBalance());; + + result = result + date + " || " + credit + " || " + debit + " || " + balance + "\n"; + } + + return result; + } +} diff --git a/src/main/java/com/booleanuk/core/CurrAcc.java b/src/main/java/com/booleanuk/core/CurrAcc.java new file mode 100644 index 000000000..08be5771d --- /dev/null +++ b/src/main/java/com/booleanuk/core/CurrAcc.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class CurrAcc extends Account{ + public CurrAcc(String accName){ + super(accName); + } +} diff --git a/src/main/java/com/booleanuk/core/SavAcc.java b/src/main/java/com/booleanuk/core/SavAcc.java new file mode 100644 index 000000000..928ac2bf3 --- /dev/null +++ b/src/main/java/com/booleanuk/core/SavAcc.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class SavAcc extends Account{ + public SavAcc(String accName){ + super(accName); + } +} diff --git a/src/main/java/com/booleanuk/core/Transaction.java b/src/main/java/com/booleanuk/core/Transaction.java new file mode 100644 index 000000000..5477c26af --- /dev/null +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -0,0 +1,33 @@ +package com.booleanuk.core; + +import java.time.LocalDate; + +public class Transaction { + private LocalDate currDate; + private float credit; + private float debit; + private float balance; + + public Transaction(float credit, float debit, float balance){ + this.credit = credit; + this.debit = debit; + this.balance = balance; + this.currDate = LocalDate.now(); + } + + public LocalDate getCurrDate() { + return currDate; + } + + public float getCredit() { + return credit; + } + + public float getDebit() { + return debit; + } + + public float getBalance() { + return balance; + } +} diff --git a/src/test/java/com/booleanuk/core/AccountTest.java b/src/test/java/com/booleanuk/core/AccountTest.java new file mode 100644 index 000000000..9f477df79 --- /dev/null +++ b/src/test/java/com/booleanuk/core/AccountTest.java @@ -0,0 +1,79 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.util.List; + +public class AccountTest { + @Test + public void ShouldDepositAmount(){ + Account account = new SavAcc("Test Account"); + + Assertions.assertEquals(0f, account.getBalance()); + Assertions.assertTrue(account.deposit(1000f)); + Assertions.assertEquals(1000f, account.getBalance()); + Assertions.assertTrue(account.deposit(300f)); + Assertions.assertEquals(1300f, account.getBalance()); + + Assertions.assertFalse(account.deposit(-100f)); + Assertions.assertFalse(account.deposit(0f)); + } + + @Test + public void ShouldWithdrawAmount(){ + Account account = new Account("Test Account"); + + Assertions.assertFalse(account.withdraw(500f)); + + account.deposit(1000f); + + Assertions.assertTrue(account.withdraw(500f)); + Assertions.assertEquals(500f, account.getBalance()); + Assertions.assertFalse(account.withdraw(1000f)); + Assertions.assertFalse(account.withdraw(0f)); + Assertions.assertFalse(account.withdraw(-100)); + } + + @Test + public void ShouldRegisterTransaction(){ + Account account = new CurrAcc("Test Account"); + + account.deposit(1000f); + account.withdraw(500f); + + List transactions = account.getBankStatement().getTransactions(); + + Assertions.assertEquals(2, transactions.size()); + + Transaction tran1 = transactions.get(0); + Assertions.assertEquals(1000f, tran1.getCredit()); + Assertions.assertEquals(0f, tran1.getDebit()); + Assertions.assertEquals(1000f, tran1.getBalance()); + Assertions.assertEquals(LocalDate.now(), tran1.getCurrDate()); + + Transaction tran2 = transactions.get(1); + Assertions.assertEquals(0f, tran2.getCredit()); + Assertions.assertEquals(500f, tran2.getDebit()); + Assertions.assertEquals(500f, tran2.getBalance()); + Assertions.assertEquals(LocalDate.now(), tran2.getCurrDate()); + } + + @Test + public void shouldGenerateBankStatement() { + Account account = new Account("Test"); + account.deposit(1000f); + + Transaction tran = account.getBankStatement().getTransactions().get(0); + + String date = tran.getCurrDate().getDayOfMonth() + "/" + + tran.getCurrDate().getMonthValue() + "/" + + tran.getCurrDate().getYear(); + + String bankStatement = + "date || credit || debit || balance\n" + date + " || 1000.00 || || 1000.00\n"; + + Assertions.assertEquals(bankStatement, account.getBankStatement().generate()); + } +}