Barcode-Scan — geteilte, lernende Wissensbasis für Produktname + Kategorie über alle Listen #190
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#190
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: Barcode-Scan — geteilte, lernende Wissensbasis für Produktname + Kategorie über alle Listen
As a Nutzer mit mehreren Listen (z. B. Einkaufsliste und Vorratsschrank),
I want to dass ein einmal gescannter und benannter/kategorisierter Barcode auf JEDER Liste wiedererkannt wird - inklusive vorgeschlagenem Namen und Kategorie,
so that ich ein Produkt nicht auf jeder Liste erneut manuell benennen und einsortieren muss.
Kontext (verifiziert im Code):
Barcodeexistiert nur als Spalte direkt aufShoppingProductEntity/PantryProductEntityund wird beim Scan ausschließlich INNERHALB derselben Liste abgeglichen (ScanShoppingProductBarcodeCommandHandler:x.ShoppingListId == ... && x.Barcode == ...;ScanPantryProductBarcodeCommandHandler:x.PantryId == ... && x.Barcode == ...). Ein auf der Einkaufsliste bereits bekannter/umbenannter Barcode wird beim Scan auf dem Vorratsschrank (oder einer anderen Einkaufsliste) nicht wiedererkannt - der Nutzer startet dort bei Null.IOpenFoodFactsClient.TryLookupProductName) - eine rein online-basierte Quelle ohne Gedächtnis für zuvor selbst vergebene Namen.ProductSectionKnowledgeEntity-Wissensbasis automatisch zugeordnet, mit Nachfrage nur falls das fehlschlägt (ShoppingBarcodeScanDialog.tsxspendingCategoryProduct-Flow). Auf dem Vorratsschrank passiert das nicht:ScanPantryProductBarcodeCommandHandlersetzt die Kategorie eines neu über Scan angelegten Produkts IMMER hart auf die Standard-Kategorie der verknüpften Einkaufsliste - es gibt dort überhaupt keinen Auflösungs- oder Abfrage-Schritt für die Kategorie, nur für den Namen. Das deckt sich mit der Beobachtung: auf dem Vorratsschrank wird aktuell wirklich nur nach dem Namen gefragt, nie nach der Kategorie.ProductSectionKnowledgeEntity-System (aus #90, Scope kürzlich in #178 von app-weit auf pro-Einkaufsliste umgestellt) ist NICHT barcode-basiert, sondern rein namensbasiert (Produktname → Sektion/Kategorie) und wird nur für Texteingabe-Flows (Smart-Add etc.) genutzt, nicht für den Barcode-Scan-Flow.Acceptance criteria:
ProductSectionKnowledgeEntityetwas liefert.Out of scope:
ProductSectionKnowledgeEntity-System selbst (#178 behandelt dessen Scope bereits separat).useCategorySuggestions).Open questions (escalate to human if unanswered):
Entscheidung (2026-09-12, mit dem Menschen geklärt):
Damit sind beide offenen Fragen der Story geklärt - Issue ist bereit für die Umsetzung.
Claimed - Umsetzung beginnt. Architektur (mit dem Menschen vorab nicht-technisch abgestimmt): neue Tabelle
ProductBarcodeKnowledgeEntity, gescoped proShoppingListId(eindeutiger Index auf(ShoppingListId, Barcode)), gespeist/gelesen sowohl vom Einkaufslisten- als auch vom Vorratsschrank-Scan-Flow (Vorratsschrank löst über sein bestehendesTargetShoppingListIdauf dieselbe Liste auf, analog zu #174s bereits geteilten Kategorien). Konfliktregel: zuletzt gespeichert gewinnt (Upsert). Vorratsschrank-Scan fragt künftig zusätzlich nach der Kategorie statt sie stillschweigend auf die Standard-Kategorie zu setzen.Implemented and merged (commits
9cf7f088backend,156b5050frontend).Scope (final, nach Rücksprache mit dem Menschen):
ProductBarcodeKnowledgeEntity: Barcode -> zuletzt verwendeter Name + Kategorie, gescoped proShoppingListId, geteilt mit der verknüpften Vorratsschrank-Liste (via #174s bestehenderTargetShoppingListId-Verknüpfung), nie über unabhängige Listen hinweg.GetProductBarcodeKnowledgeForListQuery/ImportProductBarcodeKnowledgeFromCsvCommand), nutzt die bestehende CSV-Dialog-Infrastruktur - erlaubt, eine bereits gelernte Zuordnung von einer Liste in eine andere zu übertragen, statt bei 0 anzufangen.Sicherheits-Fix während der Umsetzung gefunden:
ScanPantryProductBarcodeCommandHandlervalidierte eine vom Client mitgegebene Kategorie-Id nicht gegen die tatsächliche Ziel-Liste (Einkaufslistes eigener Scan-Pfad hatte diese Prüfung bereits überCreateShoppingProductCommandHandler). Nachgezogen, mit eigenem Test (Rejects_a_fallback_category_id_that_belongs_to_a_different_list).Tests: 16 neue/erweiterte Backend-Tests (Scan-Handler beider Listentypen, Rename-Hooks, CSV-Import/-Export, #178s Re-Scoping inkl. eines Cross-List-Isolation-Tests), Frontend-Tests aktualisiert (neue
suggestedCategoryId/fallbackCategoryId-Felder, Kategorie-Picker-Props). Vollständig grün: 1136 Backend-Tests (965+52+119), 1324 Frontend-Tests (136 Dateien).