Compare commits

..

No commits in common. "fd8dfe6b2e890652f1a93806cf58193b98745722" and "d44c0759e41a0e73b15915c0b71986f79b3e9f16" have entirely different histories.

19 changed files with 0 additions and 622 deletions

BIN
.gitignore vendored

Binary file not shown.

View File

@ -1,4 +0,0 @@
{
"java.project.sourcePaths": ["src/main/java"],
"java.project.outputPath": "out"
}

View File

@ -1,5 +0,0 @@
K-000002;Ref GmbH;Str. 1;68163;Mannheim;DE111111111;ref@ref.de;0621-111111;;AKTIV
K-000003;Muster GmbH;Hauptstr. 1;68163;Mannheim;DE123456789;info@muster.de;0621-123456;;AKTIV
K-000004;Edit GmbH;Str. 1;68163;Mannheim;DE333333333;neu@edit.de;0621-333333;;AKTIV
K-000006;Test AG;Teststr. 1;68163;Mannheim;DE987654321;test@test.de;0621-654321;;AKTIV
K-000007;Muster GmbH;Hauptstr. 1;68163;Mannheim;DE123456789;info@muster.de;0621-123456;;AKTIV
1 K-000002 Ref GmbH Str. 1 68163 Mannheim DE111111111 ref@ref.de 0621-111111 AKTIV
2 K-000003 Muster GmbH Hauptstr. 1 68163 Mannheim DE123456789 info@muster.de 0621-123456 AKTIV
3 K-000004 Edit GmbH Str. 1 68163 Mannheim DE333333333 neu@edit.de 0621-333333 AKTIV
4 K-000006 Test AG Teststr. 1 68163 Mannheim DE987654321 test@test.de 0621-654321 AKTIV
5 K-000007 Muster GmbH Hauptstr. 1 68163 Mannheim DE123456789 info@muster.de 0621-123456 AKTIV

View File

@ -1 +0,0 @@
7

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,74 +0,0 @@
package kundenverwaltung;
import java.util.ArrayList;
import java.util.List;
public class Kunde {
private String kundenId;
private String name;
private String strasse;
private String plz;
private String ort;
private String steuerNummer;
private String email;
private String telefon;
private List<String> belegReferenzen;
private KundenStatus status;
public Kunde(String kundenId, String name, String strasse, String plz,
String ort, String steuerNummer, String email, String telefon) {
this.kundenId = kundenId;
this.name = name;
this.strasse = strasse;
this.plz = plz;
this.ort = ort;
this.steuerNummer = steuerNummer;
this.email = email;
this.telefon = telefon;
this.belegReferenzen = new ArrayList<>();
this.status = KundenStatus.AKTIV;
}
// Validierung aller Pflichtfelder (F-03)
public boolean validiereFelder() {
return name != null && !name.isBlank() &&
strasse != null && !strasse.isBlank() &&
plz != null && !plz.isBlank() &&
ort != null && !ort.isBlank() &&
steuerNummer != null && !steuerNummer.isBlank() &&
email != null && !email.isBlank() &&
telefon != null && !telefon.isBlank();
}
// Getter
public String getKundenId() { return kundenId; }
public String getName() { return name; }
public String getStrasse() { return strasse; }
public String getPlz() { return plz; }
public String getOrt() { return ort; }
public String getSteuerNummer() { return steuerNummer; }
public String getEmail() { return email; }
public String getTelefon() { return telefon; }
public List<String> getBelegReferenzen() { return belegReferenzen; }
public KundenStatus getStatus() { return status; }
// Setter
public void setName(String name) { this.name = name; }
public void setStrasse(String strasse) { this.strasse = strasse; }
public void setPlz(String plz) { this.plz = plz; }
public void setOrt(String ort) { this.ort = ort; }
public void setSteuerNummer(String nr) { this.steuerNummer = nr; }
public void setEmail(String email) { this.email = email; }
public void setTelefon(String telefon) { this.telefon = telefon; }
public void setStatus(KundenStatus status) { this.status = status; }
public void belegHinzufuegen(String belegnummer) {
belegReferenzen.add(belegnummer);
}
@Override
public String toString() {
return String.format("[%s] %s, %s %s, %s | %s | %s",
kundenId, name, plz, ort, strasse, email, telefon);
}
}

View File

