From 5a356c2f4cb197caa5e440d70bc8cb26219812a3 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Tue, 4 May 2021 23:08:45 +0200
Subject: [PATCH] at least one account must be set to visibility full access
 (otherwise no default account exists)

---
 .../accounts/AccountController.java           | 21 ++++++++++++++++++-
 .../resources/languages/base_de.properties    |  1 +
 .../resources/languages/base_en.properties    |  1 +
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java
index 5993a5953..cbf56eda9 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java
@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.WebRequest;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Optional;
 
 
@@ -119,7 +120,7 @@ public class AccountController extends BaseController
 	}
 
 	@PostMapping(value = "/newAccount")
-	public String post(HttpServletRequest request, Model model,
+	public String post(HttpServletRequest request, WebRequest webRequest, Model model,
 					   @ModelAttribute("NewAccount") Account account,
 					   BindingResult bindingResult)
 	{
@@ -133,6 +134,15 @@ public class AccountController extends BaseController
 			bindingResult.addError(new FieldError("NewAccount", "name", "", false, new String[]{"warning.duplicate.account.name"}, null, null));
 		}
 
+		List<Account> activatedAccounts = accountService.getRepository().findAllByTypeAndAccountStateOrderByNameAsc(AccountType.CUSTOM, AccountState.FULL_ACCESS);
+		boolean newAccountStateWouldLeaveNoFullAccessAccounts = activatedAccounts.size() == 1 && account.getAccountState() != AccountState.FULL_ACCESS;
+		if(!isNewAccount && newAccountStateWouldLeaveNoFullAccessAccounts)
+		{
+			final String warningMessage = Localization.getString("warning.account.edit.state", Localization.getString(AccountState.FULL_ACCESS.getLocalizationKey()));
+			WebRequestUtils.putNotification(webRequest, new Notification(warningMessage, NotificationType.WARNING));
+			bindingResult.addError(new FieldError("NewAccount", "state", account.getAccountState(), false, new String[]{"warning.account.edit.state"}, null, null));
+		}
+
 		if(bindingResult.hasErrors())
 		{
 			model.addAttribute("error", bindingResult);
@@ -171,6 +181,15 @@ public class AccountController extends BaseController
 			existingAccount.setType(AccountType.CUSTOM);
 			existingAccount.setAccountState(newAccount.getAccountState());
 			accountService.getRepository().save(existingAccount);
+
+			if(existingAccount.isDefault() && existingAccount.getAccountState() != AccountState.FULL_ACCESS)
+			{
+				// set any activated account as new default account
+				accountService.unsetDefaultForAllAccounts();
+				List<Account> activatedAccounts = accountService.getRepository().findAllByTypeAndAccountStateOrderByNameAsc(AccountType.CUSTOM, AccountState.FULL_ACCESS);
+				Account newDefaultAccount = activatedAccounts.get(0);
+				accountService.setAsDefaultAccount(newDefaultAccount.getID());
+			}
 		}
 	}
 }
\ No newline at end of file
diff --git a/src/main/resources/languages/base_de.properties b/src/main/resources/languages/base_de.properties
index 3b2c34d52..71e0619c0 100644
--- a/src/main/resources/languages/base_de.properties
+++ b/src/main/resources/languages/base_de.properties
@@ -151,6 +151,7 @@ delete.image.error.not.existing=Fehler: Bild mit ID {0} existiert nicht
 
 # WARNING
 warning.text.account.delete=Das Konto "{0}" kann nicht gelöscht werden, da mindestens ein Konto existieren muss. Um dieses Konto zu löschen musst du zuerst ein neues anlegen.
+warning.account.edit.state=Für mindestens ein Konto muss die Sichtbarkeit auf "{0}" gesetzt sein!s
 warning.empty.category.name=Bitte gib einen Namen ein.
 warning.empty.account.name=Bitte gib einen Namen ein.
 warning.duplicate.account.name=Es existiert bereits ein Konto mit diesem Namen.
diff --git a/src/main/resources/languages/base_en.properties b/src/main/resources/languages/base_en.properties
index 46c0e0a29..c377750e4 100644
--- a/src/main/resources/languages/base_en.properties
+++ b/src/main/resources/languages/base_en.properties
@@ -151,6 +151,7 @@ delete.image.error.not.existing=Error: Image with ID {0} does not exist
 
 # WARNING
 warning.text.account.delete=The account "{0}" could not be deleted, because at least one account must exist at all time. You have to create a new account in order to delete this one.
+warning.account.edit.state=At least one account must have set it's visibility to "{0}"!
 warning.empty.category.name=Please insert a name.
 warning.empty.account.name=Please insert a name.
 warning.duplicate.account.name=An account with this name is already existing.
-- 
GitLab