Files
MABEA/backend/app/schemas/objekt.py
T
patrickandClaude Sonnet 5 b7d9581b90
CI / backend-tests (push) Successful in 2m20s
CI / frontend-build (push) Successful in 27s
feat(identity): IDENT-009 QR-/Code-Neuvergabe mit Historie
POST /objekte/{id}/code-neu-vergeben und /objektpositionen/{id}/code-neu-
vergeben (admin-only) - z.B. bei beschädigtem/verlorenem Etikett. Alter
Code bleibt über die bestehende Audit-Infrastruktur (Historie-Tabelle,
Prompt 13) nachvollziehbar statt eine eigene Versions-Tabelle zu brauchen:
GET /historie?entitaet_typ=objekt&entitaet_id=... zeigt alter_wert/
neuer_wert des Codes. Duplikat-Prüfung explizit vorab (Projekt-Konvention,
siehe geraet_instanz.py::erstelle).

Frontend: "Code neu vergeben"-Aktion in der Objektakte (nur Admin), inline
statt window.prompt (Accessibility-Vorgabe aus dieser Session).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-08 18:13:53 +02:00

107 lines
2.7 KiB
Python

import uuid
from datetime import date, datetime
from decimal import Decimal
from pydantic import BaseModel, ConfigDict
from app.models.objekt import ObjektStatus
from app.models.objektposition import ObjektpositionStatus
class ObjektCreate(BaseModel):
code: str
name: str
objekttyp_id: int
vorlage_id: int
standort_id: int
fahrzeug_id: int | None = None
class ObjektRead(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
code: str
name: str
objekttyp_id: int
vorlage_id: int | None
standort_id: int
status: ObjektStatus
fahrzeug_id: int | None
letzte_kontrolle_am: datetime | None = None
class ObjektUpdate(BaseModel):
fahrzeug_id: int | None = None
status: ObjektStatus | None = None
class CodeNeuVergeben(BaseModel):
neuer_code: str
begruendung: str | None = None
class FahrzeugdetailsUpsert(BaseModel):
kennzeichen: str | None = None
funkrufname: str | None = None
funkkenner: str | None = None
baujahr: int | None = None
kilometerstand: int | None = None
betriebsstunden: Decimal | None = None
naechste_hu: date | None = None
naechste_uvv: date | None = None
class FahrzeugdetailsRead(BaseModel):
model_config = ConfigDict(from_attributes=True)
objekt_id: int
kennzeichen: str | None
funkrufname: str | None
funkkenner: str | None
baujahr: int | None
kilometerstand: int | None
betriebsstunden: Decimal | None
naechste_hu: date | None
naechste_uvv: date | None
class ObjektDuplizierenRequest(BaseModel):
neuer_code: str
neuer_name: str
neuer_standort_id: int
class ObjektpositionRead(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: uuid.UUID
objekt_id: int
material_id: int
sollmenge_override: Decimal | None
sollmenge_effektiv: Decimal
ist_status: ObjektpositionStatus
istmenge: Decimal
seriennummer: str | None
ablaufdatum: date | None
chargennummer: str | None
code: str | None
pruefintervall_monate: int | None
class ObjektpositionUpdate(BaseModel):
sollmenge_override: Decimal | None = None
ist_status: ObjektpositionStatus | None = None
istmenge: Decimal | None = None
seriennummer: str | None = None
ablaufdatum: date | None = None
chargennummer: str | None = None
code: str | None = None
pruefintervall_monate: int | None = None
class ObjektpositionCreate(BaseModel):
"""Prompt 10 Punkt 2: zusätzliches, nicht in der Vorlage enthaltenes Material.
sollmenge_override ist hier Pflicht, da keine Vorlagenposition existiert, aus
der sich die Sollmenge dynamisch ableiten ließe."""
material_id: int
sollmenge_override: Decimal