// TestKommentar 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.View.Mitarbeiter; namespace ChronoFlow.View.Mitarbeiter { /// /// ViewModel für die Mitarbeiter-Aufgabenansicht. /// Enthält alle Aufgaben für den eingeloggten Benutzer und erlaubt das Speichern von Änderungen. /// public partial class EmployeeTasksViewModel : ObservableObject { // 🧑‍💼 Der aktuell eingeloggte Benutzer (Mitarbeiter) private readonly User _benutzer; // 💾 Zugriff auf die Datenbank-Funktionen (SQL-Repository) private readonly IZeiterfassungsRepository _repository; // 📛 Einfacher Zugriff auf den Benutzernamen (spart Schreibarbeit) private readonly string aktuellerBenutzername; // 📋 Alle Zeiteinträge, die dem Benutzer angezeigt werden [ObservableProperty] private ObservableCollection eintraege = new(); // 💬 Statusmeldung unten im Fenster (z. B. bei Erfolg) [ObservableProperty] private string? statusText; // ✅ Hilfs-Property, die sagt: "Gibt es keine Einträge?" public bool HatKeineEintraege => Eintraege.Count == 0; /// /// Diese Methode wird automatisch aufgerufen, wenn sich die Einträge ändern. /// Damit wird die UI über die Änderung von 'HatKeineEintraege' informiert. /// partial void OnEintraegeChanged(ObservableCollection? oldValue, ObservableCollection newValue) { OnPropertyChanged(nameof(HatKeineEintraege)); } /// /// Konstruktor: Bekommt den eingeloggten Benutzer und das Repository. /// Lädt automatisch alle offenen Einträge für diesen Benutzer. /// public EmployeeTasksViewModel(User benutzer, IZeiterfassungsRepository repository) { _benutzer = benutzer; _repository = repository; aktuellerBenutzername = benutzer.Username; Console.WriteLine($"[DEBUG] ViewModel erstellt für Benutzer: {aktuellerBenutzername}"); // Daten automatisch beim Öffnen laden _ = LadeEintraegeAsync(); } /// /// Lädt alle offenen Einträge für den aktuell eingeloggten Mitarbeiter. /// Sortiert nach Fälligkeitsdatum (Endzeit). /// Erkennt auch, ob seit dem letzten Login Änderungen gemacht wurden. /// [RelayCommand] public async Task LadeEintraegeAsync() { var eintraegeAusDb = await _repository.GetEintraegeFuerMitarbeiterAsync(aktuellerBenutzername); var offene = eintraegeAusDb .Where(e => !e.Erledigt) .OrderBy(e => e.Endzeit) .ToList(); // 🔔 Markiere geänderte Einträge seit dem letzten Login foreach (var eintrag in offene) { eintrag.WurdeSeitLoginBearbeitet = eintrag.LetzteBearbeitung > _benutzer.VorletzterLogin; } // 🔔 Zeige Hinweis, wenn neue Änderungen vorhanden sind if (offene.Any(e => e.WurdeSeitLoginBearbeitet)) StatusText = "📢 Es wurden Aufgaben seit Ihrem letzten Login geändert."; // 🔄 Aktualisiere ObservableCollection für UI Eintraege = new ObservableCollection(offene); } /// /// Speichert alle Änderungen an den sichtbaren Einträgen /// (Status 'erledigt' + Mitarbeiter-Kommentar). /// Danach wird die Liste automatisch neu geladen. /// [RelayCommand] public async Task SpeichereEintraegeAsync() { foreach (var eintrag in Eintraege) { await _repository.UpdateStatusUndKommentarAsync( eintrag.Id, eintrag.Erledigt, eintrag.MitarbeiterKommentar ); } StatusText = "✅ Änderungen gespeichert."; // 🔄 Nach dem Speichern direkt neu laden await LadeEintraegeAsync(); } } }