From 753cd46c9ca12f69fd04d5573583f82476628128 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 2 Mar 2019 22:07:48 +0100
Subject: [PATCH] Fixed #408 - allow to set default account

---
 .../budgetmaster/accounts/Account.java        | 25 ++++++++++---
 .../accounts/AccountController.java           | 15 +++++++-
 .../accounts/AccountRepository.java           |  2 ++
 .../budgetmaster/accounts/AccountService.java | 36 +++++++++++++++++--
 .../budgetmaster/services/HelpersService.java | 15 ++++++--
 src/main/resources/languages/_de.properties   |  1 +
 src/main/resources/languages/_en.properties   |  1 +
 src/main/resources/static/js/main.js          |  2 +-
 .../resources/templates/accounts/accounts.ftl |  3 ++
 .../templates/accounts/newAccount.ftl         |  1 +
 .../transactions/newTransactionMacros.ftl     |  2 +-
 11 files changed, 90 insertions(+), 13 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/accounts/Account.java b/src/main/java/de/deadlocker8/budgetmaster/accounts/Account.java
index c3b8626ae..040d3cc73 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/accounts/Account.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/accounts/Account.java
@@ -19,23 +19,26 @@ public class Account
 
 	@NotNull
 	@Size(min = 1)
-	@Column(unique=true)
+	@Column(unique = true)
 	@Expose
 	private String name;
 
 	@OneToMany(mappedBy = "account", fetch = FetchType.LAZY)
 	private List<Transaction> referringTransactions;
 
-	private boolean isSelected;
+	private Boolean isSelected = false;
+	private Boolean isDefault = false;
 
 	@Expose
 	private AccountType type;
 
+
 	public Account(String name, AccountType type)
 	{
 		this.name = name;
 		this.type = type;
 		this.isSelected = false;
+		this.isDefault = false;
 	}
 
 	public Account()
@@ -72,16 +75,26 @@ public class Account
 		this.referringTransactions = referringTransactions;
 	}
 
-	public boolean isSelected()
+	public Boolean isSelected()
 	{
 		return isSelected;
 	}
 
-	public void setSelected(boolean selected)
+	public void setSelected(Boolean selected)
 	{
 		isSelected = selected;
 	}
 
+	public Boolean isDefault()
+	{
+		return isDefault;
+	}
+
+	public void setDefault(Boolean aDefault)
+	{
+		isDefault = aDefault;
+	}
+
 	public AccountType getType()
 	{
 		return type;
@@ -100,6 +113,7 @@ public class Account
 				", name='" + name + '\'' +
 				", referringTransactions=" + referringTransactions +
 				", isSelected=" + isSelected +
+				", isDefault=" + isDefault +
 				", type=" + type +
 				'}';
 	}
@@ -111,6 +125,7 @@ public class Account
 		if(o == null || getClass() != o.getClass()) return false;
 		Account account = (Account) o;
 		return isSelected == account.isSelected &&
+				isDefault == account.isDefault &&
 				Objects.equals(ID, account.ID) &&
 				Objects.equals(name, account.name) &&
 				type == account.type;
