Commit Graph

305 Commits

Author SHA1 Message Date
Claude fbb251ea72 feat(worker): verify-translations + set-test-locale (kvalitetsrapport & marknadstest)
- verify-translations.ts: läser DB och rapporterar täckning per språk, hur många
  som föll på verifieringen, titel=svenska-heuristik och stickprov (titel + steg 1).
  Kör efter svepet för att kvalitetskolla utan att ögna alla recept i appen.
- set-test-locale.ts: sätter språk/region/valuta för ett testkonto utan psql, för
  att simulera olika marknader (t.ex. EUR så SEK-receptpriset döljs).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 17:29:28 +00:00
Claude 0ecd78f7e3 feat(worker): translation-status.ts – snabb översikt över översättningsläget
- Litet diagnostikscript: skriver ut recipe_translations per språk × status
  (draft_ai vs published), antal publicerade recept, och varje kontos
  language_tag. Så man slipper psql för att se hur långt svepet kommit och
  vilket innehållsspråk ett testkonto faktiskt har.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 16:09:22 +00:00
Claude b5bfb7cb8b feat(worker): --limit=N i translate-recipes för billig pilot över alla språk
- translate-recipes.ts får en valfri --limit=N som bara köar de N första
  (alfabetiskt) publicerade recepten × målspråk. Syfte: kvalitetskolla en
  handfull recept på ALLA språk innan hela svepet (~496 × 11) körs och betalas.
- Skriver ut vilka recept som valts i pilot-läge så man vet vad man ska granska.
- Oförändrat i övrigt: idempotent, resumbar, draft_ai -> verifiering ->
  publish-translations.ts publicerar bara det som klarat verifieringen.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 15:42:51 +00:00
Claude d22f3d746b i18n(säsong+kock): lokalisera säsongsnamn (12 språk), snyggare tidshint, rensa dubbletter
- Säsong/högtidschippen på "Vad ska vi äta?" visade marknadens namn på svenska
  även för icke-svenska språk (SE-marknadens event saknar nameLocalized). Nu
  renderas de via i18n-nyckeln season.<slug> (t med defaultValue -> serverns namn
  som fallback för egennamn m.m.). SE-marknadens 14 event översatta i alla 12
  språk; egennamn (Navidad, Midsommar, Lucia...) behålls, beskrivande översätts
  (Kräftskiva, Skolstart, Grillsäsong...).
- Kok-läget: den boxade ⏱-rutan (såg ut som en knapp/timer och kunde misstas för
  en riktig timer) ersatt med en diskret rad "⏱ Ungefär {time}". Döda nycklar
  cooking.timer/timerDone/timerRunning borttagna; cooking.timerHint -> approxTime.
- Städat 2 dubblettnycklar i alla 12 locale-filer (mealbox.eatBy, common.remove)
  som låg kvar sedan tidigare leveranser (i18next tog sista värdet ändå).
- Vakt + typecheck gröna. 591 nycklar.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 14:37:26 +00:00
Claude e7657d0153 feat: dölj SEK-receptkostnad för icke-SEK-användare + i18n:remove-language
- Recept-kostnaden ligger i SEK (basvaluta, D-028). För en spansk användare
  (currency != SEK) nollas estimatedCostMinorPerPortion i API:t (list + detalj)
  -> kostnads-taggen försvinner helt i stället för att visa en svensk SEK-siffra.
  (Beslut: hellre ingen uppskattning än fel valuta, tills riktpriser via kvitton/M8.)
- i18n:remove-language – motsvarighet till add-language, tar bort ett språk rent.
  Verifierat: add el -> remove el -> byte-rent, vakt + typecheck gröna.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 12:59:56 +00:00
Claude 2076bbc15b i18n(rekommendationer): localisera 💡-raden + meal-box-text (12 språk)
- 💡 why-texten: what-to-eat skickar nu användarens languageTag till motorn;
  scoring använder buildWhy(..., ctx.languageTag) i stället för hårdkodat buildWhySv.
  WHY_TEMPLATES har redan alla 12 språk – felet var bara att sv-SE var fast.
  Default sv-SE = oförändrat beteende (säkert). (Rest: utgår-ingrediensens NAMN
  i meningen är fortf. svenskt – motorn har bara svenska namn; noterat.)
