Remplace les parseurs texte+regex (fragiles sur l'alignement en colonnes des PDF Oralia mal construits) par une extraction géométrique : reconstruction des lignes visuelles par regroupement vertical tolérant des mots, puis affectation de chaque valeur à sa colonne via les filets du tableau (pdfplumber find_tables). Corrections apportées : - locataires : montant/libellé « divers » dans la bonne colonne (plus le total cumulé du lot), nom de locataire correct (le logo/en-tête hors filets est ignoré), lignes multi-période et pages recollées. - opérations : fournisseur séparé de la description (TOTALENERGIES ≠ DIDIER NETTOYAGE, PPR ≠ BOUVARD), colonne Déductible remplie, Débit/Crédit distingués, fournisseur des honoraires reporté sur le bloc, fragments de description recollés (LATAPY, AUDOUIN). - code lot : gère « S10 - », « S 17 - » (espace) et « S01 SOLDE » (sans tiret). Branchés dans extractor.py avec repli sur les anciens parseurs si un tableau n'a pas de filets détectables. Validés par réconciliation comptable : locataires 124/124 lots, opérations 7/7 PDF et 25/25 catégories, au centime. Ajoute le bouton « Relancer l'extraction » dans l'écran d'édition : re-extrait depuis le PDF stocké et met en évidence les différences avec la version précédente (panneau récapitulatif + anneaux « modifié » sur les cartes). Le diff des opérations s'aligne par contenu (robuste aux changements d'ordre/nombre). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Plesna Gerance
Extracteur de comptes rendus de gerance Oralia/ICS.
Prerequis
- Python >= 3.10
- uv
- Node.js >= 22
L'extraction de PDF utilise
pdfplumber(Python pur) : aucun binaire systeme requis (plus besoin depoppler-utils/pdftotext).
Installation
uv sync
cd frontend && npm install
Developpement
Lancer backend et frontend dans deux terminaux separés :
make dev_back # Backend sur http://localhost:8000 (auto-reload)
make dev_front # Frontend sur http://localhost:5173 (hot-reload)
Ou les deux en parallele :
make dev
Ouvrir http://localhost:5173 — le proxy Vite redirige /api vers le backend.
Production (Docker)
make docker
Accessible sur http://localhost:8080.
Application de bureau (Windows, sans ligne de commande)
L'application peut etre empaquetee en executable Windows autonome : un seul fichier que l'utilisateur final installe et lance via une icone, sans Python, sans Node, sans terminal. L'extraction etant en Python pur, aucun binaire externe n'est requis.
Tester le mode bureau (depuis les sources)
Sous Windows (pywebview utilise WebView2, deja present) :
uv sync --group desktop
cd frontend && npm run build && cd ..
uv run plesna-gerance desktop # ouvre une fenetre native
Sous Linux, pywebview a besoin d'un moteur de rendu. Le groupe
desktop-linux fournit un backend Qt entierement pip-installable :
uv sync --group desktop-linux
cd frontend && npm run build && cd ..
uv run plesna-gerance desktop # necessite un environnement graphique ($DISPLAY)
Ce backend Qt ne sert qu'a tester le mode fenetre sous Linux : il n'est pas embarque dans le build Windows.
Produire l'executable + l'installeur
Deux options (le build doit se faire sur Windows, PyInstaller ne croise pas les plateformes) :
-
Sur une machine Windows — installer uv, Node.js et (optionnel) Inno Setup 6, puis :
powershell -ExecutionPolicy Bypass -File packaging\build_windows.ps1Produit
dist\PlesnaGerance.exeet, si Inno Setup est present,dist\PlesnaGerance-Setup.exe. -
Sans machine Windows — via GitHub Actions : le workflow
.github/workflows/build-windows.ymlcompile sur un runner Windows. Le declencher (onglet Actions ou en poussant un tagv*) puis telecharger l'artefactPlesnaGerance-windows.
Cote utilisateur final
Lancer PlesnaGerance-Setup.exe, suivre l'assistant (installation par
utilisateur, sans droits administrateur), puis cliquer sur l'icone Plesna
Gerance. Les donnees (base et documents) sont stockees dans
%APPDATA%\PlesnaGerance et conservees entre les mises a jour.
Assistant IA (optionnel) : la page IA necessite Ollama installe separement. Sans Ollama, l'application fonctionne normalement et la page IA indique simplement que le service est indisponible.