From 9f2e9cbec8646502e9f8d8e82a8d93ceb2077c93 Mon Sep 17 00:00:00 2001 From: "NBJC\\bib" Date: Fri, 5 Jul 2024 11:08:37 +0200 Subject: [PATCH] =?UTF-8?q?Export=20hinzugef=C3=BCgt,=20Import=20=C3=BCber?= =?UTF-8?q?arbeitet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesignTimeBuild/.dtbcache.v2 | Bin 91609 -> 91623 bytes .../.vs/Projekt_Calcan_Conze/v17/.suo | Bin 30720 -> 31232 bytes .../v17/DocumentLayout.json | 29 +- .../Projekt_Calcan_Conze/Program.cs | 366 ------------------ .../Projekt_Calcan_Conze/export.cs | 113 ++++++ .../Projekt_Calcan_Conze/import.cs | 243 ++++++++++++ .../Projekt_Calcan_Conze.AssemblyInfo.cs | 2 +- ...jekt_Calcan_Conze.AssemblyInfoInputs.cache | 2 +- ...jekt_Calcan_Conze.csproj.nuget.dgspec.json | 2 +- .../Projekt_Calcan_Conze.csproj.nuget.g.props | 2 +- .../obj/project.assets.json | 2 +- .../obj/project.nuget.cache | 2 +- 12 files changed, 364 insertions(+), 399 deletions(-) delete mode 100644 Projekt_Calcan_Conze/Projekt_Calcan_Conze/Program.cs create mode 100644 Projekt_Calcan_Conze/Projekt_Calcan_Conze/export.cs create mode 100644 Projekt_Calcan_Conze/Projekt_Calcan_Conze/import.cs 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 632585defba9eba480e36806a4a38e1fc781cfe8..feac31fa01ede2b8b9a89190ad22c470308cf78e 100644 GIT binary patch literal 91623 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 literal 91609 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 diff --git a/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/.suo b/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/.suo index c0419724f5231e5d2d8714ffbda4afb231e21b4c..e835f058c1bf8e389eea503fec2634f3c66283ae 100644 GIT binary patch delta 3083 zcmcf@YiyHM^xo2LW$SD2!Mf400^4Y3A78g_4BS{5k3AS;AX6uNEgf+iY}vXpsQexSp^|J7=p$K@{%7)d?Y6RQc=lBHWcujuHRNb0!sAWobR4{&iU>= z=X~e!1%Kng5q_vcreVgjvksrV%x5yjDsmto3-Hx&O;!&lWmfP_3922)5aRHGLk(P> z(WF8w72#HN#7FTYTyqdI5mFGQAtWHs%kvO!M&)%;T#IWmLIwhyk?WOth|H$VZn=?b z;DkJ5V4Zk-iA?1)f$RG0*4+{dnjql!oH4GUBzq<}6#4wn*YTb3fF z27xZD#kCHhKDs9wK_l*0A~Yeait--AbqzvubWd{9cnWE2i9WERB!u@IO-xObc(iUt zUf(!>M(FRfD*d-w;f-0~OVkfE8Si_s=9DTQm7uReO2L5E2qT*16p({HEstA)3?+wv z?yS-tE8|NFf={Cdo#x#KJm5NpdT&xcjAS>cC`jl!8j&k~ISs08BvSN7iTN;^Q>&VT z1d38gk}rqe8U2a|l7+Fn<#%XhT&`vmF%%)vE1`LE7&X?YIT0vjBnJ3qol|p4sKVQ* zvl~R$c zj0tA2Kn{H~YbXj7WTpBDUrUSWI@9fxC zr%<1&8Y}wJdHnFn^&s}Vdhrh}Uv;HR_u7q{3``Kk^wv`O)~R#G zZOxUX!iju4ufIp2)nTC3t0QgUwrH!3M4KVz))_I;#x{yQK5uv2uTr=$_A)fLo7GCr z7_|q^WULcjG!(~q`?@;2eek_uZlcvu5LYHmc*ycpA81$Zz6(@OE3P$%{$Q#X4Cx z2K{&%yfAC3>CZBdYqeh!bN$8!kk4Pej@LY2M+4B7coFhOvR9`vr)CzCZi=8C8DB855D z^ihU;3_K*FDUz%?{Ab3RR`kh1eAG(RWci^ zW{WWG1bkYVnJtXqcEm8BFeNRBRYrJ~h*@w}B2=+bd{#$h6|=*KH3bl;D+h6HY8CxK z(BF+w5WQ|oiM7?->a+=F!RdCGOKldxTY~OTvBM*7TI=cD6u=#H zt(%{)<{bU|F!tOL*uA1S7>zr0n*a?y#N3J delta 2427 zcmd5-Z%kWN6o0q0(9!p3(GD2vMj>T`LRnk-hay`ZQjkF{Wv~r4h%`tYTjy{Tht*|8 zlbIzLzNLut@8py3e0if|$3di5}^)G7C3f1y{;Bt^LB1NHC|FbK;TWaH`4-D4bN_np-f zC*qgoL_CQTkDz@Mr(Fo*L~FC0XgzV7>uuVOhF**IY#eHz#c`Ta;Wq~IMU-s_JE9Tc zKsXWbu+RtILLKM|m52SP=s^S!y@+FoK14s_IN}82Bw_#&LXhLr*bY%2UK1)RNke!A zHD?gxh_i@uh%jOu7BqWdKrqaWlu7^NtrabUx5^614kfG=bwgW~?X!rM<)1UY>F)TWgtsB>`AgSi!2mV=M7dpAEuP=@re( zIF-s31uBPIK{Vb~d0h1_2WTt*kW5}aTi4mmOFc@MHg#wI8@0GBYfup*1Efsdyb*hK zG82e?TvQ!Uo3|*@(^~aCfl*l*WESZKG?aA<>5c7|86dI;FNgvj+@dWH@a3p5$(6|- zWn!&d%_LV6M5_Y=ejg=_yQj?i6EjCwKN)Bke^h&|25#4Ut{>q< zs%8i0#m|kOle0r`cm}G5MLcFvm`CUIci=e2U4^9mGVgKM+pM;?I)dTJG2DeYAy&S_ zXoryOLN-;%rsk&cT3tMR{rmUsKle8*K{+Icm{xiDd@aC)r zShCn4Xa2*A^SfLpnDboYT?(nCO<Pe|bWv(wPpa*1OxKZX)%30fQQUJ*KNZAqJWYAUf94HU9co z^TfpqXUER@uu$j;F*!pHXVBVcv)J7>o5kU=xhx)!+iLOHgH5BM(I&ggvg-Gc08PTND=ob7mr0% 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": [