- meal-box-förslagens text: whySv-sträng -> useByUrgent-flagga + mealbox.eatBy/ready
  i alla 12 språk (klienten renderar via t()).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 02:32:31 +00:00
Claude 6d36ec7459 feat(i18n): i18n:add-language – nytt språk i ett kommando
node scripts/i18n-add-language.mjs <kod> <bcp47> "<eget namn>"
Skapar locale-fil (sv-platshållare), registrerar i i18n.ts (import +
SUPPORTED_LANGUAGES + resources), lägger språkväljar-etiketten i alla filer.
Endast textinsättning → minimala diffar. Verifierat: testspråk -> typecheck+vakt gröna.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 02:32:31 +00:00
Claude 2d59a3e636 i18n(app-svep) + i18n-vakt: hela mobil-UI:t översatt + CI-vakt mot regress
- Svepte 51 hårdkodade strängar -> t() över konto, sök/bläddra, sparade recept,
  kök, planera, skanna, byt måltid, inköp, minne, cooking, api-fel (+ locLabel/
  kategorier via nycklar). 47 nya nycklar, översatta till alla 12 språk.
- NY: apps/mobile/scripts/i18n-check.mjs (i18n:check) – fäller bygget om ett språk
  saknar en nyckel, en använd nyckel saknas, eller det finns hårdkodad UI-text.
  Wire:ad i CI (.github/workflows/ci.yml) efter typecheck. => 'lägg till språk'
  blir: kör vakten, den listar exakt vad som fattas. Aldrig mer leta för hand.
- Prettier-fixade 5 filer från tidigare leveranser så format:check blir grön.
- submit-recipe fri-text-payload + firebase dev-stubs markerade // i18n-ignore.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 01:50:08 +00:00
Claude cadaa1a41f i18n(hem+nav) + fix(samtycke-layout): hem-fliken, nav-titlar, samtyckesrad bryter inte
- profile.tsx: samtyckesraden fick flex:1 på texten så längre språk (t.ex. spanska)
  inte trycker på/av-knappen ur läge (låg till vänster förut)
- home.tsx: Dina sparade recept, Skicka in eget recept, matlager-underrubrik,
  Allt/Öppna, platsnamn (Kyl/Frys/Skafferi...) -> t() (via typ, ej svenskt DB-namn)
- _layout.tsx: nav-titlar (Bläddra recept, Sparade recept, Matlager, Streckkod, Byt ut) -> t()
- 15 nya nycklar (home.*/nav.*) i alla 12 språk

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 00:58:18 +00:00
Claude 28c4d0db71 i18n(hemskärm): översätt rekommendationstitlar + ingrediensnamn + hårdkodade strängar
- what-to-eat översätter nu recepttitlar (resolveRecipeTitles, batch) + /saknas-
  ingrediensnamn (via allIngredients-id-karta + resolveIngredientNames)
- index.tsx använder rec.title/item.name; hårdkodat -> t(): sökfält, Rekommenderat,
  Toppval, Menade du, Baka (kategori), tomma-lägen
- 7 nya nycklar (wte.searchPlaceholder/recommended/topPick/didYouMean/emptySearch/
  emptyHoliday, cat.baking) i alla 12 språk
- KVAR (separat): whySv-prosan (kräver strukturerade skäl), säsongsval (region), meal-box-titlar

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 00:36:35 +00:00
Claude 4e86b1b724 i18n(recept): steg + täcknings-etiketter spanska, översatta saknade-namn, cache-nyckel
- cooking-skärmen renderade instructionSv (alltid svenska) -> nu instruction ?? instructionSv
- recept-skärmens täckningskort hårdkodade svenska (Du har X% hemma, Saknar N,
  Du saknar, Lägg till i inköpslistan, Tillagt) -> t()-nycklar recipe.coverage.*
- coverage.missing fick översatt displayName i API:t (annars svenska ingrediensnamn)
- 7 nya recipe.coverage.*-nycklar i alla 12 språk
- persister-cache-nyckel -> -v2 (slänger gammal helsvensk cache en gang)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-21 00:06:33 +00:00
Claude 02d5bc4f73 fix(ai): implementera TRANSLATE_RECIPE i Gemini-klienten (saknades helt)
I AAMOS_MODE=gemini (direkt Gemini-nyckel) hanterade klienten bara bild-/
skann-uppgifterna; TRANSLATE_RECIPE föll i default-grenen och returnerade
'failed' - därför funkade foto-avläsning men INTE receptöversättning för den
som kör med egen Gemini-nyckel.

