Files
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

71 lines
2.5 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Datiert ALLE vorhandenen Touren auf den heutigen Tag um.
#
# Zweck: nach `seed_demo_data.sh 2026-06-01` (oder Touren aus dem ERP-Sync
# mit anderem Datum) holt dieses Skript alle Touren auf CURRENT_DATE, damit
# die App sie als „heutige Tour" anzeigt.
#
# WICHTIG: ersetzt, fügt nichts hinzu.
# * Es werden KEINE neuen Touren angelegt.
# * Bestehende Lieferungen / Items / Notizen / Scans bleiben erhalten —
# nur `tour_date` (und `synced_at`) der Tour selbst wandert auf heute.
#
# Sonderfall mehrere Touren pro Account: die Tabelle hat
# `UNIQUE (account_id, tour_date)`. Hätte ein Account mehrere Touren an
# verschiedenen Tagen, würde ein pauschales Umdatieren den Constraint
# verletzen. Deshalb behalten wir pro Account die jüngste Tour
# (tour_date, dann synced_at, dann id als Tie-Break) und löschen die
# älteren Duplikate (CASCADE räumt deren Lieferungen).
#
# Aufruf:
# ./tool/reseed_today.sh
set -euo pipefail
CONTAINER="${CONTAINER:-holzleitner-postgres}"
DB_USER="${DB_USER:-holzleitner}"
DB_NAME="${DB_NAME:-holzleitner}"
if ! docker inspect "$CONTAINER" >/dev/null 2>&1; then
echo "✗ Container '$CONTAINER' läuft nicht. Starte docker compose up -d." >&2
exit 1
fi
echo "→ Alle Touren auf heute (CURRENT_DATE) umdatieren …"
docker exec -i "$CONTAINER" psql -U "$DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1 -q <<'SQL'
BEGIN;
-- ── 1. Duplikate pro Account abräumen ────────────────────────────────
-- Pro account_id genau die jüngste Tour behalten; ältere löschen, damit
-- das anschließende Umdatieren nicht in die UNIQUE(account_id, tour_date)-
-- Constraint läuft. CASCADE räumt deliveries → items → scans → notes.
DELETE FROM tours t
USING tours newer
WHERE t.account_id = newer.account_id
AND (newer.tour_date, newer.synced_at, newer.id)
> (t.tour_date, t.synced_at, t.id);
-- ── 2. Verbleibende Touren auf heute datieren ────────────────────────
-- Nach Schritt 1 gibt es pro Account genau eine Tour → kein Constraint-
-- Konflikt. Touren, die bereits heute liegen, sind ein No-Op.
UPDATE tours
SET tour_date = CURRENT_DATE,
synced_at = NOW();
COMMIT;
\echo
\echo --- TOUREN (jetzt alle heute) ---
SELECT t.account_id,
t.tour_date,
COUNT(d.id) AS lieferungen
FROM tours t
LEFT JOIN deliveries d ON d.tour_id = t.id
GROUP BY t.account_id, t.tour_date
ORDER BY t.account_id;
SQL
echo "✓ Alle Touren auf heute umdatiert."