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
Lucas Strubel 2026-06-25 08:47:15 +02:00
parent 5bc65144b6
commit 412d7badbe
6 changed files with 228 additions and 94 deletions

View File

@ -3,7 +3,7 @@ title: "Pflichtenheft"
subtitle: "Desktop-Fakturierungsanwendung — Gruppe C: Verwaltung von Kunden"
author:
- Team 1 Gruppe C
version: "1.0"
version: "1.1"
lang: de-DE
toc: true
toc-depth: 3
@ -22,10 +22,17 @@ header-includes: |
\fancyhf{}
\fancyhead[L]{Team 1 Gruppe C}
\fancyhead[C]{Pflichtenheft}
\fancyhead[R]{Version 1.0}
\fancyhead[R]{Version 1.1}
\fancyfoot[C]{\thepage\ /\ \pageref{LastPage}}
\renewcommand{\headrulewidth}{0.4pt}
\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
@ -51,6 +58,7 @@ und den Modultest der Komponente *Verwaltung von Kunden*.
| Version | Datum | Autor | Grund der Änderung |
|---------|------------|--------------------------------------------|---------------------|
| 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
@ -100,9 +108,6 @@ siehe Kapitel 11.
- Pflichtenheft Gruppe A „Prozess / Dokumentenzyklus", Version 1.0, 09.06.2026
- DSGVO — EU-Verordnung 2016/679 (personenbezogene Kundendaten)
- 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
@ -131,23 +136,12 @@ der Export der Kundenstammdaten in einem offenen Format.
**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)
### 2.3 Grobe Systemfunktionen
Erfassen eines Kunden → Validieren der Eingaben → Vergeben der Kundennummer →
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
Stakeholder und Systemkontext sind im Lastenheft (§ 2, § 3) beschrieben und gelten
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
sind, gilt die lokale Datenhaltung (Q-06) für diese Komponente in besonderem Maße.
---
## 4. Funktionale Anforderungen
Die Anforderungen sind nach CRUD-Operationen gruppiert und mit den Satzschablonen des
Foliensatzes formuliert. Jede Anforderung ist eindeutig, vollständig, widerspruchsfrei und
verifizierbar.
> **Kundennummern (übergreifend):** Kundennummern sind **eindeutig** und werden
> **vom System generiert** (nicht durch den Anwender eingegeben). Sie werden als
> `String` geführt, **nicht** als `int`, weil die Nummern ein festes Format mit
> Präfix und führenden Nullen besitzen (z. B. `K-000017`); ein ganzzahliger Typ
> würde führende Nullen verlieren. Die Nummer wird fortlaufend auf Basis der höchsten
> bisher vergebenen Nummer ermittelt und ist nach der Vergabe **unveränderlich**.
> Anders als bei Rechnungsnummern (GR-01, Gruppe A) besteht keine
> Lückenlosigkeits-Pflicht.
> **Hinweis (Erläuterung, keine eigenständige Anforderung) — Kundennummern:** Dieser
> Kasten erläutert das gemeinsame Verständnis der Kundennummern; die **bindenden
> Anforderungen** sind **F-02** (Vergabe einer eindeutigen, vom System generierten,
> fortlaufenden Nummer mit Präfix `K-` und führenden Nullen, z. B. `K-000017`) sowie
> **F-07** (Unveränderlichkeit nach der Vergabe). Die Nummer wird auf Basis der höchsten
> bisher vergebenen Nummer ermittelt; anders als bei Rechnungsnummern (GR-01, Gruppe A)
> besteht **keine** Lückenlosigkeits-Pflicht. Zur Begründung der Führung als `String`
> (statt `int`, wegen Präfix und führender Nullen) siehe die Designgrundsätze in
> Kapitel 6.1.
### 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,
Semikolon-getrennt, mit Kopfzeile) in das lokale Dateisystem zu exportieren.
---
## 5. Nicht-funktionale Anforderungen
**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
repräsentativen Nutzungslaufs).
---
## 6. Daten und Schnittstellen
Dieses Kapitel ist direkter Input für den Modultestplan (Kapitel 10). Datentypen werden
@ -300,56 +289,61 @@ bereits als Java-Typen angegeben.
**Externe Schnittstellen:**
| ID | Schnittstelle | Zweck |
|-------|---------------------------|-------|
|-------|---------------------|-------|
| 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
// Von Gruppe C IMPLEMENTIERT, von Gruppe A genutzt (lesender Zugriff)
public interface KundenService {
Kunde findeKunde(String kundennummer); // null, wenn nicht vorhanden
}
**IF-01:** Das System MUSS eine Schnittstelle zum lokalen Dateisystem bereitstellen, die es
ERMÖGLICHT, die Kundenstammdaten dauerhaft zu speichern und wieder zu laden.
// Von Gruppe A BEREITGESTELLT, von Gruppe C genutzt (Löschsperre GR-04, F-10)
public interface KundenReferenzPruefung {
// Anzahl aktiver und archivierter Dokumente, die den Kunden referenzieren
int anzahlVerknuepfterDokumente(String kundennummer);
}
```
**IF-04:** Das System MUSS eine Export-Schnittstelle bereitstellen, die es der Anwender:in
ERMÖGLICHT, alle Kundenstammdaten in einem offenen Format (CSV, UTF-8, Semikolon-getrennt,
mit Kopfzeile) in das lokale Dateisystem zu exportieren (F-15, Q-08).
**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
public interface KundennummernGenerator {
// liefert die nächste fortlaufende Kundennummer, z. B. "K-000017"
String naechsteNummer();
}
*Genutzte Schnittstellen (Komponente C ruft auf):*
public interface KundenRepository {
Kunde speichere(Kunde kunde);
void loesche(String kundennummer);
List<Kunde> alleSortiertNachName();
List<Kunde> suche(String suchbegriff); // Name ODER Kundennummer
}
```
| Schnittstelle | Partner | Richtung | Fachlicher Zweck |
|------------------------|----------|----------|------------------|
| Referenzprüfung Kunden | Gruppe A | A → C | Anzahl aktiver und archivierter Belege, die einen Kunden referenzieren (Löschsperre GR-04, F-09/F-10) |
> IF-Satzschablone (Beispiel IF-04): *Das System MUSS eine Export-Schnittstelle
> 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.*
*Bereitgestellte Schnittstellen (Komponente C wird aufgerufen):*
---
| 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)
Die Komponente folgt einer einfachen Schichtung: die GUI (Gruppe D) ruft den
`KundenVerwaltungsService` auf, der die Fachlogik (Validierung, Nummernvergabe,
Löschsperre GR-04) kapselt und die Dienste `KundennummernGenerator`, `KundenRepository`
und `KundenReferenzPruefung` (Gruppe A) nutzt. Gegenüber Gruppe A implementiert die
Komponente das Interface `KundenService`. Kunden werden über das `KundenRepository` im
lokalen Dateisystem persistiert (realisiert als JSON-Ablage). Nach jeder schreibenden
und `KundenReferenzPruefung` (Gruppe A) nutzt. Gegenüber Gruppe A implementiert die Klasse
`KundenVerwaltungsService` das Interface `KundenService`. Kunden werden über das
`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
über einen **`EreignisBus`** (Observer-Muster, Paket `gemeinsam`;
`melde(DatenBereich.KUNDEN)`), den die Kundenansicht der Gruppe D abonniert und sich
@ -357,37 +351,38 @@ daraufhin automatisch aktualisiert.
### 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`
mit ihren Attributen (Kapitel 6.1). Der `KundenVerwaltungsService` orchestriert Anlegen,
Ändern, Löschen und Suche: er nutzt den `KundennummernGenerator` (Vergabe eindeutiger
Kundennummern, F-02), das `KundenRepository` (Persistenz, IF-01) und die von Gruppe A
bereitgestellte Schnittstelle `KundenReferenzPruefung` (Löschsperre GR-04, F-09/F-10).
Zusätzlich realisiert der `KundenVerwaltungsService` das Interface `KundenService`
(lesender Zugriff für Gruppe A, F-14) und meldet Datenänderungen über den `EreignisBus`
(Observer-Muster) an die abonnierte Kundenansicht der Gruppe D. Dokumente (Gruppe A)
referenzieren einen `Kunde` ausschließlich über die Kundennummer (lose Kopplung).
mit ihren Attributen (Kapitel 6.1). Die Klasse `KundenVerwaltungsService` orchestriert
Anlegen, Ändern, Löschen und Suche und **realisiert** das Interface `KundenService`
(lesender Zugriff für Gruppe A und D, F-14). Die komponenteninternen Interfaces besitzen
jeweils eine **konkrete Implementierung**: `JsonKundenRepository` realisiert
`KundenRepository` (Persistenz, IF-01) und `EinfacherKundennummernGenerator` realisiert
`KundennummernGenerator` (Vergabe eindeutiger Kundennummern, F-02). Die Schnittstelle
`KundenReferenzPruefung` (Löschsperre GR-04, F-09/F-10) wird **von Gruppe A bereitgestellt**
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).
![UML-Klassendiagramm Kundenverwaltung (Gruppe C)](diagramme/klassendiagramm_kundenverwaltung_gruppeC.png)
### 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*
dar. Die Anwender:in löst über die GUI (Gruppe D) `loescheKunde(kundennummer)` am
`KundenVerwaltungsService` aus. Dieser ermittelt zuerst über
`KundenReferenzPruefung.anzahlVerknuepfterDokumente(kundennummer)` (Gruppe A) die Anzahl
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
GUI zurückgegeben (F-09, GR-04). Ist die Anzahl 0, fordert das System die Bestätigung der
Anwender:in an (F-08) und löscht den Kunden anschließend über
`KundenRepository.loesche(kundennummer)` dauerhaft aus dem lokalen Datenbestand.
GUI zurückgegeben (F-09, GR-04). Ist die Anzahl 0, löscht das System den Kunden nach
Bestätigung der Anwender:in (F-08) über `KundenRepository.loesche(kundennummer)` dauerhaft
aus dem lokalen Datenbestand und meldet die Änderung über den `EreignisBus`
(`melde(DatenBereich.KUNDEN)`) an die abonnierte Kundenansicht der Gruppe D.
---
![UML-Sequenzdiagramm „Kunde löschen mit Löschsperre (GR-04)" (Gruppe C)](diagramme/sequenz_kunde_loeschen_gruppeC.png)
## 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
Monitoring zeigt keine Datenübertragung an externe Dienste.
---
## 9. Traceability LH ↔ PH
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
> durch BA-01BA-04 vollständig abgedeckt.
---
## 10. Modultestplan
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.
| 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-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" |
@ -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
die Qualitätsvorgaben (Q-02, Q-08, Q-09) abdecken.
---
## 11. Anhänge
### 11.1 Abkürzungen

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

View File

@ -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

View File

@ -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