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..c99db0c25 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Account.java @@ -0,0 +1,60 @@ +package com.booleanuk.core; + + +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +public abstract class Account { + protected List transactions = new ArrayList<>(); + protected float balance = 0; + protected String name; + protected long accountNumber; + + public List getTransactions() { + return transactions; + } + + public float getBalance() { + return balance; + } + + public boolean deposit(float amount){ + if (amount > 0){ + transactions.add(new Transaction(amount)); + balance += amount; + return true; + } + return false; + } + + public boolean withdraw(float amount){ + if (amount > 0 && balance >= amount){ + transactions.add(new Transaction(-amount)); + balance -= amount; + return true; + } + return false; + } + + public String generateStatements(){ + StringBuilder str = new StringBuilder(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + str.append(String.format("%1$-10s || %2$-10s || %3$-10s || %4$-10s\n", "date", "credit", "debit", "balance")); + float balance = 0; + List rows = new ArrayList<>(); + for (Transaction trs: transactions){ + balance += trs.getDelta(); + if(trs.getDelta() > 0){ + rows.add(String.format("%1$-10s || %2$-10s || %3$-10s || %4$-10s\n", trs.getTimeStamp().format(formatter), trs.getDelta(), "", balance)); + } + else { + rows.add(String.format("%1$-10s || %2$-10s || %3$-10s || %4$-10s\n", trs.getTimeStamp().format(formatter), "", Math.abs(trs.getDelta()), balance)); + } + } + for (String row: rows.reversed()){ + str.append(row); + } + return str.toString(); + } +} diff --git a/src/main/java/com/booleanuk/core/CurrentAccount.java b/src/main/java/com/booleanuk/core/CurrentAccount.java new file mode 100644 index 000000000..8e0690006 --- /dev/null +++ b/src/main/java/com/booleanuk/core/CurrentAccount.java @@ -0,0 +1,5 @@ +package com.booleanuk.core; + +public class CurrentAccount extends Account{ + +} diff --git a/src/main/java/com/booleanuk/core/SavingsAccount.java b/src/main/java/com/booleanuk/core/SavingsAccount.java new file mode 100644 index 000000000..6d83ab8b4 --- /dev/null +++ b/src/main/java/com/booleanuk/core/SavingsAccount.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class SavingsAccount extends Account{ +} 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..3e9af5716 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Transaction.java @@ -0,0 +1,21 @@ +package com.booleanuk.core; + +import java.time.LocalDateTime; + +public class Transaction { + private final float delta; + private final LocalDateTime timeStamp; + + public Transaction(float delta) { + this.delta = delta; + this.timeStamp = LocalDateTime.now(); + } + + public float getDelta() { + return delta; + } + + public LocalDateTime getTimeStamp() { + return timeStamp; + } +} diff --git a/src/main/java/com/booleanuk/core/User.java b/src/main/java/com/booleanuk/core/User.java new file mode 100644 index 000000000..ab750439e --- /dev/null +++ b/src/main/java/com/booleanuk/core/User.java @@ -0,0 +1,20 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public class User { + private List accounts = new ArrayList<>(); + + public void addAccount(Account account){ + accounts.add(account); + } + + public List getAccounts() { + return accounts; + } + + public void printBankStatements(Account account){ + System.out.println(account.generateStatements()); + } +} diff --git a/src/main/java/com/booleanuk/core/class-diagram.png b/src/main/java/com/booleanuk/core/class-diagram.png new file mode 100644 index 000000000..4032cfc97 Binary files /dev/null and b/src/main/java/com/booleanuk/core/class-diagram.png differ diff --git a/src/main/java/com/booleanuk/core/domain-model.md b/src/main/java/com/booleanuk/core/domain-model.md new file mode 100644 index 000000000..8e92bfb82 --- /dev/null +++ b/src/main/java/com/booleanuk/core/domain-model.md @@ -0,0 +1,15 @@ +| Class | Member | Method | Scenario | Output | +|------------------|---------------------------------|------------------------------|--------------------------------|--------------------| +| User | List accounts | addAccount(Account account) | | | +| Abstract Account | List transactions | getBalance() | | float balance | +| | float balance | getTransactions() | | List | +| | int accountNumber | deposit(float amount) | deposit was successfully done | true | +| | | withdraw(float float amount) | withdrawal was successful | true | +| | | generateStatements() | | | +| CurrentAccount | | | | | +| SavingAccount | | | | | +| Transaction | float delta | | | | +| | String timeStamp | | | | +| | | | | | +| | | | | | +| | | | | | diff --git a/src/main/java/com/booleanuk/extension/.gitkeep b/src/main/java/com/booleanuk/extension/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/java/com/booleanuk/extension/Account.java b/src/main/java/com/booleanuk/extension/Account.java new file mode 100644 index 000000000..19e0fb1b9 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Account.java @@ -0,0 +1,65 @@ +package com.booleanuk.extension; + +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +public abstract class Account { + protected List transactions = new ArrayList<>(); + protected String name; + protected long accountNumber; + + + public Account(String name) { + this.name = name; + } + + public List getTransactions() { + return transactions; + } + + public float getBalance() { + float balance = 0; + for (Transaction trs : transactions){ + balance += trs.getDelta(); + } + return balance; + } + + public boolean deposit(float amount){ + if (amount > 0){ + transactions.add(new Transaction(amount)); + return true; + } + return false; + } + + public boolean withdraw(float amount){ + if (amount > 0 && getBalance() >= amount){ + transactions.add(new Transaction(-amount)); + return true; + } + return false; + } + + public String generateStatements(){ + StringBuilder str = new StringBuilder(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + str.append(String.format("%1$-10s || %2$-10s || %3$-10s || %4$-10s\n", "date", "credit", "debit", "balance")); + float balance = 0; + List rows = new ArrayList<>(); + for (Transaction trs: transactions){ + balance += trs.getDelta(); + if(trs.getDelta() > 0){ + rows.add(String.format("%1$-10s || %2$-10s || %3$-10s || %4$-10s\n", trs.getTimeStamp().format(formatter), trs.getDelta(), "", balance)); + } + else { + rows.add(String.format("%1$-10s || %2$-10s || %3$-10s || %4$-10s\n", trs.getTimeStamp().format(formatter), "", Math.abs(trs.getDelta()), balance)); + } + } + for (String row: rows.reversed()){ + str.append(row); + } + return str.toString(); + } +} diff --git a/src/main/java/com/booleanuk/extension/Branch.java b/src/main/java/com/booleanuk/extension/Branch.java new file mode 100644 index 000000000..590ad9769 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Branch.java @@ -0,0 +1,31 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.List; + +public class Branch { + private final List requests = new ArrayList<>(); + private final List accounts = new ArrayList<>(); + + public void approveRequest(OverdraftRequest request){ + request.approve(); + requests.remove(request); + } + + public void denyRequest(OverdraftRequest request){ + request.deny(); + requests.remove(request); + } + + public List getRequests() { + return requests; + } + + public void requestOverDraft(float amount, String reason, CurrentAccount account){ + requests.add(new OverdraftRequest(amount, reason, account)); + } + + public void addAccount(Account account){ + accounts.add(account); + } +} diff --git a/src/main/java/com/booleanuk/extension/CurrentAccount.java b/src/main/java/com/booleanuk/extension/CurrentAccount.java new file mode 100644 index 000000000..4d72d6a3b --- /dev/null +++ b/src/main/java/com/booleanuk/extension/CurrentAccount.java @@ -0,0 +1,22 @@ +package com.booleanuk.extension; + +public class CurrentAccount extends Account { + protected float approvedOverdraw = 0; + + public CurrentAccount(String name) { + super(name); + } + + public void setApprovedOverdraw(float approvedOverdraw) { + this.approvedOverdraw = approvedOverdraw; + } + + @Override + public boolean withdraw(float amount){ + if (amount > 0 && getBalance() + approvedOverdraw >= amount){ + transactions.add(new Transaction(-amount)); + return true; + } + return false; + } +} diff --git a/src/main/java/com/booleanuk/extension/OverdraftRequest.java b/src/main/java/com/booleanuk/extension/OverdraftRequest.java new file mode 100644 index 000000000..03921305f --- /dev/null +++ b/src/main/java/com/booleanuk/extension/OverdraftRequest.java @@ -0,0 +1,25 @@ +package com.booleanuk.extension; + +public class OverdraftRequest { + private float amount; + private String reason; + private CurrentAccount account; + + public OverdraftRequest(float amount, String reason, CurrentAccount account) { + this.amount = amount; + this.reason = reason; + this.account = account; + } + + public void approve(){ + account.setApprovedOverdraw(amount); + } + + public void deny(){ + // probably send a message or notify accountholder someway + } + + public String getReason() { + return reason; + } +} diff --git a/src/main/java/com/booleanuk/extension/SavingsAccount.java b/src/main/java/com/booleanuk/extension/SavingsAccount.java new file mode 100644 index 000000000..e333f6511 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/SavingsAccount.java @@ -0,0 +1,8 @@ +package com.booleanuk.extension; + +public class SavingsAccount extends Account { + public SavingsAccount(String name) { + super(name); + } +} + diff --git a/src/main/java/com/booleanuk/extension/Transaction.java b/src/main/java/com/booleanuk/extension/Transaction.java new file mode 100644 index 000000000..7e27772a0 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Transaction.java @@ -0,0 +1,21 @@ +package com.booleanuk.extension; + +import java.time.LocalDateTime; + +public class Transaction { + private final float delta; + private final LocalDateTime timeStamp; + + public Transaction(float delta) { + this.delta = delta; + this.timeStamp = LocalDateTime.now(); + } + + public float getDelta() { + return delta; + } + + public LocalDateTime getTimeStamp() { + return timeStamp; + } +} diff --git a/src/main/java/com/booleanuk/extension/User.java b/src/main/java/com/booleanuk/extension/User.java new file mode 100644 index 000000000..d0decaec2 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/User.java @@ -0,0 +1,20 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.List; + +public class User { + private List accounts = new ArrayList<>(); + + public void addAccount(Account account){ + accounts.add(account); + } + + public List getAccounts() { + return accounts; + } + + public void printBankStatements(Account account){ + System.out.println(account.generateStatements()); + } +} diff --git a/src/main/java/com/booleanuk/extension/class-diagram-ext.png b/src/main/java/com/booleanuk/extension/class-diagram-ext.png new file mode 100644 index 000000000..6e882bdcb Binary files /dev/null and b/src/main/java/com/booleanuk/extension/class-diagram-ext.png differ diff --git a/src/main/java/com/booleanuk/extension/domain-model.md b/src/main/java/com/booleanuk/extension/domain-model.md new file mode 100644 index 000000000..699095370 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/domain-model.md @@ -0,0 +1,18 @@ +| Class | Member | Method | Scenario | Output | +|------------------|---------------------------------|-----------------------------------------------|--------------------------------|--------------------| +| User | List accounts | addAccount(Account account) | | | +| Abstract Account | List transactions | getBalance() | | float balance | +| | Branch branch | getTransactions() | | List | +| | float ApprovedOverdraw | deposit(float amount) | deposit was successfully done | true | +| | | withdraw(float float amount) | withdrawal was successful | true | +| | | requestOverDraft(float amount, String reason) | | | +| | | generateStatements() | | String | +| CurrentAccount | | | | | +| SavingAccount | | | | | +| Transaction | float delta | | | | +| | String timeStamp | | | | +| Branch | List requests | approveRequest(request) | | | +| | | denyRequest(request) | | | +| OverdraftRequest | float Amount | | | | +| | String Reason | | | | +| | Account account | | | | diff --git a/src/test/java/com/booleanuk/core/TestBank.java b/src/test/java/com/booleanuk/core/TestBank.java new file mode 100644 index 000000000..1dc47ad30 --- /dev/null +++ b/src/test/java/com/booleanuk/core/TestBank.java @@ -0,0 +1,38 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.text.SimpleDateFormat; + +public class TestBank { + @Test + public void testCreatingAccount(){ + User user = new User(); + user.addAccount(new CurrentAccount()); + user.addAccount(new SavingsAccount()); + Assertions.assertEquals(2, user.getAccounts().size()); + } + + @Test + public void testDepositandWithdraw(){ + Account account = new CurrentAccount(); + Assertions.assertFalse(account.withdraw(700f)); + Assertions.assertTrue(account.deposit(500f)); + Assertions.assertTrue(account.withdraw(250f)); + Assertions.assertEquals(250f, account.getBalance()); + } + + @Test + public void testPrintBankstatement(){ + Account account = new CurrentAccount(); + Assertions.assertTrue(account.deposit(500f)); + Assertions.assertTrue(account.withdraw(250f)); + Assertions.assertEquals(250f, account.getBalance()); + System.out.println(account.generateStatements()); + String date = new SimpleDateFormat("dd/MM/yyyy").format(new java.util.Date()); + Assertions.assertEquals("date || credit || debit || balance \n" + + date + " || || 250.0 || 250.0 \n" + + date + " || 500.0 || || 500.0 \n", account.generateStatements()); + } +} diff --git a/src/test/java/com/booleanuk/extension/.gitkeep b/src/test/java/com/booleanuk/extension/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/test/java/com/booleanuk/extension/TestBankExt.java b/src/test/java/com/booleanuk/extension/TestBankExt.java new file mode 100644 index 000000000..8d3ba5e7b --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TestBankExt.java @@ -0,0 +1,33 @@ +package com.booleanuk.extension; + + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestBankExt { + @Test + public void testDenyOverdraft(){ + Branch branch = new Branch(); + CurrentAccount account = new CurrentAccount("Main account"); + branch.addAccount(account); + branch.requestOverDraft(10000f, "Need money for luxury car", account); + Assertions.assertEquals(1, branch.getRequests().size()); + branch.denyRequest(branch.getRequests().getFirst()); + Assertions.assertEquals(0, branch.getRequests().size()); + Assertions.assertFalse(account.withdraw(100f)); + Assertions.assertEquals(0, account.getBalance()); + } + + @Test + public void testApproveOverdraft(){ + Branch branch = new Branch(); + CurrentAccount account = new CurrentAccount("Main account"); + branch.addAccount(account); + branch.requestOverDraft(1000f, "Need money for rent", account); + Assertions.assertEquals(1, branch.getRequests().size()); + branch.approveRequest(branch.getRequests().getFirst()); + Assertions.assertEquals(0, branch.getRequests().size()); + Assertions.assertTrue(account.withdraw(100f)); + Assertions.assertEquals(-100f, account.getBalance()); + } +}