# Modultestbericht – Dokumentenprozess (Gruppe F) | Feld | Wert | |---|---| | Modul | Dokumentenprozess | | Gruppe | F | | Verantwortlicher | Andreas Ivanovic | | Datum | 28.06.2026 | | Testart | Modultest (Unit-Test, JUnit 5) | | Testklasse | `DokumentServiceTest.java` | | Paket | `de.hsmannheim.faktura.dokumente.service` | | Spec-Grundlage | Pflichtenheft Gruppe F v1.0.1 | | Gesamt-Ergebnis | ✅ 16 / 16 Tests bestanden | --- ## 1. Testumgebung | Komponente | Version | |---|---| | Java | 17 | | JUnit Jupiter | 5.10.2 | | Maven Surefire | 3.2.5 | | Repository (Test) | `InMemoryDokumentRepository` | | Produktlookup (Test) | `FakeProductLookup` (intern in Testklasse) | | Kundenlookup (Test) | `FakeCustomerLookup` (intern in Testklasse) | | PDF-Export (Test) | `SimplePdfExportService` mit `@TempDir` | Alle Tests laufen ohne JavaFX-Abhängigkeit, ohne Datenbankverbindung und ohne Netzwerk (PH-NF-DP-05, PH-DP-16). --- ## 2. Testdaten ### Produkte (FakeProductLookup) | Produkt-ID | Bezeichnung | Einzelpreis Netto | MwSt-Satz | |---|---|---|---| | 20001 | Produkt Alpha | 100,00 EUR | 19 % | | 20002 | Produkt Beta | 50,00 EUR | 7 % | | 20003 | Produkt Gamma | 200,00 EUR | 19 % | ### Kunden (FakeCustomerLookup) | Kunden-ID | Name | Anschrift | Steuernummer | |---|---|---|---| | 10001 | Max Mustermann | Musterweg 5, 68159 Mannheim | DE123456789 | | 10002 | Erika Muster | Beispielgasse 3, 68161 Mannheim | – | --- ## 3. Testergebnisse ### MT-DP-01 – Angebot anlegen (Happy Path) | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-01 | | Methode | `erstelleAngebot(long, List)` | | Vorbedingung | Kunde 10001 und Produkte 20001, 20002 existieren | | Eingabe | kundenId=10001, Positionen: [20001×2, 20002×1] | | Erwartetes Ergebnis | Angebot mit Nummer A-2026-xxxx, Status OFFEN, 2 Positionen, Datum gesetzt | | Tatsächliches Ergebnis | ✅ Angebot erstellt, alle Felder korrekt | --- ### MT-DP-02 – Summenberechnung Angebot | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-01, PH-DP-08 | | Methode | `erstelleAngebot(...)` → `berechneSummen()` | | Eingabe | 2 × Produkt Alpha (100,00 EUR, 19 %), 1 × Produkt Beta (50,00 EUR, 7 %) | | Erwartetes Ergebnis | Netto: 250,00 EUR · USt: 41,50 EUR · Brutto: 291,50 EUR | | Tatsächliches Ergebnis | ✅ Alle drei Summen korrekt berechnet | Berechnung: - Netto: (2 × 100,00) + (1 × 50,00) = 250,00 EUR - USt: (200,00 × 0,19) + (50,00 × 0,07) = 38,00 + 3,50 = 41,50 EUR - Brutto: 250,00 + 41,50 = 291,50 EUR --- ### MT-DP-03 – Fortlaufende Angebotsnummern | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-02 | | Methode | `DokumentNummernGenerator.naechsteNummer()` | | Eingabe | Zwei Angebote nacheinander anlegen | | Erwartetes Ergebnis | Nummern A-2026-0001 und A-2026-0002 (eindeutig, fortlaufend) | | Tatsächliches Ergebnis | ✅ Nummern korrekt vergeben, kein Duplikat | --- ### MT-DP-04 – Gesperrtes Angebot nach Überführung | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-03 | | Methode | `aktualisiereAngebot(String, List)` | | Vorbedingung | Angebot wurde bereits in AB überführt (Status UEBERFUEHRT) | | Eingabe | Versuch Angebot zu bearbeiten | | Erwartetes Ergebnis | `IllegalStateException` wird geworfen | | Tatsächliches Ergebnis | ✅ Exception korrekt ausgelöst | --- ### MT-DP-05 – Auftragsbestätigung erzeugen | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-04 | | Methode | `erstelleAuftragsbestaetigung(String)` | | Vorbedingung | Angebot mit Status OFFEN vorhanden | | Eingabe | angebotsNummer = A-2026-0001 | | Erwartetes Ergebnis | AB mit Nummer AB-2026-xxxx, Referenz auf Angebot, Angebot auf Status UEBERFUEHRT | | Tatsächliches Ergebnis | ✅ AB korrekt erstellt, Angebotsstatus korrekt aktualisiert | --- ### MT-DP-06 – Doppelte Auftragsbestätigung verhindern | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-05 | | Methode | `erstelleAuftragsbestaetigung(String)` (zweiter Aufruf) | | Vorbedingung | AB für dieses Angebot existiert bereits | | Eingabe | Zweiter Versuch AB für dasselbe Angebot zu erzeugen | | Erwartetes Ergebnis | `DuplicateDocumentException` wird geworfen | | Tatsächliches Ergebnis | ✅ Exception korrekt ausgelöst | | Hinweis | **Patch 28.06.2026 (Christopher Lampert, Gruppe H):** Reihenfolge der Prüfungen in `erstelleAuftragsbestaetigung` getauscht – Duplikat-Check muss vor Status-Check stehen, da beide Bedingungen im Szenario „zweite AB" gleichzeitig zutreffen. Spec verlangt explizit `DuplicateDocumentException` (PH-DP-05). | --- ### MT-DP-07 – Lieferschein erzeugen | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-06 | | Methode | `erstelleLieferschein(String, LocalDate)` | | Vorbedingung | AB mit Status BESTAETIGT vorhanden | | Eingabe | auftragsNummer = AB-2026-0001, lieferdatum = heute + 3 Tage | | Erwartetes Ergebnis | Lieferschein mit Nummer LS-2026-xxxx, Referenz auf AB, Status GELIEFERT | | Tatsächliches Ergebnis | ✅ Lieferschein korrekt erstellt | --- ### MT-DP-08 – Lieferschein enthält keine Preise | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-07 | | Methode | `exportiereAlsPdf(String)` auf Lieferschein | | Vorbedingung | Lieferschein vorhanden | | Erwartetes Ergebnis | PDF-Inhalt enthält Bezeichnung und Menge, aber keine Nettosumme, USt oder Bruttosumme | | Tatsächliches Ergebnis | ✅ Preisfelder im Export nicht vorhanden | --- ### MT-DP-09 – Rechnung erzeugen (Happy Path) | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-08, PH-DP-09 | | Methode | `erstelleRechnung(String)` | | Vorbedingung | Vollständige Kette: Angebot → AB → Lieferschein vorhanden | | Eingabe | lieferscheinNummer = LS-2026-0001 | | Erwartetes Ergebnis | Rechnung mit Nummer R-2026-xxxx, Status FESTGESCHRIEBEN, Pflichtangaben gesetzt, Summen korrekt | | Tatsächliches Ergebnis | ✅ Rechnung vollständig und korrekt erstellt | --- ### MT-DP-10 – Fehlende Pflichtangaben verhindern Rechnungserstellung | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-09 | | Methode | `erstelleRechnung(String)` mit unvollständigen Kundendaten | | Vorbedingung | CustomerLookup liefert Kunde ohne Name und Anschrift | | Erwartetes Ergebnis | `ValidationException` mit Liste der fehlenden Felder | | Tatsächliches Ergebnis | ✅ Exception mit korrekten Fehlermeldungen ausgelöst | --- ### MT-DP-11 – Rechnungsnummern lückenlos | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-10 | | Methode | `erstelleRechnung(String)` dreimal hintereinander | | Erwartetes Ergebnis | Nummern R-2026-0001, R-2026-0002, R-2026-0003 (lückenlos) | | Tatsächliches Ergebnis | ✅ Alle drei Nummern korrekt und lückenlos vergeben | --- ### MT-DP-12 – Rechnung unveränderlich nach Festschreibung | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-11 | | Methode | `rechnung.pruefeAenderbar()` auf festgeschriebener Rechnung | | Vorbedingung | Rechnung wurde erstellt und ist festgeschrieben | | Erwartetes Ergebnis | `IllegalStateException` beim Versuch die Rechnung zu ändern | | Tatsächliches Ergebnis | ✅ Exception korrekt ausgelöst, Status nach Reload weiterhin FESTGESCHRIEBEN | --- ### MT-DP-13 – Preis-Snapshot bleibt stabil | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-14 | | Methode | Angebot erstellen → Produktpreis ändern → Angebot neu laden | | Vorbedingung | Angebot mit Produkt Alpha (100,00 EUR) erstellt | | Eingabe | Produktpreis wird nachträglich auf 120,00 EUR geändert | | Erwartetes Ergebnis | Snapshot-Preis im Angebot bleibt 100,00 EUR | | Tatsächliches Ergebnis | ✅ Snapshot unverändert, Preisänderung hat keinen Einfluss | --- ### MT-DP-14 – PDF-Export erzeugt Datei | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-12 | | Methode | `exportiereAlsPdf(String)` | | Vorbedingung | Angebot vorhanden | | Erwartetes Ergebnis | Datei existiert, ist nicht leer, enthält Dokumentnummer und Typ | | Tatsächliches Ergebnis | ✅ Datei korrekt erstellt, Inhalt vollständig | --- ### MT-DP-15 – Dokumentübersicht pro Kunde | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-13 | | Methode | `findByKunde(long)` | | Vorbedingung | 2 Dokumente für Kunde 10001, 1 Dokument für Kunde 10002 | | Erwartetes Ergebnis | Kunde 10001 → 2 Dokumente, Kunde 10002 → 1 Dokument | | Tatsächliches Ergebnis | ✅ Filterung korrekt, keine Vermischung zwischen Kunden | --- ### MT-DP-16 – Stammdatenreferenz prüfen | Feld | Wert | |---|---| | Spec-Bezug | PH-DP-15 | | Methode | `existsReferencedProdukt(long)`, `existsReferencedKunde(long)` | | Vorbedingung | Angebot mit Produkt 20001 und Kunde 10001 vorhanden | | Erwartetes Ergebnis | Produkt 20001 → true, Produkt 99999 → false, Kunde 10001 → true, Kunde 99998 → false | | Tatsächliches Ergebnis | ✅ Alle vier Prüfungen korrekt | --- ## 4. Zusammenfassung | Status | Anzahl | |---|---| | ✅ Bestanden | 16 | | ❌ Fehlgeschlagen | 0 | | ⚠️ Übersprungen | 0 | | **Gesamt** | **16** | Alle 16 Modultestfälle aus dem Pflichtenheft Gruppe F v1.0.1 wurden erfolgreich ausgeführt. Der Patch vom 28.06.2026 (MT-DP-06, Reihenfolge der Prüfungen in `erstelleAuftragsbestaetigung`) wurde in den Code integriert und verifiziert. Alle anderen Testfälle bleiben durch den Patch unberührt. --- ## 5. Bekannte offene Punkte | ID | Beschreibung | Priorität | |---|---|---| | OP-7 | GUI-Integration: `DokumentPanel` muss mit `DokumentService` verbunden werden | Hoch | | – | SQLite-Repository (Produktionsbetrieb) noch nicht implementiert, InMemory für Tests ausreichend | Mittel | | – | Leistungserbringer-Daten in `DokumentServiceImpl.erstellePflichtangaben()` aktuell hartcodiert | Niedrig |