Schwarmspeicher Electrify
🔋 Schwarmspeicher Electrify | Auf dieser Seite
|
Ăśberblick
Schwarmspeicher Electrify unterstützt den gesamten Projektlebenszyklus: Standortidentifikation, Akquise, Genehmigungen, Projektsteuerung und Dokumentation — für beide Use-Cases parallel, über einen Umschalter in der Seitenleiste.
- Frontend: React 18 · TypeScript · Vite · Tailwind CSS · shadcn/ui · React Router · React Query · Leaflet + leaflet.markercluster (Kartendarstellung) · Recharts (Diagramme) · XLSX (Excel-Import/-Export)
- Backend: Supabase (self-hosted) — PostgreSQL, Authentication, Storage, Edge Functions, Row Level Security (RLS)
- Datenquellen: Nominatim/OpenStreetMap (Geocoding, Straßenkarte) · basemap.at (Luftbild) · Edge Function fetch-noe-gemeinden (NÖ-Gemeindedaten) · EVN-Trafokarte (WMS-Layer, Netzkapazitäten, UW-Versorgungsgebiete) · Netz NÖ (Kapazitätsliste der Umspannwerke) · Tabelle trafo_stationen (Trafostationen, einmalig aus der EVN-Trafokarte übernommen, danach eigene Bearbeitung) · BEV-Kataster (Grundstücksgrenzen per WMS, Gst.Nr/Einlagezahl/KG-Nr per Vektorkacheln) · Land NÖ OGD (Windkraftzonen und Windkraftanlagen) · OpenStreetMap/Overpass (Positionen der Umspannwerke)
- Orchestrierung: eigener Docker-Compose-Stack, nginx als Reverse-Proxy (TLS-Terminierung + same-origin-Routing zu Supabase/Kong)
Architektur

