feat: implement hybrid alias model for receipt import and enhance alias learning in UI

This commit is contained in:
Nils-Johan Gynther
2026-05-02 00:24:30 +02:00
parent d64f34f4ff
commit d6fef0145c
3 changed files with 34 additions and 12 deletions
+18 -4
View File
@@ -74,10 +74,24 @@
## Nästa steg
1. Deploy och smoke-test av kvittoimportflödet på server.
2. Fortsatt flytt av UI-strängar till ARB (inventarie, pantry, recept).
3. Smoke-test på testdomän och avstämning.
4. Planera och påbörja avancerad AI-integration och EAN-skanning.
1. Inför hybrid alias-modell för kvittoimport: user-scope alias som standard + global alias som admin-verifierad fallback.
2. Uppdatera backend-matchordning för alias: user-alias -> global alias -> poängbaserat namnförslag -> AI-kategori.
3. Implementera automatisk alias-inlärning vid manuell korrigering i importflödet (först user-scope).
4. Deploy och smoke-test av kvittoimportflödet på server.
5. Fortsatt flytt av UI-strängar till ARB (inventarie, pantry, recept).
6. Smoke-test på testdomän och avstämning.
7. Planera och påbörja avancerad AI-integration och EAN-skanning.
## Beslut 2026-05-02 - Aliasstrategi för kvittoimport
- Alias ska vara hybrid: user-scope som standard, globalt alias endast via admin-verifiering.
- Syfte: minimera felträffar mellan användare och samtidigt bygga en kvalitetssäkrad global kunskapsbas.
- Tekniskt nästa steg i backend:
- Lägg till user-scope för `ReceiptAlias` (t.ex. `userId` + relevanta unika index).
- Behåll global alias som fallback för admin-godkända mappningar.
- Tekniskt nästa steg i klient:
- Spara manuell korrigering som alias (default: user-scope).
- Eventuell admin-toggle för att spara alias globalt.
---
@@ -333,11 +333,11 @@ class _EditDialogState extends State<_EditDialog> {
final aiLabel = (aiPath != null && aiPath.isNotEmpty)
? aiPath
: ((aiCategory != null && aiCategory.isNotEmpty) ? aiCategory : null);
final suggestedProductLabel = (item.suggestedProductId != null &&
item.suggestedProductName?.isNotEmpty == true &&
item.matchedProductId == null)
final suggestedProductLabel = item.suggestedProductName?.isNotEmpty == true
? _normalizeProductName(item.suggestedProductName!)
: null;
: (item.matchedProductName?.isNotEmpty == true
? _normalizeProductName(item.matchedProductName!)
: null);
final currentQuantity =
double.tryParse(_quantityCtrl.text.replaceAll(',', '.')) ?? widget.item.quantity;
final currentUnit = _unitCtrl.text.trim().isEmpty ? widget.item.unit : _unitCtrl.text.trim();
+11 -3
View File
@@ -39,9 +39,17 @@ Relaterade dokument:
### Prioriterade nästa steg
1. Säkerställa robust bildimport och diagnostik.
2. Implementera avancerad AI-integration för produktkategorisering.
3. Uka adminfunktioner för användarhantering och produktadministration.
4. Förbättra UI/UX för användarflöden, inklusive onboarding och profilhantering.
2. Implementera hybrid alias-stöd i kvittoimport tillsammans med backend: user-scope alias som standard och global alias via admin.
3. Sdja alias-inlärning i UI vid manuell korrigering (default: user-scope), samt visa scope tydligt för admin.
4. Implementera avancerad AI-integration för produktkategorisering.
5. Utöka adminfunktioner för användarhantering och produktadministration.
6. Förbättra UI/UX för användarflöden, inklusive onboarding och profilhantering.
## Notering 2026-05-02 - Aliasstrategi kvittoimport
- Flutter ska följa backend-kontraktet för hybrid alias-modell.
- Ingen klientspecifik speciallogik för matchning; klienten ska bara exponera tydliga val för scope vid manuell korrigering.
- Målet är färre felträffar mellan användare och bättre precision i personliga kvittoflöden.
## Beslut 2026-04-22 - User-scope för pantry och matplan