Commit Graph
8 Commits
Author SHA1 Message Date
patrickandClaude Sonnet 5 c3f141f7b0 feat(objekt): letzte abgeschlossene Kontrolle je Objekt anzeigen
CI / backend-tests (push) Failing after 1m28s
CI / frontend-build (push) Successful in 17s
Bisher nirgends vermerkt/abrufbar, wann ein Objekt zuletzt komplett
kontrolliert wurde (nur roh in kontrolle.beendet_am ableitbar). Neues Feld
ObjektRead.letzte_kontrolle_am (jüngste Kontrolle mit status=abgeschlossen),
angezeigt in Objektliste und Admin-Objektsektion ("noch nie kontrolliert"
falls keine).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC8HYvv6UkCVYheYiTw9DD
2026-09-05 11:00:49 +02:00
patrickandClaude Sonnet 5 54fc29690a feat(objekt): Zugfahrzeug-Flag am Objekttyp + Leitungs-Dashboard-Kacheln
CI / backend-tests (push) Failing after 1m26s
CI / frontend-build (push) Successful in 24s
Objekttyp.ist_zugfahrzeug (Migration 0011) grenzt die Fahrzeug-Zuordnung
serverseitig auf tatsächliche Zugfahrzeuge ein (422 bei Verstoß), Frontend
filtert die Fahrzeug-Dropdowns entsprechend.

Neue Dashboard-Endpunkte /dashboard/einsatzbereitschaft und
/dashboard/prueftermine plus DashboardPage mit drei Kacheln
(Einsatzbereitschaft, Prüftermine, Ablaufdaten). Aktive
Mindermengen-Genehmigung zählt als "eingeschränkt einsatzbereit", nicht als
voll einsatzbereit (U2/Karte 08).

Neue FehlbestandListePage: Fehlbestände eigenständig nachfüllen/Mindermenge
genehmigen, ohne komplette Kontrolle des Objekts zu starten (Backend
existierte bereits, nur das Frontend fehlte).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC8HYvv6UkCVYheYiTw9DD
2026-09-05 10:33:00 +02:00
patrickandClaude Sonnet 5 38b8ce1795 fix(objekt): Fahrzeug-Zuordnung als 1:n statt n:m (fachliche Korrektur)
CI / backend-tests (push) Failing after 1m23s
CI / frontend-build (push) Successful in 29s
Nutzer-Korrektur: "Ein Objekt gehört immer nur zu genau einem Fahrzeug"
- Spalte gezogen_von_objekt_id -> fahrzeug_id (Rename-Migration 0010)
- Zuvor begonnener n:m-Ansatz (objekt_kopplung Tabelle/Endpoints/Panel)
  wieder entfernt, da fachlich falsch
- PATCH /objekte/{id} prüft Existenz + direkten Zyklus (A<->B)
- Frontend: einfache Single-Select "Fahrzeug zuordnen" statt Kopplungs-Panel

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-05 01:11:25 +02:00
patrickandClaude Sonnet 5 6934276e8a Karte 14 Schritt 2 (Admin-Teil) + Frontend für Anhänger-Kopplung
CI / backend-tests (push) Failing after 1m21s
CI / frontend-build (push) Successful in 22s
Backend: geraet_instanz-CRUD (Liste/Anlegen/Status ändern inkl. optionalem
Fehlbestand pro Gerät/Löschen), pruefintervall_monate in Objektposition-
Schemas verdrahtet (Prüfdatum -> naechste_pruefung wird automatisch
berechnet, Monatsrechnung ohne neue Dependency).

Frontend: GeraeteInstanzenListe ersetzt das Einzel-SN-Feld im Admin-Portal
(ObjektPositionenPanel) durch eine Instanz-Liste mit Status/Prüfdatum/
Bemerkung je Exemplar - löst das Karte-14-Kernproblem (mehrere Geräte pro
Position). ObjektSection: Anhänger-Kopplung bei Anlage und nachträglich
änderbar.