Lägger till en text-only översättningsväg (samma mönster som
generateRecipeCandidates): buildTranslatePrompt bevarar tal/stegantal/
stegnummer och kräver JSON enligt translateRecipeOutput; svaret valideras mot
kontraktet. Verifierat med mockad Gemini-respons: status=ok, korrekt titel +
stegantal, kostnad bokförd.

Detta var grundorsaken till 'TRANSLATE_RECIPE misslyckades: failed' i kön.
2026-08-20 21:25:24 +00:00
Claude 5974e8740f fix(scripts): ladda .env i translate/publish-skripten (annars saknades DATABASE_URL)
De fristandiga skripten laste bara process.env och kunde inte hitta DATABASE_URL
(till skillnad fran worker/seed som laddar .env). Lade till samma dotenv-sokning
(.env / ../.env / ../../.env) sa de funkar med  utan att man
exporterar variabler manuellt. Verifierat: bada kor nu utan export och laser .env.
2026-08-20 19:27:14 +00:00
Claude 16fb29cc12 i18n(innehåll): komplett ingrediensöversättning (362×11) + receptöversättnings-verktyg
Ingredienser: fyllde luckan från 101 till 362 för da/de/es/fi/fr/it/nb/nl/pl/pt
(engelska hade redan alla 362). Nu 3982 översättningar, 11 språk kompletta – en
spansk/tysk/fransk användare ser ingrediensnamn på sitt språk, inte svenska.
Författat av språkexperter per språk, verifierat mot 362-listan + kvalitetskoll.

Recept: 407 recept har 0 översättningar (svensk källa visas). Lade till två
körbara skript för AI-pipelinen (kräver din Gemini-nyckel i workern):
- scripts/translate-recipes.ts [språk|all]  – köar TRANSLATE_RECIPE för alla
  publicerade recept × språk, idempotent (hoppar redan gjorda).
- scripts/publish-translations.ts [språk|all] – publicerar de utkast som klarat
  den inbyggda verifieringen (numbersPreserved/stegantal/confidence); övriga
  stannar som utkast för granskning.

Verifierat mot testdatabas: ingredient_translations 3982 rader/11 språk kompletta;
enqueue köar 405 jobb; processor skapar draft_ai+ok; publish publicerar; steg-
översättningar följer med och serveras.
2026-08-20 18:35:59 +00:00
Claude ac87bd8d77 feat(skanna): notis om att foto kostar en skanning (streckkod gratis)
Behaller maltidsfoto men informerar: 'Varje foto raknas som en skanning av din
kvot. Streckkod ar alltid gratis.' visas pa Skanna-skarmen under kvot-raden.
Ny i18n-nyckel scan.costNote x 12 sprak. Verifierat: mobil-typecheck gront.
2026-08-20 16:48:54 +00:00
Claude 34b5ca2f9d chore(skanna): ta bort 'bäst före datum'-knappen (fyllde ingen funktion)
Tar bort expiry_date ur skanningsknapparna pa Skanna-fliken. Sjalva scan-typen
finns kvar i backend/enums (ofarligt), bara knappen forsvinner. Verifierat:
mobil-typecheck gront.
2026-08-20 16:42:18 +00:00
Claude 364603d571 feat(streckkod): Klar-knapp for att bekrafta + ga tillbaka ur skannern
Efter lyckad lasning/produktbidrag fanns bara 'Skanna igen'. Nu finns en tydlig
knapp som bekraftar och gar tillbaka dit man kom ifran (router.back):
'Stammer - klar' nar man just bidragit med foto, annars 'Klar'. 'Skanna igen'
finns kvar som sekundar, och 'Fota baksidan' visas nar info saknas.
Nya i18n-nycklar barcode.done + barcode.looksRight x 12 sprak.