@ -1,43 +0,0 @@
package kundenverwaltung;
import java.io.*;
import java.nio.file.*;
public class KundenIdGenerator {
private static final String COUNTER_FILE = "data/kunden_counter.txt";
private int counter;
public KundenIdGenerator() {
this.counter = ladeCounter();
}
// Gibt die nächste lückenlose Kundennummer zurück (F-02)
public String naechsteKundenId() {
counter++;
speichereCounter();
return String.format("K-%06d", counter);
}
private int ladeCounter() {
try {
Path path = Path.of(COUNTER_FILE);
if (Files.exists(path)) {
String inhalt = Files.readString(path).trim();
return Integer.parseInt(inhalt);
}
} catch (IOException e) {
System.err.println("Counter konnte nicht geladen werden, starte bei 0.");
}
return 0;
}
private void speichereCounter() {
try {
Files.createDirectories(Path.of("data"));
Files.writeString(Path.of(COUNTER_FILE), String.valueOf(counter));
} catch (IOException e) {
System.err.println("Counter konnte nicht gespeichert werden: " + e.getMessage());
}
}
}

View File

@ -1,109 +0,0 @@
package kundenverwaltung;
import java.io.*;
import java.nio.file.*;
import java.util.*;
public class KundenRepository {
private static final String DATA_FILE = "data/kunden.csv";
private List<Kunde> kunden;
public KundenRepository() throws IOException {
this.kunden = new ArrayList<>();
Files.createDirectories(Path.of("data"));
laden();
}
// Speichert einen neuen Kunden (F-04)
public void speichern(Kunde kunde) {
kunden.add(kunde);
speichereAlle();
}
// Aktualisiert einen bestehenden Kunden (F-07)
public void aktualisieren(Kunde kunde) {
speichereAlle();
}
// Löscht einen Kunden anhand der ID (F-11)
public void loeschen(String kundenId) {
kunden.removeIf(k -> k.getKundenId().equals(kundenId));
speichereAlle();
}
// Gibt alle Kunden zurück (F-08)
public List<Kunde> alleKunden() {
return new ArrayList<>(kunden);
}
// Sucht einen Kunden anhand der ID (F-10)
public Kunde findeNachId(String kundenId) {
return kunden.stream()
.filter(k -> k.getKundenId().equals(kundenId))
.findFirst()
.orElse(null);
}
// Sucht Kunden anhand des Namens (F-09)
public List<Kunde> sucheNachName(String suchbegriff) {
List<Kunde> ergebnis = new ArrayList<>();
for (Kunde k : kunden) {
if (k.getName().toLowerCase().contains(suchbegriff.toLowerCase())) {
ergebnis.add(k);
}
}
return ergebnis;
}
// Speichert alle Kunden als CSV-Datei (NF-SEC-01)
private void speichereAlle() {
try {
StringBuilder sb = new StringBuilder();
for (Kunde k : kunden) {
sb.append(k.getKundenId()).append(";")
.append(k.getName()).append(";")
.append(k.getStrasse()).append(";")
.append(k.getPlz()).append(";")
.append(k.getOrt()).append(";")
.append(k.getSteuerNummer()).append(";")
.append(k.getEmail()).append(";")
.append(k.getTelefon()).append(";")
.append(String.join(",", k.getBelegReferenzen())).append(";")
.append(k.getStatus().name()).append("\n");
}
Files.writeString(Path.of(DATA_FILE), sb.toString());
} catch (IOException e) {
System.err.println("Fehler beim Speichern: " + e.getMessage());
}
}
// Lädt alle Kunden aus der CSV-Datei beim Start (NF-SEC-01)
private void laden() {
try {
Path path = Path.of(DATA_FILE);
if (!Files.exists(path)) return;
List<String> zeilen = Files.readAllLines(path);
for (String zeile : zeilen) {
if (zeile.isBlank()) continue;
String[] teile = zeile.split(";", -1);
if (teile.length < 10) continue;
Kunde k = new Kunde(
teile[0], teile[1], teile[2], teile[3],
teile[4], teile[5], teile[6], teile[7]
);
if (!teile[8].isBlank()) {
for (String beleg : teile[8].split(",")) {
k.belegHinzufuegen(beleg);
}
}
k.setStatus(KundenStatus.valueOf(teile[9]));
kunden.add(k);
}
} catch (IOException e) {
System.err.println("Fehler beim Laden: " + e.getMessage());
}
}
}

View File

