An
fahrten

Kimai plugin for trips and travel costs. Log trips, let them be detected from your Dawarich GPS history, and get the yearly summary for the German tax return, for the self-employed and for employees.

Kimai-Plugin für Fahrten und Fahrtkosten. Fahrten erfassen, aus der GPS-Historie von Dawarich erkennen lassen und am Jahresende die Aufstellung für die Steuererklärung bekommen, für Selbstständige und für Arbeitnehmer.

git clone https://github.com/shrippen/kimai-anfahrten.git var/plugins/MileageBundle && bin/console kimai:reload -n && bin/console kimai:bundle:mileage:install

Needs Kimai 2.64 or newer (tested with 2.67) and PHP 8.1 or newer. In Docker, run the two bin/console commands as docker exec -it CONTAINER /opt/kimai/bin/console …. To update: git pull in the plugin folder, then the same two commands.

Braucht Kimai 2.64 oder neuer (getestet mit 2.67) und PHP 8.1 oder neuer. In Docker führst du die beiden bin/console-Befehle als docker exec -it CONTAINER /opt/kimai/bin/console … aus. Zum Aktualisieren: git pull im Plugin-Ordner, danach dieselben zwei Befehle.

The Fahrten page in Kimai: trips of the month with type, vehicle, route, km and project, and the running totalsThe Fahrten page in Kimai: trips of the month with type, vehicle, route, km and project, and the running totals
Note: A calculation aid without guarantee, not tax advice. Check the rates in the system settings. The Dawarich connection is tested against a simulated Dawarich, not yet against a real instance.Hinweis: Eine Berechnungshilfe ohne Gewähr, keine Steuerberatung. Prüfe die Sätze in den Systemeinstellungen. Die Dawarich-Anbindung ist gegen ein simuliertes Dawarich getestet, noch nicht gegen eine echte Instanz.
2Tax profiles: self-employed and employeeSteuerprofile: selbstständig und angestellt
3Trip types: commute, business, privateFahrtarten: Arbeitsweg, Dienstreise, privat
PDFYearly tax report and logbookJahres-Steuerbericht und Fahrtenbuch
GPL-3Open sourceOpen Source
TripsFahrten

Log every trip

Jede Fahrt erfassen

Type, vehicle, plate, start and destination, km, return trip, overnight stay, costs, project and reason. Log a trip right from a timesheet entry, or create commutes from days with working time.

Art, Fahrzeug, Kennzeichen, Start und Ziel, km, Hin- und Rückfahrt, Übernachtung, Kosten, Projekt und Anlass. Eine Fahrt direkt am Zeiteintrag erfassen oder Arbeitswege aus Tagen mit Arbeitszeit erzeugen.

Dawarich

Trips detected for you

Fahrten werden erkannt

Stops and movements in your Dawarich history become trip suggestions. Home to office is suggested as a commute, trips around a customer’s timesheet entry as a business trip with project.

Stopps und Bewegungen aus deinem Dawarich-Verlauf werden zu Fahrtvorschlägen. Zuhause ↔ Büro wird als Arbeitsweg vorgeschlagen, Fahrten rund um einen Zeiteintrag beim Kunden als Dienstreise mit Projekt.

VehiclesFahrzeuge

Logbook per vehicle

Fahrtenbuch pro Fahrzeug

Vehicles with plate, owner, odometer and usage period. The logbook checks for odometer gaps and missing details, and exports as CSV or print/PDF.

Fahrzeuge mit Kennzeichen, Halter, km-Stand und Nutzungszeitraum. Das Fahrtenbuch prüft auf km-Stand-Lücken und fehlende Angaben und lässt sich als CSV oder Druck/PDF ausgeben.

RentalsMietwagen

Rental cars split by km

Mietwagen nach km verteilt

Rental and fuel costs are spread over all rental trips in the period by km. Only the share of business trips is deductible.

Miet- und Tankkosten werden auf alle Mietwagen-Fahrten im Zeitraum nach km verteilt. Abziehbar ist nur der Anteil der Dienstreisen.

TaxSteuer

Yearly tax summary

Jährliche Steueraufstellung

Commuting allowance with the rates of each year, business trip costs, meal allowance and private use of business vehicles, in the browser and as PDF, with a plausibility check.

