diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/me/zacharias/bank/Account.java b/src/main/java/me/zacharias/bank/Account.java
new file mode 100644
index 0000000..b73f6c8
--- /dev/null
+++ b/src/main/java/me/zacharias/bank/Account.java
@@ -0,0 +1,93 @@
+package me.zacharias.bank;
+
+import me.zacharias.bank.transaction.Transaction;
+import me.zacharias.bank.transaction.TransactionType;
+
+import java.util.ArrayList;
+import java.util.UUID;
+
+public abstract class Account {
+ ArrayList transactions;
+ String name;
+ double balance;
+ UUID id;
+
+ public Account(String name, int balance) {
+ this.name = name;
+ this.balance = balance;
+ transactions = new ArrayList<>();
+ id = UUID.randomUUID();
+ }
+
+ public void WithdrawTransaction(double amount, String description, UUID destination) {
+ if(amount < 0) {
+ throw new IllegalArgumentException("Amount cannot be negative");
+ }
+ if(balance < amount) {
+ throw new IllegalArgumentException("Insufficient balance");
+ }
+ Transaction transaction = new Transaction(amount, description, destination, this.id, TransactionType.WITHDRAW);
+ transactions.add(transaction);
+ balance -= amount;
+ }
+
+ public void DepositTransaction(double amount, String description, UUID originator) {
+ if(amount < 0) {
+ throw new IllegalArgumentException("Amount cannot be negative");
+ }
+ Transaction transaction = new Transaction(amount, description, this.id, originator, TransactionType.DEPOSIT);
+ transactions.add(transaction);
+ balance += amount;
+ }
+
+ public void TransferTransaction(double amount, String description, UUID originator, UUID destination) {
+ if(amount < 0 && balance < Math.abs(amount)) {
+ throw new IllegalArgumentException("Insufficient balance");
+ }
+ Transaction transaction = new Transaction(amount, description, originator, destination, TransactionType.TRANSFER);
+ transactions.add(transaction);
+ balance += amount;
+ }
+
+ public void handleTransaction(Transaction transaction) {
+ if(transaction.getType() == TransactionType.WITHDRAW) {
+ if(transaction.getAmount() < 0) {
+ throw new IllegalArgumentException("Amount cannot be negative");
+ }
+ if(balance < transaction.getAmount()) {
+ throw new IllegalArgumentException("Insufficient balance");
+ }
+ balance -= transaction.getAmount();
+ } else if(transaction.getType() == TransactionType.DEPOSIT) {
+ if(transaction.getAmount() < 0) {
+ throw new IllegalArgumentException("Amount cannot be negative");
+ }
+ balance += transaction.getAmount();
+ } else if(transaction.getType() == TransactionType.TRANSFER) {
+ balance += transaction.getAmount();
+ }
+ transactions.add(transaction);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public double getBalance() {
+ return balance;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public ArrayList getTransactions() {
+ return transactions;
+ }
+
+ abstract double getInterestRate();
+
+ public double getInterest() {
+ return balance * (1+getInterestRate());
+ }
+}
diff --git a/src/main/java/me/zacharias/bank/BankAccount.java b/src/main/java/me/zacharias/bank/BankAccount.java
new file mode 100644
index 0000000..3f4daef
--- /dev/null
+++ b/src/main/java/me/zacharias/bank/BankAccount.java
@@ -0,0 +1,12 @@
+package me.zacharias.bank;
+
+public class BankAccount extends Account {
+ public BankAccount(String name, int balance) {
+ super(name, balance);
+ }
+
+ @Override
+ double getInterestRate() {
+ return 0.001;
+ }
+}
diff --git a/src/main/java/me/zacharias/bank/Main.java b/src/main/java/me/zacharias/bank/Main.java
new file mode 100644
index 0000000..05f025f
--- /dev/null
+++ b/src/main/java/me/zacharias/bank/Main.java
@@ -0,0 +1,5 @@
+package me.zacharias.bank;
+
+public class Main {
+
+}
diff --git a/src/main/java/me/zacharias/bank/SavingsAccount.java b/src/main/java/me/zacharias/bank/SavingsAccount.java
new file mode 100644
index 0000000..6572a55
--- /dev/null
+++ b/src/main/java/me/zacharias/bank/SavingsAccount.java
@@ -0,0 +1,13 @@
+package me.zacharias.bank;
+
+public class SavingsAccount extends Account{
+
+ public SavingsAccount(String name, int balance) {
+ super(name, balance);
+ }
+
+ @Override
+ double getInterestRate() {
+ return 0.05;
+ }
+}
diff --git a/src/main/java/me/zacharias/bank/User.java b/src/main/java/me/zacharias/bank/User.java
new file mode 100644
index 0000000..945aeb2
--- /dev/null
+++ b/src/main/java/me/zacharias/bank/User.java
@@ -0,0 +1,42 @@
+package me.zacharias.bank;
+
+import java.util.ArrayList;
+import java.util.UUID;
+
+public class User {
+ UUID id;
+ String name;
+ String password;
+ ArrayList accounts;
+
+ public User(String name, String password) {
+ this.name = name;
+ this.password = password;
+ id = UUID.randomUUID();
+ accounts = new ArrayList<>();
+ }
+
+ public void createAccount(String name, int balance) {
+ Account account = new BankAccount(name, balance);
+ accounts.add(account);
+ }
+
+ public void createSavingsAccount(String name, int balance) {
+ Account account = new SavingsAccount(name, balance);
+ accounts.add(account);
+ }
+
+ public void deleteAccount(Account account) {
+ Account base = null;
+ for(Account a : accounts) {
+ if(a instanceof BankAccount) {
+ base = a;
+ }
+ }
+ if(base == null) {
+ throw new IllegalArgumentException("No bank accounts found");
+ }
+ base.TransferTransaction(account.getBalance(), "Account closed", account.getId(), base.getId());
+ accounts.remove(account);
+ }
+}
diff --git a/src/main/java/me/zacharias/bank/transaction/Transaction.java b/src/main/java/me/zacharias/bank/transaction/Transaction.java
new file mode 100644
index 0000000..6bcdcd8
--- /dev/null
+++ b/src/main/java/me/zacharias/bank/transaction/Transaction.java
@@ -0,0 +1,39 @@
+package me.zacharias.bank.transaction;
+
+import java.util.UUID;
+
+public class Transaction {
+ double amount;
+ String description;
+ UUID originator;
+ UUID destination;
+ TransactionType type;
+
+ public Transaction(double amount, String description, UUID destination, UUID originator, TransactionType type) {
+ this.amount = amount;
+ this.description = description;
+ this.originator = originator;
+ this.destination = destination;
+ this.type = type;
+ }
+
+ public double getAmount() {
+ return amount;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public UUID getOriginator() {
+ return originator;
+ }
+
+ public UUID getDestination() {
+ return destination;
+ }
+
+ public TransactionType getType() {
+ return type;
+ }
+}
diff --git a/src/main/java/me/zacharias/bank/transaction/TransactionType.java b/src/main/java/me/zacharias/bank/transaction/TransactionType.java
new file mode 100644
index 0000000..720a58f
--- /dev/null
+++ b/src/main/java/me/zacharias/bank/transaction/TransactionType.java
@@ -0,0 +1,5 @@
+package me.zacharias.bank.transaction;
+
+public enum TransactionType {
+ WITHDRAW, DEPOSIT, TRANSFER
+}