Verifierat: mobil-typecheck gront.
2026-08-20 16:40:11 +00:00
Claude d75500bebd fix(streckkod+kvitto): sparad-bekraftelse, fettvarden, kvitto-antal
Streckkod / produktbidrag:
- Tydlig bekraftelse 'Sparad i delade katalogen - tack!' visas nu efter att en
  fotad produkt lasts av, sa man ser att bidraget gick fram (forut bara
  'Skanna igen' utan aterkoppling).
- Naringsetiketter laser nu ocksa enkelomattat och fleromattat fett (t.ex.
  olivolja visar tre fettrader). Nya valfria falt monounsaturatedFatG/
  polyunsaturatedFatG i NutritionValues + READ_NUTRITION_LABEL + prompt +
  produktpanelen. Obligatoriska EU-falt oforandrade.

Kvitto:
- Rader som ar samma vara (samma normaliserade namn + enhet) slas nu ihop till
  EN vara med ratt antal - '2 x mjolk' pa kvittot blir en vara a 2 st i stallet
  for tva rader a 1 st. Priser summeras, rabatter dras som forut. En kvittorad
  raknas som minst 1 exemplar aven om antal saknas.

Verifierat: typecheck hela repot gront, nutrition-engine 19/19, ai-contracts
24/24, worker 23/23, api 104/104, samt repro mot testdatabas (2 mjolk-rader ->
1 vara a 2; olivolja sparar fett/mattat/enkel-/fleromattat).
2026-08-20 14:37:45 +00:00
Claude cac98b8dc7 fix(veckoplan+streckkod): byt ratt, planera om, variation, man-son + fota fram/bak
Veckoplan/kalender:
- Byt ratt: PATCH satter nu titeln (och portioner/status) efter det nya
  receptet, inte bara recipeId - annars visade kalendern kvar gamla ratten.
- Planera om veckan: ersatter nu veckans plan (raderar tidigare + entries via
  kaskad) sa man aldrig far dubbletter och alltid ser den nya planen. Nytt
  plan-id ger ocksa ny variation.
- Variation: liten deterministisk jitter per recept, seedad pa plan-id +
  veckostart, sa olika veckor OCH omgenereringar blir olika. Tackning/utgang
  dominerar fortfarande. Skalas av varietyLevel.
- Veckoplaneraren visar alltid mandag-sondag (mondayOf), oavsett dagens dag.

Streckkod (fota okand produkt):
- Fotar nu fram- OCH baksida (multi-foto) sa AI:n far bade namn (fram) och
  naring/innehall (bak). Prompt uppdaterad for flera bilder.
- Worker uppdaterar en befintlig delad produkt aven utan nytt namn (behaller
  namnet, fyller pa naring/innehall/allergener) - och sparar ny produkt aven
  fran baksidesfoto (fallback-namn) sa data inte tappas.
- Produktpanelen visar 'Fota baksidan (naring & innehall)' nar info saknas, sa
  man kan komplettera en halvfardig produkt. Fel visas som dialog utan att
  tappa vyn.
- 5 nya i18n-nycklar x 12 sprak.

Verifierat: typecheck (ai-contracts/worker/api/mobil), worker 23/23,
ai-contracts 24/24, api 104/104, samt repro mot testdatabas (byt ratt satter
titel; planera om ger 1 plan; 3 veckor + omgenerering varierar; delvis produkt
kompletteras och behaller namnet).
2026-08-20 13:45:35 +00:00
Claude 2f596060b4 feat(streckkod): okand produkt -> fota forpackning -> spara i delad katalog
Okand streckkod erbjuder nu 'Fota forpackningen' direkt i streckkodsvyn.
Fotot lases av (naring/allergener/innehall) och produkten UPSERTas i den
DELADE products-katalogen kopplat till GTIN (dataSource=user_scanned,
verificationStatus=unverified, createdByUserId=anvandaren) sa nasta person
som skannar samma kod far den direkt. Produkten laggs INTE till i lagret.

Naringsdeklaration-knappen tas bort som egen ingang - flodet vavs in i
streckkodsskanningen. product_package/nutrition_label -> READ_NUTRITION_LABEL
avslutar som 'completed' med result.product (ingen awaiting_confirmation).

- validation: barcode-falt i createScanInput.context
- worker: ny gren i processScanJob som skriver till products + returnerar tidigt
- mobil: inline contributePhoto (fota -> ladda upp -> polla -> visa info)
- scan: ta bort naringsdeklaration-knappen
- i18n: barcode.contributing.* + uppdaterad unknownBody pa 12 sprak

