Native GTK4/libadwaita-App für Leistungsverzeichnisse mit vollem GAEB-DA-XML-Zyklus (X81–X89)
  • Python 99%
  • Meson 0.6%
  • Shell 0.4%
Find a file
Tobias Ehn 04e78a2c02 Doku-Nachzug Angebots-Schicht
README: X84/X86-Status praezisiert (manuelle Erfassung + Beauftragung in
der App vs. Datei-Import spaeter), Prozessphasen-Absatz um die
Angebots-Schicht ergaenzt. ARCHITECTURE: Platzhalter-Behauptung
korrigiert (nur Abrechnung ist noch Platzhalter), Snapshot-Stufe 4,
Freeze-Ausnahme Angebots-Ops, neuer Abschnitt Angebots-Schicht
2026-07-22 18:24:05 +02:00
build-aux/flatpak UI-Ausbau: Textergänzungen, Rechtschreibprüfung, Sidebar, DnD-Regeln, App-Icon 2026-07-19 14:18:52 +02:00
data Doku-Abgleich nach dem GAEB-Export 2026-07-20 16:42:28 +02:00
gaebuilder Angebots-Schicht: manuelle Erfassung und Beauftragung ohne GAEB-Import 2026-07-22 18:21:49 +02:00
po GAEB-Export X81/X82/X83 in DA XML 3.2 und 3.3 2026-07-20 16:35:55 +02:00
tests Angebots-Schicht: manuelle Erfassung und Beauftragung ohne GAEB-Import 2026-07-22 18:21:49 +02:00
tools GAEB-Export X81/X82/X83 in DA XML 3.2 und 3.3 2026-07-20 16:35:55 +02:00
.gitignore GAEB-Export X81/X82/X83 in DA XML 3.2 und 3.3 2026-07-20 16:35:55 +02:00
ARCHITECTURE.md Doku-Nachzug Angebots-Schicht 2026-07-22 18:24:05 +02:00
COPYING Grundgerüst: GTK4/libadwaita-App mit operations-basierter Dokumentschicht 2026-07-17 18:04:53 +02:00
meson.build Grundgerüst: GTK4/libadwaita-App mit operations-basierter Dokumentschicht 2026-07-17 18:04:53 +02:00
README.md Doku-Nachzug Angebots-Schicht 2026-07-22 18:24:05 +02:00

GAEBuilder

Native Linux-App (GTK4 / libadwaita) zum Erstellen und Bearbeiten von Leistungsverzeichnissen — mit vollem GAEB-DA-XML-Zyklus (X81X89).

Es gibt keine native AVA-Software für Linux. GAEBuilder soll diese Lücke schließen: Ausschreibungen erstellen, Angebote einlesen, auswerten — als saubere GNOME-HIG-Anwendung.

Ziele

  • LV-Editor: Gliederung (Lose/Titel/Positionen), Kurz- und Langtexte
  • GAEB-Kompatibilität: DA XML 3.x lesen/schreiben, tolerant lesen, streng schreiben; Roundtrip mit gängigen AVA-Programmen (ORCA, California, iTWO)
  • PDF-Export: Kurz-/Langtext, Blanko-LV und bepreistes LV
  • Kalkulation: Einheitspreise, Zuschläge, später EFB-Preisblätter (221/223)

GAEB-Phasen (Zielbild)

Phase Inhalt Status
X81 Leistungsverzeichnis Import · Export
X82 Kostenschätzung/-anschlag Kostenermittlung in der App · Export
X83 Angebotsaufforderung Export
X84 Angebotsabgabe Import: Phase 2 · Angebote manuell erfassen
X85 Nebenangebot später
X86 Zuschlag/Auftrag Datei: später · Beauftragung in der App
X88 Nachtrag später (Datenmodell vorbereitet)
X89 Rechnung später

In der App ist der Zyklus bereits als Prozessphasen-Tabs in der LV-Kopfleiste angelegt — Leistungsverzeichnis (X81X83) · Angebotsprüfung (X84X85) · Auftrag (X86X88) · Abrechnung (X89). Je LV steuert die Prozessphase die Bearbeitbarkeit: ab „Angebotsprüfung" ist das LV schreibgeschützt (zurücksetzen macht es wieder bearbeitbar), in „Auftrag" sind nur Nachtragspositionen erlaubt. Die Angebots-Schicht ist davon ausgenommen: Angebote werden im Angebotsprüfungs-Tab manuell erfasst (Bieter + Preise, auch ganz ohne GAEB-Datei) und bleiben jederzeit editierbar; der Zuschlag im selben Tab macht ein Angebot zum Auftrag — die Beauftragung entsteht also auch ohne X84-Import direkt auf Basis des LVs (Direktvergabe). Details: ARCHITECTURE.md.

MVP-Schnitt

Getrieben von einem realen Anwendungsfall (eigene Ausschreibung Ende 2026):

  1. Phase 1 — Ausschreibung erstellen
    • LV anlegen/editieren (Langtext mit GAEB-konformer Basis-Formatierung)
    • Export X81/X83
    • PDF-Export Blanko-LV
    • Früher Meilenstein: Roundtrip-Test „X83 öffnet fehlerfrei in ORCA/California"
  2. Phase 2 — Angebote auswerten
    • X84-Import + einfacher Preisspiegel

