108 lines
4.3 KiB
C#
108 lines
4.3 KiB
C#
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();
|
||
}
|
||
}
|