Files
Holzleitner---Backend--aktu…/migrations/0014_delivery_credit_audit.sql
Dennis Nemec 6a9b5872e1 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>
2026-06-01 17:52:58 +02:00

44 lines
1.8 KiB
SQL

-- 0014_delivery_credit_audit.sql
--
-- Betrags-Gutschrift pro Lieferung (Geld-Nachlass, unabhängig von Stückzahl;
-- ≤150 €, in 10-€-Schritten, Pflichtgrund).
--
-- Append-only Audit-Log — analog scan_audit: jede Änderung (set/remove) ist
-- eine eigene Zeile, nichts wird geupdated/gelöscht. Der "aktuelle" Stand
-- einer Lieferung ist das jüngste Ereignis (DISTINCT ON delivery_id …
-- ORDER BY recorded_at DESC): action='set' → Betrag+Grund, action='remove'
-- → keine Gutschrift.
--
-- Idempotenz: client_event_id ist UNIQUE. Ein Netz-Retry desselben Events
-- kollidiert auf dem Index (INSERT … ON CONFLICT DO NOTHING) — der Server
-- liefert den aktuellen Stand zurück, ohne eine Dublette anzuhängen.
CREATE TABLE delivery_credit_audit (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Idempotenz-Schlüssel vom Client.
client_event_id UUID NOT NULL UNIQUE,
delivery_id UUID NOT NULL REFERENCES deliveries(id) ON DELETE CASCADE,
action TEXT NOT NULL CHECK (action IN ('set', 'remove')),
-- Resultierender Betrag NACH diesem Ereignis (in Cent). 0 bei 'remove'.
-- Harte Obergrenze 150 € als CHECK; die 10-€-Schritt-Regel prüft der
-- Use Case (fachlich, leichter änderbar als ein DB-CHECK).
amount_cents BIGINT NOT NULL DEFAULT 0
CHECK (amount_cents >= 0 AND amount_cents <= 15000),
-- Pflicht bei 'set' (im Use Case erzwungen), bei 'remove' optional.
reason TEXT,
-- Akteur: Personalnummer aus dem JWT (Pflicht), Fahrzeug optional.
author_personalnummer BIGINT NOT NULL,
author_car_id UUID,
recorded_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX delivery_credit_audit_delivery
ON delivery_credit_audit (delivery_id, recorded_at DESC);