ChronoFlow/ChronoFlow.Persistence/SqliteZeiterfassungsService.cs
2025-04-27 21:28:33 +02:00

185 lines
6.4 KiB
C#

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<Zeiteintrag> LadeAlleZeiteintraege()
{
var eintraege = new List<Zeiteintrag>();
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<string> LadeAlleMitarbeiterNamen()
{
var namen = new List<string>();
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<User> LadeAlleBenutzer()
{
var benutzerListe = new List<User>();
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<string> LadeAlleBenutzernamen()
{
var benutzernamen = new List<string>();
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;
}
}
}