# Åtgärdsplan utifrån E2E-fynd (Flyer + Inventory) ## Mål - Göra flyerflödet praktiskt användbart för jämförelse, redigering och planering till inköpslista. - Säkerställa att inventory/pantry visar korrekta kategorier i stället för att allt hamnar i `Övrigt`. ## Scope (utifrån dina punkter) 1. Flyer-vy: - Visa importerad flyer-PDF för jämförelse mot extraherade rader. - Redigera poster (namn + kategori) med samma kategorikälla som products/pantry. - `Planera X markerade` ska skapa en faktisk inköpslista i en egen flik. 2. Inventory: - Felsöka och åtgärda varför poster visas under `Övrigt`. --- ## Nulägesbild (från kodbasen) - Flutter har redan `FlyerImportTab` med: - filval/import, - checkboxar, - `Planera X markerade` -> `POST /flyer-sessions/:id/selections/bulk`. - PDF-visning finns idag bara för aktuell uppladdad fil i minnet (`_pickedFile.bytes`) och kan inte återöppnas säkert vid återställd session/app-omstart. - Flyer-rader kan ännu inte redigeras i UI (ingen inline edit-dialog för flyer-item). - Meal Plan har en shopping-sektion, men ingen dedikerad flik för flyer-planerade köp. - Kategori-träd finns redan och används i flera vyer via `/categories/tree`. - Inventory läser kategori via `product.categoryRef`; null blir `Övrigt` i UI. --- ## Genomförandeplan ### 1) Flyer-PDF: beständig förhandsvisning per session **Backend** - Lägg till lagring av originalfil för flyer-session (MVP: lokal filstore eller DB blob beroende på befintligt mönster i projektet). - Utöka `flyer_session` metadata med filreferens (filnamn, mime, storlek, storageKey). - Ny endpoint: `GET /flyer-import/sessions/:sessionId/source` (auth + ägarskap) som streamar PDF/bild. **Flutter** - I `FlyerImportTab`: - använd befintlig local preview direkt efter uppladdning, - när session återställs: hämta source-endpoint och visa `Visa flyer` även då. - Behåll fallback-meddelande för plattformar som inte kan öppna PDF direkt. **Klart-kriterium** - Samma importerade flyer kan öppnas efter tab-byte och app-omstart för samma användare. ### 2) Redigering av flyer-poster (namn + kategori) **Backend** - Lägg till endpoint för uppdatering av flyer-item i session, t.ex. - `PATCH /flyer-import/sessions/:sessionId/items/:itemId` - fält: `rawName` (eller `displayName`) och `categoryId` (ev. `categoryHintPath` för visning). - Validera att kategori finns i samma kategoriträd (`categories`). - Ägarskapskontroll via sessionens `userId`. **Flutter** - I listan i `FlyerImportTab`: lägg till `Redigera`-action per rad. - Edit-dialog: - textfält för namn, - kategori-väljare baserad på samma träd/komponentmönster som inventory/pantry/admin. - Spara uppdatering till backend och uppdatera lokal/session state. **Klart-kriterium** - Användaren kan ändra namn och kategori på en flyer-rad och ser ändringen direkt i listan. ### 3) Flyer -> Inköpslista i egen flik **Backend** - Definiera enkel shopping-list-resurs för MVP (user-scoped): - tabell t.ex. `shopping_list_item` (name/productId/categoryId/quantity/unit/source/status/userId). - Ny endpoint för att skapa inköpsrader från flyer-selections: - `POST /flyer-sessions/:sessionId/selections/plan-to-shopping-list` - alternativt återanvänd bulk-create i shopping-modul. - Deduplicering/regler: - om samma `productId+unit` finns öppet: summera eller hoppa över (bestäms i implementation; rekommenderat: summera). **Flutter** - Lägg till ny flik/skärm `Inköpslista` i app-shell. - `Planera X markerade` i flyer-vyn ska: 1) skapa/uppdatera flyer selections, 2) trigga backend-mappning till shopping-list, 3) visa snackbar med antal tillagda/uppdaterade rader. - Inköpslista-vyn (MVP): lista rader + enkel check/avprickning. **Klart-kriterium** - Klick på `Planera X markerade` flyttar markerade flyer-produkter till Inköpslista-fliken. ### 4) Inventory-fel: allt i `Övrigt` **Felsökning** - Verifiera varför `product.categoryId/categoryRef` blir null i aktuella poster: - skapade produkter utan kategori, - importflöden som inte persistar vald kategori, - äldre data utan backfill. **Åtgärd** - Säkerställ att produktskapande från import/edit alltid skickar/sätter kategori när sådan är vald. - Lägg skydd i backend så kategori inte tappas vid update-flöden. - Engångs-backfill för befintliga produkter utan kategori: - använd befintlig kategoriseringslogik (regel/AI) + fallback till rimlig underkategori. - Kör re-fetch/invalidations i Flutter inventory/pantry efter backfill. **Klart-kriterium** - Inventory/pantry visar blandade korrekta kategorier; endast okända poster ligger kvar i `Övrigt`. --- ## Testplan ### Backend - Nya tester för: - auth/ownership på source-endpoint och item-edit endpoint, - validering av kategori-id, - plan-to-shopping-list (antal skapade, dedupe, idempotens). ### Flutter widget/integration - Flyer: - render av `Visa flyer` efter restore, - edit-dialog uppdaterar rad, - `Planera X markerade` ger förväntad feedback. - Inköpslista: - ny flik syns, - mottar rader från flyer. - Inventory regression: - kategori visas från product category path när satt, - `Övrigt` endast fallback. ### E2E-checklista - Importera flyer PDF -> öppna PDF -> redigera 2 rader -> planera markerade -> verifiera Inköpslista-fliken. - Starta om app -> återöppna samma flyer-PDF -> verifiera ändringar kvar. - Kontrollera inventory/pantry-kategorier efter backfill. --- ## Leveransordning (rekommenderad) 1. Inventory-kategori bugfix + backfill (snabbt värde, hög påverkan). 2. Flyer item-redigering (namn/kategori). 3. Inköpslista-flik + backend-mappning från flyer. 4. Beständig flyer-PDF source-visning (kan byggas parallellt med 2/3 om backendkapacitet finns). --- ## Risker och mitigering - **Datamigrering/backfill-risk**: kör först mot staging + logga träffsäkerhet och antal fallback till `Övrigt`. - **Dubbelposter i inköpslista**: inför tydlig dedupe-regel och testfall. - **PDF-hantering per plattform**: behåll web-first öppning och tydligt fallback-meddelande där native viewer saknas. - **Prestanda vid stora flyers**: paginera/virtuallista om UI blir tungt. --- ## Definition of Done - Flyer-vyn har fungerande: PDF-visning, redigering av namn/kategori, planering till inköpslista. - Inköpslista finns som separat flik och visar planerade flyer-rader. - Inventory/pantry kategoriserar korrekt och `Övrigt` används endast som verklig fallback. - Nya backend- och Flutter-tester gröna.