Zusätzlich übernimmt nginx im Frontend-Container TLS-Terminierung und same-origin-Routing (/auth, /rest, /storage, /realtime, /functions → supabase-kong) — dadurch läuft die App ohne CORS- oder Private-Network-Access-Probleme im Browser
Technologie-Stack
Frontend: React 18 · TypeScript · Vite · Tailwind CSS · shadcn/ui · React Router · React Query · Leaflet + leaflet.markercluster (Kartendarstellung) · Recharts (Diagramme) · XLSX (Excel-Import/-Export)
Backend: Supabase (self-hosted) — PostgreSQL, Authentication, Storage, Edge Functions, Row Level Security (RLS)
Hauptfunktionen
1. Dashboard
Zentrale Ăśbersicht ĂĽber Projekte, Status, Kennzahlen und Projektfortschritt.
- Schwarmspeicher: Dashboard.tsx — Pipeline-Summary (Vorprojekte und Standorte in Akquise, darunter die Anzahl in Akquise), kW/kWh-KPIs, Plan-vs-Ist-Charts pro Meilenstein. Standorte in Akquise zählen in den Standort-Kennzahlen erst ab „Vollmacht erhalten“.
- PV-Co-Location: CoLocationDashboard.tsx — gleiche Struktur, Einheiten angepasst (kWp/kW), zweite Übersichtskarte zeigt Standortpartner-Anzahl statt Gemeinden
2. Projektverwaltung / Standortverwaltung
Standorte anlegen, bearbeiten, importieren, Historie, Dokumente, sortierbare Tabelle mit Meilenstein- und Akquisiteur-Filter, Bulk-Bearbeitung, Als-abgebrochen-markieren/Reaktivieren.
- Schwarmspeicher: ProjectTable, StandortDetail, CreateStandortFormNew, StandortImportDialog, StandortDokumente, AbbruchDialog, StandortAusscheiden, MeilensteinQuickEdit, MeilensteinMatrix, BulkEditStandortDialog, BatterieKandidaten
- PV-Co-Location: CoLocationProjectTable, CoLocationStandortDetail, CreateCoLocationForm, CoLocationImportDialog, CoLocationStandortDokumente, CoLocationAbbruchDialog, CoLocationMeilensteinQuickEdit, CoLocationMeilensteinMatrix, CoLocationBulkEditDialog
Unter „Projekte“ erscheinen Standorte, die über „Zur Akquise freigeben“ entstanden sind, erst ab dem Meilenstein „Vollmacht erhalten“; davor stehen sie in der Pipeline unter „In Akquise“. Die Seite hat die Tabs Standorte, Meilensteine und Standortpartner; die Buttons oben rechts richten sich nach dem Tab (Standorte: Import und Standort anlegen, Standortpartner: Neuer Standortpartner).
Im Standort-Dialog können alle Rollen einen Standort mit Begründung ausscheiden (die verknüpfte Trafostation wird mit ausgeschieden); Reaktivieren ist nur intern möglich. Das Feld „Betreuung“ wählt der Leiter bzw. seine Stellvertretung aus seinem Team. Die Batterie-Standorte werden als Rangliste (bis zu 4) mit Akzeptieren/Verwerfen und Eigentümerdaten geführt; Eigentümerdaten sind auch im Bearbeiten-Modus erfassbar. Hat ein Standort noch keine Rangliste, legt „Eigentümer erfassen“ den Batterie-Standort 1 aus der aktuellen Position an.
Import-Dialoge (beide Use-Cases) unterstützen: direkte Koordinatenspalten, DMS-Format, Koordinatenpaare im Adressfeld, Gemeinde-Auflösung per PLZ, mehrstufige strukturierte Geocoding-Anfragen (inkl. Konskriptionsnummern) mit Validierung gegen Gemeinde-Zentroide, sowie automatische Erkennung der Kopfzeile.
Meilensteinverwaltung
Projektfortschritt ĂĽber Meilensteine, matrixartige Ăśbersicht mit Bulk-Setzen, Gruppierung.
- Schwarmspeicher: MeilensteinMatrix, MeilensteinQuickEdit (inkl. Sonderfall-Dialog NetzvertragAnpassungDialog). Die Akquise-Meilensteine (Vollmacht gesendet/erhalten, Optionsvertrag gesendet/erhalten, Pachtvertrag unterschrieben) dĂĽrfen auch externe Akquisiteure setzen.
- PV-Co-Location: CoLocationMeilensteinMatrix, CoLocationMeilensteinQuickEdit — eigene Meilensteinkette: Vollmacht gestellt → Vollmacht erhalten → Netzantrag gestellt → Netzvertrag erhalten → Pachtvertrag unterschrieben → Standort gebaut → Standort live Trading (Kurzbeschriftungen: VM ges. / VM erh. / NA gest. / NV erh. / PV unt. / Gebaut / Trading)
3. Gemeinden
Verwaltung der Gemeinden (CreateGemeindeForm, nur Schwarmspeicher). Edge Function fetch-noe-gemeinden lädt NÖ-Gemeinden.
4. Kartenansicht
Interaktive Karte aller Standorte (Leaflet + Clustering), Adress- und Koordinatensuche, Vollbildmodus, Flächenauswahl (Shift+Ziehen), Zoom bis Stufe 21, Umschaltung Straßenkarte/Luftbild (basemap.at), Trafokarte-NÖ-Layer mit Legende.
- Schwarmspeicher: ProjectMap — Ebenen Trafokarte NÖ, Grundstücke (BEV-Kataster), Umspannwerke (Versorgungsgebiete mit Kapazität, Akquisiteur-Zuteilung je Gebiet, UW-Standorte als Dreiecke; mehrere UW am selben Ort als ein Dreieck mit Anzahl), Windkraft (Windkraftzonen und Windkraftanlagen des Landes NÖ). Klick auf eine Trafostation öffnet TrafoStationSheet mit „Zur Akquise freigeben“.
- PV-Co-Location: CoLocationMap
- Gemeinsam genutzt: LocationPickerMap (Einzelstandort-Kartenauswahl, Großbild über das ganze Fenster), KartenSuche (Adresse, Ort, PLZ oder Koordinaten), src/lib/mapCoordinates.ts (dedupeCoordinates — verhindert sofortiges Auftrennen bei identischen Koordinaten), src/lib/kartenZoom.ts, src/lib/koordinatenSuche.ts, src/lib/windkraft.ts
Die UW-Standorte werden aus OpenStreetMap (Overpass) importiert oder von Admins im Gebiets-MenĂĽ von Hand gesetzt (von Hand gesetzte Punkte ĂĽberschreibt der Import nicht). Umspannwerke der Netz-NĂ–-Liste ohne eigenes EVN-Gebiet (z. B. Windpark-Umspannwerke) werden unter dem SchlĂĽssel kap:<Name> gefĂĽhrt. Abweichende Schreibweisen zwischen Netz-NĂ–-Liste und EVN-Gebiet werden in der Tabelle uw_namen zugeordnet.
Zur Akquise freigeben: Im Dialog werden Name, Akquisiteur (vorbelegt aus dem UW-Gebiet) und bis zu 4 Batterie-Standorte nach Priorität festgelegt. Die Freigabe legt den Standort an (Netzbetreiber „Netz NÖ“), verknüpft die Trafostation und erstellt die Rangliste der Batterie-Standorte. Eine Trafostation kann nur einmal freigegeben werden.
5. Potenzialanalyse
Bewertung möglicher Standorte (PotenzialTabelle, PotenzialPage) — nur Schwarmspeicher, kein Pendant bei PV-Co-Location.
6. Pipeline
- Schwarmspeicher: zwei Reiter — Vorprojekte (VorprojektePipeline, VorprojektTimeline; Kennzahlen Vorprojekte, Pot. Standorte, Pot. BESS, Pot. kW, Pot. kWh; ohne Realisierungswahrscheinlichkeit und ohne Gewonnen/Verloren) und In Akquise (AkquisePipeline; zur Akquise freigegebene Standorte bis „Vollmacht erhalten“, Filter nach Akquisiteur, Kennzahlen, Spalten Gemeinde, Netzbetreiber, Trafo mit Koordinaten, Akquisiteur, Freigabedatum, letzter Meilenstein)
- PV-Co-Location: CoLocationPipeline (Felder an kWp/BESS-kW angepasst; kein Pendant zu VorprojektTimeline)
7. Stockend
Zeigt Standorte, bei denen die Lead-Time zwischen zwei Meilensteinen ĂĽberschritten ist, konfigurierbare Regeln.
- Schwarmspeicher: StuckPage
- PV-Co-Location: CoLocationStuckPage (eigene, getrennt gespeicherte Lead-Time-Regeln entlang der neuen Meilensteinkette)
8. Forecast
Monatliche Zielvorgaben, Plan-vs-Ist-Charts pro Kennzahl.
- Schwarmspeicher: ForecastPage (kW und kWh pro Monat/Meilenstein, nach Land AT/DE getrennt)
- PV-Co-Location: CoLocationForecastPage — 4 KPI-Charts entlang Netzantrag gestellt / Netzvertrag erhalten / Standort gebaut / Standort live Trading (kein Land-Split)
9. Aufgabenverwaltung
Projektbezogene Aufgaben, jeweils eigene, komplett getrennte Liste pro Use-Case.
- Schwarmspeicher: TaskManager, TasksPage, Hook useTasks()
- PV-Co-Location: CoTaskManager, CoLocationTasksPage, Hook useCoTasks()
10. Dokumentenverwaltung
Zu jedem Standort und jedem Standortpartner können Dokumente hochgeladen werden.
- Schwarmspeicher: StandortDokumente, PartnerDokumente, Hook useDokumente()
- PV-Co-Location: CoLocationStandortDokumente, CoLocationPartnerDokumente, Hook useCoDokumente() — eigener Storage-Bucket co-dokumente
11. Standortpartner
Verwaltung von Projektpartnern, eigene, komplett getrennte Partnerliste pro Use-Case.
- Schwarmspeicher: StandortpartnerTable (Tab „Standortpartner“ unter Projekte)
- PV-Co-Location: CoLocationStandortpartnerManager, CoLocationStandortpartnerTable
12. Benutzerverwaltung
Anmeldung, Passwortänderung, Rollen (admin/user/akquisiteur). Komponenten: AuthProvider, ProtectedRoute, BenutzerPage, LoginPage. Läuft über die Edge Function manage-users (Supabase Admin-API, prüft Admin-Rechte serverseitig). Nach Login wird immer auf "/" weitergeleitet, unabhängig von der zuvor besuchten URL; externe Akquisiteure auf "/meine-standorte".
Zusätzliche Rechte: „Akquise zuteilen“ (kann_akquise_zuteilen — Trafostationen freigeben und Akquisiteure zuteilen) und „sich selbst zuteilen“ (kann_sich_selbst_zuteilen — sich selbst als Akquisiteur eintragen). Bei externen Akquisiteuren werden in der Benutzerverwaltung der Leiter und optional die Stellvertretung festgelegt (siehe 16.).
13. Audit Log
Nachvollziehbarkeit von Änderungen (AuditLogPage), tabellenübergreifend über beide Use-Cases.
14. Akquisiteure
Performance-Übersicht der Akquisiteure (AkquisiteurePerformancePage, AkquisiteurVerlaufCharts) — nur Schwarmspeicher, nur intern. Erfolg ist der Meilenstein „Vollmacht erhalten“.
- Kennzahlen im wählbaren Zeitraum (30 / 90 Tage, 12 Monate, gesamt): aktive Akquisiteure, in Akquise, ohne Meilenstein seit über 30 Tagen, neu freigegeben, Vollmachten erhalten, Erfolgsquote
- Tabelle je Akquisiteur, sortierbar; zugeordnete Akquisiteure stehen unter ihrem Leiter
- Verlauf je Kalenderjahr fĂĽr Freigegeben, Vollmacht gesendet/erhalten und Optionsvertrag gesendet/erhalten, umschaltbar kumuliert/Monatswerte
15. Externe Akquisiteure und Teams
Externe Akquisiteure (Rolle akquisiteur) sehen nur „Meine Standorte“ (AkquisiteurPage, AkquisiteurStandortTabelle) mit ihren Standorten, Meilensteinen, Dokumenten, Batterie-Standorten und Tasks.
- Leiter: Akquisiteur, dem andere Akquisiteure zugeordnet sind. Seine Standorte bleiben ihm zugeteilt; im Feld „Betreuung“ gibt er sie an ein Teammitglied weiter und sieht sie weiterhin in der Tabelle „An Team übergeben“.
- Betreuer: bearbeitet den Standort mit denselben Rechten wie einen eigenen.
- Stellvertretung: ĂĽbernimmt die Rolle des Leiters, betreut automatisch alle seine Standorte und vergibt die Betreuung im Team.
Routing
| Pfad | Seite | Use-Case | Login nötig |
| / | Dashboard | Schwarmspeicher | ja |
| /projekte | Standorte | Schwarmspeicher | ja |
| /pipeline | Vorprojekte / In Akquise | Schwarmspeicher | ja |
| /potenzial | Potenzialanalyse | Schwarmspeicher | ja |
| /karte | Kartenansicht | Schwarmspeicher | ja |
| /forecast | Forecast | Schwarmspeicher | ja |
| /tasks | Aufgaben | Schwarmspeicher | ja |
| /stockend | Stockende Standorte | Schwarmspeicher | ja |
| /akquisiteure | Akquisiteure | Schwarmspeicher | ja |
| /meine-standorte | Meine Standorte | – (externe Akquisiteure) | ja |
| /benutzer | Benutzerverwaltung | – (Admin) | ja |
| /historie | Audit Log | – (Admin) | ja |
| /pv-colocation | Dashboard | PV-Co-Location | ja |
| /pv-colocation/projekte | Standorte | PV-Co-Location | ja |
| /pv-colocation/pipeline | Vorprojekte | PV-Co-Location | ja |
| /pv-colocation/karte | Kartenansicht | PV-Co-Location | ja |
| /pv-colocation/forecast | Forecast | PV-Co-Location | ja |
| /pv-colocation/tasks | Aufgaben | PV-Co-Location | ja |
| /pv-colocation/stockend | Stockende Standorte | PV-Co-Location | ja |
Datenzugriff
Der Zugriff erfolgt über Custom Hooks, die sämtliche Kommunikation mit Supabase kapseln:
// Schwarmspeicher
useStandorte()Â Â useGemeinden()Â Â useVorprojekte()
useTasks()Â Â Â Â Â Â usePotenzialDaten()Â Â useStandortpartner()
useMonatsziele() useDokumente()Â Â useIsAdmin()
useAkquisePhase()Â Â useTrafoStationen()Â Â useBatterieKandidaten()
useAkquisiteurTeam  useKannZuteilen()  useUwZuteilungen()
useUwKapazitaeten()
// PV-Co-Location
useCoLocationStandorte()Â Â Â Â Â Â Â useCoLocationStandortpartner()
useCoVorprojekte()Â Â useCoTasks()Â Â useCoMonatsziele()Â Â useCoDokumente()
// Use-Case-ĂĽbergreifend
useUseCase()Â Â useAuth()
Supabase
Authentication: Login, Passwortänderung, Rollenverwaltung.
Datenbank: Wird ĂĽber SQL-Migrationen verwaltet (supabase/migrations/), inkl. komplettes PV-Co-Location-Schema: co_standorte, co_standortpartner, co_prozessschritte, co_vorprojekte, co_monatsziele, co_dokumente, co_tasks. FĂĽr die Schwarmspeicher-Akquise u. a. trafo_stationen, standort_batterie_kandidaten, uw_kapazitaeten, uw_namen, uw_standorte, uw_zuteilungen und akquisiteur_team sowie das Feld standorte.betreuer_id. Die Rechte externer Akquisiteure laufen ĂĽber RLS mit den Funktionen akquise_standort_zugriff() und is_own_akquise_standort() (zugeteilt, betreut oder Stellvertretung des Leiters).
Edge Functions:
- fetch-noe-gemeinden — lädt Gemeinden aus Niederösterreich
- manage-users — Benutzerverwaltung, prüft Admin-Berechtigung serverseitig
- public-lead-intake — nimmt Anfragen der öffentlichen Landingpage entgegen
- uw-kapazitaeten-aktualisieren — lädt die Kapazitätsliste der Umspannwerke von Netz NÖ
- uw-trafos-zuordnen — ordnet Trafostationen den UW-Gebieten zu
- grundstuecke-ermitteln — ermittelt Grundstücksdaten zu Standorten
Storage: zwei Buckets — dokumente (Schwarmspeicher) und co-dokumente (PV-Co-Location).
Use-Case-Umschalter
Zwei Buttons oben in der Seitenleiste ("Schwarmspeicher" / "PV-Co-Location"). Welcher Use-Case aktiv angezeigt wird, leitet sich direkt aus der aktuellen URL ab (Hook useUseCase.tsx, /pv-colocation/*-Pfade vs. Rest) — nicht aus einem gespeicherten Zustand. Dadurch zeigt die Seitenleiste nach Login oder direktem Aufruf eines Links immer konsistent den richtigen Use-Case.
Server
Das Projekt liegt unter /mnt/data/schwarmspeicher/schwarmspeicher-electrify_lokal und läuft in einem eigenständigen Docker-Compose-Stack (schwarmspeicher-electrify_lokal).
Erreichbar unter:
Ă–ffentlich: https://schwarmspeicher.electrify.at:8200 (Wildcard-Zertifikat *.electrify.at, Let's Encrypt, gĂĽltig bis 13.01.2027)
Supabase (Postgres, Auth, Kong, Storage, Edge Functions) läuft als eigener Docker-Compose-Stack im selben Docker-Netzwerk wie der Frontend-Container. Edge Functions werden über einen zentralen main-Router an die jeweilige Unterfunktion weitergereicht; das Verzeichnis liegt unter /mnt/data/supabase/docker/docker/volumes/functions/.