From 3cd724afe35ef9b4b268069670bd127d386c6d9f Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 22 Jun 2019 20:42:40 +0200
Subject: [PATCH] Fixed #451 - categories page: show number of times used for
 each category

---
 .../budgetmaster/services/HelpersService.java        |  6 ++++++
 .../transactions/TransactionRepository.java          |  3 +++
 src/main/resources/languages/_de.properties          |  2 ++
 src/main/resources/languages/_en.properties          |  2 ++
 .../resources/templates/categories/categories.ftl    | 12 +++++++++++-
 .../unit/database/DatabaseImportTest.java            |  6 ++++++
 6 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
index 8cc11d4de..d90b807a0 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
@@ -1,6 +1,7 @@
 package de.deadlocker8.budgetmaster.services;
 
 import de.deadlocker8.budgetmaster.accounts.AccountService;
+import de.deadlocker8.budgetmaster.categories.Category;
 import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatch;
 import de.deadlocker8.budgetmaster.reports.Budget;
 import de.deadlocker8.budgetmaster.settings.Settings;
@@ -282,4 +283,9 @@ public class HelpersService
 			return DateTime.parse(cookieDate, DateTimeFormat.forPattern("dd.MM.yy").withLocale(getSettings().getLanguage().getLocale()));
 		}
 	}
+
+	public Long getUsageCountForCategory(Category category)
+	{
+		return transactionService.getRepository().countByCategory(category);
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionRepository.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionRepository.java
index 533ab1844..3510a0040 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionRepository.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionRepository.java
@@ -1,5 +1,6 @@
 package de.deadlocker8.budgetmaster.transactions;
 
+import de.deadlocker8.budgetmaster.categories.Category;
 import de.deadlocker8.budgetmaster.tags.Tag;
 import de.deadlocker8.budgetmaster.accounts.Account;
 import org.joda.time.DateTime;
@@ -18,6 +19,8 @@ public interface TransactionRepository extends JpaRepository<Transaction, Intege
 
 	List<Transaction> findAllByAccount(Account account);
 
+	Long countByCategory(Category category);
+
 	List<Transaction> findAllByTagsContaining(Tag tag);
 
 	@Query(value = "SELECT SUM(t.amount) FROM `transaction` as t WHERE t.account_id = ?1 AND t.transfer_account_id IS NULL AND t.date BETWEEN ?2 AND ?3", nativeQuery = true)
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index 92666c96e..dd25b1651 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -141,6 +141,8 @@ menu.update=Update verf
 menu.search.results=Suchergebnisse ({0})
 
 category.new.label.name=Name
+categories.usages=Verweise
+categories.actions=Aktionen
 
 settings.password=Passwort
 settings.password.confirmation=Passwort Wiederholung
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index 63d3ce081..6b23e2279 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -142,6 +142,8 @@ menu.update=Update available
 menu.search.results=Search results ({0})
 
 category.new.label.name=Name
+categories.usages=Usages
+categories.actions=Actions
 
 settings.password=Password
 settings.password.confirmation=Password Confirmation
diff --git a/src/main/resources/templates/categories/categories.ftl b/src/main/resources/templates/categories/categories.ftl
index cd910707d..ea3e30143 100644
--- a/src/main/resources/templates/categories/categories.ftl
+++ b/src/main/resources/templates/categories/categories.ftl
@@ -24,8 +24,17 @@
                 <br>
                 <div class="container">
                     <table class="bordered">
+                        <thead>
+                            <tr>
+                                <th></th>
+                                <th>${locale.getString("category.new.label.name")}</th>
+                                <th>${locale.getString("categories.usages")}</th>
+                                <th>${locale.getString("categories.actions")}</th>
+                            </tr>
+                        </thead>
                         <#list categories as category>
                             <#assign categoryName=categoriesFunctions.getCategoryName(category)>
+                            <#assign usageCount=helpers.getUsageCountForCategory(category)/>
                             <tr>
                             <td>
                                 <div class="category-circle" style="background-color: ${category.color}">
@@ -34,7 +43,8 @@
                                     </span>
                                 </div>
                             </td>
-                            <td>${categoryName}</td>
+                            <td>${categoryName} </td>
+                            <td>${usageCount}</td>
                             <td>
                                 <a href="<@s.url '/categories/${category.ID?c}/edit'/>" class="btn-flat no-padding text-color"><i class="material-icons left">edit</i></a>
                                 <#if (category.getType().name() == "CUSTOM")>
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseImportTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseImportTest.java
index 16a39b397..13dccf4e3 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseImportTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/database/DatabaseImportTest.java
@@ -226,6 +226,12 @@ public class DatabaseImportTest
 					return null;
 				}
 
+				@Override
+				public Long countByCategory(Category category)
+				{
+					return null;
+				}
+
 				@Override
 				public Page<Transaction> findAll(Specification<Transaction> specification, Pageable pageable)
 				{
-- 
GitLab