# Nästa steg > Förslag på vad vi kan ta tag i nästa gång vi öppnar projektet. > Se [README.md](README.md) för funktionsöversikt och [TEKNISK_BESKRIVNING.md](TEKNISK_BESKRIVNING.md) för teknisk detaljerinformation. --- ## Status — senast genomgånget: 2026-04-17 | Funktion | Status | |---|---| | Inventorie (CRUD, konsumtion, historik) | ✅ Klart | | Recept (skapa, visa, importera, matchning) | ✅ Klart | | Snabbimport (URL/PDF/bild/ICA) | ✅ Klart | | Kvittoimport (Mistral AI, OCR, alias) | ✅ Klart | | Matplanering (veckovy, inköpslista) | ✅ Klart | | Baslager (lista, lägg till, ta bort) | ✅ Klart | | Admin: Produkter (edit, merge, duplicate, restore) | ✅ Klart | | Receptredigering (frontend UX) | ✅ Klart | | Receptbilder (upload URL) | ✅ Klart | | Portionsjustering | ❌ Saknas | | Produktkategorier — fast lista | ❌ Saknas | | Receptlista — filtrering & kortvy | ✅ Klart | | Matplan — inventariejämförelse | ❌ Saknas | | Taggning av produkter | ⚠️ Delvis — kräver migration | | Näringsvärden på produkter | ⚠️ Delvis — kräver migration | | Autentisering (User-modell) | ❌ Saknas | | Användarspecifika produkter (UserProduct) | ❌ Saknas — kräver auth | --- ## Prioriterade förbättringar ### 1. Portionsjustering av recept Recept lagras utan portionsangivelse. Lägg till ett `servings`-fält och låt användaren justera antal portioner i receptvyn — ingrediensmängderna räknas om proportionellt (t.ex. 4 → 6 pers: × 1,5). - **Databas:** `servings Int?` på `Recipe` i Prisma + migration - **Backend:** `servings` exponeras i `RecipeDto`, sätts vid create/update - **Frontend (`app/recipes/[id]/`):** räknare (+ / −) bredvid ingredienslistan, beräkning i klientkomponent utan extra API-anrop - **Receptskapande (`write/`):** lägg till grundportioner-fält - **Matplan (`app/matplan/`):** inköpslistan justeras efter önskat portionsantal per dag ### 3. Matplanering — jämförelse mot inventariet Veckovy och inköpslista fungerar. Nästa steg är att visa vilka ingredienser på inköpslistan som redan finns hemma och i vilken mängd — liknande receptvyns inventory-preview. Implementeras via `GET /api/recipes/:id/inventory-preview` per recept, aggregerat på veckonivå. ### 4. Produktkategorier — definiera en fast lista Kategorier skrivs in som fritext i admin. Byt till en dropdown med fördefinierade kategorier (t.ex. "Mejeri, ost & ägg", "Kött, chark & fågel", "Frukt & Grönt") för konsistent data och bättre gruppering i baslagervyn. ### 5. Utökad databas med taggning Lägg till stöd för taggar, underkategorier och varumärke direkt på produkter. Möjliggör filtrering, sökning och rekommendationer baserade på taggar. **Schemaändringar (Prisma):** - **`Product`** — lägg till `subcategory String?` och `brand String?` (behåll `canonicalName`) - **`Tag`** — ny modell: `id`, `name @unique` - **`ProductTag`** — ny relationstabell (many-to-many: `Product ↔ Tag`) **Implementeringssteg:** 1. Uppdatera `backend/prisma/schema.prisma` med nya modeller och relationer 2. Kör migration: `docker exec recipe-api npm exec prisma migrate dev --name add_tags_subcategory_brand` 3. Skapa seed-fil (`data/seed_tags.sql`) med taggar och kopplingar 4. Kör seed-filen mot databasen 5. Exponera `tags`, `subcategory`, `brand` i produkt-DTOs och `GET /api/products` (lägg till `?tag=` och `?subcategory=` som filterparametrar) 6. Admin: lägg till tagg-hantering och underkategori-fält 7. Baslager/produktlista: filtrera per tagg eller underkategori **Rekommenderade taggar:** `ekologisk`, `svensk`, `laktosfri`, `glutenfri`, `vegan`, `nötfri`, `säsong`, `rökt`, `premium`, `lamm`, `korv`, `färs`, m.fl. ### 6. Näringsvärden på produkter Lägg till en `Nutrition`-modell kopplad till `Product` (one-to-one) med näringsvärden per 100g: kalorier, protein, fett, kolhydrater, salt, socker, fiber. Kan implementeras oberoende av autentisering. **Schemaändring:** ```prisma model Nutrition { id Int @id @default(autoincrement()) calories Float? protein Float? fat Float? carbohydrates Float? salt Float? sugar Float? fiber Float? product Product @relation(fields: [productId], references: [id]) productId Int @unique } ``` - **Backend:** CRUD via produktendpoints, exponeras i `ProductDto` - **Frontend:** Visa näringsvärden i produktdetalj och eventuellt i receptvyn (summerat per portion) ### 7. Autentisering — User-modell Förutsättning för användarspecifika produkter (punkt 10). Idag saknar hela appen autentisering — alla kan CRUD allt. **Scope:** JWT-baserad auth med `User`-modell (id, name, email, passwordHash). Berör: - Backend: AuthModule med NestJS Guards, JWT-strategi, skyddade routes - Frontend: Inloggningsflöde, token-hantering i API-anrop - Databas: `User`-tabell + migration > ⚠️ Detta är ett stort projekt i sig. Överväg om appen verkligen behöver fler användare eller om enkel HTTP Basic Auth räcker som skydd. ### 8. Användarspecifika produkter (UserProduct) Låter en användare spara egna produktvarianter med eget namn (t.ex. "Mormors Prästost") kopplade till en standardprodukt — eller fristående utan koppling. Kräver att punkt 9 (auth) är på plats. > ⚠️ **Överlapp med InventoryItem:** `InventoryItem` lagrar redan productId, quantity, unit, brand, bestBeforeDate och är i princip en "användarens produkt i lager". Klargör skillnaden: > - `InventoryItem` = vad som finns hemma just nu (lager) > - `UserProduct` = ett eget produktkort/favorit som kan återanvändas utan att vara lager > > Om distinktionen inte är tydlig, riskerar `UserProduct` att duplicera `InventoryItem`-logiken. --- ## Teknisk skuld och städning ### A. CanonicalNameForm och NameForm — ta bort gamla filer `frontend/app/admin/products/NameForm.tsx` och `CanonicalNameForm.tsx` ersattes av `EditProductForm.tsx`. Kontrollera om de gamla filerna fortfarande importeras och radera dem om inte. ### B. Oanvända fält på InventoryItem Följande fält finns i Prisma-schemat men används varken i backend-endpoints eller frontend-UI: `priority`, `opened`, `shelfNote`, `suitableFor`, `isOnSale`, `priceLevel`, `proteinType`, `isLeftover` Besluta: implementera stöd för dem eller ta bort via migration. ### C. Seed-data i versionshantering `data/matvaror_sverige.csv` och `data/seed_products.sql` ligger lokalt men är inte committade. Bestäm om de ska in i repot (för reproducerbarhet) eller hållas utanför. ### D. Enhetstester ✅ Jest + ts-jest är uppsatt. Tester finns för: - `normalize-name.ts` — 10 tester - `base.parser.ts` (`parseIngredientLine`) — 12 tester - `recipes.service.ts` (`normalizeUnit`, `convertUnit`) — 17 tester Kör med `npm test` i `backend/`. ### E. Validering av DTO:er i admin-actions Frontend-server-actions saknar validering på inkommande fält (tom sträng, för lång sträng, osv.). Lägg till enkel `trim()` + max-längd-kontroll i `frontend/app/admin/products/actions.ts`. ### F. Routing-städning för kvitto och import `/kvitto/page.tsx` redirectar till `/import?tab=kvitto`. `/recipes/import/page.tsx` redirectar till `/import?tab=recept`. Om dessa routes inte exponeras i navigeringen kan de tas bort; om de behövs som deep links är redirectarna ok men bör dokumenteras. --- ## Produktdatabasen 193 svenska produkter är inseedad. Nästa naturliga steg: - Lägg till fler saknade produkter som dyker upp vid receptimport - Gå igenom produkter utan `canonicalName` i admin och fyll i dem - Kontrollera att `category` är ifyllt för alla produkter (för bättre gruppering i baslager)