Wiki source code of Fuhrpark (Fleet Manager)
Version 7.3 by Patrizia Gurschka on 2026/09/09 13:21
Hide last authors
| author | version | line-number | content |
|---|---|---|---|
| |
7.2 | 1 | = đźš— Fuhrpark (Fleet Manager) = |
![]() |
5.1 | 2 | |
| |
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. |
![]() |
1.1 | 4 | |
| |
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 | |||
| |
7.2 | 28 | == Ăśbersicht == |
![]() |
1.1 | 29 | |
| |
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. |
![]() |
1.1 | 31 | |
| |
7.2 | 32 | Das Projekt wurde von einer Streamlit-Monolith-Anwendung auf eine FastAPI-Backend- + React-Frontend-Architektur umgestellt. |
![]() |
1.1 | 33 | |
| |
7.2 | 34 | == Technologie-Stack == |
![]() |
1.1 | 35 | |
| |
7.2 | 36 | **Frontend:** React 18 · Vite · React Router · React Query (TanStack Query) · Axios · eigene UI-Komponentenbibliothek (kein UI-Framework wie MUI/shadcn) |
![]() |
1.1 | 37 | |
| |
7.2 | 38 | **Backend:** FastAPI (Python) · SQLite (WAL-Modus) · Pandas · python-jose (JWT) · passlib/bcrypt · pyodbc (SQL-Server-Anbindung) |
![]() |
1.1 | 39 | |
| |
7.2 | 40 | **Externe Anbindungen:** |
![]() |
1.1 | 41 | |
| |
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 | ||
![]() |
1.1 | 45 | |
| |
7.2 | 46 | == Projektstruktur == |
![]() |
1.1 | 47 | |
| |
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 | }}} | ||
![]() |
1.1 | 80 | |
| |
7.2 | 81 | == Hauptfunktionen == |
![]() |
1.1 | 82 | |
| |
7.2 | 83 | === Fahrzeuge verwalten === |
![]() |
1.1 | 84 | |
| |
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. |
![]() |
1.1 | 86 | |
| |
7.2 | 87 | === Fahrer verwalten === |
![]() |
1.1 | 88 | |
| |
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. |
![]() |
1.1 | 90 | |
| |
7.2 | 91 | === Kilometer-Daten === |
![]() |
1.1 | 92 | |
| |
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. |
![]() |
1.1 | 94 | |
| |
7.2 | 95 | === Kalkulation === |
![]() |
1.1 | 96 | |
| |
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. |
![]() |
1.1 | 98 | |
| |
7.2 | 99 | === Handlungsbedarf === |
![]() |
1.1 | 100 | |
| |
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. |
![]() |
1.1 | 102 | |
| |
7.2 | 103 | === Dashboard === |
![]() |
1.1 | 104 | |
| |
7.2 | 105 | Zentrale Ăśbersicht: Anzahl Fahrzeuge, KostenĂĽbersicht und relevante Kennzahlen zum aktuellen Fuhrparkstatus. Komponente: DashboardPage. |
![]() |
1.1 | 106 | |
| |
7.2 | 107 | === Benutzerverwaltung (Admin) === |
![]() |
1.1 | 108 | |
| |
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. |
![]() |
1.1 | 110 | |
| |
7.2 | 111 | === Kalkulationsparameter === |
![]() |
1.1 | 112 | |
| |
7.2 | 113 | Anpassungen hier wirken sich auf **alle** Fahrzeuge des jeweiligen Typs aus. Dem Controlling vorbehalten (Rollen admin, demo, controlling). Komponente: KalkParamsPage. |
![]() |
1.1 | 114 | |
| |
7.2 | 115 | === Export & Berichte === |
![]() |
1.1 | 116 | |
| |
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. |
![]() |
1.1 | 118 | |
| |
7.2 | 119 | == Routing == |
![]() |
1.1 | 120 | |
| |
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 | ||
![]() |
1.1 | 131 | |
| |
7.2 | 132 | == Datenzugriff == |
![]() |
1.1 | 133 | |
| |
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). |
![]() |
1.1 | 135 | |
| |
7.2 | 136 | == Backend == |
![]() |
1.1 | 137 | |
| |
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. |
![]() |
1.1 | 139 | |
| |
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). |
![]() |
1.1 | 141 | |
| |
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. |
![]() |
1.1 | 143 | |
| |
7.2 | 144 | == Architektur == |
![]() |
1.1 | 145 | |
| |
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] | ||
![]() |
1.1 | 152 | |
| |
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 | }}} | ||
![]() |
1.1 | 158 | |
| |
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. |
![]() |
1.1 | 160 | |
| |
7.2 | 161 | == Server == |
![]() |
1.1 | 162 | |
| |
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. |
![]() |
1.1 | 164 | |
| |
7.2 | 165 | **Deployment bei Codeänderungen** (manuell auf dem Server auszuführen): |
![]() |
1.1 | 166 | |
| |
7.2 | 167 | {{{sudo -u www-data git pull |
| 168 | docker compose up -d --build | ||
| 169 | }}} | ||
![]() |
1.1 | 170 | |
| |
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). |
![]() |
1.1 | 172 | |
| |
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. |
![]() |
1.1 | 174 | |
| |
7.2 | 175 | == Hinweise == |
![]() |
1.1 | 176 | |
| |
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. |
