Gruppe L: Bestandsmanagement hinzugefuegt

main
Christian Khazanovych 2026-06-24 17:14:29 +02:00
parent 8bc28a7b5e
commit ca66a4685d
22 changed files with 482 additions and 49 deletions

4
.vscode/settings.json vendored 100644
View File

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

5
data/kunden.csv 100644
View File

@ -0,0 +1,5 @@
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

@ -0,0 +1 @@
7

View File

@ -0,0 +1 @@
1

View File

BIN
lib/junit.jar 100644

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,71 @@
package bestandsmanagement;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class Produkt {
private String produktId;
private String bezeichnung;
private BigDecimal nettoEinzelpreis;
private BigDecimal mehrwertsteuersatz;
private int bestand;
private String beschreibung;
private List<String> belegReferenzen;
private boolean verfuegbar;
public Produkt(String produktId, String bezeichnung, BigDecimal nettoEinzelpreis,
BigDecimal mehrwertsteuersatz, int bestand, String beschreibung) {
this.produktId = produktId;
this.bezeichnung = bezeichnung;
this.nettoEinzelpreis = nettoEinzelpreis;
this.mehrwertsteuersatz = mehrwertsteuersatz;
this.bestand = bestand;
this.beschreibung = beschreibung;
this.belegReferenzen = new ArrayList<>();
this.verfuegbar = bestand > 0;
}
// Validierung (F-09)
public boolean validiereFelder() {
return bezeichnung != null && !bezeichnung.isBlank() &&
nettoEinzelpreis != null && nettoEinzelpreis.compareTo(BigDecimal.ZERO) >= 0 &&
mehrwertsteuersatz != null && mehrwertsteuersatz.compareTo(BigDecimal.ZERO) >= 0 &&
bestand >= 0;
}
// Getter
public String getProduktId() { return produktId; }
public String getBezeichnung() { return bezeichnung; }
public BigDecimal getNettoEinzelpreis() { return nettoEinzelpreis; }
public BigDecimal getMehrwertsteuersatz(){ return mehrwertsteuersatz; }
public int getBestand() { return bestand; }
public String getBeschreibung() { return beschreibung; }
public List<String> getBelegReferenzen() { return belegReferenzen; }
public boolean isVerfuegbar() { return verfuegbar; }
// Setter
public void setBezeichnung(String bezeichnung) { this.bezeichnung = bezeichnung; }
public void setNettoEinzelpreis(BigDecimal preis) { this.nettoEinzelpreis = preis; }
public void setMehrwertsteuersatz(BigDecimal mwst) { this.mehrwertsteuersatz = mwst; }
public void setBeschreibung(String beschreibung) { this.beschreibung = beschreibung; }
public void setBestand(int bestand) {
this.bestand = bestand;
this.verfuegbar = bestand > 0; // F-08
}
public void belegHinzufuegen(String belegnummer) {
belegReferenzen.add(belegnummer);
}
@Override
public String toString() {
return String.format("[%s] %s | Preis: %.2f EUR | MwSt: %.0f%% | Bestand: %d | %s",
produktId, bezeichnung,
nettoEinzelpreis,
mehrwertsteuersatz.multiply(new BigDecimal("100")),
bestand,
verfuegbar ? "VERFUEGBAR" : "NICHT VERFUEGBAR");
}
}

View File

