Speisekammer — Eigene Soll-Menge-Übersicht mit konfigurierbarer Nachbestellmenge #192

Closed
opened 2026-09-12 00:30:34 +02:00 by lena · 3 comments
Collaborator

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:

  • Neue Ansicht/Filter in der Speisekammer zeigt ausschließlich Produkte mit gesetzter Soll-Menge (TargetQuantity != null), inkl. aktueller Anzahl.
  • Soll-Menge ist aus dieser Ansicht heraus direkt editierbar (nutzt den bestehenden SetPantryProductTargetQuantityCommand).
  • Eine konfigurierbare Nachbestellmenge (Standardwert 2) bestimmt, wie viele Einheiten beim Unterschreiten der Soll-Menge auf die Einkaufsliste geschrieben werden — unabhängig von der tatsächlichen Differenz zur Soll-Menge.
  • PantryLowStockShoppingWriter.WriteMissingAmountIfBelowTarget (aktuell: schreibt exakt die fehlende Menge) wird entsprechend angepasst oder um diesen Modus ergänzt.
  • Bestehendes Verhalten (Auto-Schreiben auf die Einkaufsliste beim Unterschreiten der Soll-Menge, siehe #94) bleibt für Produkte ohne konfigurierte Nachbestellmenge kompatibel.

Out of scope for this story:

  • Die in separaten Stories beschriebene Wartezeit-Logik nach dem Abhaken auf der Einkaufsliste (siehe separates Issue).
  • Das Entfernen von Produkten bei Anzahl 0 (siehe separates Issue).

Open questions: (escalate to human if unanswered)

  • Ist die Nachbestellmenge global pro Speisekammer oder pro Produkt konfigurierbar? (Beispiel im Auftrag klingt nach einem globalen Default, änderbar pro Produkt wäre aber flexibler.)

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.

## 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:** - [ ] Neue Ansicht/Filter in der Speisekammer zeigt ausschließlich Produkte mit gesetzter Soll-Menge (`TargetQuantity != null`), inkl. aktueller Anzahl. - [ ] Soll-Menge ist aus dieser Ansicht heraus direkt editierbar (nutzt den bestehenden `SetPantryProductTargetQuantityCommand`). - [ ] Eine konfigurierbare Nachbestellmenge (Standardwert 2) bestimmt, wie viele Einheiten beim Unterschreiten der Soll-Menge auf die Einkaufsliste geschrieben werden — unabhängig von der tatsächlichen Differenz zur Soll-Menge. - [ ] `PantryLowStockShoppingWriter.WriteMissingAmountIfBelowTarget` (aktuell: schreibt exakt die fehlende Menge) wird entsprechend angepasst oder um diesen Modus ergänzt. - [ ] Bestehendes Verhalten (Auto-Schreiben auf die Einkaufsliste beim Unterschreiten der Soll-Menge, siehe #94) bleibt für Produkte ohne konfigurierte Nachbestellmenge kompatibel. **Out of scope for this story:** - Die in separaten Stories beschriebene Wartezeit-Logik nach dem Abhaken auf der Einkaufsliste (siehe separates Issue). - Das Entfernen von Produkten bei Anzahl 0 (siehe separates Issue). **Open questions:** (escalate to human if unanswered) - Ist die Nachbestellmenge global pro Speisekammer oder pro Produkt konfigurierbar? (Beispiel im Auftrag klingt nach einem globalen Default, änderbar pro Produkt wäre aber flexibler.) --- 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.
lena self-assigned this 2026-09-12 11:17:10 +02:00
Author
Collaborator

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:

  • Neues Feld RestockQuantity (int, Default 2) auf PantryProductEntity, analog zu TargetQuantity - 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.WriteMissingAmountIfBelowTarget wird umgestellt: statt der exakten Differenz (TargetQuantity - Quantity) wird RestockQuantity geschrieben, wenn die Anzahl unter die Soll-Menge faellt.
  • Neuer Query-Handler fuer die Uebersicht (alle Produkte mit gesetzter Soll-Menge einer Speisekammer) plus neue Frontend-Ansicht/Filter, die Soll-Menge und Nachbestellmenge inline editierbar macht (nutzt die bestehenden SetPantryProductTargetQuantityCommand/neuen SetPantryProductRestockQuantityCommand).

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 frischen git pull --ff-only/Merge-Konflikt mit #195s Arbeit geprueft.

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: - Neues Feld `RestockQuantity` (int, Default 2) auf `PantryProductEntity`, analog zu `TargetQuantity` - 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.WriteMissingAmountIfBelowTarget` wird umgestellt: statt der exakten Differenz (`TargetQuantity - Quantity`) wird `RestockQuantity` geschrieben, wenn die Anzahl unter die Soll-Menge faellt. - Neuer Query-Handler fuer die Uebersicht (alle Produkte mit gesetzter Soll-Menge einer Speisekammer) plus neue Frontend-Ansicht/Filter, die Soll-Menge und Nachbestellmenge inline editierbar macht (nutzt die bestehenden `SetPantryProductTargetQuantityCommand`/neuen `SetPantryProductRestockQuantityCommand`). **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 frischen `git pull --ff-only`/Merge-Konflikt mit #195s Arbeit geprueft.
Author
Collaborator

Umgesetzt und gemergt (backend: 5540851e, frontend: b3f06f0d, coverage-refresh: 8fea4981, alle auf master, gruen).

Was gebaut wurde:

  • Neues Feld RestockQuantity (Default 2) auf jedem Speisekammer-Produkt, per neuem SetPantryProductRestockQuantityCommand aenderbar.
  • PantryLowStockShoppingWriter schreibt 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).
  • Neue Seite "Soll-Mengen-Uebersicht" (/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.
  • Der bestehende Einzelprodukt-Dialog (Soll-Menge setzen) zeigt und speichert jetzt beide Felder zusammen.
  • RestockQuantity zusaetzlich in den bestehenden GDPR-Datenexport aufgenommen (Konsistenz mit dem bereits dort enthaltenen TargetQuantity).

Tests: 1144 Backend-Tests (119+52+973), 1330 Frontend-Tests (137 Dateien), beide gruen; tsc -b/npm run build sauber. 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/health healthy) 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.cs betroffen, wie im Claim-Kommentar oben vorab als Risiko notiert). Sauber ueber git stash -> pull --ff-only -> stash pop aufgeloest; die beiden neuen #195-Aufrufstellen wurden auf die umbenannte Methode (WriteRestockAmountIfBelowTarget) inklusive RestockQuantity-Parameter angepasst, zwei #195-eigene Tests entsprechend korrigiert (sie erwarteten noch die alte Differenz-Logik).

Keine offenen Punkte aus dieser Story.

Umgesetzt und gemergt (backend: 5540851e, frontend: b3f06f0d, coverage-refresh: 8fea4981, alle auf master, gruen). **Was gebaut wurde:** - Neues Feld `RestockQuantity` (Default 2) auf jedem Speisekammer-Produkt, per neuem `SetPantryProductRestockQuantityCommand` aenderbar. - `PantryLowStockShoppingWriter` schreibt 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). - Neue Seite "Soll-Mengen-Uebersicht" (`/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. - Der bestehende Einzelprodukt-Dialog (Soll-Menge setzen) zeigt und speichert jetzt beide Felder zusammen. - `RestockQuantity` zusaetzlich in den bestehenden GDPR-Datenexport aufgenommen (Konsistenz mit dem bereits dort enthaltenen `TargetQuantity`). **Tests:** 1144 Backend-Tests (119+52+973), 1330 Frontend-Tests (137 Dateien), beide gruen; `tsc -b`/`npm run build` sauber. 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/health` healthy) 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.cs` betroffen, wie im Claim-Kommentar oben vorab als Risiko notiert). Sauber ueber `git stash` -> `pull --ff-only` -> `stash pop` aufgeloest; die beiden neuen #195-Aufrufstellen wurden auf die umbenannte Methode (`WriteRestockAmountIfBelowTarget`) inklusive `RestockQuantity`-Parameter angepasst, zwei #195-eigene Tests entsprechend korrigiert (sie erwarteten noch die alte Differenz-Logik). Keine offenen Punkte aus dieser Story.
lena closed this issue 2026-09-12 12:58:02 +02:00
Author
Collaborator

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: PantryLowStockShoppingWriter schreibt 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 TimeoutException beim 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.

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: `PantryLowStockShoppingWriter` schreibt 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 `TimeoutException` beim 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.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
robert/todo#192
No description provided.