Backend: Verbrauchsgegenstand (Product.bulk) - Gegenstand wie ein Lebensmittel

Neues Flag bulk auf Product: Gegenstand als Charge mit Menge/Einheit/MHD/
Mindestbestand fuehren (z.B. Sonnencreme in ml), ohne eindeutigen Code.
Migration (ADD COLUMN), Schemas und Anlege-Pfad ergaenzt. Kernlogik nutzt
foodLike = kein Gegenstand ODER bulk; Bestand/Einkaufsliste unveraendert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-27 20:29:01 +02:00
parent 1dc249eb79
commit 6c870584dd
5 changed files with 52 additions and 0 deletions

View File

@@ -11,6 +11,7 @@ import pytest
from app.crud import product_tracking
from app.models import (
BaseUnit,
Category,
CategoryTracking,
FieldDefinition,
@@ -275,3 +276,41 @@ def test_mengen_produkt_zaehlt_weiter_lots(db):
object_add(db, product, 5, a.id, None)
db.commit()
assert current_stock(db, product.id) == 5
# ---- Verbrauchsgegenstand (bulk): wie ein Lebensmittel geführt ----
def _bulk_product(db, name="Sonnencreme", base_unit=BaseUnit.milliliter, min_stock=500):
"""Gegenstand, der als Charge (Menge + Einheit) geführt wird wie ein
Lebensmittel, aber in der Gegenstände-Welt und ohne eindeutigen Code."""
cat = Category(name="Pflege", tracking=CategoryTracking.object.value)
db.add(cat)
db.flush()
product = Product(
name=name, category_id=cat.id, bulk=True,
base_unit=base_unit, min_stock=min_stock,
)
db.add(product)
db.commit()
db.refresh(product)
return product
def test_verbrauchsgegenstand_zaehlt_ueber_lots(db):
# bulk-Gegenstand (individual=False) zählt über Chargen wie ein Lebensmittel.
product = _bulk_product(db)
assert product.bulk is True and product.individual is False
a = _loc(db, "Bad")
object_add(db, product, 200, a.id, None)
object_add(db, product, 200, a.id, None)
db.commit()
assert current_stock(db, product.id) == 400
def test_verbrauchsgegenstand_unter_mindestbestand(db):
product = _bulk_product(db, min_stock=500) # 500 ml
a = _loc(db, "Bad")
object_add(db, product, 200, a.id, None)
db.commit()
# Unter dem Mindestbestand -> gehört auf die Einkaufsliste (wie ein Lebensmittel).
assert current_stock(db, product.id) < product.min_stock