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>
44 lines
1.8 KiB
SQL
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);
|