@@ -119,6 +134,6 @@ public class Account
 	@Override
 	public int hashCode()
 	{
-		return Objects.hash(ID, name, isSelected, type);
+		return Objects.hash(ID, name, isSelected, isDefault, type);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java
index 8b610e239..eb5cff582 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountController.java
@@ -21,7 +21,7 @@ public class AccountController extends BaseController
 	@Autowired
 	private AccountService accountService;
 
-	@RequestMapping(value = "/account/{ID}/select")
+	@RequestMapping(value = "/accounts/{ID}/select")
 	public String selectAccount(HttpServletRequest request, @PathVariable("ID") Integer ID)
 	{
 		accountService.selectAccount(ID);
@@ -34,6 +34,19 @@ public class AccountController extends BaseController
 		return "redirect:" + referer;
 	}
 
+	@RequestMapping(value = "/accounts/{ID}/setAsDefault")
+	public String setAsDefault(HttpServletRequest request, @PathVariable("ID") Integer ID)
+	{
+		accountService.setAsDefaultAccount(ID);
+
+		String referer = request.getHeader("Referer");
+		if(referer.contains("database/import"))
+		{
+			return "redirect:/settings";
+		}
+		return "redirect:" + referer;
+	}
+
 	@RequestMapping("/accounts")
 	public String accounts(HttpServletRequest request, Model model)
 	{
diff --git a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountRepository.java b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountRepository.java
index e21d50c2b..01e72be7f 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountRepository.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountRepository.java
@@ -14,4 +14,6 @@ public interface AccountRepository extends JpaRepository<Account, Integer>
 	List<Account> findAllByType(AccountType accountType);
 
 	Account findByIsSelected(boolean isSelected);
+
+	Account findByIsDefault(boolean isDefault);
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java
index 13502eb09..28735f78c 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/accounts/AccountService.java
@@ -56,6 +56,11 @@ public class AccountService implements Resetable
 		Account newSelectedAccount = accounts.get(0);
 		selectAccount(newSelectedAccount.getID());
 
+		if(accountToDelete.isDefault())
+		{
+			setAsDefaultAccount(accountRepository.findAllByType(AccountType.CUSTOM).get(0).getID());
+		}
+
 		accountRepository.delete(ID);
 	}
 
@@ -79,11 +84,19 @@ public class AccountService implements Resetable
 			accountRepository.save(placeholder);
 			LOGGER.debug("Created placeholder account");
 
-			Account account = new Account(Localization.getString(Strings.ACCOUNT_DEFAULT_NAME), AccountType.CUSTOM);
-			account = accountRepository.save(account);
+			Account account =  accountRepository.save(new Account(Localization.getString(Strings.ACCOUNT_DEFAULT_NAME), AccountType.CUSTOM));
 			selectAccount(account.getID());
+			setAsDefaultAccount(account.getID());
 			LOGGER.debug("Created default account");
 		}
+
+		Account defaultAccount = accountRepository.findByIsDefault(true);
+		if(defaultAccount == null)
+		{
+			Account account = accountRepository.findAllByType(AccountType.CUSTOM).get(0);
+			setAsDefaultAccount(account.getID());
+		}
+		setAsDefaultAccount(accountRepository.findByIsDefault(true).getID());
 	}
 
 	private void deselectAllAccounts()
@@ -111,4 +124,23 @@ public class AccountService implements Resetable
 			userRepository.save(user);
 		}
 	}
+
+	public void setAsDefaultAccount(int ID)
+	{
+		unsetDefaultForAllAccounts();
+
+		Account accountToSelect = accountRepository.findOne(ID);
+		accountToSelect.setDefault(true);
+		accountRepository.save(accountToSelect);
+	}
+
+	private void unsetDefaultForAllAccounts()
+	{
+		List<Account> accounts = accountRepository.findAll();
+		for(Account currentAccount : accounts)
+		{
+			currentAccount.setDefault(false);
+			accountRepository.save(currentAccount);
+		}
+	}
 }
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
index dbb32dd30..616d08ca5 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
@@ -210,14 +210,23 @@ public class HelpersService
 		// select random account if no account is selected
 		if(selectedAccount == null)
 		{
-			Account account = accountRepository.findAllByType(AccountType.CUSTOM).get(0);
-			accountService.selectAccount(account.getID());
-			selectedAccount = accountRepository.findByIsSelected(true);
+			selectedAccount = accountRepository.findByIsDefault(true);
+			accountService.selectAccount(selectedAccount.getID());
 		}
 
 		return selectedAccount;
 	}
 