Verifierat: typecheck (validation/worker/api/mobil), worker 23/23, api 104/104,
och repro mot testdatabas (products-upsert, ingen inventory, idempotent aterskann).
2026-08-20 11:57:58 +00:00
Claude 3fa5a878f1 feat(priser): schablonpris pa alla ingredienser (44 saknade)
Alla 44 ingredienser utan defaultPriceMinorPerKg har fatt rimliga
schablonpriser (kr/kg) sa det ALLTID finns en prisuppskattning; kvitto-
priser forfinar sen. Verifierat: 0 ingredienser utan pris i DB.
2026-08-20 01:00:55 +00:00
Claude 0c614e0920 feat(sasong): 13 fler grillsasong- & kraftskiva-recept
Grillsasong (+8): grillad entrecote m. potatisgratang, grillkorv m.
potatissallad, hemgjorda hamburgare, grillad kyckling m. klyftpotatis,
grillspett, majskolv, halloumi, grillad lax. Kraftskiva (+5): toast
skagen, vasterbottenpaj m. kantareller, agghalvor m. rakor, knackebrod
m. vasterbottenost, kraftsallad. Ratt ASCII-slug (grillsasong/kraftskiva).
Verifierat: grillsasong 5->13, kraftskiva 4->9, seed gron (406 recept).
2026-08-20 01:00:55 +00:00
Claude fd4670d6b7 chore(hem): ta bort Matlador-knapp + matsvinn-widget
Matlador-QuickLink borttagen (koden ligger kvar); kvarvarande knappar
(Inkopslista/Hushall/Profil) skalar jamnt via flex:1. Matsvinn-widgeten
i matbudgeten borttagen (fyllde ingen funktion); 'denna vecka' kvar.
2026-08-20 00:54:32 +00:00
Claude ceceb63e8e fix(veckoplan): byt-ratt-fel, navigera veckor, lagg till maltid manuellt
- Byt rätt gav 'något gick fel': limit=30 översteg schemats tak (20).
  Höjt taket till 50, byt rätt hämtar 40 + sök vilken rätt som helst.
- Veckonavigering: pilarna byter nu VECKA (weekOffset) i stället för att
  bara flytta markerad dag -> går att planera nästa vecka. Titel visar
  veckans datumintervall; bakåt spärras före denna vecka.
- Lägg till måltid: ny POST /v1/week-plans/:id/entries + knapp 'Lägg till
  måltid' (väljer måltidstyp -> receptväljaren i lägg-till-läge) + knapp
  'Planera om veckan'. Går nu att fylla en tom dag igen.
