Files
Workflow/CHANGELOG.md
T

16 KiB
Raw Blame History

Changelog

2026-07-04 (Signatur-Auswertung: Signaturen-Array + Integritaetspruefung)

  • Neuer Task pdf_signaturen: liest alle Signaturen einer PDF (poppler pdfsig) als Array in Signier-Reihenfolge (sortiert nach Signierzeit). Je Eintrag: nr, unterzeichner (CN), dn, email, signiert_am/_iso, zeitstempel, feld, hash, abdeckung_gesamt, gueltig, zertifikat_status. Ausgabe {{signaturen}} (+ _json fuer loop_foreach, _anzahl, _letzter, _letzter_am).
  • Neuer Task pdf_signatur_integritaet: prueft, ob NACH der letzten Signatur noch veraendert wurde (deckt die zeitlich letzte Signatur das ganze Dokument bis zum Dateiende?). Ausgabe {{integritaet_unveraendert}}/{{integritaet_veraendert}} (bool), _signiert, _letzter_unterzeichner, _letzter_am, _nachtraeglich_bytes, _meldung. Verzweigung per if auf {{integritaet_veraendert}}.
  • Gemeinsamer Parser (public static in TaskPdfSignaturen) fuer beide Tasks. In den Editor eingepflegt (Palette PDF, Schema + Hilfe-Doku tasks/pdf_signaturen.md + tasks/pdf_signatur_integritaet.md).
  • Verifiziert: 1-Sig unveraendert; 2-Sig korrekt in Reihenfolge (erste partial, letzte gesamt); +5 Byte angehaengt -> als 'VERAENDERT +5B' erkannt.

2026-07-04 (Fix: PDF-Siegel/TSA-Signatur war in Acrobat ungueltig)

  • Ursache: SAPP misst die Signaturlaenge mit einem TSA-Abruf und signiert dann mit einem zweiten; RFC-3161-Zeitstempel variieren um wenige Bytes, wodurch die reservierte /Contents-Laenge nicht zur echten Signatur passte. Folge: ByteRange um wenige Bytes verrechnet -> Acrobat 'SigDict /Contents illegal data' bzw. 'Digest Mismatch', Zeitstempel nicht erkannt. Trat intermittierend auf.
  • Fix in vendor/ddn/sapp/PDFDoc.php: Reserve-Marge auf __SIGNATURE_MAX_LENGTH + /Contents wird auf die reservierte Laenge aufgefuellt (Trailing-Nullen liegen ausserhalb der ByteRange). 8/8 Wiederholungslaeufe jetzt gueltig (poppler: Signature is Valid / Total document signed).
  • pdfsign_tsa() prueft nach dem Schreiben zusaetzlich die ByteRange-Konsistenz und wirft bei Abweichung eine Exception (keine still-kaputten Siegel).
  • Hinweis: 'Identitaet nicht bestaetigt' bleibt normal (VLN-eigene CA, nicht in Acrobats Vertrauensliste); erst Import der VLN-Stamm-CA macht es voll gruen.

2026-07-04 (PDF siegeln mit Zeitstempel + Grund)

  • Neuer Task pdf_siegel: siegelt eine PDF mit dem VLN-Org-Zertifikat (autosign.p12) als PAdES-T inkl. DigiCert-Zeitstempel (LTV) und optionalem Signatur-Grund (reason). In Acrobat sind Grund und Zeitstempel in den Unterschrifteneigenschaften sichtbar; langzeit-validierbar.
  • Basis: neue Funktion pdfsign_tsa() in require-sign.php (SAPP set_tsa + set_metadata_props). Nur dieser Weg erzeugt einen echten RFC-3161-Zeitstempel; die tsa-Option des alten pdf_sign (TCPDF) ist wirkungslos.
  • Config: file (Default {{latest_pdf_path}}), reason, name, ort, tsa (leer=kein Zeitstempel), output, output_var. In den Editor eingepflegt (Palette PDF, Feld reason konfigurierbar).
  • Rechtlich = AES (Org-Soft-Zertifikat, keine QES). Server-seitig verifiziert: /Reason gesetzt, timeStampToken eingebettet.

