Mehrere EAN-Codes je Produkt und je Gruppe (mit Notiz) + Gruppen umbenennen
Barcodes:
- Neue Tabelle barcodes (code, note, product_id ODER group_id). Damit lassen sich
einem Produkt mehrere Codes geben und einer Gruppe beliebig viele Marken
zuordnen (z.B. alle Mehlmarken zu "Mehl"). Je Code eine Notiz wie
"Mehl bei Aldi".
- Lookup loest jetzt auch Alias-Codes auf; ist ein Code einer Gruppe zugeordnet,
liefert die API group_id/group_name zurueck. Beim Anlegen aus einem Scan wird
diese Gruppe automatisch gesetzt (Vorrang vor dem Kategorie-Rateversuch).
- Endpunkte: POST/DELETE /products/{id}/barcodes und /groups/{id}/barcodes.
- Web: wiederverwendbare BarcodeList-Komponente, eingebunden im Produktformular
und auf der Gruppen-Seite.
Gruppen:
- Namen lassen sich jetzt direkt in der Tabelle aendern (PATCH war vorhanden,
nur die Oberflaeche fehlte).
UI-Fix: Auswahlfelder in Tabellen richten sich nach ihrem Text statt nach der
Zellenbreite (Gruppen-/Benutzer-Dropdowns waren abgeschnitten).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,14 @@ class UnitCreate(BaseModel):
|
||||
factor: float = Field(gt=0)
|
||||
|
||||
|
||||
# ---- Barcodes ----
|
||||
class BarcodeOut(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
id: int
|
||||
code: str
|
||||
note: str | None = None
|
||||
|
||||
|
||||
# ---- Auth / Users ----
|
||||
class Token(BaseModel):
|
||||
access_token: str
|
||||
@@ -62,6 +70,7 @@ class GroupOut(BaseModel):
|
||||
stock: float = 0.0 # Bestand in Basiseinheiten
|
||||
min_stock_unit_name: str | None = None
|
||||
kind: str | None = None # Art der Mindestbestand-Einheit
|
||||
barcodes: list[BarcodeOut] = [] # EANs, die dieser Gruppe zugeordnet sind
|
||||
|
||||
|
||||
class GroupCreate(BaseModel):
|
||||
@@ -153,12 +162,22 @@ class ProductOut(BaseModel):
|
||||
# Mindestbestand in der erfassten Einheit (für die Anzeige):
|
||||
min_stock_display: float | None = None
|
||||
min_stock_unit_label: str = ""
|
||||
# Zusätzliche EAN-Codes (neben dem Haupt-Barcode):
|
||||
barcodes: list[BarcodeOut] = []
|
||||
|
||||
|
||||
class LookupResult(BaseModel):
|
||||
found: bool
|
||||
existing_product: ProductOut | None = None
|
||||
suggestion: dict | None = None
|
||||
# Ist der Code einer Gruppe zugeordnet (z.B. "Mehl"), wird sie hier gemeldet.
|
||||
group_id: int | None = None
|
||||
group_name: str | None = None
|
||||
|
||||
|
||||
class BarcodeCreate(BaseModel):
|
||||
code: str = Field(min_length=4, max_length=64)
|
||||
note: str | None = Field(default=None, max_length=120)
|
||||
|
||||
|
||||
# ---- Stock movements ----
|
||||
|
||||
Reference in New Issue
Block a user