@ -1,114 +0,0 @@
package kundenverwaltung;
import java.io.IOException;
import java.util.List;
public class KundenServiceImpl {
private final KundenRepository repository;
private final KundenIdGenerator idGenerator;
public KundenServiceImpl() throws IOException {
this.repository = new KundenRepository();
this.idGenerator = new KundenIdGenerator();
}
// Legt einen neuen Kunden an (F-01, F-02, F-03, F-04)
public Kunde kundeAnlegen(String name, String strasse, String plz, String ort,
String steuerNummer, String email, String telefon) {
Kunde kunde = new Kunde("TEMP", name, strasse, plz, ort, steuerNummer, email, telefon);
// Pflichtfeldprüfung (F-03)
if (!kunde.validiereFelder()) {
System.out.println("Fehler: Alle Pflichtfelder müssen ausgefüllt sein.");
return null;
}
// ID vergeben (F-02)
String id = idGenerator.naechsteKundenId();
Kunde neuerKunde = new Kunde(id, name, strasse, plz, ort, steuerNummer, email, telefon);
repository.speichern(neuerKunde);
System.out.println("Kunde erfolgreich angelegt: " + neuerKunde);
return neuerKunde;
}
// Bearbeitet einen bestehenden Kunden (F-05, F-06, F-07)
public boolean kundeBearbeiten(String kundenId, String name, String strasse, String plz,
String ort, String steuerNummer, String email, String telefon) {
Kunde kunde = repository.findeNachId(kundenId);
if (kunde == null) {
System.out.println("Fehler: Kunde mit ID " + kundenId + " nicht gefunden.");
return false;
}
kunde.setName(name);
kunde.setStrasse(strasse);
kunde.setPlz(plz);
kunde.setOrt(ort);
kunde.setSteuerNummer(steuerNummer);
kunde.setEmail(email);
kunde.setTelefon(telefon);
// Pflichtfeldprüfung nach Änderung (F-06)
if (!kunde.validiereFelder()) {
System.out.println("Fehler: Alle Pflichtfelder müssen ausgefüllt sein.");
return false;
}
repository.aktualisieren(kunde);
System.out.println("Kunde erfolgreich aktualisiert: " + kunde);
return true;
}
// Löscht einen Kunden mit Integritätsprüfung (F-11, F-12, GR-04)
public boolean kundeLoschen(String kundenId) {
Kunde kunde = repository.findeNachId(kundenId);
if (kunde == null) {
System.out.println("Fehler: Kunde mit ID " + kundenId + " nicht gefunden.");
return false;
}
// Referenzielle Integrität prüfen (GR-04)
if (!kunde.getBelegReferenzen().isEmpty()) {
System.out.println("Fehler: Kunde kann nicht gelöscht werden, da er in " +
kunde.getBelegReferenzen().size() + " Beleg(en) referenziert wird.");
return false;
}
repository.loeschen(kundenId);
System.out.println("Kunde " + kundenId + " erfolgreich gelöscht.");
return true;
}
// Gibt alle Kunden zurück (F-08)
public List<Kunde> alleKunden() {
return repository.alleKunden();
}
// Sucht Kunden nach Name (F-09)
public List<Kunde> sucheNachName(String suchbegriff) {
return repository.sucheNachName(suchbegriff);
}
// Gibt einen Kunden anhand der ID zurück (F-10)
public Kunde findeKunde(String kundenId) {
return repository.findeNachId(kundenId);
}
// Zeigt die Transaktionshistorie eines Kunden (F-13)
public void zeigeTransaktionshistorie(String kundenId) {
Kunde kunde = repository.findeNachId(kundenId);
if (kunde == null) {
System.out.println("Kunde nicht gefunden.");
return;
}
System.out.println("Transaktionshistorie für " + kunde.getName() + ":");
if (kunde.getBelegReferenzen().isEmpty()) {
System.out.println(" Keine Belege vorhanden.");
} else {
for (String beleg : kunde.getBelegReferenzen()) {
System.out.println(" - " + beleg);
}
}
}
}

View File

@ -1,6 +0,0 @@
package kundenverwaltung;
public enum KundenStatus {
AKTIV,
ARCHIVIERT
}

View File

