Anbrechen und Teilverbrauch bekommen Knoepfe

Das Backend konnte das seit dem letzten Commit, aber ohne Oberflaeche kam
niemand dran. Jetzt traegt jede Charge zwei Knoepfe:

"Anbrechen" spaltet eine Packung ab, gibt ihr ein "zu verbrauchen bis" und
laesst den Rest ungeoeffnet mit seinem eigenen MHD - mit Rueckfrage, weil
sich die abgespaltene Packung danach anders verhaelt.

"Verbrauchen" nimmt die VERBRAUCHTE Menge ("100 ml genommen", "2 von 6
Broetchen"), nicht den Rest - das ist die Zahl, die man kennt. War die
Charge noch zu, wird sie dabei angebrochen; der Haken dafuer ist
abwaehlbar, falls man nur eine Buchung nachtraegt. Die Einheitenauswahl
holt die Hausmasse der Kategorie dazu, deshalb laesst sich "2 EL" buchen
und landet bei Mehl als 20 g im Bestand.

Die Liste zeigt den Zustand jetzt auch: Spalte "Zustand" (angebrochen),
Spalte "Verbrauchen bis", und bei einer offenen Packung die Restmenge in
Basiseinheiten statt im Gebinde - "980 g von 1.000 g" sagt etwas,
"0,98 Packungen" nicht.

Gewarnt wird nach dem FRUEHEREN von MHD und Verbrauchsdatum (units.js::
faelligAm, Spiegelbild von Lot.faellig_am): Eine angebrochene Milch ist
nicht mehr bis zum aufgedruckten Datum gut. Dafuer ein eigenes Farb-Token
--open in ruhigem Blaugrau - angebrochen ist ein Zustand, keine Warnung.

Dazu ein Fehler, der die ganze Anzeige wertlos gemacht haette: In
list_all_lots fehlten opened_on, consume_by und opened_quantity. Die
Liste haette eine offene Packung wie jede andere Charge gezeigt, samt
falscher Ablaufwarnung. Test dagegen.

Von Hand durchgeklickt: 4x1l Milch anbrechen ergibt 1 l offen mit
Verbrauchsdatum 5.10. und 3 l zu mit MHD 15.11.; "2 EL" aus dem Mehl
ergibt 980 g offen und 1 Packung zu. Suite bei 495.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-02 14:17:20 +02:00
co-authored by Claude Opus 5
parent fe6327c913
commit 53a8b9e0b6
7 changed files with 325 additions and 5 deletions
+24 -1
View File
@@ -17,7 +17,7 @@ from app.models import (
Setting,
User,
)
from app.routers.stock import consume_lot, open_lot
from app.routers.stock import consume_lot, list_all_lots, open_lot
from app.schemas import LotConsume, LotOpen
from app.services.stock import check_in, current_stock
from app.services.vererbung import frist_herkunft, oeffnungsfrist
@@ -274,3 +274,26 @@ def test_kaputte_globale_einstellung_faellt_auf_den_standard(db, milch):
db.add(Setting(key="open_days", value="viele"))
db.commit()
assert oeffnungsfrist(db, milch) == 3
def test_die_chargenliste_zeigt_den_offenen_zustand(db, user, milch):
"""Ohne diese Felder saehe die Liste eine offene Packung wie jede andere.
Die Zeile traegt dann auch die falsche Ablaufwarnung, denn gewarnt wird nach
dem fruheren von MHD und Verbrauchsdatum.
"""
check_in(db, milch, 4000, "ml", date.today() + timedelta(days=30), None, None)
db.commit()
[charge] = db.query(Lot).all()
open_lot(charge.id, LotOpen(quantity=None), db=db, _=user)
zeilen = {z.quantity: z for z in list_all_lots(db=db, _=user)}
offen = zeilen[1000]
zu = zeilen[3000]
assert offen.opened_on == date.today()
assert offen.consume_by == date.today() + timedelta(days=3)
assert offen.opened_quantity == 1000
assert zu.opened_on is None
assert zu.consume_by is None