118 lines
4.4 KiB
C#
118 lines
4.4 KiB
C#
// 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
|
||
{
|
||
/// <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
|
||
{
|
||
// 🧑💼 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<Zeiteintrag> 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;
|
||
|
||
/// <summary>
|
||
/// Diese Methode wird automatisch aufgerufen, wenn sich die Einträge ändern.
|
||
/// Damit wird die UI über die Änderung von 'HatKeineEintraege' informiert.
|
||
/// </summary>
|
||
partial void OnEintraegeChanged(ObservableCollection<Zeiteintrag>? oldValue, ObservableCollection<Zeiteintrag> newValue)
|
||
{
|
||
OnPropertyChanged(nameof(HatKeineEintraege));
|
||
}
|
||
|
||
/// <summary>
|
||
/// Konstruktor: Bekommt den eingeloggten Benutzer und das Repository.
|
||
/// Lädt automatisch alle offenen Einträge für diesen Benutzer.
|
||
/// </summary>
|
||
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();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 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.
|
||
/// </summary>
|
||
[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<Zeiteintrag>(offene);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Speichert alle Änderungen an den sichtbaren Einträgen
|
||
/// (Status 'erledigt' + Mitarbeiter-Kommentar).
|
||
/// Danach wird die Liste automatisch neu geladen.
|
||
/// </summary>
|
||
[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();
|
||
}
|
||
}
|
||
}
|