- Python 99%
- Meson 0.6%
- Shell 0.4%
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 |
||
|---|---|---|
| build-aux/flatpak | ||
| data | ||
| gaebuilder | ||
| po | ||
| tests | ||
| tools | ||
| .gitignore | ||
| ARCHITECTURE.md | ||
| COPYING | ||
| meson.build | ||
| README.md | ||
GAEBuilder
Native Linux-App (GTK4 / libadwaita) zum Erstellen und Bearbeiten von Leistungsverzeichnissen — mit vollem GAEB-DA-XML-Zyklus (X81–X89).
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 (X81–X83) · Angebotsprüfung
(X84–X85) · Auftrag (X86–X88) · 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):
- 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"
- 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.0–3.3, alle Phasen. Der Export läuft über einen
eigenen Writer (
core/gaeb_export.py); pyGAEBsGAEBWriterschreibt 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 1–3; 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.