Backend-Arbeitsstand: ERP-Sync, Lieferlebenszyklus, Reports + config.toml

Bringt das Backend vom initialen Skeleton auf den aktuellen Arbeitsstand
(Clean Architecture: domain → application → infrastructure → api).

Wesentliche Bereiche:
- ERP-Anbindung (MSSQL-Pull der Touren, Import-Scheduler, Rückschreiben)
- Lieferlebenszyklus: Scan/Hold/Cancel/Complete, Gutschriften, Notizen,
  Bild-Anhänge, Unterschriften, PDF-Lieferreport → DOCUframe
- Stammdaten: Kunden, Artikel, Lager, Zahlungsarten, Services
- Keycloak-JWT-Gate + Fahrer-Provisionierung via Admin-API
- Admin-API-Key-Gate (X-Admin-Api-Key) für Maschinen-Endpunkte

Jüngste Änderungen dieser Session:
- Belegspezifische Kontaktdaten: alle ERP-Adressen (Beleg-/Liefer-/
  Rechnungsadresse, Ansprechpartner, Kundenstamm) mit Telefon/Mobil/
  E-Mail werden gesynct (Migration 0029, MSSQL-Query, TourDetails)
- Konfiguration von .env (envy/dotenvy) auf config.toml (toml/serde)
  umgestellt; Vorlage config.example.toml, Pfad via HOLZLEITNER_CONFIG

Nicht im Repo (per .gitignore): config.toml (Secrets), data/ (Laufzeit-/
Kundendaten), demo.mp4, .claude/, variocontrol-ai/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-06-01 17:52:58 +02:00
parent 438040acce
commit 6a9b5872e1
137 changed files with 13700 additions and 218 deletions

View File

@ -10,8 +10,9 @@ Architecture: `domain` → `application` → `infrastructure` → `api`.
docker compose up -d
# Keycloak braucht ~30s bis "Listening on http://0.0.0.0:8080" im Log steht.
# 2) Env-Datei vorbereiten
cp .env.example .env
# 2) Konfiguration vorbereiten
cp config.example.toml config.toml
# Werte in config.toml anpassen (DB-URL, Keycloak-Issuer, ERP-Zugang, …).
# 3) Backend starten
cargo run -p holzleitner-api
@ -73,14 +74,27 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:3000/accounts/1001
## Konfiguration
Werte werden aus Umgebungsvariablen gelesen (siehe `.env.example`),
gruppiert nach Prefix:
Werte werden aus `config.toml` gelesen (Vorlage: `config.example.toml`),
gruppiert in TOML-Sections. Der Dateipfad ist über die Env-Variable
`HOLZLEITNER_CONFIG` überschreibbar (z. B. im Deployment); Default ist
`config.toml` im Arbeitsverzeichnis. Die echte `config.toml` enthält
Secrets und ist `.gitignore`-t.
| Prefix | Bereich |
|---|---|
| `SERVER_*` | Bind-Host/Port |
| `DATABASE_*` | Postgres-URL, Pool-Größe |
| `KEYCLOAK_*` | OIDC-Issuer, Audience, JWKS-Cache (greift erst in der Keycloak-Phase) |
| Section | Bereich | Pflicht? |
|---|---|---|
| `[server]` | Bind-Host/Port | ja |
| `[database]` | Postgres-URL, Pool-Größe | ja |
| `[keycloak]` | OIDC-Issuer, Audience, JWKS-Cache, Provisioning | ja |
| `[gsd]` | DOCUframe-REST (Datei-Upload) | ja |
| `[erp]` | ERPframe-MSSQL (Touren-Pull) | optional |
| `[import]` | Import-Scheduler (Cron, Offset) | optional |
| `[report]` / `[signature]` / `[attachment]` | Lokale Speicher-Pfade | optional |
| `[dev]` | `today_override`, `sync_enabled` (DEV-ONLY) | optional |
| `[admin]` | `api_key` für das `/admin`-Gate | optional |
| `[logging]` | Log-Filter (Default; `RUST_LOG`-Env hat Vorrang) | optional |
Unbekannte Schlüssel werden beim Laden abgewiesen (`deny_unknown_fields`),
sodass Tippfehler sofort als Startfehler auffallen.
## Migrations
@ -95,5 +109,6 @@ touch migrations/0002_tour.sql
## Logging
`tracing` + `tracing-subscriber` mit `EnvFilter`. Default:
`holzleitner_api=info,tower_http=info`. Override via `RUST_LOG`.
`tracing` + `tracing-subscriber` mit `EnvFilter`. Der Default-Filter steht
in `config.toml` unter `[logging] filter`; die Env-Variable `RUST_LOG` hat
Vorrang (Ad-hoc-Debugging ohne Datei-Edit, z. B. `RUST_LOG=debug cargo run`).