Verifierat: swap 200 (40 varierade), add-entry 201, delete 200, api 104/104.
2026-08-20 00:54:32 +00:00
Claude 9b3456b080 feat(veckoplan): tillbehor (t.ex. potatisgratang) foreslar proteinbit
Rena tillbehor utan protein i titeln (potatisgratang, mos, pommes) far
en not: 'servera med en proteinbit (ryggbiff/entrecote, kyckling, fisk
eller tofu/halloumi)'. Kott-/korv-/fiskgratanger raknas som hela ratter.
Verifierat mot riktig data: 5 av 19 gratang-traffar klassas som tillbehor,
inga falska traffar pa proteinratter.
2026-08-19 23:54:34 +00:00
Claude ec33634b3d feat(plan): atgardspanel som bottenpanel (Modal) i stallet for Alert
Klick pa en maltid oppnar en egen panel: 'Jag lagade detta' (ratt dag),
'Byt ratt', 'Ta bort'. Ingen 'Avbryt' - tryck utanfor for att stanga.
Kanns mer enterprise an systemets Alert-ruta.
2026-08-19 23:54:34 +00:00
Claude ceaf0de0c2 feat(byt-ratt): sok bland ALLA recept vid byte
Byt-ratt-skarmen far ett sokfalt. Med sokning filtreras maltidstyp bort
pa servern -> byt till vilken ratt som helst. Utan sokning visas breda
forslag for slotten (view=swap).
2026-08-19 23:54:34 +00:00
Claude fbf5c82ccc feat(prenumeration): egna recept endast for betalande kunder - inte trial
communityPublish satts till false aven under trial (ovriga premium-
funktioner ingar fortfarande i provperioden). Endast betalda planer
(household/family/large_household) far skicka in egna recept. Uppdaterat
premium-meddelandet i appen (11 sprak + sv) sa det inte langre antyder
att provperioden lases upp funktionen. Verifierat: subscriptions 10/10,
api 104/104, typecheck gron.
2026-08-19 23:44:08 +00:00
Claude d96b119e67 feat(kockrecept): 16 fler signaturratter (omgang 2, 56 totalt)
Fish and chips, caesarsallad, ugnslax, korv & mos, kikartscurry,
brownies, mascarponepasta, linssallad, aubergine med yoghurt,
jordnotsgryta, lasagne, tomatrisotto, cajunkyckling, parmesankyckling,
fransk loksoppa, fiskbullar - egna formuleringar, diskret krediterade.
Verifierat: ids/enheter ok, seed gron (393 recept), typecheck gron.
2026-08-19 23:33:32 +00:00
Claude 56f4a98472 chore(i18n): oversatt nya app-texter till 11 sprak + cookedLog-nycklar
QR-produktinfo (barcode.info.*), egna recept (submit.*) och 'har du
lagat denna' (cookedLog.*) fyllda i en/da/nb/de/nl/fr/es/it/pt/fi/pl
(39 nycklar/sprak). Slutar falla tillbaka pa svenska.
2026-08-19 23:33:32 +00:00
Claude 122122f10a feat(lager): dedup per forvaringsplats + tydlig Ta bort per rad
Skann-bekraftelse slar bara ihop dubbletter inom SAMMA plats (mjolk i
kyl != mjolk i frys) + hoppar over tomma poster. Lagerlistan far en
tydlig 'Ta bort' direkt pa varje rad (inte bara via markering).
2026-08-19 23:33:32 +00:00
Claude c6c82ea520 feat(recept): 'Har du lagat denna?' - logga + rakna av lager
Ny ruta langst ner pa receptet: registrera att man lagat ratten sa
r:knas ravarorna av fran lagret och maltiden loggas (aven utan kalender).
Saknade ravaror hoppas over utan krasch (befintlig /cook-endpoint).
2026-08-19 23:33:32 +00:00
Claude 3f0f6953bb fix(mobil-nav): stabil tillbaka-knapp (slutar blinka/hoppa)
Chevron utan textetikett (headerBackButtonDisplayMode: minimal) sa
'tillbaka'-labeln inte mats om och blinkar 2-3 ggr under push.
2026-08-19 23:33:32 +00:00
Claude 0cc8f036d6 fix(inkopslista): visa den genererade listan (inte en gammal tom)
POST aterananvander EN aktiv lista per veckoplan (staplar inte nya),
GET sorterar nyaste forst, och appen navigerar med listId. Tidigare
hamnade de genererade raderna i en lista skarmen inte visade -> tomt.
2026-08-19 23:33:32 +00:00
Claude 393bc35ac0 feat(veckoplan): fyll alla maltider, variation, ratt maltidstyp + plan-atgarder
Veckoplanen fyller nu ALLA slots (stegvis fallback, inga tomma dagar),
undviker tva soppor/samma kok i rad och styr soppor mot lunch (inte
middag). Default lunch+middag varje dag. Plan-atgarder: 'Jag lagade
detta' bara ratt dag; 'Hoppa over' ersatt med 'Ta bort' (ny DELETE
/v1/week-plans/:id/entries/:entryId). Verifierat mot 393 recept:
14/14 slots fyllda, 0 upprepningar, 0 soppor pa middag.
2026-08-19 23:33:32 +00:00
Claude 5867a95d64 fix(byt-ratt): bredda urvalet - alla lampliga ratter, inte bara det man har hemma
Ny 'swap'-vy i rekommendationsmotorn med lag tackningsvikt (30->6) sa
betyg/smak/ratt maltidstyp styr i stallet for 'har hemma'. Byt rätt-
skarmen anropar view=swap, kringgar vardags-tidsgransen och hojer limit
till 20. Loser: bara ~5 val vid byte.
2026-08-19 23:33:32 +00:00
Claude e3e3fdfd73 feat(kockrecept): 30 fler signaturratter fran 10 kockar (egna formuleringar)
Utokar kock-katalogen fran 10 -> 40 recept (3-5 per kock): Gordon Ramsay,
Jamie Oliver, Nigella Lawson, Yotam Ottolenghi, Marcus Samuelsson, Giada
De Laurentiis, Emeril Lagasse, Ina Garten, Raymond Blanc, Rick Stein.
Kanda ratter (shepherd's pie, sticky toffee, shakshuka, doro wat, svenska
kottbullar, jambalaya, coq au vin, ratatouille, creme brulee, fiskcurry,
moules mariniere m.fl.) - EGNA nyskrivna formuleringar, diskret krediterade
via creatorDisplayName. Ligger bland ovriga recept, lyder diet-/allergi-
filter, sokbara pa kockens namn (aven felstavat via fuzzy-soket).