+	public Account getCurrentAccountOrDefault()
+	{
+		Account selectedAccount = getCurrentAccount();
+		if(selectedAccount.getType().equals(AccountType.ALL))
+		{
+			return accountService.getRepository().findByIsDefault(true);
+		}
+		return selectedAccount;
+	}
+
 	public int getIncomeSumForTransactionList(List<Transaction> transactions)
 	{
 		int sum = 0;
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index a675f29dc..5513aa722 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -159,6 +159,7 @@ account.new.label.name=Name
 account.default.name=Standardkonto
 account.all=Alle Konten
 account.budget.asof=Stand
+account.tooltip.default=Als Standardkonto festlegen
 
 transaction.new.label.name=Name
 transaction.new.label.amount=Betrag
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index 8c5cf0785..90d4661f9 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -160,6 +160,7 @@ account.new.label.name=Name
 account.default.name=Default Account
 account.all=All Accounts
 account.budget.asof=as of
+account.tooltip.default=Set as default account
 
 transaction.new.label.name=Name
 transaction.new.label.amount=Amount
diff --git a/src/main/resources/static/js/main.js b/src/main/resources/static/js/main.js
index ec21ce94d..7b097f1ea 100644
--- a/src/main/resources/static/js/main.js
+++ b/src/main/resources/static/js/main.js
@@ -17,7 +17,7 @@ $( document ).ready(function() {
     $("#selectAccount").on('change', function()
     {
         var accountID = $(this).val();
-        window.location = rootURL + "/account/" + accountID + "/select";
+        window.location = rootURL + "/accounts/" + accountID + "/select";
     });
 
     if($("#login-password").length)
diff --git a/src/main/resources/templates/accounts/accounts.ftl b/src/main/resources/templates/accounts/accounts.ftl
index c9fa22cad..ccf1a3863 100644
--- a/src/main/resources/templates/accounts/accounts.ftl
+++ b/src/main/resources/templates/accounts/accounts.ftl
@@ -23,6 +23,9 @@
                         <#list accounts as account>
                             <#if (account.getType().name() == "CUSTOM")>
                                 <tr>
+                                    <td>
+                                        <a href="<@s.url '/accounts/${account.getID()?c}/setAsDefault'/>" class="btn-flat no-padding text-color tooltipped" data-position="left" data-tooltip="${locale.getString("account.tooltip.default")}"><i class="material-icons left"><#if account.isDefault()>star<#else>star_border</#if></i></a>
+                                    </td>
                                     <td>${account.getName()}</td>
                                     <td>
                                         <a href="<@s.url '/accounts/${account.getID()?c}/edit'/>" class="btn-flat no-padding text-color"><i class="material-icons left">edit</i></a>
diff --git a/src/main/resources/templates/accounts/newAccount.ftl b/src/main/resources/templates/accounts/newAccount.ftl
index 7b030943b..1cc507c12 100644
--- a/src/main/resources/templates/accounts/newAccount.ftl
+++ b/src/main/resources/templates/accounts/newAccount.ftl
@@ -21,6 +21,7 @@
                         <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
                         <input type="hidden" name="ID" value="<#if account.getID()??>${account.getID()?c}</#if>">
                         <input type="hidden" name="isSelected" value="<#if account.isSelected()??>${account.isSelected()?c}</#if>">
+                        <input type="hidden" name="isDefault" value="<#if account.isDefault()??>${account.isDefault()?c}</#if>">
 
                         <#-- name -->
                         <div class="row">
diff --git a/src/main/resources/templates/transactions/newTransactionMacros.ftl b/src/main/resources/templates/transactions/newTransactionMacros.ftl
index e7b5dc6f1..d4c668a01 100644
--- a/src/main/resources/templates/transactions/newTransactionMacros.ftl
+++ b/src/main/resources/templates/transactions/newTransactionMacros.ftl
@@ -98,7 +98,7 @@
                         <#continue>
                     </#if>
 
-                    <#if account == helpers.getCurrentAccount()>
+                    <#if account == helpers.getCurrentAccountOrDefault()>
                         <option selected value="${account.getID()?c}">${account.getName()}</option>
                         <#continue>
                     </#if>
-- 
GitLab