Kontroll-Erfassung (PositionCard/KontrollPage) bleibt unverändert - die
komplett neue Erfassungs-UI für geraet_sn (Umsetzungsschritt 4, Karte 14)
ist bewusst nicht Teil dieses Commits.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-04 20:55:09 +02:00
patrickandClaude Sonnet 5 eff9fe4956 Fahrzeug/Anhänger-Kopplung (objekt.gezogen_von_objekt_id)
CI / backend-tests (push) Failing after 1m12s
CI / frontend-build (push) Successful in 19s
Nutzer-Vorgabe: Fahrzeug und Anhänger beide als eigenständige Objekte
möglich, optional fest gekoppelt. Selbstreferenzierende nullable FK, kein
eigener Anhänger-Objekttyp nötig (Objekt bleibt generisch, Karte 11).
POST /objekte übergibt das Feld, neuer PATCH /objekte/{id} zum
nachträglichen Setzen/Lösen.

Von postgres-expert gegengeprüft, Fixes übernommen: ON DELETE SET NULL
(Zugfahrzeug entfernen blockiert Anhänger nicht), CHECK-Constraint gegen
Selbstbezug, Existenzprüfung + direkter Zyklus-Check (A↔B) im Endpoint statt
unhandled 500. Mehrstufige Ketten bewusst nicht geprüft (kein Anwendungsfall).

Tests: Anlage mit/ohne Kopplung, nachträglich setzen/lösen, Selbstbezug,
ungültiges Ziel, direkter Zyklus.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-04 20:48:35 +02:00
patrickandClaude Sonnet 5 66757e4cd6 Karte 10: Code128-Label als PDF (Objekt + Geräte-Exemplar)
CI / backend-tests (push) Successful in 1m5s
CI / frontend-build (push) Successful in 18s
app/services/label.py generiert druckfertiges Vektor-PDF (python-barcode +
reportlab): Mindesthöhe 10mm, Ruhezone 5mm, Klartext-Fallback als zweite
Zeile (Objekt-/Materialname). Endpunkte GET /objekte/{id}/label.pdf und
GET /objektpositionen/{id}/label.pdf (404 ohne vergebenen Geräte-Code).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-04 17:59:54 +02:00
patrickandClaude Sonnet 5 69e7d0c8d0 Karte 10: Geräte-Code für Objektpositionen (Code128-Vorbereitung) + Code-Vorschlag
CI / backend-tests (push) Successful in 1m1s
CI / frontend-build (push) Successful in 18s
objektposition.code (nullable, unique) für Geräte-Etiketten, separat von
seriennummer. Lookup-Endpunkt für Geräte-Scan (GET /objektpositionen/code/{code})
sowie Auto-Vorschlag PRAEFIX-NNN für Objekt- und Objektposition-Codes
(GET /objekte/naechster-code, GET /objektpositionen/naechster-code).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-04 17:35:25 +02:00
patrickandClaude Sonnet 5 fdcac2f160 Sprint 2: Beladungsvorlagen (Versionierung), Objekte anlegen/duplizieren, Override-Logik
CI / backend-tests (push) Successful in 29s
- Beladungsvorlage/Vorlagenposition-Modelle + Endpunkte: erstellen, neue Version
  (Prompt 08 Punkt 4 - alte Version bleibt unverändert lesbar statt überschrieben)
- Objekt-Anlage aus Vorlage: Objektpositionen werden initialisiert, Ist-Menge startet
  bei 0 ("nicht kontrolliert", Prompt 09)
- Duplizieren: Struktur/Sollmengen-Override kopiert, Ist-Menge/SN/Ablauf/Charge NICHT,
  neuer Code Pflicht (409 bei Kollision)
- Sollmengen-Auflösung (Prompt 10): Override schlägt Vorlagenwert, sonst dynamisch aus
  aktueller Vorlagenposition des Objekts
- GET /objekte/code/{code} bewusst vor /objekte/{id} registriert (Routing-Reihenfolge)
- Bugfix: app.models muss vollständig importiert werden (main.py + conftest.py), sonst
  schlägt FK-Auflösung zwischen Modellen fehl, die noch von keinem Endpoint berührt
  werden (Fund im dritten echten CI-Lauf)
- Tests: U8 (Override schlägt Vorlage), U9 (Duplizieren-Kopierregeln + Code-Konflikt),
  U10 (neue Version, alte bleibt lesbar), Rollenrechte

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L85hmKbvX7Cqkq47KnQhFt
2026-09-03 23:31:14 +02:00