Wiki source code of Fuhrpark (Fleet Manager)

Version 9.1 by Patrizia Gurschka on 2026/09/10 07:35

Hide last authors
Patrizia Gurschka 7.2 1 = đźš— Fuhrpark (Fleet Manager) =
Dimitri Rupp 5.1 2
Patrizia Gurschka 7.3 3 >ℹ️ **Zweck:** Webbasiertes System zur Verwaltung des Firmenfuhrparks — von Fahrzeug- und Fahrerstammdaten über Kostenkalkulation und Kilometerauswertung bis zu automatisierter Ersatzbeschaffungs-Planung (Handlungsbedarf) und monatlicher Abrechnung.
Dimitri Rupp 1.1 4
Patrizia Gurschka 7.3 5 **Auf dieser Seite**
6
7 * đźš— [[Fuhrpark (Fleet Manager)>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#-fuhrpark-fleet-manager]]
8 ** [[Ăśbersicht>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#%C3%BCbersicht]]
9 ** [[Technologie-Stack>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#technologie-stack]]
10 ** [[Projektstruktur>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#projektstruktur]]
11 ** [[Hauptfunktionen>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#hauptfunktionen]]
12 *** [[Fahrzeuge verwalten>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#fahrzeuge-verwalten]]
13 *** [[Fahrer verwalten>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#fahrer-verwalten]]
14 *** [[Kilometer-Daten>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#kilometer-daten]]
15 *** [[Kalkulation>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#kalkulation]]
16 *** [[Handlungsbedarf>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#handlungsbedarf]]
17 *** [[Dashboard>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#dashboard]]
18 *** [[Benutzerverwaltung (Admin)>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#benutzerverwaltung-admin]]
19 *** [[Kalkulationsparameter>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#kalkulationsparameter]]
20 *** [[Export & Berichte>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#export--berichte]]
21 ** [[Routing>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#routing]]
22 ** [[Datenzugriff>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#datenzugriff]]
23 ** [[Backend>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#backend]]
24 ** [[Architektur>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#architektur]]
25 ** [[Server>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#server]]
26 ** [[Hinweise>>url:https://claude.ai/chat/bbe27d6f-4606-42f0-8e93-34a994469548#hinweise]]
27
Patrizia Gurschka 7.2 28 == Ăśbersicht ==
Dimitri Rupp 1.1 29
Patrizia Gurschka 7.2 30 Fuhrpark unterstützt den gesamten Lebenszyklus eines Firmenfahrzeugs: Anlage und Zuordnung, laufende Kostenkalkulation, Kilometer-Tracking, Handlungsbedarf/Ersatzbeschaffung bis zur monatlichen Abrechnung und Kostenstellen-Umbuchung. Fahrzeug- und Fahrerstammdaten werden aus dem unternehmensweiten RIMO-System (SQL-Server-DWH) synchronisiert, Kilometerstände automatisiert über GPS-/Tesla-Anbindung und SharePoint importiert.
Dimitri Rupp 1.1 31
Patrizia Gurschka 7.2 32 Das Projekt wurde von einer Streamlit-Monolith-Anwendung auf eine FastAPI-Backend- + React-Frontend-Architektur umgestellt.
Dimitri Rupp 1.1 33
Patrizia Gurschka 7.2 34 == Technologie-Stack ==
Dimitri Rupp 1.1 35
Patrizia Gurschka 7.2 36 **Frontend:** React 18 · Vite · React Router · React Query (TanStack Query) · Axios · eigene UI-Komponentenbibliothek (kein UI-Framework wie MUI/shadcn)
Dimitri Rupp 1.1 37
Patrizia Gurschka 7.2 38 **Backend:** FastAPI (Python) · SQLite (WAL-Modus) · Pandas · python-jose (JWT) · passlib/bcrypt · pyodbc (SQL-Server-Anbindung)
Dimitri Rupp 1.1 39
Patrizia Gurschka 7.2 40 **Externe Anbindungen:**
Dimitri Rupp 1.1 41
Patrizia Gurschka 7.2 42 * **RIMO / SQL-Server (ai.sdmperson, rimo.sdmtool):** täglicher Fahrer-/Line-Manager-Sync, Datumsermittlung für Nachkorrekturen
43 * **Microsoft Fabric:** KM-Formular-E-Mails, SharePoint-Listenabgleich
44 * **GPS-AT / Tesla:** automatischer Kilometerstand-Import
Dimitri Rupp 1.1 45
Patrizia Gurschka 7.2 46 == Projektstruktur ==
Dimitri Rupp 1.1 47
Patrizia Gurschka 7.2 48 {{{fuhrpark/
49 ├── _bootstrap.py Gemeinsames Setup für alle Skripte
50 ├── 1_import_users_drivers.py Täglicher Fahrer-/Line-Manager-Sync (Cron)
51 ├── 2_import_vehicles.py Einmaliger Fahrzeug-Erstimport
52 ├── 3_import_vehicle_data.py Manueller Excel-Import (Fahrzeugdaten)
53 ├── 4_import_km_history.py Manueller Excel-Import (KM-Historie)
54 ├── import_km.py KM-Stand-Import (gpsat/tesla/sharepoint)
55 ├── repair_stale_line_manager_assignments.py Einmaliges Reparatur-Skript (Altlasten)
56 ├── docker-compose.yml
57 ├── .env Secrets für Docker (SECRET_KEY, CORS)
58 ├── data/ fleet.db, fleet_demo.db (nicht in Git)
59 ├── abrechnungen/ Export-Ablage (nicht in Git)
60 ├── backend/
61 │ ├── Dockerfile
62 │ ├── .env Secrets für Cron-Skripte (CONN_STR, SP_*, SMTP_*)
63 │ ├── requirements.txt
64 │ └── app/
65 │ ├── main.py FastAPI-Einstiegspunkt, Hintergrund-Jobs
66 │ ├── config.py Zentrale Konfiguration (ENV-Variablen)
67 │ ├── db.py Schema, Migrationen, Indizes
68 │ ├── auth.py JWT/Passwort-Logik
69 │ ├── services.py Geschäftslogik (Kalkulation, Zuordnung, ...)
70 │ └── routers/ vehicles, drivers, users, dashboard, calc_params, auth
71 └── frontend/
72 ├── Dockerfile
73 ├── nginx.conf Reverse-Proxy zu /api, SPA-Routing
74 └── src/
75 ├── api/ zentraler Axios-Client
76 ├── context/ AuthContext
77 ├── components/ VehicleFormModal, DriverFormModal, ui/, ...
78 └── pages/ Dashboard, Fahrzeuge, Fahrer, KM-Dashboard, ...
79 }}}
Dimitri Rupp 1.1 80
Patrizia Gurschka 7.2 81 == Hauptfunktionen ==
Dimitri Rupp 1.1 82
Patrizia Gurschka 7.2 83 === Fahrzeuge verwalten ===
Dimitri Rupp 1.1 84
Patrizia Gurschka 7.2 85 Fahrzeuge werden initial aus RIMO importiert und danach in der App gepflegt (Rückschreiben nach RIMO ist geplant, aktuell nicht implementiert). Anlegen erfordert MAT-ID, Marke und Modell als Pflichtfelder; Fahrer und Line Manager können direkt zugewiesen werden (Line Manager wird bei Fahrer-Auswahl automatisch ergänzt, ist aber weiterhin manuell überschreibbar). Zuordnungen mit befristetem Zeitraum kehren nach Ablauf automatisch zum vorherigen Fahrer zurück — ohne Enddatum bleibt die Zuordnung bestehen, bis sie aktiv geändert wird. Fahrzeuge können auf inaktiv gesetzt (bleiben sichtbar) oder archiviert werden (wandern in die Archiv-Ansicht, von dort reaktivierbar). Ein gesetztes „Deactivation Date" deaktiviert und archiviert das Fahrzeug automatisch zum entsprechenden Datum. Komponenten: FahrzeugePage, VehicleFormModal, VehicleDrawer.
Dimitri Rupp 1.1 86
Patrizia Gurschka 7.2 87 === Fahrer verwalten ===
Dimitri Rupp 1.1 88
Patrizia Gurschka 7.2 89 Fahrer werden täglich um 4:00 Uhr gegen RIMO abgeglichen (Neuanlage bei unbekannter Personalnummer, sonst Aktualisierung von Stammdaten, Kostenstelle und Line Manager). Externe Fahrer können manuell angelegt und bearbeitet werden; Stammdaten interner (per RIMO importierter) Fahrer sind schreibgeschützt. Komponenten: FahrerPage, DriverFormModal.
Dimitri Rupp 1.1 90
Patrizia Gurschka 7.2 91 === Kilometer-Daten ===
Dimitri Rupp 1.1 92
Patrizia Gurschka 7.2 93 Kilometerstände werden automatisiert importiert: GPS-AT täglich um 4:00, Tesla montags um 4:00, jeweils zum Monatsende. Für Fahrzeuge ohne automatische Anbindung wird 3 Tage vor Monatsende täglich eine Erinnerungsmail verschickt, bis ein Wert in der SharePoint-Liste eingetragen ist; sobald die Liste vollständig ist, wird sie automatisch übernommen. Berechnet werden Differenzen, Jahreskilometer und aktuelle Laufleistung, einsehbar im KM-Dashboard — inklusive korrekter Zeitraum-Begrenzung bei unterjährigem Fahrer-/Line-Manager-Wechsel. Komponente: KmDashboardPage.
Dimitri Rupp 1.1 94
Patrizia Gurschka 7.2 95 === Kalkulation ===
Dimitri Rupp 1.1 96
Patrizia Gurschka 7.2 97 Pro Fahrzeug wird eine Kostenkalkulation aus Anschaffungskosten, laufenden Kosten (Versicherung, Wartung etc.) sowie Verbrauch und Energiepreisen erstellt. Ergebnis: Kosten pro Monat, Jahr und Kilometer. Beim Anlegen eines Fahrzeugs werden die Default-Parameter aus „Kalkulationsparameter" nach Fahrzeugtyp übernommen; die verbleibenden individuellen Felder werden in „Kalkulation" ergänzt und per „Aktualisieren" neu berechnet. Komponente: KalkulationPage.
Dimitri Rupp 1.1 98
Patrizia Gurschka 7.2 99 === Handlungsbedarf ===
Dimitri Rupp 1.1 100
Patrizia Gurschka 7.2 101 Hochrechnungen werden bei jedem KM-Stand-Import neu berechnet. Ein neu bestelltes Fahrzeug wird zunächst über das Häkchen „Bestellt" markiert — erst danach kann es im System angelegt werden. Nach Anlage steht die Funktion „Geliefert" zur Verfügung; sobald ein Fahrzeug als geliefert markiert wird, entfällt es automatisch aus der Handlungsbedarfsliste, der Beschaffungsprozess gilt als abgeschlossen. Neu angelegte sowie aus dem Handlungsbedarf stammende Fahrzeuge erscheinen automatisch im Forecast; Ersatzfahrzeuge enthalten dort eine Referenz auf das ursprüngliche (ersetzte) Fahrzeug. Komponente: HandlungsbedarfPage.
Dimitri Rupp 1.1 102
Patrizia Gurschka 7.2 103 === Dashboard ===
Dimitri Rupp 1.1 104
Patrizia Gurschka 7.2 105 Zentrale Ăśbersicht: Anzahl Fahrzeuge, KostenĂĽbersicht und relevante Kennzahlen zum aktuellen Fuhrparkstatus. Komponente: DashboardPage.
Dimitri Rupp 1.1 106
Patrizia Gurschka 7.2 107 === Benutzerverwaltung (Admin) ===
Dimitri Rupp 1.1 108
Patrizia Gurschka 7.2 109 Admins können Benutzer anlegen, Passwörter ändern sowie Fahrer und Fahrzeuge zuweisen. Änderungen an Line Manager und Kostenstelle werden nachvollziehbar protokolliert (driver_attribute_history), sowohl bei manueller Änderung als auch beim täglichen RIMO-Sync. Komponente: BenutzerPage.
Dimitri Rupp 1.1 110
Patrizia Gurschka 7.2 111 === Kalkulationsparameter ===
Dimitri Rupp 1.1 112
Patrizia Gurschka 7.2 113 Anpassungen hier wirken sich auf **alle** Fahrzeuge des jeweiligen Typs aus. Dem Controlling vorbehalten (Rollen admin, demo, controlling). Komponente: KalkParamsPage.
Dimitri Rupp 1.1 114
Patrizia Gurschka 7.2 115 === Export & Berichte ===
Dimitri Rupp 1.1 116
Patrizia Gurschka 7.2 117 Monatliche Abrechnungen und Kostenstellen-Umbuchungen werden auf Klick erstellt und als CSV exportiert, zur Weiterverarbeitung in Excel. Gefahrene Kilometer sowie die vollständige Fahrzeugliste (inkl. Kalkulationsaufschlüsselung) können als Excel-Datei heruntergeladen werden.
Dimitri Rupp 1.1 118
Patrizia Gurschka 7.2 119 == Routing ==
Dimitri Rupp 1.1 120
Patrizia Gurschka 7.2 121 |=Seite|=Beschreibung
122 |Dashboard|Startseite, zentrale Kennzahlen
123 |Fahrzeuge|Fahrzeugverwaltung, Zuordnung, Archiv
124 |Fahrer|Fahrerverwaltung
125 |KM-Dashboard|Kilometerauswertung, Monatsabrechnung
126 |Kalkulation|Kostenkalkulation je Fahrzeug
127 |Handlungsbedarf|Ersatzbeschaffung, Forecast
128 |Kalkulationsparameter|Typ-Defaults (Controlling)
129 |Benutzer|Benutzerverwaltung (Admin)
130 |Login|Anmeldung
Dimitri Rupp 1.1 131
Patrizia Gurschka 7.2 132 == Datenzugriff ==
Dimitri Rupp 1.1 133
Patrizia Gurschka 7.2 134 Der Zugriff erfolgt ĂĽber einen zentralen Axios-Client (api/index.js) in Verbindung mit React Query fĂĽr Caching, Invalidierung und Hintergrund-Aktualisierung. Jede Seite bindet die fĂĽr sie relevanten REST-Endpunkte des FastAPI-Backends ein (vehiclesApi, driversApi, usersApi, calcParamsApi).
Dimitri Rupp 1.1 135
Patrizia Gurschka 7.2 136 == Backend ==
Dimitri Rupp 1.1 137
Patrizia Gurschka 7.2 138 **Authentifizierung:** JWT (python-jose), OAuth2-Password-Flow, 8-Stunden-Tokens. Rollen: admin, demo, controlling, Benutzer (Line Manager/Fahrer). Sichtbarkeit von Fahrzeugen/Fahrern fĂĽr normale Nutzer richtet sich nach Line-Manager-Zuordnung.
Dimitri Rupp 1.1 139
Patrizia Gurschka 7.2 140 **Datenbank:** SQLite im WAL-Modus. Schema und nicht-destruktive Migrationen in db.py. Änderungen an Fahrzeugen, Fahrern, Kalkulationsparametern und Passwörtern werden inklusive verantwortlicher Person nachvollzogen (updated_by); Zuordnungsänderungen (Fahrzeug↔Fahrer, Fahrer↔Line-Manager/Kostenstelle) führen eine vollständige, zeitlich abgegrenzte Historie (vehicle_assignment_history, driver_attribute_history).
Dimitri Rupp 1.1 141
Patrizia Gurschka 7.2 142 **Externe Anbindung:** SQL-Server-Zugriff über pyodbc (CONN_STR) für den täglichen RIMO-Sync sowie Datumsermittlung bei nachträglichen Korrekturen (rimo.sdmtool.last_update). Microsoft-Fabric-Anbindung für KM-Formular-E-Mails und SharePoint-Abgleich.
Dimitri Rupp 1.1 143
Patrizia Gurschka 7.2 144 == Architektur ==
Dimitri Rupp 1.1 145
Patrizia Gurschka 7.2 146 {{{flowchart TD
147 A[React Frontend] --> B[React Query / Axios-Client]
148 B --> C[nginx Reverse-Proxy]
149 C --> D[FastAPI Backend]
150 D --> E[(SQLite<br/>fleet.db)]
151 D --> F[JWT Auth]
Dimitri Rupp 1.1 152
Patrizia Gurschka 7.2 153 G[Cron-Skripte<br/>Projekt-Root] --> E
154 G --> H[SQL-Server / RIMO<br/>ai.sdmperson, rimo.sdmtool]
155 G --> I[Microsoft Fabric<br/>SharePoint / KM-Mails]
156 G --> J[GPS-AT / Tesla APIs]
157 }}}
Dimitri Rupp 1.1 158
Patrizia Gurschka 7.2 159 Die Cron-Skripte laufen **unabhängig** von der FastAPI-App direkt auf dem Server (nicht im Docker-Container), schreiben aber in dieselbe fleet.db wie das Backend.
Dimitri Rupp 1.1 160
Patrizia Gurschka 7.2 161 == Server ==
Dimitri Rupp 1.1 162
Patrizia Gurschka 7.2 163 Die App läuft auf 192.168.208.2, per Docker Compose (Services backend + frontend), und liegt unter /mnt/data/fleet-manager/fuhrpark.
Dimitri Rupp 1.1 164
Patrizia Gurschka 7.2 165 **Deployment bei Codeänderungen** (manuell auf dem Server auszuführen):
Dimitri Rupp 1.1 166
Patrizia Gurschka 7.2 167 {{{sudo -u www-data git pull
168 docker compose up -d --build
169 }}}
Dimitri Rupp 1.1 170
Patrizia Gurschka 7.2 171 **Cronjobs:** sudo -u www-data crontab -e, Logs unter /mnt/data/fleet-manager/fuhrpark/logs. Enthält u. a. den täglichen Fahrer-Sync (1_import_users_drivers.py) und die KM-Stand-Importe (gpsat/tesla/sharepoint über import_km.py).
Dimitri Rupp 1.1 172
Patrizia Gurschka 7.2 173 Erreichbar unter [[http:~~/~~/fleetmanager.spl-tele.com:8501>>url:http://fleetmanager.spl-tele.com:8501/]] — mit VPN und im SPL-TELE-Netzwerk.
Dimitri Rupp 1.1 174
Patrizia Gurschka 7.2 175 == Hinweise ==
Dimitri Rupp 1.1 176
Patrizia Gurschka 7.2 177 * Änderungen im Demo-Modus werden nicht gespeichert.
178 * Benutzerrechte bestimmen die Sichtbarkeit der Daten (Line-Manager-Zuordnung).
179 * Regelmäßige Datenpflege (z. B. Fahrerzuordnung) ist wichtig für korrekte Auswertungen.
180 * backend/data/ bzw. data/ (Projekt-Root) enthält die produktive Datenbank und ist **nicht** Teil des Git-Repos — ein git pull verändert die Datenbank nie.