2026-07-04 (Externe Gegenzeichnung ohne Login)

  • Externe Dritte (kein VLN-Login) koennen jetzt einen Workflow-Schritt bearbeiten. Neu: Tabelle WORKFLOW_EXTERN (Einmal-Token je Schritt+Mail, auditierbar), extern.php (login-loser Renderer eines einzelnen Schrittes + PDF-Stream, Vorbild 0_bauakte/extern.php), extern-lib.php.
  • Neuer Task pdf_sign_extern: mailt der externen Person einen extern.php-Link; sie signiert per Zeichnen (Signaturseite wird angehaengt) ODER laedt eine unterschriebene PDF hoch. Engine: no_notify-Flag unterdrueckt die Standard-Assign-Mail (Task mailt selbst), WORKFLOW_ACCESS_TOKEN im Context.
  • Workflow dokument-gegenzeichnen: Ersteller gibt Name/Mail/Freitext + PDF -> Person erhaelt Mail 'Bitte Dokument gegenzeichnen' mit Link -> signiert login-los -> Ersteller bekommt Mail 'Dokument wurde unterzeichnet' mit signierter PDF im Anhang.
  • End-to-end verifiziert (Agentmail): Invite-Mail korrekt, login-loser Zugang, Signatur -> 2-seitige PDF, Einmal-Token verbraucht.
  • Hinweis: gezeichnete/hochgeladene Unterschrift = EINFACHE E-Signatur (keine QES).

2026-07-04 (pdf_split_interactive: visuelle Seiten-Vorschau)

  • pdf_split_interactive: neuer Button 'Visuell ansehen' zeigt einen waagerechten Streifen der Seiten-Vorschauen; zwischen zwei Seiten eine Schere -> Klick setzt/entfernt einen Schnitt, die Teile werden automatisch berechnet. Manuelle Seiteneingabe bleibt Default.
  • Neuer Endpoint pdf-thumb.php: rendert eine Seite server-seitig per pdftoppm (token-gesichert, gecacht). Vorschauen werden lazy geladen (nur sichtbare Seiten) -> auch 400-MB/1366-Seiten-PDFs laufen fluessig, die grosse Datei wird nie in den Browser geladen. Seitenzahl jetzt via pdfinfo (schnell).
  • Verifiziert an der 424-MB-Datei (Bauakte 2027): Seite in ~0.4s als 20-KB-JPEG, Streifen + Schere + Teileberechnung funktionieren.

2026-07-04 (Editor: Starten-Button)

  • Fix: Starten-Button im Editor startet jetzt den aktuell geoeffneten Workflow (start.php?xml= in neuem Tab) statt nur die leere Startseite. Ohne offene Datei erscheint ein Hinweis.

2026-07-04 (pdf_merge_interactive)

  • pdf_merge_interactive (neu, generisch): fuehrt mehrere PDFs zu einer zusammen. Eingabe = Array von Pfaden (files, z.B. {{teile}}); der Bearbeiter ordnet per Drag and Drop und waehlt ab/an; Merge per pdftk (Fallback pdfunite). Gegenstueck zu pdf_split_interactive. Setzt latest_pdf_path. End-to-end verifiziert (3+2 -> 5 Seiten).

2026-07-04 (Palette-Suche + PDF-in-Bauakte-aufteilen)

  • Editor: Suchfeld im Tab Bausteine filtert die Palette live (Name/Typ); leere Gruppen werden ausgeblendet.
  • pdf_split_interactive (neu, generisch): teilt eine beliebige PDF interaktiv in Teile (Name + Seitenbereich, pdftk). Ergebnis-Array fuer loop_foreach.
  • bauakte_datei_waehlen (neu, Bauakte-spezifisch): waehlt eine Datei aus dem Bauakte-Ordnerbaum; liefert lokalen Pfad + Quell-Ordner (folder_md5).
  • bauakte_ablage: neuer Parameter folder_md5 (schreibt in exakt diesen Ordner; Vorrang vor ordner).
  • Workflow bauakte-pdf-aufteilen: Bauakte waehlen, PDF waehlen, interaktiv aufteilen, Teile per loop_foreach in den Quell-Ordner zurueckschreiben. End-to-end verifiziert (49-Seiten-PDF, 2 Teile).

2026-07-04 (Editor: einklappbare Leiste + XML-Kommentare)

  • Rechte Leiste (Baum/Diagramm/Fehler/Referenz) einklappbar per Chevron-Button; eingeklappt = schmaler Streifen (Center gewinnt Platz), Zustand in localStorage gemerkt.
  • XML-Kommentare: innerhalb des Workflows werden im visuellen Editor als dezente Zeile (kursiv, Sprechblasen-Icon) ueber der jeweiligen Stelle angezeigt. Kommentare ueberleben Speichern (DOMParser + XMLSerializer erhalten sie).

