From 8b7bbfbe6b228fd890e453d63a484c535f0d7a95 Mon Sep 17 00:00:00 2001
From: tobias <tobias@thecodedev.de>
Date: Sun, 29 Mar 2020 14:50:27 +0200
Subject: [PATCH] #455 - Show next execution time

---
 .../budgetmaster/services/BackupService.java  | 20 ++++++++++++++++---
 .../services/DateFormatStyle.java             |  3 ++-
 .../budgetmaster/services/DateService.java    |  5 +++++
 .../settings/SettingsController.java          |  4 ++++
 src/main/resources/languages/_de.properties   |  1 +
 src/main/resources/languages/_en.properties   |  3 ++-
 .../resources/templates/settings/settings.ftl |  4 ++++
 7 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/BackupService.java b/src/main/java/de/deadlocker8/budgetmaster/services/BackupService.java
index 2e674ff73..1115e2a18 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/BackupService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/BackupService.java
@@ -3,16 +3,16 @@ package de.deadlocker8.budgetmaster.services;
 import de.deadlocker8.budgetmaster.settings.AutoBackupTime;
 import de.deadlocker8.budgetmaster.settings.Settings;
 import de.deadlocker8.budgetmaster.settings.SettingsService;
+import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.support.CronSequenceGenerator;
 import org.springframework.scheduling.support.CronTrigger;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TimeZone;
+import java.util.*;
 import java.util.concurrent.ScheduledFuture;
 
 @Service
@@ -66,4 +66,18 @@ public class BackupService
 		int hour = time.getCronTime();
 		return String.format("0 0 %d */%d * *", hour, days);
 	}
+
+	public Optional<DateTime> getNextRun()
+	{
+		final Settings settings = settingsService.getSettings();
+		if(settings.getAutoBackupActivated())
+		{
+			final String cron = computeCron(settings.getAutoBackupTime(), settings.getAutoBackupDays());
+			CronSequenceGenerator cronTrigger = new CronSequenceGenerator(cron);
+			Date next = cronTrigger.next(new Date());
+
+			return Optional.of(new DateTime(next));
+		}
+		return Optional.empty();
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/DateFormatStyle.java b/src/main/java/de/deadlocker8/budgetmaster/services/DateFormatStyle.java
index 1ff6cad49..3a3ace9da 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/DateFormatStyle.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/DateFormatStyle.java
@@ -5,7 +5,8 @@ public enum DateFormatStyle
 	NORMAL("dd.MM.yy"),
 	NO_YEAR("dd.MM."),
 	LONG("dd.MM.yyyy"),
-	LONG_MONTH_AND_YEAR("MMMM yyyy");
+	LONG_MONTH_AND_YEAR("MMMM yyyy"),
+	DATE_TIME("dd.MM.yyyy HH:mm");
 
 	private String key;
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/DateService.java b/src/main/java/de/deadlocker8/budgetmaster/services/DateService.java
index 9ba110f3b..605c8ac7e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/DateService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/DateService.java
@@ -37,6 +37,11 @@ public class DateService
 		return getDateString(date, DateFormatStyle.LONG_MONTH_AND_YEAR);
 	}
 
+	public String getDateTimeString(DateTime date)
+	{
+		return getDateString(date, DateFormatStyle.DATE_TIME);
+	}
+
 	private String getDateString(DateTime date, DateFormatStyle formatStyle)
 	{
 		return date.toString(DateTimeFormat.forPattern(formatStyle.getKey()).withLocale(settingsService.getSettings().getLanguage().getLocale()));
diff --git a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
index bcf75d1fa..5f9781829 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/settings/SettingsController.java
@@ -19,6 +19,7 @@ import de.deadlocker8.budgetmaster.utils.Strings;
 import de.thecodelabs.utils.util.Localization;
 import de.thecodelabs.utils.util.RandomUtils;
 import de.thecodelabs.versionizer.UpdateItem;
+import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -77,6 +78,9 @@ public class SettingsController extends BaseController
 		model.addAttribute("searchResultsPerPageOptions", SEARCH_RESULTS_PER_PAGE_OPTIONS);
 		model.addAttribute("autoBackupTimes", AutoBackupTime.values());
 
+		final Optional<DateTime> nextBackupTimeOptional = scheduleTaskService.getNextRun();
+		nextBackupTimeOptional.ifPresent(date -> model.addAttribute("nextBackupTime", date));
+
 		request.removeAttribute("database", WebRequest.SCOPE_SESSION);
 		return "settings/settings";
 	}
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index 5c6db1ce6..3528c9858 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -188,6 +188,7 @@ settings.backup.auto.days=Intervall in Tagen
 settings.backup.auto.time=Uhrzeit
 settings.backup.auto.time.short={0} Uhr
 settings.backup.auto.files.to.keep=Anzahl aufzubewahrender Backups (0 für unbegrenzt)
+settings.backup.auto.next=Nächste Ausführung
 
 settings.database.import=Importieren
 settings.database.export=Exportieren
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index d09dd8cb0..09bf3b112 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -186,8 +186,9 @@ settings.backup.auto.deactivated=Off
 settings.backup.auto.activated=On
 settings.backup.auto.days=Interval in days
 settings.backup.auto.time=Time of day
-settings.backup.auto.time.short={0} o'clock
+settings.backup.auto.time.short={0} o''clock
 settings.backup.auto.files.to.keep=Number of backups to keep (0 for unlimited)
+settings.backup.auto.next=Next execution
 
 settings.database.import=Import
 settings.database.export=Export
diff --git a/src/main/resources/templates/settings/settings.ftl b/src/main/resources/templates/settings/settings.ftl
index edcdc44bb..434bda646 100644
--- a/src/main/resources/templates/settings/settings.ftl
+++ b/src/main/resources/templates/settings/settings.ftl
@@ -137,6 +137,10 @@
                                 <label for="settings-backup-auto-files-to-keep">${locale.getString("settings.backup.auto.files.to.keep")}</label>
                             </div>
                             <input type="hidden" id="hidden-settings-backup-auto-files-to-keep" name="autoBackupFilesToKeep" value="<#if settings.getAutoBackupActivated()??>${settings.getAutoBackupFilesToKeep()}</#if>">
+
+                            <div class="col s12 m12 l8 offset-l2">
+                                ${locale.getString("settings.backup.auto.next")}: <#if nextBackupTime??>${dateService.getDateTimeString(nextBackupTime)}<#else>-</#if>
+                            </div>
                         </div>
 
                         <br>
-- 
GitLab