Wiki source code of Schwarmspeicher Electrify
Version 8.2 by Patrizia Gurschka on 2026/09/10 07:15
Hide last authors
| author | version | line-number | content |
|---|---|---|---|
| |
8.2 | 1 | **🔋 Schwarmspeicher Electrify** |
![]() |
1.1 | 2 | |
| |
8.2 | 3 | |((( |
| 4 | |((( | ||
| 5 | ℹ️ **Zweck: **Webbasiertes Projektmanagementsystem zur Verwaltung von Batterie-Großspeicherprojekten in Deutschland und Österreich — vom Standort über Genehmigungen bis zur Projektsteuerung und Dokumentation. Deckt zwei Use-Cases ab: klassische Schwarmspeicher-Standorte und PV-Co-Location-Standorte. | ||
| 6 | |||
| 7 | **Zielgruppe: **Vertriebs-/Projektentwicklungsteam und IT/DevOps-Betrieb. | ||
| 8 | ))) | ||
| 9 | |||
| 10 | |||
| 11 | )))|((( | ||
| 12 | |((( | ||
| |
5.1 | 13 | **Auf dieser Seite** |
| 14 | |||
| |
8.2 | 15 | ▪ Schwarmspeicher Electrify |
| |
5.1 | 16 | |
| |
8.2 | 17 | ○ Übersicht |
| |
5.1 | 18 | |
| |
8.2 | 19 | ○ Technologie-Stack |
| |
5.1 | 20 | |
| |
8.2 | 21 | ○ Projektstruktur |
| |
5.1 | 22 | |
| |
8.2 | 23 | ○ Use-Case-Umschalter |
| |
5.1 | 24 | |
| |
8.2 | 25 | ○ Hauptfunktionen |
| |
5.1 | 26 | |
| |
8.2 | 27 | ▫ Dashboard |
![]() |
1.1 | 28 | |
| |
8.2 | 29 | ▫ Projektverwaltung |
![]() |
1.1 | 30 | |
| |
8.2 | 31 | ▫ Gemeinden |
| |
5.1 | 32 | |
| |
8.2 | 33 | ▫ Kartenansicht |
| |
5.1 | 34 | |
| |
8.2 | 35 | ▫ Potenzialanalyse |
| |
5.1 | 36 | |
| |
8.2 | 37 | ▫ Pipeline |
![]() |
1.1 | 38 | |
| |
8.2 | 39 | ▫ Meilensteinverwaltung |
![]() |
1.1 | 40 | |
| |
8.2 | 41 | ▫ Stockend |
![]() |
1.1 | 42 | |
| |
8.2 | 43 | ▫ Forecast |
![]() |
1.1 | 44 | |
| |
8.2 | 45 | ▫ Aufgabenverwaltung |
![]() |
1.1 | 46 | |
| |
8.2 | 47 | ▫ Dokumentenverwaltung |
| |
5.1 | 48 | |
| |
8.2 | 49 | ▫ Standortpartner |
![]() |
1.1 | 50 | |
| |
8.2 | 51 | ▫ Benutzerverwaltung |
| |
5.1 | 52 | |
| |
8.2 | 53 | ▫ Audit Log |
![]() |
1.1 | 54 | |
| |
8.2 | 55 | ▫ Landingpage "Fläche verpachten" |
| |
6.1 | 56 | |
| |
8.2 | 57 | ○ Routing |
| |
6.1 | 58 | |
| |
8.2 | 59 | ○ Datenzugriff |
| |
6.1 | 60 | |
| |
8.2 | 61 | ○ Supabase |
| |
6.1 | 62 | |
| |
8.2 | 63 | ○ Architektur |
| |
6.1 | 64 | |
| |
8.2 | 65 | ○ Offene Punkte / zu verifizieren |
| 66 | |||
| 67 | ○ Server | ||
| |
6.1 | 68 | ))) |
| 69 | |||
| |
8.2 | 70 | |
| 71 | ))) | ||
| |
6.1 | 72 | |
| 73 | |||
| |
8.2 | 74 | |
| |
7.1 | 75 | == Übersicht == |
| |
6.1 | 76 | |
| |
8.2 | 77 | **Schwarmspeicher Electrify **unterstützt den gesamten Projektlebenszyklus: Standortidentifikation, Genehmigungen, Projektsteuerung und Dokumentation — für beide Use-Cases parallel, über einen Umschalter in der Seitenleiste. |
| |
6.1 | 78 | |
| |
7.1 | 79 | == Technologie-Stack == |
| |
6.1 | 80 | |
| |
8.2 | 81 | **Frontend: **React 18 · TypeScript · Vite · Tailwind CSS · shadcn/ui · React Router · React Query · Leaflet + leaflet.markercluster (Kartendarstellung) · Recharts (Diagramme) · XLSX (Excel-Import/-Export) |
| |
6.1 | 82 | |
| |
8.2 | 83 | **Backend: **Supabase (self-hosted) — PostgreSQL, Authentication, Storage, Edge Functions, Row Level Security (RLS) |
| |
6.1 | 84 | |
| |
7.1 | 85 | == Projektstruktur == |
| |
6.1 | 86 | |
| |
8.2 | 87 | |((( |
| 88 | 📁 src/ | ||
![]() |
1.1 | 89 | |
| |
8.2 | 90 | 📁 components/ UI-Komponenten (Schwarmspeicher + CoLocation*-Pendants) |
| |
5.1 | 91 | |
| |
8.2 | 92 | 📁 pages/ Seiten der Anwendung |
![]() |
1.1 | 93 | |
| |
8.2 | 94 | 📁 hooks/ Datenzugriffe und Business-Logik |
| 95 | |||
| 96 | 📁 integrations/ Supabase Client | ||
| 97 | |||
| 98 | 📁 types/ TypeScript-Modelle | ||
| 99 | |||
| 100 | 📁 lib/ Hilfsfunktionen (u.a. mapCoordinates.ts) | ||
| 101 | |||
| 102 | 📁 supabase/ | ||
| 103 | |||
| 104 | 📁 migrations/ SQL-Migrationen (inkl. komplettes PV-Co-Location-Schema) | ||
| 105 | |||
| 106 | 📁 functions/ Edge Functions | ||
| 107 | ))) | ||
| 108 | |||
| 109 | == Use-Case-Umschalter == | ||
| 110 | |||
| 111 | 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. | ||
| 112 | |||
| |
7.1 | 113 | == Hauptfunktionen == |
![]() |
1.1 | 114 | |
| |
7.1 | 115 | === Dashboard === |
| |
6.1 | 116 | |
| |
8.2 | 117 | Zentrale Übersicht über Projekte, Status, Kennzahlen und Projektfortschritt. |
![]() |
1.1 | 118 | |
| |
8.2 | 119 | * Schwarmspeicher: Dashboard.tsx — Pipeline-Summary, kW/kWh-KPIs, Plan-vs-Ist-Charts pro Meilenstein |
| 120 | * PV-Co-Location: CoLocationDashboard.tsx — gleiche Struktur, Einheiten angepasst (kWp/kW), zweite Übersichtskarte zeigt Standortpartner-Anzahl statt Gemeinden | ||
![]() |
1.1 | 121 | |
| |
8.2 | 122 | === Projektverwaltung / Standortverwaltung === |
![]() |
1.1 | 123 | |
| |
8.2 | 124 | Standorte anlegen, bearbeiten, importieren, Historie, Dokumente, sortierbare Tabelle mit Meilenstein-Filter, Bulk-Bearbeitung, Als-abgebrochen-markieren/Reaktivieren. |
![]() |
1.1 | 125 | |
| |
8.2 | 126 | * Schwarmspeicher: ProjectTable, StandortDetail, CreateStandortFormNew, StandortImportDialog, StandortDokumente, AbbruchDialog, MeilensteinQuickEdit, MeilensteinMatrix, BulkEditStandortDialog |
| 127 | * PV-Co-Location: CoLocationProjectTable, CoLocationStandortDetail, CreateCoLocationForm, CoLocationImportDialog, CoLocationStandortDokumente, CoLocationAbbruchDialog, CoLocationMeilensteinQuickEdit, CoLocationMeilensteinMatrix, CoLocationBulkEditDialog | ||
![]() |
1.1 | 128 | |
| |
8.2 | 129 | 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. |
![]() |
1.1 | 130 | |
| |
8.2 | 131 | === Gemeinden === |
![]() |
1.1 | 132 | |
| |
8.2 | 133 | Verwaltung der Gemeinden (CreateGemeindeForm, nur Schwarmspeicher). Edge Function fetch-noe-gemeinden lädt NÖ-Gemeinden. |
![]() |
1.1 | 134 | |
| |
8.2 | 135 | === Kartenansicht === |
![]() |
1.1 | 136 | |
| |
8.2 | 137 | Interaktive Karte aller Standorte (Leaflet + Clustering), Adresssuche, Vollbildmodus, Flächenauswahl (Shift+Ziehen), Trafokarte-NÖ-Layer mit Legende. |
![]() |
1.1 | 138 | |
| |
8.2 | 139 | * Schwarmspeicher: ProjectMap |
| 140 | * PV-Co-Location: CoLocationMap | ||
| 141 | * Gemeinsam genutzt: LocationPickerMap (Einzelstandort-Kartenauswahl), src/lib/mapCoordinates.ts (dedupeCoordinates — verhindert sofortiges Auftrennen bei identischen Koordinaten) | ||
![]() |
1.1 | 142 | |
| |
8.2 | 143 | === Potenzialanalyse === |
![]() |
1.1 | 144 | |
| |
8.2 | 145 | Bewertung möglicher Standorte (PotenzialTabelle, PotenzialPage) — nur Schwarmspeicher, kein Pendant bei PV-Co-Location. |
![]() |
1.1 | 146 | |
| |
8.2 | 147 | === Pipeline === |
![]() |
1.1 | 148 | |
| |
8.2 | 149 | * Schwarmspeicher: VorprojektePipeline, VorprojektTimeline |
| 150 | * PV-Co-Location: CoLocationPipeline (Felder an kWp/BESS-kW angepasst; kein Pendant zu VorprojektTimeline) | ||
![]() |
1.1 | 151 | |
| |
8.2 | 152 | === Meilensteinverwaltung === |
![]() |
1.1 | 153 | |
| |
8.2 | 154 | Projektfortschritt über Meilensteine, matrixartige Übersicht mit Bulk-Setzen, Gruppierung. |
![]() |
1.1 | 155 | |
| |
8.2 | 156 | * Schwarmspeicher: MeilensteinMatrix, MeilensteinQuickEdit (inkl. Sonderfall-Dialog NetzvertragAnpassungDialog) |
| 157 | * 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) | ||
![]() |
1.1 | 158 | |
| |
8.2 | 159 | === Stockend === |
![]() |
1.1 | 160 | |
| |
8.2 | 161 | Zeigt Standorte, bei denen die Lead-Time zwischen zwei Meilensteinen überschritten ist, konfigurierbare Regeln. |
![]() |
1.1 | 162 | |
| |
8.2 | 163 | * Schwarmspeicher: StuckPage |
| 164 | * PV-Co-Location: CoLocationStuckPage (eigene, getrennt gespeicherte Lead-Time-Regeln entlang der neuen Meilensteinkette) | ||
![]() |
1.1 | 165 | |
| |
8.2 | 166 | === Forecast === |
| |
5.1 | 167 | |
| |
8.2 | 168 | Monatliche Zielvorgaben, Plan-vs-Ist-Charts pro Kennzahl. |
| |
5.1 | 169 | |
| |
8.2 | 170 | * Schwarmspeicher: ForecastPage (kW und kWh pro Monat/Meilenstein, nach Land AT/DE getrennt) |
| 171 | * PV-Co-Location: CoLocationForecastPage — 4 KPI-Charts entlang Netzantrag gestellt / Netzvertrag erhalten / Standort gebaut / Standort live Trading (kein Land-Split) | ||
| |
5.1 | 172 | |
| |
8.2 | 173 | === Aufgabenverwaltung === |
| |
5.1 | 174 | |
| |
8.2 | 175 | Projektbezogene Aufgaben, jeweils eigene, komplett getrennte Liste pro Use-Case. |
| |
5.1 | 176 | |
| |
8.2 | 177 | * Schwarmspeicher: TaskManager, TasksPage, Hook useTasks() |
| 178 | * PV-Co-Location: CoTaskManager, CoLocationTasksPage, Hook useCoTasks() | ||
| |
5.1 | 179 | |
| |
8.2 | 180 | === Dokumentenverwaltung === |
![]() |
1.1 | 181 | |
| |
8.2 | 182 | Zu jedem Standort und jedem Standortpartner können Dokumente hochgeladen werden. |
![]() |
1.1 | 183 | |
| |
8.2 | 184 | * Schwarmspeicher: StandortDokumente, PartnerDokumente, Hook useDokumente() |
| 185 | * PV-Co-Location: CoLocationStandortDokumente, CoLocationPartnerDokumente, Hook useCoDokumente() — eigener Storage-Bucket co-dokumente | ||
![]() |
1.1 | 186 | |
| |
8.2 | 187 | === Standortpartner === |
![]() |
1.1 | 188 | |
| |
8.2 | 189 | Verwaltung von Projektpartnern, eigene, komplett getrennte Partnerliste pro Use-Case. |
![]() |
1.1 | 190 | |
| |
8.2 | 191 | * Schwarmspeicher: StandortpartnerManager, StandortpartnerTable |
| 192 | * PV-Co-Location: CoLocationStandortpartnerManager, CoLocationStandortpartnerTable | ||
![]() |
1.1 | 193 | |
| |
8.2 | 194 | === Benutzerverwaltung === |
| |
5.1 | 195 | |
| |
8.2 | 196 | Anmeldung, Passwortänderung, Rollen (admin/user). 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. |
| |
5.1 | 197 | |
| |
8.2 | 198 | === Audit Log === |
![]() |
1.1 | 199 | |
| |
8.2 | 200 | Nachvollziehbarkeit von Änderungen (AuditLogPage), tabellenübergreifend über beide Use-Cases. |
| |
6.1 | 201 | |
| |
8.2 | 202 | === Landingpage „Fläche verpachten" === |
| |
6.1 | 203 | |
| |
8.2 | 204 | Öffentlich erreichbare Seite ohne Login unter /flaeche-verpachten — für Grundstückseigentümer, die eine Fläche für einen Batteriespeicher zur Verfügung stellen wollen. Kartenbasierte Standortauswahl, Formular mit Honeypot-Spamschutz. |
![]() |
1.1 | 205 | |
| |
8.2 | 206 | * Legt über die Edge Function public-lead-intake automatisch einen neuen Eintrag in der Schwarmspeicher-Pipeline (vorprojekte) an |
| 207 | * E-Mail-Benachrichtigung optional (RESEND_API_KEY + LEAD_NOTIFY_EMAIL) — Anfrage wird auch ohne E-Mail-Konfiguration zuverlässig gespeichert | ||
| |
5.1 | 208 | |
| 209 | |||
![]() |
1.1 | 210 | |
| |
8.2 | 211 | |((( |
| 212 | ⚠️ **Hinweis: Platzhalter-Firmendaten** | ||
![]() |
1.1 | 213 | |
| |
8.2 | 214 | * In FlaecheVerpachtenPage.tsx sind Firmenname und Telefonnummer aktuell Platzhalter (Rateware). Vor dem Livegang unbedingt durch die echten Kontaktdaten ersetzen. |
| 215 | ))) | ||
![]() |
1.1 | 216 | |
| |
5.1 | 217 | |
| 218 | |||
| |
8.2 | 219 | == Routing == |
| |
6.1 | 220 | |
| |
8.2 | 221 | |**Pfad**|**Seite**|**Use-Case**|**Login nötig** |
| 222 | |/|Dashboard|Schwarmspeicher|ja | ||
| 223 | |/projekte|Standorte|Schwarmspeicher|ja | ||
| 224 | |/pipeline|Vorprojekte|Schwarmspeicher|ja | ||
| 225 | |/potenzial|Potenzialanalyse|Schwarmspeicher|ja | ||
| 226 | |/karte|Kartenansicht|Schwarmspeicher|ja | ||
| 227 | |/forecast|Forecast|Schwarmspeicher|ja | ||
| 228 | |/tasks|Aufgaben|Schwarmspeicher|ja | ||
| 229 | |/stockend|Stockende Standorte|Schwarmspeicher|ja | ||
| 230 | |/benutzer|Benutzerverwaltung|– (Admin)|ja | ||
| 231 | |/historie|Audit Log|– (Admin)|ja | ||
| 232 | |/pv-colocation|Dashboard|PV-Co-Location|ja | ||
| 233 | |/pv-colocation/projekte|Standorte|PV-Co-Location|ja | ||
| 234 | |/pv-colocation/pipeline|Vorprojekte|PV-Co-Location|ja | ||
| 235 | |/pv-colocation/karte|Kartenansicht|PV-Co-Location|ja | ||
| 236 | |/pv-colocation/forecast|Forecast|PV-Co-Location|ja | ||
| 237 | |/pv-colocation/tasks|Aufgaben|PV-Co-Location|ja | ||
| 238 | |/pv-colocation/stockend|Stockende Standorte|PV-Co-Location|ja | ||
| 239 | |/flaeche-verpachten|Landingpage „Fläche verpachten"|—|NEIN – öffentlich | ||
| 240 | |||
| 241 | |||
| 242 | |||
| 243 | == Datenzugriff == | ||
| 244 | |||
| 245 | Der Zugriff erfolgt über Custom Hooks, die sämtliche Kommunikation mit Supabase kapseln: | ||
| 246 | |||
| 247 | |((( | ||
| 248 | ~/~/ Schwarmspeicher | ||
| 249 | |||
| 250 | useStandorte() useGemeinden() useVorprojekte() | ||
| 251 | |||
| 252 | useTasks() usePotenzialDaten() useStandortpartner() | ||
| 253 | |||
| 254 | useMonatsziele() useDokumente() useIsAdmin() | ||
| 255 | |||
| 256 | |||
| 257 | ~/~/ PV-Co-Location | ||
| 258 | |||
| 259 | useCoLocationStandorte() useCoLocationStandortpartner() | ||
| 260 | |||
| 261 | useCoVorprojekte() useCoTasks() useCoMonatsziele() useCoDokumente() | ||
| 262 | |||
| 263 | |||
| 264 | ~/~/ Use-Case-übergreifend | ||
| 265 | |||
| 266 | useUseCase() useAuth() | ||
| 267 | ))) | ||
| 268 | |||
| 269 | |||
| 270 | |||
| 271 | == Supabase == | ||
| 272 | |||
| 273 | **Authentication: **Login, Passwortänderung, Rollenverwaltung. | ||
| 274 | |||
| 275 | **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. | ||
| 276 | |||
![]() |
1.1 | 277 | **Edge Functions:** |
| 278 | |||
| |
8.2 | 279 | * fetch-noe-gemeinden — lädt Gemeinden aus Niederösterreich |
| 280 | * manage-users — Benutzerverwaltung, prüft Admin-Berechtigung serverseitig | ||
| 281 | * public-lead-intake — nimmt Anfragen der öffentlichen Landingpage entgegen | ||
![]() |
1.1 | 282 | |
| |
8.2 | 283 | **Storage: **zwei Buckets — dokumente (Schwarmspeicher) und co-dokumente (PV-Co-Location). |
| |
5.1 | 284 | |
| |
8.2 | 285 | == Architektur == |
| |
5.1 | 286 | |
| |
8.2 | 287 | [[image:1789017284336-190.png]] |
| |
5.1 | 288 | |
| |
8.2 | 289 | 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. |
| |
5.1 | 290 | |
| |
8.2 | 291 | == Offene Punkte / zu verifizieren == |
![]() |
1.1 | 292 | |
| |
8.2 | 293 | |((( |
| 294 | ⚠️ **Vor einem breiteren Rollout klären** | ||
| |
5.1 | 295 | |
| |
8.2 | 296 | * E-Mail-Versand für Landingpage-Anfragen (RESEND_API_KEY / LEAD_NOTIFY_EMAIL) ist noch nicht final eingerichtet — Anfragen werden bis dahin nur in der Pipeline gespeichert, ohne Benachrichtigung. |
| 297 | * Migrationsdateien in supabase/migrations/ müssen noch ins Git-Repo committet werden, falls noch nicht geschehen (Datenbank selbst ist bereits aktuell). | ||
| 298 | * types.ts kennt die neuen co_*-Tabellen nicht — führt zu TypeScript-Warnungen beim Bauen (bewusst akzeptiert, kein Laufzeitfehler). | ||
| 299 | * KPI-Zuordnung im PV-Co-Location-Forecast (Netzantrag = kWp, die übrigen drei Meilensteine = kW) ist eine Annahme — bei Bedarf auf eine einheitliche Einheit umstellen. | ||
| 300 | ))) | ||
| |
5.1 | 301 | |
![]() |
1.1 | 302 | |
| |
8.2 | 303 | |
| 304 | == Server == | ||
| 305 | |||
| 306 | Das Projekt liegt unter /mnt/data/schwarmspeicher/schwarmspeicher-electrify_lokal und läuft in einem eigenständigen Docker-Compose-Stack (schwarmspeicher-electrify_lokal). | ||
| 307 | |||
| 308 | **Erreichbar unter:** | ||
| 309 | |||
| 310 | * VPN: http:~/~/schwarmspeicher.spl-tele.com:8200 (SPL-TELE-Netzwerk) | ||
| 311 | * Öffentlich: https:~/~/schwarmspeicher.electrify.at:8200 (Wildcard-Zertifikat *.electrify.at, Let's Encrypt, gültig bis 26.10.2026) | ||
| 312 | |||
| 313 | 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/. |