Entfernungspauschale mit den Sätzen des jeweiligen Jahres, Dienstreisekosten, Verpflegungsmehraufwand und Privatnutzung betrieblicher Fahrzeuge, im Browser und als PDF, mit Plausibilitätsprüfung.

Team

Month closing and approval

Monatsabschluss und Freigabe

Close a month so it only changes with a special permission, with a change log for every trip. Optionally, team leads approve or reject a submitted month with a reason.

Einen Monat abschließen, damit er sich nur mit Sonderrecht ändert, mit Änderungsprotokoll für jede Fahrt. Optional geben Teamleitungen einen eingereichten Monat frei oder weisen ihn mit Begründung zurück.

Dawarich

Confirm instead of typing

Bestätigen statt abtippen

Dawarich keeps your location history. The plugin reads it, separates stops from movements and puts every trip into an inbox. Pick type and vehicle, then accept, edit or dismiss. Nothing becomes a trip until you accept it.

Dawarich speichert deinen Standortverlauf. Das Plugin liest ihn, trennt Stopps von Bewegungen und legt jede Fahrt in einen Eingang. Art und Fahrzeug wählen, dann übernehmen, bearbeiten oder verwerfen. Erst dann wird daraus eine Fahrt.

  • Walks, runs and bike rides are left out using Dawarich’s transport mode; for train, bus or motorcycle the matching vehicle is suggested
  • Places (home, work, customer) set up by hand or taken from Dawarich areas, with optional address lookup via Nominatim or Photon
  • Measure the distance for a time window from GPS points, with a map preview of the route
  • A nightly cron job detects the trips of the last two days for everyone with Dawarich access
  • Fuß-, Lauf- und Radwege fallen über den Transportmodus von Dawarich heraus; bei Bahn, Bus oder Motorrad wird das passende Verkehrsmittel vorgeschlagen
  • Orte (Zuhause, Arbeit, Kunde) von Hand anlegen oder aus Dawarich-Areas übernehmen, optional mit Adressauflösung über Nominatim oder Photon
  • Die Strecke für ein Zeitfenster aus GPS-Punkten messen, mit Kartenvorschau der Route
  • Ein nächtlicher Cronjob erkennt die Fahrten der letzten zwei Tage für alle mit Dawarich-Zugang
Erkannte Fahrten: open suggestions with date, route, km, project, trip type and vehicle, and buttons to accept, edit or dismissErkannte Fahrten: open suggestions with date, route, km, project, trip type and vehicle, and buttons to accept, edit or dismiss
Detected trips waiting for confirmation (demo data)Erkannte Fahrten warten auf Bestätigung (Demodaten)
LogbookFahrtenbuch

A logbook per vehicle

Ein Fahrtenbuch pro Fahrzeug

For the logbook method, every vehicle gets its own book per year. The plugin checks the odometer for gaps, points out missing details and keeps a change log for every trip, so later edits stay traceable.

Für die Fahrtenbuchmethode bekommt jedes Fahrzeug ein eigenes Buch pro Jahr. Das Plugin prüft den km-Stand auf Lücken, weist auf fehlende Angaben hin und führt für jede Fahrt ein Änderungsprotokoll, damit spätere Änderungen nachvollziehbar bleiben.

  • Company car, business asset, 1 % rule or logbook method per vehicle
  • Receipts (PDF, photos) attached to trips and rentals
  • CSV and print/PDF per vehicle and year
  • Firmenwagen, Betriebsvermögen, 1-%-Regel oder Fahrtenbuchmethode pro Fahrzeug
  • Belege (PDF, Fotos) zu Fahrten und Mietvorgängen
  • CSV und Druck/PDF pro Fahrzeug und Jahr
The logbook of one vehicle for a yearThe logbook of one vehicle for a year
Logbook per vehicle and year (demo data)Fahrtenbuch pro Fahrzeug und Jahr (Demodaten)
TaxSteuer

The numbers for your tax return

Die Zahlen für die Steuererklärung

Each user picks a tax profile: self-employed (business expenses, EÜR) or employee (income-related expenses, Anlage N). The yearly report adds up what you can claim and flags what looks wrong.

