Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added reminders for future payments and quick report #67

Merged
merged 1 commit into from
Mar 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions src/main/java/command/AddReminderCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package command;

import financialtransactions.Reminder;
import financialtransactions.TransactionManager;

public class AddReminderCommand extends BaseCommand {
public AddReminderCommand(String[] commandParts) {
super(false, commandParts);
}

public String execute(TransactionManager manager) {
String reminderName = null;
double reminderAmount = 0.0;
String reminderDate = null;
String reminderTime = null;
String reminderCategory = null;

for (String part : commandParts) {
if (part.startsWith("n/")) {
reminderName = part.substring(2);
} else if (part.startsWith("a/")) {
reminderAmount = Double.parseDouble(part.substring(2));
} else if (part.startsWith("d/")) {
reminderDate = part.substring(2);
} else if (part.startsWith("t/")) {
reminderTime = part.substring(2);
} else if (part.startsWith("c/")) {
reminderCategory = part.substring(2);
}
}
String reminderDateTime = reminderDate + " " + reminderTime;
Reminder reminder = new Reminder(reminderName, reminderAmount, reminderDateTime);
reminder.setCategory(Reminder.Category.valueOf(reminderCategory.toUpperCase()));
manager.addTransaction(reminder);
return "Ok. Added reminder";
}
}
21 changes: 21 additions & 0 deletions src/main/java/command/DeleteReminderCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package command;

import financialtransactions.TransactionManager;

public class DeleteReminderCommand extends BaseCommand {
public DeleteReminderCommand(String[] commandParts) {
super(false, commandParts);
}

public String execute(TransactionManager manager) throws Exception {
String reminderIndex = null;
for (String part : commandParts) {
if (part.startsWith("i/")) {
reminderIndex = part.substring(2);
}
}
assert reminderIndex != null : "reminderIndex should not be null";
manager.removeReminder(Integer.parseInt(reminderIndex));
return "Ok. Reminder deleted";
}
}
42 changes: 42 additions & 0 deletions src/main/java/command/EditReminderCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package command;

import financialtransactions.Reminder;
import financialtransactions.TransactionManager;

public class EditReminderCommand extends BaseCommand {
public EditReminderCommand(String[] commandParts) {
super(false, commandParts);
}

public String execute(TransactionManager manager) throws Exception {
int reminderIndex = -1;
String reminderName = null;
double reminderAmount = 0.0;
String reminderDate = null;
String reminderTime = null;
String reminderCategory = null;

for (String part : commandParts) {
if (part.startsWith("i/")) {
reminderIndex = Integer.parseInt(part.substring(2));
} else if (part.startsWith("n/")) {
reminderName = part.substring(2);
} else if (part.startsWith("a/")) {
reminderAmount = Double.parseDouble(part.substring(2));
} else if (part.startsWith("d/")) {
reminderDate = part.substring(2);
} else if (part.startsWith("t/")) {
reminderTime = part.substring(2);
} else if (part.startsWith("c/")) {
reminderCategory = part.substring(2);
}
}

String reminderDateTime = reminderDate + " " + reminderTime;
Reminder updatedReminder = new Reminder(reminderName, reminderAmount, reminderDateTime);
assert reminderCategory != null : "reminderCategory should not be null";
updatedReminder.setCategory(Reminder.Category.valueOf(reminderCategory.toUpperCase()));
manager.editOutflow(reminderIndex, updatedReminder);
return "Ok. Edited reminder";
}
}
16 changes: 10 additions & 6 deletions src/main/java/command/HelpCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,16 @@ public String execute(TransactionManager manager) throws Exception {
baseString += "Here are the available commands: \n";
baseString += "1) add-inflow n/NAME a/AMOUNT d/DATE t/TIME c/CATEGORY\n";
baseString += "2) add-outflow n/NAME a/AMOUNT d/DATE t/TIME c/CATEGORY\n";
baseString += "3) delete-inflow i/INDEX\n";
baseString += "4) delete-outflow i/INDEX\n";
baseString += "5) edit-inflow i/INDEX n/NAME a/AMOUNT d/DATE t/TIME c/CATEGORY\n";
baseString += "6) edit-outflow i/INDEX n/NAME a/AMOUNT d/DATE t/TIME c/CATEGORY\n";
baseString += "7) view-history n/NUM \n";
baseString += "8) quit \n";
baseString += "3) add-reminder n/NAME a/AMOUNT d/DATE t/TIME c/CATEGORY\n";
baseString += "4) delete-inflow i/INDEX\n";
baseString += "5) delete-outflow i/INDEX\n";
baseString += "6) delete-reminder i/INDEX\n";
baseString += "7) edit-inflow i/INDEX n/NAME a/AMOUNT d/DATE t/TIME c/CATEGORY\n";
baseString += "8) edit-outflow i/INDEX n/NAME a/AMOUNT d/DATE t/TIME c/CATEGORY\n";
baseString += "9) delete-reminder i/INDEX n/NAME a/AMOUNT d/DATE t/TIME c/CATEGORY\n";
baseString += "10) set-budget a/AMOUNT\n";
baseString += "11) view-history n/NUM \n";
baseString += "12) quit \n";
baseString += "_____________";
return baseString;
}
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/command/SetBudgetCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package command;

