ChronoFlow/ChronoFlow.View/Mitarbeiter/EmployeeTasksViewModel.cs
2025-06-29 17:50:02 +02:00

108 lines
4.3 KiB
C#
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
/// <summary>
/// ViewModel für die Aufgabenansicht eines Mitarbeiters.
/// Lädt relevante Aufgaben (nicht erledigt) und ermöglicht das Speichern von Kommentaren und Bearbeitungsstatus.
/// </summary>
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<Zeiteintrag> 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<Zeiteintrag>? oldValue, ObservableCollection<Zeiteintrag> newValue)
{
OnPropertyChanged(nameof(HatKeineEintraege));
}
/// <summary>
/// Konstruktor übernimmt eingeloggten Benutzer, speichert Name für spätere Vergleiche
/// und lädt initial die relevanten Einträge.
/// </summary>
public EmployeeTasksViewModel(User benutzer)
{
_benutzer = benutzer;
aktuellerBenutzername = benutzer.Username;
controller = new ZeiterfassungsController();
_ = LadeEintraegeAsync(); // asynchrone Initialladung
}
/// <summary>
/// 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.
/// </summary>
[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<Zeiteintrag>(relevanteEintraege);
}
/// <summary>
/// Speichert alle Änderungen (Kommentar + Erledigt-Status) der aktuellen Aufgaben.
/// Danach wird die Liste neu geladen.
/// </summary>
[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();
}
}