diff --git a/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/DesignTimeBuild/.dtbcache.v2 b/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/DesignTimeBuild/.dtbcache.v2 index 632585d..feac31f 100644 Binary files a/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/DesignTimeBuild/.dtbcache.v2 and b/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/DesignTimeBuild/.dtbcache.v2 differ diff --git a/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/.suo b/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/.suo index c041972..e835f05 100644 Binary files a/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/.suo and b/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/.suo differ diff --git a/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/DocumentLayout.json b/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/DocumentLayout.json index 463be7f..45b5883 100644 --- a/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/DocumentLayout.json +++ b/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/DocumentLayout.json @@ -1,37 +1,12 @@ { "Version": 1, "WorkspaceRootPath": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\", - "Documents": [ - { - "AbsoluteMoniker": "D:0:0:{44DD7752-6BB5-4C3A-9053-671D8ADE49C4}|Projekt_Calcan_Conze\\Projekt_Calcan_Conze.csproj|c:\\jan_bib_module\\pmc\\projekt\\projekt_calcan_conze\\projekt_calcan_conze\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{44DD7752-6BB5-4C3A-9053-671D8ADE49C4}|Projekt_Calcan_Conze\\Projekt_Calcan_Conze.csproj|solutionrelative:projekt_calcan_conze\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - } - ], + "Documents": [], "DocumentGroupContainers": [ { "Orientation": 0, "VerticalTabListWidth": 256, - "DocumentGroups": [ - { - "DockedWidth": 200, - "SelectedChildIndex": 0, - "Children": [ - { - "$type": "Document", - "DocumentIndex": 0, - "Title": "Program.cs", - "DocumentMoniker": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze\\Program.cs", - "RelativeDocumentMoniker": "Projekt_Calcan_Conze\\Program.cs", - "ToolTip": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze\\Program.cs", - "RelativeToolTip": "Projekt_Calcan_Conze\\Program.cs", - "ViewState": "AQIAAFIAAAAAAAAAAAAqwGAAAABAAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-05-24T09:06:25.212Z", - "EditorCaption": "" - } - ] - } - ] + "DocumentGroups": [] } ] } \ No newline at end of file diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Program.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Program.cs deleted file mode 100644 index 7946144..0000000 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Program.cs +++ /dev/null @@ -1,366 +0,0 @@ -//Aufgabenstellung -// -//1.Import -// -//Als Teil des Entwicklungsteams sollen Sie einen Import für neue Nutzer der jeweiligen Kunden entwickeln. -//Die Kunden schicken zu diesem Zweck CSV-Dateien mit den Daten von neuen Nutzern. -//Diese Daten müssen in die bestehenden Datentabellen eingespielt werden. -//Dafür sind folgende Anforderungen formuliert: -// -// • Ein Sachbearbeiter ruft eine Konsolen-App auf, in welcher er die Datei und die -// Kundennummer des Kunden als Parameter übergibt: Die Beispieldatei hat den Namen "import_yutani.csv" und -// gehört zum Kunden mit der Nummer "K2-002" -// -// • Die Datei hat den Aufbau: -// - Ein Nutzer mit Anrede, Vorname, Nachname und Geburtsdatum -// - Ggf. Adresse: Straße mit Hausnummer, PLZ, Stadt -// - Ggf. E-Mail -// - Ggf. eine oder mehrere Telefonnummern: Vorwahl ohne führende 0 und Nummer -// -// • Ein Nutzer darf für einen Kunden nicht mehrmals importiert werden. -// -// • Die Daten sollen wie folgt validiert werden: -// ○ Geburtsdatum: TT.MM.JJJJ -// ○ Valide E-Mail-Adresse -// ○ PLZ: exakt 5 Nummern -// ○ Telefonnummer 3 bis 5 Nummern für die Vorwahl und 4 bis 10 Nummern für die Hauptnummer. Keine Sonderzeichen -// -// • Nicht valide Datensätze von Nutzern sollen in einem Protokoll erfasst werden, ebenso bereits vorhandene Nutzer. -// Der komplette Datensatz eines Nutzers darf dann nicht importiert werden - - - -/* Das hier wäre eine Lösungsvariante. Diese beruht auf den vorhandenen Daten - * - * Anmerkungen: - * Passe den Pfad zur CSV-Datei (filePath) an. - * Stelle sicher, dass deine Datenbankverbindung (myConnectionString) korrekt ist. - * Die Tabellenstruktur in deiner MySQL-Datenbank sollte mit den Feldern im Code übereinstimmen. - * -*/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text.RegularExpressions; -using MySql.Data.MySqlClient; - -class Program -{ - static void Main(string[] args) - { - // Verbindungszeichenfolge zur MySQL-Datenbank - string myConnectionString = "server=localhost;uid=root;pwd=root;database=import_export"; - - // Willkommensnachricht und Eingabeaufforderung für Kundennummer und Dateiparameter - Console.WriteLine("Willkommen"); - Console.Write("Bitte geben Sie nun die Kundennummer ein: "); - string kundennummer = Console.ReadLine(); - Console.Write("Bitte geben Sie die Datei-Parameter ein: "); - string dateiBezeichnung = Console.ReadLine(); - - // Vollständiger Pfad zur CSV-Datei - string filePath = "path/to/your/" + dateiBezeichnung; // Passe den Pfad zur CSV-Datei an - - // Überprüfen, ob die Datei existiert - if (!File.Exists(filePath)) - { - Console.WriteLine("Die Datei-Parameter konnten nicht gefunden werden. Bitte versuche es erneut"); - return; - } - - // Listen für ungültige und vorhandene Einträge - List invalidEntries = new List(); - List existingEntries = new List(); - - // Einlesen der CSV-Datei und Verarbeitung der Daten - string[] lines = File.ReadAllLines(filePath); - List users = ParseCsv(lines, invalidEntries); - - // Verbindung zur MySQL-Datenbank öffnen - using (MySqlConnection myConnection = new MySqlConnection(myConnectionString)) - { - myConnection.Open(); - - // Für jeden Nutzer aus der CSV-Datei überprüfen und einfügen - foreach (User user in users) - { - // Überprüfen, ob der Nutzer bereits existiert - if (UserExists(myConnection, user, kundennummer)) - { - existingEntries.Add($"{user.Firstname} {user.Lastname}, {user.Email}"); - continue; - } - - // Nutzer einfügen, wenn er nicht existiert - InsertUser(myConnection, user, kundennummer); - } - } - - // Ungültige und vorhandene Einträge protokollieren - LogEntries("invalid_entries.log", invalidEntries); - LogEntries("existing_entries.log", existingEntries); - - // Import abgeschlossen - Console.WriteLine("Import abgeschlossen."); - } - - // Methode zum Parsen der CSV-Datei - static List ParseCsv(string[] lines, List invalidEntries) - { - List users = new List(); - User currentUser = null; - - // Zeilen der CSV-Datei durchgehen - foreach (string line in lines) - { - string[] parts = line.Split(';'); - - // Beginn eines neuen Nutzers (Herr/Frau) - if (parts[0] == "Herr" || parts[0] == "Frau") - { - // Vorherigen Nutzer zur Liste hinzufügen, wenn vorhanden - if (currentUser != null) - { - users.Add(currentUser); - } - // Neuen Nutzer erstellen - currentUser = new User - { - Gender = parts[0], - Firstname = parts[1], - Lastname = parts[2], - Birthdate = parts[3] - }; - continue; - } - - // Adresse des aktuellen Nutzers einlesen - if (parts[0] == "Adresse" && currentUser != null) - { - currentUser.Address = new Address - { - Street = parts[1], - PostalCode = parts[2], - City = parts[3] - }; - continue; - } - - // E-Mail-Adresse des aktuellen Nutzers einlesen und validieren - if (parts[0] == "E-Mail" && currentUser != null) - { - currentUser.Email = parts[1]; - if (!IsValidEmail(currentUser.Email)) - { - invalidEntries.Add($"Ungültige E-Mail: {currentUser.Email}"); - currentUser = null; - } - continue; - } - - // Telefonnummer des aktuellen Nutzers einlesen und validieren - if (parts[0] == "Telefon" && currentUser != null) - { - if (!IsValidPhone(parts[1], parts[2])) - { - invalidEntries.Add($"Ungültige Telefonnummer: {parts[1]} {parts[2]}"); - currentUser = null; - } - else - { - currentUser.Phones.Add(new Phone - { - Prefix = parts[1], - Number = parts[2] - }); - } - continue; - } - } - - // Letzten Nutzer zur Liste hinzufügen, falls vorhanden - if (currentUser != null) - { - users.Add(currentUser); - } - - return users; - } - - // Methode zur Überprüfung, ob ein Nutzer bereits in der Datenbank existiert - static bool UserExists(MySqlConnection connection, User user, string clientId) - { - string query = @"SELECT COUNT(*) FROM user WHERE firstname = @firstname AND lastname = @lastname AND clientId = @clientId"; - MySqlCommand cmd = new MySqlCommand(query, connection); - cmd.Parameters.AddWithValue("@firstname", user.Firstname); - cmd.Parameters.AddWithValue("@lastname", user.Lastname); - cmd.Parameters.AddWithValue("@clientId", clientId); - return Convert.ToInt32(cmd.ExecuteScalar()) > 0; - } - - // Methode zum Einfügen eines neuen Nutzers in die Datenbank - static void InsertUser(MySqlConnection connection, User user, string clientId) - { - string query = @"INSERT INTO user (clientId, genderId, firstname, lastname, birthdate) VALUES (@clientId, @genderId, @firstname, @lastname, @birthdate)"; - MySqlCommand cmd = new MySqlCommand(query, connection); - cmd.Parameters.AddWithValue("@clientId", clientId); - cmd.Parameters.AddWithValue("@genderId", user.Gender == "Herr" ? 1 : (user.Gender == "Frau" ? 2 : 3)); - cmd.Parameters.AddWithValue("@firstname", user.Firstname); - cmd.Parameters.AddWithValue("@lastname", user.Lastname); - cmd.Parameters.AddWithValue("@birthdate", DateTime.ParseExact(user.Birthdate, "dd.MM.yyyy", CultureInfo.InvariantCulture)); - - cmd.ExecuteNonQuery(); - long userId = cmd.LastInsertedId; - - // Adresse des Nutzers einfügen, falls vorhanden - if (user.Address != null) - { - query = @"INSERT INTO address (userId, street, postalcode, city) VALUES (@userId, @street, @postalcode, @city)"; - cmd = new MySqlCommand(query, connection); - cmd.Parameters.AddWithValue("@userId", userId); - cmd.Parameters.AddWithValue("@street", user.Address.Street); - cmd.Parameters.AddWithValue("@postalcode", user.Address.PostalCode); - cmd.Parameters.AddWithValue("@city", user.Address.City); - cmd.ExecuteNonQuery(); - } - - // E-Mail-Adresse des Nutzers einfügen, falls vorhanden - if (!string.IsNullOrEmpty(user.Email)) - { - query = @"INSERT INTO email (userId, email) VALUES (@userId, @Email)"; - cmd = new MySqlCommand(query, connection); - cmd.Parameters.AddWithValue("@userId", userId); - cmd.Parameters.AddWithValue("@Email", user.Email); - cmd.ExecuteNonQuery(); - } - - // Telefonnummern des Nutzers einfügen, falls vorhanden - foreach (var phone in user.Phones) - { - query = @"INSERT INTO phone (userId, phoneprefix, phonenumber) VALUES (@userId, @phoneprefix, @phonenumber)"; - cmd = new MySqlCommand(query, connection); - cmd.Parameters.AddWithValue("@userId", userId); - cmd.Parameters.AddWithValue("@phoneprefix", phone.Prefix); - cmd.Parameters.AddWithValue("@phonenumber", phone.Number); - cmd.ExecuteNonQuery(); - } - } - - // Methode zum Protokollieren von Einträgen in eine Log-Datei - static void LogEntries(string filePath, List entries) - { - if (entries.Count > 0) - { - File.AppendAllLines(filePath, entries); - } - } - - // Klasse zur Darstellung eines Nutzers - class User - { - public string Gender { get; set; } - public string Firstname { get; set; } - public string Lastname { get; set; } - public string Birthdate { get; set; } - public Address Address { get; set; } - public string Email { get; set; } - public List Phones { get; set; } = new List(); - } - - // Klasse zur Darstellung einer Adresse - class Address - { - public string Street { get; set; } - public string PostalCode { get; set; } - public string City { get; set; } - } - - // Klasse zur Darstellung einer Telefonnummer - class Phone - { - public string Prefix { get; set; } - public string Number { get; set; } - } -} - - - -//Unser 1. Versuch - -/* -class Program -{ - static void Main(string[] args) - { - //Connection zum Server - - MySql.Data.MySqlClient.MySqlConnection myConnection; - string myConnectionString; - //set the correct values for your server, user, password and database name - myConnectionString = "server=localhost;uid=root;pwd=root;database=import_export"; //Hier greife ich auf import_export zu - - try - { - myConnection = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString); - //open a connection - myConnection.Open(); - - // create a MySQL command and set the SQL statement with parameters - MySqlCommand myCommand = new MySqlCommand(); - myCommand.Connection = myConnection; -// myCommand.CommandText = @"SELECT * FROM workshop WHERE maxParticipants = @code;"; - - //Selber eingefügt ab hier - myCommand.CommandText = @"SELECT * FROM user"; //Hier tragen wir unsere SELECT ein - //Hier ende - -// myCommand.Parameters.AddWithValue("@code", "12"); - - // execute the command and read the results - using MySqlDataReader myReader = myCommand.ExecuteReader(); - - //Hier dann den CSV Reader benutzen? - while (myReader.Read()) - { - int id = myReader.GetInt32("id"); - string name = myReader.GetString("firstname"); - Console.WriteLine(id + " " + name); - } - - myConnection.Close(); - } - catch (MySql.Data.MySqlClient.MySqlException ex) - { - - } - - //Consolen-Ausgabe und Abfrage Eventuell hoch in das While schieben - - Console.WriteLine("Willkommen"); - Console.Write("Bitte geben Sie nun die Kundenummer ein: "); - string kundennummer = Console.ReadLine(); - Console.Write("Bitte geben Sie die Datei-Parameter ein: "); - string dateiBezeichnung = Console.ReadLine(); - - string filePath = "path/to/your/" + dateiBezeichnung; //Wo wird die CSV vor dem einlesen abgelegt? Extra Ordner dafür erstellen - - //Überprüfung, ob die Datei exisitiert mit File.Exists() - - if (!File.Exists(filePath)) - { - Console.WriteLine("Die Datei-Parameter konnten nicht gefunden werden. Bitte versuche es erneut"); - } - - - //Schwierigkeit: Bei User beginnen und dann alle anderen Tabellen durch Foreign Keys verbinden/verweisen - //Procedure INSERT anschauen - Elegante Lösung - //Auto Increment beachten - - //Umsetzung mit Arrays: Beginnend mit durchzählen für Länge Array, darauffolgende Unterteilung in Blöcken - //(CSV Datei einteilen: (Beginnend immer mit Herr/Frau) , dann Erstellung Tabelle User, dann andere Tabellen mit Foreign Keys verknüpfen - } -} - -*/ \ No newline at end of file diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/export.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/export.cs new file mode 100644 index 0000000..d4a616a --- /dev/null +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/export.cs @@ -0,0 +1,113 @@ +// 2. Export +// +// • Ein Sachbearbeiter ruft eine Konsolen-App auf, in welcher er die Kundennummer sowie den Zeitraum für die Abrechnung angibt +// • Wird eine Aktion abgerechnet, darf diese zukünftig nicht nochmal berechnet werden (z.B. bei Überschneidung der Zeiträume) +// • Die Ausgabe der Daten erfolgt als CSV-Datei. Der Dateiname folgt diesem Schema: Abrechnungsdatum_Kundennummer_vonDatum_bisDatum.csv +// • Das Datum ist immer im folgenden Format anzugeben: yyyy-mm-dd +// • Ein Abrechnungslauf muss folgende Daten umfassen: +// ○ Zeitraum (von / bis Datum) der Abrechnung +// ○ Name und Nummer des Kunden +// ○ Gesamtsumme der Abrechnung +// ○ Übersicht der einzelnen Posten wie folgt: +// Bereich | Grundbetrag | Anzahl | Betrag +// Newsletter wöchentlich | 0.001 | 24 | 0.024 +// Tarif Orange M 12 Monate | 7.00 | 0 | 0.000 +// Tarif Orange S 12 Monate | 5.00 | 1 | 5.000 +// Tarif Orange XL 12 Monate | 12.00 | 2 | 24.000 +// Verkaufsgespräch | 0.030 | 8 | 0.240 +// + +using System; +using System.Collections.Generic; +using System.IO; +using MySql.Data.MySqlClient; + +class Export +{ + static void Main(string[] args) + { + string customerNumber = args[0]; + string startDatum = args[1]; + string endDatum = args[2]; + + ExportData(customerNumber, startDatum, endDatum); + } + + static void ExportData(string kundennummer, string startDatum, string endDatum) + { + string myConnectionString = "server=localhost;uid=root;pwd=root;database=vr_contact"; + using (MySqlConnection myConnection = new MySqlConnection(myConnectionString)) + { + try + { + myConnection.Open(); + + // Kundendaten abrufen + string clientQuery = "SELECT name, id FROM customers WHERE id = @clientId"; + MySqlCommand clientCmd = new MySqlCommand(clientQuery, myConnection); + clientCmd.Parameters.AddWithValue("@clientId", kundennummer); + + using (MySqlDataReader clientReader = clientCmd.ExecuteReader()) + { + if (clientReader.Read()) + { + string clientName = clientReader.GetString("name"); + int clientId = clientReader.GetInt32("id"); + clientReader.Close(); + + // Abrechnungsdaten abrufen + string invoiceQuery = @" + SELECT area, base_amount, quantity, amount + FROM invoices + WHERE client_id = @clientId + AND invoice_date BETWEEN @startDatum AND @endDatum"; + + MySqlCommand invoiceCmd = new MySqlCommand(invoiceQuery, myConnection); + invoiceCmd.Parameters.AddWithValue("@clientId", clientId); + invoiceCmd.Parameters.AddWithValue("@startDatum", startDatum); + invoiceCmd.Parameters.AddWithValue("@endDatum", endDatum); + + using (MySqlDataReader invoiceReader = invoiceCmd.ExecuteReader()) + { + List invoiceLines = new List(); + decimal totalAmount = 0; + + while (invoiceReader.Read()) + { + string area = invoiceReader.GetString("area"); + decimal baseAmount = invoiceReader.GetDecimal("base_amount"); + int quantity = invoiceReader.GetInt32("quantity"); + decimal amount = invoiceReader.GetDecimal("amount"); + totalAmount += amount; + + invoiceLines.Add($"{area};{baseAmount};{quantity};{amount}"); + } + invoiceReader.Close(); + + // CSV-Datei schreiben + string filename = $"{DateTime.Now:yyyy-MM-dd}_{kundennummer}_{startDatum}_{endDatum}.csv"; + using (StreamWriter sw = new StreamWriter(filename)) + { + sw.WriteLine($"Zeitraum: {startDatum} bis {endDatum}"); + sw.WriteLine($"Name und Nummer des Kunden: {clientName}, {clientId}"); + sw.WriteLine($"Gesamtsumme der Abrechnung: {totalAmount}"); + sw.WriteLine("Bereich;Grundbetrag;Anzahl;Betrag"); + + foreach (string line in invoiceLines) + { + sw.WriteLine(line); + } + } + } + } + } + myConnection.Close(); + } + catch (MySqlException ex) + { + Console.WriteLine($"Database error: {ex.Message}"); + } + } + } +} + diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/import.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/import.cs new file mode 100644 index 0000000..6c3e31c --- /dev/null +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/import.cs @@ -0,0 +1,243 @@ +//Aufgabenstellung +// +//1.Import +// +//Als Teil des Entwicklungsteams sollen Sie einen Import für neue Nutzer der jeweiligen Kunden entwickeln. +//Die Kunden schicken zu diesem Zweck CSV-Dateien mit den Daten von neuen Nutzern. +//Diese Daten müssen in die bestehenden Datentabellen eingespielt werden. +//Dafür sind folgende Anforderungen formuliert: +// +// • Ein Sachbearbeiter ruft eine Konsolen-App auf, in welcher er die Datei und die +// Kundennummer des Kunden als Parameter übergibt: Die Beispieldatei hat den Namen "import_yutani.csv" und +// gehört zum Kunden mit der Nummer "K2-002" +// +// • Die Datei hat den Aufbau: +// - Ein Nutzer mit Anrede, Vorname, Nachname und Geburtsdatum +// - Ggf. Adresse: Straße mit Hausnummer, PLZ, Stadt +// - Ggf. E-Mail +// - Ggf. eine oder mehrere Telefonnummern: Vorwahl ohne führende 0 und Nummer +// +// • Ein Nutzer darf für einen Kunden nicht mehrmals importiert werden. +// +// • Die Daten sollen wie folgt validiert werden: +// ○ Geburtsdatum: TT.MM.JJJJ +// ○ Valide E-Mail-Adresse +// ○ PLZ: exakt 5 Nummern +// ○ Telefonnummer 3 bis 5 Nummern für die Vorwahl und 4 bis 10 Nummern für die Hauptnummer. Keine Sonderzeichen +// +// • Nicht valide Datensätze von Nutzern sollen in einem Protokoll erfasst werden, ebenso bereits vorhandene Nutzer. +// Der komplette Datensatz eines Nutzers darf dann nicht importiert werden + +/* + * Das ist der Beispielcode für die Verbindung zum Datenbankserver + * +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using System.Data.Common; +using System.Reflection.PortableExecutable; +using System.Xml; + + + MySql.Data.MySqlClient.MySqlConnection myConnection; + string myConnectionString; + //set the correct values for your server, user, password and database name + myConnectionString = "server=localhost;uid=root;pwd=root;database=vr_contact"; + + try + { + myConnection = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString); + //open a connection + myConnection.Open(); + + // create a MySQL command and set the SQL statement with parameters + MySqlCommand myCommand = new MySqlCommand(); + myCommand.Connection = myConnection; + myCommand.CommandText = @"SELECT * FROM workshop WHERE maxParticipants = @code;"; + myCommand.Parameters.AddWithValue("@code", "12"); + + // execute the command and read the results + using MySqlDataReader myReader = myCommand.ExecuteReader(); + + while (myReader.Read()) + { + int id = myReader.GetInt32("maxParticipants"); + string name = myReader.GetString("title"); + Console.WriteLine(id + " " + name); +} + + myConnection.Close(); + } + catch (MySql.Data.MySqlClient.MySqlException ex) +{ + +} + * + */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using MySql.Data.MySqlClient; + +class Import +{ + static void Main(string[] args) + { + string filePath = args[0]; + string customerNumber = args[1]; + + ImportData(filePath, customerNumber); + } + + static void ImportData(string filePath, string customerNumber) + { + List errorLog = new List(); + + using (StreamReader sr = new StreamReader(filePath)) + { + string line; + while ((line = sr.ReadLine()) != null) + { + string[] parts = line.Split(';'); + User user = new User + { + Gender = parts[0], + Firstname = parts[1], + Lastname = parts[2], + Birthdate = parts[3], + Address = new Address + { + Street = parts[4], + PostalCode = parts[5], + City = parts[6] + }, + Email = parts[7], + Phones = new List + { + new Phone { Prefix = parts[8], Number = parts[9] } + } + }; + + if (ValidateUser(user, out string error)) + { + InsertUser(user, customerNumber, errorLog); + } + else + { + errorLog.Add(error); + } + } + } + + File.WriteAllLines("error_log.txt", errorLog); + } + + static bool ValidateUser(User user, out string error) + { + error = ""; + + if (!Regex.IsMatch(user.Birthdate, @"^\d{2}\.\d{2}\.\d{4}$")) + { + error = "Invalid birthdate format."; + return false; + } + + if (!string.IsNullOrEmpty(user.Email) && !Regex.IsMatch(user.Email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$")) + { + error = "Invalid email format."; + return false; + } + + if (!Regex.IsMatch(user.Address.PostalCode, @"^\d{5}$")) + { + error = "Invalid postal code format."; + return false; + } + + foreach (var phone in user.Phones) + { + if (!Regex.IsMatch(phone.Prefix, @"^\d{3,5}$") || !Regex.IsMatch(phone.Number, @"^\d{4,10}$")) + { + error = "Invalid phone number format."; + return false; + } + } + + return true; + } + + static void InsertUser(User user, string customerNumber, List errorLog) + { + string myConnectionString = "server=localhost;uid=root;pwd=root;database=vr_contact"; + using (MySqlConnection myConnection = new MySqlConnection(myConnectionString)) + { + try + { + myConnection.Open(); + + // Check if user already exists for the customer + string checkQuery = "SELECT COUNT(*) FROM users WHERE firstname = @firstname AND lastname = @lastname AND customer_id = @customer_id"; + MySqlCommand checkCmd = new MySqlCommand(checkQuery, myConnection); + checkCmd.Parameters.AddWithValue("@firstname", user.Firstname); + checkCmd.Parameters.AddWithValue("@lastname", user.Lastname); + checkCmd.Parameters.AddWithValue("@customer_id", customerNumber); + + int userCount = Convert.ToInt32(checkCmd.ExecuteScalar()); + + if (userCount > 0) + { + errorLog.Add($"User {user.Firstname} {user.Lastname} already exists for customer {customerNumber}."); + return; + } + + // Insert user + string insertQuery = @" + INSERT INTO users (gender, firstname, lastname, birthdate, street, postal_code, city, email, customer_id) + VALUES (@gender, @firstname, @lastname, @birthdate, @street, @postal_code, @city, @Email, @customer_id)"; + MySqlCommand insertCmd = new MySqlCommand(insertQuery, myConnection); + insertCmd.Parameters.AddWithValue("@gender", user.Gender); + insertCmd.Parameters.AddWithValue("@firstname", user.Firstname); + insertCmd.Parameters.AddWithValue("@lastname", user.Lastname); + insertCmd.Parameters.AddWithValue("@birthdate", user.Birthdate); + insertCmd.Parameters.AddWithValue("@street", user.Address.Street); + insertCmd.Parameters.AddWithValue("@postal_code", user.Address.PostalCode); + insertCmd.Parameters.AddWithValue("@city", user.Address.City); + insertCmd.Parameters.AddWithValue("@Email", user.Email); + insertCmd.Parameters.AddWithValue("@customer_id", customerNumber); + + insertCmd.ExecuteNonQuery(); + myConnection.Close(); + } + catch (MySqlException ex) + { + errorLog.Add($"Database error: {ex.Message}"); + } + } + } +} + +class User +{ + public string Gender { get; set; } + public string Firstname { get; set; } + public string Lastname { get; set; } + public string Birthdate { get; set; } + public Address Address { get; set; } + public string Email { get; set; } + public List Phones { get; set; } = new List(); +} + +class Address +{ + public string Street { get; set; } + public string PostalCode { get; set; } + public string City { get; set; } +} + +class Phone +{ + public string Prefix { get; set; } + public string Number { get; set; } +} diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Debug/net8.0/Projekt_Calcan_Conze.AssemblyInfo.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Debug/net8.0/Projekt_Calcan_Conze.AssemblyInfo.cs index 093664c..7373c4d 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Debug/net8.0/Projekt_Calcan_Conze.AssemblyInfo.cs +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Debug/net8.0/Projekt_Calcan_Conze.AssemblyInfo.cs @@ -14,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("Projekt_Calcan_Conze")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+b5daf727d036da56b4f0ec7d625674d7d8d44a73")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5c51f68e6cd6355fd53b485ad50b2778d47b8dc0")] [assembly: System.Reflection.AssemblyProductAttribute("Projekt_Calcan_Conze")] [assembly: System.Reflection.AssemblyTitleAttribute("Projekt_Calcan_Conze")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Debug/net8.0/Projekt_Calcan_Conze.AssemblyInfoInputs.cache b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Debug/net8.0/Projekt_Calcan_Conze.AssemblyInfoInputs.cache index 3283eeb..aa7de51 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Debug/net8.0/Projekt_Calcan_Conze.AssemblyInfoInputs.cache +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Debug/net8.0/Projekt_Calcan_Conze.AssemblyInfoInputs.cache @@ -1 +1 @@ -e39a290590c7cc4b23572b44b843d3323f8e88ed187de9f169fba7cecdea222d +eae42f1b5ea27ad223d9cfc838d7801feb8aee718629ae41759404b6e801f0e1 diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Projekt_Calcan_Conze.csproj.nuget.dgspec.json b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Projekt_Calcan_Conze.csproj.nuget.dgspec.json index eb9d3ef..153c628 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Projekt_Calcan_Conze.csproj.nuget.dgspec.json +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Projekt_Calcan_Conze.csproj.nuget.dgspec.json @@ -66,7 +66,7 @@ "privateAssets": "all" } }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.300/PortableRuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.302/PortableRuntimeIdentifierGraph.json" } } } diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Projekt_Calcan_Conze.csproj.nuget.g.props b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Projekt_Calcan_Conze.csproj.nuget.g.props index 16fc677..718cb55 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Projekt_Calcan_Conze.csproj.nuget.g.props +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/Projekt_Calcan_Conze.csproj.nuget.g.props @@ -7,7 +7,7 @@ $(UserProfile)\.nuget\packages\ C:\Users\bib\.nuget\packages\ PackageReference - 6.10.0 + 6.10.1 diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.assets.json b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.assets.json index a5dbfd0..c4cf230 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.assets.json +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.assets.json @@ -1850,7 +1850,7 @@ "privateAssets": "all" } }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.300/PortableRuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.302/PortableRuntimeIdentifierGraph.json" } } } diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.nuget.cache b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.nuget.cache index 49e9242..0c5c666 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.nuget.cache +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.nuget.cache @@ -1,6 +1,6 @@ { "version": 2, - "dgSpecHash": "aMLpT6AgPok=", + "dgSpecHash": "eoIzlhHxBoI=", "success": true, "projectFilePath": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze.csproj", "expectedPackageFiles": [