From 5e87f2367e4d6f53954fab4f6b67c1f44145e7c1 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 6 Oct 2026 13:27:15 +0200 Subject: [PATCH] =?UTF-8?q?Anzeige=20f=C3=BCr=20den=20Eigent=C3=BCmer=20un?= =?UTF-8?q?d=20Korrekturen=20(Verfahrensgebiet=20#56)=20dokumentiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Testkonzept docs/tests/verfahrensgebiet-eigentuemer-anzeige.md, Fallstricke (Korrektur-CSV mit Personendaten, Fenster auf bestimmtem Bildschirm öffnen), Modulkarte und Testkatalog. Co-Authored-By: Claude Opus 5.5 --- docs/architektur/modulkarte.md | 9 +- docs/tests/testkatalog.html | 138 ++++++++++++++++-- docs/tests/testkatalog.md | 85 +++++++++-- .../verfahrensgebiet-eigentuemer-anzeige.md | 93 ++++++++++++ .../verfahrensgebiet-eigentuemersuche.md | 4 +- docs/wissen/fallstricke.md | 3 +- 6 files changed, 302 insertions(+), 30 deletions(-) create mode 100644 docs/tests/verfahrensgebiet-eigentuemer-anzeige.md diff --git a/docs/architektur/modulkarte.md b/docs/architektur/modulkarte.md index ccc665a..fbdc1c9 100644 --- a/docs/architektur/modulkarte.md +++ b/docs/architektur/modulkarte.md @@ -86,8 +86,10 @@ Legende: ⚠ = über 600 Zeilen, nie komplett laden, per `grep -n "def "` navigi | `main.py` | 80 | `Verfahrensgebiet`: registriert Action (Priorität 10), erzeugt `DockWidget` mit `Pruefmanager` und `DataGrabber` | | `ui/dockwidget.py` | 60 | Tabs `WorkingTab`, `EigentuemerTab`, `PrintTab`, `SettingsTab`; injiziert Services per `set_services()` | | `ui/tabs/working_tab.py` ⚠ | 820 | Tab „Bearbeitung“: Buttons und Handler für ALKIS/Shape laden, Gemarkungen, Flurstücke, Grenzpunkte, Beteiligung, Statistik; hält viel Ablauflogik | -| `ui/tabs/eigentuemer_tab.py` | 211 | Tab „Eigentümer“ (#56): Flurstückssuche (Treffer auswählen und hinzoomen) und Eigentümersuche (Eigentümerdatei wählen, Trefferliste öffnen) | -| `ui/eigentuemer_treffer.py` | 67 | Nicht modale Trefferliste der Eigentümersuche mit Mehrfachauswahl (#56) | +| `ui/tabs/eigentuemer_tab.py` | 411 | Tab „Eigentümer“ (#56): Flurstückssuche, Eigentümersuche, Anzeige für den Eigentümer (Bildschirm, Sitzung, „Anzeige leeren“) und Korrekturen | +| `ui/eigentuemer_treffer.py` | 83 | Nicht modale Trefferliste der Eigentümersuche mit Mehrfachauswahl und „Daten anzeigen“ (#56) | +| `ui/eigentuemer_anzeige.py` | 178 | Anzeigefenster für den Eigentümer (nur Name, Anschrift, E-Mail; maskiertes HTML), Bildschirmwahl, Vollbild auf dem zweiten Bildschirm (#56) | +| `ui/eigentuemer_korrektur_dialog.py` | 79 | Korrekturdialog für den Bearbeiter (#56) | | `functions/verfahrensgebiet_alkis.py` | 359 | WFS-Suche `BauRaumOderBodenordnungsrecht` per Verfahrensnummer/Landkreis, `LoadStatus` | | `functions/verfahrensgebiet_alkis_komplett.py` ⚠ | 661 | Vollständiger Ladeablauf aus ALKIS: BROR → Gemarkungen → Flurstücke → Flächenvergleich → Detailprüfung | | `functions/verfahrensgebiet_shape_komplett.py` ⚠ | 978 | Ladeablauf aus Shape/ZIP (Mehrfachauswahl, `FBSchl`-Klassifikation, Abgleich mit BROR) – siehe `docs/aus_shape_laden_technisch.md` im Repo | @@ -96,13 +98,14 @@ Legende: ⚠ = über 600 Zeilen, nie komplett laden, per `grep -n "def "` navigi | `functions/gemarkung_alkis.py` | 229 | Gemarkungen aus vereinfachtem ALKIS-WFS | | `functions/flurstueck_alkis.py` | 259 | Flurstücke je Gemarkung aus ALKIS-SF-WFS (BBOX, Batches) | | `functions/flurstueck_suche.py` | 175 | Flurstückssuche im Layer „Flurstücke“ über das `flurstueckskennzeichen`; Gemarkungsname über Layer „Gemarkungen“ | +| `functions/eigentuemer_korrektur.py` | 128 | Korrekturen ermitteln und an `_korrekturen.csv` anhängen; Pfad aus der Layerquelle; Qt-frei (#56) | | `functions/eigentuemer_suche.py` | 225 | Eigentümersuche im CSV-Layer (Serienbriefexport): Layer erkennen, Name/Vorname suchen, gleiche Personen mit gleicher Anschrift zusammenfassen; Qt-frei | | `functions/grenzpunkt_alkis.py` ⚠ | 1 674 | Grenzpunkte/`PunktortTA` gemarkungsweise, GML-Parsing, URL-sichere Batches | | `functions/knickpunkt_pruefung.py` ⚠ | 810 | Knickpunktbasierte BROR-Prüfung, Ergebnislayer mit Kategorien | | `functions/umringspruefung.py` | 312 | Umringsprüfung (Variante 1) | | `functions/umringstatistik_grenzpunkte.py` | 374 | Statistik Grenzpunkte am Umring | | `functions/beteiligung_pruefung.py` | 453 | Abgleich BI-Server-CSV mit ALKIS-Flurstücken | -| `tests/` | 16 Dateien | Mock-Modus, aktuell 157/201 grün (Baseline) | +| `tests/` | 18 Dateien | Mock-Modus, aktuell 157/201 grün (Baseline) | | `docs/` | 3 Dateien | Ablaufdiagramme (Mermaid) für ALKIS- und Shape-Laden | | `styles/` | 6 QML | BROR, Gemarkungen, Beteiligung, Verfahrensgebiet | diff --git a/docs/tests/testkatalog.html b/docs/tests/testkatalog.html index ddcf98e..16d2eda 100644 --- a/docs/tests/testkatalog.html +++ b/docs/tests/testkatalog.html @@ -119,21 +119,21 @@ Testkatalog der sn_*-Plugins — was die Suite heute prüft, auf einen Blick.
Quelle: docs/tests/testkatalog.md
Baseline: docs/status/testbaseline.json (SHA-256 aeabc946a7f3)
-
783Testfälle
-
740grün
+
822Testfälle
+
779grün
35rot (Baseline)
-
81%mit Docstring
-
64Testdateien
+
82%mit Docstring
+
66Testdateien
Verteilung je Paket
sn_basis43 Dateien · 490 Testfälle
-
sn_verfahrensgebiet16 Dateien · 249 Testfälle
+
sn_verfahrensgebiet18 Dateien · 288 Testfälle
sn_plan415 Dateien · 44 Testfälle
@@ -1675,10 +1675,10 @@

sn_verfahrensgebiet

-

Fachplugin · Ordner Plugin_SN_Verfahrensgebiet · 16 Testdateien · 249 Testfälle

+

Fachplugin · Ordner Plugin_SN_Verfahrensgebiet · 18 Testdateien · 288 Testfälle

-

Unit-Tests für `sn_verfahrensgebiet.functions.beteiligung_pruefung`.

TestBaueFlurstueckCsv 12TestBaueFlurstueckCsvListe 1TestHoleVerfahrensgebietLayer 3TestFordereManuellesLadenAn 2TestTry3Bootstrap 1TestBeteiligungPruefenDispatch 2TestLadeBeteiligungCsv 4
flowchart TD
@@ -1765,7 +1765,79 @@
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestDockWidget
test_init_tabs_with_services_injects_available_services
— (Docstring fehlt)grün
TestDockWidget
test_init_tabs_with_services_reports_errors
— (Docstring fehlt)grün

Tests für die Eigentümersuche im Serienbriefexport (#56).

TestLayererkennung 2TestSuche 10TestAnzeigeformen 1
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestDockWidget
test_init_tabs_with_services_injects_available_services
— (Docstring fehlt)grün
TestDockWidget
test_init_tabs_with_services_reports_errors
— (Docstring fehlt)grün

Tests für das Anzeigefenster des Eigentümer-Datenabgleichs (#56).

TestAnzeigetext 6TestBildschirme 6
flowchart TD
+  root(["test_eigentuemer_anzeige.py"])
+  class root rootnode
+  root --> g1["TestAnzeigetext (6)"]
+  class g1 groupnode
+  g1 --> t1("name_anschrift_email")
+  g1 --> t2("keine_internen_angaben")
+  g1 --> t3("fehlende_email_wird_genannt")
+  g1 --> t4("werte_werden_maskiert")
+  g1 --> t5("mehrere_eintraege_getrennt")
+  g1 --> t6("leer_nur_platzhalter")
+  root --> g2["TestBildschirme (6)"]
+  class g2 groupnode
+  g2 --> t7("vorgabe_ist_nicht_der_qgis_bildschirm")
+  g2 --> t8("bildschirm_text")
+  g2 --> t9("ohne_qt_anwendung_keine_bildschirme")
+  g2 --> t10("vollbild_auf_gewaehltem_bildschirm")
+  g2 --> t11("normales_fenster_mittig")
+  g2 --> t12("ohne_bildschirm_einfach_zeigen")
+  class t1 ok
+  class t2 ok
+  class t3 ok
+  class t4 ok
+  class t5 ok
+  class t6 ok
+  class t7 ok
+  class t8 ok
+  class t9 ok
+  class t10 ok
+  class t11 ok
+  class t12 ok
+  classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
+  classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
+  classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
+  classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestAnzeigetext
test_name_anschrift_email
Prüft, dass die Anzeige Name mit Anrede und Titel, die mehrzeilige Anschrift mit Ortsteil und die E-Mail zeigt.grün
TestAnzeigetext
test_keine_internen_angaben
Prüft, dass der Eigentümer weder Konten, Personen-IDs, Rechtsperson-Wert noch das Kennzeichen „verstorben“ sieht.grün
TestAnzeigetext
test_fehlende_email_wird_genannt
Prüft, dass eine fehlende E-Mail ausdrücklich als „keine angegeben“ erscheint.grün
TestAnzeigetext
test_werte_werden_maskiert
Prüft, dass Sonderzeichen aus den Daten maskiert werden und kein HTML einschleusen.grün
TestAnzeigetext
test_mehrere_eintraege_getrennt
Prüft, dass mehrere Einträge untereinander, durch eine Linie getrennt, erscheinen.grün
TestAnzeigetext
test_leer_nur_platzhalter
Prüft, dass die leere Anzeige nur den neutralen Platzhalter zeigt.grün
TestBildschirme
test_vorgabe_ist_nicht_der_qgis_bildschirm
Prüft, dass als Vorgabe der erste Bildschirm ohne QGIS gewählt wird, bei nur einem Bildschirm dieser.grün
TestBildschirme
test_bildschirm_text
Prüft, dass ein Bildschirm mit Nummer und Auflösung beschriftet wird.grün
TestBildschirme
test_ohne_qt_anwendung_keine_bildschirme
Prüft, dass ohne Qt-Anwendung (Mock-Modus) eine leere Bildschirmliste kommt statt eines Fehlers.grün
TestBildschirme
test_vollbild_auf_gewaehltem_bildschirm
Prüft, dass das Fenster im Vollbild dem gewählten Bildschirm zugeordnet und auf dessen Fläche gelegt wird.grün
TestBildschirme
test_normales_fenster_mittig
Prüft, dass auf dem QGIS-Bildschirm ein normales Fenster mittig im freien Bereich öffnet.grün
TestBildschirme
test_ohne_bildschirm_einfach_zeigen
Prüft, dass ohne bekannten Bildschirm das Fenster einfach gezeigt wird.grün

Tests für die Korrekturen beim Eigentümer-Datenabgleich (#56).

TestAenderungen 4TestKorrekturPfad 3TestSchreiben 5
flowchart TD
+  root(["test_eigentuemer_korrektur.py"])
+  class root rootnode
+  root --> g1["TestAenderungen (4)"]
+  class g1 groupnode
+  g1 --> t1("feldwerte")
+  g1 --> t2("nur_echte_aenderungen")
+  g1 --> t3("feld_leeren_ist_aenderung")
+  g1 --> t4("wende_an")
+  root --> g2["TestKorrekturPfad (3)"]
+  class g2 groupnode
+  g2 --> t5("textdatei_provider")
+  g2 --> t6("ogr_provider")
+  g2 --> t7("keine_csv")
+  root --> g3["TestSchreiben (5)"]
+  class g3 groupnode
+  g3 --> t8("neue_datei_mit_kopfzeile_und_bom")
+  g3 --> t9("anhaengen_ohne_zweite_kopfzeile")
+  g3 --> t10("ohne_aenderung_keine_datei")
+  g3 --> t11("schreibfehler_wird_weitergereicht")
+  g3 --> t12("schreibt_nichts_auf_die_konsole")
+  class t1 ok
+  class t2 ok
+  class t3 ok
+  class t4 ok
+  class t5 ok
+  class t6 ok
+  class t7 ok
+  class t8 ok
+  class t9 ok
+  class t10 ok
+  class t11 ok
+  class t12 ok
+  classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
+  classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
+  classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
+  classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestAenderungen
test_feldwerte
Prüft, dass alle korrigierbaren Felder vorbelegt werden, mehrere E-Mails durch Komma getrennt.grün
TestAenderungen
test_nur_echte_aenderungen
Prüft, dass nur geänderte Felder zählen und Leerraum am Rand oder doppelte Leerzeichen keine Änderung sind.grün
TestAenderungen
test_feld_leeren_ist_aenderung
Prüft, dass das Leeren eines Feldes als Änderung zählt.grün
TestAenderungen
test_wende_an
Prüft, dass die Änderungen im angezeigten Eintrag landen und E-Mails wieder getrennt werden; Konten bleiben.grün
TestKorrekturPfad
test_textdatei_provider
Prüft, dass aus der Quelle eines Textdatei-Layers (file-URI, Leerzeichen kodiert) der Pfad neben der CSV wird.grün
TestKorrekturPfad
test_ogr_provider
Prüft, dass auch eine OGR-Quelle mit Layernamen den Pfad neben der CSV ergibt.grün
TestKorrekturPfad
test_keine_csv
Prüft, dass für Quellen ohne CSV-Datei kein Pfad vorgeschlagen wird.grün
TestSchreiben
test_neue_datei_mit_kopfzeile_und_bom
Prüft, dass eine neue Korrektur-CSV mit BOM, Kopfzeile und je Änderung einer Zeile mit Exportspaltennamen entsteht.grün
TestSchreiben
test_anhaengen_ohne_zweite_kopfzeile
Prüft, dass weitere Korrekturen angehängt werden, ohne Kopfzeile oder BOM zu wiederholen.grün
TestSchreiben
test_ohne_aenderung_keine_datei
Prüft, dass ohne Änderung keine Datei angelegt wird.grün
TestSchreiben
test_schreibfehler_wird_weitergereicht
Prüft, dass ein nicht schreibbarer Pfad als OSError beim Aufrufer ankommt.grün
TestSchreiben
test_schreibt_nichts_auf_die_konsole
Prüft, dass das Festhalten von Korrekturen keine Personendaten auf die Konsole schreibt (Datenschutz).grün

Tests für die Eigentümersuche im Serienbriefexport (#56).

TestLayererkennung 2TestSuche 10TestAnzeigeformen 1
flowchart TD
   root(["test_eigentuemer_suche.py"])
   class root rootnode
   root --> g1["TestLayererkennung (2)"]
@@ -1804,7 +1876,7 @@
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestLayererkennung
test_layer_mit_name_und_vorname_ist_eigentuemerlayer
Prüft, dass ein Layer mit den Spalten Nachname und Vorname als Eigentümerdatei erkannt wird, auch mit BOM und anderer Schreibweise.grün
TestLayererkennung
test_eigentuemerlayer_im_projekt
Prüft, dass aus dem Projekt nur passende Layer kommen, nach Namen sortiert.grün
TestSuche
test_ohne_eingabe_fehler
Prüft, dass ohne Name und Vorname nicht die ganze Datei gelistet, sondern um eine Eingabe gebeten wird.grün
TestSuche
test_layer_ohne_pflichtspalten
Prüft, dass ein Layer ohne Nachname/Vorname mit Hinweis auf den Serienbriefexport abgelehnt wird.grün
TestSuche
test_teilstring_ohne_gross_kleinschreibung
Prüft, dass Name und Vorname als Teilstring ohne Rücksicht auf Groß-/Kleinschreibung gesucht werden.grün
TestSuche
test_umlaute_und_eszett
Prüft, dass „Müller“ auch „Mueller“ findet und „Strauss“ auch „Strauß“.grün
TestSuche
test_gleiche_person_gleiche_anschrift_zusammengefasst
Prüft, dass Zeilen mit gleichem Namen und gleicher Anschrift ein Treffer werden und Konten, Personen-IDs und E-Mails gesammelt werden.grün
TestSuche
test_andere_anschrift_eigener_treffer
Prüft, dass dieselbe Person mit anderer Anschrift ein eigener Treffer bleibt, sortiert nach Wohnort.grün
TestSuche
test_kennzeichen_verstorben
Prüft, dass „verstorben“ beim Exportwert 1 (auch als Zahl gelesen) gesetzt ist und bei 0, Leerem und NULL nicht.grün
TestSuche
test_rechtsperson_als_rohwert
Prüft, dass PER_RECHTSPERSON unverändert angezeigt wird (0, 1, 5, 9; noch nicht entschlüsselt) und abweichende Werte einer Person gesammelt werden.grün
TestSuche
test_plz_mit_fuehrender_null
Prüft, dass eine von QGIS als Zahl gelesene PLZ wieder fünfstellig mit führender Null erscheint und Zeilen dadurch zusammenfinden.grün
TestSuche
test_suche_gibt_nichts_aus
Prüft, dass die Suche keine Personendaten auf die Konsole schreibt (Datenschutz).grün
TestAnzeigeformen
test_name_und_anschrift
Prüft, dass Name mit Titel und einzeilige Anschrift mit Ortsteil lesbar zusammengesetzt werden.grün

Tests für den Tab „Eigentümer“ – Flurstückssuche und Eigentümersuche (#56).

TestFlurstueckSuchen 5TestEigentuemerSuchen 4TestTrefferliste 2TestDockWidgetTabs 1
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestLayererkennung
test_layer_mit_name_und_vorname_ist_eigentuemerlayer
Prüft, dass ein Layer mit den Spalten Nachname und Vorname als Eigentümerdatei erkannt wird, auch mit BOM und anderer Schreibweise.grün
TestLayererkennung
test_eigentuemerlayer_im_projekt
Prüft, dass aus dem Projekt nur passende Layer kommen, nach Namen sortiert.grün
TestSuche
test_ohne_eingabe_fehler
Prüft, dass ohne Name und Vorname nicht die ganze Datei gelistet, sondern um eine Eingabe gebeten wird.grün
TestSuche
test_layer_ohne_pflichtspalten
Prüft, dass ein Layer ohne Nachname/Vorname mit Hinweis auf den Serienbriefexport abgelehnt wird.grün
TestSuche
test_teilstring_ohne_gross_kleinschreibung
Prüft, dass Name und Vorname als Teilstring ohne Rücksicht auf Groß-/Kleinschreibung gesucht werden.grün
TestSuche
test_umlaute_und_eszett
Prüft, dass „Müller“ auch „Mueller“ findet und „Strauss“ auch „Strauß“.grün
TestSuche
test_gleiche_person_gleiche_anschrift_zusammengefasst
Prüft, dass Zeilen mit gleichem Namen und gleicher Anschrift ein Treffer werden und Konten, Personen-IDs und E-Mails gesammelt werden.grün
TestSuche
test_andere_anschrift_eigener_treffer
Prüft, dass dieselbe Person mit anderer Anschrift ein eigener Treffer bleibt, sortiert nach Wohnort.grün
TestSuche
test_kennzeichen_verstorben
Prüft, dass „verstorben“ beim Exportwert 1 (auch als Zahl gelesen) gesetzt ist und bei 0, Leerem und NULL nicht.grün
TestSuche
test_rechtsperson_als_rohwert
Prüft, dass PER_RECHTSPERSON unverändert angezeigt wird (0, 1, 5, 9; noch nicht entschlüsselt) und abweichende Werte einer Person gesammelt werden.grün
TestSuche
test_plz_mit_fuehrender_null
Prüft, dass eine von QGIS als Zahl gelesene PLZ wieder fünfstellig mit führender Null erscheint und Zeilen dadurch zusammenfinden.grün
TestSuche
test_suche_gibt_nichts_aus
Prüft, dass die Suche keine Personendaten auf die Konsole schreibt (Datenschutz).grün
TestAnzeigeformen
test_name_und_anschrift
Prüft, dass Name mit Titel und einzeilige Anschrift mit Ortsteil lesbar zusammengesetzt werden.grün

Tests für den Tab „Eigentümer“ – Flurstückssuche, Eigentümersuche, Anzeige und Korrektur (#56).

TestFlurstueckSuchen 5TestEigentuemerSuchen 4TestTrefferliste 3TestSitzung 7TestKorrektur 5TestKorrekturDatei 2TestDockWidgetTabs 1
flowchart TD
   root(["test_eigentuemer_tab.py"])
   class root rootnode
   root --> g1["TestFlurstueckSuchen (5)"]
@@ -1820,13 +1892,34 @@
   g2 --> t7("suchfehler_als_warnung")
   g2 --> t8("kein_treffer_ohne_namen_in_meldung")
   g2 --> t9("treffer_oeffnen_trefferliste_und_ersetzen_die_alte")
-  root --> g3["TestTrefferliste (2)"]
+  root --> g3["TestTrefferliste (3)"]
   class g3 groupnode
   g3 --> t10("trefferzeile_mit_hinweis")
   g3 --> t11("ausgewaehlte_eigentuemer")
-  root --> g4["TestDockWidgetTabs (1)"]
+  g3 --> t12("daten_anzeigen_gibt_auswahl_weiter")
+  root --> g4["TestSitzung (7)"]
   class g4 groupnode
-  g4 --> t12("tab_ist_im_dockwidget_eingetragen")
+  g4 --> t13("sitzung_beginnen_im_vollbild_auf_zweitem_bildschirm")
+  g4 --> t14("auf_qgis_bildschirm_kein_vollbild")
+  g4 --> t15("daten_anzeigen_beginnt_sitzung_bei_bedarf")
+  g4 --> t16("daten_anzeigen_ohne_auswahl")
+  g4 --> t17("anzeige_leeren_laesst_fenster_offen")
+  g4 --> t18("sitzung_beenden_schliesst_fenster")
+  g4 --> t19("von_aussen_geschlossen_beendet_sitzung")
+  root --> g5["TestKorrektur (5)"]
+  class g5 groupnode
+  g5 --> t20("korrektur_wird_festgehalten_und_angezeigt")
+  g5 --> t21("ohne_aenderung_nichts_schreiben")
+  g5 --> t22("abbruch_nichts_schreiben")
+  g5 --> t23("schreibfehler_warnung_und_anzeige_unveraendert")
+  g5 --> t24("ohne_anzeige_keine_korrektur")
+  root --> g6["TestKorrekturDatei (2)"]
+  class g6 groupnode
+  g6 --> t25("vorschlag_neben_der_eigentuemerdatei")
+  g6 --> t26("ohne_csv_quelle_wird_gefragt")
+  root --> g7["TestDockWidgetTabs (1)"]
+  class g7 groupnode
+  g7 --> t27("tab_ist_im_dockwidget_eingetragen")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -1839,11 +1932,26 @@
   class t10 ok
   class t11 ok
   class t12 ok
+  class t13 ok
+  class t14 ok
+  class t15 ok
+  class t16 ok
+  class t17 ok
+  class t18 ok
+  class t19 ok
+  class t20 ok
+  class t21 ok
+  class t22 ok
+  class t23 ok
+  class t24 ok
+  class t25 ok
+  class t26 ok
+  class t27 ok
   classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestFlurstueckSuchen
test_ohne_flurstueckslayer_erscheint_hinweisdialog
Prüft, dass ohne Layer „Flurstücke“ ein Dialog zum Laden von Verfahrensgebiet und Flurstücken erscheint.grün
TestFlurstueckSuchen
test_eingabefehler_als_warnung
Prüft, dass eine ungültige Eingabe als Warnung in der Meldungsleiste erscheint, nicht als Dialog.grün
TestFlurstueckSuchen
test_kein_treffer
Prüft, dass ohne Treffer ein Hinweis erscheint und keine Auswahl gesetzt wird.grün
TestFlurstueckSuchen
test_treffer_werden_ausgewaehlt_und_angezoomt
Prüft, dass Treffer im Flurstückslayer ausgewählt, angezoomt und gemeldet werden.grün
TestFlurstueckSuchen
test_ohne_kartenansicht_bleibt_auswahl
Prüft, dass die Auswahl auch ohne Kartenansicht gesetzt und gemeldet wird.grün
TestEigentuemerSuchen
test_ohne_eigentuemerdatei_warnung
Prüft, dass ohne gewählte Eigentümerdatei die Liste aufgefrischt und dann auf das Laden der CSV hingewiesen wird.grün
TestEigentuemerSuchen
test_suchfehler_als_warnung
Prüft, dass ein Fehler der Suche (z. B. leere Eingabe) als Warnung erscheint.grün
TestEigentuemerSuchen
test_kein_treffer_ohne_namen_in_meldung
Prüft, dass ohne Treffer ein Hinweis erscheint, der den gesuchten Namen nicht wiederholt (Datenschutz).grün
TestEigentuemerSuchen
test_treffer_oeffnen_trefferliste_und_ersetzen_die_alte
Prüft, dass Treffer in einer neuen Trefferliste erscheinen, eine offene alte Liste geschlossen wird und die Eingaben an die Suche gehen.grün
TestTrefferliste
test_trefferzeile_mit_hinweis
Prüft, dass die Trefferliste Name, Anschrift, E-Mail, den Rohwert von PER_RECHTSPERSON und das Kennzeichen „verstorben“ zeigt.grün
TestTrefferliste
test_ausgewaehlte_eigentuemer
Prüft, dass das Trefferfenster die in der Tabelle gewählten Einträge zurückgibt.grün
TestDockWidgetTabs
test_tab_ist_im_dockwidget_eingetragen
Prüft, dass der Tab „Eigentümer“ im DockWidget direkt nach dem Bearbeitungs-Tab steht.grün

Unit-Tests für das flurstueck_alkis-Modul.

TestFlurstueckAlkis 11TestFlurstueckAlkisAnhaengenDedup 3
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatus
TestFlurstueckSuchen
test_ohne_flurstueckslayer_erscheint_hinweisdialog
Prüft, dass ohne Layer „Flurstücke“ ein Dialog zum Laden von Verfahrensgebiet und Flurstücken erscheint.grün
TestFlurstueckSuchen
test_eingabefehler_als_warnung
Prüft, dass eine ungültige Eingabe als Warnung in der Meldungsleiste erscheint, nicht als Dialog.grün
TestFlurstueckSuchen
test_kein_treffer
Prüft, dass ohne Treffer ein Hinweis erscheint und keine Auswahl gesetzt wird.grün
TestFlurstueckSuchen
test_treffer_werden_ausgewaehlt_und_angezoomt
Prüft, dass Treffer im Flurstückslayer ausgewählt, angezoomt und gemeldet werden.grün
TestFlurstueckSuchen
test_ohne_kartenansicht_bleibt_auswahl
Prüft, dass die Auswahl auch ohne Kartenansicht gesetzt und gemeldet wird.grün
TestEigentuemerSuchen
test_ohne_eigentuemerdatei_warnung
Prüft, dass ohne gewählte Eigentümerdatei die Liste aufgefrischt und dann auf das Laden der CSV hingewiesen wird.grün
TestEigentuemerSuchen
test_suchfehler_als_warnung
Prüft, dass ein Fehler der Suche (z. B. leere Eingabe) als Warnung erscheint.grün
TestEigentuemerSuchen
test_kein_treffer_ohne_namen_in_meldung
Prüft, dass ohne Treffer ein Hinweis erscheint, der den gesuchten Namen nicht wiederholt (Datenschutz).grün
TestEigentuemerSuchen
test_treffer_oeffnen_trefferliste_und_ersetzen_die_alte
Prüft, dass Treffer in einer neuen Trefferliste mit Anzeige-Rückruf erscheinen, eine offene alte Liste geschlossen wird und die Eingaben an die Suche gehen.grün
TestTrefferliste
test_trefferzeile_mit_hinweis
Prüft, dass die Trefferliste Name, Anschrift, E-Mail, den Rohwert von PER_RECHTSPERSON und das Kennzeichen „verstorben“ zeigt.grün
TestTrefferliste
test_ausgewaehlte_eigentuemer
Prüft, dass das Trefferfenster die in der Tabelle gewählten Einträge zurückgibt.grün
TestTrefferliste
test_daten_anzeigen_gibt_auswahl_weiter
Prüft, dass „Daten anzeigen“ die Auswahl der Trefferliste an den Tab übergibt.grün
TestSitzung
test_sitzung_beginnen_im_vollbild_auf_zweitem_bildschirm
Prüft, dass „Sitzung beginnen“ ein leeres Anzeigefenster auf dem gewählten Bildschirm öffnet, im Vollbild, wenn QGIS woanders liegt.grün
TestSitzung
test_auf_qgis_bildschirm_kein_vollbild
Prüft, dass das Anzeigefenster auf dem QGIS-Bildschirm als normales Fenster öffnet.grün
TestSitzung
test_daten_anzeigen_beginnt_sitzung_bei_bedarf
Prüft, dass „Daten anzeigen“ ohne laufende Sitzung diese beginnt und die Einträge zeigt; die Statuszeile nennt nur die Anzahl.grün
TestSitzung
test_daten_anzeigen_ohne_auswahl
Prüft, dass „Daten anzeigen“ ohne Auswahl nur einen Hinweis gibt und keine Sitzung beginnt.grün
TestSitzung
test_anzeige_leeren_laesst_fenster_offen
Prüft, dass „Anzeige leeren“ die Daten entfernt, das Fenster aber nicht schließt.grün
TestSitzung
test_sitzung_beenden_schliesst_fenster
Prüft, dass „Sitzung beenden“ das Anzeigefenster schließt und die angezeigten Daten vergisst.grün
TestSitzung
test_von_aussen_geschlossen_beendet_sitzung
Prüft, dass ein von außen geschlossenes Anzeigefenster (z. B. Alt+F4) die Sitzung im Tab beendet.grün
TestKorrektur
test_korrektur_wird_festgehalten_und_angezeigt
Prüft, dass eine Korrektur in die Korrektur-CSV geschrieben, sofort angezeigt und ohne Namen gemeldet wird.grün
TestKorrektur
test_ohne_aenderung_nichts_schreiben
Prüft, dass ein unverändert gespeicherter Dialog nichts schreibt.grün
TestKorrektur
test_abbruch_nichts_schreiben
Prüft, dass ein abgebrochener Korrekturdialog nichts schreibt.grün
TestKorrektur
test_schreibfehler_warnung_und_anzeige_unveraendert
Prüft, dass bei einem Schreibfehler gewarnt, die Anzeige nicht geändert und der Pfad beim nächsten Mal neu bestimmt wird.grün
TestKorrektur
test_ohne_anzeige_keine_korrektur
Prüft, dass ohne angezeigte Daten kein Korrekturdialog erscheint.grün
TestKorrekturDatei
test_vorschlag_neben_der_eigentuemerdatei
Prüft, dass die Korrektur-CSV ohne Rückfrage neben der Eigentümerdatei liegt, wenn der Ordner beschreibbar ist, und gemerkt wird.grün
TestKorrekturDatei
test_ohne_csv_quelle_wird_gefragt
Prüft, dass ohne verwertbare CSV-Quelle nach dem Speicherort gefragt wird; Abbrechen liefert keinen Pfad.grün
TestDockWidgetTabs
test_tab_ist_im_dockwidget_eingetragen
Prüft, dass der Tab „Eigentümer“ im DockWidget direkt nach dem Bearbeitungs-Tab steht.grün

Unit-Tests für das flurstueck_alkis-Modul.

TestFlurstueckAlkis 11TestFlurstueckAlkisAnhaengenDedup 3
flowchart TD
   root(["test_flurstueck_alkis.py"])
   class root rootnode
   root --> g1["TestFlurstueckAlkis (11)"]
diff --git a/docs/tests/testkatalog.md b/docs/tests/testkatalog.md
index ecde425..0fbd313 100644
--- a/docs/tests/testkatalog.md
+++ b/docs/tests/testkatalog.md
@@ -9,17 +9,17 @@ selbst (Docstrings) und aus der Testbaseline.
 
 Stand der Baseline: `docs/status/testbaseline.json` (SHA-256 `aeabc946a7f3`)
 
-Gesamt: 3 Pakete, 64 Testdateien, 783 Testfälle – 740 grün, 35 rot (Baseline), 8 übersprungen.
-Mit Beschreibung (Docstring): 638 von 783 (81 %).
+Gesamt: 3 Pakete, 66 Testdateien, 822 Testfälle – 779 grün, 35 rot (Baseline), 8 übersprungen.
+Mit Beschreibung (Docstring): 677 von 822 (82 %).
 
 ## Zusammenfassung
 
 | Paket | Testdateien | Testfälle | grün | rot (Baseline) | übersprungen | mit Beschreibung |
 | --- | ---: | ---: | ---: | ---: | ---: | ---: |
 | `sn_basis` | 43 | 490 | 490 | 0 | 0 | 490 von 490 (100 %) |
-| `sn_verfahrensgebiet` | 16 | 249 | 207 | 34 | 8 | 147 von 249 (59 %) |
+| `sn_verfahrensgebiet` | 18 | 288 | 246 | 34 | 8 | 186 von 288 (65 %) |
 | `sn_plan41` | 5 | 44 | 43 | 1 | 0 | 1 von 44 (2 %) |
-| **Summe** | **64** | **783** | **740** | **35** | **8** | **638 von 783 (81 %)** |
+| **Summe** | **66** | **822** | **779** | **35** | **8** | **677 von 822 (82 %)** |
 
 ### Legende
 
@@ -1071,7 +1071,7 @@ Testgruppen:
 
 ## Paket `sn_verfahrensgebiet`
 
-Fachplugin, Ordner `Plugin_SN_Verfahrensgebiet` – 16 Testdateien mit 249 Testfällen (207 grün, 34 rot, 8 übersprungen).
+Fachplugin, Ordner `Plugin_SN_Verfahrensgebiet` – 18 Testdateien mit 288 Testfällen (246 grün, 34 rot, 8 übersprungen).
 
 ### `Plugin_SN_Verfahrensgebiet/tests/test_beteiligung_pruefung.py`
 
@@ -1128,6 +1128,55 @@ Testgruppen:
 | `TestDockWidget.test_init_tabs_with_services_injects_available_services` | — (Docstring fehlt) | grün |
 | `TestDockWidget.test_init_tabs_with_services_reports_errors` | — (Docstring fehlt) | grün |
 
+### `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_anzeige.py`
+
+Worum es in der Datei geht: Tests für das Anzeigefenster des Eigentümer-Datenabgleichs (#56).
+
+Testgruppen:
+
+- `TestAnzeigetext` (6 Testfälle): — (Docstring fehlt)
+- `TestBildschirme` (6 Testfälle): — (Docstring fehlt)
+
+| Testfall | prüft | Status |
+| --- | --- | --- |
+| `TestAnzeigetext.test_name_anschrift_email` | Prüft, dass die Anzeige Name mit Anrede und Titel, die mehrzeilige Anschrift mit Ortsteil und die E-Mail zeigt. | grün |
+| `TestAnzeigetext.test_keine_internen_angaben` | Prüft, dass der Eigentümer weder Konten, Personen-IDs, Rechtsperson-Wert noch das Kennzeichen „verstorben“ sieht. | grün |
+| `TestAnzeigetext.test_fehlende_email_wird_genannt` | Prüft, dass eine fehlende E-Mail ausdrücklich als „keine angegeben“ erscheint. | grün |
+| `TestAnzeigetext.test_werte_werden_maskiert` | Prüft, dass Sonderzeichen aus den Daten maskiert werden und kein HTML einschleusen. | grün |
+| `TestAnzeigetext.test_mehrere_eintraege_getrennt` | Prüft, dass mehrere Einträge untereinander, durch eine Linie getrennt, erscheinen. | grün |
+| `TestAnzeigetext.test_leer_nur_platzhalter` | Prüft, dass die leere Anzeige nur den neutralen Platzhalter zeigt. | grün |
+| `TestBildschirme.test_vorgabe_ist_nicht_der_qgis_bildschirm` | Prüft, dass als Vorgabe der erste Bildschirm ohne QGIS gewählt wird, bei nur einem Bildschirm dieser. | grün |
+| `TestBildschirme.test_bildschirm_text` | Prüft, dass ein Bildschirm mit Nummer und Auflösung beschriftet wird. | grün |
+| `TestBildschirme.test_ohne_qt_anwendung_keine_bildschirme` | Prüft, dass ohne Qt-Anwendung (Mock-Modus) eine leere Bildschirmliste kommt statt eines Fehlers. | grün |
+| `TestBildschirme.test_vollbild_auf_gewaehltem_bildschirm` | Prüft, dass das Fenster im Vollbild dem gewählten Bildschirm zugeordnet und auf dessen Fläche gelegt wird. | grün |
+| `TestBildschirme.test_normales_fenster_mittig` | Prüft, dass auf dem QGIS-Bildschirm ein normales Fenster mittig im freien Bereich öffnet. | grün |
+| `TestBildschirme.test_ohne_bildschirm_einfach_zeigen` | Prüft, dass ohne bekannten Bildschirm das Fenster einfach gezeigt wird. | grün |
+
+### `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_korrektur.py`
+
+Worum es in der Datei geht: Tests für die Korrekturen beim Eigentümer-Datenabgleich (#56).
+
+Testgruppen:
+
+- `TestAenderungen` (4 Testfälle): — (Docstring fehlt)
+- `TestKorrekturPfad` (3 Testfälle): — (Docstring fehlt)
+- `TestSchreiben` (5 Testfälle): — (Docstring fehlt)
+
+| Testfall | prüft | Status |
+| --- | --- | --- |
+| `TestAenderungen.test_feldwerte` | Prüft, dass alle korrigierbaren Felder vorbelegt werden, mehrere E-Mails durch Komma getrennt. | grün |
+| `TestAenderungen.test_nur_echte_aenderungen` | Prüft, dass nur geänderte Felder zählen und Leerraum am Rand oder doppelte Leerzeichen keine Änderung sind. | grün |
+| `TestAenderungen.test_feld_leeren_ist_aenderung` | Prüft, dass das Leeren eines Feldes als Änderung zählt. | grün |
+| `TestAenderungen.test_wende_an` | Prüft, dass die Änderungen im angezeigten Eintrag landen und E-Mails wieder getrennt werden; Konten bleiben. | grün |
+| `TestKorrekturPfad.test_textdatei_provider` | Prüft, dass aus der Quelle eines Textdatei-Layers (file-URI, Leerzeichen kodiert) der Pfad neben der CSV wird. | grün |
+| `TestKorrekturPfad.test_ogr_provider` | Prüft, dass auch eine OGR-Quelle mit Layernamen den Pfad neben der CSV ergibt. | grün |
+| `TestKorrekturPfad.test_keine_csv` | Prüft, dass für Quellen ohne CSV-Datei kein Pfad vorgeschlagen wird. | grün |
+| `TestSchreiben.test_neue_datei_mit_kopfzeile_und_bom` | Prüft, dass eine neue Korrektur-CSV mit BOM, Kopfzeile und je Änderung einer Zeile mit Exportspaltennamen entsteht. | grün |
+| `TestSchreiben.test_anhaengen_ohne_zweite_kopfzeile` | Prüft, dass weitere Korrekturen angehängt werden, ohne Kopfzeile oder BOM zu wiederholen. | grün |
+| `TestSchreiben.test_ohne_aenderung_keine_datei` | Prüft, dass ohne Änderung keine Datei angelegt wird. | grün |
+| `TestSchreiben.test_schreibfehler_wird_weitergereicht` | Prüft, dass ein nicht schreibbarer Pfad als OSError beim Aufrufer ankommt. | grün |
+| `TestSchreiben.test_schreibt_nichts_auf_die_konsole` | Prüft, dass das Festhalten von Korrekturen keine Personendaten auf die Konsole schreibt (Datenschutz). | grün |
+
 ### `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_suche.py`
 
 Worum es in der Datei geht: Tests für die Eigentümersuche im Serienbriefexport (#56).
@@ -1156,13 +1205,16 @@ Testgruppen:
 
 ### `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_tab.py`
 
-Worum es in der Datei geht: Tests für den Tab „Eigentümer“ – Flurstückssuche und Eigentümersuche (#56).
+Worum es in der Datei geht: Tests für den Tab „Eigentümer“ – Flurstückssuche, Eigentümersuche, Anzeige und Korrektur (#56).
 
 Testgruppen:
 
 - `TestFlurstueckSuchen` (5 Testfälle): — (Docstring fehlt)
 - `TestEigentuemerSuchen` (4 Testfälle): — (Docstring fehlt)
-- `TestTrefferliste` (2 Testfälle): — (Docstring fehlt)
+- `TestTrefferliste` (3 Testfälle): — (Docstring fehlt)
+- `TestSitzung` (7 Testfälle): — (Docstring fehlt)
+- `TestKorrektur` (5 Testfälle): — (Docstring fehlt)
+- `TestKorrekturDatei` (2 Testfälle): — (Docstring fehlt)
 - `TestDockWidgetTabs` (1 Testfälle): — (Docstring fehlt)
 
 | Testfall | prüft | Status |
@@ -1175,9 +1227,24 @@ Testgruppen:
 | `TestEigentuemerSuchen.test_ohne_eigentuemerdatei_warnung` | Prüft, dass ohne gewählte Eigentümerdatei die Liste aufgefrischt und dann auf das Laden der CSV hingewiesen wird. | grün |
 | `TestEigentuemerSuchen.test_suchfehler_als_warnung` | Prüft, dass ein Fehler der Suche (z. B. leere Eingabe) als Warnung erscheint. | grün |
 | `TestEigentuemerSuchen.test_kein_treffer_ohne_namen_in_meldung` | Prüft, dass ohne Treffer ein Hinweis erscheint, der den gesuchten Namen nicht wiederholt (Datenschutz). | grün |
-| `TestEigentuemerSuchen.test_treffer_oeffnen_trefferliste_und_ersetzen_die_alte` | Prüft, dass Treffer in einer neuen Trefferliste erscheinen, eine offene alte Liste geschlossen wird und die Eingaben an die Suche gehen. | grün |
+| `TestEigentuemerSuchen.test_treffer_oeffnen_trefferliste_und_ersetzen_die_alte` | Prüft, dass Treffer in einer neuen Trefferliste mit Anzeige-Rückruf erscheinen, eine offene alte Liste geschlossen wird und die Eingaben an die Suche gehen. | grün |
 | `TestTrefferliste.test_trefferzeile_mit_hinweis` | Prüft, dass die Trefferliste Name, Anschrift, E-Mail, den Rohwert von PER_RECHTSPERSON und das Kennzeichen „verstorben“ zeigt. | grün |
 | `TestTrefferliste.test_ausgewaehlte_eigentuemer` | Prüft, dass das Trefferfenster die in der Tabelle gewählten Einträge zurückgibt. | grün |
+| `TestTrefferliste.test_daten_anzeigen_gibt_auswahl_weiter` | Prüft, dass „Daten anzeigen“ die Auswahl der Trefferliste an den Tab übergibt. | grün |
+| `TestSitzung.test_sitzung_beginnen_im_vollbild_auf_zweitem_bildschirm` | Prüft, dass „Sitzung beginnen“ ein leeres Anzeigefenster auf dem gewählten Bildschirm öffnet, im Vollbild, wenn QGIS woanders liegt. | grün |
+| `TestSitzung.test_auf_qgis_bildschirm_kein_vollbild` | Prüft, dass das Anzeigefenster auf dem QGIS-Bildschirm als normales Fenster öffnet. | grün |
+| `TestSitzung.test_daten_anzeigen_beginnt_sitzung_bei_bedarf` | Prüft, dass „Daten anzeigen“ ohne laufende Sitzung diese beginnt und die Einträge zeigt; die Statuszeile nennt nur die Anzahl. | grün |
+| `TestSitzung.test_daten_anzeigen_ohne_auswahl` | Prüft, dass „Daten anzeigen“ ohne Auswahl nur einen Hinweis gibt und keine Sitzung beginnt. | grün |
+| `TestSitzung.test_anzeige_leeren_laesst_fenster_offen` | Prüft, dass „Anzeige leeren“ die Daten entfernt, das Fenster aber nicht schließt. | grün |
+| `TestSitzung.test_sitzung_beenden_schliesst_fenster` | Prüft, dass „Sitzung beenden“ das Anzeigefenster schließt und die angezeigten Daten vergisst. | grün |
+| `TestSitzung.test_von_aussen_geschlossen_beendet_sitzung` | Prüft, dass ein von außen geschlossenes Anzeigefenster (z. B. Alt+F4) die Sitzung im Tab beendet. | grün |
+| `TestKorrektur.test_korrektur_wird_festgehalten_und_angezeigt` | Prüft, dass eine Korrektur in die Korrektur-CSV geschrieben, sofort angezeigt und ohne Namen gemeldet wird. | grün |
+| `TestKorrektur.test_ohne_aenderung_nichts_schreiben` | Prüft, dass ein unverändert gespeicherter Dialog nichts schreibt. | grün |
+| `TestKorrektur.test_abbruch_nichts_schreiben` | Prüft, dass ein abgebrochener Korrekturdialog nichts schreibt. | grün |
+| `TestKorrektur.test_schreibfehler_warnung_und_anzeige_unveraendert` | Prüft, dass bei einem Schreibfehler gewarnt, die Anzeige nicht geändert und der Pfad beim nächsten Mal neu bestimmt wird. | grün |
+| `TestKorrektur.test_ohne_anzeige_keine_korrektur` | Prüft, dass ohne angezeigte Daten kein Korrekturdialog erscheint. | grün |
+| `TestKorrekturDatei.test_vorschlag_neben_der_eigentuemerdatei` | Prüft, dass die Korrektur-CSV ohne Rückfrage neben der Eigentümerdatei liegt, wenn der Ordner beschreibbar ist, und gemerkt wird. | grün |
+| `TestKorrekturDatei.test_ohne_csv_quelle_wird_gefragt` | Prüft, dass ohne verwertbare CSV-Quelle nach dem Speicherort gefragt wird; Abbrechen liefert keinen Pfad. | grün |
 | `TestDockWidgetTabs.test_tab_ist_im_dockwidget_eingetragen` | Prüft, dass der Tab „Eigentümer“ im DockWidget direkt nach dem Bearbeitungs-Tab steht. | grün |
 
 ### `Plugin_SN_Verfahrensgebiet/tests/test_flurstueck_alkis.py`
@@ -1652,7 +1719,7 @@ dann verschwindet er hier von selbst.
 
 Keine Lücken.
 
-### `sn_verfahrensgebiet` – 102 von 249 Testfällen ohne Beschreibung
+### `sn_verfahrensgebiet` – 102 von 288 Testfällen ohne Beschreibung
 
 #### `Plugin_SN_Verfahrensgebiet/tests/test_beteiligung_pruefung.py` (25 von 25)
 
diff --git a/docs/tests/verfahrensgebiet-eigentuemer-anzeige.md b/docs/tests/verfahrensgebiet-eigentuemer-anzeige.md
new file mode 100644
index 0000000..245af2f
--- /dev/null
+++ b/docs/tests/verfahrensgebiet-eigentuemer-anzeige.md
@@ -0,0 +1,93 @@
+# Testkonzept: Anzeige für den Eigentümer und Korrekturen
+
+Plugin: `sn_verfahrensgebiet` · Stand: 06.10.2026 · Pflege: bei jeder Änderung an diesem Ablauf
+
+## Worum es fachlich geht
+
+Im Termin sitzt der Eigentümer vor einem zweiten Bildschirm. Dort sieht er nur seine eigenen gespeicherten Daten:
+Name, Anschrift und E-Mail. Den QGIS-Bildschirm mit Trefferliste, Konten und anderen Personen sieht er nicht.
+Die Sachbearbeitung beginnt zu Beginn der Termine eine Sitzung. Für jeden Eigentümer wählt sie in der Trefferliste
+die passenden Einträge und zeigt sie an. Stimmt etwas nicht, korrigiert sie es im Plugin. Der Eigentümer sieht die
+Korrektur sofort. Vor dem nächsten Eigentümer leert sie die Anzeige, ohne das Fenster zu schließen. Am Ende beendet
+sie die Sitzung.
+
+Die Eigentümerdatei selbst wird nie verändert. Jede Korrektur landet als eigene Zeile in einer Korrektur-CSV neben
+der Eigentümerdatei und kann später in das Fachverfahren übernommen werden.
+
+Die Suche bis zur Trefferliste beschreibt [`verfahrensgebiet-eigentuemersuche.md`](verfahrensgebiet-eigentuemersuche.md).
+
+## Der Ablauf
+
+```mermaid
+flowchart TD
+    A["1 Bildschirm wählen,
Sitzung beginnen"] --> B["2 Anzeigefenster öffnet leer
(zweiter Bildschirm: Vollbild)"] + T["Trefferliste: Einträge wählen,
„Daten anzeigen“"] --> C{"Sitzung läuft?"} + C -->|nein| A + C -->|ja| D["3 Eigentümer sieht Name,
Anschrift, E-Mail"] + B --> D + D --> E{"4 Daten richtig?"} + E -->|nein| F["5 Korrigieren: Änderung
in Korrektur-CSV, sofort angezeigt"] + F --> E + E -->|ja| G["6 Anzeige leeren
(Fenster bleibt offen)"] + G --> T + G --> H["7 Sitzung beenden:
Fenster schließt"] + + style G fill:#e9f5e9,stroke:#2b8a3e +``` + +## Was geprüft wird + +Die Tests liegen in `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_anzeige.py` (Anzeigetext, Bildschirme), +`tests/test_eigentuemer_korrektur.py` (Korrekturlogik, Korrektur-CSV) und `tests/test_eigentuemer_tab.py` +(Sitzung, Korrektur im Tab). + +| # | Schritt | Wird geprüft durch | Ebene | +|---|---|---|---| +| 1 | Vorgabe: erster Bildschirm ohne QGIS | `test_vorgabe_ist_nicht_der_qgis_bildschirm`, `test_bildschirm_text` | Mock | +| 1 | Ohne Qt-Anwendung keine Bildschirme | `test_ohne_qt_anwendung_keine_bildschirme` | Mock | +| 2 | Sitzung beginnen: leer, Vollbild auf zweitem Bildschirm | `test_sitzung_beginnen_im_vollbild_auf_zweitem_bildschirm`, `test_vollbild_auf_gewaehltem_bildschirm` | Mock | +| 2 | Auf dem QGIS-Bildschirm normales Fenster | `test_auf_qgis_bildschirm_kein_vollbild`, `test_normales_fenster_mittig`, `test_ohne_bildschirm_einfach_zeigen` | Mock | +| 3 | „Daten anzeigen“ beginnt bei Bedarf die Sitzung | `test_daten_anzeigen_beginnt_sitzung_bei_bedarf`, `test_daten_anzeigen_gibt_auswahl_weiter` | Mock | +| 3 | Ohne Auswahl nur ein Hinweis | `test_daten_anzeigen_ohne_auswahl` | Mock | +| 3 | Inhalt: Name, Anschrift, E-Mail; mehrere Einträge | `test_name_anschrift_email`, `test_mehrere_eintraege_getrennt` | Mock | +| 3 | Keine internen Angaben für den Eigentümer | `test_keine_internen_angaben` | Mock | +| 3 | Fehlende E-Mail ausdrücklich nennen | `test_fehlende_email_wird_genannt` | Mock | +| 5 | Nur echte Änderungen, Leeren zählt | `test_nur_echte_aenderungen`, `test_feld_leeren_ist_aenderung`, `test_feldwerte` | Mock | +| 5 | Korrektur festhalten und sofort anzeigen | `test_korrektur_wird_festgehalten_und_angezeigt`, `test_wende_an` | Mock | +| 5 | Unverändert oder abgebrochen: nichts schreiben | `test_ohne_aenderung_nichts_schreiben`, `test_abbruch_nichts_schreiben` | Mock | +| 5 | Korrektur-CSV: Kopfzeile, BOM, anhängen | `test_neue_datei_mit_kopfzeile_und_bom`, `test_anhaengen_ohne_zweite_kopfzeile`, `test_ohne_aenderung_keine_datei` | Mock | +| 5 | Pfad neben der Eigentümerdatei, sonst Rückfrage | `test_textdatei_provider`, `test_ogr_provider`, `test_keine_csv`, `test_vorschlag_neben_der_eigentuemerdatei`, `test_ohne_csv_quelle_wird_gefragt` | Mock | +| 5 | Schreibfehler | `test_schreibfehler_wird_weitergereicht`, `test_schreibfehler_warnung_und_anzeige_unveraendert` | Mock | +| 5 | Ohne Anzeige keine Korrektur | `test_ohne_anzeige_keine_korrektur` | Mock | +| 6 | Anzeige leeren, Fenster bleibt offen | `test_anzeige_leeren_laesst_fenster_offen`, `test_leer_nur_platzhalter` | Mock | +| 7 | Sitzung beenden bzw. Fenster von außen geschlossen | `test_sitzung_beenden_schliesst_fenster`, `test_von_aussen_geschlossen_beendet_sitzung` | Mock | +| — | Keine Personendaten auf der Konsole | `test_schreibt_nichts_auf_die_konsole` | Mock | +| — | Sieht das in QGIS richtig aus, auf zwei Bildschirmen? | manueller Test | manuell | + +Ebene: `Mock` (ohne QGIS, Sekunden) · `QGIS` (gegen echtes QGIS) · `manuell` (Mensch in QGIS). + +## Fachliche Sonderfälle + +| Sonderfall | Kommt vor bei | Wird geprüft durch | +|---|---|---| +| Nur ein Bildschirm (Notebook) | Termin ohne zweiten Monitor, Ausprobieren | `test_auf_qgis_bildschirm_kein_vollbild` | +| Eheleute oder Miteigentümer erscheinen gemeinsam | mehrere Einträge auf einmal anzeigen und einzeln korrigieren | `test_mehrere_eintraege_getrennt`, `test_korrektur_wird_festgehalten_und_angezeigt` | +| Eigentümer hat keine E-Mail hinterlegt | häufig; soll beim Termin ergänzt werden | `test_fehlende_email_wird_genannt` | +| Neue Anschrift mit Komma („Am Anger 3, Haus B“) | Zusatz zur Hausnummer | `test_neue_datei_mit_kopfzeile_und_bom` | +| Eigentümerdatei liegt in einem schreibgeschützten Ordner | Export auf einem Netzlaufwerk ohne Schreibrecht | `test_ohne_csv_quelle_wird_gefragt` (Rückfrage), `test_schreibfehler_warnung_und_anzeige_unveraendert` | +| Sonderzeichen oder spitze Klammern in den Daten | Firmennamen | `test_werte_werden_maskiert` | + +## Bewusst nicht getestet + +| Was | Warum | Wie stattdessen abgesichert | +|---|---|---| +| Fenster tatsächlich auf dem zweiten Bildschirm im Vollbild | braucht echte Bildschirme; im Mock-Modus gibt es keine | Aufrufreihenfolge mit Attrappe geprüft, manueller Test mit zwei Bildschirmen | +| Korrekturdialog mit echten Eingabefeldern | im Mock-Modus gibt es keine Widgets; die Vorbelegung (`feldwerte`) und die Auswertung sind als reine Funktionen getestet | manueller Test | +| Schriftgröße und Lesbarkeit der Anzeige | Geschmack und Bildschirmgröße | manueller Test im Termin | + +## Bekannte Lücken + +| Lücke | Auswirkung | Issue | +|---|---|---| +| Der manuelle Test mit zwei Bildschirmen steht aus, auch mit unterschiedlicher Skalierung (z. B. Notebook 150 %, Monitor 100 %) | Das Fenster könnte auf dem falschen Bildschirm oder nicht ganz im Vollbild erscheinen | Verfahrensgebiet #56 | +| Eine neue Suche leert die Anzeige nicht von selbst | Wer „Anzeige leeren“ vergisst, zeigt dem nächsten Eigentümer noch die vorherigen Daten | bewusst so (Bearbeiter entscheidet); bei Bedarf eigenes Issue | diff --git a/docs/tests/verfahrensgebiet-eigentuemersuche.md b/docs/tests/verfahrensgebiet-eigentuemersuche.md index 8bf5ac0..2db9cd4 100644 --- a/docs/tests/verfahrensgebiet-eigentuemersuche.md +++ b/docs/tests/verfahrensgebiet-eigentuemersuche.md @@ -13,8 +13,8 @@ Rechtspersonen sind in der Liste gekennzeichnet: verstorben als Hinweis (`PER_VERSTORBEN` = 1), die Art der Person als Rohwert von `PER_RECHTSPERSON` (0, 1, 5 oder 9; die Bedeutung der Werte wird später entschlüsselt). -Die Trefferliste sieht nur die Sachbearbeitung. Das Anzeigefenster für den Eigentümer auf dem zweiten Bildschirm -und die Korrekturen folgen im nächsten Schritt von Issue Verfahrensgebiet #56. +Die Trefferliste sieht nur die Sachbearbeitung. Wie die gewählten Einträge dem Eigentümer angezeigt und korrigiert +werden, beschreibt [`verfahrensgebiet-eigentuemer-anzeige.md`](verfahrensgebiet-eigentuemer-anzeige.md). ## Der Ablauf diff --git a/docs/wissen/fallstricke.md b/docs/wissen/fallstricke.md index eafcf18..0f96f93 100644 --- a/docs/wissen/fallstricke.md +++ b/docs/wissen/fallstricke.md @@ -102,7 +102,8 @@ Kurz, konkret, mit Datum und Quelle. Neue Einträge oben in der passenden Rubrik - **ArcGIS-REST-Layer nicht nach Nummer deuten.** Gleiche Layer-URLs werden in der Linkliste und im Alternativansatz unterschiedlich benannt; Bedeutung und Geometrie immer gegen die Dienstmetadaten prüfen. (Vergleich Alternativansatz 09/2026) - **CRS:** Plan41 und VLN-API arbeiten in EPSG:25833. Der Alternativansatz erzeugt EPSG:25832. Für neue Layer 25833 verwenden, bis eine Entscheidung dokumentiert ist. - **Shape-Import erwartet Feld `FBSchl`** mit `901/10110F` (Neuordnungsgebiet) oder `901/10120F` (Neuvermessungsgebiet). Exporte mit abweichendem Feldnamen (`FBSchl.`) wurden bis 26.8.3 abgewiesen; seit PR Verfahrensgebiet #45 (02.09.2026, 26.8.4-unstable) ist die Feldsuche tolerant. Neue Exportvarianten trotzdem gegen die Erkennung testen. -- **Eigentümerdaten sind personenbezogen (Verfahrensgebiet #56).** Der Serienbriefexport wird vom Anwender von Hand als CSV-Layer geladen; das Plugin liest ihn nur. Namen und Anschriften gehören nicht in `print`, Meldungsleiste, Projektvariablen oder Testdaten (Tests nutzen erfundene Namen, `test_suche_gibt_nichts_aus` prüft die Konsole). Ein gespeichertes Projekt enthält nur den Pfad zur CSV, nicht die Daten. (06.10.2026) +- **Eigentümerdaten sind personenbezogen (Verfahrensgebiet #56).** Der Serienbriefexport wird vom Anwender von Hand als CSV-Layer geladen; das Plugin liest ihn nur. Namen und Anschriften gehören nicht in `print`, Meldungsleiste, Projektvariablen oder Testdaten (Tests nutzen erfundene Namen, `test_suche_gibt_nichts_aus` prüft die Konsole). Ein gespeichertes Projekt enthält nur den Pfad zur CSV, nicht die Daten. Die Korrektur-CSV (`_korrekturen.csv`) enthält ebenfalls Personendaten und liegt deshalb neben dem Export, nicht im Projekt- oder Plugin-Ordner. Das Anzeigefenster für den Eigentümer zeigt nur Name, Anschrift und E-Mail; Konten, Personen-IDs und Kennzeichen bleiben im Tab. (06.10.2026) +- **Fenster auf einem bestimmten Bildschirm öffnen (Qt):** Erst `winId()` aufrufen, damit es ein natives Fenster gibt, dann `windowHandle().setScreen(bildschirm)`, `setGeometry(bildschirm.geometry())` und `showFullScreen()`. Nur `move()` auf die Koordinaten reicht unter Windows nicht zuverlässig, wenn die Bildschirme unterschiedlich skaliert sind. Die Liste der Bildschirme liefert `QCoreApplication.instance().screens()` (die QGIS-Anwendung ist eine `QApplication`); im Mock-Modus gibt es sie nicht. Umgesetzt in `sn_verfahrensgebiet/ui/eigentuemer_anzeige.py` (Verfahrensgebiet #56), in QGIS noch zu bestätigen. (06.10.2026) - **QGIS liest Zahlen-Spalten einer CSV als Zahl.** Beim Laden als Textdatei-Layer erkennt QGIS Feldtypen; eine PLZ `01067` wird dabei zur Ganzzahl `1067` – in Sachsen beginnt fast jede PLZ mit 0. `eigentuemer_suche._plz` stellt die Null wieder her. Kennungen wie `EIG_KONTO` oder `PER_ID` deshalb als Text vergleichen, nie als Zahl. (06.10.2026) - **VLN-Upload ersetzt den Serverbestand der VKZ vollständig** (`PUT`). Vor dem Upload sicherstellen, dass alle Teillayer geladen sind. - **API-Key liegt in `QSettings`** (Registry/Konfigurationsdatei), kein sicherer Schlüsselspeicher. Niemals in Logs oder Tests ausgeben.