Automatiser les notes de frais

Automatiser les notes de frais avec Python

Utilisation de Python et de l’API mindee pour automatiser les notes de frais

Auparavant, les employés devaient remplir leurs notes de frais à la main, ou du moins les rédiger sur une feuille de calcul. Puis les ordinateurs sont arrivés, avec des feuilles de calcul intégrées qui ont facilité la génération et le suivi des rapports. Mais que diriez-vous si vous pouviez automatiser l’ensemble du processus de saisie de données lui-même pour faciliter la génération de notes de frais à partir d’images de reçus ?

Dans cet article, je vais vous montrer les étapes pour automatiser les notes de frais à l’aide de Python.

Pas

Les étapes pour automatiser les notes de frais seront :

  1. Créer un compte sur la plateforme mindee
  2. Configurer une clé API
  3. Installez le package « mindee »
  4. Dépendances d’importation
  5. Fonctions d’aide à l’écriture
  6. Charger, analyser et extraire les données des reçus de dépenses
  7. Exporter les résultats vers une table
  8. Enregistrer le tableau dans un .csvfichier

Commençons!

1. Créer un compte sur la plateforme mindee

Pour cette automatisation afin d’éviter d’avoir à écrire du code personnalisé pour détecter le texte dans les images des reçus, nous utiliserons un package Python appelémindee , qui est livré avec une API qui vous permet de faire tout cela avec seulement quelques lignes de code.

Bien qu’une version professionnelle de ce forfait soit payante, ils proposent gratuitement 250 pages par mois , ce qui pour les particuliers devrait être largement suffisant pour automatiser leurs notes de frais personnelles.

Pour créer le compte, procédez comme suit :

  1. Rendez-vous sur le mindeesite de la plateforme
  2. S’inscrire

2. Configurer une clé API

Pour définir votre clé API, procédez comme suit :

  1. Cliquez sur « Créer une nouvelle API »
  2. Sélectionnez l’API « Reçu de dépenses »
  3. Copiez votre clé API et enregistrez-la.

3. Installez le paquet ‘mindee’

Pour installer le mindeepackage, exécutez :

pip installer mindee

4. Dépendances d’importation

Pour ce projet, nous utiliserons les packages suivants :

  • mindee
  • pandas
  • random
  • glob
  • matplotlib
  • seaborn

Si vous ne les avez pas dans votre environnement local, installez-les avec pip install <package>.

Nous pouvons maintenant importer nos dépendances :

à partir du client d'importation de mindee, les documents 
importent des pandas d'importation aléatoires 
en tant que pd 
import glob 
# Vérification de l'intégrité à l'aide de pandas et matplotlib 
import matplotlib.pyplot as plt 
import seaborn as sns 
sns.set()

5. Fonctions d’aide à l’écriture

Pour cette automatisation, nous aurons besoin de 3 fonctions d’assistance : une pour extraire les données de dépenses après avoir obtenu la réponse de l’ mindeeAPI, une autre pour convertir l’heure en type de repas (dans cet exemple, mon rapport de dépenses implique d’indiquer explicitement le type de repas comme le déjeuner ou le dîner. pour les dépenses alimentaires). Enfin, une troisième fonction pour créer le tableau final avec toutes nos données.

Le code sera :

Par l’auteur.
# Sortie des tests écrits ci-dessus['13:51', '11:49', '22:13', '19:57', '10:32', '20:47', '20:40', '14:27', ' 14:41', '15:06'] 
13:51 Déjeuner 
11:49 Déjeuner 
22:13 Dîner 
19:57 Dîner 
10:32 Déjeuner 
20:47 Dîner 
20:40 Dîner 
14:27 Déjeuner 
14:41 Déjeuner 
15:06 Déjeuner
png
Exemple de test du tableau final. Image de l’auteur.

6. Charger, analyser et extraire les données des reçus de dépenses

Maintenant, il ne nous reste plus qu’à :

  1. Instancier notre client mindee en utilisant la clé API que nous avons obtenue
# Instancier un nouveau client 
mindee_client = Client(api_key="Votre clé API")

2. Initialiser des listes vides qui contiendront les données extraites

liste_date = [] 
liste_montant = [ ] liste_catégorie = [] liste_heure = [ 
] 
liste_type_de_repas = [] 
liste_noms_de_fichier = 
[]

