From b617d39c8febe2047c6d15d534b0d18ab63f4608 Mon Sep 17 00:00:00 2001 From: ViperioN1339 Date: Sat, 21 Jun 2025 11:32:41 +0200 Subject: [PATCH] last changes --- .idea/.idea.ChronoFlow/.idea/avalonia.xml | 1 + ChronoFlow.Model/User.cs | 1 + ChronoFlow.Model/Zeiteintrag.cs | 3 + .../SqliteZeiterfassungsService.cs | 62 +++++++++------ ChronoFlow.View/Admin/AdminMainView.axaml | 78 +++++++------------ ChronoFlow.View/Admin/AdminMainView.axaml.cs | 18 +---- .../Admin/MitarbeiterBearbeitenDialog.axaml | 5 +- .../Admin/ProjektBearbeitenDialog.axaml | 4 +- .../Admin/ProjektErstellenView.axaml | 6 +- ChronoFlow.View/App.axaml | 11 ++- ChronoFlow.View/ChronoFlow.View.csproj | 3 + .../Converter/BoolToBrushConverter.cs | 24 ++++++ ChronoFlow.View/LoginWindow.axaml.cs | 2 + ChronoFlow.View/MainWindow.axaml | 11 ++- ChronoFlow.View/MainWindow.axaml.cs | 11 ++- .../Mitarbeiter/EmployeeTasksView.axaml | 59 +++++++++----- .../Mitarbeiter/EmployeeTasksView.axaml.cs | 10 +-- .../EmployeeTasksViewModel.axaml.cs | 67 +++++++++++----- .../MitarbeiterHinzufuegenView.axaml | 4 +- 19 files changed, 236 insertions(+), 144 deletions(-) create mode 100644 ChronoFlow.View/Converter/BoolToBrushConverter.cs diff --git a/.idea/.idea.ChronoFlow/.idea/avalonia.xml b/.idea/.idea.ChronoFlow/.idea/avalonia.xml index 9932faa..b21e8d0 100644 --- a/.idea/.idea.ChronoFlow/.idea/avalonia.xml +++ b/.idea/.idea.ChronoFlow/.idea/avalonia.xml @@ -6,6 +6,7 @@ + diff --git a/ChronoFlow.Model/User.cs b/ChronoFlow.Model/User.cs index e42e874..8d2e916 100644 --- a/ChronoFlow.Model/User.cs +++ b/ChronoFlow.Model/User.cs @@ -22,5 +22,6 @@ namespace ChronoFlow.Model Abteilung = ""; OriginalUsername = ""; } + public DateTime LetzterLogin { get; set; } = DateTime.MinValue; } } \ No newline at end of file diff --git a/ChronoFlow.Model/Zeiteintrag.cs b/ChronoFlow.Model/Zeiteintrag.cs index aaf11bb..410080d 100644 --- a/ChronoFlow.Model/Zeiteintrag.cs +++ b/ChronoFlow.Model/Zeiteintrag.cs @@ -37,5 +37,8 @@ namespace ChronoFlow.Model return "Green"; } } + public DateTime LetzteBearbeitung { get; set; } + public bool IstNeu { get; set; } // wird im ViewModel gesetzt + public bool WurdeSeitLoginBearbeitet { get; set; } } } \ No newline at end of file diff --git a/ChronoFlow.Persistence/SqliteZeiterfassungsService.cs b/ChronoFlow.Persistence/SqliteZeiterfassungsService.cs index 3fa80eb..18f8cf3 100644 --- a/ChronoFlow.Persistence/SqliteZeiterfassungsService.cs +++ b/ChronoFlow.Persistence/SqliteZeiterfassungsService.cs @@ -92,6 +92,7 @@ namespace ChronoFlow.Persistence AddColumnIfMissing(connection, "Benutzer", "Mitarbeitennummer", "TEXT"); AddColumnIfMissing(connection, "Benutzer", "Abteilung", "TEXT"); AddColumnIfMissing(connection, "Benutzer", "MussPasswortAendern", "INTEGER DEFAULT 1"); + AddColumnIfMissing(connection, "Zeiteintraege", "LetzteBearbeitung", "TEXT"); } private void AddColumnIfMissing(SqliteConnection connection, string tableName, string columnName, string columnType) @@ -247,9 +248,10 @@ namespace ChronoFlow.Persistence var cmd = connection.CreateCommand(); cmd.CommandText = @" INSERT INTO Zeiteintraege - (Mitarbeiter, Startzeit, Endzeit, Projekt, Kommentar, Erledigt, MitarbeiterKommentar) - VALUES ($Mitarbeiter, $Startzeit, $Endzeit, $Projekt, $Kommentar, $Erledigt, $MitarbeiterKommentar); - "; +(Mitarbeiter, Startzeit, Endzeit, Projekt, Kommentar, Erledigt, MitarbeiterKommentar, LetzteBearbeitung) +VALUES +($Mitarbeiter, $Startzeit, $Endzeit, $Projekt, $Kommentar, $Erledigt, $MitarbeiterKommentar, $LetzteBearbeitung);"; + cmd.Parameters.AddWithValue("$Mitarbeiter", eintrag.Mitarbeiter); cmd.Parameters.AddWithValue("$Startzeit", eintrag.Startzeit.ToString("o")); @@ -258,6 +260,7 @@ namespace ChronoFlow.Persistence cmd.Parameters.AddWithValue("$Kommentar", eintrag.Kommentar ?? ""); cmd.Parameters.AddWithValue("$Erledigt", eintrag.Erledigt ? 1 : 0); cmd.Parameters.AddWithValue("$MitarbeiterKommentar", eintrag.MitarbeiterKommentar ?? ""); + cmd.Parameters.AddWithValue("$LetzteBearbeitung", DateTime.Now.ToString("o")); cmd.ExecuteNonQuery(); @@ -302,13 +305,13 @@ namespace ChronoFlow.Persistence cmd.CommandText = @" UPDATE Zeiteintraege SET Projekt = $Projekt, - Kommentar = $Kommentar, - Startzeit = $Startzeit, - Endzeit = $Endzeit, - Mitarbeiter = $Mitarbeiter, - Erledigt = $Erledigt - WHERE Id = $Id; - "; + Kommentar = $Kommentar, + Startzeit = $Startzeit, + Endzeit = $Endzeit, + Mitarbeiter = $Mitarbeiter, + Erledigt = $Erledigt, + LetzteBearbeitung = $LetzteBearbeitung + WHERE Id = $Id;"; cmd.Parameters.AddWithValue("$Projekt", projekt.Projekt); cmd.Parameters.AddWithValue("$Kommentar", projekt.Kommentar ?? ""); @@ -317,6 +320,7 @@ namespace ChronoFlow.Persistence cmd.Parameters.AddWithValue("$Mitarbeiter", projekt.Mitarbeiter); cmd.Parameters.AddWithValue("$Erledigt", projekt.Erledigt ? 1 : 0); cmd.Parameters.AddWithValue("$Id", projekt.Id); + cmd.Parameters.AddWithValue("$LetzteBearbeitung", DateTime.Now.ToString("o")); int rowsAffected = cmd.ExecuteNonQuery(); Console.WriteLine($"✏ Projekt aktualisiert (Id={projekt.Id}, Rows affected: {rowsAffected})"); @@ -464,34 +468,39 @@ namespace ChronoFlow.Persistence Console.WriteLine($"🔒 Passwort für Benutzer '{username}' zurückgesetzt (Rows affected: {rowsAffected})"); } - public async Task> GetEintraegeFuerMitarbeiterAsync(string mitarbeiterName) + public async Task> GetEintraegeFuerMitarbeiterAsync(string name) { var eintraege = new List(); + using var connection = new SqliteConnection($"Data Source={_dbPath}"); await connection.OpenAsync(); var cmd = connection.CreateCommand(); cmd.CommandText = @" - SELECT * FROM Zeiteintraege - WHERE Mitarbeiter = $Mitarbeiter; - "; - cmd.Parameters.AddWithValue("$Mitarbeiter", mitarbeiterName); + SELECT Id, Mitarbeiter, Startzeit, Endzeit, Projekt, Kommentar, Erledigt, MitarbeiterKommentar, LetzteBearbeitung + FROM Zeiteintraege + WHERE Mitarbeiter = $Name; + "; + cmd.Parameters.AddWithValue("$Name", name); using var reader = await cmd.ExecuteReaderAsync(); + while (await reader.ReadAsync()) { eintraege.Add(new Zeiteintrag { Id = reader.GetInt32(0), Mitarbeiter = reader.GetString(1), - Startzeit = DateTime.Parse(reader.GetString(2)), - Endzeit = DateTime.Parse(reader.GetString(3)), + Startzeit = reader.GetDateTime(2), + Endzeit = reader.GetDateTime(3), Projekt = reader.GetString(4), Kommentar = reader.GetString(5), - Erledigt = Convert.ToInt32(reader["Erledigt"]) == 1, - MitarbeiterKommentar = reader.GetString(7) + Erledigt = reader.GetBoolean(6), + MitarbeiterKommentar = reader.GetString(7), + LetzteBearbeitung = reader.IsDBNull(8) ? DateTime.MinValue : reader.GetDateTime(8) }); } + return eintraege; } @@ -502,19 +511,22 @@ namespace ChronoFlow.Persistence var cmd = connection.CreateCommand(); cmd.CommandText = @" - UPDATE Zeiteintraege - SET Erledigt = $Erledigt, - MitarbeiterKommentar = $Kommentar - WHERE Id = $Id; - "; + UPDATE Zeiteintraege + SET Erledigt = $Erledigt, + MitarbeiterKommentar = $Kommentar, + LetzteBearbeitung = $Bearbeitet + WHERE Id = $Id; +"; cmd.Parameters.AddWithValue("$Erledigt", erledigt ? 1 : 0); cmd.Parameters.AddWithValue("$Kommentar", mitarbeiterKommentar ?? ""); + cmd.Parameters.AddWithValue("$Bearbeitet", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); cmd.Parameters.AddWithValue("$Id", id); int rowsAffected = await cmd.ExecuteNonQueryAsync(); - Console.WriteLine($"✏ Zeiteintrag (Id={id}) aktualisiert: erledigt={erledigt}, kommentar gesetzt."); + Console.WriteLine($"✏ Zeiteintrag (Id={id}) aktualisiert: erledigt={erledigt}, LetzteBearbeitung gesetzt."); } + } } \ No newline at end of file diff --git a/ChronoFlow.View/Admin/AdminMainView.axaml b/ChronoFlow.View/Admin/AdminMainView.axaml index c58b125..77f9785 100644 --- a/ChronoFlow.View/Admin/AdminMainView.axaml +++ b/ChronoFlow.View/Admin/AdminMainView.axaml @@ -3,57 +3,37 @@ xmlns:model="clr-namespace:ChronoFlow.Model;assembly=ChronoFlow.Model" x:Class="ChronoFlow.View.Admin.AdminMainView"> - + + + +