2026-07-04 (Task-Rename + Editor-Hilfe)

  • Task umverteilen -> sortieren umbenannt (Klasse TaskSortieren + Alias TaskUmverteilen fuer Altbestand; Palette/Schema/Doku/Workflow-XML angepasst).
  • Editor-Hilfe: zentraler Hilfe-Button oben rechts (neben Dashboard) oeffnet ein Modal mit suchbarer, gruppierter Baustein-Liste + ausfuehrlicher Doku; zusaetzlich ein '?'-Icon auf jeder Task-Karte fuer direkte Baustein-Hilfe. Doku = tasks/*.md (jetzt auch auf dem Server) via neuen editor-api.php?action=taskdoc, gerendert mit marked.js.
  • Fix: 'Speichern'-Button wurde beim Hovern weiss (weiss auf weiss) -> Hover-Hintergrund wieder gruen.
  • Editor-Layout: linke Spalte hat jetzt zwei Reiter Workflows und Bausteine. Beim Öffnen/Neuerstellen eines Workflows schaltet sie automatisch auf Bausteine — die Drag-Drop-Palette füllt die ganze linke Spalte statt des gequetschten Kästchens im Mittelbereich. Reiter Workflows jederzeit für die Datei-Liste. Drag-Drop unverändert (Sortable-Gruppe wf-tasks).
  • Alle Tasks haben jetzt eine Doku unter tasks/*.md (18 ergänzt).

2026-07-04 (Bauakte-Tasks + Genehmigungs-Workflow)

  • KI-Tasks verifiziert: ki_pruefung + recht_frage jetzt funktional getestet (echte KI-/RAG-Antworten).
  • Bauakte-Tasks (5): bauakte_ablage (Datei in Bauakte, Ordner-Kurzcodes z.B. G/BG), bauakte_pick (Ziel waehlen), bauakte_neu (anlegen, Massnahme Pflicht), bauakte_benachrichtigung (Verteiler mailen), bauakte_toeb (raeumlich zustaendige ToeB zu einer Geometrie). Neue Palette-Gruppe 'Bauakte'.
  • Demo-Workflow bauakt-genehmigung: bauakte_pick -> html_form (schreiben) -> pdf_from_template -> approve_reject -> if approved: bauakte_ablage (G/BG) + bauakte_benachrichtigung. End-to-end verifiziert (Ablehnungs-Pfad; Ablage separat unit-getestet).
  • Offen: bauakte_inbox_freigabe (erst ajax.php inbox_approve in wiederverwendbare Funktion refactoren).

2026-07-04 (10 neue Tasks + PDF-Protokoll)

  • Rechen-Tasks: geo_laenge, geo_puffer (ST_Buffer, z.B. Gewaesserrandstreifen), geo_abstand, geo_zentroid, geo_pruefung (topolog. Boolean fuer type=if: enthaelt/schneidet/innerhalb/...).
  • Interaktiv: geo_messen (Strecke/Flaeche live), geo_grenze_verschieben (Modify + Vorher/Nachher-ha), geo_import (Upload Shape-zip/GPKG/GML/KML/DXF/DGN/GeoJSON -> ogr2ogr -> GeoJSON 25833). geo-editor.js: 5 Modi.
  • KI: ki_pruefung (zentrale KI-Kette), recht_frage (Vektor-RAG FlurbG/AVLNO).
  • PDF-Protokoll: pdf_from_template ist der einheitliche Mustache->PDF-Task (Arrays {{#gesamt}} ok). Freiwilliger-Landtausch endet jetzt mit PDF-Protokoll (template/landtausch-protokoll.mustache: Einlage je Teilnehmer + Umverteilung Vorher/Nachher) + Download-Seite. End-to-end verifiziert.

2026-07-04 (geo_gemarkung UX)

  • geo_gemarkung: zweiter Waehlweg parallel zum Namen — beim Reinzoomen (Ausschnitt < 30 km) werden Gemarkungsgrenzen des aktuellen Kartenausschnitts als anklickbare graue Layer geladen; Klick waehlt die Gemarkung. gemarkung-geom.php liefert ohne Parameter s jetzt die ganze FeatureCollection im bbox.
  • Hintergrund-Umschalter: Namen stehen jetzt in einer Zeile mit dem Radio (Bootstrap-.row-Konflikt behoben).

2026-07-04 (Gemarkung ohne Polygon)

  • geo_gemarkung (neuer Task): Gemarkung(en) aus ganz Sachsen (5340) per Suchfeld/Datalist waehlen statt Bereich einzuzeichnen; gewaehlte Gemarkung wird auf der Karte rot hervorgehoben (Highlight via /gemarkung-geom.php on-demand). Output gem_schluessel/gem_namen/gem_geojson/gem_bbox/gem_anzahl. Daten: data/gemarkungen_sn.json, ausgeliefert ueber gemarkung-list.php (PHP-FPM blockt direkte .json).
  • geo_selektieren: neue Optionen filter_attribut/filter_werte (Komma-Liste) begrenzen die angezeigten Objekte serverseitig, z.B. gemaschl={{gem_schluessel}} (nur Flurstuecke der gewaehlten Gemarkung).
  • Workflow freiwilliger-landtausch: Schritt 2 nutzt jetzt geo_gemarkung + gemaschl-Filter statt Polygon-Zeichnen (geo_erfassen->geo_wfs->geo_selektieren entfaellt). End-to-end verifiziert (Gohrisch: 721 Flurstuecke).
  • geo-editor.js: dritter Modus 'gemarkung'. Editor-Schema + Palette ergaenzt.

2026-07-04 (Umverteilen-UX)

  • umverteilen überarbeitet: ganze Teilnehmer-Spalte ist Ablagezone (irgendwo loslassen → unten angehängt; an Position → dort einsortiert), größere Felder, Greif-Icon, „hierher ziehen"-Platzhalter, Ziel-Spalte-Hervorhebung beim Ziehen, Delta-Anzeige (+/ ha). emptyInsertThreshold für leichteres Treffen.

2026-07-04 (Flurstuecksnummer)

  • geo_selektieren <flurnummer_aus>: berechnetes Feld flurnummer aus Zaehler/Nenner (lesbare Flurstuecksnummer 5 / 3/109 / 7 a statt Roh-Kennzeichen). In freiwilliger-landtausch fuer die Flurstueck-Anzeige aktiviert.

2026-07-04 (Umbenennung)

  • Task geo_tauschumverteilen umbenannt (generischer Drag-&-Drop-Verteil-Task, nicht geodaten-spezifisch). Editor-Palette: von „Geo-Operationen" nach „Benutzer". Workflow freiwilliger-landtausch angepasst.

2026-07-04 (Umverteilung)

  • Neuer Task geo_tausch: Drag-&-Drop-Board zur Umverteilung von Elementen zwischen Gruppen (Teilnehmern); je Gruppe Vorher-/Nachher-Flaeche (ha), Nachher dynamisch. In freiwilliger-landtausch als Schritt 4 ergaenzt. End-to-end verifiziert.

2026-07-04 (Landtausch + Signatur-Erweiterungen)

  • geo_selektieren: Live-Tabelle (<tabelle>), Flaechen-Summe (<flaeche_attribut> m²→ha), Akkumulation ueber Schleifen (<sammeln_var>/<sammeln_label>), _bbox/_summe_ha. geo_erfassen: _bbox-Output. Statisches geo-editor.js jetzt cache-gebustet.
  • Neuer Workflow freiwilliger-landtausch: Teilnehmerzahl → je Teilnehmer Suchbereich/Gemarkung/Flurstuecke waehlen (ALKIS-WFS) mit dynamischer ha-Tabelle → Uebersicht je Teilnehmer mit Gesamtflaeche. End-to-end verifiziert.

2026-07-04 (Karten-Erfassung/Selektion)

  • Neue Tasks geo_erfassen (Punkte/Linien/Polygone auf der Karte zeichnen; Typ + Anzahl steuerbar) und geo_selektieren (dargestellte Objekte per Klick auswaehlen; liefert Features + ID-Liste). Gemeinsamer OpenLayers-Editor /geo-editor.js. End-to-end verifiziert.

2026-07-04 (Export)

  • Neuer Task geo_export + Endpoint geo-download.php: Download der Geodaten in GeoPackage/Shapefile/DXF/DGN/GML/KML/CSV/GeoJSON/FlatGeobuf (ogr2ogr, EPSG:25833; KML→WGS84). Formate beim Task-Erstellen steuerbar; ein Format = kein Auswahldialog. DWG-Hinweis: DXF (native DWG nur mit ODA-Konverter). In gewaesser-im-verfahren als Download-Schritt ergaenzt.

2026-07-04 (Signaturen)

  • geo_visualisieren + Viewer: Erweiterte Signaturen. Neuer Layer-typ="maske" (EQK-Inverse-Aufhellung: Flaeche ausserhalb des Polygons gedimmt, Rand=Umring). Attributgesteuerter <stil>-JSON: breite_nach (numerisch/kategorie), farbe_nach (kategorie/abstufung), label, punkt/icon; plus strich/deckkraft/z. turf.js im Viewer.

2026-07-04 (Geo: WFS 1.1.0 + Beispiel-Workflow)

  • geo_wfs: Param <version> — unterstuetzt jetzt auch WFS 1.1.0 (ArcGIS/Landesdienste, GML 3.1.1), inkl. LfULG-Gewaessernetz. geo_lade gibt zusaetzlich _bbox aus.
  • Neuer Workflow gewaesser-im-verfahren: Verfahren waehlen → Umring laden → Fliessgewaesser-WFS → Verschneidung → Karte, die nur die Gewaesser im Verfahrensgebiet zeigt.

2026-07-04 (MCP OAuth)

  • Neu: OAuth-2.1-Bruecke fuer den Workflow-MCP (claude.ai & Co.). Discovery + Dynamic Client Registration + authorize/token am Domain-Root; Login mit MCP-Key, Token traegt dessen Scopes. Dual-Auth (statischer Key ODER OAuth). Siehe mcp/README.md.

2026-07-04 (Geo-Reihe komplett)

  • Neu (Tasks): geo_lade (Kartenobjekte in Kontext), geo_verschneidung (intersection/union/difference/symdifference, optional als Kartenobjekt speichern), geo_wfs (WFS-GetFeature mit GML-3.2-Fallback fuer ALKIS & Co.), geo_visualisieren (OpenLayers-Karten-Viewer mit Basemap.de/Luftbild-DOP/DTK/OSM + schaltbaren Layern, oeffentlicher Link karte.php?id=...). Editor-Palette-Gruppe Geo-Operationen erweitert. End-to-end getestet: ALKIS-WFS -> Verschneidung (56 ha) -> Karten-Link.

2026-07-04 (MCP)

  • Neu: Workflow-MCP-Server unter /mcp (JSON-RPC). Gescopte API-Keys (read/author/interact) via Admin-Konsole im Dashboard. 10 Tools zum Erstellen/Bearbeiten/Starten von Workflows und Interagieren mit Instanzen. Siehe mcp/README.md.

2026-07-04 (Editor)

  • Neu (Visueller Editor): Persistente Baustein-Palette links neben dem Baum. Tasks werden per Drag-and-Drop aus der Palette in die Container (Sequenz/Parallel/then-else/Wurzel) gezogen. Ersetzt das bisherige, schwer auffindbare "+"-Einfügen (nur am Container-Ende). Touch-tauglich (SortableJS forceFallback) für Tablet-Nutzung. Umsortieren bestehender Karten unverändert.

2026-07-02

  • Fix (Engine): stop-Task setzte den Gesamtstatus nicht auf CANCELLED. Der Persist-Block in require-workflow.php behandelte nur success/error/return/waiting — bei stop fiel der Status auf den Default RUNNING zurück und der Bearbeiter blieb zugewiesen. Folge: abgelehnte Workflows (z. B. Dienstreise nach Vorsitz-Ablehnung) blieben als offene Aufgabe hängen, cron-resume triggerte sie endlos, und der Bearbeiten-Link führte nur zur Sackgasse "Vorgang abgebrochen". Behoben: eigener stop-Zweig → CANCELLED + current_assignee = NULL. Wirkt für alle stop-Quellen (approve_reject-Ablehnung, quorum, TaskStop). Verhalten entspricht jetzt der bereits korrekten Doku (README "Lebenszyklus und Status", tasks/stop.md).

2026-07-04

  • Neu (Task): geo_flaeche — Muster-Task der Geo-Reihe. Fläche von Polygon-Kartenobjekten (EPSG:25833) in m²/ha, per Inline-GeoJSON oder Layer+VKZ aus KARTE_OBJEKT. Rechen-Engine MariaDB ST_Area (SRID-0-planar). Siehe tasks/geo_flaeche.md. Editor-Schema + Palette-Gruppe 'Geo-Operationen' ergänzt.