@ -1,157 +0,0 @@
package kundenverwaltung;
import java.io.IOException;
import java.util.List;
import java.util.Scanner;
public class Main {
private static KundenServiceImpl service;
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
try {
service = new KundenServiceImpl();
System.out.println("===========================================");
System.out.println(" Kundenverwaltung - Gruppe J - Team 3");
System.out.println("===========================================");
menueSchleife();
} catch (IOException e) {
System.err.println("Fehler beim Starten: " + e.getMessage());
}
}
private static void menueSchleife() {
while (true) {
System.out.println("\n--- HAUPTMENUE ---");
System.out.println("1. Kunde anlegen");
System.out.println("2. Alle Kunden anzeigen");
System.out.println("3. Kunde suchen (nach Name)");
System.out.println("4. Kunde bearbeiten");
System.out.println("5. Kunde loeschen");
System.out.println("6. Transaktionshistorie anzeigen");
System.out.println("0. Beenden");
System.out.print("Auswahl: ");
String eingabe = scanner.nextLine().trim();
switch (eingabe) {
case "1" -> kundeAnlegen();
case "2" -> alleKundenAnzeigen();
case "3" -> kundenSuchen();
case "4" -> kundeBearbeiten();
case "5" -> kundeLoschen();
case "6" -> transaktionshistorie();
case "0" -> {
System.out.println("Programm beendet.");
return;
}
default -> System.out.println("Ungueltige Eingabe, bitte erneut versuchen.");
}
}
}
private static void kundeAnlegen() {
System.out.println("\n--- KUNDE ANLEGEN ---");
System.out.print("Name / Firmenname: ");
String name = scanner.nextLine();
System.out.print("Strasse und Hausnummer: ");
String strasse = scanner.nextLine();
System.out.print("PLZ: ");
String plz = scanner.nextLine();
System.out.print("Ort: ");
String ort = scanner.nextLine();
System.out.print("Steuernummer / USt-IdNr.: ");
String steuerNummer = scanner.nextLine();
System.out.print("E-Mail: ");
String email = scanner.nextLine();
System.out.print("Telefon: ");
String telefon = scanner.nextLine();
service.kundeAnlegen(name, strasse, plz, ort, steuerNummer, email, telefon);
}
private static void alleKundenAnzeigen() {
System.out.println("\n--- ALLE KUNDEN ---");
List<Kunde> kunden = service.alleKunden();
if (kunden.isEmpty()) {
System.out.println("Keine Kunden vorhanden.");
return;
}
for (Kunde k : kunden) {
System.out.println(k);
}
System.out.println("Gesamt: " + kunden.size() + " Kunde(n).");
}
private static void kundenSuchen() {
System.out.println("\n--- KUNDE SUCHEN ---");
System.out.print("Suchbegriff (Name): ");
String suchbegriff = scanner.nextLine();
List<Kunde> ergebnis = service.sucheNachName(suchbegriff);
if (ergebnis.isEmpty()) {
System.out.println("Keine Kunden gefunden.");
return;
}
for (Kunde k : ergebnis) {
System.out.println(k);
}
}
private static void kundeBearbeiten() {
System.out.println("\n--- KUNDE BEARBEITEN ---");
System.out.print("Kunden-ID eingeben: ");
String id = scanner.nextLine();
Kunde kunde = service.findeKunde(id);
if (kunde == null) {
System.out.println("Kunde nicht gefunden.");
return;
}
System.out.println("Aktuell: " + kunde);
System.out.println("Neue Werte eingeben (Enter = Feld uebernehmen):");
System.out.print("Name [" + kunde.getName() + "]: ");
String name = scanner.nextLine();
if (name.isBlank()) name = kunde.getName();
System.out.print("Strasse [" + kunde.getStrasse() + "]: ");
String strasse = scanner.nextLine();
if (strasse.isBlank()) strasse = kunde.getStrasse();
System.out.print("PLZ [" + kunde.getPlz() + "]: ");
String plz = scanner.nextLine();
if (plz.isBlank()) plz = kunde.getPlz();
System.out.print("Ort [" + kunde.getOrt() + "]: ");
String ort = scanner.nextLine();
if (ort.isBlank()) ort = kunde.getOrt();
System.out.print("Steuernummer [" + kunde.getSteuerNummer() + "]: ");
String steuerNummer = scanner.nextLine();
if (steuerNummer.isBlank()) steuerNummer = kunde.getSteuerNummer();
System.out.print("E-Mail [" + kunde.getEmail() + "]: ");
String email = scanner.nextLine();
if (email.isBlank()) email = kunde.getEmail();
System.out.print("Telefon [" + kunde.getTelefon() + "]: ");
String telefon = scanner.nextLine();
if (telefon.isBlank()) telefon = kunde.getTelefon();
service.kundeBearbeiten(id, name, strasse, plz, ort, steuerNummer, email, telefon);
}
private static void kundeLoschen() {
System.out.println("\n--- KUNDE LOESCHEN ---");
System.out.print("Kunden-ID eingeben: ");
String id = scanner.nextLine();
service.kundeLoschen(id);
}
private static void transaktionshistorie() {
System.out.println("\n--- TRANSAKTIONSHISTORIE ---");
System.out.print("Kunden-ID eingeben: ");
String id = scanner.nextLine();
service.zeigeTransaktionshistorie(id);
}
}

