Ein- und Auslagerungen als Wasserfall- bzw. Brueckendiagramm
Bisher waren es zwei Linien mit der Anzahl der Vorgaenge. Gemeint war eine Bruecke: die Bestandslinie, und schwebende gruene/rote Balken, die jeden ihrer Spruenge erklaeren. Damit Balken und Linie ueberhaupt zusammen in ein Bild duerfen, zaehlen die Balken jetzt Mengen in Artikeleinheiten statt Vorgaengen - beides liegt so auf derselben Achse. Zwei Skalen in einem Diagramm bleiben ausgeschlossen. Neuer Endpunkt GET /dashboard/flow liefert je Abschnitt Anfangsbestand, Zugang und Abgang aus einer Abfrage. Getrennt abgefragt koennten die Abschnitte von timeline und activity um eine Schrittweite auseinanderliegen - dann stuende ein Balken neben dem Sprung, den er erklaert. /dashboard/activity bleibt fuer externe Zugriffe erhalten. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -134,6 +134,44 @@ def test_timeline_kann_auf_ein_produkt_eingegrenzt_werden(db, rice, user):
|
||||
assert nur_reis[-1].article_units == 2
|
||||
|
||||
|
||||
def test_flow_liefert_eine_geschlossene_bruecke(db, rice, user):
|
||||
"""Anfangsbestand + Zugang - Abgang muss den Endbestand ergeben."""
|
||||
check_in(db, rice, 5, "package", None, None, user)
|
||||
check_out(db, rice, 2, "package", user)
|
||||
db.commit()
|
||||
|
||||
abschnitte = dashboard.flow(days=3, product_id=None, db=db, _=user)
|
||||
juengster = abschnitte[-1]
|
||||
assert juengster.opening == 0 # vorher war das Lager leer
|
||||
assert juengster.checked_in == 5 # Artikeleinheiten, nicht Vorgaenge
|
||||
assert juengster.checked_out == 2
|
||||
assert juengster.opening + juengster.checked_in - juengster.checked_out == 3
|
||||
|
||||
|
||||
def test_flow_schliesst_ohne_luecke_an_den_vorherigen_abschnitt_an(db, rice, user):
|
||||
"""Der Endbestand eines Abschnitts ist der Anfangsbestand des naechsten –
|
||||
sonst haette die Bruecke einen Sprung, den kein Balken erklaert."""
|
||||
check_in(db, rice, 4, "package", None, None, user)
|
||||
db.commit()
|
||||
|
||||
abschnitte = dashboard.flow(days=7, product_id=None, db=db, _=user)
|
||||
for vorher, nachher in zip(abschnitte, abschnitte[1:]):
|
||||
schluss = vorher.opening + vorher.checked_in - vorher.checked_out
|
||||
assert round(schluss, 3) == round(nachher.opening, 3)
|
||||
|
||||
|
||||
def test_flow_kann_auf_ein_produkt_eingegrenzt_werden(db, rice, user):
|
||||
anderes = Product(name="Zucker", base_unit=BaseUnit.gram, package_size=1000)
|
||||
db.add(anderes)
|
||||
db.commit()
|
||||
check_in(db, rice, 2, "package", None, None, user)
|
||||
check_in(db, anderes, 5, "package", None, None, user)
|
||||
db.commit()
|
||||
|
||||
nur_reis = dashboard.flow(days=2, product_id=rice.id, db=db, _=user)
|
||||
assert nur_reis[-1].checked_in == 2
|
||||
|
||||
|
||||
def test_activity_zaehlt_ein_und_auslagerungen(db, rice, user):
|
||||
check_in(db, rice, 2, "package", None, None, user)
|
||||
check_in(db, rice, 1, "package", None, None, user)
|
||||
|
||||
Reference in New Issue
Block a user