No description
Find a file
holzi1005 2e70b0b32d
All checks were successful
Build / release (push) Successful in 30s
Build / Container Image (push) Successful in 39s
add logging
2026-03-21 09:32:16 +01:00
.forgejo/workflows update action 2026-02-22 08:52:34 +01:00
.idea init 2026-02-21 11:17:29 +01:00
cmd/sync test with request state.go 2026-02-25 13:48:49 +01:00
doc update README with images 2026-02-22 08:57:33 +01:00
internal add logging 2026-03-21 09:32:16 +01:00
.gitignore update build 2026-02-21 12:38:16 +01:00
config.yaml.example Set default insecure to false 2026-02-22 23:18:53 +01:00
docker-compose.yaml fix clinet 2026-02-21 14:05:12 +01:00
Dockerfile add License and fix leistungszeitraum 2026-02-21 15:40:01 +01:00
go.mod add default sync options 2026-02-21 12:06:20 +01:00
go.sum fix go.sum 2026-02-21 12:06:56 +01:00
LICENSE add License and fix leistungszeitraum 2026-02-21 15:40:01 +01:00
Makefile init 2026-02-21 11:17:29 +01:00
README.md (MAJOR) Update Readme 2026-03-10 11:41:12 +01:00

Kimai ↔ Easybill Sync

Synchronisiert Zeiteinträge aus Kimai automatisch als Positionen in Easybill-Entwurfsrechnungen.

Features

  • Rate Limiting: Respektiert das Easybill-Limit von 60 Requests/Stunde (Token-Bucket-Algorithmus)
  • Idempotenz: Bereits synchronisierte Einträge werden übersprungen (State-Datei)
  • Automatische Dokumentgruppierung: Pro Kunde und Monat wird ein Entwurfsdokument angelegt/gefunden
  • Flexibler Betrieb: Einmaliger Lauf, Zeitraum-Sync oder Daemon-Modus
  • Kimai-Export-Markierung: Synchronisierte Einträge werden in Kimai als exportiert markiert

Screenshots

Entwurf einer Rechnung in Easybill

invoice_draft_2.png

Überwicht einer Rechnung mit Gruppierung

invoice_grouped_position.png

Voraussetzungen

  • Go 1.21+
  • Kimai API-Token (Profil → API-Token)
  • Easybill API-Key (Einstellungen → API)

Installation

git clone ...
cd kimai-easybill-sync
make build

Konfiguration

config.yaml.example nach config.yaml kopieren und anpassen:

kimai:
  base_url: "https://deine-kimai-instanz.de"
  api_token: "dein_kimai_token"

easybill:
  api_key: "dein_easybill_api_key"
  rate_limit_per_hour: 60

sync:
  initial_days_back: 30
  state_file: "./sync_state.json"
  timezone: "Europe/Berlin"

customer_mapping:
  - kimai_customer_id: 1
    # kein grouping    → Standard: per_day_activity
    # kein default_unit → globaler Default aus sync.default_unit
    # include_task_descriptions: false  # Nur Header + Aktivitätsbeschreibung, keine Task-Liste

Alternativ können Zugangsdaten auch als Umgebungsvariablen gesetzt werden:

export KIMAI_API_TOKEN="..."
export EASYBILL_API_KEY="..."

Verwendung

# Erstmalige Synchronisation (letzten 30 Tage)
./build/kimai-easybill-sync --mode=initial

# Täglicher Sync (gestern)
./build/kimai-easybill-sync --mode=daily

# Bestimmten Zeitraum synchronisieren
./build/kimai-easybill-sync --mode=range --from=2024-01-01 --to=2024-01-31

# Als Daemon laufen lassen (täglich 02:00 Uhr)
./build/kimai-easybill-sync --daemon

# Ausführliche Ausgabe
./build/kimai-easybill-sync --mode=daily --verbose

Cron-Job (empfohlen)

# Täglich um 02:00 Uhr synchronisieren
0 2 * * * /pfad/zu/kimai-easybill-sync --config=/pfad/zu/config.yaml --mode=daily >> /var/log/kimai-sync.log 2>&1
OR
0 2 * * * /pfad/zu/kimai-easybill-sync --config=/pfad/zu/config.yaml --mode=montly >> /var/log/kimai-sync.log 2>&1

Docker

# Image bauen
docker build -t kimai-easybill-sync .

# Als Daemon laufen lassen
docker run -d \
  -v /pfad/zu/config:/app/data \
  --name kimai-sync \
  kimai-easybill-sync

Workflow in Easybill

  1. Sync läuft täglich und erstellt/ergänzt Entwurfsrechnungen pro Kunde und Monat
  2. Am Monatsende prüfst du die Entwurfsrechnung in Easybill
  3. Du passt sie ggf. an und verschickst sie

Projektmapping finden

  • Kimai Projekt-ID: In Kimai unter Projekte → Projekt öffnen → ID in der URL
  • Easybill Kunden-ID: In Easybill unter Kunden → Kunde öffnen → ID in der URL