docs(product): Pflichtenheft der Gruppe G in Unterlagen hinzugefügt #4

Merged
3026969 merged 2 commits from feature/produktverwaltung into main 2026-06-28 13:31:06 +02:00
2 changed files with 183 additions and 0 deletions

View File

@ -0,0 +1,183 @@
git add .---
title: "Pflichtenheft Fakturierungssystem (Modul: Produktverwaltung)"
author: "Gruppe G (Produktverwaltung)"
date: "12.06.2026"
version: "1.0"
header-includes:
- \usepackage{fancyhdr}
- \pagestyle{fancy}
- \fancyfoot[CO,CE]{Hochschule Mannheim - SE1 Team 2}
---
# Freigabeübersicht
| Ersteller | Prüfer | Freigebender |
| :--- | :--- | :--- |
| Gruppe G (Entwicklungsteam) | Prof. Dr. Gerd Marmitt | SE1 Team 2 (Gruppenleiter) |
| 12.06.2026 | 15.06.2026 | 15.06.2026 |
---
# Dokumentenhistorie
| Version | Datum | Autor | Änderung |
| :--- | :--- | :--- | :--- |
| 1.0 | 12.06.2026 | Gruppe G | Initiale Erstellung des Pflichtenhefts für das Modul Produktverwaltung auf Basis des Lastenhefts v1.0_alpha. |
---
# 1. Einleitung und Geltungsbereich
Dieses Dokument spezifiziert das Pflichtenheft für das Teilmodul **Produktverwaltung (Gruppe G)** des lokalen Fakturierungssystems. Während das Lastenheft die fachlichen Anforderungen aus Sicht des Auftraggebers beschreibt („Was“), definiert dieses Pflichtenheft die konkrete technische Umsetzung („Wie“) für die Entwicklungs- und Testphase im V-Modell.
Der Geltungsbereich (Scope) beschränkt sich auf die Verwaltung der Produktstammdaten (Anlegen, Bearbeiten, Löschen, Suchen, Listenansicht) sowie die Bereitstellung der entsprechenden Datenschnittstellen für den Dokumentenprozess (Gruppe F) und die Programmoberfläche (Gruppe E).
---
# 2. Systemüberblick und Kontext
Das Modul Produktverwaltung wird als integraler Bestandteil einer lokalen Java-Einbenutzer-Anwendung realisiert. Es läuft ohne externe Netzanbindungen oder Datenbankserver und speichert die Daten persistent im lokalen Dateisystem.
## 2.1 Typischer Kontrollfluss (Aktivitätsdiagramm)
1. **Aufruf:** Der Anwender öffnet die Produktverwaltung über die Hauptnavigation.
2. **Laden:** Das System liest alle Einträge aus der lokalen Datei `products.json`.
3. **Interaktion:** Der Anwender kann neue Produkte erfassen, bestehende ändern oder unreferenzierte Einträge entfernen.
---
# 3. Stakeholder und Benutzerrollen
Die Stakeholder und Benutzerrollen werden direkt aus dem Lastenheft übernommen:
* **S1 (Auftraggeber):** Prof. Dr. Gerd Marmitt (TH Mannheim).
* **S2 (Auftragnehmer):** SE1 Team 2, speziell Gruppe G (Produktverwaltung).
* **Anwender:** Der einzige Nutzer der lokalen Anwendung (Stammdatenpflege, Belege erzeugen).
---
# 4. Funktionale Anforderungen
Alle funktionalen Systemanforderungen (F-SH-) sind direkt aus den Benutzeranforderungen (BA-) und funktionalen Lastenheft-Anforderungen (F-PV-) abgeleitet und nach den formalen Satzschablonen definiert.
* **F-SH-PV-01 (Abgeleitet von F-PV-01):** Das System MUSS ein Datenformular bereitstellen, das es dem Anwender ERMÖGLICHEN, ein neues Produkt mit den Attributen `produktId`, `bezeichnung`, `einzelpreisNetto` und `mwstSatz` anzulegen.
* **F-SH-PV-02 (Abgeleitet von F-PV-02):** Das System MUSS es dem Anwender ERMÖGLICHEN, einen bestehenden Produktdatensatz über die GUI auszuwählen, die Werte von `bezeichnung`, `einzelpreisNetto`, `mwstSatz`, `beschreibung` und `kategorie` zu modifizieren und diese permanent zu überschreiben.
* **F-SH-PV-03 (Abgeleitet von F-PV-03 / GR-05):** Das System MUSS vor dem Löschen eines Produktdatensatzes prüfen, ob die `produktId` in den Dokumenten des Dokumentenprozesses vorhanden ist. Wenn eine Referenz existiert, MUSS das System den Löschvorgang blockieren und einen Hinweis anzeigen.
* **F-SH-PV-04 (Abgeleitet von F-PV-04):** Das System MUSS beim Initialisieren des Moduls eine tabellarische Übersichtsliste aller gespeicherten Produkte generieren, welche die Spalten Produkt-ID, Bezeichnung und Einzelpreis anzeigt.
* **F-SH-PV-05 (Abgeleitet von BA-PV-05):** Das System MUSS eine Filterung der Produktliste bereitstellen, sobald der Anwender ein Zeichen in das Suchfeld eingibt, und alle Produkte anzeigen, bei denen der Suchbegriff eine Teilmenge der `bezeichnung` (Groß-/Kleinschreibung ignorierend) bildet.
* **F-SH-PV-06 (Abgeleitet von F-PV-06):** Das System MUSS die Eingabe im Feld `einzelpreisNetto` blockieren und eine sichtbare Fehlermeldung anzeigen, falls der eingegebene Wert numerisch kleiner als 0.00 ist.
---
# 5. Nicht-funktionale Anforderungen (Qualitätsanforderungen)
## 5.1 Usability (NF-USE)
* **NF-SH-USE-01 (Abgeleitet von NF-USE-03 / F-GUI-02):** Das System MUSS visuelle Fehlermeldungen bei einer Falscheingabe direkt am betroffenen Feld innerhalb von maximal 1 Sekunde anzeigen.
## 5.2 Performance (NF-PERF)
* **NF-SH-PERF-01 (Abgeleitet von NF-PERF-01 / NF-PERF-02):** Das System MUSS das Laden und Filtern der Produktliste bei einer Datenmenge von bis zu 1.000 Produktdatensätzen in weniger als 2 Sekunden vollständig abschließen.
## 5.3 Wartbarkeit und Architektur (NF-MAINT / NF-ARCH)
* **NF-SH-ARCH-01 (Abgeleitet von NF-ARCH-01):** Das System MUSS die Produktdaten persistent so speichern, dass sie nach einem Neustart der Anwendung verlustfrei wiederhergestellt werden.
* **NF-SH-MAINT-01 (Abgeleitet von NF-MAINT-01 / NF-MAINT-03):** Der Quellcode des Moduls MUSS vollständig im Paket `de.hs_mannheim.sel.fakturierung.produktverwaltung` gekapselt sein und einer strikten dreischichtigen Architektur folgen.
---
# 6. Daten und Schnittstellen
## 6.1 Datenobjekt Beschreibung (Klasse `Product`)
| Attributname | Technischer Datentyp (Java) | Pflichtfeld | Validierung / Beschreibung |
| :--- | :--- | :--- | :--- |
| `produktId` | `java.lang.String` | Ja | Eindeutiger Identifikator. Format: `P-` + fortlaufende Nummer (z. B. `P-0001`). |
| `bezeichnung` | `java.lang.String` | Ja | Alphanumerischer String, min. 1 Zeichen, max. 100 Zeichen. |
| `einzelpreisNetto` | `java.math.BigDecimal` | Ja | Skalierung auf exakt 2 Nachkommastellen. Wert muss $\ge 0.00$ sein (Verwendung von `BigDecimal` zur Vermeidung von Rundungsfehlern). |
| `mwstSatz` | `enum MwstSatz` | Ja | Festgelegte Auswahlwerte über eine Enumeration: `NORMAL` (19%) oder `ERMAESSIGT` (7%). |
| `beschreibung` | `java.lang.String` | Nein | Optionaler Freitext, maximal 500 Zeichen. |
| `kategorie` | `java.lang.String` | Nein | Optionale Gruppierung der Produkte. |
## 6.2 Schnittstellen (APIs und Persistenz)
* **Programminterne API (`ProductService`):** Bietet Methoden wie `getAllProducts()`, `saveProduct(Product p)` und `deleteProduct(String produktId)` an, um Daten für die GUI (Gruppe E) oder Belege (Gruppe F) bereitzustellen.
* **Datei-Schnittstelle:** Die Daten werden im JSON-Format lokal in der Datei `./data/products.json` persistiert.
---
# 7. Systemarchitektur
Das Modul folgt einer klassischen Schichtenarchitektur (Präsentation -> Logik -> Datenhaltung). Die Datenhaltung wird hinter einer abstrakten Schnittstelle gekapselt, um die Austauschbarkeit der Speichertechnologie zu gewährleisten.
## 7.1 Struktur (UML-Klassendiagramm)
Die statische Systemstruktur des Moduls Produktverwaltung ist in Abbildung 1 dargestellt. Das Diagramm zeigt die dreischichtige Architektur der Anwendung. Der `ProductController` bildet die Präsentationsschicht (gekoppelt mit Gruppe E) und leitet Interaktionen an den `ProductService` (Geschäftslogik) weiter. Die datenbanklose Persistenz wird über das `ProductRepository` gekapselt, welches die `Product`-Entitäten direkt verwaltet und in JSON-Dateien speichert.
### Abbildung 1: UML-Klassendiagramm der Produktverwaltung
![UML-Klassendiagramm der Produktverwaltung](klassendiagramm.jpg)
## 7.2 Verhalten (UML-Sequenzdiagramm)
In Abbildung 2 wird der dynamische Ablauf einer Produktlöschung inklusive der systemübergreifenden Referenzprüfung nach der Geschäftsregel `GR-05` (Stammdaten-Schutz) visualisiert.
Wenn der Anwender in der Benutzeroberfläche ein Produkt löschen möchte, fängt der `ProductController` das Event ab und leitet die ID an den `ProductService` weiter. Dieser fragt vorab den `DocumentService` (Gruppe F) ab, ob das Produkt in aktiven Belegen referenziert wird. Liegt keine Referenz vor, wird das Produkt über das `ProductRepository` aus dem JSON-Speicher entfernt.
```mermaid
sequenceDiagram
title Abbildung 2: UML-Sequenzdiagramm für den Löschvorgang eines Produkts
actor Anwender
participant GUI as ProductController (Gruppe E)
participant Service as ProductService (Gruppe G)
participant DocRef as DocumentService (Gruppe F)
participant Repo as ProductRepository (Gruppe G)
Anwender->>GUI: Klickt auf "Löschen" für Produkt ID "P-0001"
GUI->>Service: deleteProduct("P-0001")
activate Service
Service->>DocRef: isProductReferenced("P-0001")
DocRef-->>Service: Rückgabe: false (Keine aktiven Belege)
Service->>Repo: remove("P-0001")
activate Repo
Repo->>Repo: Aus Cache entfernen & JSON neu schreiben
Repo-->>Service: Bestätigung (void)
deactivate Repo
Service-->>GUI: Rückgabe: true (Erfolgreich gelöscht)
deactivate Service
GUI-->>Anwender: Zeigt Erfolgsmeldung via Status-Popup (binnen 1s)
```
---
# 8. Testbare Abnahmekriterien
Diese softwareseitigen Abnahmekriterien dienen als direkte Vorlage für die JUnit-Komponententests im Projekt.
* **AC-SH-PV-01 (Zu Anforderung F-SH-PV-01 & 06):**
* *Vorbedingung:* Der `ProductService` ist ordnungsgemäß initialisiert.
* *Test-Aktion:* Aufruf von `saveProduct(new Product(null, "Testprodukt", new BigDecimal("-1.00"), MwstSatz.NORMAL))`.
* *Erwartetes Ergebnis:* Das System wirft eine `IllegalArgumentException` und bricht das Speichern ab.
* **AC-SH-PV-02 (Zu Anforderung F-SH-PV-03):**
* *Vorbedingung:* Produkt mit ID `P-0001` ist in einem aktiven Angebot (Gruppe F) hinterlegt.
* *Test-Aktion:* Aufruf von `deleteProduct("P-0001")`.
* *Erwartetes Ergebnis:* Die Methode liefert `false` zurück, der Eintrag bleibt unberührt im Datenbestand.
* **AC-SH-PV-03 (Zu Anforderung F-SH-PV-05):**
* *Vorbedingung:* Das Repository enthält die Produkte "M6 Schraube" und "M8 SCHRAUBE".
* *Test-Aktion:* Aufruf von `searchProducts("schraube")`.
* *Erwartetes Ergebnis:* Die zurückgegebene Liste enthält exakt beide Objekte (Ignorierung der Groß-/Kleinschreibung).
---
# 9. Traceability-Matrix (Lastenheft zu Pflichtenheft)
| Lastenheft-ID (LH) | Pflichtenheft-ID (PH) | Zugeordneter Komponententest (JUnit) | Status / Abdeckung |
| :--- | :--- | :--- | :--- |
| **F-PV-01** | F-SH-PV-01 | `ProductServiceTest#testSaveValidProduct` | Vollständig abgedeckt |
| **F-PV-02** | F-SH-PV-02 | `ProductServiceTest#testUpdateProductAttributes` | Vollständig abgedeckt |
| **F-PV-03** | F-SH-PV-03 | `ProductServiceTest#testDeleteReferencedProduct` | Vollständig abgedeckt |
|**F-PV-04** | F-SH-PV-04 | `ProductRepositoryTest#testGetAllAndSorting` | Vollständig abgedeckt |
| **BA-PV-05** | F-SH-PV-05 | `ProductServiceTest#testSearchCaseInsensitive` | Vollständig abgedeckt |
| **F-PV-06** | F-SH-PV-06 | `ProductServiceTest#testNegativePriceRejection` | Vollständig abgedeckt |
| **F-PV-07** | F-SH-PV-02 | `ProductServiceTest#testDescriptionLengthBounds` | Vollständig abgedeckt |
| **F-PV-08** | F-SH-PV-02 | `ProductServiceTest#testCategoryAssignment` | Vollständig abgedeckt |
| **GR-05** | F-SH-PV-03 | `ProductServiceTest#testDeleteReferencedProduct` | Vollständig abgedeckt |
| **NF-PERF-01** | NF-SH-PERF-01 | `ProductPerformanceTest#testSearchPerformance` | Vollständig abgedeckt |
| **NF-ARCH-01** | NF-SH-ARCH-01 | `ProductRepositoryTest#testPersistenceOnRestart` | Vollständig abgedeckt |