import financialtransactions.TransactionManager;

public class SetBudgetCommand extends BaseCommand{
public SetBudgetCommand(String[] commandParts) {
super(false, commandParts);
}

public String execute(TransactionManager manager) throws Exception{
String budgetString = null;
for (String part : commandParts) {
if (part.startsWith("a/")) {
budgetString = part.substring(2);
}
}
double budget = Double.parseDouble(budgetString);
manager.setBudget(budget);
return "Ok. Budget set.";
}
}
5 changes: 3 additions & 2 deletions src/main/java/financeproject/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@
public class Main {
public static void main(String[] args) throws SecurityException, ExceededAttemptsException {
Storage storage = new Storage("./data");
TransactionManager manager = new TransactionManager();


UI ui = new UI();
ui.printMessage("Welcome. Enter your username and password to login.");

Expand Down Expand Up @@ -45,6 +44,8 @@ public static void main(String[] args) throws SecurityException, ExceededAttempt
} else {
return;
}
TransactionManager manager = storage.loadFile(user.getUsername());
ui.printMessage(manager.generateQuickReport());

// Main program flow
do {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/financialtransactions/Inflow.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,9 @@ public Inflow(String name, double amount, String date) {
public void setCategory(Category category) {
super.category = category;
}

@Override
public String toSave() {
return super.toSave() + "|I\n";
}
}
5 changes: 5 additions & 0 deletions src/main/java/financialtransactions/Outflow.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,9 @@ public Outflow(String name, double amount, String date) {
public void setCategory(Category category) {
this.category = category;
}

@Override
public String toSave() {
return super.toSave() + "|O\n";
}
}
20 changes: 20 additions & 0 deletions src/main/java/financialtransactions/Reminder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package financialtransactions;

public class Reminder extends Transaction<Reminder.Category> {
public enum Category {
INSTALLMENT, CREDITCARD, UTILITIES
}

public Reminder(String name, double amount, String date) {
super(name, -1.00 * amount, date);
}

public void setCategory(Category category) {
this.category = category;
}

@Override
public String toSave() {
return super.toSave() + "|R\n";
}
}
6 changes: 3 additions & 3 deletions src/main/java/financialtransactions/Transaction.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,12 @@ public T getCategory() {
public String toString() {
return String.format("Name: %s, Amount: %.2f, Date: %s", name, amount, date.toString());
}

public String toSave() {
return String.format("%s|%.2f|%s|%s\n", name, amount, date.toString(), category);
return String.format("%s|%.2f|%s|%s", name, amount, date.toString(), category);
}

protected BaseDate getDate() {
public BaseDate getDate() {
return date;
}
}
12 changes: 11 additions & 1 deletion src/main/java/financialtransactions/TransactionList.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package financialtransactions;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;

Expand Down Expand Up @@ -115,5 +116,14 @@ public void sortListByName() {
public void sortListByDate() {
this.transactionList.sort(new DateComparator<>());
}


public double totalSpentInPastMonth() {
double amount = 0;
for (T transaction : transactionList) {
if (transaction.getDate().getDateTime().getMonth() == LocalDateTime.now().getMonth()) {
amount += transaction.getAmount();
}
}
return amount;
}
}
57 changes: 55 additions & 2 deletions src/main/java/financialtransactions/TransactionManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,21 @@ public class TransactionManager {
private TransactionList<Transaction<?>> transactionList;
private TransactionList<Inflow> inflows;
private TransactionList<Outflow> outflows;
private TransactionList<Reminder> reminders;

private double budget = 0.00;

public TransactionManager() {
this.transactionList = new TransactionList<>();
this.inflows = new TransactionList<>();
this.outflows = new TransactionList<>();
this.reminders = new TransactionList<>();
}


public void setBudget(double budget) {
this.budget = budget;
}

public boolean addTransaction(Transaction<?> transaction) {
transactionList.addTransaction(transaction);
// transactionList.sortListByName();
Expand All @@ -25,6 +33,11 @@ public boolean addTransaction(Transaction<?> transaction) {
transactionList.setTransactionsType("Outflow");
return outflows.addTransaction(outflow);
}
if (transaction instanceof Reminder) {
Reminder reminder = (Reminder) transaction;
transactionList.setTransactionsType("Reminder");
return reminders.addTransaction(reminder);
}
System.out.println("Invalid transaction type.");
return false;
}
Expand All @@ -38,6 +51,9 @@ public boolean removeTransaction(int index) throws Exception{
if (transactionRemoved instanceof Outflow) {
return outflows.removeTransactionIndex(index);
}
if (transactionRemoved instanceof Reminder) {
return reminders.removeTransactionIndex(index);
}
return false;
}

Expand All @@ -55,6 +71,13 @@ public boolean removeOutflow(int index) throws Exception {
return outflows.removeTransactionIndex(numOfOutflows - index);
}

public boolean removeReminder(int index) throws Exception {
int numOfReminders = reminders.getTransactionListSize();
Transaction<?> transactionRemoved = reminders.getNthTransaction(numOfReminders - index);
transactionList.removeTransactionIndex(transactionList.getIndexOfParticularTransaction(transactionRemoved));
return reminders.removeTransactionIndex(numOfReminders - index);
}

public boolean editInflow(int index, Transaction<?> updatedTransaction) throws Exception {
int numOfInflows = inflows.getTransactionListSize();
Transaction<?> transactionEdited = inflows.getNthTransaction(numOfInflows - index);
Expand All @@ -71,6 +94,14 @@ public boolean editOutflow(int index, Transaction<?> updatedTransaction) throws
return outflows.editTransactionIndex(numOfOutflows - index, (Outflow) updatedTransaction);
}

public boolean editReminder(int index, Transaction<?> updatedTransaction) throws Exception {
int numOfReminders = reminders.getTransactionListSize();
Transaction<?> transactionEdited = reminders.getNthTransaction(numOfReminders - index);
transactionList.editTransactionIndex(transactionList.getIndexOfParticularTransaction(transactionEdited),
updatedTransaction);
return reminders.editTransactionIndex(numOfReminders - index, (Reminder) updatedTransaction);
}

public double getTotalBalance() {
double inflowBalance = inflows.getBalance();
double outflowBalance = outflows.getBalance();
Expand Down Expand Up @@ -106,10 +137,32 @@ public String showLastNTransactions(int n) throws Exception{
index++;
}
}

index = 1;
returnedText += "\nReminders:\nTransactions:\n";
for (int i = listSize - 1; i > listSize - n - 1; i--) {
Transaction<?> transaction = transactionList.getNthTransaction(i);
if (transaction instanceof Reminder) {
returnedText += String.format("%d) %s\n", index, transactionList.getNthTransaction(i).toString());
index++;
}
}

return returnedText;
}

public String toSave() {
return inflows.toSave() + outflows.toSave();
return String.format("%.2f\n", budget) + inflows.toSave() + outflows.toSave() + reminders.toSave();
}

public String generateQuickReport() {
String baseString = "";
baseString += String.format("You have spent " +
"%.2f in the current month.\n", outflows.totalSpentInPastMonth());
baseString += String.format("With a budget of " +
"%.2f, you have %.2f left to spend.\n", budget, budget - outflows.totalSpentInPastMonth());
baseString += String.format("You have " +
"%d upcoming payments that require your attention", reminders.getTransactionListSize());
return baseString;
}
}
Loading
Loading