package de.team1.faktura; import de.team1.faktura.dokumente.DokumentCsvExport; import de.team1.faktura.dokumente.DokumentReferenzPruefung; import de.team1.faktura.dokumente.DokumentService; import de.team1.faktura.dokumente.EinfacherBelegnummernGenerator; import de.team1.faktura.dokumente.JsonDokumentRepository; import de.team1.faktura.dokumente.PdfBoxPdfExporter; import de.team1.faktura.dokumente.StandardDokumentService; import de.team1.faktura.gemeinsam.EreignisBus; import de.team1.faktura.gui.DokumentListenPanel; import de.team1.faktura.gui.HauptFenster; import de.team1.faktura.gui.KundenPanel; import de.team1.faktura.gui.ProduktPanel; import de.team1.faktura.gui.StammdatenController; import de.team1.faktura.kunden.EinfacherKundennummernGenerator; import de.team1.faktura.kunden.JsonKundenRepository; import de.team1.faktura.kunden.KundenCsvExport; import de.team1.faktura.kunden.KundenVerwaltungsService; import de.team1.faktura.produkte.EinfacherProduktnummernGenerator; import de.team1.faktura.produkte.JsonProduktRepository; import de.team1.faktura.produkte.ProduktCsvExport; import de.team1.faktura.produkte.ProduktVerwaltungsService; import com.formdev.flatlaf.FlatLightLaf; import javax.swing.SwingUtilities; import javax.swing.UIManager; import java.nio.file.Path; /** * Einstiegspunkt der Desktop-Fakturierungsanwendung: verdrahtet die vier * Komponenten (A: Dokumentenzyklus, B: Produkte, C: Kunden, D: Oberfläche) * und startet die GUI. Alle Daten liegen ausschließlich lokal im * Verzeichnis {@code daten/} (Q-06, IF-01). */ public final class Main { private Main() { } public static void main(String[] args) { Path datenVerzeichnis = Path.of("daten"); // Persistenz (IF-01) JsonKundenRepository kundenRepository = new JsonKundenRepository(datenVerzeichnis.resolve("kunden.json")); JsonProduktRepository produktRepository = new JsonProduktRepository(datenVerzeichnis.resolve("produkte.json")); JsonDokumentRepository dokumentRepository = new JsonDokumentRepository(datenVerzeichnis.resolve("dokumente.json")); // Gruppe A stellt die Referenzprüfungen für die Löschsperren bereit DokumentReferenzPruefung referenzPruefung = new DokumentReferenzPruefung(dokumentRepository); // Observer-Verteiler: Services melden Datenänderungen, Panels abonnieren EreignisBus ereignisBus = new EreignisBus(); // Gruppe C — Kundenverwaltung KundenVerwaltungsService kundenService = new KundenVerwaltungsService( kundenRepository, EinfacherKundennummernGenerator.ausRepository(kundenRepository), referenzPruefung, ereignisBus); // Gruppe B — Produktverwaltung ProduktVerwaltungsService produktService = new ProduktVerwaltungsService( produktRepository, EinfacherProduktnummernGenerator.ausRepository(produktRepository), referenzPruefung, ereignisBus); // Gruppe A — Dokumentenzyklus DokumentService dokumentService = new StandardDokumentService( dokumentRepository, EinfacherBelegnummernGenerator.ausRepository(dokumentRepository), kundenService, produktService, new PdfBoxPdfExporter(), ereignisBus); // Gruppe D — GUI-freier Controller der Stammdaten-Ansichten (D-F-03) StammdatenController stammdatenController = new StammdatenController(kundenService, produktService); // Gruppe D — Programmoberfläche SwingUtilities.invokeLater(() -> { try { FlatLightLaf.setup(); UIManager.put("Table.alternateRowColor", new java.awt.Color(245, 246, 248)); UIManager.put("Table.showHorizontalLines", false); } catch (Exception e) { // Standard-Look-and-Feel verwenden } HauptFenster fenster = new HauptFenster( new KundenPanel(kundenService, stammdatenController, new KundenCsvExport(kundenRepository), ereignisBus), new ProduktPanel(produktService, stammdatenController, new ProduktCsvExport(produktRepository), ereignisBus), new DokumentListenPanel(dokumentService, kundenService, produktService, new DokumentCsvExport(dokumentRepository), ereignisBus)); fenster.setVisible(true); }); } }