Wiki source code of Schwarmspeicher Electrify
Version 10.2 by Patrizia Gurschka on 2026/09/10 08:00
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | = **đ Schwarmspeicher Electrify** = | ||
| 2 | |||
| 3 | |(% style="width:788px" %)((( | ||
| 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. | ||
| 6 | |||
| 7 | **Zielgruppe: **Vertriebs-/Projektentwicklungsteam und IT/DevOps-Betrieb. | ||
| 8 | {{/info}} | ||
| 9 | |||
| 10 | |((( | ||
| 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 | ))) | ||
| 31 | |||
| 32 | == Architektur == | ||
| 33 | |||
| 34 | [[image:1789017284336-190.png||height="353" width="762"]] | ||
| 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 | ||
| 37 | )))|(% style="width:280px" %)((( | ||
| 38 | |((( | ||
| 39 | **Auf dieser Seite** | ||
| 40 | |||
| 41 | âȘ Schwarmspeicher Electrify | ||
| 42 | |||
| 43 | â Projektstruktur | ||
| 44 | |||
| 45 | â Architektur | ||
| 46 | |||
| 47 | â Ăbersicht | ||
| 48 | |||
| 49 | â Technologie-Stack | ||
| 50 | |||
| 51 | â Use-Case-Umschalter | ||
| 52 | |||
| 53 | â Hauptfunktionen | ||
| 54 | |||
| 55 | â« Dashboard | ||
| 56 | |||
| 57 | â« Projektverwaltung | ||
| 58 | |||
| 59 | â« Gemeinden | ||
| 60 | |||
| 61 | â« Kartenansicht | ||
| 62 | |||
| 63 | â« Potenzialanalyse | ||
| 64 | |||
| 65 | â« Pipeline | ||
| 66 | |||
| 67 | â« Meilensteinverwaltung | ||
| 68 | |||
| 69 | â« Stockend | ||
| 70 | |||
| 71 | â« Forecast | ||
| 72 | |||
| 73 | â« Aufgabenverwaltung | ||
| 74 | |||
| 75 | â« Dokumentenverwaltung | ||
| 76 | |||
| 77 | â« Standortpartner | ||
| 78 | |||
| 79 | â« Benutzerverwaltung | ||
| 80 | |||
| 81 | â« Audit Log | ||
| 82 | |||
| 83 | ⫠Landingpage "FlÀche verpachten" | ||
| 84 | |||
| 85 | â Routing | ||
| 86 | |||
| 87 | â Datenzugriff | ||
| 88 | |||
| 89 | â Supabase | ||
| 90 | |||
| 91 | â Offene Punkte / zu verifizieren | ||
| 92 | |||
| 93 | â Server | ||
| 94 | ))) | ||
| 95 | |||
| 96 | |||
| 97 | ))) | ||
| 98 | |||
| 99 | |||
| 100 | |||
| 101 | == Ăbersicht == | ||
| 102 | |||
| 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. | ||
| 104 | |||
| 105 | == Technologie-Stack == | ||
| 106 | |||
| 107 | **Frontend: **React 18 · TypeScript · Vite · Tailwind CSS · shadcn/ui · React Router · React Query · Leaflet + leaflet.markercluster (Kartendarstellung) · Recharts (Diagramme) · XLSX (Excel-Import/-Export) | ||
| 108 | |||
| 109 | **Backend: **Supabase (self-hosted) â PostgreSQL, Authentication, Storage, Edge Functions, Row Level Security (RLS) | ||
| 110 | |||
| 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 | |||
| 115 | == Hauptfunktionen == | ||
| 116 | |||
| 117 | === Dashboard === | ||
| 118 | |||
| 119 | Zentrale Ăbersicht ĂŒber Projekte, Status, Kennzahlen und Projektfortschritt. | ||
| 120 | |||
| 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 | ||
| 123 | |||
| 124 | === Projektverwaltung / Standortverwaltung === | ||
| 125 | |||
| 126 | Standorte anlegen, bearbeiten, importieren, Historie, Dokumente, sortierbare Tabelle mit Meilenstein-Filter, Bulk-Bearbeitung, Als-abgebrochen-markieren/Reaktivieren. | ||
| 127 | |||
| 128 | * Schwarmspeicher: ProjectTable, StandortDetail, CreateStandortFormNew, StandortImportDialog, StandortDokumente, AbbruchDialog, MeilensteinQuickEdit, MeilensteinMatrix, BulkEditStandortDialog | ||
| 129 | * PV-Co-Location: CoLocationProjectTable, CoLocationStandortDetail, CreateCoLocationForm, CoLocationImportDialog, CoLocationStandortDokumente, CoLocationAbbruchDialog, CoLocationMeilensteinQuickEdit, CoLocationMeilensteinMatrix, CoLocationBulkEditDialog | ||
| 130 | |||
| 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. | ||
| 132 | |||
| 133 | === Gemeinden === | ||
| 134 | |||
| 135 | Verwaltung der Gemeinden (CreateGemeindeForm, nur Schwarmspeicher). Edge Function fetch-noe-gemeinden lĂ€dt NĂ-Gemeinden. | ||
| 136 | |||
| 137 | === Kartenansicht === | ||
| 138 | |||
| 139 | Interaktive Karte aller Standorte (Leaflet + Clustering), Adresssuche, Vollbildmodus, FlĂ€chenauswahl (Shift+Ziehen), Trafokarte-NĂ-Layer mit Legende. | ||
| 140 | |||
| 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) | ||
| 144 | |||
| 145 | === Potenzialanalyse === | ||
| 146 | |||
| 147 | Bewertung möglicher Standorte (PotenzialTabelle, PotenzialPage) â nur Schwarmspeicher, kein Pendant bei PV-Co-Location. | ||
| 148 | |||
| 149 | === Pipeline === | ||
| 150 | |||
| 151 | * Schwarmspeicher: VorprojektePipeline, VorprojektTimeline | ||
| 152 | * PV-Co-Location: CoLocationPipeline (Felder an kWp/BESS-kW angepasst; kein Pendant zu VorprojektTimeline) | ||
| 153 | |||
| 154 | === Meilensteinverwaltung === | ||
| 155 | |||
| 156 | Projektfortschritt ĂŒber Meilensteine, matrixartige Ăbersicht mit Bulk-Setzen, Gruppierung. | ||
| 157 | |||
| 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) | ||
| 160 | |||
| 161 | === Stockend === | ||
| 162 | |||
| 163 | Zeigt Standorte, bei denen die Lead-Time zwischen zwei Meilensteinen ĂŒberschritten ist, konfigurierbare Regeln. | ||
| 164 | |||
| 165 | * Schwarmspeicher: StuckPage | ||
| 166 | * PV-Co-Location: CoLocationStuckPage (eigene, getrennt gespeicherte Lead-Time-Regeln entlang der neuen Meilensteinkette) | ||
| 167 | |||
| 168 | === Forecast === | ||
| 169 | |||
| 170 | Monatliche Zielvorgaben, Plan-vs-Ist-Charts pro Kennzahl. | ||
| 171 | |||
| 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) | ||
| 174 | |||
| 175 | === Aufgabenverwaltung === | ||
| 176 | |||
| 177 | Projektbezogene Aufgaben, jeweils eigene, komplett getrennte Liste pro Use-Case. | ||
| 178 | |||
| 179 | * Schwarmspeicher: TaskManager, TasksPage, Hook useTasks() | ||
| 180 | * PV-Co-Location: CoTaskManager, CoLocationTasksPage, Hook useCoTasks() | ||
| 181 | |||
| 182 | === Dokumentenverwaltung === | ||
| 183 | |||
| 184 | Zu jedem Standort und jedem Standortpartner können Dokumente hochgeladen werden. | ||
| 185 | |||
| 186 | * Schwarmspeicher: StandortDokumente, PartnerDokumente, Hook useDokumente() | ||
| 187 | * PV-Co-Location: CoLocationStandortDokumente, CoLocationPartnerDokumente, Hook useCoDokumente() â eigener Storage-Bucket co-dokumente | ||
| 188 | |||
| 189 | === Standortpartner === | ||
| 190 | |||
| 191 | Verwaltung von Projektpartnern, eigene, komplett getrennte Partnerliste pro Use-Case. | ||
| 192 | |||
| 193 | * Schwarmspeicher: StandortpartnerManager, StandortpartnerTable | ||
| 194 | * PV-Co-Location: CoLocationStandortpartnerManager, CoLocationStandortpartnerTable | ||
| 195 | |||
| 196 | === Benutzerverwaltung === | ||
| 197 | |||
| 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. | ||
| 199 | |||
| 200 | === Audit Log === | ||
| 201 | |||
| 202 | Nachvollziehbarkeit von Ănderungen (AuditLogPage), tabellenĂŒbergreifend ĂŒber beide Use-Cases. | ||
| 203 | |||
| 204 | === Landingpage âFlĂ€che verpachten" === | ||
| 205 | |||
| 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. | ||
| 207 | |||
| 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 | ||
| 210 | |||
| 211 | |||
| 212 | |||
| 213 | |((( | ||
| 214 | â ïžÂ **Hinweis: Platzhalter-Firmendaten** | ||
| 215 | |||
| 216 | * In FlaecheVerpachtenPage.tsx sind Firmenname und Telefonnummer aktuell Platzhalter (Rateware). Vor dem Livegang unbedingt durch die echten Kontaktdaten ersetzen. | ||
| 217 | ))) | ||
| 218 | |||
| 219 | |||
| 220 | |||
| 221 | == Routing == | ||
| 222 | |||
| 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 | |||
| 279 | **Edge Functions:** | ||
| 280 | |||
| 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 | ||
| 284 | |||
| 285 | **Storage: **zwei Buckets â dokumente (Schwarmspeicher) und co-dokumente (PV-Co-Location). | ||
| 286 | |||
| 287 | == == | ||
| 288 | |||
| 289 | == Offene Punkte / zu verifizieren == | ||
| 290 | |||
| 291 | |((( | ||
| 292 | â ïžÂ **Vor einem breiteren Rollout klĂ€ren** | ||
| 293 | |||
| 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 | ))) | ||
| 299 | |||
| 300 | |||
| 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/. |