From 05bdd4d5751f14ba9bada0f464a04af4e6b6afd8 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Wed, 5 Aug 2020 21:42:30 +0200
Subject: [PATCH] #535 - fix null value for new field "isExpenditure" for
 existing transactions in database once on start

---
 .../IntroduceIsExpenditureMember.java         | 67 +++++++++++++++++++
 .../eventlistener/UpdateInstalledVersion.java |  2 +-
 2 files changed, 68 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/utils/eventlistener/IntroduceIsExpenditureMember.java

diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/eventlistener/IntroduceIsExpenditureMember.java b/src/main/java/de/deadlocker8/budgetmaster/utils/eventlistener/IntroduceIsExpenditureMember.java
new file mode 100644
index 000000000..bd0c0f8b1
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/eventlistener/IntroduceIsExpenditureMember.java
@@ -0,0 +1,67 @@
+package de.deadlocker8.budgetmaster.utils.eventlistener;
+
+import de.deadlocker8.budgetmaster.settings.SettingsService;
+import de.deadlocker8.budgetmaster.transactions.Transaction;
+import de.deadlocker8.budgetmaster.transactions.TransactionRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.event.ApplicationStartedEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+@Component
+public class IntroduceIsExpenditureMember
+{
+	private static final Logger LOGGER = LoggerFactory.getLogger(IntroduceIsExpenditureMember.class);
+
+	private static final int ACTIVATION_VERSION_CODE = 27;
+
+	private final TransactionRepository transactionRepository;
+	private final SettingsService settingsService;
+
+	@Autowired
+	public IntroduceIsExpenditureMember(TransactionRepository transactionRepository, SettingsService settingsService)
+	{
+		this.transactionRepository = transactionRepository;
+		this.settingsService = settingsService;
+	}
+
+	@EventListener
+	@Transactional
+	@Order(2)
+	public void onApplicationEvent(ApplicationStartedEvent event)
+	{
+		if(settingsService.getSettings().getInstalledVersionCode() <= ACTIVATION_VERSION_CODE)
+		{
+			fixMissingMemberIsExpenditure();
+		}
+	}
+
+	private void fixMissingMemberIsExpenditure()
+	{
+		final List<Transaction> transactions = transactionRepository.findAll();
+		long fixedTransactionsCount = 0;
+
+		for(Transaction transaction : transactions)
+		{
+			if(transaction.isExpenditure() != null)
+			{
+				continue;
+			}
+
+			transaction.setExpenditure(transaction.getAmount() <= 0);
+			fixedTransactionsCount++;
+		}
+
+		if(fixedTransactionsCount > 0)
+		{
+			LOGGER.debug(MessageFormat.format("Fixed {0} transactions (Introduced new member 'isExpenditure')", fixedTransactionsCount));
+		}
+	}
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/eventlistener/UpdateInstalledVersion.java b/src/main/java/de/deadlocker8/budgetmaster/utils/eventlistener/UpdateInstalledVersion.java
index 9fc9065b8..eeca9389e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/utils/eventlistener/UpdateInstalledVersion.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/eventlistener/UpdateInstalledVersion.java
@@ -28,7 +28,7 @@ public class UpdateInstalledVersion
 
 	@EventListener
 	@Transactional
-	@Order(2)
+	@Order(3)
 	public void onApplicationEvent(ApplicationStartedEvent event)
 	{
 		final Build build = Build.getInstance();
-- 
GitLab