Skip to content
Closed
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
Binary file added spending.db
Binary file not shown.
Binary file not shown.
15 changes: 13 additions & 2 deletions src/main/java/edu/ucsd/spendingtracker/App.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
package edu.ucsd.spendingtracker;

import edu.ucsd.spendingtracker.view.charts.*;

import java.util.ArrayList;
import java.util.List;

import edu.ucsd.spendingtracker.datasource.IDataSource;
import edu.ucsd.spendingtracker.datasource.InMemoryDataSource;
import edu.ucsd.spendingtracker.datasource.SqlDataSource;
import edu.ucsd.spendingtracker.model.Model;
import edu.ucsd.spendingtracker.presenter.PresenterManager;
import edu.ucsd.spendingtracker.presenter.SpendingPresenter;
Expand All @@ -14,16 +21,20 @@
public class App extends Application {
@Override
public void start(Stage primaryStage) {
InMemoryDataSource dataSource = InMemoryDataSource.getDefaultDataSource();
IDataSource dataSource = new SqlDataSource();
ExpenseRepository repository = new ExpenseRepository(dataSource);

Model sharedModel = new Model(repository);

SpendingView spendingView = new SpendingView();
SummaryView summaryView = new SummaryView();

List<IChartProvider> chartProviders = new ArrayList<>();
chartProviders.add(new BarChartProvider());
chartProviders.add(new PieChartProvider());

SpendingPresenter listPresenter = new SpendingPresenter(sharedModel, spendingView);
SummaryPresenter summaryPresenter = new SummaryPresenter(sharedModel, summaryView);
SummaryPresenter summaryPresenter = new SummaryPresenter(sharedModel, summaryView, chartProviders);

PresenterManager manager = new PresenterManager();
manager.defineInteractions(primaryStage, "Spending Tracker", listPresenter, summaryPresenter);
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/edu/ucsd/spendingtracker/datasource/IDataSource.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package edu.ucsd.spendingtracker.datasource;
import java.util.List;
import edu.ucsd.spendingtracker.model.Expense;

public interface IDataSource {
List<Expense> getExpenses();

void addExpense(Expense expense);

void deleteExpense(int id);

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,22 @@
import edu.ucsd.spendingtracker.model.Category;
import edu.ucsd.spendingtracker.model.Expense;

public class InMemoryDataSource {
public class InMemoryDataSource implements IDataSource {
private List<Expense> expenses = new ArrayList<>();

public InMemoryDataSource() {
}

@Override
public List<Expense> getExpenses() {
return List.copyOf(expenses);
}

@Override
public void addExpense(Expense expense) {
expenses.add(expense);
}

public final static List<Expense> DEFAULT_EXPENSES = List.of(
new Expense("Groceries", Category.FOOD, 150.75),
new Expense("Utilities", Category.UTILITIES, 80.50),
new Expense("Gas", Category.TRANSPORT, 60.00));

public static InMemoryDataSource getDefaultDataSource() {
InMemoryDataSource dataSource = new InMemoryDataSource();
dataSource.expenses.addAll(DEFAULT_EXPENSES);
return dataSource;
@Override
public void deleteExpense(int expenseId){
expenses.removeIf(expense -> expense.getId() == expenseId);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package edu.ucsd.spendingtracker.datasource;


import edu.ucsd.spendingtracker.model.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;


public class SqlDataSource implements IDataSource {
private final String url = "jdbc:sqlite:spending.db";


public SqlDataSource() {
try (Connection conn = DriverManager.getConnection(url)) {
conn.createStatement().execute(
"CREATE TABLE IF NOT EXISTS expenses (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, category TEXT, amount REAL)");
} catch (SQLException e) {
e.printStackTrace();
}
}


@Override
public List<Expense> getExpenses() {
List<Expense> list = new ArrayList<>();
try (Connection conn = DriverManager.getConnection(url);
ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM expenses")) {
while (rs.next()) {
list.add(new Expense(rs.getInt("id"), rs.getString("name"),
Category.valueOf(rs.getString("category")), rs.getDouble("amount")));
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}


@Override
public void addExpense(Expense e) {
try (Connection conn = DriverManager.getConnection(url);
PreparedStatement ps = conn.prepareStatement("INSERT INTO expenses(name, category, amount) VALUES(?,?,?)")) {
ps.setString(1, e.getName());
ps.setString(2, e.getCategory().name());
ps.setDouble(3, e.getAmount());
ps.executeUpdate();
} catch (SQLException err) {
err.printStackTrace();
}
}


@Override
public void deleteExpense(int id) {
try (Connection conn = DriverManager.getConnection(url);
PreparedStatement ps = conn.prepareStatement("DELETE FROM expenses WHERE id = ?")) {
ps.setInt(1, id);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}


14 changes: 13 additions & 1 deletion src/main/java/edu/ucsd/spendingtracker/model/Expense.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,16 @@ public class Expense {
private String name;
private Category category;
private double amount;
private int id;

public Expense(String name, Category category, double amount) {
public Expense(int id, String name, Category category, double amount) {
this.name = name;
this.category = category;
this.amount = amount;
this.id = id;
}

public Expense( String name, Category category, double amount) {
this.name = name;
this.category = category;
this.amount = amount;
Expand All @@ -22,6 +30,10 @@ public Category getCategory() {
public double getAmount() {
return amount;
}

public int getId(){
return id;
}
}


4 changes: 4 additions & 0 deletions src/main/java/edu/ucsd/spendingtracker/model/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,8 @@ public List<Expense> getExpenses() {
public double getTotalSpending() {
return repository.getTotal();
}

public void deleteExpense(int id){
repository.deleteExpense(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,18 @@ public SpendingPresenter(Model model, SpendingView view) {
onShowSummary.run();
});

this.view.setOnDelete(id -> {
model.deleteExpense(id);
updateView();
});

this.view.getOpenModalButton().setOnAction(e -> {
view.showAddExpenseModal(newExpense -> {
model.addExpense(newExpense);
updateView();
});
});

updateView();
}

Expand All @@ -27,9 +39,9 @@ public String getViewTitle() {
}

public void updateView() {
int i = 1;
view.clearList();
for (Expense e : model.getExpenses()) {
view.addExpenseRow(i++, e.getName(), e.getCategory().name(),
view.addExpenseRow(e.getId(), e.getName(), e.getCategory().name(),
e.getCategory().color, e.getAmount());
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,34 @@
package edu.ucsd.spendingtracker.presenter;

import edu.ucsd.spendingtracker.model.Model;

import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import edu.ucsd.spendingtracker.model.*;
import edu.ucsd.spendingtracker.view.SummaryView;
import edu.ucsd.spendingtracker.view.charts.IChartProvider;
import javafx.scene.Node;

public class SummaryPresenter extends AbstractPresenter<SummaryView> {
private Runnable onBack;
private final List<IChartProvider> chartProviders;

public SummaryPresenter(Model model, SummaryView view) {
public SummaryPresenter(Model model, SummaryView view, List<IChartProvider> chartProviders) {
super(model, view);
this.chartProviders = chartProviders;
this.view.getChartSelector().getItems().addAll(this.chartProviders);

if (!this.chartProviders.isEmpty()) {
this.view.getChartSelector().setValue(this.chartProviders.get(0));
}

this.view.getBackButton().setOnAction(e -> {
if (onBack != null)
onBack.run();
});

this.view.getChartSelector().setOnAction(e -> updateView());
}

public void setOnBack(Runnable action) {
Expand All @@ -21,7 +37,28 @@ public void setOnBack(Runnable action) {

@Override
public void updateView() {
List<Expense> expenses = model.getExpenses();
Map<Category, Double> totals = new TreeMap<>();

for (Category cat : Category.values()){
totals.put(cat, 0.0);
}

for (Expense expense : expenses) {
Category category = expense.getCategory();
double amount = expense.getAmount();

totals.put(category, totals.get(category) + amount);
}

view.setTotal(model.getTotalSpending());

IChartProvider selectedProvider = view.getChartSelector().getValue();

if (selectedProvider != null) {
Node chartNode = selectedProvider.createChart(totals);
view.setChartDisplay(chartNode);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package edu.ucsd.spendingtracker.repository;

import java.util.List;

import edu.ucsd.spendingtracker.datasource.IDataSource;
import edu.ucsd.spendingtracker.datasource.InMemoryDataSource;
import edu.ucsd.spendingtracker.model.Expense;

public class ExpenseRepository {
private final InMemoryDataSource dataSource;
private IDataSource dataSource;

public ExpenseRepository(InMemoryDataSource dataSource) {
public ExpenseRepository(IDataSource dataSource) {
this.dataSource = dataSource;
}

Expand All @@ -26,5 +28,9 @@ public double getTotal() {
}
return total;
}

public void deleteExpense(int id){
dataSource.deleteExpense(id);
}
}

Loading