Découpe d'un ticket de caisse article par article vers Tricount by Neyroe · Pull Request #1 · Neyroe/tricount-scanner · GitHub
Skip to content

Découpe d'un ticket de caisse article par article vers Tricount - #1

Merged
Neyroe merged 1 commit into
mainfrom
feat/tricount-scanner
Sep 7, 2026
Merged

Neyroe merged 1 commit into
mainfrom
feat/tricount-scanner

Conversation

@Neyroe

@Neyroe Neyroe commented Sep 7, 2026

Copy link
Copy Markdown
Owner

Pourquoi

Tricount partage une dépense uniformément (ou en parts fixes). Dans des courses à plusieurs,
la moitié d'un ticket est commune — pâtes, lessive, papier toilette — et l'autre moitié est
personnelle. Recopier 40 lignes à la main dans l'appli, personne ne le fait : on finit par tout
mettre en commun, et les comptes sont faux.

Cette PR apporte l'application complète qui fait ce découpage en une minute.

Le principe, en 4 temps

1. Connexion au Tricount — via son lien de partage. L'API (non publique) de Tricount/bunq est
utilisée avec une paire de clés RSA générée localement au premier lancement et stockée dans
credentials.json, exclu du dépôt. Pas de compte à créer, pas de mot de passe.

2. Lecture du ticket, sans IA — les applis d'enseigne (Mon E.Leclerc & co) exportent des PDF
avec une vraie couche texte. receipt_parser.py la lit avec pdfplumber + regex : pas d'OCR,
pas d'appel à un modèle, pas d'octet qui sort de la machine. Pour les enseignes sans export
(Lidl…), receipt_ocr.py fait un OCR local (EasyOCR), valide la somme des lignes contre le
total imprimé et signale toujours le résultat comme à vérifier.

3. Répartition — chaque ligne est Commun par défaut ; un clic la bascule sur une personne.
Les totaux par personne se recalculent en direct, rayon par rayon.

4. Écriture dans Tricount — une seule dépense est créée avec un custom split où chacun doit
ses articles perso + sa part égale du commun. Les arrondis sont absorbés par le dernier membre
pour que la somme des parts tombe exactement sur le total du ticket. Les dépenses déjà
existantes peuvent aussi être re-découpées après coup, en conservant la photo attachée.

Captures

Vue d'ensemble du Tricount — soldes et dernières dépenses :

Import du ticket (PDF, CSV ou photo), ou reprise d'une photo déjà dans le Tricount :

Répartition article par article — C = commun, ou une initiale pour l'attribuer à quelqu'un.
Le bandeau du haut suit les totaux en direct :

Confirmation : le détail de ce que chacun doit, perso + part du commun.

Ces captures viennent du mode démo ajouté par cette PR : membres (Alex / Billie / Charlie),
ticket et montants sont entièrement fictifs. Aucune donnée réelle dans le dépôt.

Essayer sans Tricount

pip install -r requirements.txt
python demo/demo_server.py     # http://localhost:8010

Le serveur de démo sert la vraie interface avec un Tricount fictif en mémoire et zéro appel
réseau
; le parsing, lui, est le vrai code — déposez samples/ticket_demo.csv dans l'écran
d'import pour dérouler tout le parcours.

Contenu

Fichier Rôle
main.py API FastAPI : connexion, création / édition / re-découpe des dépenses, proxy des photos
receipt_parser.py Parsing PDF & CSV (E.Leclerc + générique), pur Python
receipt_ocr.py OCR local des tickets photo, validé par le total imprimé
frontend/index.html Interface complète, sans build ni framework, installable en PWA
demo/demo_server.py Mode démo hors ligne
app.py Lancement en fenêtre native (pywebview)

Vie privée / secrets

  • .env (lien de partage du Tricount) et credentials.json (clés de l'appareil) sont des
    secrets et restent locaux : .gitignore les exclut, seul .env.example est versionné.
    Un lien de partage suffit à accéder à un Tricount entier.
  • Les tickets de caisse réels et leurs PDF sont également exclus ; le dépôt ne contient que
    l'échantillon fictif samples/ticket_demo.csv.
  • Le seul interlocuteur réseau de l'app en usage réel est l'API Tricount elle-même.

🤖 Generated with Claude Code

https://claude.ai/code/session_015qZ1PYFqwtmybDMB3XzDXL

Application complète : API FastAPI + interface une-page (PWA).

- main.py : connexion à un Tricount via son lien de partage, création d'une
  dépense en custom split (perso + part égale du commun), re-découpe d'une
  dépense existante en conservant sa photo, proxy des pièces jointes.
- receipt_parser.py : lecture des exports PDF/CSV des applis d'enseigne
  (E.Leclerc + générique) en pur Python, sans OCR ni IA.
- receipt_ocr.py : repli OCR local (EasyOCR) pour les tickets photo, validé
  contre le total imprimé.
- frontend/ : interface complète sans build ni framework, installable en PWA.
- demo/demo_server.py : mode démo hors ligne avec un Tricount fictif, et
  samples/ticket_demo.csv pour dérouler le parcours.
- docs/images : captures issues du mode démo (données fictives).

Aucun secret dans le dépôt : .env et credentials.json restent locaux.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qZ1PYFqwtmybDMB3XzDXL
@Neyroe
Neyroe merged commit 1a017cb into main Sep 7, 2026
Neyroe added a commit that referenced this pull request Sep 7, 2026
La fusion de la PR #1 avait été enregistrée avant l'intégration de la PR #2
dans sa branche ; ce merge amène le support Windows sur main.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qZ1PYFqwtmybDMB3XzDXL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant