diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java index 69f737fb72114dce51dc5ff6df573431a67b7bc8..8690c3f44ab5eb92aa020d51f51da262a7b760a9 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/Settings.java @@ -47,6 +47,10 @@ public class Settings private Boolean orderTransactionNameSuggestionsAlphabetically; + private Boolean accountEndDateReminderActivated; + @DateTimeFormat(pattern = "dd.MM.yyyy") + private LocalDate lastAccountEndDateReminderDate; + public Settings() { // empty @@ -76,6 +80,8 @@ public class Settings defaultSettings.setWhatsNewShownForCurrentVersion(false); defaultSettings.setMigrationDeclined(false); defaultSettings.setOrderTransactionNameSuggestionsAlphabetically(true); + defaultSettings.setAccountEndDateReminderActivated(true); + defaultSettings.setLastAccountEndDateReminderDate(LocalDate.now()); return defaultSettings; } @@ -314,6 +320,26 @@ public class Settings this.orderTransactionNameSuggestionsAlphabetically = orderTransactionNameSuggestionsAlphabetically; } + public Boolean getAccountEndDateReminderActivated() + { + return accountEndDateReminderActivated; + } + + public void setAccountEndDateReminderActivated(Boolean accountEndDateReminderActivated) + { + this.accountEndDateReminderActivated = accountEndDateReminderActivated; + } + + public LocalDate getLastAccountEndDateReminderDate() + { + return lastAccountEndDateReminderDate; + } + + public void setLastAccountEndDateReminderDate(LocalDate lastAccountEndDateReminderDate) + { + this.lastAccountEndDateReminderDate = lastAccountEndDateReminderDate; + } + @Override public String toString() { @@ -340,6 +366,8 @@ public class Settings ", whatsNewShownForCurrentVersion=" + whatsNewShownForCurrentVersion + ", migrationDeclined=" + migrationDeclined + ", orderTransactionNameSuggestionsAlphabetically=" + orderTransactionNameSuggestionsAlphabetically + + ", accountEndDateReminderActivated=" + accountEndDateReminderActivated + + ", lastAccountEndDateReminderDate=" + lastAccountEndDateReminderDate + '}'; } } \ No newline at end of file diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java index 1df27b2c37fb81fada0072c59634115ffd8c3738..5b0e93ea895516e00cfc6e9b34eabf1b4e8ac390 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java @@ -156,6 +156,14 @@ public class SettingsController extends BaseController return result.templatePath(); } + @PostMapping(value = "/save/accounts") + public String saveContainerAccounts(Model model, + @ModelAttribute("AccountsSettingsContainer") AccountsSettingsContainer accountsSettingsContainer, + BindingResult bindingResult) + { + return saveContainer(model, accountsSettingsContainer, bindingResult).templatePath(); + } + @PostMapping(value = "/save/transactions") public String saveContainerTransactions(Model model, @ModelAttribute("TransactionsSettingsContainer") TransactionsSettingsContainer transactionsSettingsContainer, diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java index 7f68c4f9e3df2673fddef4a1f5228e8c12fdd231..293438914119fdb3c5212d8b83010ef66e20fa0e 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsService.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import jakarta.annotation.PostConstruct; + import java.lang.reflect.Field; import java.util.NoSuchElementException; import java.util.Optional; @@ -116,6 +117,14 @@ public class SettingsService { settings.setOrderTransactionNameSuggestionsAlphabetically(defaultSettings.getOrderTransactionNameSuggestionsAlphabetically()); } + if(settings.getAccountEndDateReminderActivated() == null) + { + settings.setAccountEndDateReminderActivated(defaultSettings.getAccountEndDateReminderActivated()); + } + if(settings.getLastAccountEndDateReminderDate() == null) + { + settings.setLastAccountEndDateReminderDate(defaultSettings.getLastAccountEndDateReminderDate()); + } settingsRepository.save(settings); } @@ -139,6 +148,13 @@ public class SettingsService settings.setMigrationDeclined(isDeclined); } + @Transactional + public void updateLastAccountEndDateReminderDate() + { + Settings settings = getSettings(); + settings.setLastAccountEndDateReminderDate(DateHelper.getCurrentDate()); + } + @Transactional public void updateSettings(Settings newSettings) { diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/AccountsSettingsContainer.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/AccountsSettingsContainer.java new file mode 100644 index 0000000000000000000000000000000000000000..6ee7353634e60478138020f72b07b877fa14a791 --- /dev/null +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/settings/containers/AccountsSettingsContainer.java @@ -0,0 +1,65 @@ +package de.deadlocker8.budgetmaster.settings.containers; + +import de.deadlocker8.budgetmaster.settings.Settings; +import de.deadlocker8.budgetmaster.settings.SettingsService; +import org.springframework.validation.Errors; + +public final class AccountsSettingsContainer implements SettingsContainer +{ + private Boolean accountEndDateReminderActivated; + + public AccountsSettingsContainer(Boolean accountEndDateReminderActivated) + { + this.accountEndDateReminderActivated = accountEndDateReminderActivated; + } + + @Override + public void validate(Errors errors) + { + // nothing to do + } + + @Override + public void fixBooleans() + { + // nothing to do + } + + @Override + public String getErrorLocalizationKey() + { + return "notification.settings.accounts.error"; + } + + @Override + public String getSuccessLocalizationKey() + { + return "notification.settings.accounts.saved"; + } + + @Override + public String getTemplatePath() + { + return "settings/containers/settingsAccounts"; + } + + @Override + public Settings updateSettings(SettingsService settingsService) + { + final Settings settings = settingsService.getSettings(); + + if(accountEndDateReminderActivated == null) + { + accountEndDateReminderActivated = false; + } + + settings.setAccountEndDateReminderActivated(accountEndDateReminderActivated); + return settings; + } + + @Override + public void persistChanges(SettingsService settingsService, Settings previousSettings, Settings settings) + { + settingsService.updateSettings(settings); + } +} diff --git a/BudgetMasterServer/src/main/resources/languages/base_de.properties b/BudgetMasterServer/src/main/resources/languages/base_de.properties index 9fd51faa62b81fdba5f0c8dd817a902fbe1428cc..96e8a77e20c76a5b5c0cb8b04eca10a327397a91 100644 --- a/BudgetMasterServer/src/main/resources/languages/base_de.properties +++ b/BudgetMasterServer/src/main/resources/languages/base_de.properties @@ -175,6 +175,8 @@ notification.settings.security.warning=Passwort entspricht bereits gespeicherten notification.settings.security.error=Fehler beim Speichern des Passworts notification.settings.personalization.saved=Personalisierung gespeichert notification.settings.personalization.error=Fehler beim Speichern der Personalisierung +notification.settings.accounts.saved=Kontoeinstellungen gespeichert +notification.settings.accounts.error=Fehler beim Speichern der Kontoeinstellungen notification.settings.transactions.saved=Buchungseinstellungen gespeichert notification.settings.transactions.error=Fehler beim Speichern der Buchungseinstellungen notification.settings.update.saved=Updateeinstellungen gespeichert @@ -276,6 +278,10 @@ settings.transactionNameSuggestionOrder.description=Legt die Sortierung von Name settings.darkTheme=Design settings.darkTheme.deactivated=Helles Design settings.darkTheme.activated=Dunkles Design +settings.accountEndDateReminder=Erinnerung für Konten mit Enddatum +settings.accountEndDateReminder.description=Erinnert dich automatisch einmal pro Tag daran, wenn ein oder mehrere Konten in Kürze ihr Enddatum erreichen. +settings.accountEndDateReminder.deactivated=Aus +settings.accountEndDateReminder.activated=An settings.backupReminder=Backuperinnerung settings.backupReminder.description=Erinnert pro Monat an die Erstellung eines manuellen Backups settings.backupReminder.deactivated=Aus @@ -332,6 +338,7 @@ settings.transactions.keywords=Schlüsselwörter settings.transactions.keywords.placeholder=Schlüsselwort hier eingeben settings.transactions.keywords.description=Verwendest du eins dieser Schlüsselwörter im Namen einer neuen Buchung, so wirst du daran erinnert die Buchung als Einnahme zu markieren. (Groß- und Kleinschreibung wird nicht berücksichtigt) settings.misc=Sonstiges +settings.accounts=Konten settings.warning.unsaved=ungespeichert settings.database.import=Importieren diff --git a/BudgetMasterServer/src/main/resources/languages/base_en.properties b/BudgetMasterServer/src/main/resources/languages/base_en.properties index 12b2a8146806c0be9203ae0271f3a4d59fa31cbd..1b94eb874cec3254399c192b913b3816a2cbad05 100644 --- a/BudgetMasterServer/src/main/resources/languages/base_en.properties +++ b/BudgetMasterServer/src/main/resources/languages/base_en.properties @@ -175,6 +175,8 @@ notification.settings.security.warning=Password equals already saved password notification.settings.security.error=Error saving password notification.settings.personalization.saved=Personalization settings saved notification.settings.personalization.error=Error saving personalization settings +notification.settings.accounts.saved=Account settings saved +notification.settings.accounts.error=Error saving account settings notification.settings.transactions.saved=Transactions settings saved notification.settings.transactions.error=Error saving transactions settings notification.settings.backup.saved=Backup settings saved @@ -276,6 +278,10 @@ settings.transactionNameSuggestionOrder.description=Defines how the transaction settings.darkTheme=Theme settings.darkTheme.deactivated=Light Theme settings.darkTheme.activated=Dark Theme +settings.accountEndDateReminder=Reminder for accounts with end dates +settings.accountEndDateReminder.description=Automatically remind you once per day if one or more accounts will reach their end dates soon. +settings.accountEndDateReminder.deactivated=Off +settings.accountEndDateReminder.activated=On settings.backupReminder=Backup reminder settings.backupReminder.description=Automatically remind you once per month to perform a manual backup settings.backupReminder.deactivated=Off @@ -332,6 +338,7 @@ settings.transactions.keywords=Keywords settings.transactions.keywords.placeholder=Enter keyword here settings.transactions.keywords.description=If you use one of these keywords in the name of a new transaction, you will be reminded to mark the transaction as an income. (This feature is case-insensitive) settings.misc=Misc +settings.accounts=Accounts settings.warning.unsaved=unsaved settings.database.import=Import diff --git a/BudgetMasterServer/src/main/resources/templates/settings/containers/settingsAccounts.ftl b/BudgetMasterServer/src/main/resources/templates/settings/containers/settingsAccounts.ftl new file mode 100644 index 0000000000000000000000000000000000000000..2ee1216f838292e318823a08bc22fc6e3f7ba999 --- /dev/null +++ b/BudgetMasterServer/src/main/resources/templates/settings/containers/settingsAccounts.ftl @@ -0,0 +1,53 @@ +<#import "/spring.ftl" as s> +<#import "../../helpers/validation.ftl" as validation> +<#import "../../helpers/header.ftl" as header> +<@header.globals/> + +<#import "settingsContainer.ftl" as settingsContainerMacros> +<#import "../settingsMacros.ftl" as settingsMacros> + +<#macro accountsSettingsContainer importScripts settings> + <@settingsContainerMacros.settingsContainer 'AccountsSettingsContainer' 'accountsSettingsContainer' importScripts '/settings/save/accounts'> + <div class="row"> + <div class="col s12"> + <div class="table-container"> + <div class="table-cell"> + <div class="switch-cell-margin">${locale.getString("settings.accountEndDateReminder")}</div> + </div> + <div class="table-cell table-cell-spacer"></div> + <div class="table-cell"> + <@settingsMacros.switch "accountEndDateReminder" "accountEndDateReminderActivated" settings.getAccountEndDateReminderActivated()/> + </div> + <div class="table-cell table-cell-spacer"></div> + <div class="table-cell"> + <div class="switch-cell-margin"> + <a class="btn btn-flat tooltipped text-default" data-position="bottom" data-tooltip="${locale.getString("settings.accountEndDateReminder.description")}"><i class="material-icons">help_outline</i></a> + </div> + </div> + </div> + </div> + </div> + + <div class="row"> + <div class="col s12 center-align"> + <@header.buttonSubmit name='action' icon='save' localizationKey='save' color='background-green' onclick='return validateAccountsForm()'/> + </div> + </div> + + <script> + function validateAccountsForm() + { + return true; + } + + // toggle unsaved changes warning + + $('input[name="accountEndDateReminderActivated"]').change(function() + { + toggleSettingsContainerHeader('accountsSettingsContainerHeader', false); + }); + </script> + </@settingsContainerMacros.settingsContainer> +</#macro> + +<@accountsSettingsContainer importScripts=true settings=settings/> diff --git a/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl b/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl index 50e01d2b4c22b03247b8fe723a4e5f845a9b1fae..73045c9eaba82833fd12a15473253ce7c612bbba 100644 --- a/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl +++ b/BudgetMasterServer/src/main/resources/templates/settings/settings.ftl @@ -16,6 +16,7 @@ <#import "containers/settingsSecurity.ftl" as settingsSecurityMacros> <#import "containers/settingsPersonalization.ftl" as settingsPersonalizationMacros> + <#import "containers/settingsAccounts.ftl" as settingsAccountsMacros> <#import "containers/settingsTransactions.ftl" as settingsTransactionsMacros> <#import "containers/settingsBackup.ftl" as settingsBackupMacros> <#import "containers/settingsUpdate.ftl" as settingsUpdateMacros> @@ -47,6 +48,10 @@ <@settingsPersonalizationMacros.personalizationSettingsContainer importScripts=false settings=settings showReloadWarning=false/> </@settingsMacros.settingsCollapsibleItem> + <@settingsMacros.settingsCollapsibleItem "accountsSettingsContainer" "account_balance" locale.getString("settings.accounts")> + <@settingsAccountsMacros.accountsSettingsContainer importScripts=false settings=settings/> + </@settingsMacros.settingsCollapsibleItem> + <@settingsMacros.settingsCollapsibleItem "transactionsSettingsContainer" "list" locale.getString("settings.transactions")> <@settingsTransactionsMacros.transactionsSettingsContainer importScripts=false settings=settings/> </@settingsMacros.settingsCollapsibleItem> @@ -111,6 +116,7 @@ <script> initSettingsContainer('SecuritySettingsContainer', 'securitySettingsContainer'); initSettingsContainer('PersonalizationSettingsContainer', 'personalizationSettingsContainer'); + initSettingsContainer('AccountsSettingsContainer', 'accountsSettingsContainer'); initSettingsContainer('TransactionsSettingsContainer', 'transactionsSettingsContainer'); initSettingsContainer('BackupSettingsContainer', 'backupSettingsContainer'); initSettingsContainer('MiscSettingsContainer', 'miscSettingsContainer');