Befund aus dem QGIS-Test: Die Bildschirmwahl wirkte nicht, das Fenster
erschien immer auf dem Hauptbildschirm. Im Vollbild ließ es sich weder
verschieben noch schließen und verdeckte QGIS; nur ein hartes Beenden
von QGIS half.
Bildschirmwahl und Vollbild entfallen. Das Anzeigefenster öffnet als
normales Fenster mit Rahmen; der Bearbeiter schiebt es auf den Bildschirm
des Eigentümers und kann es dort maximieren. Größe und Lage werden beim
Beenden gemerkt und in der nächsten Sitzung wiederhergestellt (bis zum
Neustart von QGIS).
Unter den Knöpfen steht jetzt Pfad und Name der Korrektur-Datei, mit
Hinweis, solange sie noch nicht angelegt ist oder erst abgefragt wird.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
„Daten anzeigen“ in der Trefferliste zeigt Name, Anschrift und E-Mail der
gewählten Einträge in einem eigenen Fenster: auf einem zweiten Bildschirm
im Vollbild, auf dem QGIS-Bildschirm als normales Fenster. Die Sitzung
wird von Hand begonnen und beendet; „Anzeige leeren“ entfernt die Daten,
ohne das Fenster zu schließen. Konten, IDs und Kennzeichen erscheinen dort
nicht, alle Werte werden maskiert.
„Korrigieren …“ ändert angezeigte Daten. Die Eigentümerdatei bleibt
unverändert; jede Änderung wird mit Zeitpunkt, Konto, Personen-ID, altem
und neuem Wert an <Eigentümerdatei>_korrekturen.csv angehängt und sofort
angezeigt. Ohne beschreibbaren Ordner wird nach dem Speicherort gefragt.
In test_eigentuemer_tab.py sind die beim letzten Mal zusammengezogenen
with-Zeilen wieder umbrochen; die Trefferliste bekommt jetzt den
Anzeige-Rückruf, der Test dazu ist angepasst.
Dritter und letzter Schritt von #56.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PER_RECHTSPERSON kennt die Werte 0, 1, 5 und 9 und ist kein Ja/Nein-Feld.
Die Trefferliste bekommt dafür eine eigene Spalte mit dem unveränderten
Wert; abweichende Werte einer Person werden gesammelt. Die Entschlüsselung
folgt später. „verstorben“ (PER_VERSTORBEN 0/1) bleibt als Hinweis.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eigentümerdatei (CSV-Layer mit Nachname/Vorname) wählen, Name und/oder
Vorname eingeben: Eine nicht modale Trefferliste zeigt Name, Anschrift,
E-Mail und die Kennzeichen „verstorben“/„Rechtsperson“. Gleiche Personen
mit gleicher Anschrift werden zusammengefasst; Groß-/Kleinschreibung und
Umlautschreibweise spielen keine Rolle. Von QGIS als Zahl gelesene PLZ
bekommen ihre führende Null zurück. Meldungen enthalten keine Namen.
Die Auswahltabelle aus „Verfahrensgebiete aus Landkreis laden“ ist als
baue_auswahltabelle herausgelöst und wird von der Trefferliste mitgenutzt.
Zweiter Schritt von #56; Anzeigefenster und Korrekturen folgen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gemarkung (Name oder Nummer) und Flurstücksnummer eingeben, die Treffer
werden im Layer „Flurstücke“ ausgewählt, angezoomt und kurz hervorgehoben.
Verglichen wird das flurstueckskennzeichen, Gemarkungsnamen werden über
den Layer „Gemarkungen“ aufgelöst. Ohne Layer „Flurstücke“ weist ein
Dialog darauf hin, zuerst Verfahrensgebiet und Flurstücke zu laden.
Erster Schritt von #56; Eigentümersuche und Anzeigefenster folgen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nach dem Laden aus ALKIS oder Shape wurde mit layer.extent() im
Layer-KBS gezoomt; bei anderem Projekt-KBS sprang die Karte an die
falsche Stelle. Beide Stellen nutzen jetzt zoom_auf_layer aus sn_basis.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
grenzpunkte_gemarkungsweise() ruft nach project.addMapLayer(joined_layer)
jetzt apply_style(joined_layer, "alkis_grenzpunkte.qml") auf - analog zum
bereits etablierten Muster bei Flurstücken/Verfahrensgebiet/BROR in
working_tab.py bzw. verfahrensgebiet_alkis_komplett.py.
Neuer Test test_stil_wird_nach_dem_laden_auf_den_ergebnis_layer_angewendet
mockt die komplette interne WFS-Kette (Extents, Hits, GML-Parsing,
Grenzpunkt-Batch, Join) und prüft, dass apply_style() mit dem Ergebnis-
Layer und dem richtigen Dateinamen aufgerufen wird.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
apply_style(gem_layer, "gemarkungen_beschriftet.qml") in working_tab.py
ruft die Datei klein geschrieben auf, im Repo lag sie als
Gemarkungen_beschriftet.qml. Auf Windows (case-insensitive) unsichtbar,
auf einem case-sensitiven Dateisystem (Linux/OSGeo4W) hätte das die
Datei nie gefunden - zusätzlich zum Pfadfehler in get_plugin_root()
(siehe Kommentar zu #50).
Umbenennung über zwei git mv-Schritte, da Windows/core.ignorecase eine
reine Case-Änderung sonst nicht als Rename erkennt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Test-Audit (Projektwissen #16) deckte auf: tests/test_flurstueck_alkis.py
wurde im selben Commit (f8bdcde) angelegt, in dem flurstueck_alkis() von
einer einzelnen QgsVectorLayer-Abfrage auf lade_flurstuecke_per_gemarkung()
(eine WFS-Anfrage je Gemarkung, Merge in Memory-Layer) umgestellt wurde -
die Tests mockten aber weiterhin die alte Ein-Query-Variante und liefen
seither ins Leere (8 von 12 Testfaellen rot in der Baseline).
- Tests mocken jetzt lade_flurstuecke_per_gemarkung()/_check_existing_
flurstueck_layer() statt QgsVectorLayer direkt, passend zum seit #47
bzw. 944fc82 aktuellen Drei-Knopf-Dialog (Ueberschreiben/Anhaengen/
Abbrechen) und dem Pro-Gemarkung-Ladevorgang.
- test_existing_layer_keep_no -> test_existing_layer_abbrechen_returns_none:
LoadStatus.KEEP wird von _check_existing_flurstueck_layer() nicht mehr
zurueckgegeben, der verbleibende Nicht-Aendern-Pfad ist "Abbrechen".
- test_bbox_embedded_in_wfs_uri entfernt: bbox wird von keinem Aufrufer
mehr uebergeben und im Code nicht mehr ausgewertet; die vermeintliche
URI-Einbettung gab es schon lange nicht mehr.
- Modul-Docstring in flurstueck_alkis.py korrigiert: bbox ist reine
Rueckwaertskompatibilitaet in der Signatur (Flurstueck-Geometrie kommt
aus dem WFS je Gemarkung, keine BBox-Filterung), Memory-Layer statt
Direktladung dokumentiert.
- Alle Docstrings von TestFlurstueckAlkis auf "Prueft, dass ..." gebracht
(Vorgabe docs/leitfaden/06_tests.md) und inhaltlich an die tatsaechlich
getestete Logik angepasst; Datei-Docstring ebenfalls korrigiert.
- Totes _DummyLayer.extent() entfernt (wird von keiner Aufrufkette mehr
erreicht).
Kein Verhaltensunterschied in flurstueck_alkis() selbst - nur Tests und
Dokumentation an eine bereits bestehende Implementierung angeglichen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
handle_flurst_aus_gemarkungen() hatte eine eigene Kopie des
"Layer bereits vorhanden"-Dialogs und rief lade_flurstuecke_per_gemarkung
direkt auf, statt die bereits vorhandene, getestete Logik in
flurstueck_alkis() wiederzuverwenden. Grund war, dass ohne_dialog=True
zwei unabhaengige Dinge zugleich abschaltete: die Schluessel-Abfrage per
ask_text UND den Existenz-Dialog samt Anhaengen-Dedup.
Neuer Parameter ohne_schluessel_abfrage trennt beides: er ueberspringt
nur die Schluessel-Abfrage (Schluessel kommen bereits aus der
Gemarkungen-Layer-Auswahl), der Existenz-Dialog mit Dedup bleibt aktiv.
ohne_dialog bleibt fuer die automatischen Pipelines unveraendert.
handle_flurst_alkis() und handle_flurst_aus_gemarkungen() teilen sich
jetzt zusaetzlich die Nachbehandlung des Ladeergebnisses
(_uebernimm_flurstuecke_ergebnis). lade_flurstuecke_per_gemarkung() wird
wieder nur noch von einer Stelle aus aufgerufen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
handle_flurst_aus_gemarkungen in working_tab.py hatte eine eigene,
von flurstueck_alkis() unabhaengige Anhaengen-Logik, die
lade_flurstuecke_per_gemarkung direkt aufrief und ungefiltert
anhaengte. Nutzt jetzt dieselbe flurstueckskennzeichen-Pruefung wie
der Fix im vorigen Commit; dafuer vorhandene_kennzeichen() in
flurstueck_alkis.py oeffentlich gemacht.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Beim Anhaengen an einen bestehenden Flurstueck-Layer wurden alle neu
geladenen Objekte unabhaengig davon hinzugefuegt, ob sie ueber
flurstueckskennzeichen bereits im Layer vorhanden waren. Jetzt werden
nur noch neue Kennzeichen angehaengt; fehlt das Feld, bleibt das
bisherige Verhalten als Rueckfall erhalten.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Manche Shape-Exporte liefern das Feld "FBSchl" mit angehängtem Punkt
(z.B. "FBSchl.") oder abweichender Groß-/Kleinschreibung. Der bisherige
exakte Namensvergleich (fields().indexFromName) erkannte das Feld dann
nicht und meldete fälschlich "Feld fehlt", die Datei wurde nicht
eingelesen.
- _normalisiere_feldname(): entfernt alle Nicht-alphanumerischen Zeichen
und normalisiert auf Kleinbuchstaben
- _finde_fbschl_index(): exakter Namensabgleich zuerst, sonst Fallback auf
normalisierten Vergleich über alle Felder
Fixes#44
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Checkbox "Nur Objekte laden (ohne weitere Prüfungen)" im
Landkreis-Auswahldialog entfernt
- Stattdessen nach dem Laden/Übernehmen des BROR-Objekts eine einheitliche
Ja/Nein-Stop-Abfrage ("Weiter?") vor Dialog 2 (Gemarkung/Flurstücke/
Flächenvergleich) - analog zum Ablauf bei "Aus Shape laden"
- Gilt jetzt für Verfahrensnummer- und Landkreis-Zweig gleichermaßen,
vorher gab es die Option nur im Landkreis-Zweig
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Dateidialog erlaubt Mehrfachauswahl von .zip/.shp; ZIPs werden in ein
temporäres Verzeichnis entpackt statt dauerhaft neben der ZIP-Datei
(Cleanup nach dem Einlesen)
- Je Shapefile wird das Feld FBSchl geprüft und in Neuordnungs- bzw.
Neuvermessungsgebiet unterschieden; Geometrien gleichen Typs werden über
alle Dateien hinweg zu je einem Layer verschmolzen und entsprechend
benannt ("Neuordnungsgebiet (NoBIS)" / "Neuvermessungsgebiet (NoBIS)")
- Fehler einzelner Dateien/Shapefiles brechen den Vorgang nicht mehr ab,
sondern werden gesammelt und am Ende in einer Meldung ausgegeben
- Fortschrittsdialog erscheint erst nach dem Stop nach dem Laden, nicht
mehr schon vor dem Dateidialog
- Vorprüfung auf gesetzte Verfahrensnummer vorerst auskommentiert
- Ablauf-Dokumentation aufgeteilt in aus_alkis_laden.md und
aus_shape_laden.md (+ technische Ergänzung aus_shape_laden_technisch.md)
Löst #36, #37, #38
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- verfahrensgebiet_shape_komplett.py: TEMPORÄRER STOPP (wieder entfernen)
zur Zwischenkontrolle nach dem ZIP-Import. Layer wird dafür schon an
dieser Stelle sichtbar ins Projekt eingefügt statt erst nach Schritt 2;
bei "Nein" bleibt der Layer zur Inspektion erhalten (abgeschlossen=True),
der spätere reguläre addMapLayer-Aufruf prüft auf Duplikat.
- docs/ablauf_verfahrensgebiet_laden.md: Mermaid-Diagramm der Lade-Abläufe
(ALKIS/Shape) bis zu den jeweiligen frühen Stopps.
Lokaler Debug-Branch, bewusst nicht für unstable vorgesehen.
Konflikte aufgelöst wie mit Daniel abgestimmt:
- functions/beteiligung_pruefung.py, tests/test_beteiligung_pruefung.py:
unsere Version behalten (ohne silent-Parameter, Aufforderung statt
automatischem Hintergrund-Laden bei try2/try3).
- functions/verfahrensgebiet_alkis.py, functions/verfahrensgebiet_alkis_komplett.py:
unsere Version behalten (Zwei-Dialog-Split, Landkreis-Fallback; Daniels
silent-Parameter dadurch nicht mehr benötigt).
- ui/tabs/working_tab.py: Docstring-Konflikt trivial aufgelöst, unsere
Fassung behalten (beschreibt das tatsächliche Verhalten ohne silent).
- changelog.txt: beide Versionsblöcke zusammengeführt.
Portiert aus origin/unstable (Feature "Beteiligung prüfen": Abgleich einer
BI-Server-CSV-Exportliste mit dem ALKIS-Flurstücksbestand des
Verfahrensgebiets), bewusst OHNE den dortigen silent-Modus für
verfahrensgebiet_alkis()/verfahrensgebiet_alkis_komplett():
- try1 (Verfahrensgebiet-Layer mit Kennzeichen vorhanden) bleibt unverändert
– schneller Mengenvergleich ohne WFS-Zugriff.
- try2 (Layer vorhanden, aber ohne verwertbare Kennzeichen) und try3 (kein
Layer vorhanden) laden nicht mehr automatisch/silent über die komplette
ALKIS-Pipeline, sondern fordern den Nutzer per Meldung auf, das
Verfahrensgebiet zunächst regulär über "Aus ALKIS laden" zu laden und die
Beteiligungsprüfung danach erneut zu starten (landet dann automatisch bei
try1). Grund: ein automatischer Durchlauf ohne Nutzerinteraktion
(mehrdeutige BROR-Treffer, Flächenabweichungen) hat sich in der Praxis
nicht als zuverlässig genug erwiesen.
- verfahrensgebiet_alkis.py/verfahrensgebiet_alkis_komplett.py bleiben dadurch
unangetastet – kein silent-Parameter, kein Konflikt mit dem heutigen
Zwei-Dialog-Split und dem Landkreis-Fallback.
- Neuer Button "Beteiligung prüfen" in working_tab.py, delegiert an
beteiligung_pruefen().
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Abbruch des Dialogs ist eine bewusste Nutzerentscheidung, kein Fehlerzustand
– verfahrensgebiet_alkis_komplett() bricht jetzt still ab statt eine
QMessageBox.critical zu zeigen. Test entsprechend angepasst/umbenannt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Ist weder Verfahrensnummer noch Landkreis in den Projekteigenschaften
gesetzt, wird jetzt per Dialog ein Landkreis abgefragt (inkl. "Alle
Landkreise") statt direkt abzubrechen.
- Verfahrensgebiet-spezifische ALKIS-Dialoge aus sn_basis hierher verschoben:
neue Datei functions/verfahrensgebiet_dialoge.py
(ask_bror_kombinationen, ask_landkreis_objekte, ask_landkreis_auswahl).
- Bugfix: BROR-Layer bekommt seinen Style (BauRaumOderBodenordnungsrecht.qml)
jetzt direkt beim Laden in verfahrensgebiet_alkis_komplett(), unabhängig
vom weiteren Ablauf. working_tab.py überspringt bei "Nur Objekte laden"
jetzt den gesamten VG-Nachbehandlungsblock (Style/Extent/Haken/Combobox/
Erfolgsmeldung), da dort kein echter VG-Layer entsteht. Detailprüfung/
Verifikation im echten QGIS (nicht nur per Unittest) steht noch aus.
- Bugfix: Erfolgsmeldung "Layer wurde ... geladen (inkl.
Flurstücksverschneidung)" erscheint nicht mehr bei "Nur Objekte laden".
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Fortschrittsdialog beim Laden aus ALKIS schließt jetzt zuverlässig bei
jedem Abbruch (progress.close() zentral im finally-Block).
- Fortschrittsanzeige in zwei Dialoge aufgeteilt: Suche (1 Schritt) läuft
und schließt separat, bevor der eigentliche Workflow (Gemarkung/
Flurstücke/Vergleich, 6 Schritte) startet – auch während des BROR-
Auswahldialogs läuft kein störender Hintergrund-Fortschrittsbalken mehr.
- verfahrensgebiet_alkis() in Suche-/Auswahl-Phasen aufgeteilt, damit
mehrere gefundene BauRaumOderBodenordnungsrecht-Objekte gemeinsam
ausgewählt und verschmolzen werden können (öffentliche Signatur
unverändert).
- Neu: Landkreis-weite Suche als Fallback, wenn keine Verfahrensnummer
gesetzt ist (Landkreiskennzahl aus Projektvariable), mit Mehrfach-
auswahl/"Alle auswählen" und "Nur laden"-Option (überspringt den
restlichen Workflow). Gruppierung der Auswahl nach VKZ, damit je
Verfahren ein eigenes Feature entsteht statt eines Gesamt-Blobs.
- Tests entsprechend angepasst/ergänzt (29 Tests in
test_verfahrensgebiet_alkis_komplett.py, davon 3 neu für den
Landkreis-Fallback).