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

143 lines
5.3 KiB
C#

using System;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
using ChronoFlow.Model;
using ChronoFlow.Persistence;
using ChronoFlow.Security;
namespace ChronoFlow.View
{
/// <summary>
/// UI-Logik zum Hinzufügen neuer Benutzer durch einen Admin.
/// </summary>
public partial class MitarbeiterHinzufuegenView : UserControl
{
public MitarbeiterHinzufuegenView()
{
InitializeComponent();
}
/// <summary>
/// Speichert den eingegebenen Benutzer, wenn alle Pflichtfelder ausgefüllt und der Benutzername noch nicht vergeben ist.
/// </summary>
private void SpeichernButton_Click(object? sender, RoutedEventArgs e)
{
try
{
var service = new SqliteZeiterfassungsService();
string username = UsernameBox.Text?.Trim() ?? "";
string password = PasswordBox.Text?.Trim() ?? "";
string rolle = (RoleBox.SelectedItem as ComboBoxItem)?.Content?.ToString() ?? "";
string mitarbeiternummer = MitarbeiternummerBox.Text?.Trim() ?? "";
string abteilung = AbteilungBox.Text?.Trim() ?? "";
// Validierung: Pflichtfelder
if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password) || string.IsNullOrWhiteSpace(rolle))
{
FeedbackText.Text = "⚠ Bitte alle Pflichtfelder ausfüllen!";
FeedbackText.Foreground = Brushes.Red;
FeedbackText.IsVisible = true;
return;
}
// Verhindern von doppelten Benutzernamen (Case-Insensitive)
if (service.LadeAlleBenutzer().Any(u => u.Username.Equals(username, StringComparison.OrdinalIgnoreCase)))
{
FeedbackText.Text = "❌ Dieser Benutzername ist bereits vergeben.";
FeedbackText.Foreground = Brushes.Red;
FeedbackText.IsVisible = true;
return;
}
// Neuen Benutzer erstellen
var neuerBenutzer = new User
{
Username = username,
Password = PasswordHasher.HashPassword(password),
Role = rolle,
Mitarbeiternummer = mitarbeiternummer,
Abteilung = abteilung,
MussPasswortAendern = true
};
// Speichern in Datenbank
service.ErstelleNeuenBenutzer(neuerBenutzer);
FeedbackText.Text = "✅ Mitarbeiter erfolgreich gespeichert.";
FeedbackText.Foreground = Brushes.Green;
FeedbackText.IsVisible = true;
ClearFields();
}
catch (Exception ex)
{
FeedbackText.Text = $"❌ Fehler: {ex.Message}";
FeedbackText.Foreground = Brushes.Red;
FeedbackText.IsVisible = true;
Console.WriteLine("❌ Ausnahme beim Speichern:\n" + ex);
}
}
/// <summary>
/// Setzt alle Eingabefelder zurück.
/// </summary>
private void ClearFields()
{
UsernameBox.Text = "";
PasswordBox.Text = "";
MitarbeiternummerBox.Text = "";
AbteilungBox.Text = "";
RoleBox.SelectedIndex = -1;
}
/// <summary>
/// Wechselt zurück zum Admin-Hauptfenster.
/// </summary>
private void ZurueckZumDashboard_Click(object? sender, RoutedEventArgs e)
{
if (this.VisualRoot is MainWindow mainWindow)
mainWindow.ShowAdminDashboard();
else
Console.WriteLine("⚠️ MainWindow nicht gefunden!");
}
/// <summary>
/// Erstellt einen zufälligen Test-Mitarbeiter mit dem Passwort "newpassword" (gehasht).
/// </summary>
private void DemoBenutzerErstellen_Click(object? sender, RoutedEventArgs e)
{
var namen = new[] { "Max Mustermann", "Lena Schmidt", "Tobias Becker", "Julia Klein", "Nico Weber" };
var zufallsname = namen[new Random().Next(namen.Length)];
var service = new SqliteZeiterfassungsService();
// Prüfen, ob Name bereits vorhanden ist
if (service.LadeAlleBenutzer().Any(u => u.Username.Equals(zufallsname, StringComparison.OrdinalIgnoreCase)))
{
FeedbackText.Text = "⚠ Demo-Mitarbeiter existiert bereits.";
FeedbackText.Foreground = Brushes.OrangeRed;
FeedbackText.IsVisible = true;
return;
}
// Demo-User erstellen
var demoUser = new User
{
Username = zufallsname,
Password = PasswordHasher.HashPassword("newpassword"),
Role = "Mitarbeiter",
MussPasswortAendern = true
};
service.ErstelleNeuenBenutzer(demoUser);
FeedbackText.Text = $"✅ Demo-Mitarbeiter '{zufallsname}' erstellt (Passwort: newpassword)";
FeedbackText.Foreground = Brushes.Green;
FeedbackText.IsVisible = true;
}
}
}