Wiki source code of Schwarmspeicher Electrify

Version 13.1 by Patrizia Gurschka on 2026/09/10 08:19

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