Modul zur Kostenberechnung für das Nachhaltigkeitsmonitoring der Stadt Zürich (NHMzh). Es ermöglicht das Anwenden von Kostenkennwerten (z.B. aus Excel) auf BIM-Daten.
Das Cost-Plugin ist eine Webanwendung mit einem React/TypeScript-Frontend (Vite) und einem Node.js/Express-Backend.
- Frontend: Eine in React/TypeScript entwickelte Oberfläche, die über Vite ausgeliefert wird. Benutzer verwalten Kostenkennwerte pro Projekt (z.B. durch Excel-Upload) und sehen die berechneten Kosten pro Bauteil.
- Backend: Ein Express-Server in
backend/, implementiert in TypeScript. Er stellt die REST-API für alle Operationen bereit und kommuniziert mit Kafka, um freigegebene Kostendaten an nachgelagerte Systeme zu senden.
Datenfluss:
- Datenabruf: Das Cost-Backend liest die erforderlichen Bauteildaten (Mengen, eBKP-Codes) direkt aus der
qto-Datenbank des QTO-Plugins ab. - Kostenkennwerte: Der Benutzer lädt über das Frontend Kostenkennwerte (CHF/Einheit) pro eBKP-Code, die im Backend verarbeitet werden.
- Kostenberechnung: Das Backend verknüpft die Bauteile aus der
qto-Datenbank mit den passenden Kostenkennwerten und berechnet die Gesamtkosten pro Bauteil. - Datenspeicherung: Die Ergebnisse werden in einer dedizierten
cost-MongoDB-Datenbank gespeichert, primär in dercostElements-Sammlung. - Visualisierung: Das Frontend ruft die berechneten Kosten vom Backend ab und stellt sie dar.
- Direkte QTO-Integration: Liest Mengen- und Bauteildaten direkt aus der QTO-Datenbank.
- Kostenkennwert-Import: Ermöglicht den Upload von eBKP-basierten Kostenkennwerten aus Excel-Dateien.
- Automatische Kostenberechnung: Verknüpft Bauteile mit Kostenkennwerten basierend auf eBKP-Codes und berechnet die Gesamtkosten.
- Hierarchische Kostendarstellung: Gruppiert Kosten nach der eBKP-Struktur.
- REST API: Bietet strukturierte HTTP-Endpunkte für alle Operationen.
- Sicherheitsfeatures: Rate Limiting, Input-Validierung und Timeout-Handling.
Die berechneten Kosten werden in der cost-Datenbank gespeichert. Die wichtigste Sammlung ist costElements, die eine Kombination aus den QTO-Daten und den angereicherten Kostendaten darstellt.
cost.costElements Beispiel-Dokument:
{
"_id": "ObjectId",
"qto_element_id": "ObjectId", // Referenz zum Original-Element in qto.elements
"project_id": "ObjectId",
"global_id": "3DqaUydM99ehywE4_2hm1u",
"ifc_class": "IfcWall",
"name": "Aussenwand_470mm",
"quantity": {
"value": 125.5,
"type": "area",
"unit": "m²"
},
"classification": {
"id": "C2.01",
"system": "eBKP"
},
// --- Angereicherte Kostendaten ---
"unit_cost": 450.0,
"total_cost": 56475.0,
"currency": "CHF",
"created_at": "ISODate"
}Das Backend stellt folgende REST API-Endpunkte bereit:
- GET
/health- Health Check - GET
/projects- Liste aller Projekte - GET
/project-elements/:projectName- Alle Elemente eines Projekts - GET
/available-ebkp-codes- Verfügbare eBKP-Codes - GET
/get-kennwerte/:projectName- Kostenkennwerte eines Projekts - POST
/save-kennwerte- Kostenkennwerte speichern - POST
/reapply-costs- Kostenberechnung neu anstossen - POST
/confirm-costs- Berechnete Kosten bestätigen und an Kafka senden
Alle Endpunkte verfügen über:
- Rate Limiting (100 Anfragen/15 Min, 20 für Schreiboperationen)
- Input-Validierung
- Fehlerbehandlung
- 30 Sekunden Timeout
Die Installation und Ausführung erfolgt im Rahmen der gesamten NHMzh-Umgebung via Docker Compose. Für die lokale Entwicklung:
Frontend (Vite + React/TypeScript):
# In das Plugin-Verzeichnis wechseln
cd plugin-cost
# Abhängigkeiten installieren
npm install
# Entwicklungsserver starten
npm run devBackend (Express + TypeScript):
cd plugin-cost/backend
# Abhängigkeiten installieren
npm install
# Backend-Server starten
npm run devDas Frontend läuft standardmässig unter http://localhost:5173, das Backend unter dem Port, der in backend/config.ts konfiguriert ist (Standard: 8004).
Dieses Projekt wurde durch die Stadt Zürich finanziert. Der gesamte in diesem Repository enthaltene Quellcode stammt von Louis Trümpler (LTplus AG).
Dieses Projekt ist unter der GNU Affero General Public License v3.0 (AGPL-3.0) lizenziert.