using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; using Microsoft.Data.Sqlite; using ChronoFlow.Model; namespace ChronoFlow.Persistence { public class SqliteZeiterfassungsService { private readonly string _dbPath = "chrono_data_v2.sb"; public SqliteZeiterfassungsService() { // Prüfe, ob die DB existiert, sonst erstelle sie if (!File.Exists(_dbPath)) ErstelleDatenbank(); } private void ErstelleDatenbank() { Console.WriteLine("🛠️ ErstelleDatenbank wurde aufgerufen!"); using var connection = new SqliteConnection($"Data Source={_dbPath}"); connection.Open(); var cmd1 = connection.CreateCommand(); cmd1.CommandText = @" CREATE TABLE IF NOT EXISTS Zeiteintraege ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Mitarbeiter TEXT NOT NULL, Startzeit TEXT NOT NULL, Endzeit TEXT NOT NULL, Projekt TEXT, Kommentar TEXT, Erledigt INTEGER, MitarbeiterKommentar TEXT );"; cmd1.ExecuteNonQuery(); var cmd2 = connection.CreateCommand(); cmd2.CommandText = @" CREATE TABLE IF NOT EXISTS Benutzer ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Username TEXT NOT NULL, Password TEXT NOT NULL, Role TEXT NOT NULL, Mitarbeiternummer TEXT, Abteilung TEXT );"; cmd2.ExecuteNonQuery(); } public void SpeichereEintrag(Zeiteintrag eintrag) { using var connection = new SqliteConnection($"Data Source={_dbPath}"); connection.Open(); var cmd = connection.CreateCommand(); cmd.CommandText = @" INSERT INTO Zeiteintraege (Mitarbeiter, Startzeit, Endzeit, Projekt, Kommentar, Erledigt, MitarbeiterKommentar) VALUES ($Mitarbeiter, $Startzeit, $Endzeit, $Projekt, $Kommentar, $Erledigt, $MitarbeiterKommentar); "; cmd.Parameters.AddWithValue("$Mitarbeiter", eintrag.Mitarbeiter); cmd.Parameters.AddWithValue("$Startzeit", eintrag.Startzeit.ToString("o")); cmd.Parameters.AddWithValue("$Endzeit", eintrag.Endzeit.ToString("o")); cmd.Parameters.AddWithValue("$Projekt", eintrag.Projekt ?? ""); cmd.Parameters.AddWithValue("$Kommentar", eintrag.Kommentar ?? ""); cmd.Parameters.AddWithValue("$Erledigt", eintrag.Erledigt ? 1 : 0); cmd.Parameters.AddWithValue("$MitarbeiterKommentar", eintrag.MitarbeiterKommentar ?? ""); cmd.ExecuteNonQuery(); } public List LadeAlleZeiteintraege() { var eintraege = new List(); using var connection = new SqliteConnection($"Data Source={_dbPath}"); connection.Open(); var cmd = connection.CreateCommand(); cmd.CommandText = "SELECT * FROM Zeiteintraege;"; using var reader = cmd.ExecuteReader(); while (reader.Read()) { eintraege.Add(new Zeiteintrag { Mitarbeiter = reader.GetString(1), Startzeit = DateTime.Parse(reader.GetString(2)), Endzeit = DateTime.Parse(reader.GetString(3)), Projekt = reader.GetString(4), Kommentar = reader.GetString(5), Erledigt = Convert.ToInt32(reader["Erledigt"]) == 1, MitarbeiterKommentar = reader.GetString(7) }); } return eintraege; } public List LadeAlleMitarbeiterNamen() { var namen = new List(); using var connection = new SqliteConnection($"Data Source={_dbPath}"); connection.Open(); var cmd = connection.CreateCommand(); cmd.CommandText = "SELECT Username From Benutzer Where Role = 'Mitarbeiter';"; using var reader = cmd.ExecuteReader(); while (reader.Read()) { namen.Add(reader.GetString(0)); } return namen; } public List LadeAlleBenutzer() { var benutzerListe = new List(); using var connection = new SqliteConnection($"Data Source={_dbPath}"); connection.Open(); var cmd = connection.CreateCommand(); cmd.CommandText = "SELECT Username, Password, Role, Mitarbeiternummer, Abteilung FROM Benutzer;"; using var reader = cmd.ExecuteReader(); while (reader.Read()) { benutzerListe.Add(new User { Username = reader.GetString(0), Password = reader.GetString(1), Role = reader.GetString(2), Mitarbeiternummer = reader.IsDBNull(3) ? "" : reader.GetString(3), Abteilung = reader.IsDBNull(4) ? "" : reader.GetString(4) }); } return benutzerListe; } public void ErstelleStandardAdmin() { using var connection = new SqliteConnection($"Data Source={_dbPath}"); connection.Open(); var cmd = connection.CreateCommand(); cmd.CommandText = @" INSERT INTO Benutzer (Username, Password, Role, Mitarbeiternummer, Abteilung) VALUES ('admin', 'admin', 'Admin', '0001', 'IT'); "; cmd.ExecuteNonQuery(); Console.WriteLine("✅ Standard-Admin erfolgreich eingefügt."); } public List LadeAlleBenutzernamen() { var benutzernamen = new List(); using var connection = new SqliteConnection($"Data Source={_dbPath}"); connection.Open(); using var cmd = connection.CreateCommand();//<--- Wir erstellen cmd cmd.CommandText = "SELECT Username From Benutzer;"; using var reader = cmd.ExecuteReader(); while (reader.Read()) { benutzernamen.Add(reader.GetString(0)); } return benutzernamen; } } }