From 2f1be8e2dd5191f687d057e9b972561fca9e7e59 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Wed, 22 Jul 2026 13:58:50 +0200 Subject: [PATCH] Verlauf zeigt Mengen in Artikeleinheiten (Gebinde) statt nur Basiseinheit MovementOut liefert jetzt package_size, package_label sowie Name/Faktor der Anzeigeeinheit mit. Die Verlauf-Tabelle zeigt die Bewegung als Leitangabe in Gebinden (z.B. "1 Glas") und darunter klein die Basiseinheit ("195 g"). Ohne Gebinde/abweichende Einheit bleibt es bei einer Zeile. Co-Authored-By: Claude Opus 4.8 --- backend/app/routers/views.py | 7 ++++++- backend/app/schemas.py | 7 ++++++- web/src/pages/History.jsx | 23 ++++++++++++++++++++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/backend/app/routers/views.py b/backend/app/routers/views.py index 5b92cca..de79eae 100644 --- a/backend/app/routers/views.py +++ b/backend/app/routers/views.py @@ -7,7 +7,7 @@ from ..database import get_db from ..deps import get_current_user from ..models import Group, Lot, Movement, Product, User from ..schemas import ExpiringItem, GroupShoppingItem, MovementOut, ShoppingItem -from ..services.conversion import BASE_OF_KIND +from ..services.conversion import BASE_OF_KIND, display_unit_info from ..services.stock import current_stock from .settings import get_expiry_warning_days @@ -138,6 +138,7 @@ def movements( result: list[MovementOut] = [] for movement, product, user in rows: + unit_name, unit_factor = display_unit_info(product) result.append( MovementOut( id=movement.id, @@ -150,6 +151,10 @@ def movements( username=user.username if user else None, note=movement.note, created_at=movement.created_at, + package_size=product.package_size, + package_label=product.package_label, + unit_name=unit_name, + unit_factor=unit_factor, ) ) return result diff --git a/backend/app/schemas.py b/backend/app/schemas.py index b032c72..c7904db 100644 --- a/backend/app/schemas.py +++ b/backend/app/schemas.py @@ -265,12 +265,17 @@ class MovementOut(BaseModel): product_id: int product_name: str type: str - quantity: float + quantity: float # in Basiseinheiten base_unit: BaseUnit unit_used: str username: str | None note: str | None created_at: datetime + # Für die Anzeige in Artikeleinheiten: + package_size: float | None = None + package_label: str | None = None + unit_name: str = "" + unit_factor: float = 1.0 class SettingOut(BaseModel): diff --git a/web/src/pages/History.jsx b/web/src/pages/History.jsx index da962fd..25465c4 100644 --- a/web/src/pages/History.jsx +++ b/web/src/pages/History.jsx @@ -5,6 +5,22 @@ import { fmt, unitShort } from "../units"; const TYPE_LABEL = { in: "Eingelagert", out: "Ausgelagert", adjust: "Korrektur" }; +// Leitangabe in Artikeleinheiten (Gebinde), sonst in der Produkteinheit. +function primaryAmount(m) { + if (m.package_size > 0) { + return `${fmt(m.quantity / m.package_size)} ${m.package_label || "Packung"}`; + } + return `${fmt(m.quantity / (m.unit_factor || 1))} ${m.unit_name || unitShort(m.base_unit)}`; +} + +// Untermenge in der Basiseinheit – nur wenn sie sich von der Leitangabe unterscheidet. +function secondaryAmount(m) { + if (m.package_size > 0 || (m.unit_factor || 1) !== 1) { + return `${fmt(m.quantity)} ${unitShort(m.base_unit)}`; + } + return ""; +} + export default function History() { const [movements, setMovements] = useState([]); const [error, setError] = useState(null); @@ -46,7 +62,12 @@ export default function History() { {m.product_name} - {fmt(m.quantity)} {unitShort(m.base_unit)} + + {primaryAmount(m)} + {secondaryAmount(m) && ( +
{secondaryAmount(m)}
+ )} + {m.username || "–"} ))}