Geplanter Stack

  • UI: Python + PyGObject, GTK4 + libadwaita (GNOME HIG)
  • GAEB-Datenschicht: Import über pyGAEB (MIT) — Parser für DA XML 2.03.3, alle Phasen. Der Export läuft über einen eigenen Writer (core/gaeb_export.py); pyGAEBs GAEBWriter schreibt keine normgerechte Struktur (Details in ARCHITECTURE.md)
  • PDF: WeasyPrint oder Typst als Render-Backend
  • Distribution: Flatpak / Flathub

Zusammenarbeit (Zielbild)

Local-first-Kollaboration nach dem Vorbild von Reflection (GNOME): LV als CRDT-Dokument, Peer-to-Peer-Sync via p2panda — ohne Server, offline-fähig. Die Dokumentschicht ist dafür schon operations-basiert geschnitten, Details in ARCHITECTURE.md.

Entwicklung

# Direkt aus dem Repo starten (braucht PyGObject + GTK4 + libadwaita;
# auf Bluefin/Silverblue: System-Python nutzen, nicht das Homebrew-Python)
/usr/bin/python3 -m gaebuilder

# GAEB-Datenschicht (Import) — einmalig; ohne pyGAEB startet die App,
# meldet beim Datei-Öffnen aber einen Fehler und die Import-Tests skippen
/usr/bin/python3 -m pip install --user pygaeb

# Flatpak bauen und installieren
flatpak-builder --user --install --force-clean flatpak-build \
  build-aux/flatpak/org.gaebuilder.GAEBuilder.yaml

# GAEB-Schemata für die Export-Tests — einmalig. OHNE diesen Schritt
# überspringen die XSD-Tests still, die Suite meldet trotzdem OK:
# die Normprüfung des Exports läuft dann gar nicht.
# (Die Schemata liegen nicht im Repo — Herunterladen ist frei, die
# Weiterverbreitungsrechte sind ungeklärt.)
./tools/fetch-gaeb-xsd.sh

# Tests (Modell-/Snapshot-Roundtrips, Summenregel, Projektbibliothek inkl.
# FTS5-Suche, GAEB-Import gegen tests/daten/-Fixture, GAEB-Export gegen die
# offiziellen XSDs + Roundtrip + pyGAEB als Fremdparser, GUI-Smoke für Editor,
# Projektverwaltung, Positions-Grid und Export; letztere brauchen ein Display)
/usr/bin/python3 -m unittest discover -s tests

Projektstruktur:

gaebuilder/          Python-Paket (UI: main.py, window.py, projekt_page.py, positions_grid.py, detail_pane.py, richtext_editor.py, tabellen_widget.py, export_dialog.py, formatierung.py)
gaebuilder/core/     GTK-freie Kernschicht (Modell, Dokument-Operationen, Kostenermittlung/Summen, Snapshot-Serialisierung, Projektbibliothek/SQLite, GAEB-Import und -Export)
tests/               Unit- und GUI-Smoke-Tests (unittest); daten/ = GAEB-Fixtures, schemas/ = offizielle XSDs (nicht im Repo)
tools/               Entwickler-Skripte (fetch-gaeb-xsd.sh — GAEB-Schemata laden)
data/                Desktop-Datei, Metainfo, GSchema, Icons
po/                  Übersetzungen (Quellsprache Deutsch)
build-aux/flatpak/   Flatpak-Manifest

Lizenz

GPL-3.0-or-later — GAEBuilder ist und bleibt freie Software; alle Abhängigkeiten (pyGAEB, GTK4, libadwaita, …) sind GPL-kompatibel lizenziert (MIT/BSD/Apache/LGPL).

Status

🏗️ Grundgerüst steht: libadwaita-Fenster mit gegliedertem Positions-Grid als Hauptansicht (OZ, Kurztext, Menge, Einheit, EP, GP; Zwischensummen je Titel/Untertitel, LV-Gesamtsumme in der Fußleiste, Menge und EP direkt in der Zeile tippbar — X82-Kostenermittlung) und Positions-Editor als ein-/ausklappbarem Flyin von rechts, Rich-Text-Langtext (fett/kursiv/unterstrichen, Listen, Tabellen inkl. rahmenlos — GAEB border="0" frame="void" —, Rechtschreibprüfung via libspelling, Textergänzungen TA/TB — GAEB TextComplement — mit Bieterlücken als geschützte Bereiche), Verschieben per Drag & Drop mit automatischer OZ-Neunummerierung, operations-basierte Dokumentschicht, GAEB-Import (X81 und alle DA-XML-Phasen über pyGAEB, an echter Fremd-X81 verifiziert), Projektverwaltung mit persistenter Projektbibliothek (ein Projekt = Bauvorhaben mit mehreren LVs, z.B. Los 13; SQLite im XDG-Data-Dir, Autosave, projektübergreifende Suche über Projekt- und LV-Titel sowie alle Positionen (FTS5) — ein Suchfeld, Treffer nach Ebene sortiert —, LV-Lebenszyklus aktiv/inaktiv/archiviert plus Umbenennen und Löschen je LV-Zeile — Archivierte liegen in einem aufklappbaren Archiv je Projekt und sind aus der Positionssuche gefiltert, über ihren Namen aber weiter auffindbar; Details in ARCHITECTURE.md), GAEB-Export X81/X82/X83 in DA XML 3.2 und 3.3 (eigener Writer, gegen die offiziellen XSDs validiert — X81/X83 blanko, X82 mit Einheitspreisen und Summen; erreichbar aus dem Hauptmenü und dem ⋮-Menü jeder LV-Zeile), Meson-Build, Flatpak-Manifest. PDF-Export folgt.