Export hinzugefügt, Import überarbeitet
This commit is contained in:
parent
5c51f68e6c
commit
9f2e9cbec8
Binary file not shown.
Binary file not shown.
@ -1,37 +1,12 @@
|
|||||||
{
|
{
|
||||||
"Version": 1,
|
"Version": 1,
|
||||||
"WorkspaceRootPath": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\",
|
"WorkspaceRootPath": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\",
|
||||||
"Documents": [
|
"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}"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"DocumentGroupContainers": [
|
"DocumentGroupContainers": [
|
||||||
{
|
{
|
||||||
"Orientation": 0,
|
"Orientation": 0,
|
||||||
"VerticalTabListWidth": 256,
|
"VerticalTabListWidth": 256,
|
||||||
"DocumentGroups": [
|
"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": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -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<string> invalidEntries = new List<string>();
|
|
||||||
List<string> existingEntries = new List<string>();
|
|
||||||
|
|
||||||
// Einlesen der CSV-Datei und Verarbeitung der Daten
|
|
||||||
string[] lines = File.ReadAllLines(filePath);
|
|
||||||
List<User> 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<User> ParseCsv(string[] lines, List<string> invalidEntries)
|
|
||||||
{
|
|
||||||
List<User> users = new List<User>();
|
|
||||||
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<string> 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<Phone> Phones { get; set; } = new List<Phone>();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
113
Projekt_Calcan_Conze/Projekt_Calcan_Conze/export.cs
Normal file
113
Projekt_Calcan_Conze/Projekt_Calcan_Conze/export.cs
Normal file
@ -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<string> invoiceLines = new List<string>();
|
||||||
|
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}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
243
Projekt_Calcan_Conze/Projekt_Calcan_Conze/import.cs
Normal file
243
Projekt_Calcan_Conze/Projekt_Calcan_Conze/import.cs
Normal file
@ -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<string> errorLog = new List<string>();
|
||||||
|
|
||||||
|
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<Phone>
|
||||||
|
{
|
||||||
|
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<string> 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<Phone> Phones { get; set; } = new List<Phone>();
|
||||||
|
}
|
||||||
|
|
||||||
|
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; }
|
||||||
|
}
|
@ -14,7 +14,7 @@ using System.Reflection;
|
|||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Projekt_Calcan_Conze")]
|
[assembly: System.Reflection.AssemblyCompanyAttribute("Projekt_Calcan_Conze")]
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
[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.AssemblyProductAttribute("Projekt_Calcan_Conze")]
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("Projekt_Calcan_Conze")]
|
[assembly: System.Reflection.AssemblyTitleAttribute("Projekt_Calcan_Conze")]
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
@ -1 +1 @@
|
|||||||
e39a290590c7cc4b23572b44b843d3323f8e88ed187de9f169fba7cecdea222d
|
eae42f1b5ea27ad223d9cfc838d7801feb8aee718629ae41759404b6e801f0e1
|
||||||
|
@ -66,7 +66,7 @@
|
|||||||
"privateAssets": "all"
|
"privateAssets": "all"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.300/PortableRuntimeIdentifierGraph.json"
|
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.302/PortableRuntimeIdentifierGraph.json"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
||||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\bib\.nuget\packages\</NuGetPackageFolders>
|
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\bib\.nuget\packages\</NuGetPackageFolders>
|
||||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.10.0</NuGetToolVersion>
|
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.10.1</NuGetToolVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
<SourceRoot Include="C:\Users\bib\.nuget\packages\" />
|
<SourceRoot Include="C:\Users\bib\.nuget\packages\" />
|
||||||
|
@ -1850,7 +1850,7 @@
|
|||||||
"privateAssets": "all"
|
"privateAssets": "all"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.300/PortableRuntimeIdentifierGraph.json"
|
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.302/PortableRuntimeIdentifierGraph.json"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"version": 2,
|
"version": 2,
|
||||||
"dgSpecHash": "aMLpT6AgPok=",
|
"dgSpecHash": "eoIzlhHxBoI=",
|
||||||
"success": true,
|
"success": true,
|
||||||
"projectFilePath": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze.csproj",
|
"projectFilePath": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze.csproj",
|
||||||
"expectedPackageFiles": [
|
"expectedPackageFiles": [
|
||||||
|
Loading…
Reference in New Issue
Block a user