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).
This commit is contained in:
Claude
2026-08-20 11:57:58 +00:00
parent 3fa5a878f1
commit 2f596060b4
16 changed files with 256 additions and 22 deletions
+4 -1
View File
@@ -30,12 +30,15 @@
"barcode.allowCamera": "Camera toestaan",
"barcode.cameraBody": "{brand} heeft de camera nodig om streepjescodes te scannen.",
"barcode.cameraTitle": "Camera nodig",
"barcode.contributing.title": "Verpakking wordt gelezen…",
"barcode.contributing.body": "We halen voedingswaarde, allergenen en ingrediënten op en slaan het product op in de gedeelde catalogus, zodat de volgende het niet hoeft te fotograferen.",
"barcode.contributing.failed": "Kon de verpakking niet lezen. Probeer het opnieuw met een scherpe foto en goed licht.",
"barcode.kcalPer100": "{kcal} kcal/100 g",
"barcode.needHousehold": "Je hebt eerst een huishouden nodig.",
"barcode.noLocation": "Geen bewaarplek gevonden.",
"barcode.noNutrition": "Geen voedingswaarden",
"barcode.photoPackage": "Fotografeer de verpakking",
"barcode.unknownBody": "Dit product staat nog niet in de database. Fotografeer de voorkant en het voedingsetiket, dan voegen we het toe.",
"barcode.unknownBody": "Dit product staat nog niet in de database. Fotografeer de voorkant en de voedingswaarde we lezen de inhoud af en slaan het product op in de gedeelde catalogus, zodat de volgende dat niet hoeft. (Het wordt niet aan je artikelen toegevoegd.)",
"barcode.unknownTitle": "Onbekend product",
"common.add": "Toevoegen",
"common.back": "Terug",