Speisekammer — Wartezeit von 2 Tagen, bevor abgehakte Soll-Menge-Artikel erneut auf die Einkaufsliste kommen #193

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

Story: Wartezeit vor erneutem Nachbestellen unterhalb der Soll-Menge

As a Speisekammer-Nutzer,
I want to dass ein Produkt, das wegen Unterschreitens seiner Soll-Menge automatisch auf die Einkaufsliste gesetzt und dort abgehakt wurde (z. B. im Supermarkt eingekauft, aber noch nicht in die Speisekammer eingebucht), nicht sofort wieder auf die Einkaufsliste zurückgeschrieben wird,
so that ich nicht jeden Tag denselben bereits gekauften Artikel erneut auf der Liste sehe, nur weil ich das Einbuchen in die Speisekammer noch nicht nachgeholt habe.

Hintergrund: Bereits heute gilt (#94 / PantryLowStockShoppingWriter): Ist die Soll-Menge höher als der aktuelle Bestand, wird die fehlende Menge automatisch auf die verknüpfte Einkaufsliste geschrieben. Das soll erhalten bleiben. Neu ist die Wartezeit nach dem Abhaken.

Acceptance criteria:

  • Wird ein durch die Soll-Menge-Automatik erzeugter/aktivierter Einkaufslisten-Eintrag (Quelle ShoppingProductInCartSource.PantryAuto) abgehakt (in den Warenkorb gelegt), wird für das zugehörige Speisekammer-Produkt eine Sperrfrist von 2 Tagen ab dem Abhak-Zeitpunkt gesetzt.
  • Innerhalb der Sperrfrist wird dieses Produkt nicht erneut automatisch auf die Einkaufsliste geschrieben, selbst wenn die Speisekammer-Anzahl weiterhin unter der Soll-Menge liegt.
  • Ist die Sperrfrist abgelaufen und der Bestand in der Speisekammer immer noch unter der Soll-Menge, wird der Artikel wie gewohnt automatisch wieder auf die Einkaufsliste gesetzt.
  • Wird das Produkt innerhalb der Sperrfrist tatsächlich in der Speisekammer eingebucht (Check-In) und liegt danach wieder über der Soll-Menge, hat die Sperrfrist keine weitere Wirkung (kein Nachbestellbedarf mehr).
  • Ein manuelles Hinzufügen des Produkts zur Einkaufsliste durch den Nutzer bleibt jederzeit möglich und wird von der Sperrfrist nicht blockiert (die Sperre betrifft nur die automatische Soll-Menge-Schreiblogik).

Out of scope for this story:

  • Änderungen an der Nachbestellmenge selbst (siehe separates Issue zur Soll-Menge-Übersicht).
  • Das Entfernen von Produkten bei Anzahl 0 (siehe separates Issue).

Open questions: (escalate to human if unanswered)

  • Keine — vom Nutzer bestätigt: die Sperrfrist startet beim Abhaken auf der Einkaufsliste ("in den Warenkorb legen"), nicht erst beim Entfernen/Abschließen des Eintrags.

Als Backlog-Item vom Nutzer eingereicht (per Chat, nicht im laufenden Loop-Zyklus geclaimt).

Abhängigkeit: setzt voraus, dass #195 (Bugfix: Soll-Menge-Unterschreitung wird bei jeder relevanten Änderung geprüft, nicht nur beim Check-Out) zuerst oder zusammen mit dieser Story umgesetzt wird — sonst greift die hier beschriebene Sperrfrist nur für den Teil der Fälle, die heute schon einen automatischen Einkaufslisten-Eintrag auslösen.

## Story: Wartezeit vor erneutem Nachbestellen unterhalb der Soll-Menge **As a** Speisekammer-Nutzer, **I want to** dass ein Produkt, das wegen Unterschreitens seiner Soll-Menge automatisch auf die Einkaufsliste gesetzt und dort abgehakt wurde (z. B. im Supermarkt eingekauft, aber noch nicht in die Speisekammer eingebucht), nicht sofort wieder auf die Einkaufsliste zurückgeschrieben wird, **so that** ich nicht jeden Tag denselben bereits gekauften Artikel erneut auf der Liste sehe, nur weil ich das Einbuchen in die Speisekammer noch nicht nachgeholt habe. Hintergrund: Bereits heute gilt (#94 / `PantryLowStockShoppingWriter`): Ist die Soll-Menge höher als der aktuelle Bestand, wird die fehlende Menge automatisch auf die verknüpfte Einkaufsliste geschrieben. Das soll erhalten bleiben. Neu ist die Wartezeit nach dem Abhaken. **Acceptance criteria:** - [ ] Wird ein durch die Soll-Menge-Automatik erzeugter/aktivierter Einkaufslisten-Eintrag (Quelle `ShoppingProductInCartSource.PantryAuto`) abgehakt (in den Warenkorb gelegt), wird für das zugehörige Speisekammer-Produkt eine Sperrfrist von 2 Tagen ab dem Abhak-Zeitpunkt gesetzt. - [ ] Innerhalb der Sperrfrist wird dieses Produkt nicht erneut automatisch auf die Einkaufsliste geschrieben, selbst wenn die Speisekammer-Anzahl weiterhin unter der Soll-Menge liegt. - [ ] Ist die Sperrfrist abgelaufen und der Bestand in der Speisekammer immer noch unter der Soll-Menge, wird der Artikel wie gewohnt automatisch wieder auf die Einkaufsliste gesetzt. - [ ] Wird das Produkt innerhalb der Sperrfrist tatsächlich in der Speisekammer eingebucht (Check-In) und liegt danach wieder über der Soll-Menge, hat die Sperrfrist keine weitere Wirkung (kein Nachbestellbedarf mehr). - [ ] Ein manuelles Hinzufügen des Produkts zur Einkaufsliste durch den Nutzer bleibt jederzeit möglich und wird von der Sperrfrist nicht blockiert (die Sperre betrifft nur die automatische Soll-Menge-Schreiblogik). **Out of scope for this story:** - Änderungen an der Nachbestellmenge selbst (siehe separates Issue zur Soll-Menge-Übersicht). - Das Entfernen von Produkten bei Anzahl 0 (siehe separates Issue). **Open questions:** (escalate to human if unanswered) - Keine — vom Nutzer bestätigt: die Sperrfrist startet beim Abhaken auf der Einkaufsliste ("in den Warenkorb legen"), nicht erst beim Entfernen/Abschließen des Eintrags. --- Als Backlog-Item vom Nutzer eingereicht (per Chat, nicht im laufenden Loop-Zyklus geclaimt). **Abhängigkeit:** setzt voraus, dass #195 (Bugfix: Soll-Menge-Unterschreitung wird bei jeder relevanten Änderung geprüft, nicht nur beim Check-Out) zuerst oder zusammen mit dieser Story umgesetzt wird — sonst greift die hier beschriebene Sperrfrist nur für den Teil der Fälle, die heute schon einen automatischen Einkaufslisten-Eintrag auslösen.
lena self-assigned this 2026-09-12 12:45:25 +02:00
Author
Collaborator

Claiming this. Plan: add a ReorderCooldownUntil timestamp on PantryProductEntity, set it (now + 2 days) from SetShoppingProductInCartCommandHandler when InCart is set to true on a product whose ActivatedVia is PantryAuto, and have PantryLowStockShoppingWriter skip the automatic write while the cooldown is still active. Dependency on #195 is already merged on master, so both cases (check-out and target/quantity edits) will be covered. Manual add stays unaffected since it never goes through the writer. Backend-only change, no UI needed per the AC.

Claiming this. Plan: add a ReorderCooldownUntil timestamp on PantryProductEntity, set it (now + 2 days) from SetShoppingProductInCartCommandHandler when InCart is set to true on a product whose ActivatedVia is PantryAuto, and have PantryLowStockShoppingWriter skip the automatic write while the cooldown is still active. Dependency on `#195` is already merged on master, so both cases (check-out and target/quantity edits) will be covered. Manual add stays unaffected since it never goes through the writer. Backend-only change, no UI needed per the AC.
Author
Collaborator

Done. Summary:

Scope: Added a 2-day cooldown so a pantry product that was auto-written onto the shopping list (because stock fell below its Soll-Menge) does not immediately reappear once its shopping entry is checked off, even while stock is still below target.

Implementation:

  • PantryProductEntity.ReorderCooldownUntil (nullable timestamp) - new column via migration AddPantryProductReorderCooldown.
  • SetShoppingProductInCartCommandHandler: when InCart is set true on an entry whose ActivatedVia == PantryAuto, the new PantryAutoReorderCooldownWriter finds the linked pantry product(s) (matched via the pantry whose TargetShoppingListId is this list, by case-insensitive name) and sets the cooldown to now + 2 days.
  • PantryLowStockShoppingWriter (the shared writer used by check-out, and by target/quantity edits per #195) now skips its automatic write while the cooldown is still active, even if stock remains below target.
  • Check-In needs no explicit cooldown-clearing: once stock reaches target again, the writer's own below-target check already skips regardless of the cooldown field (AC 4 satisfied for free).
  • Manual shopping-list adds are untouched - they never go through the writer, so AC 5 holds structurally.

Tests: New handler tests for both sides (cooldown blocks the write while active / write resumes once expired / cooldown is set only for PantryAuto + InCart=true, not for manual entries or for checking back off). Full local suite green (978 Checkly.Tests + 52 WebApi.Tests + 119 Common.Tests).

Note: implementation coincided with #192 (concurrent session, same directory) renaming the shared writer (WriteMissingAmountIfBelowTarget -> WriteRestockAmountIfBelowTarget with a new restockQuantity param) - reconciled via stash/pull/pop rather than racing the push; both features' call-site changes now coexist cleanly.

Backend-only, no UI change (not requested by the AC).

Commits: 91c27061 (implementation), 0b70b841 (team-memory notes).

Done. Summary: **Scope:** Added a 2-day cooldown so a pantry product that was auto-written onto the shopping list (because stock fell below its Soll-Menge) does not immediately reappear once its shopping entry is checked off, even while stock is still below target. **Implementation:** - `PantryProductEntity.ReorderCooldownUntil` (nullable timestamp) - new column via migration `AddPantryProductReorderCooldown`. - `SetShoppingProductInCartCommandHandler`: when `InCart` is set true on an entry whose `ActivatedVia == PantryAuto`, the new `PantryAutoReorderCooldownWriter` finds the linked pantry product(s) (matched via the pantry whose `TargetShoppingListId` is this list, by case-insensitive name) and sets the cooldown to now + 2 days. - `PantryLowStockShoppingWriter` (the shared writer used by check-out, and by target/quantity edits per `#195`) now skips its automatic write while the cooldown is still active, even if stock remains below target. - Check-In needs no explicit cooldown-clearing: once stock reaches target again, the writer's own below-target check already skips regardless of the cooldown field (AC 4 satisfied for free). - Manual shopping-list adds are untouched - they never go through the writer, so AC 5 holds structurally. **Tests:** New handler tests for both sides (cooldown blocks the write while active / write resumes once expired / cooldown is set only for `PantryAuto` + `InCart=true`, not for manual entries or for checking back off). Full local suite green (978 Checkly.Tests + 52 WebApi.Tests + 119 Common.Tests). **Note:** implementation coincided with `#192` (concurrent session, same directory) renaming the shared writer (`WriteMissingAmountIfBelowTarget` -> `WriteRestockAmountIfBelowTarget` with a new `restockQuantity` param) - reconciled via stash/pull/pop rather than racing the push; both features' call-site changes now coexist cleanly. **Backend-only**, no UI change (not requested by the AC). Commits: 91c27061 (implementation), 0b70b841 (team-memory notes).
lena closed this issue 2026-09-12 13:28:48 +02:00
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#193
No description provided.