From 5e87f2367e4d6f53954fab4f6b67c1f44145e7c1 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 6 Oct 2026 13:27:15 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Anzeige=20f=C3=BCr=20den=20Eigent=C3=BCmer?= =?UTF-8?q?=20und=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. From abac5a015cf4de56191f4e619ff7941a9081dccb Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 6 Oct 2026 13:44:18 +0200 Subject: [PATCH 2/2] Anzeigefenster ohne Vollbild: Testkonzept und Fallstrick (Verfahrensgebiet #56) Befund aus dem QGIS-Test (Fenster immer auf dem Hauptbildschirm, im Vollbild nicht zu verlassen) in fallstricke.md festgehalten; Testkonzept, Modulkarte und Testkatalog an das Fenster mit Rahmen und die Pfadanzeige der Korrektur-Datei angepasst. Co-Authored-By: Claude Opus 5.5 --- docs/architektur/modulkarte.md | 4 +- docs/tests/testkatalog.html | 70 ++++++++++--------- docs/tests/testkatalog.md | 34 ++++----- .../verfahrensgebiet-eigentuemer-anzeige.md | 20 +++--- docs/wissen/fallstricke.md | 2 +- 5 files changed, 68 insertions(+), 62 deletions(-) diff --git a/docs/architektur/modulkarte.md b/docs/architektur/modulkarte.md index fbdc1c9..c9f43b0 100644 --- a/docs/architektur/modulkarte.md +++ b/docs/architektur/modulkarte.md @@ -86,9 +86,9 @@ 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` | 411 | Tab „Eigentümer“ (#56): Flurstückssuche, Eigentümersuche, Anzeige für den Eigentümer (Bildschirm, Sitzung, „Anzeige leeren“) und Korrekturen | +| `ui/tabs/eigentuemer_tab.py` | 440 | Tab „Eigentümer“ (#56): Flurstückssuche, Eigentümersuche, Anzeige für den Eigentümer (Sitzung, „Anzeige leeren“, Lage des Fensters merken) und Korrekturen mit Pfadanzeige | | `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_anzeige.py` | 112 | Anzeigefenster für den Eigentümer (nur Name, Anschrift, E-Mail; maskiertes HTML), immer mit Rahmen, nie Vollbild (#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 | diff --git a/docs/tests/testkatalog.html b/docs/tests/testkatalog.html index 16d2eda..8915aab 100644 --- a/docs/tests/testkatalog.html +++ b/docs/tests/testkatalog.html @@ -119,8 +119,8 @@ 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)
-
822Testfälle
-
779grün
+
823Testfälle
+
780grün
35rot (Baseline)
82%mit Docstring
@@ -128,12 +128,12 @@
Verteilung je Paket
sn_basis43 Dateien · 490 Testfälle
-
sn_verfahrensgebiet18 Dateien · 288 Testfälle
+
sn_verfahrensgebiet18 Dateien · 289 Testfälle
sn_plan415 Dateien · 44 Testfälle
@@ -1675,9 +1675,9 @@

sn_verfahrensgebiet

-

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

+

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

- @@ -1765,7 +1765,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
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
+  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 6TestFensterOeffnen 3
flowchart TD
   root(["test_eigentuemer_anzeige.py"])
   class root rootnode
   root --> g1["TestAnzeigetext (6)"]
@@ -1776,14 +1776,11 @@
   g1 --> t4("werte_werden_maskiert")
   g1 --> t5("mehrere_eintraege_getrennt")
   g1 --> t6("leer_nur_platzhalter")
-  root --> g2["TestBildschirme (6)"]
+  root --> g2["TestFensterOeffnen (3)"]
   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")
+  g2 --> t7("normales_fenster_in_standardgroesse")
+  g2 --> t8("gemerkte_lage_wird_wiederhergestellt")
+  g2 --> t9("unbrauchbare_lage_ergibt_standardgroesse")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -1793,14 +1790,11 @@
   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
+  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
TestFensterOeffnen
test_normales_fenster_in_standardgroesse
Prüft, dass das Anzeigefenster ohne gemerkte Lage als normales Fenster mit Rahmen in Standardgröße öffnet, nie im Vollbild.grün
TestFensterOeffnen
test_gemerkte_lage_wird_wiederhergestellt
Prüft, dass eine gemerkte Größe und Lage der letzten Sitzung wiederhergestellt wird.grün
TestFensterOeffnen
test_unbrauchbare_lage_ergibt_standardgroesse
Prüft, dass eine nicht wiederherstellbare Lage auf die Standardgröße zurückfällt.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)"]
@@ -1876,7 +1870,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, Eigentümersuche, Anzeige und Korrektur (#56).

TestFlurstueckSuchen 5TestEigentuemerSuchen 4TestTrefferliste 3TestSitzung 7TestKorrektur 5TestKorrekturDatei 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 7TestKorrekturLabel 4TestKorrektur 5TestKorrekturDatei 2TestDockWidgetTabs 1
flowchart TD
   root(["test_eigentuemer_tab.py"])
   class root rootnode
   root --> g1["TestFlurstueckSuchen (5)"]
@@ -1899,27 +1893,33 @@
   g3 --> t12("daten_anzeigen_gibt_auswahl_weiter")
   root --> g4["TestSitzung (7)"]
   class g4 groupnode
-  g4 --> t13("sitzung_beginnen_im_vollbild_auf_zweitem_bildschirm")
-  g4 --> t14("auf_qgis_bildschirm_kein_vollbild")
+  g4 --> t13("sitzung_beginnen_oeffnet_leeres_fenster_mit_rahmen")
+  g4 --> t14("lage_gilt_fuer_naechste_sitzung")
   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)"]