@ -0,0 +1,43 @@
package bestandsmanagement;
import java.io.*;
import java.nio.file.*;
public class ProduktIdGenerator {
private static final String COUNTER_FILE = "data/produkt_counter.txt";
private int counter;
public ProduktIdGenerator() {
this.counter = ladeCounter();
}
// Gibt die nächste lückenlose Produktnummer zurück
public String naechsteProduktId() {
counter++;
speichereCounter();
return String.format("P-%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

@ -0,0 +1,102 @@
package bestandsmanagement;
import java.io.*;
import java.math.BigDecimal;
import java.nio.file.*;
import java.util.*;
public class ProduktRepository {
private static final String DATA_FILE = "data/produkte.csv";
private List<Produkt> produkte;
public ProduktRepository() throws IOException {
this.produkte = new ArrayList<>();
Files.createDirectories(Path.of("data"));
laden();
}
public void speichern(Produkt produkt) {
produkte.add(produkt);
speichereAlle();
}
public void aktualisieren(Produkt produkt) {
speichereAlle();
}
public void loeschen(String produktId) {
produkte.removeIf(p -> p.getProduktId().equals(produktId));
speichereAlle();
}
public List<Produkt> alleProdukte() {
return new ArrayList<>(produkte);
}
public Produkt findeNachId(String produktId) {
return produkte.stream()
.filter(p -> p.getProduktId().equals(produktId))
.findFirst()
.orElse(null);
}
public List<Produkt> sucheNachBezeichnung(String suchbegriff) {
List<Produkt> ergebnis = new ArrayList<>();
for (Produkt p : produkte) {
if (p.getBezeichnung().toLowerCase().contains(suchbegriff.toLowerCase())) {
ergebnis.add(p);
}
}
return ergebnis;
}
private void speichereAlle() {
try {
StringBuilder sb = new StringBuilder();
for (Produkt p : produkte) {
sb.append(p.getProduktId()).append(";")
.append(p.getBezeichnung()).append(";")
.append(p.getNettoEinzelpreis()).append(";")
.append(p.getMehrwertsteuersatz()).append(";")
.append(p.getBestand()).append(";")
.append(p.getBeschreibung() != null ? p.getBeschreibung() : "").append(";")
.append(String.join(",", p.getBelegReferenzen())).append("\n");
}
Files.writeString(Path.of(DATA_FILE), sb.toString());
} catch (IOException e) {
System.err.println("Fehler beim Speichern: " + e.getMessage());
}
}
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 < 7) continue;
Produkt p = new Produkt(
teile[0],
teile[1],
new BigDecimal(teile[2]),
new BigDecimal(teile[3]),
Integer.parseInt(teile[4]),
teile[5].isBlank() ? null : teile[5]
);
if (!teile[6].isBlank()) {
for (String beleg : teile[6].split(",")) {
p.belegHinzufuegen(beleg);
}
}
produkte.add(p);
}
} catch (IOException e) {
System.err.println("Fehler beim Laden: " + e.getMessage());
}
}
}

View File

@ -0,0 +1,107 @@
package bestandsmanagement;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
public class ProduktServiceImpl {
private final ProduktRepository repository;
private final ProduktIdGenerator idGenerator;
public ProduktServiceImpl() throws IOException {
this.repository = new ProduktRepository();
this.idGenerator = new ProduktIdGenerator();
}
// Legt einen neuen Artikel an (F-01, F-02, F-05)
public Produkt produktAnlegen(String bezeichnung, BigDecimal nettoEinzelpreis,
BigDecimal mehrwertsteuersatz, int bestand, String beschreibung) {
// Negativer Bestand wird abgelehnt (F-09)
if (bestand < 0) {
System.out.println("Fehler: Negativer Lagerbestand ist nicht erlaubt.");
return null;
}
Produkt produkt = new Produkt("TEMP", bezeichnung, nettoEinzelpreis,
mehrwertsteuersatz, bestand, beschreibung);
if (!produkt.validiereFelder()) {
System.out.println("Fehler: Alle Pflichtfelder muessen ausgefuellt sein.");
return null;
}
String id = idGenerator.naechsteProduktId();
Produkt neuesProdukt = new Produkt(id, bezeichnung, nettoEinzelpreis,
mehrwertsteuersatz, bestand, beschreibung);
repository.speichern(neuesProdukt);
System.out.println("Artikel erfolgreich angelegt: " + neuesProdukt);
return neuesProdukt;
}
// Bearbeitet einen bestehenden Artikel (F-03, F-04)
public boolean produktBearbeiten(String produktId, String bezeichnung,
BigDecimal nettoEinzelpreis, BigDecimal mehrwertsteuersatz,
int bestand, String beschreibung) {
Produkt produkt = repository.findeNachId(produktId);
if (produkt == null) {
System.out.println("Fehler: Artikel mit ID " + produktId + " nicht gefunden.");
return false;
}
// Negativer Bestand wird abgelehnt (F-09)
if (bestand < 0) {
System.out.println("Fehler: Negativer Lagerbestand ist nicht erlaubt.");
return false;
}
produkt.setBezeichnung(bezeichnung);
produkt.setNettoEinzelpreis(nettoEinzelpreis);
produkt.setMehrwertsteuersatz(mehrwertsteuersatz);
produkt.setBestand(bestand);
produkt.setBeschreibung(beschreibung);
if (!produkt.validiereFelder()) {
System.out.println("Fehler: Alle Pflichtfelder muessen ausgefuellt sein.");
return false;
}
repository.aktualisieren(produkt);
System.out.println("Artikel erfolgreich aktualisiert: " + produkt);
return true;
}
// Löscht einen Artikel mit Integritätsprüfung (F-10, F-11)
public boolean produktLoeschen(String produktId) {
Produkt produkt = repository.findeNachId(produktId);
if (produkt == null) {
System.out.println("Fehler: Artikel mit ID " + produktId + " nicht gefunden.");
return false;
}
if (!produkt.getBelegReferenzen().isEmpty()) {
System.out.println("Fehler: Artikel kann nicht geloescht werden, da er in " +
produkt.getBelegReferenzen().size() + " Beleg(en) referenziert wird.");
return false;
}
repository.loeschen(produktId);
System.out.println("Artikel " + produktId + " erfolgreich geloescht.");
return true;
}
// Gibt alle Artikel zurück (F-06)
public List<Produkt> alleProdukte() {
return repository.alleProdukte();
}
// Sucht Artikel nach Bezeichnung oder ID (F-07)
public List<Produkt> sucheNachBezeichnung(String suchbegriff) {
return repository.sucheNachBezeichnung(suchbegriff);
}
// Gibt einen Artikel anhand der ID zurück
public Produkt findeProdukt(String produktId) {
return repository.findeNachId(produktId);
}
}

