Wiki source code of Schwarmspeicher Electrify

Version 8.4 by Patrizia Gurschka on 2026/09/10 07:32

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