From 8969198de801420eb67f64110da04273e5016266 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 17 Nov 2018 17:21:59 +0100
Subject: [PATCH] Fixed #355 - repeating transactions are imported multiple
 times (only export them once)

---
 .../services/DatabaseService.java             | 42 ++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/DatabaseService.java b/src/main/java/de/deadlocker8/budgetmaster/services/DatabaseService.java
index 489664120..33cc5b282 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/DatabaseService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/DatabaseService.java
@@ -5,6 +5,7 @@ import de.deadlocker8.budgetmaster.database.Database;
 import de.deadlocker8.budgetmaster.entities.Account;
 import de.deadlocker8.budgetmaster.entities.Category;
 import de.deadlocker8.budgetmaster.entities.Transaction;
+import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import org.joda.time.DateTime;
 import org.joda.time.format.ISODateTimeFormat;
 import org.slf4j.Logger;
@@ -13,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.lang.reflect.Type;
+import java.util.ArrayList;
 import java.util.List;
 
 @Service
@@ -78,8 +80,11 @@ public class DatabaseService
 		List<Category> categories = categoryService.getRepository().findAll();
 		List<Account> accounts = accountService.getRepository().findAll();
 		List<Transaction> transactions = transactionService.getRepository().findAll();
+		List<Transaction> filteredTransactions = filterRepeatingTransactions(transactions);
+		LOGGER.debug("Reduced " + transactions.size() + " transactions to " + filteredTransactions.size());
 
-		Database database = new Database(categories, accounts, transactions);
+		Database database = new Database(categories, accounts, filteredTransactions);
+		LOGGER.debug("Created database JSON with " + database.getTransactions().size() + " transactions, " + database.getCategories().size() + " categories and " + database.getAccounts().size() + " accounts");
 
 		Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().registerTypeAdapter(DateTime.class, new JsonSerializer<DateTime>(){
 			@Override
@@ -89,4 +94,39 @@ public class DatabaseService
 		}).create();
 		return gson.toJson(database);
 	}
+
+	private List<Transaction> filterRepeatingTransactions(List<Transaction> transactions)
+	{
+		List<Transaction> filteredTransactions = new ArrayList<>();
+
+		for(Transaction transaction : transactions)
+		{
+			if(transaction.isRepeating())
+			{
+				if(isRepeatingOptionInList(transaction.getRepeatingOption(), filteredTransactions))
+				{
+					continue;
+				}
+			}
+
+			filteredTransactions.add(transaction);
+		}
+
+		return filteredTransactions;
+	}
+
+	private boolean isRepeatingOptionInList(RepeatingOption repeatingOption, List<Transaction> transactions)
+	{
+		for(Transaction transaction : transactions)
+		{
+			if(transaction.isRepeating())
+			{
+				if(transaction.getRepeatingOption().equals(repeatingOption))
+				{
+					return true;
+				}
+			}
+		}
+		return false;
+	}
 }
-- 
GitLab