Verifierat: alla ids finns, alla enheter berakningsbara, seed gron (377
recept), typecheck gron, allergener determiniskt harledda (t.ex.
moules -> blotdjur+mjolk), alla publicerade.
2026-08-19 22:06:51 +00:00
Claude 0e057bc25d feat(egna-recept): knapp i Hem + inmatningsmall for egna recept
Ny knapp 'Skicka in eget recept' i Hem, direkt under 'Dina sparade
recept' (samma kort-stil). Ny skarm submit-recipe: enkel mall (titel +
ingredienser med mangd/gram/kilo + tillagning). Skickas som fritext ->
AAMOS strukturerar -> workern AI-granskar, dubblettkollar, finskriver
och auto-publicerar, markt med anvandarens namn.

Hanterar 402/PREMIUM_REQUIRED snyggt (egna recept ingar i Premium/trial;
gratisnivan ser uppgraderingsvy i stallet for ratt fel). Backend fanns
redan (POST /v1/recipes + STRUCTURE_RECIPE_TEXT).
2026-08-19 21:54:28 +00:00
Claude f45eb5724b feat(streckkod): visa produktinfo i stallet for lagg-till + fixa avbryt-buggen
QR/streckkod ar nu ett rent informationsflode: skanna for att SE vad
produkten innehaller. Panelen visar full naring per 100 g (energi,
fett/mattat, kolhydrat/socker, fiber, protein, salt), allergener,
'kan innehalla spar av', ingredienslista (Innehall) och kalla. Ingen
'lagg till'-knapp langre.