Jeder Nutzer wählt ein Steuerprofil: selbstständig (Betriebsausgaben, EÜR) oder Arbeitnehmer (Werbungskosten, Anlage N). Der Jahresbericht rechnet zusammen, was du ansetzen kannst, und markiert, was nicht stimmig aussieht.

  • Commuting allowance with each year’s rates: up to 2025 €0.30, from km 21 €0.38; from 2026 €0.38 from the first km; once per day, €4,500 cap without a car
  • Business trips: own car €0.30/km, motorcycle €0.20/km, otherwise actual costs
  • Meal allowance (€14/€28), including multi-day trips and the three-month rule
  • Self-employed: private use of business vehicles (1 % rule with EV and hybrid factor, 0.03 % home–work surcharge, or share from the logbook)
  • Plausibility check: commutes without working time, on weekends, on vacation or sick days (with the Working Hours & Holidays plugin), missing details, open months
  • Customer overview: business trips per customer with km and costs, to put on an invoice
  • Entfernungspauschale mit den Sätzen des jeweiligen Jahres: bis 2025 0,30 €, ab km 21 0,38 €; ab 2026 0,38 € ab dem ersten km; einmal pro Tag, 4.500-€-Deckel ohne PKW
  • Dienstreisen: eigener PKW 0,30 €/km, Motorrad 0,20 €/km, sonst tatsächliche Kosten
  • Verpflegungsmehraufwand (14 €/28 €), inklusive mehrtägiger Reisen und Dreimonatsfrist
  • Selbstständige: Privatnutzung betrieblicher Fahrzeuge (1-%-Regel mit E-Auto- und Hybrid-Faktor, 0,03-%-Zuschlag Wohnung–Betrieb, oder Anteil nach Fahrtenbuch)
  • Plausibilitätsprüfung: Arbeitswege ohne Arbeitszeit, am Wochenende, an Urlaubs- oder Krankheitstagen (mit dem Plugin Arbeitszeiten & Feiertage), fehlende Angaben, offene Monate
  • Kundenübersicht: Dienstreisen je Kunde mit km und Kosten, zum Übertragen in eine Rechnung
Fahrtkosten (Steuer): plausibility check, commuting allowance, business trips per vehicle, meal allowance and the totalFahrtkosten (Steuer): plausibility check, commuting allowance, business trips per vehicle, meal allowance and the total
Yearly tax report (demo data)Jährlicher Steuerbericht (Demodaten)
Team

Approval by the team lead

Freigabe durch die Teamleitung

If you switch it on, employees submit a month and their team lead approves it or sends it back with a reason. The team report shows trips, business km, commutes and the estimated deductible amount per person.

Wenn du es einschaltest, reichen Mitarbeiter einen Monat ein, und die Teamleitung gibt ihn frei oder schickt ihn mit Begründung zurück. Der Teambericht zeigt Fahrten, dienstliche km, Arbeitswege und den geschätzt abziehbaren Betrag pro Person.

  • Team leads only see members of their own teams
  • Approval is off by default and switched on under System → Settings
  • Teamleitungen sehen nur ihre eigenen Teammitglieder
  • Die Freigabe ist standardmäßig aus und wird unter System → Einstellungen eingeschaltet
Fahrten Team: one row per team member with trips, business km, commutes, private km, deductible estimate and statusFahrten Team: one row per team member with trips, business km, commutes, private km, deductible estimate and status
Team report with approval status (demo data)Teambericht mit Freigabestatus (Demodaten)

How it works

So funktioniert es

The plugin adds its own Fahrten section to the Kimai sidebar, right under time tracking. It reads your timesheets to match trips to projects and working days, and keeps trips, vehicles and places in its own tables.

Das Plugin bringt einen eigenen Bereich Fahrten in die Kimai-Seitenleiste, direkt unter der Zeiterfassung. Es liest deine Zeiteinträge, um Fahrten Projekten und Arbeitstagen zuzuordnen, und hält Fahrten, Fahrzeuge und Orte in eigenen Tabellen.

DawarichGPS history, areas, transport modesGPS-Verlauf, Areas, Transportmodi
SuggestionsVorschlägeStops and movements, matched to places and timesheetsStopps und Bewegungen, abgeglichen mit Orten und Zeiteinträgen
TripsFahrtenAccepted, logged by hand, imported or sent via APIÜbernommen, von Hand erfasst, importiert oder per API
ReportsBerichteLogbook, tax report, customer overview, teamFahrtenbuch, Steuerbericht, Kundenübersicht, Team

Install