3. Chargez l’image d’un reçu de dépenses et alimentez-la dans l’API mindee

image = "./expense_images/1669895159779.jpg" 
input_doc = mindee_client.doc_from_path(image) 
api_response = input_doc.parse(documents.TypeReceiptV4) 
dépense_data = api_response.document 
dépense_données<mindee.documents.receipt.receipt_v4.ReceiptV4 à 0x7f9685b278b0>

La sortie sera un objet mindee adapté aux reçus de dépenses (il y a probablement quelques options, alors n’hésitez pas à les étudier dans la documentation officielle de la plateforme mindee).

4. Extrayez les informations sur les dépenses de la réponse de l’API

date, montant, nom de fichier, catégorie, heure = extract_expenses_data(expense_data)

5. Convertir les informations sur l’heure de la journée en informations pertinentes sur le type de repas

Cet exemple est très spécifique à mon cas particulier, vous pouvez donc modifier cette fonction en fonction des types de dépenses que vous avez. Mais ici, ce que je fais, c’est transformer une chaîne comme 13:30déjeuner et une chaîne comme 20:30dîner.

sinon heure : 
        type_de_repas = "Inconnu" 
sinon : 
    type_de_repas = convertir_heure_en_type_de_repas(heure)

6. Ajouter les informations extraites à leurs listes correspondantes

Dans ce cas, je ne fais cela que pour un seul reçu, mais lorsque vous le faites pour plusieurs reçus, l’approche par liste aura plus de sens.

date_list.append(date) 
# Je remplace le . pour , ici parce que le rapport final va sur 
# une feuille google qui prend `,` au lieu de `.` pour les nombres flottants. 
amount_list.append(str(amount).replace(".", ",")) 
category_list.append(category) 
time_list.append(time) 
meal_type_list.append(meal_type) 
filenames_list.append(filename)

7. Exporter les résultats vers une table

Maintenant que nous avons les données organisées, nous pouvons créer un tableau avec les données structurées.

# Le format du tableau sera | données | montant | nom de fichier | catégorie | 
df = create_table(date_list,amount_list,meal_type_list, time_list,category_list, 
                  filenames_list) 

# affiche le tableau pour vérifier 
df
png

8. Enregistrer le tableau dans un .csvfichier

Maintenant, pour finir, nous sauvegardons ce tableau avec toutes les informations que nous voulions des reçus de dépenses.

df.to_csv("expense_table.csv", header=False)

Rassembler tout

Maintenant que nous connaissons chaque étape en détail, le code source complet pour l’exécuter sur plusieurs reçus de dépenses :

Par l’auteur.
png
Tableau final avec les données extraites des reçus de dépenses. Image de l’auteur.

Voilà! Vous avez automatisé la tâche ennuyeuse de déclarer vos dépenses à partir d’images de reçus ! Comme vérification finale, il est toujours bon de jeter un coup d’œil aux résultats finaux pour s’assurer que les informations que vous obtenez sont cohérentes avec les données réelles des reçus de dépenses.

Pour cela, nous pouvons visualiser les reçus, côte à côte avec les données textuelles obtenues à partir de l’extraction pour chaque reçu de dépenses en utilisant matplotlib.

Par l’auteur. Le code source peut être trouvé ici .
Exemple d’exemple d’image de chèque. Image de l’auteur.
Exemple d’exemple d’image de chèque. Image de l’auteur.
... 
... 
... 
Je ne montre que quelques images avec des 
informations restreintes pour des raisons de confidentialité, mais l'idée générale est ici.

Ok, les résultats semblent cohérents ! Et voilà, une automatisation soignée pour vous faire gagner du temps chaque mois !

Réflexions finales sur l’automatisation de tout

Si vous êtes un gestionnaire, un développeur, un comptable ou à peu près quiconque travaille avec la saisie de données, cette approche peut être très utile. En substance, cela montre clairement que l’automatisation sur le lieu de travail est possible avec seulement quelques lignes de code Python.

Pourquoi ne pas utiliser un programme simple pour automatiser le traitement de vos notes de frais ? L’automatisation de tâches répétitives comme celles-ci peut vous faire gagner beaucoup de temps et ouvre la porte à la rationalisation de votre flux de travail.

Si vous préférez la vidéo, consultez ma vidéo Youtube sur ce sujet ici :

Retour en haut