Changes for page Fuhrpark (Fleet Manager)

Last modified by Patrizia Gurschka on 2026/09/14 07:51

From version 10.1
edited by Patrizia Gurschka
on 2026/09/10 07:35
Change comment: There is no comment for this version
To version 7.1
edited by Dimitri Rupp
on 2026/07/08 13:55
Change comment: There is no comment for this version

Summary

Details

Page properties
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.gurschkap
1 +XWiki.drupp
Content
... ... @@ -1,154 +1,234 @@
1 -|(((
2 -**🚗 Fuhrpark (Fleet Manager)**
1 +{{box cssClass="floatinginfobox" title="**Auf dieser Seite**"}}
2 +{{toc/}}
3 +{{/box}}
3 3  
4 -|(((
5 -**Zweck: **Webbasierte Verwaltung des Firmenfuhrparks — Fahrzeug-/Fahrerstammdaten, Kostenkalkulation, Kilometerauswertung, Ersatzbeschaffungs-Planung (Handlungsbedarf) und monatliche Abrechnung.
5 +**Ablauf Fleet Manager:**
6 6  
7 -**Zielgruppe: **Fuhrpark-/Controlling-Team, Line Manager, IT-Betrieb.
8 -)))
9 9  
10 -
11 -)))|(((
12 -|(((
13 -**Auf dieser Seite**
8 +**~1. Fahrzeuge verwalten**
14 14  
15 -* [[🚗 Fuhrpark (Fleet Manager)>>path:#top]]
16 -** [[Überblick>>path:#ueberblick]]
17 -** [[Architektur>>path:#architektur]]
18 -** [[Technologiestack>>path:#technologiestack]]
19 -** [[Hauptfunktionen>>path:#hauptfunktionen]]
20 -*** [[1. Stammdaten-Import>>path:#hf1]]
21 -*** [[2. Fahrzeug-/Fahrer-Zuordnung>>path:#hf2]]
22 -*** [[3. Kilometer-Erfassung>>path:#hf3]]
23 -*** [[4. Kalkulation>>path:#hf4]]
24 -*** [[5. Handlungsbedarf>>path:#hf5]]
25 -*** [[6. Export & Abrechnung>>path:#hf6]]
26 -** [[Nachvollziehbarkeit & Fehlerbehandlung>>path:#orch]]
27 -** [[Cronjobs & Konfiguration>>path:#konfiguration]]
28 -** [[Sicherheit>>path:#sicherheit]]
29 -*** [[Authentifizierung>>path:#auth]]
30 -*** [[Datenschutz>>path:#datenschutz]]
31 -** [[Besondere Geschäftslogik>>path:#geschaeftslogik]]
32 -** [[Offene Punkte / zu verifizieren>>path:#offene-punkte]]
33 -** [[Server / Umgebung>>path:#server]]
34 -)))
10 +Fahrzeuge werden bis jetzt einmal aus Rimo importiert und dann in der App gepflegt. (Geplant: retour schreiben in Rimo)
35 35  
36 -
37 -)))
38 38  
13 +**Fahrzeug anlegen**
39 39  
15 +1. Menü **„Fahrzeuge“** öffnen
16 +1. Auf **„Fahrzeug hinzufügen“** klicken
17 +1. Pflichtfelder ausfüllen (MAT-ID, Marke, Modell verpflichtend)
18 +1. Fahrer und Line Manager (wird automatisch ergänzt, kann dennoch selbst ausgewählt werden) auswählen
19 +1. Speichern
40 40  
41 -= Überblick =
42 42  
43 -Fuhrpark ist eine FastAPI-Backend- + React-Frontend-Anwendung (migriert von einer Streamlit-Monolith-Anwendung). Die Lösung besteht aus:
44 44  
45 -* Frontend: React 18 · Vite · React Query · Axios-Client (nginx-Reverse-Proxy)
46 -* Backend: FastAPI · SQLite (WAL-Modus) · JWT-Authentifizierung
47 -* Datenquellen: RIMO/SQL-Server (Fahrer-Stammdaten) · Microsoft Fabric (SharePoint, KM-Formular-Mails) · GPS-AT/Tesla-APIs (Kilometerstände)
48 -* Orchestrierung: eigenständige Cron-Skripte auf dem Server, unabhängig vom Docker-Container
23 +**Fahrzeug bearbeiten**
49 49  
50 -= Architektur =
25 +* Fahrzeug auswählen
26 +* Änderungen durchführen
51 51  
52 -[[image:1789018507266-361.png]]
28 +Wenn ein Fahrer nur für einen Zeitraum zugewiesen wird, wird nach diesem Zeitraum wieder der Ursprungsfahrer eingetragen. Wenn kein Enddatum eingetragen wird, bleibt der Fahrer bis etwas geändert wird.
53 53  
54 -//Frontend, Backend und Datenbank laufen im Docker-Compose-Stack; die Cron-Skripte laufen direkt auf dem Host und schreiben in dieselbe fleet.db.//
30 +* Speichern
55 55  
56 -= Technologiestack =
57 57  
58 -**Frontend: **React 18 · Vite · React Router · React Query (TanStack Query) · Axios
59 59  
60 -**Backend: **FastAPI (Python) · SQLite · Pandas · python-jose (JWT) · passlib/bcrypt · pyodbc
34 +**Fahrzeug deaktivieren**
61 61  
62 -**Externe APIs: **RIMO/SQL-Server (ai.sdmperson, rimo.sdmtool) · Microsoft Fabric (SharePoint, KM-Formular-Mails) · GPS-AT- und Tesla-API
36 +* in "bearbeiten" kann das Fahrzeug auf inaktiv gesetzt werden und bleibt in der Tabelle
63 63  
64 -= Hauptfunktionen =
65 65  
66 -~1. Stammdaten-Import
67 67  
68 -Fahrzeuge werden initial aus RIMO importiert und danach in der App gepflegt (Rückschreiben nach RIMO ist geplant, aktuell nicht implementiert). Fahrer werden täglich um 4:00 Uhr gegen RIMO (ai.sdmperson) abgeglichen — Neuanlage bei unbekannter Personalnummer, sonst Aktualisierung von Stammdaten, Kostenstelle und Line Manager. Externe Fahrer können zusätzlich manuell angelegt werden; Stammdaten interner (RIMO-importierter) Fahrer sind schreibgeschützt.
40 +**Fahrzeug archivieren**
69 69  
70 -2. Fahrzeug-/Fahrer-Zuordnung
42 +* Fahrzeug kann archiviert werden, dann wird es automatisch auf inaktiv gesetzt und in der „archivierte Fahrzeuge“ Tabelle angezeigt (dort kann es wieder aktiviert werden)
71 71  
72 -Fahrer und Line Manager können einem Fahrzeug direkt zugewiesen werden (Line Manager wird bei Fahrer-Auswahl automatisch ergänzt, bleibt aber überschreibbar). Befristete Zuordnungen kehren nach Ablauf automatisch zum vorherigen Fahrer zurück. Jede Zuordnungs- sowie Line-Manager-/Kostenstellen-Änderung wird vollständig und zeitlich abgegrenzt protokolliert (vehicle_assignment_history, driver_attribute_history) — sowohl bei manueller Änderung als auch beim täglichen RIMO-Sync.
44 +----
73 73  
74 -3. Kilometer-Erfassung
75 75  
76 -Kilometerstände werden automatisiert importiert: GPS-AT täglich, Tesla wöchentlich, 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. Das KM-Dashboard berücksichtigt bei der Auswertung ausschließlich den Zeitraum, in dem die jeweilige Zuordnung tatsächlich bestand — auch bei unterjährigem Fahrer- oder Line-Manager-Wechsel.
47 +**2. Fahrer verwalten**
77 77  
78 -4. Kalkulation
49 +Fahrer werden jeden Tag um 4:00 in der Früh in Rimo überprüft und wenn notwendig neu angelegt oder bei Veränderungen angepasst.
79 79  
80 -Pro Fahrzeug wird eine Kostenkalkulation aus Anschaffungskosten, laufenden Kosten und Verbrauch/Energiepreisen erstellt (Kosten pro Monat/Jahr/Kilometer). Beim Anlegen werden Default-Parameter aus „Kalkulationsparameter“ nach Fahrzeugtyp übernommen; individuelle Felder werden ergänzt und per „Aktualisieren“ neu berechnet. Änderungen an Kalkulationsparametern wirken sich auf alle Fahrzeuge des jeweiligen Typs aus (Rollen admin/demo/controlling).
81 81  
82 -5. Handlungsbedarf
52 +**Fahrer anlegen (extern)**
83 83  
84 -Hochrechnungen werden bei jedem KM-Stand-Import neu berechnet. Ein bestelltes Fahrzeug wird über das Häkchen „Bestellt“ markiert, erst danach anlegbar. Nach Anlage steht „Geliefert“ zur Verfügung; sobald gesetzt, entfällt das Fahrzeug automatisch aus der Handlungsbedarfsliste. Ein gesetztes „Deactivation Date“ deaktiviert und archiviert ein Fahrzeug automatisch zum entsprechenden Datum.
54 +1. Menü **„Fahrer“** öffnen
55 +1. Auf **„Fahrer hinzufügen“** klicken
56 +1. Stammdaten eingeben
57 +1. Speichern
85 85  
86 -6. Export & Abrechnung
87 87  
88 -Monatliche Abrechnungen und Kostenstellen-Umbuchungen werden auf Klick erstellt und als CSV exportiert. Die vollständige Fahrzeugliste (inkl. kompletter Kalkulationsaufschlüsselung) sowie gefahrene Kilometer können als Excel-Datei heruntergeladen werden.
89 89  
90 -= Nachvollziehbarkeit & Fehlerbehandlung =
61 +**Fahrer bearbeiten**
91 91  
92 -Ändert sich der Line Manager eines Fahrers — manuell oder über den täglichen Cron-Sync — wird nicht nur drivers.user_id aktualisiert, sondern auch jede betroffene vehicle_assignment_history-Zeile korrekt geschlossen und neu angelegt. Ohne diesen Schritt bliebe ein Fahrzeug fälschlich sowohl beim alten als auch beim neuen Line Manager sichtbar (historisch aufgetretener Fehler, mittlerweile behoben und mit einem Reparatur-Skript für Altfälle nachgezogen).
63 +* Stammdaten ändern (nur bei extern)
93 93  
94 -[[image:1789018507268-395.png]]
65 +----
95 95  
96 -//Ablauf bei einem Line-Manager-Wechsel, inkl. Absicherung gegen doppelte Sichtbarkeit.//
97 97  
98 -= Cronjobs & Konfiguration =
68 +**3. Kilometer-Daten**
99 99  
100 -|**Bereich**|**Details**
101 -|Täglicher Fahrer-Sync|1_import_users_drivers.py, 4:00 Uhr — Fahrer-Stammdaten, Line Manager, Kostenstelle gegen RIMO (ai.sdmperson) abgleichen
102 -|KM-Import gpsat|import_km.py gpsat, täglich 4:00 Uhr, jeweils zum Monatsende
103 -|KM-Import Tesla|import_km.py tesla, montags 4:00 Uhr, jeweils zum Monatsende
104 -|SharePoint-Erinnerung|3 Tage vor Monatsende täglich, wenn kein KM-Stand in der SharePoint-Liste vorhanden ist
105 -|Docker Compose|Services backend (FastAPI) + frontend (nginx + React-Build)
106 -|Datenbank|SQLite, WAL-Modus, data/fleet.db (Projekt-Root, nicht in Git)
107 -|Reparatur-Skript|repair_stale_line_manager_assignments.py — einmalig, bei Altlasten vor dem Line-Manager-Fix
70 +* Kilometerstände werden automatisch importiert (z. B. GPS / Tesla)
71 +** gpsat täglich um 4:00
72 +** tesla montags 4:00
73 +** beides jeweils Ende des Monats
74 +** Erinnerungsmail wird 3 Tage von Ende des Monats täglich ausgeschickt, wenn kein KM Stand in der Sharepoint Liste vorhanden ist. Sobald die Liste vollständig ist, wird sie auf die App übertragen.
108 108  
109 109  
110 110  
111 -= Sicherheit =
78 +* Das System berechnet:
79 +** Differenzen
80 +** Jahreskilometer
81 +** aktuelle Laufleistung
112 112  
113 -Authentifizierung
114 114  
115 -* JWT (python-jose), OAuth2-Password-Flow, 8-Stunden-Tokens
116 -* Rollen: admin, demo, controlling, Benutzer (Line Manager/Fahrer)
117 -* Zugriff auf Fahrzeug-Zuweisungshistorie und rohe KM-Ablesungen ist admin/demo vorbehalten — serverseitig abgesichert (403), nicht nur im Frontend versteckt
118 118  
119 -Datenschutz
85 +Diese Daten sind im **KM-Dashboard** einsehbar.
120 120  
121 -Sichtbarkeit von Fahrzeugen und Fahrern für normale Nutzer richtet sich ausschließlich nach der Line-Manager-Zuordnung. Passwörter sowie SQL-Server-/Fabric-Zugangsdaten liegen in nicht versionierten .env-Dateien (Docker-.env für Secrets der App, backend/.env für die Cron-Skripte).
87 +----
122 122  
123 -= Besondere Geschäftslogik =
124 124  
125 -* **Zeitzonen-Korrektur: **sync_vehicle_assignment() vergleicht mit datetime('now','localtime') statt datetime('now') — SQLite liefert sonst UTC, während alle gespeicherten Zeitstempel lokale Zeit sind. Ohne die Korrektur blieb eine gerade beendete Zuordnung bis zu 1–2 Stunden fälschlich „aktiv“.
126 -* **Import-Marker: **Historienzeilen aus der einmaligen Erstbefüllung (changed_by='import') zeigen in der Zuordnungs-Anzeige bewusst kein Startdatum („– 20.04.2026“ statt „28.02.2026 – 20.04.2026“), da dieses Datum nur den Zeitpunkt des Imports, nicht den echten historischen Beginn widerspiegelt.
127 -* **Odometer vs. Jahreskilometer: **vehicles.current_km speichert die im laufenden Kalenderjahr gefahrenen Kilometer (Vergleichswert zu „Max. KM/Jahr“), nicht den tatsächlichen Tacho-Stand. Für die Anzeige des echten Kilometerstands wird stattdessen die letzte Ablesung aus der KM-Historie herangezogen (latest_odometer_km).
128 -* **Zuordnungsende “heute“: **Wird als Enddatum das aktuelle Datum gewählt, wird als Enddatum bewusst der Vortag (23:59:59) gespeichert — damit gilt die Zuordnung ab exakt Mitternacht des gewählten Tages als beendet, ohne Sekundenpräzision oder Sonderfall im Code.
90 +**4. Kalkulation**
129 129  
130 -|(((
131 -**⚠️  Offene Punkte / zu verifizieren**
92 +Für jedes Fahrzeug kann eine Kostenkalkulation durchgeführt werden:
132 132  
133 -* Flottenweite Reaktivierung in apply_due_deactivations(): Die automatische Reaktivierung („kein Deactivation Date mehr“) wirkt aktuell auf ALLE Fahrzeuge mit deactivation_date=NULL, nicht nur auf das gerade bearbeitete — kann manuell archivierte Fahrzeuge versehentlich mit reaktivieren. Fix identifiziert (Reaktivierung auf die eine Fahrzeug-ID scopen), Umsetzung noch ausständig.
134 -* Genaues Schema von rimo.sdmtool (Spaltennamen name/last_update) ist aus einer Beschreibung übernommen, nicht 1:1 gegen die echte Tabelle verifiziert.
135 -* Kein bestätigtes automatisches Backup der Produktivdatenbank gefunden — falls vorhanden, läuft es außerhalb des Anwendungscodes; sollte auf dem Server verifiziert werden.
136 -* Exakte SharePoint-/Fabric-Spaltennamen (SP_LIST_ITEMS_URL u. Ä.) sollten einmalig gegen die reale Liste geprüft werden.
137 -)))
94 +* Anschaffungskosten
95 +* Laufende Kosten (Versicherung, Wartung etc.)
96 +* Verbrauch & Energiepreise
138 138  
139 139  
140 140  
141 -= Server / Umgebung =
100 +Ergebnisse:
142 142  
143 -Die App läuft auf 192.168.208.2, per Docker Compose (Services backend + frontend), und liegt unter /mnt/data/fleet-manager/fuhrpark.
102 +* Kosten pro Monat
103 +* Kosten pro Jahr
104 +* Kosten pro Kilometer
144 144  
145 -**Deployment bei Codeänderungen** (manuell auf dem Server auszuführen):
146 146  
147 -sudo -u www-data git pull
148 148  
149 -docker compose up -d ~-~-build
108 +Wenn ein Fahrzeug hinzugefügt wird, werden die Default Parameter aus „Kalkulationsparameter“ nach Typ übernommen. Die 7 fehlenden Felder werden in „Kalkulation“ bei "bearbeiten" eingetragen und beim auf „Aktualisieren“ Drücken werden die Werte berechnet in die Tabelle eingetragen.
150 150  
110 +----
151 151  
152 -**Cronjobs: **sudo -u www-data crontab -e, Logs unter /mnt/data/fleet-manager/fuhrpark/logs.
153 153  
154 -Erreichbar unter http:~/~/fleetmanager.spl-tele.com:8501 — mit VPN und im SPL-TELE-Netzwerk.
113 +**5. Handlungsbedarf**
114 +
115 +Die Hochrechnungen in Handlungsbedarf werden immer neu berechnet mit den Importen der KM Stände.
116 +
117 +
118 +**Neues Fahrzeug bestellen**
119 +
120 +* Wenn neues Fahrzeug bestellt wurde, muss im Bereich „Handlungsbedarf“ das Häkchen bei „Bestellt“ gesetzt werden.
121 +* Erst danach ist es möglich, ein neues Fahrzeug im System anzulegen.
122 +
123 +
124 +
125 +**Neues Fahrzeug anlegen**
126 +
127 +* Ein Fahrzeug kann erst bearbeitet werden, nachdem es angelegt wurde
128 +* Nach der Anlage steht die Funktion „Geliefert“ zur Verfügung
129 +
130 +
131 +
132 +**Fahrzeug als geliefert markieren**
133 +
134 +* Sobald ein Fahrzeug als „geliefert“ markiert wird:
135 +** wird es automatisch aus der Handlungsbedarfsliste entfernt
136 +** gilt der Beschaffungsprozess als abgeschlossen
137 +
138 +
139 +
140 +**Darstellung im Forecast**
141 +
142 +* Neu hinzugefügte Fahrzeuge (Bereich „Fahrzeuge“)
143 +* sowie im Handlungsbedarf angelegte Fahrzeuge
144 +
145 +werden automatisch im Bereich „Forecast“ angezeigt.
146 +
147 +Zusätzlich gilt:
148 +
149 +* Fahrzeuge aus dem Handlungsbedarf enthalten im Forecast eine
150 +Referenz zum alten (ersetzten) Fahrzeug
151 +
152 +
153 +
154 +**Deaktivierung von Fahrzeugen**
155 +
156 +Wenn im Feld „Deactivation Date“ ein Datum eingetragen wird:
157 +
158 +wird das Fahrzeug ab diesem Datum automatisch:
159 +
160 +* deaktiviert
161 +* in den Bereich „Archivierte Fahrzeuge**“** verschoben
162 +
163 +----
164 +
165 +
166 +**6. Dashboard**
167 +
168 +Das Dashboard zeigt:
169 +
170 +* Anzahl Fahrzeuge
171 +* Kostenübersicht
172 +* relevante Kennzahlen
173 +
174 +Es dient als zentrale Übersicht für den aktuellen Fuhrparkstatus.
175 +
176 +----
177 +
178 +
179 +**7. Benutzerverwaltung (Admin)**
180 +
181 +Admins können:
182 +
183 +* Benutzer anlegen
184 +* Passwörter ändern
185 +* Fahrer und Fahrzeuge zuweisen
186 +
187 +----
188 +
189 +
190 +**8. Kalkulationsparameter**
191 +
192 +Wenn hier etwas angepasst wird, werden die Werte für alle Fahrzeuge dieses Typs abgeändert. Ist dem Controlling vorbehalten.
193 +
194 +----
195 +
196 +
197 +**9. Export & Berichte**
198 +
199 +* Monatliche Abrechnungen und Kostenstellen-Umbuchungen werden auf Klick erstellt
200 +* Export erfolgt als CSV-Datei
201 +* Daten können in Excel weiterverarbeitet werden
202 +* gefahrene KM können als Excel heruntergeladen werden
203 +
204 +----
205 +
206 +
207 +**10. Hinweise**
208 +
209 +* Änderungen im Demo-Modus werden nicht gespeichert
210 +* Benutzerrechte bestimmen die Sichtbarkeit der Daten
211 +* Regelmäßige Datenpflege (z. B. Fahrerzuordnung) ist wichtig für korrekte Auswertungen
212 +
213 +
214 +
215 +
216 +**Fehlerbehebung**
217 +
218 +* **Frontend:** Streamlit
219 +* **Backend:** Python
220 +* **Datenbank:** SQLite
221 +* **Externe APIs:** Microsoft Fabric Integration
222 +
223 +Die App läuft auf 192.168.208.2, in einem Docker und liegt in: /mnt/data/fleet-manager/fuhrpark.
224 +
225 +Falls etwas in Github geändert wird muss der git pull manuell auf dem Server passieren:
226 +
227 +* sudo -u www-data git pull
228 +* docker compose up -d –build
229 +
230 +Es gibt cronjobs in sudo www-data crontab -e, mit logs in /mnt/data/fleet-manager/fuhrpark/logs.
231 +
232 +Erreichbar unter: [[http:~~/~~/fleetmanager.spl-tele.com:8501>>http://fleetmanager.spl-tele.com:8501]] mit VPN und im SPL TELE Netzwerk
233 +
234 +
1789018507266-361.png
Author
... ... @@ -1,1 +1,0 @@
1 -XWiki.gurschkap
Size
... ... @@ -1,1 +1,0 @@
1 -52.2 KB
Content
1789018507268-395.png
Author
... ... @@ -1,1 +1,0 @@
1 -XWiki.gurschkap
Size
... ... @@ -1,1 +1,0 @@
1 -19.7 KB
Content