Einlagern-UX: 3-Wege-Barcode, Inline-Anlage aus OFF, Mehr-Chargen mit MHD
Einlagern: - Barcode-Erkennung dreiteilig: bekannt -> direkt Menge; unbekannt aber in OFF -> "Anlegen & einlagern" inline; gar nicht gefunden -> manuell anlegen. - Mehrere Chargen pro Vorgang: je Zeile eigene Menge + eigenes MHD (z.B. 5 Glaeser mit unterschiedlichen Daten). Neuer Endpoint /stock/checkin/batch. Produkte/OFF: - OFF-Fuellmenge (quantity) wird in Basiseinheit + Packungsgroesse geparst (kg->g, l->ml, cl/dl); parse_quantity + Tests. - Produktformular uebernimmt Barcode aus ?barcode= und schlaegt automatisch nach, fuellt Packungsgroesse; gemeinsame offUtils (guessGroup/suggestionToProduct). Lagerorte: - Baum jetzt rekursiv ueber beliebig viele Ebenen (Schrank->Fach->Kiste->...). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -152,6 +152,26 @@ class CheckInResponse(BaseModel):
|
||||
product_stock: float
|
||||
|
||||
|
||||
class CheckInLine(BaseModel):
|
||||
"""Eine Charge innerhalb eines Sammel-Einlagerns (Menge + eigenes MHD)."""
|
||||
quantity: float = Field(gt=0)
|
||||
best_before: date | None = None
|
||||
location_id: int | None = None
|
||||
|
||||
|
||||
class BatchCheckInRequest(BaseModel):
|
||||
product_id: int | None = None
|
||||
barcode: str | None = None
|
||||
unit: str
|
||||
lines: list[CheckInLine] = Field(min_length=1)
|
||||
note: str | None = None
|
||||
|
||||
|
||||
class BatchCheckInResponse(BaseModel):
|
||||
lots: list[LotOut]
|
||||
product_stock: float
|
||||
|
||||
|
||||
class CheckOutResponse(BaseModel):
|
||||
affected_lots: list[dict]
|
||||
product_stock: float
|
||||
|
||||
Reference in New Issue
Block a user