ChronoFlow/ChronoFlow.View/Mitarbeiter/EmployeeTasksViewModel.cs
2025-06-28 14:27:18 +02:00

92 lines
3.0 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 Mitarbeiter-Aufgabenansicht.
/// Enthält alle Aufgaben für den eingeloggten Benutzer und erlaubt das Speichern von Änderungen.
/// </summary>
public partial class EmployeeTasksViewModel : ObservableObject
{
private readonly User _benutzer;
private readonly ZeiterfassungsController controller = new();
private readonly string aktuellerBenutzername;
[ObservableProperty]
private ObservableCollection<Zeiteintrag> eintraege = new();
[ObservableProperty]
private string? statusText;
public bool HatKeineEintraege => Eintraege.Count == 0;
partial void OnEintraegeChanged(ObservableCollection<Zeiteintrag>? oldValue, ObservableCollection<Zeiteintrag> newValue)
{
OnPropertyChanged(nameof(HatKeineEintraege));
}
public EmployeeTasksViewModel(User benutzer)
{
_benutzer = benutzer;
aktuellerBenutzername = benutzer.Username;
controller = new ZeiterfassungsController(); // falls du das oben nicht hast
_ = LadeEintraegeAsync();
}
[RelayCommand]
public async Task LadeEintraegeAsync()
{
// 🔄 Einträge synchron laden, aber async verpacken
var alleEintraege = await Task.Run(() => controller.LadeAlleEintraege());
var relevanteEintraege = alleEintraege
.Where(e => !e.Erledigt &&
(e.Mitarbeiter == aktuellerBenutzername || e.Projektleiter == aktuellerBenutzername))
.OrderBy(e => e.Endzeit)
.ToList();
foreach (var eintrag in relevanteEintraege)
{
eintrag.WurdeSeitLoginBearbeitet = eintrag.LetzteBearbeitung > _benutzer.VorletzterLogin;
}
if (relevanteEintraege.Any(e => e.WurdeSeitLoginBearbeitet))
StatusText = "📢 Es wurden Aufgaben seit Ihrem letzten Login geändert.";
Eintraege = new ObservableCollection<Zeiteintrag>(relevanteEintraege);
}
[RelayCommand]
public async Task SpeichereEintraegeAsync()
{
// Achtung: Hier verwendest du noch das Repository, obwohl du oben mit dem Controller arbeitest.
// Du kannst entweder:
// A) Das Repository auch im ViewModel übergeben
// B) Die Methode UpdateStatusUndKommentarAsync auch in den Controller packen
foreach (var eintrag in Eintraege)
{
await Task.Run(() =>
{
var sqlite = new SqliteZeiterfassungsService();
sqlite.UpdateStatusUndKommentarAsync(eintrag.Id, eintrag.Erledigt, eintrag.MitarbeiterKommentar).Wait();
});
}
StatusText = "✅ Änderungen gespeichert.";
await LadeEintraegeAsync();
}
}