From 9f22667592e3fbc3c55b33adaa056a4e4397665e Mon Sep 17 00:00:00 2001 From: Andreas Ivanovic <3028874@stud.th-mannheim.de> Date: Sun, 28 Jun 2026 18:29:31 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20Modultestbericht=20Gruppe=20F=20hinzuge?= =?UTF-8?q?f=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Modultestbericht_GruppeF_Dokumentenprozess.md | 277 ++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 Modultestbericht_GruppeF_Dokumentenprozess.md diff --git a/Modultestbericht_GruppeF_Dokumentenprozess.md b/Modultestbericht_GruppeF_Dokumentenprozess.md new file mode 100644 index 0000000..8b8cb4c --- /dev/null +++ b/Modultestbericht_GruppeF_Dokumentenprozess.md @@ -0,0 +1,277 @@ +# 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 |