Installation

  1. Clone the plugin into var/plugins/MileageBundle; the folder name must stay MileageBundle.
  2. Run bin/console kimai:reload -n and bin/console kimai:bundle:mileage:install. The install command creates the tables and copies the map library (Leaflet).
  3. Check the permissions under System → Roles, section Fahrten.
  4. Under Profile → Settings, set your tax profile, home and work address, distance, default vehicle and, if you use it, the Dawarich URL and API key.
  5. Optionally add vehicles, take over places from Dawarich areas and schedule the detection: 0 3 * * * bin/console kimai:bundle:mileage:suggest.
  1. Klone das Plugin nach var/plugins/MileageBundle; der Ordnername muss MileageBundle bleiben.
  2. Führe bin/console kimai:reload -n und bin/console kimai:bundle:mileage:install aus. Der Installationsbefehl legt die Tabellen an und kopiert die Kartenbibliothek (Leaflet).
  3. Prüfe die Rechte unter System → Rollen, Abschnitt Fahrten.
  4. Unter Profil → Einstellungen Steuerprofil, Wohn- und Arbeitsadresse, Entfernung, Standardfahrzeug und, falls genutzt, Dawarich-URL und API-Key eintragen.
  5. Optional Fahrzeuge anlegen, Orte aus Dawarich-Areas übernehmen und die Erkennung einplanen: 0 3 * * * bin/console kimai:bundle:mileage:suggest.

The official Kimai Docker image has no cron, so schedule the command on the host with docker exec. Rates, geocoding server, map tiles, team approval and detection sensitivity are set under System → Settings.

Das offizielle Kimai-Docker-Image hat keinen Cron, plane den Befehl also auf dem Host mit docker exec ein. Sätze, Geocoding-Server, Kartenkacheln, Freigabe durch die Teamleitung und Empfindlichkeit der Erkennung stellst du unter System → Einstellungen ein.

Permissions

Rechte

PermissionRechtPurposeZweckDefaultStandard
mileageTrips, reports, settingsFahrten, Berichte, Einstellungeneveryonealle
edit_own_mileage / delete_own_mileageOwn tripsEigene Fahrteneveryonealle
lock_mileageClose or submit own monthsEigene Monate abschließen oder einreicheneveryonealle
view_team_mileage / approve_mileageSee and approve team membersTeammitglieder sehen und freigebenteam leadTeamleitung
view_other_mileage / edit_other_mileage / delete_other_mileage / approve_other_mileageAll usersAlle NutzerAdmin
unlock_mileage / edit_locked_mileageReopen months, change closed monthsMonate wieder öffnen, in abgeschlossenen Monaten ändernAdmin

Questions

Fragen

Do I need Dawarich?Brauche ich Dawarich?

No. Without it you log trips by hand, from a timesheet entry, by CSV import or through the API. Dawarich only adds the automatic detection and the distance from GPS.

Nein. Ohne Dawarich erfasst du Fahrten von Hand, am Zeiteintrag, per CSV-Import oder über die API. Dawarich bringt nur die automatische Erkennung und die Strecke aus GPS dazu.

Is this tax advice?Ist das eine Steuerberatung?

No. It is a calculation aid without guarantee. The rates follow German tax law as of 2026 and can be changed in the settings. Check the result before you file it.

Nein. Es ist eine Berechnungshilfe ohne Gewähr. Die Sätze folgen dem deutschen Steuerrecht mit Stand 2026 und lassen sich in den Einstellungen ändern. Prüfe das Ergebnis, bevor du es einreichst.

Does my location history leave my server?Verlässt mein Standortverlauf meinen Server?

The plugin talks to your own Dawarich instance. Only if you turn on address lookup does it ask a geocoding server (Nominatim or Photon, which you can host yourself), and map tiles are loaded only if a tile server is set.

Das Plugin spricht mit deiner eigenen Dawarich-Instanz. Nur wenn du die Adressauflösung einschaltest, fragt es einen Geocoding-Server (Nominatim oder Photon, beide selbst hostbar), und Kartenkacheln werden nur geladen, wenn ein Kachel-Server eingetragen ist.

Why is it called MileageBundle in Kimai?Warum heißt es in Kimai MileageBundle?

MileageBundle is the technical plugin ID, and the folder under var/plugins must use it. The project and the menu are called Anfahrten and Fahrten.

MileageBundle ist die technische Plugin-ID, und der Ordner unter var/plugins muss so heißen. Das Projekt und das Menü heißen Anfahrten bzw. Fahrten.