boursobank/README.md

129 lines
4.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Parseur de relevés BoursoBank
⚠ Cette bibliothèque a été développée indémendament de BoursoBank.
## Installation
pip install boursobank
## Sécurité
### Mot de passe
Cette bibliothèque ne **se connecte pas à internet** (dans le doute,
lis le code) elle ne fait que lire des relevés au format PDF déjà
téléchargés, tous les traitements sont effectés en local.
Dans le doute il doit être possible de faire tourner lapplication
dans [firejail](https://github.com/netblue30/firejail) ou similaire.
Il nest donc pas nécessaire de sinquiéter pour son mot de passe : il
nest pas demandé (là, pas besoin de relire le code : si la lib ne
demande pas le mot de passe… elle ne la pas).
### Erreurs du parseur
Lire des PDF [nest pas simple](https://pypdf.readthedocs.io/en/stable/user/extract-text.html#ocr-vs-text-extraction).
Pour sassurer de ne pas introduire derreur dans vos analyses, cette
bibliothèque fournit une méthode `validate()` qui valide que le
montant initial + toutes les lignes donne bien le montant final, sans
quoi une `ValueError` est levée.
Cet exemple ne lévera donc une exception quen cas derreur danalyse
(ou de la banque, comme au monopoly) :
```python
for file in args.files:
statement = Statement.from_pdf(file)
statement.pretty_print()
statement.validate()
```
## Interface en ligne de commande
Cette lib est utilisable en ligne de commande :
boursobank *.pdf
vous affichera vos relevés (CB ou compte), exemple :
$ boursobank 2024-01.pdf
2024-01.pdf
┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Date ┃ RIB ┃
┡━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 2024-01-01 │ 12345 12345 00000000000 99 │
└────────────┴────────────────────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Label ┃ Value ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ VIR SEPA Truc │ 42.42 │
│ VIR SEPA Machin truc │ 99.00 │
│ Relevé différé Carte 4810********0000 │ -123.45 │
└──────────────────────────────────────────┴──────────┘
## API
Tout lintérêt est de pouvoir consulter ses relevés en Python, par
exemple un export en CSV :
```python
import argparse
import csv
import sys
from pathlib import Path
from boursobank import Statement
def main():
args = parse_args()
statement = Statement.from_pdf(args.ifile)
writer = csv.writer(sys.stdout)
for line in statement.lines:
writer.writerow((line.label, line.value))
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("ifile", type=Path, help="PDF file")
return parser.parse_args()
if __name__ == "__main__":
main()
```
La bibliothèque ne fournit quun point dentrée : la classe `Statement`
Depuis cette classe il est possible de parser des PDF :
relevé_bancaire = Statement.from_pdf("test.pdf")
ou du texte :
relevé_bancaire = Statement.from_text("blah blah")
Cette classe fournit principalement deux attributs, un dictionnaire `headers` contenant :
- `date` : le 1° jour du mois couvert par ce relevé.
- `emit_date` : la date à laquelle le relevé a été rédigé.
- `RIB` : le RIB/IBAN du relevé.
- `devise` : probablement `"EUR"`.
- `card_number` : le numéro de carte bleu si cest un relevé de carte.
- `card_owner` : le nom du possesseur de la carte bleu si cest un relevé de carte.
et un attribut lines contenant des instances de la classe `Line` dont
les attributs principaux sont :
- `label` : la description courte de la ligne.
- `description` : la suite de la description de la ligne si elle est sur plusieurs lignes.
- `value` : le montant de la ligne (positif pour un crédit, négatif pour un débit).