feat(finlab): import de relevé par image (upload dashboard → scan Console IA) (#69)

Process dédié pour actualiser le portefeuille à partir d'une capture de relevé :

- Dashboard : bouton « 📥 Importer un relevé » (panneau Mes comptes) → upload de
  l'image vers le workspace (imports/) via POST /api/import ; une modale donne la
  phrase exacte à dire à la console + un lien direct
- Backend : endpoints /api/import (UploadFile, refuse les non-images) et /api/imports
  (listing), dossier imports/ sous FINLAB_HOME (workspace, persistant)
- Persona console (CLAUDE.md) : workflow « Import d'un relevé » — lire l'image,
  extraire compte/positions, mapper vers tickers Yahoo en VÉRIFIANT les cours,
  confirmer, puis mettre à jour portfolio.yaml

Le scan vision se fait dans la Console IA (abonnement, pas de clé API). Le dashboard
n'est que le pont d'upload. Testé : POST image→200 + listing OK, non-image→400 ;
JS node --check OK.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-06-30 11:00:29 +02:00 committed by GitHub
parent 2228613050
commit 8bbfe88a30
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 89 additions and 2 deletions

View file

@ -56,6 +56,30 @@ courtier + BNP Paribas PEA), **`watchlists.yaml`** (thèmes), **`alerts.yaml`**
les modifier à la demande (ex. « ajoute 5 actions Micron sur Revolut »), puis relancer les outils.
Les agrégats (`portfolio_summary`, alertes `portfolio`, scan) couvrent **tous les comptes**.
## Import d'un relevé (image → portefeuille)
L'utilisateur peut uploader une **capture de relevé** depuis le dashboard (bouton « Importer un
relevé ») ; l'image atterrit dans **`imports/`** du workspace. Quand on te demande d'importer un
relevé (« importe le relevé imports/… et mets à jour mon portefeuille ») :
1. **Lis l'image** (`Read imports/<fichier>`). S'il n'y a pas de chemin, prends la plus récente
de `imports/` (`ls -t imports/`).
2. **Extrais** : le **nom du compte** (banque/courtier visible sur la capture) et son **type**
(`banque`/`courtier`/`pea`/`crypto`), les **liquidités**, et chaque ligne : libellé + **ISIN**
ou code si présent, **quantité**, **PRU** (prix de revient), devise.
3. **Mappe chaque ligne vers son ticker Yahoo Finance** (actions FR/EU → suffixe `.PA`/`.AS` ;
ETF par leur mnémonique, ex. `PAEEM.PA`). **VÉRIFIE** chaque ticker avec
`python -m finlab.cli` ou l'outil `price` : le **cours doit coller au relevé** (sinon mauvais
ticker, cherche la bonne variante).
4. **Montre le compte reconstruit** (tableau ticker/qté/PRU + total) et **demande confirmation
avant d'écrire**.
5. Mets à jour **`portfolio.yaml`** (workspace) : **ajoute** le compte, ou **remplace**-le s'il
existe déjà (même nom), au format `accounts:`. Respecte les nombres exactement.
6. Relance `portfolio_summary` pour valider que les totaux collent au relevé. Rappelle que
c'est analyse only (aucun ordre réel).
> C'est `portfolio.yaml` du **workspace** (PVC) qui fait foi au runtime — c'est lui que tu édites.
## Méthode de réponse
1. Question chiffrée → appelle l'outil pertinent **avant** de conclure.