View File

@ -1,52 +1,76 @@
package kundenverwaltung; package kundenverwaltung;
import bestandsmanagement.Produkt;
import bestandsmanagement.ProduktServiceImpl;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Scanner; import java.util.Scanner;
public class Main { public class Main {
private static KundenServiceImpl service; private static KundenServiceImpl kundenService;
private static ProduktServiceImpl produktService;
private static Scanner scanner = new Scanner(System.in); private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) { public static void main(String[] args) {
try { try {
service = new KundenServiceImpl(); kundenService = new KundenServiceImpl();
produktService = new ProduktServiceImpl();
System.out.println("==========================================="); System.out.println("===========================================");
System.out.println(" Kundenverwaltung - Gruppe J - Team 3"); System.out.println(" Fakturierungsanwendung - Team 3");
System.out.println("==========================================="); System.out.println("===========================================");
menueSchleife(); hauptmenue();
} catch (IOException e) { } catch (IOException e) {
System.err.println("Fehler beim Starten: " + e.getMessage()); System.err.println("Fehler beim Starten: " + e.getMessage());
} }
} }
private static void menueSchleife() { private static void hauptmenue() {
while (true) { while (true) {
System.out.println("\n--- HAUPTMENUE ---"); System.out.println("\n=== HAUPTMENUE ===");
System.out.println("1. Kunde anlegen"); System.out.println("1. Kundenverwaltung");
System.out.println("2. Alle Kunden anzeigen"); System.out.println("2. Bestandsmanagement");
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.println("0. Beenden");
System.out.print("Auswahl: "); System.out.print("Auswahl: ");
String eingabe = scanner.nextLine().trim(); String eingabe = scanner.nextLine().trim();
switch (eingabe) { switch (eingabe) {
case "1" -> kundenmenue();
case "2" -> produktmenue();
case "0" -> {
System.out.println("Programm beendet.");
return;
}
default -> System.out.println("Ungueltige Eingabe.");
}
}
}
// ─── KUNDENVERWALTUNG ───────────────────────────────────────────
private static void kundenmenue() {
while (true) {
System.out.println("\n--- KUNDENVERWALTUNG ---");
System.out.println("1. Kunde anlegen");
System.out.println("2. Alle Kunden anzeigen");
System.out.println("3. Kunde suchen");
System.out.println("4. Kunde bearbeiten");
System.out.println("5. Kunde loeschen");
System.out.println("6. Transaktionshistorie");
System.out.println("0. Zurueck");
System.out.print("Auswahl: ");
switch (scanner.nextLine().trim()) {
case "1" -> kundeAnlegen(); case "1" -> kundeAnlegen();
case "2" -> alleKundenAnzeigen(); case "2" -> alleKundenAnzeigen();
case "3" -> kundenSuchen(); case "3" -> kundenSuchen();
case "4" -> kundeBearbeiten(); case "4" -> kundeBearbeiten();
case "5" -> kundeLoschen(); case "5" -> kundeLoschen();
case "6" -> transaktionshistorie(); case "6" -> transaktionshistorie();
case "0" -> { case "0" -> { return; }
System.out.println("Programm beendet."); default -> System.out.println("Ungueltige Eingabe.");
return;
}
default -> System.out.println("Ungueltige Eingabe, bitte erneut versuchen.");
} }
} }
} }
@ -67,48 +91,32 @@ public class Main {
String email = scanner.nextLine(); String email = scanner.nextLine();
System.out.print("Telefon: "); System.out.print("Telefon: ");
String telefon = scanner.nextLine(); String telefon = scanner.nextLine();
kundenService.kundeAnlegen(name, strasse, plz, ort, steuerNummer, email, telefon);
service.kundeAnlegen(name, strasse, plz, ort, steuerNummer, email, telefon);
} }
private static void alleKundenAnzeigen() { private static void alleKundenAnzeigen() {
System.out.println("\n--- ALLE KUNDEN ---"); System.out.println("\n--- ALLE KUNDEN ---");
List<Kunde> kunden = service.alleKunden(); List<Kunde> kunden = kundenService.alleKunden();
if (kunden.isEmpty()) { if (kunden.isEmpty()) { System.out.println("Keine Kunden vorhanden."); return; }
System.out.println("Keine Kunden vorhanden."); kunden.forEach(System.out::println);
return;
}
for (Kunde k : kunden) {
System.out.println(k);
}
System.out.println("Gesamt: " + kunden.size() + " Kunde(n)."); System.out.println("Gesamt: " + kunden.size() + " Kunde(n).");
} }
private static void kundenSuchen() { private static void kundenSuchen() {
System.out.println("\n--- KUNDE SUCHEN ---"); System.out.println("\n--- KUNDE SUCHEN ---");
System.out.print("Suchbegriff (Name): "); System.out.print("Suchbegriff (Name): ");
String suchbegriff = scanner.nextLine(); List<Kunde> ergebnis = kundenService.sucheNachName(scanner.nextLine());
List<Kunde> ergebnis = service.sucheNachName(suchbegriff); if (ergebnis.isEmpty()) { System.out.println("Keine Kunden gefunden."); return; }
if (ergebnis.isEmpty()) { ergebnis.forEach(System.out::println);
System.out.println("Keine Kunden gefunden.");
return;
}
for (Kunde k : ergebnis) {
System.out.println(k);
}
} }
private static void kundeBearbeiten() { private static void kundeBearbeiten() {
System.out.println("\n--- KUNDE BEARBEITEN ---"); System.out.println("\n--- KUNDE BEARBEITEN ---");
System.out.print("Kunden-ID eingeben: "); System.out.print("Kunden-ID: ");
String id = scanner.nextLine(); String id = scanner.nextLine();
Kunde kunde = service.findeKunde(id); Kunde kunde = kundenService.findeKunde(id);
if (kunde == null) { if (kunde == null) { System.out.println("Kunde nicht gefunden."); return; }
System.out.println("Kunde nicht gefunden.");
return;
}
System.out.println("Aktuell: " + kunde); System.out.println("Aktuell: " + kunde);
System.out.println("Neue Werte eingeben (Enter = Feld uebernehmen):");
System.out.print("Name [" + kunde.getName() + "]: "); System.out.print("Name [" + kunde.getName() + "]: ");
String name = scanner.nextLine(); String name = scanner.nextLine();
@ -138,20 +146,111 @@ public class Main {
String telefon = scanner.nextLine(); String telefon = scanner.nextLine();
if (telefon.isBlank()) telefon = kunde.getTelefon(); if (telefon.isBlank()) telefon = kunde.getTelefon();
service.kundeBearbeiten(id, name, strasse, plz, ort, steuerNummer, email, telefon); kundenService.kundeBearbeiten(id, name, strasse, plz, ort, steuerNummer, email, telefon);
} }
private static void kundeLoschen() { private static void kundeLoschen() {
System.out.println("\n--- KUNDE LOESCHEN ---"); System.out.println("\n--- KUNDE LOESCHEN ---");
System.out.print("Kunden-ID eingeben: "); System.out.print("Kunden-ID: ");
String id = scanner.nextLine(); kundenService.kundeLoschen(scanner.nextLine());
service.kundeLoschen(id);
} }
private static void transaktionshistorie() { private static void transaktionshistorie() {
System.out.println("\n--- TRANSAKTIONSHISTORIE ---"); System.out.println("\n--- TRANSAKTIONSHISTORIE ---");
System.out.print("Kunden-ID eingeben: "); System.out.print("Kunden-ID: ");
kundenService.zeigeTransaktionshistorie(scanner.nextLine());
}
// ─── BESTANDSMANAGEMENT ─────────────────────────────────────────
private static void produktmenue() {
while (true) {
System.out.println("\n--- BESTANDSMANAGEMENT ---");
System.out.println("1. Artikel anlegen");
System.out.println("2. Alle Artikel anzeigen");
System.out.println("3. Artikel suchen");
System.out.println("4. Artikel bearbeiten");
System.out.println("5. Artikel loeschen");
System.out.println("0. Zurueck");
System.out.print("Auswahl: ");
switch (scanner.nextLine().trim()) {
case "1" -> artikelAnlegen();
case "2" -> alleArtikelAnzeigen();
case "3" -> artikelSuchen();
case "4" -> artikelBearbeiten();
case "5" -> artikelLoeschen();
case "0" -> { return; }
default -> System.out.println("Ungueltige Eingabe.");
}
}
}
private static void artikelAnlegen() {
System.out.println("\n--- ARTIKEL ANLEGEN ---");
System.out.print("Bezeichnung: ");
String bezeichnung = scanner.nextLine();
System.out.print("Netto-Einzelpreis (z.B. 19.99): ");
BigDecimal preis = new BigDecimal(scanner.nextLine().replace(",", "."));
System.out.print("Mehrwertsteuersatz (z.B. 0.19 fuer 19%): ");
BigDecimal mwst = new BigDecimal(scanner.nextLine().replace(",", "."));
System.out.print("Lagerbestand: ");
int bestand = Integer.parseInt(scanner.nextLine().trim());
System.out.print("Beschreibung (optional, Enter ueberspringen): ");
String beschreibung = scanner.nextLine();
if (beschreibung.isBlank()) beschreibung = null;
produktService.produktAnlegen(bezeichnung, preis, mwst, bestand, beschreibung);
}
private static void alleArtikelAnzeigen() {
System.out.println("\n--- ALLE ARTIKEL ---");
List<Produkt> produkte = produktService.alleProdukte();
if (produkte.isEmpty()) { System.out.println("Keine Artikel vorhanden."); return; }
produkte.forEach(System.out::println);
System.out.println("Gesamt: " + produkte.size() + " Artikel.");
}
private static void artikelSuchen() {
System.out.println("\n--- ARTIKEL SUCHEN ---");
System.out.print("Suchbegriff (Bezeichnung): ");
List<Produkt> ergebnis = produktService.sucheNachBezeichnung(scanner.nextLine());
if (ergebnis.isEmpty()) { System.out.println("Keine Artikel gefunden."); return; }
ergebnis.forEach(System.out::println);
}
private static void artikelBearbeiten() {
System.out.println("\n--- ARTIKEL BEARBEITEN ---");
System.out.print("Artikel-ID: ");
String id = scanner.nextLine(); String id = scanner.nextLine();
service.zeigeTransaktionshistorie(id); Produkt produkt = produktService.findeProdukt(id);
if (produkt == null) { System.out.println("Artikel nicht gefunden."); return; }
System.out.println("Aktuell: " + produkt);
System.out.print("Bezeichnung [" + produkt.getBezeichnung() + "]: ");
String bezeichnung = scanner.nextLine();
if (bezeichnung.isBlank()) bezeichnung = produkt.getBezeichnung();
System.out.print("Netto-Einzelpreis [" + produkt.getNettoEinzelpreis() + "]: ");
String preisStr = scanner.nextLine();
BigDecimal preis = preisStr.isBlank() ? produkt.getNettoEinzelpreis() : new BigDecimal(preisStr.replace(",", "."));
System.out.print("Mehrwertsteuersatz [" + produkt.getMehrwertsteuersatz() + "]: ");
String mwstStr = scanner.nextLine();
BigDecimal mwst = mwstStr.isBlank() ? produkt.getMehrwertsteuersatz() : new BigDecimal(mwstStr.replace(",", "."));
System.out.print("Lagerbestand [" + produkt.getBestand() + "]: ");
String bestandStr = scanner.nextLine();
int bestand = bestandStr.isBlank() ? produkt.getBestand() : Integer.parseInt(bestandStr.trim());
System.out.print("Beschreibung [" + produkt.getBeschreibung() + "]: ");
String beschreibung = scanner.nextLine();
if (beschreibung.isBlank()) beschreibung = produkt.getBeschreibung();
produktService.produktBearbeiten(id, bezeichnung, preis, mwst, bestand, beschreibung);
}
private static void artikelLoeschen() {
System.out.println("\n--- ARTIKEL LOESCHEN ---");
System.out.print("Artikel-ID: ");
produktService.produktLoeschen(scanner.nextLine());
} }
} }