View File

@ -1,109 +0,0 @@
package kundenverwaltung;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Path;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class KundenVerwaltungTest {
private KundenServiceImpl service;
@BeforeEach
void setUp() throws Exception {
service = new KundenServiceImpl();
}
@Test
@DisplayName("TC-01: Kunde anlegen -> ID K-000001 vergeben")
void tc01KundeAnlegen() {
Kunde k = service.kundeAnlegen("Muster GmbH", "Hauptstr. 1", "68163",
"Mannheim", "DE123456789", "info@muster.de", "0621-123456");
assertNotNull(k);
assertNotNull(k.getKundenId());
assertTrue(k.getKundenId().startsWith("K-"));
}
@Test
@DisplayName("TC-03: Speichern ohne E-Mail wird abgelehnt")
void tc03FehlendePflichtfeld() {
Kunde k = service.kundeAnlegen("Muster GmbH", "Hauptstr. 1", "68163",
"Mannheim", "DE123456789", "", "0621-123456");
assertNull(k);
}
@Test
@DisplayName("TC-04: Speichern ohne Name wird abgelehnt")
void tc04FehlenderName() {
Kunde k = service.kundeAnlegen("", "Hauptstr. 1", "68163",
"Mannheim", "DE123456789", "info@muster.de", "0621-123456");
assertNull(k);
}
@Test
@DisplayName("TC-07: Suche nach Name findet Treffer")
void tc07SucheNachName() {
service.kundeAnlegen("Muster GmbH", "Hauptstr. 1", "68163",
"Mannheim", "DE123456789", "info@muster.de", "0621-123456");
List<Kunde> treffer = service.sucheNachName("Muster");
assertFalse(treffer.isEmpty());
assertEquals("Muster GmbH", treffer.get(0).getName());
}
@Test
@DisplayName("TC-08: findeKunde gibt Objekt zurueck")
void tc08FindeKunde() {
Kunde angelegt = service.kundeAnlegen("Test AG", "Teststr. 1", "68163",
"Mannheim", "DE987654321", "test@test.de", "0621-654321");
assertNotNull(angelegt);
Kunde gefunden = service.findeKunde(angelegt.getKundenId());
assertNotNull(gefunden);
assertEquals("Test AG", gefunden.getName());
}
@Test
@DisplayName("TC-09: findeKunde gibt null zurueck fuer unbekannte ID")
void tc09FindeKundeNull() {
Kunde k = service.findeKunde("K-999999");
assertNull(k);
}
@Test
@DisplayName("TC-10: Loeschen referenzierter Kunde wird abgelehnt")
void tc10LoeschsperreReferenzierterKunde() {
Kunde k = service.kundeAnlegen("Ref GmbH", "Str. 1", "68163",
"Mannheim", "DE111111111", "ref@ref.de", "0621-111111");
assertNotNull(k);
k.belegHinzufuegen("R-2026-000001");
boolean geloescht = service.kundeLoschen(k.getKundenId());
assertFalse(geloescht);
}
@Test
@DisplayName("TC-11: Loeschen nicht referenzierter Kunde funktioniert")
void tc11LoeschenErfolgreich() {
Kunde k = service.kundeAnlegen("Temp GmbH", "Str. 1", "68163",
"Mannheim", "DE222222222", "temp@temp.de", "0621-222222");
assertNotNull(k);
boolean geloescht = service.kundeLoschen(k.getKundenId());
assertTrue(geloescht);
assertNull(service.findeKunde(k.getKundenId()));
}
@Test
@DisplayName("TC-06: Kunde bearbeiten aktualisiert E-Mail")
void tc06KundeBearbeiten() {
Kunde k = service.kundeAnlegen("Edit GmbH", "Str. 1", "68163",
"Mannheim", "DE333333333", "alt@edit.de", "0621-333333");
assertNotNull(k);
boolean ok = service.kundeBearbeiten(k.getKundenId(), "Edit GmbH",
"Str. 1", "68163", "Mannheim", "DE333333333", "neu@edit.de", "0621-333333");
assertTrue(ok);
assertEquals("neu@edit.de", service.findeKunde(k.getKundenId()).getEmail());
}
}