diff --git a/screenshots/Dashboard.png b/screenshots/Dashboard.png index 8d734a7..5c12217 100644 Binary files a/screenshots/Dashboard.png and b/screenshots/Dashboard.png differ diff --git a/src/main/java/com/example/FinanceTracker/Components/PdfManager.java b/src/main/java/com/example/FinanceTracker/Components/PdfManager.java index 0fac2c4..2502298 100644 --- a/src/main/java/com/example/FinanceTracker/Components/PdfManager.java +++ b/src/main/java/com/example/FinanceTracker/Components/PdfManager.java @@ -135,7 +135,8 @@ public class PdfManager { if (matchedCategory != null) { String label = matchedCategory.replace(" ", ""); - transaction.setCategory(matchedCategory); + int categoryId = categoriesRepo.findCategoryIdByCategoryName(matchedCategory); + transaction.setCategory(Integer.toString(categoryId)); int endIndex = rightmostIndex + label.length(); line = line.substring(0, rightmostIndex) + line.substring(endIndex); diff --git a/src/main/java/com/example/FinanceTracker/Controllers/HomeController.java b/src/main/java/com/example/FinanceTracker/Controllers/HomeController.java index a1c4e53..8753c77 100644 --- a/src/main/java/com/example/FinanceTracker/Controllers/HomeController.java +++ b/src/main/java/com/example/FinanceTracker/Controllers/HomeController.java @@ -16,8 +16,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import com.example.FinanceTracker.Components.BootstrapColours; -// import com.example.FinanceTracker.Components.ColourComponent; -//import com.example.FinanceTracker.Components.PdfManager; +import com.example.FinanceTracker.Components.PdfManager; import com.example.FinanceTracker.DTOs.GroupedTransaction; import com.example.FinanceTracker.DTOs.Home.OverviewCard; import com.example.FinanceTracker.Models.Transaction; @@ -27,8 +26,8 @@ import com.example.FinanceTracker.Services.TransactionService; @Controller public class HomeController { - // @Autowired - // private PdfManager pdfManager; + @Autowired + private PdfManager pdfManager; @Autowired private TransactionService transactionsService; @@ -42,7 +41,7 @@ public class HomeController { @GetMapping("/") public String Home(Model model) { - // transactionsService.saveAll(pdfManager.extractTransactions()); + //transactionsService.saveAll(pdfManager.extractTransactions()); // Balance Text model.addAttribute("latestBalance", diff --git a/src/main/java/com/example/FinanceTracker/Controllers/InvestmentsController.java b/src/main/java/com/example/FinanceTracker/Controllers/InvestmentsController.java index 99d809c..446e3a0 100644 --- a/src/main/java/com/example/FinanceTracker/Controllers/InvestmentsController.java +++ b/src/main/java/com/example/FinanceTracker/Controllers/InvestmentsController.java @@ -1,33 +1,52 @@ package com.example.FinanceTracker.Controllers; +import java.math.BigDecimal; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.ParameterizedTypeReference; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.client.RestClient; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; + import com.example.FinanceTracker.DTOs.Investments.CurrRate; import com.example.FinanceTracker.DTOs.Investments.Currency; import com.example.FinanceTracker.DTOs.Investments.ExchangeRate; +import com.example.FinanceTracker.Services.InvestmentService; @Controller public class InvestmentsController { @Autowired - private RestClient restClient; + private InvestmentService investmentService; @GetMapping("/investments") public String investments(Model model) { + // Create Currency Pills + List allRates = investmentService.getCurrRates(); + model.addAttribute("currRates", allRates); + // Populate Historical Rates Dropdown - List allCurrencies = getAllCurrencies(); + List allCurrencies = investmentService.getAllCurrencies(); model.addAttribute("allCurrencies", allCurrencies); - // Create Currency Pills - List allRates = getCurrRates(); - model.addAttribute("currRates", allRates); + // historical rates chart + List historicalExchangeRates = investmentService.getHistoricalRates("USD", 1).reversed(); + + // Get all the rates from the historical Exchange Rates + ArrayList historicalRates = new ArrayList<>(); + ArrayList historicalRatesLabels = new ArrayList<>(); + for (ExchangeRate exchangeRate : historicalExchangeRates) { + historicalRates.add(exchangeRate.getRate()); + historicalRatesLabels.add(exchangeRate.getCreatedAt().toLocalDate()); + } + + model.addAttribute("historicalRates", historicalRates); + model.addAttribute("labels", historicalRatesLabels); // footer model.addAttribute("footerDetails", "Copyright © FinanceTracker " + LocalDate.now().getYear()); @@ -35,53 +54,50 @@ public class InvestmentsController { return "investments"; } - private List getCurrRates() { - return List.of("EUR", "USD", "JPY", "GBP", "CAD", "AUD").stream() - .map(code -> { - Double rate = restClient.get() - .uri(uriBuilder -> uriBuilder - .path("/exchangeRate/pair") - .queryParam("from", code) - .queryParam("to", "ZAR") - .build()) - .retrieve() - .body(Double.class); + @GetMapping("/historicalRatesWeekly") + public String showHistoricalRatesWeek(Model model, + @RequestParam("historicalRatesWeekly") boolean historicalRatesWeekly){ - return new CurrRate(code, rate.toString(), getChange(code)); - }) - .toList(); - } + // historical rates chart + List historicalExchangeRates = investmentService.getHistoricalRates("USD", 3).reversed(); - private String getChange(String targetCurr) { - - final String effectiveTargetCurr = targetCurr.toUpperCase().contains("USD") ? "ZAR" : targetCurr; - - List exchangeRate = restClient.get() - .uri(uriBuilder -> uriBuilder - .path("exchangeRate/Historical") - .queryParam("targetCurrency", effectiveTargetCurr) - .queryParam("fromDate", LocalDate.now().minusDays(1)) - .queryParam("toDate", LocalDate.now().plusDays(1)) - .build()) - .retrieve() - .body(new ParameterizedTypeReference>() { - }); - - if (exchangeRate.get(0).getRate().compareTo(exchangeRate.get(1).getRate()) > 0) { - return "UP"; - } else { - return "DOWN"; + // Get all the rates from the historical Exchange Rates + ArrayList historicalRates = new ArrayList<>(); + ArrayList historicalRatesLabels = new ArrayList<>(); + for (ExchangeRate exchangeRate : historicalExchangeRates) { + historicalRates.add(exchangeRate.getRate()); + historicalRatesLabels.add(exchangeRate.getCreatedAt().toLocalDate()); } + model.addAttribute("historicalRates", historicalRates); + model.addAttribute("labels", historicalRatesLabels); + + return "investments :: HistoricalRatesChart"; } - private List getAllCurrencies() { - return restClient.get() - .uri("/currency/currencies") - .retrieve() - .body(new ParameterizedTypeReference>() { - }); + @GetMapping("/changeHistoricalCurr") + public String changeHistoricalCurr(Model model, + @RequestParam("currencyChange") String currencyChange){ + + // historical rates chart + List historicalExchangeRates = investmentService.getHistoricalRates(currencyChange, 3).reversed(); + + // Get all the rates from the historical Exchange Rates + ArrayList historicalRates = new ArrayList<>(); + ArrayList historicalRatesLabels = new ArrayList<>(); + for (ExchangeRate exchangeRate : historicalExchangeRates) { + historicalRates.add(exchangeRate.getRate()); + historicalRatesLabels.add(exchangeRate.getCreatedAt().toLocalDate()); + } + + model.addAttribute("historicalRates", historicalRates); + model.addAttribute("labels", historicalRatesLabels); + + return "investments :: HistoricalRatesChart"; } + + + } diff --git a/src/main/java/com/example/FinanceTracker/Models/Transaction.java b/src/main/java/com/example/FinanceTracker/Models/Transaction.java index 8470297..a7a382d 100644 --- a/src/main/java/com/example/FinanceTracker/Models/Transaction.java +++ b/src/main/java/com/example/FinanceTracker/Models/Transaction.java @@ -32,7 +32,7 @@ public class Transaction { private String description; @Column - private String category; + private int category; @Column private BigDecimal moneyIn; diff --git a/src/main/java/com/example/FinanceTracker/Repo/CategoriesRepo.java b/src/main/java/com/example/FinanceTracker/Repo/CategoriesRepo.java index e60fbb5..b0dedb7 100644 --- a/src/main/java/com/example/FinanceTracker/Repo/CategoriesRepo.java +++ b/src/main/java/com/example/FinanceTracker/Repo/CategoriesRepo.java @@ -4,6 +4,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.example.FinanceTracker.Models.Categories; @@ -15,4 +16,7 @@ public interface CategoriesRepo extends JpaRepository{ @Query(value = "SELECT category_name FROM categories", nativeQuery=true) List findAllCategoryNames(); + @Query(value = "SELECT id FROM categories WHERE category_name = :category_name", nativeQuery = true) + int findCategoryIdByCategoryName(@Param("category_name") String category_name); + } diff --git a/src/main/java/com/example/FinanceTracker/Repo/TransactionRepo.java b/src/main/java/com/example/FinanceTracker/Repo/TransactionRepo.java index b3dfb3e..fbd4973 100644 --- a/src/main/java/com/example/FinanceTracker/Repo/TransactionRepo.java +++ b/src/main/java/com/example/FinanceTracker/Repo/TransactionRepo.java @@ -18,162 +18,172 @@ import com.example.FinanceTracker.Models.Transaction; @Repository public interface TransactionRepo extends JpaRepository { - @Query(value = """ - SELECT * - FROM transactions - WHERE date BETWEEN :fromDate AND :toDate - ORDER BY date - """, nativeQuery = true) - Page getTransactionsBetween(Pageable pageable, @Param("fromDate") LocalDate fromDate, - @Param("toDate") LocalDate toDate); + @Query(value = """ + SELECT * + FROM transactions + WHERE date BETWEEN :fromDate AND :toDate + ORDER BY date + """, nativeQuery = true) + Page getTransactionsBetween(Pageable pageable, @Param("fromDate") LocalDate fromDate, + @Param("toDate") LocalDate toDate); - @Query(value = "SELECT * FROM transactions ORDER BY date DESC", nativeQuery = true) - Page findAllPaged(Pageable pageable); + @Query(value = """ + SELECT t.balance, t.date, t.money_in, t.money_out, + t.description, c.category_name as category, t.fee, + t.id + FROM transactions t + JOIN categories c ON t.category = c.id + ORDER BY date DESC + """, nativeQuery = true) + Page findAllPaged(Pageable pageable); - @Query(value = """ - SELECT * FROM transactions - WHERE CONCAT_WS('', date, description, category, money_in, money_out, fee, balance) - LIKE Concat('%', :searchValue, '%') - ORDER BY date - """, nativeQuery = true) - Page searchTransactions(Pageable pageable, @Param("searchValue") String SearchValue); + @Query(value = """ + SELECT + t.balance, t.date, t.money_in, t.money_out, t.description, c.category_name as category, t.fee, t.id + FROM transactions t + JOIN categories c ON t.category = c.id + WHERE CONCAT_WS('', t.balance, t.date, t.money_in, t.money_out, t.description, c.category_name, t.fee) + LIKE Concat('%', :searchValue, '%') + ORDER BY date + """, nativeQuery = true) + Page searchTransactions(Pageable pageable, @Param("searchValue") String SearchValue); - @Query(value = """ - SELECT (balance - 30) as balance - FROM transactions ORDER BY date DESC LIMIT 1 - """, nativeQuery = true) - double getLatestBalance(); + @Query(value = """ + SELECT (balance - 30) as balance + FROM transactions ORDER BY date DESC LIMIT 1 + """, nativeQuery = true) + double getLatestBalance(); - // ============================================================= - // MONEY IN QUERIES - // ============================================================= + // ============================================================= + // MONEY IN QUERIES + // ============================================================= - @Query(value = """ - SELECT SUM(money_in) - FROM transactions - ORDER BY date - """, nativeQuery = true) - double getTotalMoneyIn(); + @Query(value = """ + SELECT SUM(money_in) + FROM transactions + ORDER BY date + """, nativeQuery = true) + double getTotalMoneyIn(); - @Query(value = """ - SELECT SUM(money_in) - FROM transactions - WHERE YEAR(date) = :year - ORDER BY date - """, nativeQuery = true) - double getTotalMoneyInByYear(@Param("year") int year); + @Query(value = """ + SELECT SUM(money_in) + FROM transactions + WHERE YEAR(date) = :year + ORDER BY date + """, nativeQuery = true) + double getTotalMoneyInByYear(@Param("year") int year); - @Query(value = """ - SELECT SUM(money_in) / (SELECT COUNT(DISTINCT MONTH(date)) FROM transactions WHERE YEAR(date) = :year) - FROM transactions - WHERE YEAR(date) = :year - """, nativeQuery = true) - double getAverageMonthlyMoneyIn(int year); + @Query(value = """ + SELECT SUM(money_in) / (SELECT COUNT(DISTINCT MONTH(date)) FROM transactions WHERE YEAR(date) = :year) + FROM transactions + WHERE YEAR(date) = :year + """, nativeQuery = true) + double getAverageMonthlyMoneyIn(int year); - @Query(value = """ - SELECT category, SUM(money_in) - FROM transactions - WHERE money_in != 0 - GROUP BY category - """, nativeQuery = true) - List getIncomeGroupedTransactions(); + @Query(value = """ + SELECT c.category_name, SUM(money_in) + FROM transactions t JOIN categories c ON t.category = c.id + WHERE money_in != 0 + GROUP BY category + """, nativeQuery = true) + List getIncomeGroupedTransactions(); - // ============================================================= - // MONEY OUT QUERIES - // ============================================================= - @Query(value = """ - SELECT SUM(money_out) - FROM transactions - ORDER BY date - """, nativeQuery = true) - double getTotalMoneyOut(); + // ============================================================= + // MONEY OUT QUERIES + // ============================================================= + @Query(value = """ + SELECT SUM(money_out) + FROM transactions + ORDER BY date + """, nativeQuery = true) + double getTotalMoneyOut(); - @Query(value = """ - SELECT SUM(money_out) / (SELECT COUNT(DISTINCT MONTH(date)) FROM transactions WHERE YEAR(date) = :year) - FROM transactions - WHERE YEAR(date) = :year - """, nativeQuery = true) - double getAverageMonthlyMoneyOut(int year); + @Query(value = """ + SELECT SUM(money_out) / (SELECT COUNT(DISTINCT MONTH(date)) FROM transactions WHERE YEAR(date) = :year) + FROM transactions + WHERE YEAR(date) = :year + """, nativeQuery = true) + double getAverageMonthlyMoneyOut(int year); - @Query(value = """ - SELECT category, SUM(money_out) - FROM transactions - WHERE money_out != 0 - GROUP BY category - """, nativeQuery = true) - List getExpenditureGroupedTransactions(); + @Query(value = """ + SELECT c.category_name, SUM(money_out) + FROM transactions t JOIN categories c ON t.category = c.id + WHERE money_out != 0 + GROUP BY category + """, nativeQuery = true) + List getExpenditureGroupedTransactions(); - // ============================================================= - // FEE QUERIES - // ============================================================= - @Query(value = """ - SELECT SUM(fee) - FROM transactions - ORDER BY date - """, nativeQuery = true) - double getTotalFees(); + // ============================================================= + // FEE QUERIES + // ============================================================= + @Query(value = """ + SELECT SUM(fee) + FROM transactions + ORDER BY date + """, nativeQuery = true) + double getTotalFees(); - @Query(value = """ - SELECT SUM(fee) - FROM transactions - WHERE YEAR(date) = :year - ORDER BY date - """, nativeQuery = true) - double getTotalFeesByYear(@Param("year") int year); + @Query(value = """ + SELECT SUM(fee) + FROM transactions + WHERE YEAR(date) = :year + ORDER BY date + """, nativeQuery = true) + double getTotalFeesByYear(@Param("year") int year); - // ============================================================= - // INTEREST QUERIES - // ============================================================= - @Query(value = """ - SELECT SUM(money_in) - FROM transactions - WHERE category = 'Interest' - """, nativeQuery = true) - double getTotalInterest(); + // ============================================================= + // INTEREST QUERIES + // ============================================================= + @Query(value = """ + SELECT SUM(money_in) + FROM transactions + WHERE category = 'Interest' + """, nativeQuery = true) + double getTotalInterest(); - @Query(value = """ - SELECT SUM(money_in) / (SELECT COUNT(DISTINCT MONTH(date)) FROM transactions WHERE YEAR(date) = :year) - FROM transactions - WHERE YEAR(date) = :year AND category = 'Interest' - """, nativeQuery = true) - double averageMonthlyInterest(@Param("year") int year); + @Query(value = """ + SELECT SUM(money_in) / (SELECT COUNT(DISTINCT MONTH(date)) FROM transactions WHERE YEAR(date) = :year) + FROM transactions + WHERE YEAR(date) = :year AND category = 'Interest' + """, nativeQuery = true) + double averageMonthlyInterest(@Param("year") int year); - // ============================================================= - // OTHER QUERIES - // ============================================================= - @Query(value = """ - SELECT - CONCAT('Q', QUARTER(date)) AS Quarters, - SUM(money_in) AS \"Total MoneyIn\", - SUM(money_out) AS \"Total MoneyOut\", - SUM(fee) AS \"Total Fees\" - FROM transactions - WHERE YEAR(date) = :year - GROUP BY QUARTER(date) - ORDER BY date - """, nativeQuery = true) - List getQuarterlyTotals(@Param("year") int year); + // ============================================================= + // OTHER QUERIES + // ============================================================= + @Query(value = """ + SELECT + CONCAT('Q', QUARTER(date)) AS Quarters, + SUM(money_in) AS \"Total MoneyIn\", + SUM(money_out) AS \"Total MoneyOut\", + SUM(fee) AS \"Total Fees\" + FROM transactions + WHERE YEAR(date) = :year + GROUP BY QUARTER(date) + ORDER BY date + """, nativeQuery = true) + List getQuarterlyTotals(@Param("year") int year); - @Query(value = """ - SELECT - (SELECT SUM(money_in) FROM transactions WHERE category != 'Interest' AND money_in != 0) AS money_in, - (SELECT SUM(money_out) * -1 FROM transactions WHERE category != 'Fees' AND money_out != 0) AS money_out, - (SELECT SUM(money_in) FROM transactions WHERE category = 'Interest') AS Interest, - (SELECT SUM(fee) * -1 FROM transactions) AS fees - FROM transactions LIMIT 1 - """, nativeQuery = true) - List getTotals(); + @Query(value = """ + SELECT + (SELECT SUM(money_in) FROM transactions WHERE category != 'Interest' AND money_in != 0) AS money_in, + (SELECT SUM(money_out) * -1 FROM transactions WHERE category != 'Fees' AND money_out != 0) AS money_out, + (SELECT SUM(money_in) FROM transactions WHERE category = 'Interest') AS Interest, + (SELECT SUM(fee) * -1 FROM transactions) AS fees + FROM transactions LIMIT 1 + """, nativeQuery = true) + List getTotals(); - @Query(value = """ - SELECT (SUM(money_in) + SUM(money_out)) AS "Net Cashflow" - FROM transactions - """, nativeQuery = true) - double getNetCashflow(); + @Query(value = """ + SELECT (SUM(money_in) + SUM(money_out)) AS "Net Cashflow" + FROM transactions + """, nativeQuery = true) + double getNetCashflow(); - @Query(value = """ - SELECT (SUM(money_in) + SUM(money_out)) / NULLIF(SUM(money_in), 0) AS "Savings Rate" - FROM transactions; - """, nativeQuery = true) - double getSavingRate(); + @Query(value = """ + SELECT (SUM(money_in) + SUM(money_out)) / NULLIF(SUM(money_in), 0) AS "Savings Rate" + FROM transactions; + """, nativeQuery = true) + double getSavingRate(); } diff --git a/src/main/java/com/example/FinanceTracker/Services/InvestmentService.java b/src/main/java/com/example/FinanceTracker/Services/InvestmentService.java new file mode 100644 index 0000000..0616b38 --- /dev/null +++ b/src/main/java/com/example/FinanceTracker/Services/InvestmentService.java @@ -0,0 +1,112 @@ +package com.example.FinanceTracker.Services; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClient; + +import com.example.FinanceTracker.DTOs.Investments.CurrRate; +import com.example.FinanceTracker.DTOs.Investments.Currency; +import com.example.FinanceTracker.DTOs.Investments.ExchangeRate; + +@Service +public class InvestmentService { + + @Autowired + private RestClient restClient; + + private final int WEEK = 1; + private final int MONTH = 2; + private final int YEAR = 3; + + public List getCurrRates() { + return List.of("EUR", "USD", "JPY", "GBP", "CAD", "AUD").stream() + .map(code -> { + Double rate = restClient.get() + .uri(uriBuilder -> uriBuilder + .path("/exchangeRate/pair") + .queryParam("from", code) + .queryParam("to", "ZAR") + .build()) + .retrieve() + .body(Double.class); + + return new CurrRate(code, rate.toString(), getChange(code, "ZAR")); + }) + .toList(); + } + + private String getChange(String targetCurr, String desiredCurrency) { + + final String effectiveTargetCurr = targetCurr.toUpperCase().contains("USD") ? "ZAR" : targetCurr; + + List exchangeRate = restClient.get() + .uri(uriBuilder -> uriBuilder + .path("exchangeRate/historical") + .queryParam("targetCurrency", effectiveTargetCurr) + .queryParam("desiredCurrency", desiredCurrency) + .queryParam("fromDate", LocalDate.now().minusDays(1)) + .queryParam("toDate", LocalDate.now().plusDays(1)) + .build()) + .retrieve() + .body(new ParameterizedTypeReference>() { + }); + + if (exchangeRate.get(0).getRate().compareTo(exchangeRate.get(1).getRate()) > 0) { + return "UP"; + } else { + return "DOWN"; + } + + } + + public List getHistoricalRates(String targetCurr, int duration) { + + LocalDate toDate = LocalDate.now().plusDays(1); + LocalDate fromDate; + + switch (duration) { + case WEEK: + fromDate = LocalDate.now().minusWeeks(1); + break; + case MONTH: + fromDate = LocalDate.now().minusMonths(1); + break; + case YEAR: + fromDate = LocalDate.now().minusYears(1); + break; + default: + fromDate = LocalDate.now().minusWeeks(1); + } + + List historicalRates = restClient.get() + .uri(uriBuilder -> uriBuilder + .path("exchangeRate/historical") + .queryParam("targetCurrency", targetCurr) + .queryParam("desiredCurrency", "ZAR") + .queryParam("fromDate", fromDate.toString()) + .queryParam("toDate", toDate.toString()) + .build()) + .retrieve() + .body(new ParameterizedTypeReference>() { + }); + + + + return historicalRates; + } + + public List getAllCurrencies() { + + return restClient.get() + .uri("/currency/currencies") + .retrieve() + .body(new ParameterizedTypeReference>() { + }); + } + +} diff --git a/src/main/resources/templates/fragments/home/overviewCard.html b/src/main/resources/templates/fragments/home/overviewCard.html index 7873f2e..4f29a0a 100644 --- a/src/main/resources/templates/fragments/home/overviewCard.html +++ b/src/main/resources/templates/fragments/home/overviewCard.html @@ -1,39 +1,32 @@
-
-
- -
-
- - Average Earnings (Monthly) - -
+
-
- $40,000 -
+ - -
- Compared to last month -
+
+ $40,000
- -
- +
+ Average Earnings
+ +
+ Compared to last month +
+
diff --git a/src/main/resources/templates/fragments/investments/curr-badges.html b/src/main/resources/templates/fragments/investments/curr-badges.html index a5aad9f..177a1ca 100644 --- a/src/main/resources/templates/fragments/investments/curr-badges.html +++ b/src/main/resources/templates/fragments/investments/curr-badges.html @@ -6,15 +6,16 @@ ${currRate.change} == 'UP' ? ' border border-success text-success' : ' border border-danger text-danger' - " -> + "> - - + + + + diff --git a/src/main/resources/templates/investments.html b/src/main/resources/templates/investments.html index 6d4de96..a457157 100644 --- a/src/main/resources/templates/investments.html +++ b/src/main/resources/templates/investments.html @@ -135,9 +135,12 @@ Historical Rates
-
- +
+
-
- +
+ + + + + +
@@ -185,6 +229,40 @@ + \ No newline at end of file diff --git a/src/main/resources/templates/transactions.html b/src/main/resources/templates/transactions.html index 811a07e..0276b38 100644 --- a/src/main/resources/templates/transactions.html +++ b/src/main/resources/templates/transactions.html @@ -128,22 +128,22 @@ - - + + - + - + @@ -154,15 +154,15 @@ - - + +
Date Money In Money OutFees BalanceFeesDate Category Description