using System; using System.Collections.ObjectModel; using System.Linq; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using ChronoFlow.Model; using ChronoFlow.Persistence; using ChronoFlow.Controller; namespace ChronoFlow.View.Mitarbeiter; /// /// ViewModel für die Aufgabenansicht eines Mitarbeiters. /// Lädt relevante Aufgaben (nicht erledigt) und ermöglicht das Speichern von Kommentaren und Bearbeitungsstatus. /// public partial class EmployeeTasksViewModel : ObservableObject { private readonly User _benutzer; // Der aktuell eingeloggte Benutzer private readonly ZeiterfassungsController controller = new(); // Controller für Datenzugriff private readonly string aktuellerBenutzername; // Benutzername (String, z. B. für Vergleich) // Liste aller offenen, relevanten Aufgaben für diesen Benutzer [ObservableProperty] private ObservableCollection eintraege = new(); // Status-Text für Hinweise oder Rückmeldungen an den Benutzer [ObservableProperty] private string? statusText; // Gibt an, ob überhaupt Aufgaben vorhanden sind (z. B. für "Keine Aufgaben"-Hinweis in der View) public bool HatKeineEintraege => Eintraege.Count == 0; // Wenn sich die Einträge ändern, wird auch das Property `HatKeineEintraege` neu berechnet partial void OnEintraegeChanged(ObservableCollection? oldValue, ObservableCollection newValue) { OnPropertyChanged(nameof(HatKeineEintraege)); } /// /// Konstruktor – übernimmt eingeloggten Benutzer, speichert Name für spätere Vergleiche /// und lädt initial die relevanten Einträge. /// public EmployeeTasksViewModel(User benutzer) { _benutzer = benutzer; aktuellerBenutzername = benutzer.Username; controller = new ZeiterfassungsController(); _ = LadeEintraegeAsync(); // asynchrone Initialladung } /// /// Lädt alle offenen Aufgaben für diesen Benutzer (oder wenn er Projektleiter ist). /// Sortiert die Aufgaben nach Enddatum. /// Markiert Aufgaben als „geändert“, wenn sie seit dem letzten Login bearbeitet wurden. /// [RelayCommand] public async Task LadeEintraegeAsync() { // Alle Aufgaben laden (aus Datenbank) var alleEintraege = await Task.Run(() => controller.LadeAlleEintraege()); // Relevante Aufgaben filtern: noch nicht erledigt und betreffen den Benutzer var relevanteEintraege = alleEintraege .Where(e => !e.Erledigt && (e.Mitarbeiter == aktuellerBenutzername || e.Projektleiter == aktuellerBenutzername)) .OrderBy(e => e.Endzeit) .ToList(); // Prüfung, ob Aufgabe nach letztem Login geändert wurde foreach (var eintrag in relevanteEintraege) { eintrag.WurdeSeitLoginBearbeitet = eintrag.LetzteBearbeitung > _benutzer.VorletzterLogin; } // Hinweis anzeigen, wenn Aufgaben seit letztem Login verändert wurden if (relevanteEintraege.Any(e => e.WurdeSeitLoginBearbeitet)) StatusText = "📢 Es wurden Aufgaben seit Ihrem letzten Login geändert."; // Die View wird über `Eintraege` gebunden, daher muss hier neu zugewiesen werden Eintraege = new ObservableCollection(relevanteEintraege); } /// /// Speichert alle Änderungen (Kommentar + Erledigt-Status) der aktuellen Aufgaben. /// Danach wird die Liste neu geladen. /// [RelayCommand] public async Task SpeichereEintraegeAsync() { // Achtung: Diese Methode ruft direkt den Service auf. // Dies könnte in Zukunft auch über den Controller geschehen. foreach (var eintrag in Eintraege) { await Task.Run(() => { var sqlite = new SqliteZeiterfassungsService(); sqlite.UpdateStatusUndKommentarAsync(eintrag.Id, eintrag.Erledigt, eintrag.MitarbeiterKommentar).Wait(); }); } // Rückmeldung anzeigen und Liste aktualisieren StatusText = "✅ Änderungen gespeichert."; await LadeEintraegeAsync(); } }