+  root --> g5["TestKorrekturLabel (4)"]
   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)"]
+  g5 --> t20("ohne_eigentuemerdatei")
+  g5 --> t21("pfad_neben_der_eigentuemerdatei")
+  g5 --> t22("ohne_csv_quelle_wird_abgefragt")
+  g5 --> t23("gewaehlter_pfad_wird_angezeigt")
+  root --> g6["TestKorrektur (5)"]
   class g6 groupnode
-  g6 --> t25("vorschlag_neben_der_eigentuemerdatei")
-  g6 --> t26("ohne_csv_quelle_wird_gefragt")
-  root --> g7["TestDockWidgetTabs (1)"]
+  g6 --> t24("korrektur_wird_festgehalten_und_angezeigt")
+  g6 --> t25("ohne_aenderung_nichts_schreiben")
+  g6 --> t26("abbruch_nichts_schreiben")
+  g6 --> t27("schreibfehler_warnung_und_anzeige_unveraendert")
+  g6 --> t28("ohne_anzeige_keine_korrektur")
+  root --> g7["TestKorrekturDatei (2)"]
   class g7 groupnode
-  g7 --> t27("tab_ist_im_dockwidget_eingetragen")
+  g7 --> t29("vorschlag_neben_der_eigentuemerdatei")
+  g7 --> t30("ohne_csv_quelle_wird_gefragt")
+  root --> g8["TestDockWidgetTabs (1)"]
+  class g8 groupnode
+  g8 --> t31("tab_ist_im_dockwidget_eingetragen")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -1947,11 +1947,15 @@
   class t25 ok
   class t26 ok
   class t27 ok
