26 KiB
Pflichtenheft - Dokumentenprozess Fakturierungssystem
Gruppe F - SE1 Team 2
Version: 1.0
Datum: 11.06.2026
Inhaltsverzeichnis
- Freigabeübersicht
- Dokumentenhistorie
- 1. Einleitung
- 2. Systemüberblick für Gruppe F
- 3. Stakeholder und Kontext
- 4. Funktionale Anforderungen
- 5. Nicht-funktionale Anforderungen für das Modul
- 6. Daten und Schnittstellen
- 7. Systemarchitektur
- 8. Testbare Abnahmekriterien
- 9. Traceability zwischen Lastenheft und Pflichtenheft
- 10. Modultestplan
- 11. Glossar
- 12. Referenzen
Freigabeübersicht
| Ersteller | Prüfer | Freigebender |
|---|---|---|
| Gruppe F: Andreas Ivanovic, Armin Omanovic, Alexander Teller | Prof. Dr. Gerd Marmitt | SE1 Team 2 |
| SE1 Team 2 | Hochschule Mannheim | SE1 Team 2 |
| 11.06.2026 | [Datum Review] | 30.06.2026 |
Dokumentenhistorie
| Version | Datum | Autor | Änderung |
|---|---|---|---|
| 1.0 | 11.06.2026 | Gruppe F / Alexander Teller | Initiale Erstellung des Pflichtenheft-Teils und Modultestplans für den Dokumentenprozess |
1. Einleitung
1.1 Zweck dieses Dokuments
Dieses Pflichtenheft beschreibt die konkrete Umsetzung des Moduls Dokumentenprozess im Fakturierungssystem. Es konkretisiert die Anforderungen aus dem Lastenheft und dem Project Charter für den Verantwortungsbereich der Gruppe F. Der Fokus liegt auf der fachlichen Kette:
Angebot -> Auftragsbestätigung -> Lieferschein -> Rechnung
Das Dokument dient als Input für Implementierung, Komponententests und Integration mit Produktverwaltung, Kundenverwaltung und GUI.
1.2 Bezug zum Project Charter
Team 2 besteht aus den Gruppen E, F, G und H. Gruppe F ist laut Project Charter für den Dokumentenprozess verantwortlich. Der Dokumentenprozess umfasst die fachliche Kette Angebot -> Auftragsbestätigung -> Lieferschein -> Rechnung. Das Projekt nutzt Java, JavaFX, SQLite und Gitty und orientiert sich am V-Modell.
1.3 Geltungsbereich
Dieses Pflichtenheft deckt nur den Dokumentenprozess ab. Produktverwaltung, Kundenverwaltung und GUI werden nur als Schnittstellen beschrieben, weil sie durch die Gruppen G, H und E verantwortet werden.
Nicht Teil dieses Moduls sind:
- vollständige Buchhaltung
- E-Rechnung
- Mehrbenutzerbetrieb
- Cloud-Betrieb
- externe ERP-/FiBu-Anbindungen
2. Systemüberblick für Gruppe F
Das Modul Gruppe F stellt die Geschäftslogik für Dokumente bereit. Die GUI ruft den DokumentService auf. Produkt- und Kundendaten werden über Lookup-Schnittstellen gelesen. Dokumente werden persistent über ein Repository gespeichert. Aus vorhandenen Dokumenten können Folgedokumente erzeugt werden, wobei Status, Referenzen und fachliche Regeln geprüft werden.
3. Stakeholder und Kontext
| Stakeholder / Rolle | Interesse am Modul Dokumentenprozess |
|---|---|
| Auftraggeber Prof. Dr. Gerd Marmitt | Nachvollziehbare Umsetzung der Anforderungen und testbare Artefakte im V-Modell. |
| Gruppe F | Implementierung des Dokumentenworkflows und Bereitstellung testbarer Services. |
| Gruppe E - GUI | Benötigt Service-Methoden und DTOs für Anzeige, Eingabe und Export. |
| Gruppe G - Produktverwaltung | Liefert Produktdaten und muss prüfen können, ob Produkte in Dokumenten referenziert sind. |
| Gruppe H - Kundenverwaltung | Liefert Kundendaten und muss prüfen können, ob Kunden in Dokumenten referenziert sind. |
| Endnutzer | Möchte Angebote, Aufträge, Lieferscheine und Rechnungen korrekt erzeugen und wiederfinden. |
4. Funktionale Anforderungen
| PH-ID | LH-Quelle | Kurzname | Konkretisierung / Systemverhalten | Priorität | Abnahmekriterium |
|---|---|---|---|---|---|
| PH-DP-01 | BA-DP-01, GR-04, GR-06 | Angebot anlegen | Das System MUSS über DokumentService.erstelleAngebot(long kundenId, List<PositionCommand> positionen) ein Angebot für genau einen vorhandenen Kunden mit mindestens einer Position erzeugen. Pro Position werden Produktbezeichnung, Einzelpreis netto und MwSt.-Satz als Snapshot übernommen. |
Muss | Angebot ist gespeichert, besitzt Nummer A-yyyy-nnnn, Status OFFEN, Datum LocalDate.now() und korrekt berechnete Netto-, USt.- und Bruttosumme. |
| PH-DP-02 | F-DP-02 | Angebotsnummer vergeben | Das System MUSS Angebotsnummern über OfferNumberGenerator je Kalenderjahr fortlaufend und eindeutig vergeben. |
Muss | Zwei nacheinander erzeugte Angebote erhalten unterschiedliche und aufeinanderfolgende Nummern. |
| PH-DP-03 | F-DP-03 | Angebot bearbeiten | Das System MUSS die Bearbeitung eines Angebots nur erlauben, solange AngebotsStatus.OFFEN gilt. |
Muss | Bearbeitung bei OFFEN erfolgreich; bei UEBERFUEHRT wird IllegalStateException geworfen. |
| PH-DP-04 | BA-DP-04, GR-01 | Auftragsbestätigung erzeugen | Das System MUSS aus genau einem offenen Angebot eine Auftragsbestätigung mit eigener Nummer AB-yyyy-nnnn erzeugen und alle Positionen unverändert übernehmen. |
Muss | AB referenziert Angebotsnummer, Positionen und Summen entsprechen dem Angebot, Angebot wird auf UEBERFUEHRT gesetzt. |
| PH-DP-05 | F-DP-05 | Doppelte Auftragsbestätigung verhindern | Das System MUSS vor der Erzeugung prüfen, ob für das Angebot bereits eine Auftragsbestätigung existiert. | Muss | Zweiter Erzeugungsversuch wird mit DuplicateDocumentException abgelehnt. |
| PH-DP-06 | BA-DP-06, GR-01 | Lieferschein erzeugen | Das System MUSS aus genau einer bestätigten Auftragsbestätigung einen Lieferschein mit Nummer LS-yyyy-nnnn und LocalDate lieferdatum erzeugen. |
Muss | Lieferschein referenziert AB, übernimmt Produktbezeichnung und Mengen und erhält Status GELIEFERT. |
| PH-DP-07 | F-DP-07 | Lieferschein ohne Preise | Das System MUSS für Lieferscheinansicht und PDF nur Menge und Produktbezeichnung ausgeben, aber keine Einzelpreise, Netto-, USt.- oder Bruttowerte. | Muss | Export/DTO des Lieferscheins enthält keine Preisfelder. |
| PH-DP-08 | BA-DP-08, F-DP-09, GR-01 | Rechnung erzeugen | Das System MUSS aus genau einem gelieferten Lieferschein eine Rechnung mit Nummer R-yyyy-nnnn, Rechnungsdatum, Referenz auf den Lieferschein und Pflichtangaben nach UStG erzeugen. |
Muss | Rechnung enthält Kunde, Leistungsdatum/Lieferdatum, Positionen, fortlaufende Nummer, Netto-, USt.- und Bruttosumme. |
| PH-DP-09 | F-DP-09 | Pflichtangaben prüfen | Das System MUSS vor dem Speichern einer Rechnung RechnungPflichtangabenValidator.validate(Rechnung) ausführen. |
Muss | Fehlende Pflichtangaben verhindern Speicherung und liefern Validierungsfehler. |
| PH-DP-10 | F-DP-10, GR-02 | Rechnungsnummer fortlaufend | Das System MUSS Rechnungsnummern fortlaufend, eindeutig und lückenlos vergeben, sobald eine Rechnung erfolgreich gespeichert wird. | Muss | Drei erfolgreiche Rechnungen ergeben R-2026-0001, R-2026-0002, R-2026-0003. |
| PH-DP-11 | F-DP-11, GR-03 | Rechnung festschreiben | Das System MUSS eine gespeicherte Rechnung inhaltlich sperren (festgeschrieben=true). |
Muss | Änderungsversuche an Positionen, Summen oder Pflichtangaben werden abgelehnt. |
| PH-DP-12 | F-DP-12 | PDF-Export | Das System SOLL jedes Dokument über PdfExportService.export(Dokument) als PDF-Datei im lokalen Dateisystem erzeugen. |
Soll | PDF-Datei existiert, ist nicht leer und enthält Dokumentnummer und Dokumenttyp. |
| PH-DP-13 | F-DP-13 | Dokumentenübersicht pro Kunde | Das System SOLL über DokumentRepository.findByKunde(long kundenId) alle Dokumente eines Kunden sortiert nach Datum und Dokumenttyp bereitstellen. |
Soll | Alle Angebote, ABs, Lieferscheine und Rechnungen des Kunden werden ohne fremde Kundendokumente geliefert. |
| PH-DP-14 | GR-04 | Preis-Snapshot sichern | Das System MUSS den Produktpreis und MwSt.-Satz beim Einfügen in das Angebot als Snapshot in Dokumentposition speichern. |
Muss | Spätere Produktänderung beeinflusst bestehende Dokumentpositionen nicht. |
| PH-DP-15 | GR-05 | Stammdatenreferenzen prüfbar machen | Das Dokumentenmodul MUSS für Produkt- und Kundenverwaltung eine Prüffunktion isReferenced(...) bereitstellen. |
Muss | Referenzierte Produkte/Kunden können durch andere Module als verwendet erkannt werden. |
| PH-DP-16 | NF-TEST-02, NF-MAINT-03 | Testbare Logik ohne GUI | Die Dokumentenlogik MUSS in Service- und Domainklassen ohne JavaFX-Abhängigkeit implementiert werden. | Muss | JUnit-Tests können DokumentService ohne Start der GUI ausführen. |
5. Nicht-funktionale Anforderungen für das Modul
| PH-NF-ID | LH-Quelle | Konkretisierung | Nachweis |
|---|---|---|---|
| PH-NF-DP-01 | NF-PERF-01 | Dokumentenaktionen bis 1.000 Kunden/Produkte müssen innerhalb von 1 Sekunde eine Rückmeldung liefern, wenn Repositories mit Testdaten initialisiert sind. | Zeitmessung im Komponententest/Integrationstest < 1 s für Erzeugung eines Angebots mit 10 Positionen. |
| PH-NF-DP-02 | NF-ARCH-01 | Dokumente müssen nach Neustart aus SQLite/Dateispeicher vollständig wiederherstellbar sein. | Dokument erstellen, Repository neu initialisieren, Dokument unverändert laden. |
| PH-NF-DP-03 | NF-ARCH-02 | Datenhaltung des Dokumentenmoduls muss über DokumentRepository gekapselt sein. |
Code-Review: Service nutzt Interface, keine direkten SQL-Aufrufe im Service. |
| PH-NF-DP-04 | NF-MAINT-01, NF-MAINT-03 | Dokumentenprozess wird im Paket de.hsma.se1.fakturierung.dokumente umgesetzt und in Domain, Service, Repository und Export getrennt. |
Repository-Struktur enthält getrennte Pakete; Abhängigkeiten laufen von UI -> Service -> Repository. |
| PH-NF-DP-05 | NF-TEST-02, NF-TEST-03 | Die Geschäftslogik des Dokumentenmoduls muss automatisiert testbar sein. | Mindestens 10 JUnit-Testfälle für Services/Domainklassen laufen ohne GUI. |
6. Daten und Schnittstellen
6.1 Datenobjekte und Java-Datentypen
| Datenfeld / Objekt | Java-Datentyp | Wertebereich / Format | Beschreibung |
|---|---|---|---|
DokumentType |
enum |
ANGEBOT, AUFTRAGSBESTAETIGUNG, LIEFERSCHEIN, RECHNUNG |
Typisierung für Anzeige, Export und Repository. |
| Dokumentnummer | String |
Format A-2026-0001, AB-2026-0001, LS-2026-0001, R-2026-0001 |
Fachlicher Identifikator; nicht als int, da Präfix/Jahr enthalten. |
kundenId |
long |
z. B. 10001L |
Referenz auf Kundenverwaltung, keine Kopie des gesamten Kundenobjekts im Dokumentservice erforderlich. |
produktId |
long |
z. B. 20001L |
Referenz auf Produktverwaltung. |
bezeichnungSnapshot |
String |
max. 255 Zeichen | Produktbezeichnung zum Zeitpunkt der Angebotsanlage. |
menge |
int |
> 0 |
Menge pro Dokumentposition. |
einzelpreisNettoSnapshot |
BigDecimal |
>= 0, Skalierung 2 |
Geldbetrag; BigDecimal statt double wegen Rundungsfehlern. |
mwstSatzSnapshot |
BigDecimal |
z. B. 0.19, 0.07 |
MwSt.-Satz als Dezimalwert. |
datum, lieferdatum, rechnungsdatum |
LocalDate |
ISO-Format yyyy-MM-dd |
Fachliche Datumswerte ohne Uhrzeit. |
nettoSumme, ustSumme, bruttoSumme |
BigDecimal |
Skalierung 2, Rundung HALF_UP |
Berechnete Summen des Dokuments. |
status |
enum |
OFFEN, UEBERFUEHRT, BESTAETIGT, GELIEFERT, FAKTURIERT, FESTGESCHRIEBEN |
Steuert erlaubte Folgeaktionen. |
pflichtangaben |
RechnungPflichtangaben |
Objekt mit leistungserbringerName, anschrift, steuerNr, leistungsdatum usw. |
Pflichtfelder der Rechnung. |
6.2 Schnittstellen
| Schnittstelle | Art | Zweck | Operationen / Daten |
|---|---|---|---|
DokumentService |
Java-Service-Interface | UI/Controller ruft Dokumentenlogik auf. | Methoden: erstelleAngebot, erstelleAuftragsbestaetigung, erstelleLieferschein, erstelleRechnung, exportiereAlsPdf. |
DokumentRepository |
Java-Interface / SQLite-Implementierung | Persistenz von Dokumenten. | save, findByNummer, findByKunde, existsFolgedokument, existsReferencedProdukt, existsReferencedKunde. |
ProductLookup |
Java-Interface zu Gruppe G | Produktdaten für Angebotspositionen lesen. | findProduct(long produktId): Optional<ProductDto> mit String bezeichnung, BigDecimal einzelpreisNetto, BigDecimal mwstSatz. |
CustomerLookup |
Java-Interface zu Gruppe H | Kundendaten für Dokumentkopf und Rechnungspflichtangaben lesen. | findCustomer(long kundenId): Optional<CustomerDto>. |
PdfExportService |
Java-Service / lokale Datei-Schnittstelle | PDF-Dateien aus Dokumentdaten erzeugen. | Rückgabe Path; Zielordner z. B. /exports. |
7. Systemarchitektur
Das Dokumentenmodul folgt einer dreischichtigen Struktur: Präsentation/UI ruft Services auf, Services enthalten die Geschäftslogik, Repositories kapseln die Datenhaltung. Die fachlichen Domänenklassen sind von JavaFX unabhängig und können isoliert getestet werden.
Abbildung 1: UML-Klassendiagramm Gruppe F
classDiagram
direction TB
class DokumentService {
+erstelleAngebot(...) Angebot
+aktualisiereAngebot(...) Angebot
+erstelleAuftragsbestaetigung(...) Auftragsbestaetigung
+erstelleLieferschein(...) Lieferschein
+erstelleRechnung(...) Rechnung
+exportiereAlsPdf(...) Path
}
class Dokument {
<<abstract>>
-nummer String
-kundeId long
-datum LocalDate
-positionen List~Dokumentposition~
-nettoSumme BigDecimal
-ustSumme BigDecimal
-bruttoSumme BigDecimal
+berechneSummen() SummenDto
}
class Dokumentposition {
-produktId long
-bezeichnungSnapshot String
-menge int
-einzelpreisNettoSnapshot BigDecimal
-mwstSatzSnapshot BigDecimal
+berechneNetto() BigDecimal
+berechneUst() BigDecimal
}
class Angebot {
-angebotsNr String
-status AngebotsStatus
+istBearbeitbar() boolean
}
class Auftragsbestaetigung {
-auftragNr String
-angebotNr String
-status AuftragsStatus
+ausAngebot(...) ...
}
class Lieferschein {
-lieferscheinNr String
-auftragsNr String
-lieferdatum LocalDate
-status LieferStatus
}
class Rechnung {
-rechnungsNr String
-lieferscheinNr String
-rechnungsdatum LocalDate
-status RechnungsStatus
-festgeschrieben boolean
}
class DokumentRepository {
<<interface>>
+save(Dokument) Dokument
+findByNummer(String) Optional~Dokument~
+existsFolgedokument(String) boolean
+findByKunde(long) List~Dokument~
}
class NumberGenerator {
+nextAngebotsNr(int) String
+nextAuftragsNr(int) String
+nextLieferscheinNr(int) String
+nextRechnungsNr(int) String
}
class PdfExportService {
+export(Dokument) Path
+exportRechnung(Rechnung) Path
-templateEngine String
}
Dokument "1" *-- "1..*" Dokumentposition : enthält
Dokument <|-- Angebot
Dokument <|-- Auftragsbestaetigung
Dokument <|-- Lieferschein
Dokument <|-- Rechnung
DokumentService ..> Dokument : nutzt
DokumentService ..> DokumentRepository : nutzt
DokumentService ..> NumberGenerator : nutzt
DokumentService ..> PdfExportService : PDF-Export
Angebot --> Auftragsbestaetigung : 1:1 erzeugt aus
Auftragsbestaetigung --> Lieferschein : 1:1 erzeugt
Lieferschein --> Rechnung : 1:1 erzeugt aus
Beschreibung zu Abbildung 1: Das Klassendiagramm zeigt die zentrale abstrakte Klasse Dokument mit den Spezialisierungen Angebot, Auftragsbestaetigung, Lieferschein und Rechnung. Die Klasse Dokumentposition speichert Produktdaten als Snapshot. Der DokumentService nutzt Repositories, Nummerngenerator und PDF-Export, ohne selbst technische Persistenzdetails zu kennen.
Abbildung 2: UML-Sequenzdiagramm Rechnung aus Lieferschein
sequenceDiagram
actor Anwender
participant UI as DokumentenUI
participant DS as DokumentService
participant LR as LieferscheinRepo
participant NG as NumberGenerator
participant RR as RechnungRepo
participant PDF as PdfExportService
Anwender->>UI: Klick: Rechnung erzeugen(lsNr)
UI->>DS: erstelleRechnung(lsNr)
DS->>LR: findByNummer(lsNr)
LR-->>DS: Lieferschein(status=GELIEFERT)
alt Lieferschein fehlt oder Status != GELIEFERT
DS-->>UI: Fehlermeldung, keine Rechnungsnummer vergeben, keine Rechnung gespeichert
UI-->>Anwender: Anzeige der Fehlermeldung
else Lieferschein ist geliefert
DS->>NG: nextRechnungsNr(jahr)
NG-->>DS: R-2026-0001
DS->>DS: pruefeStatusUndVorgaenger()
DS->>DS: berechneNettoUstBrutto()
DS->>RR: save(rechnung)
RR-->>DS: gespeicherte Rechnung
DS->>PDF: exportRechnung(rechnung)
PDF-->>DS: pdfPfad
DS-->>UI: Bestaetigung + Nummer + pdfPfad
UI-->>Anwender: Anzeige der Rechnung
end
Beschreibung zu Abbildung 2: Das Sequenzdiagramm beschreibt den Ablauf zur Rechnungserzeugung aus einem Lieferschein. Zuerst wird der Lieferschein geladen und sein Status geprüft. Danach wird eine Rechnungsnummer vergeben, die Rechnung berechnet, gespeichert, optional als PDF exportiert und an die GUI zurückgegeben. Falls der Lieferschein fehlt oder nicht den Status GELIEFERT besitzt, wird keine Rechnung erzeugt.
8. Testbare Abnahmekriterien
| AC-ID | Abgedeckte PH-Anforderungen | Testbares Abnahmekriterium |
|---|---|---|
| AC-DP-01 | PH-DP-01, PH-DP-02, PH-DP-14 | Aus vorhandenem Kunden und zwei Produkten wird ein Angebot erzeugt. Erwartet werden korrekte Nummer, Status OFFEN, zwei Positionen, Preis-Snapshots und korrekte Summen. |
| AC-DP-02 | PH-DP-03 | Ein offenes Angebot kann geändert werden. Ein überführtes Angebot kann nicht mehr geändert werden. |
| AC-DP-03 | PH-DP-04, PH-DP-05 | Aus einem offenen Angebot wird genau eine Auftragsbestätigung erzeugt. Ein zweiter Versuch wird abgelehnt. |
| AC-DP-04 | PH-DP-06, PH-DP-07 | Aus einer bestätigten AB wird ein Lieferschein erzeugt. Der Lieferschein enthält Mengen und Bezeichnungen, aber keine Preise. |
| AC-DP-05 | PH-DP-08, PH-DP-09, PH-DP-10, PH-DP-11 | Aus einem gelieferten Lieferschein wird eine festgeschriebene Rechnung mit Pflichtangaben, lückenloser Nummer und korrekten Summen erzeugt. |
| AC-DP-06 | PH-DP-12 | Ein Dokument kann als PDF exportiert werden; die Datei existiert und enthält Dokumentnummer und Dokumenttyp. |
| AC-DP-07 | PH-DP-13 | Alle Dokumente eines Kunden werden kundenbezogen aufgelistet. |
| AC-DP-08 | PH-DP-15 | Produkt- und Kundenverwaltung können prüfen, ob Stammdaten in Dokumenten referenziert werden. |
9. Traceability zwischen Lastenheft und Pflichtenheft
| LH-Anforderung | Kurzbeschreibung | PH-Anforderungen | Abnahmekriterium | Modultestfälle |
|---|---|---|---|---|
| BA-DP-01 | Angebot für Kunden anlegen | PH-DP-01, PH-DP-14 | AC-DP-01 | MT-DP-01, MT-DP-02, MT-DP-13 |
| F-DP-02 | Angebotsnummer eindeutig/fortlaufend | PH-DP-02 | AC-DP-01 | MT-DP-03 |
| F-DP-03 | Angebot nur bis Überführung bearbeiten | PH-DP-03 | AC-DP-02 | MT-DP-04 |
| BA-DP-04 | Auftragsbestätigung aus Angebot | PH-DP-04 | AC-DP-03 | MT-DP-05 |
| F-DP-05 | Maximal eine AB pro Angebot | PH-DP-05 | AC-DP-03 | MT-DP-06 |
| BA-DP-06 | Lieferschein aus AB | PH-DP-06 | AC-DP-04 | MT-DP-07 |
| F-DP-07 | Lieferschein ohne Preise | PH-DP-07 | AC-DP-04 | MT-DP-08 |
| BA-DP-08 | Rechnung aus Lieferschein | PH-DP-08 | AC-DP-05 | MT-DP-09 |
| F-DP-09 | Rechnungspflichtangaben | PH-DP-09 | AC-DP-05 | MT-DP-10 |
| F-DP-10 | Rechnungsnummer fortlaufend/lückenlos | PH-DP-10 | AC-DP-05 | MT-DP-11 |
| F-DP-11 | Rechnung unveränderlich | PH-DP-11 | AC-DP-05 | MT-DP-12 |
| F-DP-12 | PDF-Export | PH-DP-12 | AC-DP-06 | MT-DP-14 |
| F-DP-13 | Dokumentenübersicht Kunde | PH-DP-13 | AC-DP-07 | MT-DP-15 |
| GR-01 | Dokumentenkette | PH-DP-04, PH-DP-06, PH-DP-08 | AC-DP-03 bis AC-DP-05 | MT-DP-05, MT-DP-07, MT-DP-09 |
| GR-02 | Rechnungsnummern eindeutig | PH-DP-10 | AC-DP-05 | MT-DP-11 |
| GR-03 | Rechnung nicht änderbar | PH-DP-11 | AC-DP-05 | MT-DP-12 |
| GR-04 | Preisübernahme Snapshot | PH-DP-14 | AC-DP-01 | MT-DP-13 |
| GR-05 | Stammdatenschutz | PH-DP-15 | AC-DP-08 | MT-DP-16 |
| GR-06 | Summenberechnung | PH-DP-01, PH-DP-08 | AC-DP-01, AC-DP-05 | MT-DP-02, MT-DP-09 |
10. Modultestplan
Die folgenden Testfälle sind so formuliert, dass sie direkt mit JUnit 5 umgesetzt werden können. Für den isolierten Modultest werden Produkt- und Kundendaten durch Fake-Lookups bereitgestellt. Die GUI wird nicht gestartet.
| Test-ID | Name | Abgedeckte PH-Anforderungen | Vorbedingung | Testschritte | Erwartetes Ergebnis | Umsetzungshinweis |
|---|---|---|---|---|---|---|
| MT-DP-01 | Angebot anlegen - Happy Path | PH-DP-01 | Kunde 10001 und Produkte 20001/20002 existieren. | erstelleAngebot(10001, [2x Produkt 20001, 1x Produkt 20002]) |
Angebot gespeichert, Status OFFEN, 2 Positionen, Nummer beginnt mit A-2026-. |
JUnit: assertEquals, FakeProductLookup, InMemoryDokumentRepository |
| MT-DP-02 | Summenberechnung Angebot | PH-DP-01, PH-DP-08 | Positionen: 2 x 100,00 EUR mit 19 %, 1 x 50,00 EUR mit 7 %. | angebot.berechneSummen() |
Netto 250,00; USt. 41,50; Brutto 291,50. | JUnit: BigDecimal-Vergleich mit compareTo oder skalierter Assertion |
| MT-DP-03 | Fortlaufende Angebotsnummern | PH-DP-02 | Leerer Nummernkreis 2026. | Zwei Angebote erzeugen. | Nummern A-2026-0001 und A-2026-0002. |
JUnit: assertNotEquals, assertTrue(endsWith) |
| MT-DP-04 | Angebot nach Überführung sperren | PH-DP-03 | Angebot wurde in AB überführt. | aktualisiereAngebot(...) aufrufen. |
IllegalStateException; Positionen unverändert. |
JUnit: assertThrows |
| MT-DP-05 | Auftragsbestätigung erzeugen | PH-DP-04 | Offenes Angebot mit 2 Positionen existiert. | erstelleAuftragsbestaetigung(angebotsNr) |
AB mit eigener Nummer, Angebotsreferenz und identischen Positionen gespeichert. | JUnit: Objektvergleich Positionen |
| MT-DP-06 | Doppelte AB verhindern | PH-DP-05 | Für Angebot existiert bereits eine AB. | erstelleAuftragsbestaetigung(angebotsNr) erneut. |
DuplicateDocumentException; keine zweite AB im Repository. |
JUnit: assertThrows, Repository-Count |
| MT-DP-07 | Lieferschein erzeugen | PH-DP-06 | AB im Status BESTAETIGT existiert. |
erstelleLieferschein(auftragsNr, lieferdatum) |
LS mit Nummer, Lieferdatum, AB-Referenz und Status GELIEFERT gespeichert. |
JUnit: assertEquals |
| MT-DP-08 | Lieferschein enthält keine Preise | PH-DP-07 | Lieferschein aus AB existiert. | LieferscheinDto.from(lieferschein) oder Exportmodell erzeugen. |
DTO enthält Menge und Bezeichnung, aber keine Preis-/Steuerfelder. | JUnit: Getter/DTO-Feldprüfung |
| MT-DP-09 | Rechnung erzeugen - Happy Path | PH-DP-08, PH-DP-09 | LS im Status GELIEFERT mit Kunde und Positionen existiert. |
erstelleRechnung(lieferscheinNr) |
Rechnung mit R-..., Pflichtangaben, Summen und Status FESTGESCHRIEBEN gespeichert. |
JUnit: assertAll |
| MT-DP-10 | Pflichtangaben fehlen | PH-DP-09 | Kunde ohne Rechnungsanschrift/Steuernummer in Testdaten. | erstelleRechnung(lieferscheinNr) |
Validierungsfehler; keine Rechnung gespeichert. | JUnit: assertThrows(ValidationException.class) |
| MT-DP-11 | Rechnungsnummern lückenlos | PH-DP-10 | Drei unterschiedliche gelieferte Lieferscheine existieren. | Drei Rechnungen erzeugen. | Nummern enden auf 0001, 0002, 0003 ohne Lücke. |
JUnit: Listenvergleich |
| MT-DP-12 | Rechnung unveränderlich | PH-DP-11 | Rechnung wurde gespeichert/festgeschrieben. | Änderung von Position oder Summe versuchen. | Änderung wird abgelehnt; geladene Rechnung bleibt unverändert. | JUnit: assertThrows, erneutes Laden |
| MT-DP-13 | Preis-Snapshot bleibt stabil | PH-DP-14 | Angebot wurde mit Produktpreis 100,00 erzeugt. | Danach Produktpreis auf 120,00 setzen. Angebot erneut laden. | Positionspreis im Angebot bleibt 100,00. | JUnit mit FakeProductLookup-Preiswechsel |
| MT-DP-14 | PDF-Export erzeugt Datei | PH-DP-12 | Angebot oder Rechnung existiert. | exportiereAlsPdf(dokumentNr) |
Rückgabe Path; Datei existiert und Größe > 0 Byte. |
JUnit mit temporärem Verzeichnis @TempDir |
| MT-DP-15 | Dokumentenübersicht pro Kunde | PH-DP-13 | Dokumente für Kunde 1 und Kunde 2 existieren. | findByKunde(1) |
Nur Dokumente von Kunde 1, sortiert nach Datum. | JUnit: assertTrue(allMatch) |
| MT-DP-16 | Stammdatenreferenz prüfen | PH-DP-15 | Produkt 20001 ist in Angebot referenziert, Produkt 99999 nicht. | isProductReferenced(20001) und isProductReferenced(99999) |
Ergebnis true bzw. false. |
JUnit: assertTrue, assertFalse |
11. Glossar
| Begriff | Bedeutung |
|---|---|
| Angebot | Preisangebot an einen Kunden, Ausgangspunkt der Dokumentenkette. |
| Auftragsbestätigung | Verbindliche Bestätigung der Annahme eines Angebots. |
| Lieferschein | Dokumentiert Lieferung; enthält keine Preise. |
| Rechnung | Festgeschriebenes Dokument mit Zahlungsforderung und Pflichtangaben. |
| Snapshot | Kopie von Produktpreis, Produktbezeichnung und MwSt.-Satz zum Zeitpunkt der Angebotsanlage. |
| Traceability | Rückverfolgbarkeit von Lastenheft-Anforderung zu Pflichtenheft-Anforderung und Testfall. |
12. Referenzen
- Project Charter - Fakturierungssystem, Version 1.0, 15.04.2026.
- Lastenheft - Fakturierungssystem, Version 1.0 alpha, 12.05.2026.
- Vorlesung Software Engineering 1: Lastenheft, Pflichtenheft, Traceability, V-Modell und Komponententests.