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).
This commit is contained in:
Claude
2026-08-20 14:37:45 +00:00
parent cac98b8dc7
commit d75500bebd
17 changed files with 127 additions and 27 deletions
+2 -2
View File
@@ -972,7 +972,7 @@ Språk: ${lang}.`;
Läs av exakt det som står på förpackningen. Gissa aldrig värden som inte syns. Returnera:
- basis: "per_100_g", "per_100_ml" eller "per_portion" vad gäller näringstabellen?
- values: { kcal, proteinG, carbsG, fatG, saturatedFatG, fiberG, sugarG, saltG } null om ej synligt.
- values: { kcal, proteinG, carbsG, fatG, saturatedFatG, monounsaturatedFatG, polyunsaturatedFatG, fiberG, sugarG, saltG } null om ej synligt. Läs ALLA "varav"-rader under Fett: varav mättat (saturatedFatG), varav enkelomättat (monounsaturatedFatG), varav fleromättat (polyunsaturatedFatG).
- ingredientsText: rå text med ingredienser (från baksidan), eller null.
- allergensDeclared: lista med allergener som explicit nämns (t.ex. ["gluten", "mjölk", "nötter"]).
- gtin: streckkod/EAN om synlig, annars null.
@@ -983,7 +983,7 @@ Läs av exakt det som står på förpackningen. Gissa aldrig värden som inte sy
Svara ENDAST med giltig JSON som matchar detta schema:
{
"basis": "per_100_g" | "per_100_ml" | "per_portion" | null,
"values": { "kcal": number|null, "proteinG": number|null, "carbsG": number|null, "fatG": number|null, "saturatedFatG": number|null, "fiberG": number|null, "sugarG": number|null, "saltG": number|null } | null,
"values": { "kcal": number|null, "proteinG": number|null, "carbsG": number|null, "fatG": number|null, "saturatedFatG": number|null, "monounsaturatedFatG": number|null, "polyunsaturatedFatG": number|null, "fiberG": number|null, "sugarG": number|null, "saltG": number|null } | null,
"ingredientsText": string | null,
"allergensDeclared": string[],
"gtin": string | null,
+2
View File
@@ -222,6 +222,8 @@ export const readNutritionLabelOutput = z.object({
carbsG: z.number().nullable(),
fatG: z.number().nullable(),
saturatedFatG: z.number().nullable(),
monounsaturatedFatG: z.number().nullable().default(null),
polyunsaturatedFatG: z.number().nullable().default(null),
fiberG: z.number().nullable(),
sugarG: z.number().nullable(),
saltG: z.number().nullable(),
+4
View File
@@ -16,6 +16,10 @@ export interface NutritionValues {
fatG: number;
/** gram */
saturatedFatG: number;
/** gram enkelomättat fett. Valfritt (står oftast bara på vissa etiketter, t.ex. olja/nötter). */
monounsaturatedFatG?: number;
/** gram fleromättat fett. Valfritt (som ovan). */
polyunsaturatedFatG?: number;
/** gram */
fiberG: number;
/** gram */