feat(repairs): add repair estimates

This commit is contained in:
Schubert Ferenc 2026-07-05 00:57:02 +02:00
parent 6e7e75f864
commit 4436fe5f73
25 changed files with 1802 additions and 9 deletions

View file

@ -380,6 +380,66 @@ RBAC:
Athena ruft diese Endpunkte ausschliesslich ueber `/api/repairs/[id]/documents...` auf. Mutierende Requests verwenden den Same-Origin-Schutz.
### Kostenvoranschläge
Ab v0.8.6 verwaltet Olympus Kostenvoranschlaege direkt im Repair-Modul. Es gibt keinen Kundenlogin und keine neue Website-App. Kundenentscheidungen laufen ueber den bestehenden sicheren Public-Statuslink.
Datenmodell:
- `repair_estimates`
- `repair_estimate_items`
- `repair_estimate_events`
Kostenvoranschlagsnummern folgen `KV<jahr>-000001`. Positionstypen sind `labor`, `part`, `flat_rate`, `shipping` und `other`. Statuswerte sind `draft`, `sent`, `approved`, `declined`, `expired` und `cancelled`.
Hermes berechnet alle Summen serverseitig:
- `subtotal_cents` aus Positionen
- `tax_cents` aus `tax_rate_percent`
- `total_cents` als Summe aus netto und Steuer
Interne Hermes-Endpunkte:
- `GET /repairs/{repair_id}/estimates`
- `POST /repairs/{repair_id}/estimates`
- `GET /repairs/{repair_id}/estimates/{estimate_id}`
- `PUT /repairs/{repair_id}/estimates/{estimate_id}`
- `DELETE /repairs/{repair_id}/estimates/{estimate_id}`
- `POST /repairs/{repair_id}/estimates/{estimate_id}/send`
- `POST /repairs/{repair_id}/estimates/{estimate_id}/cancel`
- `GET /repairs/{repair_id}/estimates/{estimate_id}/events`
RBAC:
- `repair_estimates.read`
- `repair_estimates.create`
- `repair_estimates.update`
- `repair_estimates.delete`
- `repair_estimates.send`
Administrator bekommt alle Rechte. Management und Technik bekommen Lesen/Erstellen/Bearbeiten/Senden. Support bekommt Lesen/Senden.
Public API:
- `GET /public/repairs/status/{token}` liefert bei aktivem gesendetem KV ein Feld `estimate`.
- `POST /public/repairs/status/{token}/estimate/approve`
- `POST /public/repairs/status/{token}/estimate/decline`
- `POST /public/repairs/status/{token}/estimate/question`
Die Public-Antwort enthaelt keine internen Notizen, keine internen Events und keine Tokens. Bei Freigabe setzt Olympus den KV auf `approved` und den Reparaturstatus auf `approved`. Bei Ablehnung oder Rueckfrage bleibt der Prozess bei `waiting_for_customer`.
Der KV-Versand nutzt die bestehende SMTP-Konfiguration aus `system_settings` mit Env-Fallback. Fehler beim Mailversand zerstoeren den KV nicht; der Versandversuch wird als Notification Event dokumentiert.
Nicht enthalten in v0.8.6:
- PDF-Erzeugung
- Lexoffice
- Rechnungserstellung
- Kundenlogin
- Anzeige/Freigabe in der oeffentlichen Website
Die Website kann spaeter, z. B. in `funktechnik-schubert-website` v0.4.3, die bereits vorhandenen Public-API-Daten anzeigen und die Entscheidungsendpunkte aufrufen.
### Website Repair Intake
Hermes stellt `POST /public/repair-intake` fuer eine spaetere serverseitige Website-Anbindung bereit.