Buggfix: kameran triggar onBarcodeScanned manga ggr/sek och state-
flaggorna uppdaterades asynkront -> parallella uppslag staplade tva
Alert-rutor (okand forst, produkten bakom -> syntes forst efter Avbryt).
Nu synkront ref-las + panel i stallet for Alert.
2026-08-19 21:50:37 +00:00
Claude 24743fc58f fix(inkopslista): sortera bakning/chark/skaldjur/krydda/dryck till ratt avdelning
CATEGORY_TO_SECTION saknade dessa kategorier, sa varorna hamnade under
'Ovrigt'. Nu: bakning+krydda -> Kryddor & bakning, chark -> Chark,
skaldjur -> Fisk & skaldjur, dryck -> Dryck. Fixar aven aldre varor
(t.ex. julskinka/chark) som redan fanns men sorterades fel.
2026-08-19 21:38:30 +00:00
Claude 38c882e743 feat(katalog): utoka ingredienskatalogen 145 -> 362 (bred tackning)
217 nya vanliga svenska livsmedel med standardiserade schablonvarden per
100 g (seed_estimate): mejeri/ostar, kott & fagel (styckdetaljer, farser,
korv), chark, fisk & skaldjur, mycket gronsaker/frukt/bar, baljvaxter,
spannmal/pasta, brod, bakning, notter/fron, oljor/vinager/saser, torkade
kryddor samt dryck. Ratt enhet + densitet/styckvikt, korrekta allergener
och kost-/religionsflaggor. Verifierat: seed gron (362), typecheck gron,
Atwater-rimlighetskoll (avvikelser bara dar fiber/syror forklarar dem).
2026-08-19 21:38:30 +00:00
Claude ba776daaa1 feat(egna-recept): auto-publicera anvandarrecept efter AI-kontroll + dubblettkoll
Publiceringsflodet for anvandarinskickade recept gar nu hela vagen
automatiskt: submitted -> AI-granskning -> dubblettkontroll -> published.
Bara AI-underkanda eller exakta dubbletter (jaccard >= 0.9) stoppas.
Tidigare hamnade allt i in_moderation for manuell granskning.
2026-08-19 21:17:01 +00:00
Claude e3cced8b62 feat(sok): fuzzy kock-sok + 'Menade du...?'-forslag
Felstavade kocknamn hittar ratt kock: aliaslista (remsey/ramsey -> Gordon
Ramsay) + trigram word_similarity (ramzay/otolengi). Ger nolltraffar ett
'Menade du <term>?'-forslag (tappbart) mot titlar, kocknamn, ingredienser.
2026-08-19 20:55:03 +00:00
Claude 2a7f366f6a feat(kockrecept): 10 kockars signaturratter, diskret krediterade
Egna formuleringar av kanda signaturratter (Ramsay, Oliver, Lawson, Ottolenghi,
Samuelsson, De Laurentiis, Lagasse, Garten, Blanc, Stein). Ligger bland alla
andra recept, samma kort/vyer/filter; diskret 'Kalla: <kock>' via
creatorDisplayName, ingen flik/badge. Sokbara pa kocknamn.
2026-08-19 20:18:03 +00:00
Claude b052d919cf feat(sok): bredare sok - hogtidsnamn, ingredienser och kock
Soket matchar nu aven hogtidsnamn (julafton -> julmat), ingredienser (lax ->
alla laxrecept) och kocknamn (ramsay -> Gordon-recept), utover titel/trigram.
Fortfarande inga falska traffar (pannkakor ger bara pannkakor).
2026-08-19 20:18:03 +00:00
Claude 15e48c8704 feat(priser): kvittopris -> lager + blandat marknadspris per ingrediens
Bekraftade kvittovaror far sitt netto-pris (efter rabatt) i lagret. Prisupp-
skattningar anvander nu ett robust marknadssnitt: median av observerade pris/kg
fran lagret, klampat mot schablonen och viktat efter antal observationer -> ett
'realtidsnara' pris dar en extremt dyr/billig butik inte drar ivag snittet.
2026-08-19 20:18:01 +00:00
Claude c13edae2fa fix(kvitto): visa produkter fran kvittoscanning (mappa lines -> items)
Gemini laste kvittot korrekt men resultatet ('lines') slangdes bort: hela
bekraftelseflodet (app scan-review + API extractProposals/annotate) forvantar
sig 'items' i foto-format. Darfor blev VARJE kvitto tomt. Mappar nu icke-
rabattrader till items och kor samma kanoniska namnmatchning som for foton.
2026-08-19 19:01:14 +00:00
Claude bde08a0d2f fix(vad-ska-vi-ata): visa betyg (stjarnor) i listan
ScoredRecommendation som rankAll returnerar bar inte ratingAverage/ratingCount,
sa svaret till mobilen saknade dem helt -> stjarnorna syntes aldrig aven efter
satt betyg. Aterkopplar nu betyg per recept fran kandidaterna i svaret.
2026-08-19 17:28:14 +00:00
Claude 935c613c75 fix(mobil-webb): krascha inte pa webben (Firebase-persistens)
getReactNativePersistence/AsyncStorage finns inte i webb-bygget (react-native-
web) och gav 'Cannot read properties of undefined (reading bind)' vid start.
Pa webben anvands nu Firebases standard-webblagring (getAuth), pa native
AsyncStorage som forr. Gor att webbversionen kan koras for felsokning.
2026-08-19 17:20:39 +00:00
Claude fcd5c7989f fix(inkop): stabil ordning i inkopslistan (id som tie-breaker + sortOrder pa nya varor)
Varor som lades till via recept/manuellt fick alla sortOrder=0. GET-listan
sorterade pa (sektion, sortOrder) utan stabil brytare, sa nar en rad bockades
av (UPDATE) kastades ordningen om - varorna hoppade. Nu: id som sista
sorteringsnyckel (total, deterministisk ordning) + nya varor far nasta
sortOrder sa de laggs sist.
2026-08-19 16:50:18 +00:00