Speisekammer — Eigene Soll-Menge-Übersicht mit konfigurierbarer Nachbestellmenge #192
Labels
No labels
priority/could
priority/must
priority/should
priority/wont
status/blocked
status/claimed
status/done-migrated
type/bug
type/feature
type/infra
type/tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
robert/todo#192
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Story: Eigene Soll-Menge-Übersicht mit konfigurierbarer Nachbestellmenge
As a Speisekammer-Nutzer,
I want to eine eigene Ansicht, die alle Produkte mit gesetzter Soll-Menge auflistet und dort direkt bearbeitbar macht, plus eine pro Produkt (oder pantry-weit als Default) einstellbare Nachbestellmenge,
so that ich auf einen Blick sehe, welche Produkte einen Mindestbestand haben, und beim Unterschreiten nicht nur die exakte Differenz, sondern eine sinnvolle Nachfüllmenge auf die Einkaufsliste kommt (z. B. immer 4 Dosen Tomaten gewünscht, aktuell noch 3 auf Lager -> es sollen automatisch 2 weitere auf die Einkaufsliste, nicht nur 1).
Acceptance criteria:
TargetQuantity != null), inkl. aktueller Anzahl.SetPantryProductTargetQuantityCommand).PantryLowStockShoppingWriter.WriteMissingAmountIfBelowTarget(aktuell: schreibt exakt die fehlende Menge) wird entsprechend angepasst oder um diesen Modus ergänzt.Out of scope for this story:
Open questions: (escalate to human if unanswered)
Als Backlog-Item vom Nutzer eingereicht (per Chat, nicht im laufenden Loop-Zyklus geclaimt).
Abhängigkeit: #195 (Bugfix: Soll-Menge-Unterschreitung wird bislang nur beim Check-Out geprüft, nicht beim Setzen der Soll-Menge oder bei manueller Anzahl-Änderung) sollte zuerst oder zusammen mit dieser Story umgesetzt werden — die hier beschriebene konfigurierbare Nachbestellmenge baut auf einer zuverlässig funktionierenden Basis-Prüfung auf.
Claimed - Umsetzung beginnt.
Scope (aus der Story): Speisekammer-Ansicht mit allen Produkten, die eine Soll-Menge gesetzt haben, dort direkt editierbar; zusaetzlich eine konfigurierbare Nachbestellmenge (Default 2), die beim Unterschreiten der Soll-Menge statt der exakten Differenz auf die Einkaufsliste geschrieben wird.
Geplante Architektur:
RestockQuantity(int, Default 2) aufPantryProductEntity, analog zuTargetQuantity- pro Produkt einstellbar (nicht global pro Speisekammer), damit unterschiedliche Produkte unterschiedliche sinnvolle Nachfuellmengen haben koennen (z. B. 2 Dosen Tomaten vs. 1 Packung Kaffee).PantryLowStockShoppingWriter.WriteMissingAmountIfBelowTargetwird umgestellt: statt der exakten Differenz (TargetQuantity - Quantity) wirdRestockQuantitygeschrieben, wenn die Anzahl unter die Soll-Menge faellt.SetPantryProductTargetQuantityCommand/neuenSetPantryProductRestockQuantityCommand).Bekannte Abhaengigkeit/Risiko: #195 (offener Bug, aktuell von einer anderen Session/einem anderen Loop-Durchlauf geclaimt) aendert denselben
PantryLowStockShoppingWriter-Aufrufpfad (fehlende Trigger bei Soll-Menge-Aenderung/manueller Anzahl-Aenderung). Diese Story aendert nur WAS geschrieben wird (Nachbestellmenge statt exakter Differenz), #195 aendert nur WANN geprueft wird (zusaetzliche Aufrufstellen) - beide Aenderungen sollten in derselben Datei orthogonal genug sein, aber vor dem finalen Push wird explizit auf einen frischengit pull --ff-only/Merge-Konflikt mit #195s Arbeit geprueft.Umgesetzt und gemergt (backend:
5540851e, frontend:b3f06f0d, coverage-refresh:8fea4981, alle auf master, gruen).Was gebaut wurde:
RestockQuantity(Default 2) auf jedem Speisekammer-Produkt, per neuemSetPantryProductRestockQuantityCommandaenderbar.PantryLowStockShoppingWriterschreibt jetzt die konfigurierte Nachbestellmenge statt der exakten Differenz zur Soll-Menge (Beispiel aus der Story: Ziel 4, noch 3 -> schreibt 2, nicht 1). Betrifft alle drei Aufrufstellen (Check-Out, sowie #195s neue Trigger bei Soll-Menge-/Anzahl-Aenderung)./pantry/:pantryId/target-quantities, erreichbar ueber das Speisekammer-Options-Menue) listet alle Produkte mit gesetzter Soll-Menge kategoriebergreifend auf, markiert unterschrittene Produkte und macht Soll-/Nachbestellmenge inline editierbar.RestockQuantityzusaetzlich in den bestehenden GDPR-Datenexport aufgenommen (Konsistenz mit dem bereits dort enthaltenenTargetQuantity).Tests: 1144 Backend-Tests (119+52+973), 1330 Frontend-Tests (137 Dateien), beide gruen;
tsc -b/npm run buildsauber. Self-Review + security-review-Skill direkt ausgefuehrt, keine Findings. Live im lokalen Review-Container (docker compose -p todo -f docker-compose.dev.yml up -d --build app,/api/healthhealthy) verifiziert: Soll-Menge + Nachbestellmenge setzen, Uebersicht oeffnen/anzeigen/editieren, Persistenz nach Reload - alles funktioniert wie erwartet.Reale Merge-Kollision waehrend der Umsetzung: #195 wurde von einer anderen, parallel laufenden Session/einem anderen Loop-Durchlauf genau waehrend dieser Story fertiggestellt und gepusht (gleiche Datei
PantryLowStockShoppingWriter.csbetroffen, wie im Claim-Kommentar oben vorab als Risiko notiert). Sauber uebergit stash->pull --ff-only->stash popaufgeloest; die beiden neuen #195-Aufrufstellen wurden auf die umbenannte Methode (WriteRestockAmountIfBelowTarget) inklusiveRestockQuantity-Parameter angepasst, zwei #195-eigene Tests entsprechend korrigiert (sie erwarteten noch die alte Differenz-Logik).Keine offenen Punkte aus dieser Story.
Nachtrag: Der Nutzer hat nach dem Merge einen echten Rechenfehler gemeldet - die Automatik hat bislang nur die Nachbestellmenge allein geschrieben (z. B. immer 2), unabhaengig davon, wie gross die tatsaechliche Differenz zur Soll-Menge war. Bei kleiner Differenz war das im ersten Beispiel der Story noch zufaellig plausibel, bei einer groesseren Luecke (gemeldetes Beispiel: Bestand 2, Ziel 10) kam dabei aber weiterhin nur "2" auf die Einkaufsliste statt einer Menge, die tatsaechlich zur Zielmenge plus Puffer aufschliesst.
Korrigiert in
6001faea:PantryLowStockShoppingWriterschreibt jetzt Differenz-zur-Zielmenge PLUS die konfigurierte Nachbestellmenge (nicht mehr nur die Nachbestellmenge allein). Beispiel Bestand 2 / Ziel 10 / Puffer 2 -> jetzt korrekt 10 (= 8 Differenz + 2 Puffer) statt vorher 2.Musste dabei mit #193s zwischenzeitlich gemergter Cooldown-Sperre (selbe Datei) zusammengefuehrt werden - sauber aufgeloest, beide Aenderungen bestehen nebeneinander. Verifiziert per direktem API-Aufruf gegen den neu gebauten Container (nicht nur Unit-Tests) - Formel liefert exakt den erwarteten Wert. Backend-Tests: Pantry-Suite 121/121 gruen; volle Suite 977/979 gruen (2 Fehlschlaege waren
TimeoutExceptionbeim Datenbank-Save, unabhaengig vom Pantry-Bereich - deckt sich mit dem in der Team-Memory dokumentierten Testcontainer-Kontention-Muster, nicht mit dieser Aenderung). Frontend: 1330/1330 gruen.