diff --git a/backend/src/receipt-import/receipt-import.controller.ts b/backend/src/receipt-import/receipt-import.controller.ts index 22fd6150..7bb877fd 100644 --- a/backend/src/receipt-import/receipt-import.controller.ts +++ b/backend/src/receipt-import/receipt-import.controller.ts @@ -1,5 +1,6 @@ import { Controller, + HttpCode, Post, Request, UploadedFile, @@ -19,12 +20,14 @@ const ALLOWED_MIMES = [ 'image/heic', 'image/heif', 'application/pdf', + 'application/octet-stream', // Flutter Web skickar detta för PDF-filer ]; @Controller('receipt-import') export class ReceiptImportController { constructor(private readonly receiptImportService: ReceiptImportService) {} + @HttpCode(200) @Post() @Throttle({ default: { ttl: 60_000, limit: 20 } }) @UseInterceptors( diff --git a/flutter/next_steps_flutter.md b/flutter/next_steps_flutter.md index a57d587f..2ddea92b 100644 --- a/flutter/next_steps_flutter.md +++ b/flutter/next_steps_flutter.md @@ -32,12 +32,12 @@ Relaterade dokument: ## Arbetsplan ### Pågående arbete -- **Kvittoimport (Fas 6b):** Påbörjad men granskningssteg och bulk-spara återstår. +- **Kvittoimport (Fas 6b):** Grundflödet fungerar (2026-04-30) — PDF laddas upp, Mistral AI tolkar kvittot och returnerar strukturerade poster. Återstår: granskningssteg i UI och bulk-spara till pantry/inventarie. - **Bildimport:** Säkerställa att containrar är uppdaterade med senaste kod och att diagnostikloggar syns vid felsökning. - **Adminfunktioner:** Avancerad AI-integration och ytterligare adminfunktioner planeras men är ej migrerade. ### Prioriterade nästa steg -1. Slutför kvittoimport och bulk-spara. +1. Slutför kvittoimport: granskningssteg + bulk-spara. 2. Säkerställa robust bildimport och diagnostik. 3. Implementera avancerad AI-integration för produktkategorisering. 4. Utöka adminfunktioner för användarhantering och produktadministration. diff --git a/flutter/teknisk_beskrivning_flutter.md b/flutter/teknisk_beskrivning_flutter.md index e7f796c0..6553f8ad 100644 --- a/flutter/teknisk_beskrivning_flutter.md +++ b/flutter/teknisk_beskrivning_flutter.md @@ -44,8 +44,27 @@ Viktigt att komma ihåg vid implementering av nya funktioner och kodning är att ### Auth - Login endpoint: `POST /api/auth/login`. +## Kända fallgropar och API-gotchas + +### Flutter Web och PDF MIME-typ +- Flutter Web skickar PDF-filer med MIME-typ `application/octet-stream` istället för `application/pdf`. +- Backend (`receipt-import.controller.ts`) måste tillåta båda: `application/pdf` och `application/octet-stream` i `ALLOWED_MIMES`. +- Symptom om detta saknas: HTTP 400 "Otillåten filtyp. Använd JPEG, PNG, WebP eller PDF." + +### NestJS @Post() returnerar HTTP 201 som standard +- NestJS returnerar 201 (Created) för alla `@Post()`-endpoints som standard. +- Flutter-klienten (`ImportRepository`) accepterar nu alla 2xx-svar (`statusCode < 200 || statusCode >= 300`). +- Alternativt: lägg till `@HttpCode(200)` på backend-controllern för att returnera 200. +- Detta gjordes i `receipt-import.controller.ts` (2026-04-30). + +### Kvittoimport — backend och arkitektur +- `/receipt-import` hanteras av en **dedikerad** `ReceiptImportController` och `ReceiptImportService`, **inte** av `QuickImportController`. +- `ReceiptImportService` använder **Mistral AI** för att parsa kvitton till strukturerade `ParsedReceiptItem[]` direkt — inget markdown. +- Svaret från `/receipt-import` är en array av `ParsedReceiptItem`, inte `{ markdown: "..." }`. +- `{ markdown: "..." }` är svaret från `/quick-import` (receptimport) — inte kvittoimport. + ## Övrigt -- **Kvittoimport (Fas 6b):** Påbörjad men granskningssteg och bulk-spara återstår. +- **Kvittoimport (Fas 6b):** Grundflödet fungerar. Återstår: granskningssteg i UI och bulk-spara till pantry/inventarie. - **Bildimport:** Säkerställa att containrar är uppdaterade med senaste kod och att diagnostikloggar syns vid felsökning. - **Adminfunktioner:** Avancerad AI-integration och ytterligare adminfunktioner planeras men är ej migrerade.