diff --git a/src/main/java/de/assecutor/votianlt/Application.java b/src/main/java/de/assecutor/votianlt/Application.java index c50b3c3..e9e9211 100644 --- a/src/main/java/de/assecutor/votianlt/Application.java +++ b/src/main/java/de/assecutor/votianlt/Application.java @@ -5,10 +5,12 @@ import com.vaadin.flow.theme.Theme; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableScheduling; import java.time.Clock; @SpringBootApplication +@EnableScheduling @Theme("default") public class Application implements AppShellConfigurator { diff --git a/src/main/java/de/assecutor/votianlt/service/MonthlySchedulerService.java b/src/main/java/de/assecutor/votianlt/service/MonthlySchedulerService.java new file mode 100644 index 0000000..9df13df --- /dev/null +++ b/src/main/java/de/assecutor/votianlt/service/MonthlySchedulerService.java @@ -0,0 +1,111 @@ +package de.assecutor.votianlt.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.YearMonth; + +/** + * Service für monatliche Scheduler-Aufgaben, die am letzten Tag des Monats (Ultimo) ausgeführt werden. + */ +@Service +public class MonthlySchedulerService { + + private static final Logger logger = LoggerFactory.getLogger(MonthlySchedulerService.class); + + /** + * Scheduler, der täglich um 23:00 Uhr läuft und prüft, ob heute der letzte Tag des Monats ist. + * Wenn ja, wird die monatliche Aufgabe ausgeführt. + */ + @Scheduled(cron = "0 0 23 * * *") // Täglich um 23:00 Uhr + public void checkAndRunMonthlyTask() { + LocalDate today = LocalDate.now(); + LocalDate lastDayOfMonth = YearMonth.from(today).atEndOfMonth(); + + if (today.equals(lastDayOfMonth)) { + logger.info("Heute ist der letzte Tag des Monats ({}). Führe monatliche Aufgabe aus.", today); + runMonthlyUltimoTask(); + } else { + logger.debug("Heute ({}) ist nicht der letzte Tag des Monats. Nächster Ultimo: {}", + today, lastDayOfMonth); + } + } + + /** + * Alternative Implementierung: Direkter Cron-Ausdruck für den letzten Tag des Monats. + * Dieser Scheduler läuft am letzten Tag jedes Monats um 23:00 Uhr. + * + * Hinweis: Dieser Ansatz ist weniger flexibel, da er nicht alle Monate korrekt abdeckt. + * Der obige Ansatz mit täglicher Prüfung ist robuster. + */ + // @Scheduled(cron = "0 0 23 L * *") // Am letzten Tag des Monats um 23:00 Uhr + public void runMonthlyUltimoTaskDirect() { + logger.info("Monatliche Ultimo-Aufgabe wird direkt ausgeführt am: {}", LocalDate.now()); + runMonthlyUltimoTask(); + } + + /** + * Die eigentliche monatliche Aufgabe, die am Ultimo ausgeführt wird. + * Hier können Sie Ihre spezifische Geschäftslogik implementieren. + */ + private void runMonthlyUltimoTask() { + try { + logger.info("=== MONATLICHE ULTIMO-AUFGABE GESTARTET ==="); + + // TODO: Hier Ihre spezifische Geschäftslogik implementieren + // Beispiele: + // - Monatliche Berichte generieren + // - Datenbereinigung durchführen + // - Rechnungen erstellen + // - Statistiken berechnen + // - E-Mail-Benachrichtigungen versenden + + // Beispiel-Implementierung: + generateMonthlyReports(); + cleanupOldData(); + sendMonthlyNotifications(); + + logger.info("=== MONATLICHE ULTIMO-AUFGABE ERFOLGREICH ABGESCHLOSSEN ==="); + + } catch (Exception e) { + logger.error("Fehler bei der Ausführung der monatlichen Ultimo-Aufgabe", e); + // Hier könnten Sie zusätzliche Fehlerbehandlung implementieren, + // z.B. E-Mail-Benachrichtigung an Administratoren + } + } + + /** + * Beispiel-Methode: Monatliche Berichte generieren + */ + private void generateMonthlyReports() { + logger.info("Generiere monatliche Berichte..."); + // TODO: Implementierung der Berichtsgenerierung + } + + /** + * Beispiel-Methode: Alte Daten bereinigen + */ + private void cleanupOldData() { + logger.info("Bereinige alte Daten..."); + // TODO: Implementierung der Datenbereinigung + } + + /** + * Beispiel-Methode: Monatliche Benachrichtigungen versenden + */ + private void sendMonthlyNotifications() { + logger.info("Versende monatliche Benachrichtigungen..."); + // TODO: Implementierung der Benachrichtigungen + } + + /** + * Hilfsmethode zum manuellen Auslösen der monatlichen Aufgabe (z.B. für Tests) + */ + public void triggerMonthlyTaskManually() { + logger.info("Monatliche Aufgabe wird manuell ausgelöst"); + runMonthlyUltimoTask(); + } +} \ No newline at end of file