diff --git a/PMCProjekt/PMCProjekt/Program.cs b/PMCProjekt/PMCProjekt/Program.cs index ade4274..63a4fcb 100644 --- a/PMCProjekt/PMCProjekt/Program.cs +++ b/PMCProjekt/PMCProjekt/Program.cs @@ -1,6 +1,7 @@ using MySql.Data.MySqlClient; using System; using System.IO; +using System.Text.RegularExpressions; namespace PMCProjekt { @@ -8,20 +9,36 @@ namespace PMCProjekt { static void Main(string[] args) { + if (args.Length != 1) + { + Console.WriteLine("Verwendung: PMCProjekt "); + return; + } + + string dateiPfad = args[0]; + + Console.Write("Bitte geben Sie die Kundennummer ein (z.B. K2-002): "); + string kundennummer = Console.ReadLine(); + MySqlConnection myConnection; string myConnectionString; - // Setzen Sie die korrekten Werte für Ihren Server, Benutzer, Passwort und Datenbanknamen + // Verbindung zur Datenbank herstellen myConnectionString = "server=localhost;uid=root;pwd=root;database=import_export"; try { myConnection = new MySqlConnection(myConnectionString); - // Öffnen Sie eine Verbindung myConnection.Open(); - // Datei einlesen - string dateiPfad = "C:/Schule/PMC/import_yutani.csv"; + int clientId = GetClientId(myConnection, kundennummer); + if (clientId == -1) + { + Console.WriteLine("Kundennummer nicht gefunden."); + return; + } + + // Überprüfen, ob die Datei existiert if (File.Exists(dateiPfad)) { using (StreamReader sr = new StreamReader(dateiPfad)) @@ -31,21 +48,60 @@ namespace PMCProjekt { string[] werte = zeile.Split(','); - if (werte.Length == 2) + // Überprüfen, ob mindestens Anrede, Vorname, Nachname und Geburtsdatum vorhanden sind + if (werte.Length >= 4) { - string vorname = werte[0]; - string nachname = werte[1]; + string anrede = werte[0]; + string vorname = werte[1]; + string nachname = werte[2]; + string geburtsdatum = werte[3]; + string adresse = werte.Length > 4 ? werte[4] : null; + string plz = werte.Length > 5 ? werte[5] : null; + string stadt = werte.Length > 6 ? werte[6] : null; + string email = werte.Length > 7 ? werte[7] : null; + string telefonnummern = werte.Length > 8 ? werte[8] : null; - // Verarbeiten der Daten (z.B. Ausgabe) - Console.WriteLine("Vorname: " + vorname + ", Nachname: " + nachname); - - // Daten in die Datenbank einfügen (Beispiel) - string abfrage = "INSERT INTO user (firstname, lastname) VALUES (@vorname, @nachname)"; - using (MySqlCommand myCommand = new MySqlCommand(abfrage, myConnection)) + // Validieren der Benutzerdaten + if (ValidateUser(anrede, vorname, nachname, geburtsdatum, adresse, plz, stadt, email, telefonnummern)) { - myCommand.Parameters.AddWithValue("@vorname", vorname); - myCommand.Parameters.AddWithValue("@nachname", nachname); - myCommand.ExecuteNonQuery(); + // Überprüfen, ob der Benutzer bereits für diesen Kunden existiert + if (!IsUserDuplicate(myConnection, vorname, nachname, clientId)) + { + // Benutzer in die Tabelle "user" einfügen + int userId = InsertUser(myConnection, clientId, anrede, vorname, nachname, geburtsdatum); + + // Adresse in die Tabelle "address" einfügen + if (!string.IsNullOrEmpty(adresse) && !string.IsNullOrEmpty(plz) && !string.IsNullOrEmpty(stadt)) + { + InsertAddress(myConnection, userId, adresse, plz, stadt); + } + + // E-Mail in die Tabelle "email" einfügen + if (!string.IsNullOrEmpty(email)) + { + InsertEmail(myConnection, userId, email); + } + + // Telefonnummern in die Tabelle "phone" einfügen + if (!string.IsNullOrEmpty(telefonnummern)) + { + string[] telefonListe = telefonnummern.Split(';'); + foreach (string telefon in telefonListe) + { + InsertPhone(myConnection, userId, telefon); + } + } + } + else + { + // Protokollierung von Duplikaten + LogInvalidUser(vorname, nachname, "Benutzer ist bereits für diesen Kunden vorhanden"); + } + } + else + { + // Protokollierung von ungültigen Daten + LogInvalidUser(vorname, nachname, "Validierung fehlgeschlagen"); } } } @@ -56,7 +112,6 @@ namespace PMCProjekt Console.WriteLine("Datei nicht gefunden."); } - // Verbindung schließen myConnection.Close(); } catch (MySqlException ex) @@ -64,9 +119,110 @@ namespace PMCProjekt Console.WriteLine("Fehler: " + ex.Message); } } + + // Funktion zur Ermittlung der ClientId anhand der Kundennummer + static int GetClientId(MySqlConnection connection, string clientNumber) + { + string query = "SELECT id FROM client WHERE clientno = @clientNumber"; + using (MySqlCommand cmd = new MySqlCommand(query, connection)) + { + cmd.Parameters.AddWithValue("@clientNumber", clientNumber); + object result = cmd.ExecuteScalar(); + return result != null ? Convert.ToInt32(result) : -1; + } + } + + // Funktion zur Validierung der Benutzerdaten + static bool ValidateUser(string anrede, string vorname, string nachname, string geburtsdatum, string adresse, string plz, string stadt, string email, string telefonnummern) + { + if (!Regex.IsMatch(geburtsdatum, @"^\d{2}\.\d{2}\.\d{4}$")) return false; + if (!string.IsNullOrEmpty(email) && !Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$")) return false; + if (!string.IsNullOrEmpty(plz) && !Regex.IsMatch(plz, @"^\d{5}$")) return false; + if (!string.IsNullOrEmpty(telefonnummern)) + { + string[] telefonListe = telefonnummern.Split(';'); + foreach (string telefon in telefonListe) + { + if (!Regex.IsMatch(telefon, @"^\d{3,5}-\d{4,10}$")) return false; + } + } + return true; + } + + // Funktion zur Überprüfung von Duplikaten + static bool IsUserDuplicate(MySqlConnection connection, string vorname, string nachname, int clientId) + { + string query = "SELECT COUNT(*) FROM user WHERE firstname = @vorname AND lastname = @nachname AND clientId = @clientId"; + using (MySqlCommand cmd = new MySqlCommand(query, connection)) + { + cmd.Parameters.AddWithValue("@vorname", vorname); + cmd.Parameters.AddWithValue("@nachname", nachname); + cmd.Parameters.AddWithValue("@clientId", clientId); + return Convert.ToInt32(cmd.ExecuteScalar()) > 0; + } + } + + // Funktion zum Einfügen eines Benutzers + static int InsertUser(MySqlConnection connection, int clientId, string anrede, string vorname, string nachname, string geburtsdatum) + { + string query = "INSERT INTO user (clientId, firstname, lastname, birthdate) VALUES (@clientId, @vorname, @nachname, @geburtsdatum)"; + using (MySqlCommand cmd = new MySqlCommand(query, connection)) + { + cmd.Parameters.AddWithValue("@clientId", clientId); + cmd.Parameters.AddWithValue("@vorname", vorname); + cmd.Parameters.AddWithValue("@nachname", nachname); + cmd.Parameters.AddWithValue("@geburtsdatum", DateTime.ParseExact(geburtsdatum, "dd.MM.yyyy", null)); + cmd.ExecuteNonQuery(); + return (int)cmd.LastInsertedId; + } + } + + // Funktion zum Einfügen einer Adresse + static void InsertAddress(MySqlConnection connection, int userId, string adresse, string plz, string stadt) + { + string query = "INSERT INTO address (userId, address, postalcode, city) VALUES (@userId, @adresse, @plz, @stadt)"; + using (MySqlCommand cmd = new MySqlCommand(query, connection)) + { + cmd.Parameters.AddWithValue("@userId", userId); + cmd.Parameters.AddWithValue("@adresse", adresse); + cmd.Parameters.AddWithValue("@plz", plz); + cmd.Parameters.AddWithValue("@stadt", stadt); + cmd.ExecuteNonQuery(); + } + } + + // Funktion zum Einfügen einer E-Mail + static void InsertEmail(MySqlConnection connection, int userId, string email) + { + string query = "INSERT INTO email (userId, email) VALUES (@userId, @Email)"; + using (MySqlCommand cmd = new MySqlCommand(query, connection)) + { + cmd.Parameters.AddWithValue("@userId", userId); + cmd.Parameters.AddWithValue("@Email", email); + cmd.ExecuteNonQuery(); + } + } + + // Funktion zum Einfügen einer Telefonnummer + static void InsertPhone(MySqlConnection connection, int userId, string telefonnummer) + { + string query = "INSERT INTO phone (userId, phonenumber) VALUES (@userId, @telefonnummer)"; + using (MySqlCommand cmd = new MySqlCommand(query, connection)) + { + cmd.Parameters.AddWithValue("@userId", userId); + cmd.Parameters.AddWithValue("@telefonnummer", telefonnummer); + cmd.ExecuteNonQuery(); + } + } + + // Funktion zur Protokollierung von ungültigen Benutzerdaten + static void LogInvalidUser(string vorname, string nachname, string grund) + { + string logPath = "invalid_users.log"; + using (StreamWriter sw = File.AppendText(logPath)) + { + sw.WriteLine($"{DateTime.Now}: {vorname} {nachname} - {grund}"); + } + } } } - -} - - \ No newline at end of file