Wiki source code of Schwarmspeicher Electrify

Version 10.2 by Patrizia Gurschka on 2026/09/10 08:00

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