feat: implement alias strategy for receipt import with user-scoped and global fallback, enhance validation and normalization, and update UI components
Test Suite / test (24.15.0) (push) Has been cancelled

This commit is contained in:
Nils-Johan Gynther
2026-05-09 23:41:42 +02:00
parent b342de906e
commit 65137b41fb
17 changed files with 388 additions and 67 deletions
+62
View File
@@ -158,6 +158,68 @@ Fil: `deploy.sh`
3. UI för users: Om private rename/merge ska exponeras i användar-app (backend redan klart, saknas bara UI)
4. Unit/integration tests för private endpoints
---
# Sessionlogg: Aliasstrategi i kvittoimport (samma dag, senare)
## Mål under denna del
- Göra aliasstrategin konsekvent med user-scope som standard och global fallback via admin.
- Sluta lära alias automatiskt vid manuell korrigering och kräva explicit val i UI.
- Härda backend mot brusiga eller ogiltiga alias.
## Genomförda förändringar
### 1) Gemensam aliasnormalisering och guardrails (backend)
Filer:
- `backend/src/common/utils/receipt-alias.ts`
- `backend/src/receipt-alias/receipt-alias.service.ts`
- `backend/src/receipt-import/receipt-import.service.ts`
- Infört gemensam utility för aliasnormalisering (`trim`, lowercase, kollapsad whitespace).
- Infört validering som blockerar tomma alias och brusiga alias som `rabatt`, `summa`, `pant`, `att betala`, `totalt`, m.fl.
- Receipt import och alias-API använder nu samma regler för både lookup och sparande.
### 2) Receipt import lär inte längre alias automatiskt (Flutter)
Filer:
- `flutter/lib/features/import/data/receipt_import_session.dart`
- `flutter/lib/features/import/presentation/edit_dialog.dart`
- `flutter/lib/features/import/presentation/receipt_import_tab.dart`
- Infört explicit `learnAlias`-val i edit-dialogen.
- Alias sparas nu bara om användaren aktivt markerar att kvittonamnet ska läras in.
- Valet persisteras i receipt import-sessionen så att tabbyte inte tappar användarens val.
- Om raden redan matchades via alias visas förklarande text i stället för ny aliasinlärning.
### 3) Aliasöversikter visar scope tydligare (Flutter)
Filer:
- `flutter/lib/features/admin/domain/receipt_alias.dart`
- `flutter/lib/features/profile/presentation/user_aliases_screen.dart`
- `flutter/lib/features/admin/presentation/admin_aliases_panel.dart`
- Aliasmodellen utökad med `ownerId` och `isGlobal`.
- User alias-skärmen visar nu skillnad mellan `Privat alias` och `Global fallback`.
- Delete-knapp visas bara för privata alias i användarvyn, så UI:t matchar backend-behörigheten.
- Adminpanelen visar scope även för aliasposter.
### 4) Tester för aliasflödet
Filer:
- `backend/src/receipt-import/receipt-import.service.spec.ts`
- `backend/src/receipt-alias/receipt-alias.service.spec.ts`
- Tester tillagda för normalisering av whitespace vid alias-lookup.
- Tester tillagda för alias-upsert med normalisering.
- Tester tillagda för blockering av brusalias.
- Tester tillagda för behörighetsregler kring globala alias och borttagning.
## Verifiering
- ✅ Backend tests: 31/31 gröna för berörda aliasspecar
- ✅ Flutter analyze: OK för alla berörda alias/import-filer
## Kvar att göra
1. Manuell test i appen: receipt import med explicit alias-inlärning.
2. Produktionstest: verifiera att privata alias och global fallback beter sig rätt mot riktiga kvitton.
3. Bedöm om aliasöversikterna behöver mer avancerad filtrering eller redigering senare.
## Snabb checklista för nästa session
- [ ] Deploy backend + Flutter
- [ ] Testa scroll-fix i prod