Dashboard zaehlt Einzelstuecke mit; Baum-Dropdown scrollbar

Auswertungen (by_category, expiry_split, stats) iterierten nur Lots. Gegenstaende
mit Menge-je-Lagerort liegen als Lots und tauchten auf – Einzelstuecke liegen
aber als Items und fehlten dadurch komplett (Dashboard zeigte z.B. nur die
Powerbank, nicht Kamera/Kabel). Neuer Helfer _bestand_beitraege deckt beide
Speicherformen ab: jedes Item zaehlt als ein Stueck ohne MHD. Regressionstest
ergaenzt; volle Suite gruen (120).

CategorySelect: Scrollen IM aufklappbaren Menue schloss es, weil jeder Scroll als
Seiten-Scroll gewertet wurde. Jetzt schliesst nur ein Scroll ausserhalb des
Menues; die lange Liste laesst sich scrollen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-26 12:09:25 +02:00
parent f35126cb7b
commit a70a99b387
3 changed files with 75 additions and 19 deletions

View File

@@ -2,9 +2,10 @@ from datetime import date, timedelta # noqa: F401 (date fuer die Zustands-Test
import pytest
from app.models import BaseUnit, Category, Product, Role, User
from app.models import BaseUnit, Category, Item, Product, Role, User
from app.routers import dashboard
from app.services.conversion import article_unit, article_units
from app.services.items import generate_uid
from app.services.stock import check_in, check_out
@@ -89,6 +90,31 @@ def test_by_category_bündelt_und_sortiert(db, user):
assert anteile[1].article_units == 2
def test_einzelstuecke_zaehlen_in_auswertungen(db, user):
"""Regression: Einzelstueck-Produkte liegen als Items, nicht als Lots. Sie
muessen trotzdem in Kategorie-, Ablauf- und Bestandsauswertung erscheinen
sonst zeigte das Dashboard nur die Mengen-Gegenstaende (Bug: nur Powerbank)."""
kamera_kat = Category(name="Kamera", tracking="object")
db.add(kamera_kat)
db.commit()
kamera = Product(name="Alpha 7 IV", category_id=kamera_kat.id, individual=True)
db.add(kamera)
db.commit()
for _ in range(2):
db.add(Item(uid=generate_uid(db), product_id=kamera.id))
db.commit()
anteil = next(a for a in dashboard.by_category(db=db, _=user) if a.name == "Kamera")
assert anteil.article_units == 2
assert anteil.no_date == 2 # Einzelstuecke haben kein MHD
assert dashboard.expiry_split(db=db, _=user).no_date == 2
st = dashboard.stats(db=db, _=user)
assert st.article_units == 2
assert st.products_in_stock == 1
# ----------------------------------------------------------------- Verlauf
def test_schrittweite_haengt_am_zeitraum():
"""Kurze Zeitraeume werden fein abgetastet, lange grob."""