package kundenverwaltung; import bestandsmanagement.Produkt; import bestandsmanagement.ProduktServiceImpl; import belegworkflow.*; import java.io.IOException; import java.math.BigDecimal; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { private static KundenServiceImpl kundenService; private static ProduktServiceImpl produktService; private static BelegworkflowService belegService; private static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { try { kundenService = new KundenServiceImpl(); produktService = new ProduktServiceImpl(); belegService = new BelegworkflowService(); System.out.println("==========================================="); System.out.println(" Fakturierungsanwendung - Team 3"); System.out.println("==========================================="); hauptmenue(); } catch (IOException e) { System.err.println("Fehler beim Starten: " + e.getMessage()); } } private static void hauptmenue() { while (true) { System.out.println("\n=== HAUPTMENUE ==="); System.out.println("1. Kundenverwaltung"); System.out.println("2. Bestandsmanagement"); System.out.println("3. Belegworkflow"); System.out.println("0. Beenden"); System.out.print("Auswahl: "); switch (scanner.nextLine().trim()) { case "1" -> kundenmenue(); case "2" -> produktmenue(); case "3" -> belegmenue(); 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 "2" -> alleKundenAnzeigen(); case "3" -> kundenSuchen(); case "4" -> kundeBearbeiten(); case "5" -> kundeLoschen(); case "6" -> transaktionshistorie(); case "0" -> { return; } default -> System.out.println("Ungueltige Eingabe."); } } } 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(); kundenService.kundeAnlegen(name, strasse, plz, ort, steuerNummer, email, telefon); } private static void alleKundenAnzeigen() { System.out.println("\n--- ALLE KUNDEN ---"); List kunden = kundenService.alleKunden(); if (kunden.isEmpty()) { System.out.println("Keine Kunden vorhanden."); return; } kunden.forEach(System.out::println); System.out.println("Gesamt: " + kunden.size() + " Kunde(n)."); } private static void kundenSuchen() { System.out.println("\n--- KUNDE SUCHEN ---"); System.out.print("Suchbegriff (Name): "); List ergebnis = kundenService.sucheNachName(scanner.nextLine()); if (ergebnis.isEmpty()) { System.out.println("Keine Kunden gefunden."); return; } ergebnis.forEach(System.out::println); } private static void kundeBearbeiten() { System.out.println("\n--- KUNDE BEARBEITEN ---"); System.out.print("Kunden-ID: "); String id = scanner.nextLine(); Kunde kunde = kundenService.findeKunde(id); if (kunde == null) { System.out.println("Kunde nicht gefunden."); return; } System.out.println("Aktuell: " + kunde); 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(); kundenService.kundeBearbeiten(id, name, strasse, plz, ort, steuerNummer, email, telefon); } private static void kundeLoschen() { System.out.println("\n--- KUNDE LOESCHEN ---"); System.out.print("Kunden-ID: "); kundenService.kundeLoschen(scanner.nextLine()); } private static void transaktionshistorie() { System.out.println("\n--- TRANSAKTIONSHISTORIE ---"); 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 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 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(); 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()); } // ─── BELEGWORKFLOW ────────────────────────────────────────────── private static void belegmenue() { while (true) { System.out.println("\n--- BELEGWORKFLOW ---"); System.out.println("1. Angebot erstellen"); System.out.println("2. Alle Angebote anzeigen"); System.out.println("3. Rechnung aus Angebot erstellen"); System.out.println("4. Alle Rechnungen anzeigen"); System.out.println("5. Rechnung festschreiben"); System.out.println("0. Zurueck"); System.out.print("Auswahl: "); switch (scanner.nextLine().trim()) { case "1" -> angebotErstellen(); case "2" -> alleAngeboteAnzeigen(); case "3" -> rechnungAusAngebot(); case "4" -> alleRechnungenAnzeigen(); case "5" -> rechnungFestschreiben(); case "0" -> { return; } default -> System.out.println("Ungueltige Eingabe."); } } } private static void angebotErstellen() { System.out.println("\n--- ANGEBOT ERSTELLEN ---"); System.out.print("Kunden-ID: "); String kundenId = scanner.nextLine(); List positionen = new ArrayList<>(); while (true) { System.out.println("Position hinzufuegen (Enter zum Beenden):"); System.out.print("Produkt-ID (oder Enter zum Beenden): "); String produktId = scanner.nextLine(); if (produktId.isBlank()) break; Produkt produkt = produktService.findeProdukt(produktId); if (produkt == null) { System.out.println("Produkt nicht gefunden."); continue; } System.out.print("Menge: "); int menge = Integer.parseInt(scanner.nextLine().trim()); positionen.add(new Dokumentposition( produkt.getProduktId(), produkt.getBezeichnung(), menge, produkt.getNettoEinzelpreis(), produkt.getMehrwertsteuersatz() )); System.out.println("Position hinzugefuegt: " + produkt.getBezeichnung()); } if (positionen.isEmpty()) { System.out.println("Fehler: Mindestens eine Position erforderlich."); return; } System.out.print("Gueltig bis (YYYY-MM-DD): "); LocalDate gueltigBis = LocalDate.parse(scanner.nextLine()); belegService.erstelleAngebot(kundenId, positionen, gueltigBis); } private static void alleAngeboteAnzeigen() { System.out.println("\n--- ALLE ANGEBOTE ---"); List angebote = belegService.alleAngebote(); if (angebote.isEmpty()) { System.out.println("Keine Angebote vorhanden."); return; } angebote.forEach(a -> System.out.println(a.getBelegnummer() + " | Kunde: " + a.getKundenReferenz() + " | Status: " + a.getStatus())); } private static void rechnungAusAngebot() { System.out.println("\n--- RECHNUNG AUS ANGEBOT ---"); System.out.print("Angebotsnummer: "); String angebotsNr = scanner.nextLine(); System.out.print("Rechnungsdatum (YYYY-MM-DD): "); LocalDate rechnungsdatum = LocalDate.parse(scanner.nextLine()); System.out.print("Leistungsdatum (YYYY-MM-DD): "); LocalDate leistungsdatum = LocalDate.parse(scanner.nextLine()); System.out.print("Zahlungsziel (YYYY-MM-DD): "); LocalDate zahlungsziel = LocalDate.parse(scanner.nextLine()); belegService.erstelleRechnungAusAngebot(angebotsNr, rechnungsdatum, leistungsdatum, zahlungsziel); } private static void alleRechnungenAnzeigen() { System.out.println("\n--- ALLE RECHNUNGEN ---"); List rechnungen = belegService.alleRechnungen(); if (rechnungen.isEmpty()) { System.out.println("Keine Rechnungen vorhanden."); return; } rechnungen.forEach(r -> System.out.println(r.getBelegnummer() + " | Kunde: " + r.getKundenReferenz() + " | Status: " + r.getStatus() + " | Festgeschrieben: " + r.isFestgeschrieben())); } private static void rechnungFestschreiben() { System.out.println("\n--- RECHNUNG FESTSCHREIBEN ---"); System.out.print("Rechnungsnummer: "); belegService.finalisiereRechnung(scanner.nextLine()); } }