+  class t28 ok
+  class t29 ok
+  class t30 ok
+  class t31 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 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
+  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_oeffnet_leeres_fenster_mit_rahmen
Prüft, dass „Sitzung beginnen“ ein leeres Anzeigefenster als normales Fenster öffnet (ohne gemerkte Lage beim ersten Mal).grün
TestSitzung
test_lage_gilt_fuer_naechste_sitzung
Prüft, dass Größe und Lage des Fensters beim Beenden gemerkt und in der nächsten Sitzung wiederverwendet werden.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 über den Fensterrahmen geschlossenes Anzeigefenster die Sitzung beendet und seine Lage gemerkt wird.grün
TestKorrekturLabel
test_ohne_eigentuemerdatei
Prüft, dass ohne Eigentümerdatei unter den Knöpfen steht, dass keine gewählt ist.grün
TestKorrekturLabel
test_pfad_neben_der_eigentuemerdatei
Prüft, dass der Pfad der Korrektur-CSV angezeigt wird, mit Hinweis, solange sie noch nicht angelegt ist.grün
TestKorrekturLabel
test_ohne_csv_quelle_wird_abgefragt
Prüft, dass bei einer Quelle ohne CSV angekündigt wird, dass der Speicherort beim ersten Speichern abgefragt wird.grün
TestKorrekturLabel
test_gewaehlter_pfad_wird_angezeigt
Prüft, dass ein einmal gewählter Speicherort angezeigt wird.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 0fbd313..4b806ef 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, 66 Testdateien, 822 Testfälle – 779 grün, 35 rot (Baseline), 8 übersprungen.
-Mit Beschreibung (Docstring): 677 von 822 (82 %).
+Gesamt: 3 Pakete, 66 Testdateien, 823 Testfälle – 780 grün, 35 rot (Baseline), 8 übersprungen.
+Mit Beschreibung (Docstring): 678 von 823 (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` | 18 | 288 | 246 | 34 | 8 | 186 von 288 (65 %) |
+| `sn_verfahrensgebiet` | 18 | 289 | 247 | 34 | 8 | 187 von 289 (65 %) |
 | `sn_plan41` | 5 | 44 | 43 | 1 | 0 | 1 von 44 (2 %) |
-| **Summe** | **66** | **822** | **779** | **35** | **8** | **677 von 822 (82 %)** |
+| **Summe** | **66** | **823** | **780** | **35** | **8** | **678 von 823 (82 %)** |
 
 ### Legende
 
@@ -1071,7 +1071,7 @@ Testgruppen:
 
 ## Paket `sn_verfahrensgebiet`
 
-Fachplugin, Ordner `Plugin_SN_Verfahrensgebiet` – 18 Testdateien mit 288 Testfällen (246 grün, 34 rot, 8 übersprungen).
+Fachplugin, Ordner `Plugin_SN_Verfahrensgebiet` – 18 Testdateien mit 289 Testfällen (247 grün, 34 rot, 8 übersprungen).
 
 ### `Plugin_SN_Verfahrensgebiet/tests/test_beteiligung_pruefung.py`
 
@@ -1135,7 +1135,7 @@ Worum es in der Datei geht: Tests für das Anzeigefenster des Eigentümer-Datena
 Testgruppen:
 
 - `TestAnzeigetext` (6 Testfälle): — (Docstring fehlt)
-- `TestBildschirme` (6 Testfälle): — (Docstring fehlt)
+- `TestFensterOeffnen` (3 Testfälle): — (Docstring fehlt)
 
 | Testfall | prüft | Status |
 | --- | --- | --- |
@@ -1145,12 +1145,9 @@ Testgruppen:
 | `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 |
+| `TestFensterOeffnen.test_normales_fenster_in_standardgroesse` | Prüft, dass das Anzeigefenster ohne gemerkte Lage als normales Fenster mit Rahmen in Standardgröße öffnet, nie im Vollbild. | grün |
+| `TestFensterOeffnen.test_gemerkte_lage_wird_wiederhergestellt` | Prüft, dass eine gemerkte Größe und Lage der letzten Sitzung wiederhergestellt wird. | grün |
+| `TestFensterOeffnen.test_unbrauchbare_lage_ergibt_standardgroesse` | Prüft, dass eine nicht wiederherstellbare Lage auf die Standardgröße zurückfällt. | grün |
 
 ### `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_korrektur.py`
 
@@ -1213,6 +1210,7 @@ Testgruppen:
 - `TestEigentuemerSuchen` (4 Testfälle): — (Docstring fehlt)
 - `TestTrefferliste` (3 Testfälle): — (Docstring fehlt)
 - `TestSitzung` (7 Testfälle): — (Docstring fehlt)
+- `TestKorrekturLabel` (4 Testfälle): — (Docstring fehlt)
 - `TestKorrektur` (5 Testfälle): — (Docstring fehlt)
 - `TestKorrekturDatei` (2 Testfälle): — (Docstring fehlt)
 - `TestDockWidgetTabs` (1 Testfälle): — (Docstring fehlt)
@@ -1231,13 +1229,17 @@ Testgruppen:
 | `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_sitzung_beginnen_oeffnet_leeres_fenster_mit_rahmen` | Prüft, dass „Sitzung beginnen“ ein leeres Anzeigefenster als normales Fenster öffnet (ohne gemerkte Lage beim ersten Mal). | grün |
+| `TestSitzung.test_lage_gilt_fuer_naechste_sitzung` | Prüft, dass Größe und Lage des Fensters beim Beenden gemerkt und in der nächsten Sitzung wiederverwendet werden. | 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 |
+| `TestSitzung.test_von_aussen_geschlossen_beendet_sitzung` | Prüft, dass ein über den Fensterrahmen geschlossenes Anzeigefenster die Sitzung beendet und seine Lage gemerkt wird. | grün |
+| `TestKorrekturLabel.test_ohne_eigentuemerdatei` | Prüft, dass ohne Eigentümerdatei unter den Knöpfen steht, dass keine gewählt ist. | grün |
+| `TestKorrekturLabel.test_pfad_neben_der_eigentuemerdatei` | Prüft, dass der Pfad der Korrektur-CSV angezeigt wird, mit Hinweis, solange sie noch nicht angelegt ist. | grün |
+| `TestKorrekturLabel.test_ohne_csv_quelle_wird_abgefragt` | Prüft, dass bei einer Quelle ohne CSV angekündigt wird, dass der Speicherort beim ersten Speichern abgefragt wird. | grün |
+| `TestKorrekturLabel.test_gewaehlter_pfad_wird_angezeigt` | Prüft, dass ein einmal gewählter Speicherort angezeigt wird. | 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 |
@@ -1719,7 +1721,7 @@ dann verschwindet er hier von selbst.
 
 Keine Lücken.
 
-### `sn_verfahrensgebiet` – 102 von 288 Testfällen ohne Beschreibung
+### `sn_verfahrensgebiet` – 102 von 289 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
index 245af2f..a49de90 100644
--- a/docs/tests/verfahrensgebiet-eigentuemer-anzeige.md
+++ b/docs/tests/verfahrensgebiet-eigentuemer-anzeige.md
@@ -6,7 +6,7 @@ Plugin: `sn_verfahrensgebiet` · Stand: 06.10.2026 · Pflege: bei jeder Änderun
 
 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 Sachbearbeitung beginnt zu Beginn der Termine eine Sitzung und schiebt das Anzeigefenster auf den Bildschirm des Eigentümers; beim nächsten Mal erscheint es wieder dort. 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.
@@ -20,7 +20,7 @@ Die Suche bis zur Trefferliste beschreibt [`verfahrensgebiet-eigentuemersuche.md
 
 ```mermaid
 flowchart TD
-    A["1 Bildschirm wählen,
Sitzung beginnen"] --> B["2 Anzeigefenster öffnet leer
(zweiter Bildschirm: Vollbild)"] + A["1 Sitzung beginnen"] --> B["2 Anzeigefenster öffnet leer, mit Rahmen;
Bearbeiter schiebt es auf den zweiten Bildschirm"] 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"] @@ -37,16 +37,14 @@ flowchart TD ## Was geprüft wird -Die Tests liegen in `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_anzeige.py` (Anzeigetext, Bildschirme), +Die Tests liegen in `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_anzeige.py` (Anzeigetext, Fenster öffnen), `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 | +| 2 | Sitzung beginnen: leeres Fenster mit Rahmen, nie Vollbild | `test_sitzung_beginnen_oeffnet_leeres_fenster_mit_rahmen`, `test_normales_fenster_in_standardgroesse` | Mock | +| 2 | Lage des Fensters gilt für die nächste Sitzung | `test_lage_gilt_fuer_naechste_sitzung`, `test_gemerkte_lage_wird_wiederhergestellt`, `test_unbrauchbare_lage_ergibt_standardgroesse` | 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 | @@ -59,6 +57,7 @@ Die Tests liegen in `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_anzeige.p | 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 | +| 5 | Pfad der Korrektur-Datei unter den Knöpfen | `test_ohne_eigentuemerdatei`, `test_pfad_neben_der_eigentuemerdatei`, `test_ohne_csv_quelle_wird_abgefragt`, `test_gewaehlter_pfad_wird_angezeigt` | 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 | @@ -70,7 +69,7 @@ Ebene: `Mock` (ohne QGIS, Sekunden) · `QGIS` (gegen echtes QGIS) · `manuell` ( | Sonderfall | Kommt vor bei | Wird geprüft durch | |---|---|---| -| Nur ein Bildschirm (Notebook) | Termin ohne zweiten Monitor, Ausprobieren | `test_auf_qgis_bildschirm_kein_vollbild` | +| Nur ein Bildschirm (Notebook) | Termin ohne zweiten Monitor, Ausprobieren | `test_normales_fenster_in_standardgroesse` (immer mit Rahmen, verdeckt QGIS nie ausweglos) | | 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` | @@ -81,7 +80,7 @@ Ebene: `Mock` (ohne QGIS, Sekunden) · `QGIS` (gegen echtes QGIS) · `manuell` ( | 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 | +| Wiederherstellen der Lage auf dem zweiten Bildschirm | braucht echte Bildschirme; im Mock-Modus gibt es keine | Aufruf 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 | @@ -89,5 +88,6 @@ Ebene: `Mock` (ohne QGIS, Sekunden) · `QGIS` (gegen echtes QGIS) · `manuell` ( | 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 | +| Wiederherstellen der Lage in der nächsten Sitzung ist in QGIS noch nicht bestätigt | Das Fenster erscheint dann wieder auf dem Hauptbildschirm und muss erneut verschoben werden – lästig, aber gefahrlos | Verfahrensgebiet #56 | +| Die Lage wird nur bis zum Neustart von QGIS gemerkt | nach jedem Start einmal verschieben | bei Bedarf eigenes Issue (QSettings) | | 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/wissen/fallstricke.md b/docs/wissen/fallstricke.md index 0f96f93..e5a4479 100644 --- a/docs/wissen/fallstricke.md +++ b/docs/wissen/fallstricke.md @@ -103,7 +103,7 @@ Kurz, konkret, mit Datum und Quelle. Neue Einträge oben in der passenden Rubrik - **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. 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) +- **Kein randloses Vollbild für eigene Fenster (Verfahrensgebiet #56).** Das Anzeigefenster für den Eigentümer sollte per `windowHandle().setScreen()`, `setGeometry()` und `showFullScreen()` auf dem zweiten Bildschirm erscheinen. Im QGIS-Test (06.10.2026, Windows) landete es trotzdem immer auf dem Hauptbildschirm und ließ sich im Vollbild weder verschieben noch schließen; es verdeckte QGIS, nur ein hartes Beenden von QGIS half. Seitdem öffnet es als normales Fenster mit Rahmen, der Bearbeiter schiebt es selbst auf den richtigen Bildschirm und kann es dort maximieren; `saveGeometry()`/`restoreGeometry()` merkt die Lage für die nächste Sitzung. Allgemein: Fenster, die QGIS verdecken können, brauchen immer einen Weg hinaus (Rahmen, Schließen-Knopf). (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.