Add UML sequence diagram for customer deletion with lock (GR-04)
This commit introduces a new PlantUML sequence diagram that illustrates the process of deleting a customer with a deletion lock, as specified in the requirements for Group C. The diagram details the interactions between the GUI, customer management service, reference check, repository, and event bus, including handling of deletion requests and associated exceptions.main
parent
5bc65144b6
commit
412d7badbe
|
|
@ -3,7 +3,7 @@ title: "Pflichtenheft"
|
||||||
subtitle: "Desktop-Fakturierungsanwendung — Gruppe C: Verwaltung von Kunden"
|
subtitle: "Desktop-Fakturierungsanwendung — Gruppe C: Verwaltung von Kunden"
|
||||||
author:
|
author:
|
||||||
- Team 1 – Gruppe C
|
- Team 1 – Gruppe C
|
||||||
version: "1.0"
|
version: "1.1"
|
||||||
lang: de-DE
|
lang: de-DE
|
||||||
toc: true
|
toc: true
|
||||||
toc-depth: 3
|
toc-depth: 3
|
||||||
|
|
@ -22,10 +22,17 @@ header-includes: |
|
||||||
\fancyhf{}
|
\fancyhf{}
|
||||||
\fancyhead[L]{Team 1 – Gruppe C}
|
\fancyhead[L]{Team 1 – Gruppe C}
|
||||||
\fancyhead[C]{Pflichtenheft}
|
\fancyhead[C]{Pflichtenheft}
|
||||||
\fancyhead[R]{Version 1.0}
|
\fancyhead[R]{Version 1.1}
|
||||||
\fancyfoot[C]{\thepage\ /\ \pageref{LastPage}}
|
\fancyfoot[C]{\thepage\ /\ \pageref{LastPage}}
|
||||||
\renewcommand{\headrulewidth}{0.4pt}
|
\renewcommand{\headrulewidth}{0.4pt}
|
||||||
\renewcommand{\footrulewidth}{0pt}
|
\renewcommand{\footrulewidth}{0pt}
|
||||||
|
\makeatletter
|
||||||
|
\def\brk@scan#1{\ifx\brk@end#1\else#1\allowbreak\expandafter\brk@scan\fi}
|
||||||
|
\newcommand{\brk}[1]{\brk@scan#1\brk@end}
|
||||||
|
\let\origtexttt\texttt
|
||||||
|
\renewcommand{\texttt}[1]{\origtexttt{\brk{#1}}}
|
||||||
|
\makeatother
|
||||||
|
\AtBeginEnvironment{longtable}{\small}
|
||||||
---
|
---
|
||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
|
|
@ -51,6 +58,7 @@ und den Modultest der Komponente *Verwaltung von Kunden*.
|
||||||
| Version | Datum | Autor | Grund der Änderung |
|
| Version | Datum | Autor | Grund der Änderung |
|
||||||
|---------|------------|--------------------------------------------|---------------------|
|
|---------|------------|--------------------------------------------|---------------------|
|
||||||
| 1.0 | 10.06.2026 | Mahsuna Ahadyar, Kübra Kilic, Mara Weidmann | Initiale Erstellung |
|
| 1.0 | 10.06.2026 | Mahsuna Ahadyar, Kübra Kilic, Mara Weidmann | Initiale Erstellung |
|
||||||
|
| 1.1 | 25.06.2026 | Mahsuna Ahadyar, Kübra Kilic, Mara Weidmann | Einarbeitung Modulleiter-Feedback: Referenzen bereinigt, Abgrenzung gestrafft, UML-Bezug entfernt, Kundennummern-Hinweis als Erläuterung gekennzeichnet, Schnittstellen fachlich beschrieben, UML-Diagramme ergänzt |
|
||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
|
|
||||||
|
|
@ -100,9 +108,6 @@ siehe Kapitel 11.
|
||||||
- Pflichtenheft Gruppe A „Prozess / Dokumentenzyklus", Version 1.0, 09.06.2026
|
- Pflichtenheft Gruppe A „Prozess / Dokumentenzyklus", Version 1.0, 09.06.2026
|
||||||
- DSGVO — EU-Verordnung 2016/679 (personenbezogene Kundendaten)
|
- DSGVO — EU-Verordnung 2016/679 (personenbezogene Kundendaten)
|
||||||
- GoBD — Grundsätze zur ordnungsmäßigen Führung und Aufbewahrung von Büchern
|
- GoBD — Grundsätze zur ordnungsmäßigen Führung und Aufbewahrung von Büchern
|
||||||
- Vorlesungsunterlagen Software Engineering 1 (SoSe 2026), Foliensatz „Lasten- und Pflichtenheft"
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. Systemüberblick
|
## 2. Systemüberblick
|
||||||
|
|
||||||
|
|
@ -131,23 +136,12 @@ der Export der Kundenstammdaten in einem offenen Format.
|
||||||
|
|
||||||
**Nicht im Umfang dieser Komponente:**
|
**Nicht im Umfang dieser Komponente:**
|
||||||
|
|
||||||
- Erstellung und Statusführung von Belegen, Übernahme der Kundendaten in Belege (Gruppe A)
|
|
||||||
- Verwaltung von Produkten (Gruppe B)
|
|
||||||
- Aufbau und Layout der GUI (Gruppe D)
|
|
||||||
- Mahnwesen, Buchhaltung, Kundenportale (LH-Nichtziele)
|
- Mahnwesen, Buchhaltung, Kundenportale (LH-Nichtziele)
|
||||||
|
|
||||||
### 2.3 Grobe Systemfunktionen
|
### 2.3 Grobe Systemfunktionen
|
||||||
Erfassen eines Kunden → Validieren der Eingaben → Vergeben der Kundennummer →
|
Erfassen eines Kunden → Validieren der Eingaben → Vergeben der Kundennummer →
|
||||||
Persistieren → Suchen/Auflisten → Ändern → Löschen (mit Referenzprüfung, GR-04) → Export.
|
Persistieren → Suchen/Auflisten → Ändern → Löschen (mit Referenzprüfung, GR-04) → Export.
|
||||||
|
|
||||||
### 2.4 UML-Bezug
|
|
||||||
Ein gemeinsames Use-Case-Diagramm aller Gruppen gibt den Überblick über die Akteure und
|
|
||||||
Ziele. Die für Gruppe C relevanten Use Cases sind: *Kunde anlegen*, *Kundendaten ändern*,
|
|
||||||
*Kunde löschen* und *Kunden suchen und auflisten*. Die detaillierte logische Architektur
|
|
||||||
dieser Komponente folgt in Kapitel 7.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. Stakeholder und Kontext
|
## 3. Stakeholder und Kontext
|
||||||
Stakeholder und Systemkontext sind im Lastenheft (§ 2, § 3) beschrieben und gelten
|
Stakeholder und Systemkontext sind im Lastenheft (§ 2, § 3) beschrieben und gelten
|
||||||
unverändert. Für diese Komponente ist der maßgebliche Akteur:
|
unverändert. Für diese Komponente ist der maßgebliche Akteur:
|
||||||
|
|
@ -160,22 +154,21 @@ intern die Komponenten Dokumentenzyklus (A, lesender Konsument der Kundendaten)
|
||||||
Programmoberfläche (D). Da Kundendaten **personenbezogene Daten** im Sinne der DSGVO
|
Programmoberfläche (D). Da Kundendaten **personenbezogene Daten** im Sinne der DSGVO
|
||||||
sind, gilt die lokale Datenhaltung (Q-06) für diese Komponente in besonderem Maße.
|
sind, gilt die lokale Datenhaltung (Q-06) für diese Komponente in besonderem Maße.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. Funktionale Anforderungen
|
## 4. Funktionale Anforderungen
|
||||||
|
|
||||||
Die Anforderungen sind nach CRUD-Operationen gruppiert und mit den Satzschablonen des
|
Die Anforderungen sind nach CRUD-Operationen gruppiert und mit den Satzschablonen des
|
||||||
Foliensatzes formuliert. Jede Anforderung ist eindeutig, vollständig, widerspruchsfrei und
|
Foliensatzes formuliert. Jede Anforderung ist eindeutig, vollständig, widerspruchsfrei und
|
||||||
verifizierbar.
|
verifizierbar.
|
||||||
|
|
||||||
> **Kundennummern (übergreifend):** Kundennummern sind **eindeutig** und werden
|
> **Hinweis (Erläuterung, keine eigenständige Anforderung) — Kundennummern:** Dieser
|
||||||
> **vom System generiert** (nicht durch den Anwender eingegeben). Sie werden als
|
> Kasten erläutert das gemeinsame Verständnis der Kundennummern; die **bindenden
|
||||||
> `String` geführt, **nicht** als `int`, weil die Nummern ein festes Format mit
|
> Anforderungen** sind **F-02** (Vergabe einer eindeutigen, vom System generierten,
|
||||||
> Präfix und führenden Nullen besitzen (z. B. `K-000017`); ein ganzzahliger Typ
|
> fortlaufenden Nummer mit Präfix `K-` und führenden Nullen, z. B. `K-000017`) sowie
|
||||||
> würde führende Nullen verlieren. Die Nummer wird fortlaufend auf Basis der höchsten
|
> **F-07** (Unveränderlichkeit nach der Vergabe). Die Nummer wird auf Basis der höchsten
|
||||||
> bisher vergebenen Nummer ermittelt und ist nach der Vergabe **unveränderlich**.
|
> bisher vergebenen Nummer ermittelt; anders als bei Rechnungsnummern (GR-01, Gruppe A)
|
||||||
> Anders als bei Rechnungsnummern (GR-01, Gruppe A) besteht keine
|
> besteht **keine** Lückenlosigkeits-Pflicht. Zur Begründung der Führung als `String`
|
||||||
> Lückenlosigkeits-Pflicht.
|
> (statt `int`, wegen Präfix und führender Nullen) siehe die Designgrundsätze in
|
||||||
|
> Kapitel 6.1.
|
||||||
|
|
||||||
### 4.1 Kunde anlegen (aus BA-01)
|
### 4.1 Kunde anlegen (aus BA-01)
|
||||||
|
|
||||||
|
|
@ -243,8 +236,6 @@ Nummer, MUSS `null` zurückgegeben werden.
|
||||||
alle Kundenstammdaten vollständig in ein offenes, dokumentiertes Format (CSV, UTF-8,
|
alle Kundenstammdaten vollständig in ein offenes, dokumentiertes Format (CSV, UTF-8,
|
||||||
Semikolon-getrennt, mit Kopfzeile) in das lokale Dateisystem zu exportieren.
|
Semikolon-getrennt, mit Kopfzeile) in das lokale Dateisystem zu exportieren.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. Nicht-funktionale Anforderungen
|
## 5. Nicht-funktionale Anforderungen
|
||||||
|
|
||||||
**NF-PERF-01 (aus Q-01/Q-02):** Das System MUSS Such- und Auflistungsergebnisse der
|
**NF-PERF-01 (aus Q-01/Q-02):** Das System MUSS Such- und Auflistungsergebnisse der
|
||||||
|
|
@ -265,8 +256,6 @@ Kundendaten ausschließlich lokal auf dem Anwender-PC ablegen; eine Übertragung
|
||||||
Dienste findet NICHT statt (Nachweis durch Netzwerk-Monitoring während eines
|
Dienste findet NICHT statt (Nachweis durch Netzwerk-Monitoring während eines
|
||||||
repräsentativen Nutzungslaufs).
|
repräsentativen Nutzungslaufs).
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. Daten und Schnittstellen
|
## 6. Daten und Schnittstellen
|
||||||
|
|
||||||
Dieses Kapitel ist direkter Input für den Modultestplan (Kapitel 10). Datentypen werden
|
Dieses Kapitel ist direkter Input für den Modultestplan (Kapitel 10). Datentypen werden
|
||||||
|
|
@ -299,57 +288,62 @@ bereits als Java-Typen angegeben.
|
||||||
|
|
||||||
**Externe Schnittstellen:**
|
**Externe Schnittstellen:**
|
||||||
|
|
||||||
| ID | Schnittstelle | Zweck |
|
| ID | Schnittstelle | Zweck |
|
||||||
|-------|---------------------------|-------|
|
|-------|---------------------|-------|
|
||||||
| IF-01 | Lokales Dateisystem | Persistenz der Kundenstammdaten |
|
| IF-01 | Lokales Dateisystem | Persistenz der Kundenstammdaten |
|
||||||
| IF-04 | Datenexport-Schnittstelle | Export der Kundenstammdaten als CSV (F-15, Q-08) |
|
| IF-04 | Datenexport (CSV) | Export der Kundenstammdaten als CSV (F-15, Q-08) |
|
||||||
|
|
||||||
**Interne Schnittstellen (zu anderen Komponenten), als Java-Interfaces skizziert:**
|
**Anforderungen an die externen Schnittstellen**
|
||||||
|
|
||||||
```java
|
**IF-01:** Das System MUSS eine Schnittstelle zum lokalen Dateisystem bereitstellen, die es
|
||||||
// Von Gruppe C IMPLEMENTIERT, von Gruppe A genutzt (lesender Zugriff)
|
ERMÖGLICHT, die Kundenstammdaten dauerhaft zu speichern und wieder zu laden.
|
||||||
public interface KundenService {
|
|
||||||
Kunde findeKunde(String kundennummer); // null, wenn nicht vorhanden
|
|
||||||
}
|
|
||||||
|
|
||||||
// Von Gruppe A BEREITGESTELLT, von Gruppe C genutzt (Löschsperre GR-04, F-10)
|
**IF-04:** Das System MUSS eine Export-Schnittstelle bereitstellen, die es der Anwender:in
|
||||||
public interface KundenReferenzPruefung {
|
ERMÖGLICHT, alle Kundenstammdaten in einem offenen Format (CSV, UTF-8, Semikolon-getrennt,
|
||||||
// Anzahl aktiver und archivierter Dokumente, die den Kunden referenzieren
|
mit Kopfzeile) in das lokale Dateisystem zu exportieren (F-15, Q-08).
|
||||||
int anzahlVerknuepfterDokumente(String kundennummer);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Komponenteninterne Dienste:**
|
**Interne Schnittstellen:** Die Schnittstellen werden hier **fachlich** beschrieben (Zweck,
|
||||||
|
ausgetauschte Daten, Richtung); konkrete Methodensignaturen und Datentypen sind dem
|
||||||
|
Komponentenentwurf bzw. dem Modultestplan (Kapitel 10) vorbehalten.
|
||||||
|
|
||||||
```java
|
*Genutzte Schnittstellen (Komponente C ruft auf):*
|
||||||
public interface KundennummernGenerator {
|
|
||||||
// liefert die nächste fortlaufende Kundennummer, z. B. "K-000017"
|
|
||||||
String naechsteNummer();
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface KundenRepository {
|
| Schnittstelle | Partner | Richtung | Fachlicher Zweck |
|
||||||
Kunde speichere(Kunde kunde);
|
|------------------------|----------|----------|------------------|
|
||||||
void loesche(String kundennummer);
|
| Referenzprüfung Kunden | Gruppe A | A → C | Anzahl aktiver und archivierter Belege, die einen Kunden referenzieren (Löschsperre GR-04, F-09/F-10) |
|
||||||
List<Kunde> alleSortiertNachName();
|
|
||||||
List<Kunde> suche(String suchbegriff); // Name ODER Kundennummer
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
> IF-Satzschablone (Beispiel IF-04): *Das System MUSS eine Export-Schnittstelle
|
*Bereitgestellte Schnittstellen (Komponente C wird aufgerufen):*
|
||||||
> bereitstellen, die es der Anwender:in ERMÖGLICHT, alle Kundenstammdaten als
|
|
||||||
> CSV-Datei (UTF-8, Semikolon-getrennt) in das lokale Dateisystem
|
|
||||||
> (`java.nio.file.Path`) zu exportieren.*
|
|
||||||
|
|
||||||
---
|
| Schnittstelle | Partner | Richtung | Fachlicher Zweck |
|
||||||
|
|------------------------|-------------|--------------|------------------|
|
||||||
|
| Kundenzugriff (lesend) | Gruppe A, D | C → A, C → D | Kunde per Kundennummer abrufen (F-14); Kundensuche über Name oder Kundennummer (F-12) |
|
||||||
|
|
||||||
|
> Liefert die Kundenabfrage keinen Treffer, wird dies dem Aufrufer eindeutig signalisiert
|
||||||
|
> (die Abfrage per Kundennummer liefert „kein Treffer").
|
||||||
|
|
||||||
|
**Komponenteninterne Dienste (rein C-intern, fachlich beschrieben):**
|
||||||
|
|
||||||
|
- **Kundennummernvergabe (F-02):** liefert die nächste fortlaufende Kundennummer im festen
|
||||||
|
Format mit Präfix und führenden Nullen (z. B. `K-000017`) auf Basis der höchsten bisher
|
||||||
|
vergebenen Nummer; ohne Lückenlosigkeits-Pflicht. (Realisierung: `EinfacherKundennummernGenerator`)
|
||||||
|
- **Kundenpersistenz (IF-01):** speichert Kunden im lokalen Dateisystem und liefert einen
|
||||||
|
Kunden zur Kundennummer, alle Kunden sortiert nach Name sowie Suchergebnisse (Name/Nr.).
|
||||||
|
(Realisierung: `JsonKundenRepository`, JSON-Ablage)
|
||||||
|
- **Datenexport (IF-04):** exportiert alle Kundenstammdaten als CSV in das lokale Dateisystem
|
||||||
|
(F-15). (Realisierung: `KundenCsvExport`)
|
||||||
|
- **Ereignisbenachrichtigung (Observer, Paket `gemeinsam`):** meldet Datenänderungen am
|
||||||
|
Kundenbestand (`melde(DatenBereich.KUNDEN)`) an die abonnierten Modulansichten (Gruppe D).
|
||||||
|
|
||||||
## 7. Systemarchitektur (logisch, grob)
|
## 7. Systemarchitektur (logisch, grob)
|
||||||
|
|
||||||
Die Komponente folgt einer einfachen Schichtung: die GUI (Gruppe D) ruft den
|
Die Komponente folgt einer einfachen Schichtung: die GUI (Gruppe D) ruft den
|
||||||
`KundenVerwaltungsService` auf, der die Fachlogik (Validierung, Nummernvergabe,
|
`KundenVerwaltungsService` auf, der die Fachlogik (Validierung, Nummernvergabe,
|
||||||
Löschsperre GR-04) kapselt und die Dienste `KundennummernGenerator`, `KundenRepository`
|
Löschsperre GR-04) kapselt und die Dienste `KundennummernGenerator`, `KundenRepository`
|
||||||
und `KundenReferenzPruefung` (Gruppe A) nutzt. Gegenüber Gruppe A implementiert die
|
und `KundenReferenzPruefung` (Gruppe A) nutzt. Gegenüber Gruppe A implementiert die Klasse
|
||||||
Komponente das Interface `KundenService`. Kunden werden über das `KundenRepository` im
|
`KundenVerwaltungsService` das Interface `KundenService`. Kunden werden über das
|
||||||
lokalen Dateisystem persistiert (realisiert als JSON-Ablage). Nach jeder schreibenden
|
`KundenRepository` (konkrete Implementierung `JsonKundenRepository`) im lokalen Dateisystem
|
||||||
|
persistiert (JSON-Ablage); die fortlaufenden Kundennummern erzeugt der
|
||||||
|
`EinfacherKundennummernGenerator` (Implementierung von `KundennummernGenerator`). Nach jeder schreibenden
|
||||||
Operation (Anlegen, Ändern, Löschen) meldet der `KundenVerwaltungsService` die Änderung
|
Operation (Anlegen, Ändern, Löschen) meldet der `KundenVerwaltungsService` die Änderung
|
||||||
über einen **`EreignisBus`** (Observer-Muster, Paket `gemeinsam`;
|
über einen **`EreignisBus`** (Observer-Muster, Paket `gemeinsam`;
|
||||||
`melde(DatenBereich.KUNDEN)`), den die Kundenansicht der Gruppe D abonniert und sich
|
`melde(DatenBereich.KUNDEN)`), den die Kundenansicht der Gruppe D abonniert und sich
|
||||||
|
|
@ -357,37 +351,38 @@ daraufhin automatisch aktualisiert.
|
||||||
|
|
||||||
### 7.1 Klassendiagramm
|
### 7.1 Klassendiagramm
|
||||||
|
|
||||||
<!-- TODO: UML-Klassendiagramm hier einfügen (Abbildung 1) -->
|
|
||||||
|
|
||||||
![Abbildung 1: UML-Klassendiagramm Kundenverwaltung (Gruppe C)]
|
|
||||||
|
|
||||||
**Beschreibung zu Abbildung 1:** Das Klassendiagramm zeigt die Entitätsklasse `Kunde`
|
**Beschreibung zu Abbildung 1:** Das Klassendiagramm zeigt die Entitätsklasse `Kunde`
|
||||||
mit ihren Attributen (Kapitel 6.1). Der `KundenVerwaltungsService` orchestriert Anlegen,
|
mit ihren Attributen (Kapitel 6.1). Die Klasse `KundenVerwaltungsService` orchestriert
|
||||||
Ändern, Löschen und Suche: er nutzt den `KundennummernGenerator` (Vergabe eindeutiger
|
Anlegen, Ändern, Löschen und Suche und **realisiert** das Interface `KundenService`
|
||||||
Kundennummern, F-02), das `KundenRepository` (Persistenz, IF-01) und die von Gruppe A
|
(lesender Zugriff für Gruppe A und D, F-14). Die komponenteninternen Interfaces besitzen
|
||||||
bereitgestellte Schnittstelle `KundenReferenzPruefung` (Löschsperre GR-04, F-09/F-10).
|
jeweils eine **konkrete Implementierung**: `JsonKundenRepository` realisiert
|
||||||
Zusätzlich realisiert der `KundenVerwaltungsService` das Interface `KundenService`
|
`KundenRepository` (Persistenz, IF-01) und `EinfacherKundennummernGenerator` realisiert
|
||||||
(lesender Zugriff für Gruppe A, F-14) und meldet Datenänderungen über den `EreignisBus`
|
`KundennummernGenerator` (Vergabe eindeutiger Kundennummern, F-02). Die Schnittstelle
|
||||||
(Observer-Muster) an die abonnierte Kundenansicht der Gruppe D. Dokumente (Gruppe A)
|
`KundenReferenzPruefung` (Löschsperre GR-04, F-09/F-10) wird **von Gruppe A bereitgestellt**
|
||||||
referenzieren einen `Kunde` ausschließlich über die Kundennummer (lose Kopplung).
|
und ist daher als extern dargestellt (ihre Implementierung liegt in Gruppe A). Der
|
||||||
|
`KundenVerwaltungsService` **nutzt** diese Dienste sowie den `EreignisBus` (Observer-Muster)
|
||||||
|
und meldet Datenänderungen an die abonnierte Kundenansicht der Gruppe D. Der Zugriff auf
|
||||||
|
`Kunde` ist eine **Nutzungs-/Abhängigkeitsbeziehung** — das `KundenRepository` liefert und
|
||||||
|
speichert `Kunde`-Objekte —, **keine** 1:n-Aggregation oder -Komposition; ein Interface
|
||||||
|
hält somit keinen „Container" von Entitäten. Dokumente (Gruppe A) referenzieren einen
|
||||||
|
`Kunde` ausschließlich über die Kundennummer (lose Kopplung).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### 7.2 Sequenzdiagramm
|
### 7.2 Sequenzdiagramm
|
||||||
|
|
||||||
<!-- TODO: UML-Sequenzdiagramm hier einfügen (Abbildung 2) -->
|
|
||||||
|
|
||||||
![Abbildung 2: UML-Sequenzdiagramm „Kunde löschen mit Löschsperre (GR-04)" (Gruppe C)]
|
|
||||||
|
|
||||||
**Beschreibung zu Abbildung 2:** Das Sequenzdiagramm stellt den Ablauf *Kunde löschen*
|
**Beschreibung zu Abbildung 2:** Das Sequenzdiagramm stellt den Ablauf *Kunde löschen*
|
||||||
dar. Die Anwender:in löst über die GUI (Gruppe D) `loescheKunde(kundennummer)` am
|
dar. Die Anwender:in löst über die GUI (Gruppe D) `loescheKunde(kundennummer)` am
|
||||||
`KundenVerwaltungsService` aus. Dieser ermittelt zuerst über
|
`KundenVerwaltungsService` aus. Dieser ermittelt zuerst über
|
||||||
`KundenReferenzPruefung.anzahlVerknuepfterDokumente(kundennummer)` (Gruppe A) die Anzahl
|
`KundenReferenzPruefung.anzahlVerknuepfterDokumente(kundennummer)` (Gruppe A) die Anzahl
|
||||||
der Dokumente, die den Kunden referenzieren. Ist die Anzahl größer als 0, wird der
|
der Dokumente, die den Kunden referenzieren. Ist die Anzahl größer als 0, wird der
|
||||||
Löschvorgang abgelehnt und ein Hinweis mit der Anzahl der verknüpften Dokumente an die
|
Löschvorgang abgelehnt und ein Hinweis mit der Anzahl der verknüpften Dokumente an die
|
||||||
GUI zurückgegeben (F-09, GR-04). Ist die Anzahl 0, fordert das System die Bestätigung der
|
GUI zurückgegeben (F-09, GR-04). Ist die Anzahl 0, löscht das System den Kunden nach
|
||||||
Anwender:in an (F-08) und löscht den Kunden anschließend über
|
Bestätigung der Anwender:in (F-08) über `KundenRepository.loesche(kundennummer)` dauerhaft
|
||||||
`KundenRepository.loesche(kundennummer)` dauerhaft aus dem lokalen Datenbestand.
|
aus dem lokalen Datenbestand und meldet die Änderung über den `EreignisBus`
|
||||||
|
(`melde(DatenBereich.KUNDEN)`) an die abonnierte Kundenansicht der Gruppe D.
|
||||||
|
|
||||||
---
|

|
||||||
|
|
||||||
## 8. Testbare Abnahmekriterien
|
## 8. Testbare Abnahmekriterien
|
||||||
|
|
||||||
|
|
@ -435,8 +430,6 @@ Erwartet: Eine CSV-Datei (UTF-8, Semikolon-getrennt, mit Kopfzeile) mit allen Ku
|
||||||
allen Attributen liegt im gewählten Zielordner; der Export dauert ≤ 30 Sekunden; das
|
allen Attributen liegt im gewählten Zielordner; der Export dauert ≤ 30 Sekunden; das
|
||||||
Monitoring zeigt keine Datenübertragung an externe Dienste.
|
Monitoring zeigt keine Datenübertragung an externe Dienste.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 9. Traceability LH ↔ PH
|
## 9. Traceability LH ↔ PH
|
||||||
|
|
||||||
Jede für Gruppe C relevante Lastenheft-Anforderung ist mindestens einer
|
Jede für Gruppe C relevante Lastenheft-Anforderung ist mindestens einer
|
||||||
|
|
@ -461,8 +454,6 @@ Pflichtenheft-Anforderung zugeordnet.
|
||||||
> Datenstand über `KundenService`. PZ-01 (CRUD-Verwaltung der Kundenstammdaten) wird
|
> Datenstand über `KundenService`. PZ-01 (CRUD-Verwaltung der Kundenstammdaten) wird
|
||||||
> durch BA-01–BA-04 vollständig abgedeckt.
|
> durch BA-01–BA-04 vollständig abgedeckt.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 10. Modultestplan
|
## 10. Modultestplan
|
||||||
|
|
||||||
Die folgenden Testfälle sind deterministisch (feste Ein-/Ausgaben) und mit JUnit 5
|
Die folgenden Testfälle sind deterministisch (feste Ein-/Ausgaben) und mit JUnit 5
|
||||||
|
|
@ -470,7 +461,7 @@ umsetzbar. Die Schnittstelle `KundenReferenzPruefung` (Gruppe A) wird im Modulte
|
||||||
einen Stub/Mock ersetzt.
|
einen Stub/Mock ersetzt.
|
||||||
|
|
||||||
| TC | Abgedeckte PH-Anf. | Vorbedingung | Eingabe | Erwartetes Ergebnis |
|
| TC | Abgedeckte PH-Anf. | Vorbedingung | Eingabe | Erwartetes Ergebnis |
|
||||||
|-------|--------------------|--------------|---------|---------------------|
|
|---------|------------|------------------------|----------------------|----------------------------|
|
||||||
| TC-01 | F-01, F-02 | Höchste Kundennummer `K-000016` | Kunde („Muster GmbH", „Hauptstr. 1", „68163", „Mannheim") speichern | Kunde persistiert; Kundennummer = `K-000017` |
|
| TC-01 | F-01, F-02 | Höchste Kundennummer `K-000016` | Kunde („Muster GmbH", „Hauptstr. 1", „68163", „Mannheim") speichern | Kunde persistiert; Kundennummer = `K-000017` |
|
||||||
| TC-02 | F-02 (Format) | Zähler = 7 | `naechsteNummer()` | liefert `K-000007` (führende Nullen, `String`) |
|
| TC-02 | F-02 (Format) | Zähler = 7 | `naechsteNummer()` | liefert `K-000007` (führende Nullen, `String`) |
|
||||||
| TC-03 | F-03, NF-USE-01 | Kunde ohne Ort | `speichere()` | Speichern abgelehnt; Validierungsfehler benennt „Ort" |
|
| TC-03 | F-03, NF-USE-01 | Kunde ohne Ort | `speichere()` | Speichern abgelehnt; Validierungsfehler benennt „Ort" |
|
||||||
|
|
@ -490,8 +481,6 @@ Damit sind 14 Testfälle (> 10) spezifiziert, die alle funktionalen Kernregeln (
|
||||||
F-03, F-04, F-07, F-09, F-12, F-14, F-15) sowie die zentrale Geschäftsregel GR-04 und
|
F-03, F-04, F-07, F-09, F-12, F-14, F-15) sowie die zentrale Geschäftsregel GR-04 und
|
||||||
die Qualitätsvorgaben (Q-02, Q-08, Q-09) abdecken.
|
die Qualitätsvorgaben (Q-02, Q-08, Q-09) abdecken.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 11. Anhänge
|
## 11. Anhänge
|
||||||
|
|
||||||
### 11.1 Abkürzungen
|
### 11.1 Abkürzungen
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 112 KiB |
|
|
@ -0,0 +1,102 @@
|
||||||
|
@startuml klassendiagramm_kundenverwaltung_gruppeC
|
||||||
|
' UML-Klassendiagramm Kundenverwaltung (Pflichtenheft Gruppe C, Abschnitt 7.1)
|
||||||
|
' Layout-Engine Smetana -> kein Graphviz erforderlich.
|
||||||
|
!pragma layout smetana
|
||||||
|
|
||||||
|
skinparam shadowing false
|
||||||
|
skinparam classAttributeIconSize 0
|
||||||
|
skinparam linetype ortho
|
||||||
|
hide empty members
|
||||||
|
|
||||||
|
title UML-Klassendiagramm — Kundenverwaltung (Gruppe C)
|
||||||
|
|
||||||
|
' ===================== Domänenmodell =====================
|
||||||
|
|
||||||
|
class Kunde {
|
||||||
|
- kundennummer : String
|
||||||
|
- name : String
|
||||||
|
- strasse : String
|
||||||
|
- plz : String
|
||||||
|
- ort : String
|
||||||
|
- eMail : String
|
||||||
|
- telefon : String
|
||||||
|
- ustIdNr : String
|
||||||
|
+ anschrift() : String
|
||||||
|
}
|
||||||
|
|
||||||
|
' ===================== Service-Schicht =====================
|
||||||
|
|
||||||
|
interface KundenService <<interface>> {
|
||||||
|
+ findeKunde(kundennummer : String) : Kunde
|
||||||
|
+ suche(suchbegriff : String) : List<Kunde>
|
||||||
|
}
|
||||||
|
|
||||||
|
class KundenVerwaltungsService {
|
||||||
|
+ legeAn(kunde : Kunde) : Kunde
|
||||||
|
+ aendere(kunde : Kunde) : Kunde
|
||||||
|
+ loescheKunde(kundennummer : String)
|
||||||
|
+ alleSortiertNachName() : List<Kunde>
|
||||||
|
+ suche(suchbegriff : String) : List<Kunde>
|
||||||
|
+ findeKunde(kundennummer : String) : Kunde
|
||||||
|
}
|
||||||
|
|
||||||
|
interface KundennummernGenerator <<interface>> {
|
||||||
|
+ naechsteNummer() : String
|
||||||
|
}
|
||||||
|
|
||||||
|
class EinfacherKundennummernGenerator {
|
||||||
|
+ naechsteNummer() : String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface KundenRepository <<interface>> {
|
||||||
|
+ speichere(kunde : Kunde) : Kunde
|
||||||
|
+ loesche(kundennummer : String)
|
||||||
|
+ findeNachNummer(kundennummer : String) : Kunde
|
||||||
|
+ alleSortiertNachName() : List<Kunde>
|
||||||
|
+ suche(suchbegriff : String) : List<Kunde>
|
||||||
|
}
|
||||||
|
|
||||||
|
class JsonKundenRepository {
|
||||||
|
}
|
||||||
|
|
||||||
|
class KundenCsvExport {
|
||||||
|
+ exportiere(kunden : List<Kunde>, zielDatei : Path)
|
||||||
|
}
|
||||||
|
|
||||||
|
class EreignisBus {
|
||||||
|
+ abonniere(bereich : DatenBereich, beobachter : Runnable)
|
||||||
|
+ melde(bereich : DatenBereich)
|
||||||
|
}
|
||||||
|
|
||||||
|
enum DatenBereich {
|
||||||
|
KUNDEN
|
||||||
|
PRODUKTE
|
||||||
|
DOKUMENTE
|
||||||
|
}
|
||||||
|
|
||||||
|
' ===================== Externe Komponente (lose Kopplung) =====================
|
||||||
|
|
||||||
|
interface KundenReferenzPruefung <<extern (Gruppe A)>> {
|
||||||
|
+ anzahlVerknuepfterDokumente(kundennummer : String) : int
|
||||||
|
}
|
||||||
|
|
||||||
|
' ===================== Realisierungen (konkrete Implementierungen) =====================
|
||||||
|
|
||||||
|
KundenService <|.. KundenVerwaltungsService
|
||||||
|
KundenRepository <|.. JsonKundenRepository
|
||||||
|
KundennummernGenerator <|.. EinfacherKundennummernGenerator
|
||||||
|
|
||||||
|
' ===================== Nutzungs-/Abhängigkeitsbeziehungen =====================
|
||||||
|
|
||||||
|
KundenVerwaltungsService ..> KundenRepository
|
||||||
|
KundenVerwaltungsService ..> KundennummernGenerator
|
||||||
|
KundenVerwaltungsService ..> KundenReferenzPruefung
|
||||||
|
KundenVerwaltungsService ..> EreignisBus
|
||||||
|
EreignisBus ..> DatenBereich
|
||||||
|
|
||||||
|
' Zugriff auf Kunde = Abhängigkeit (liefert/speichert), KEIN 1:n-Container
|
||||||
|
KundenVerwaltungsService ..> Kunde : verwaltet
|
||||||
|
KundenRepository ..> Kunde : liefert / speichert
|
||||||
|
KundenCsvExport ..> Kunde : exportiert
|
||||||
|
|
||||||
|
@enduml
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 52 KiB |
|
|
@ -0,0 +1,43 @@
|
||||||
|
@startuml sequenz_kunde_loeschen_gruppeC
|
||||||
|
' UML-Sequenzdiagramm "Kunde löschen mit Löschsperre (GR-04)" (Pflichtenheft Gruppe C, Abschnitt 7.2)
|
||||||
|
' Ablauf gemäß KundenVerwaltungsService.loescheKunde(kundennummer).
|
||||||
|
|
||||||
|
skinparam shadowing false
|
||||||
|
skinparam sequenceMessageAlign center
|
||||||
|
hide footbox
|
||||||
|
|
||||||
|
title UML-Sequenzdiagramm — „Kunde löschen mit Löschsperre (GR-04)" (Gruppe C)
|
||||||
|
|
||||||
|
participant "GUI\n(Gruppe D)" as GUI
|
||||||
|
participant "kundenService :\nKundenVerwaltungsService" as KVS
|
||||||
|
participant "referenzPruefung :\nKundenReferenzPruefung\n(Gruppe A)" as RP
|
||||||
|
participant "repository :\nKundenRepository" as REPO
|
||||||
|
participant "ereignisBus :\nEreignisBus" as EB
|
||||||
|
|
||||||
|
GUI -> KVS : loescheKunde(kundennummer)
|
||||||
|
activate KVS
|
||||||
|
|
||||||
|
KVS -> RP : anzahlVerknuepfterDokumente(kundennummer)
|
||||||
|
activate RP
|
||||||
|
RP --> KVS : anzahl
|
||||||
|
deactivate RP
|
||||||
|
|
||||||
|
alt anzahl > 0 (Löschsperre GR-04, F-09)
|
||||||
|
KVS --> GUI : LoeschAbgelehntException\n(Hinweis mit Anzahl verknüpfter Dokumente)
|
||||||
|
else anzahl == 0
|
||||||
|
note over GUI, KVS : Bestätigungsabfrage der Anwender:in (F-08)
|
||||||
|
KVS -> REPO : loesche(kundennummer)
|
||||||
|
activate REPO
|
||||||
|
REPO --> KVS
|
||||||
|
deactivate REPO
|
||||||
|
KVS -> EB : melde(DatenBereich.KUNDEN)
|
||||||
|
activate EB
|
||||||
|
note right of EB : benachrichtigt die abonnierte\nKundenansicht (Observer-Muster)
|
||||||
|
EB --> KVS
|
||||||
|
deactivate EB
|
||||||
|
KVS --> GUI : Kunde gelöscht
|
||||||
|
end
|
||||||
|
|
||||||
|
deactivate KVS
|
||||||
|
|
||||||
|
@enduml
|
||||||
Loading…
Reference in New Issue