Nota

Maquette · facturation assistée par IA

Contact
MAQUETTE · L'APPLICATION UNE FOIS REPRISE

Une facture juste,
à chaque fois.

Une application de facturation par IA ne tombe presque jamais en panne bruyamment. Elle répond, le document est bien formé, et le montant est faux une fois sur dix. Voilà à quoi ressemble la même application quand l'IA est encadrée.

AVANT

Ligne 11 250,00
Ligne 2 480,00
Ligne 3 199,90
Total HT 1 929,00
TVA 20 %385,80

La somme des lignes fait 1 929,90. Le modèle a écrit 1 929,00. Rien ne l'a signalé.

APRÈS

Ligne 11 250,00
Ligne 2 480,00
Ligne 3 199,90
Total HT 1 929,90
TVA 20 %385,98

Le total est recalculé par le serveur, jamais repris du modèle. L'écart est impossible.

3 %

d'erreur d'extraction sur 300 documents par jour, c'est 9 factures fausses quotidiennes, sans aucune alerte

0

trou toléré dans la numérotation : le code des impôts exige une séquence continue

2 j

pour auditer votre code existant et vous rendre un plan de reprise chiffré

CE QUI CHANGE CONCRÈTEMENT

Quatre défauts qu'on retrouve presque toujours

Aucun ne provoque de plantage. C'est précisément pour cela qu'ils survivent à la mise en production, et qu'on les découvre chez le client final.

AVANT

Le modèle répond en texte libre, on découpe à la main

// la réponse est du texte, on espère qu'elle ressemble à du JSON const r = await llm.chat({ prompt }) const data = JSON.parse( r.text.split('```json')[1] )
  • Un jour le modèle ajoute une phrase avant le JSON, tout casse
  • Aucun champ n'est garanti présent ni typé
  • Le modèle est appelé par un alias qui change sous vos pieds
APRÈS

La sortie est contrainte par un schéma, la version du modèle est figée

// le fournisseur garantit la forme, pas nous const data = await llm.extract({ model: '…-2026-05-14', // figé schema: FactureSchema, // strict documents: [pdf] }) await verifierArithmetique(data) // serveur
  • La forme de la réponse ne peut plus varier
  • Chaque champ est typé et obligatoire
  • Le fournisseur ne peut plus changer le modèle sans votre accord

Un point souvent mal compris. Fixer la température à zéro ne rend pas un modèle reproductible : le calcul en virgule flottante sur processeur graphique, le regroupement des requêtes côté fournisseur et le routage interne introduisent une variabilité que ce réglage ne contrôle pas. On ne rend pas l'IA déterministe, on rend le système déterministe autour d'elle.

AVANT

Le numéro est posé dès le brouillon, ou dérivé de l'identifiant en base

NUMÉROÉTAT
F-2026-0141émise
F-2026-0142émise
F-2026-0143brouillon abandonné
F-2026-0144supprimée
F-2026-0145émise
F-2026-0145doublon
  • Deux trous et un doublon dans la séquence
  • Le doublon vient d'un SELECT MAX(n)+1 non atomique
  • Une facture émise a été supprimée au lieu d'être annulée par un avoir
APRÈS

Le numéro est attribué à la finalisation, sous verrou, et devient immuable

NUMÉROÉTAT
F-2026-0141émise
F-2026-0142émise
F-2026-0143émise
F-2026-0144annulée par avoir A-2026-0009
F-2026-0145émise
brouillon, sans numéro
  • Séquence continue, aucun trou, aucun doublon
  • Un brouillon ne consomme pas de numéro
  • Une facture émise ne se supprime pas, elle s'annule par un avoir
  • Une séquence propre à chaque société, pas une séquence globale partagée

Ce n'est pas un détail d'affichage. Le code général des impôts impose un numéro unique, chronologique et continu. L'amende prévue est faible, mais une numérotation trouée ou dupliquée constitue un indice de comptabilité non probante, ce qui expose à un rejet de comptabilité en cas de contrôle. C'est le genre de défaut qui se corrige d'autant plus mal que des factures ont déjà circulé.

AVANT

Les montants sont stockés en nombres à virgule flottante

-- en base montant_ht DOUBLE PRECISION tva DOUBLE PRECISION -- et donc, en production : SELECT 0.1 + 0.2 = 0.3; → false
  • Des écarts d'un centime apparaissent au fil des additions
  • Le total affiché diffère du total recalculé par le comptable
  • Le total vient du modèle, il n'est jamais revérifié
APRÈS

Les montants sont des entiers, et le total est recalculé côté serveur

-- en base : des centimes, en entier montant_ht_cents BIGINT tva_cents BIGINT // le total du modèle sert de contrôle, pas de source if (somme(lignes) !== data.totalHt) { rejeter('ECART_ARITHMETIQUE') }
  • Aucun arrondi parasite possible
  • Le total du modèle est comparé, jamais recopié
  • Un écart bloque l'émission et déclenche une vérification humaine
  • La TVA est calculée par taux, pas globalement
AVANT

La clé du fournisseur d'IA est écrite dans le code

// config.js — commité le 12 mars apiKey: 'sk-••••••••••••••••••••' dbUrl: 'postgres://user:motdepasse@…'
  • Retirer la ligne ne suffit pas : elle reste dans l'historique du dépôt
  • Toute personne ayant eu accès au code a la clé
  • La consommation d'IA peut être utilisée par un tiers, à vos frais
APRÈS

Les secrets sortent du code, et les anciens sont révoqués

// variables d'environnement, jamais commitées apiKey: env.get('LLM_API_KEY') dbUrl: env.get('DATABASE_URL') // + détection automatique à chaque envoi de code aucun secret détecté
  • Toutes les clés exposées sont révoquées et régénérées
  • Un contrôle automatique bloque tout nouvel envoi contenant un secret
  • Un plafond de dépense est posé chez le fournisseur d'IA

L'APPLICATION

Sept écrans, et un principe

L'IA propose, le serveur dispose. Rien de ce que produit le modèle n'entre en base sans avoir été recalculé et validé. Cliquez dans le menu.

Dépôt de document

Une facture fournisseur, un bon de commande, ou une consigne en texte libre

📄

Déposez un document

PDF, image, ou photo prise au téléphone

EN COURS DE TRAITEMENT

facture-atelier-bernard.pdf TERMINÉ

12 lignes extraites · confiance 0,97

devis-scan-page2.jpg À VÉRIFIER

3 champs sous le seuil de confiance

commande-2026-0774.pdf EN COURS

extraction · 1,8 s

Le document est traité comme une donnée, jamais comme une consigne. Un PDF peut contenir du texte invisible porteur d'instructions à destination du modèle. Le contenu extrait est cloisonné du prompt, et le modèle n'a le droit de déclencher aucune action : il remplit un formulaire, il ne pilote rien.

LA PREMIÈRE ÉTAPE

On ne chiffre pas un code qu'on n'a pas lu

Tout ce que vous venez de voir suppose de savoir dans quel état se trouve votre application. C'est l'objet de l'audit : deux jours pour vous dire ce qui va, ce qui ne va pas, et combien coûte chaque correction.

Le rapport vous appartient. Il reste exploitable par n'importe quel développeur, y compris si vous confiez la suite à quelqu'un d'autre.

LE LIVRABLE QUI COMPTE

Pas « votre code a de la dette technique ». Le pourcentage exact de vos factures qui sortent fausses, mesuré sur vos propres documents, avec la cause de chaque erreur.

1

Jour 1

Cadrage de 45 minutes, reproduction des symptômes que vous décrivez, lecture de l'architecture. Puis le cœur IA : validation arithmétique, sortie contrainte, et mesure de fiabilité sur vos documents réels.

→ Vos symptômes reproduits ou infirmés, et le taux d'erreur chiffré

2

Jour 2

Numérotation et conformité des factures, sécurité : secrets, dépendances vulnérables, étanchéité entre comptes. Puis rédaction du rapport, chiffrage de la reprise lot par lot, et restitution d'une heure en visioconférence.

→ Failles par gravité, rapport, plan chiffré, et un avis motivé : réparer ou repartir sur une base saine

Deux jours, c'est court, et c'est volontaire. L'objectif n'est pas de tout inventorier, c'est de vous donner les décisions à prendre et leur coût. Je vais au fond sur ce qui commande la suite — la fiabilité de la génération, la numérotation, la sécurité — et je signale le reste sans le creuser.

AUDIT COMPLET

500 € HT

DÉLAI

2 jours ouvrés

DISPONIBILITÉ

Sous 48 h

Payé à la livraison du rapport, pas à la commande
Déduit de la reprise si vous me la confiez
Restitution d'une heure en visioconférence incluse
Aucun engagement au-delà de l'audit

Et ensuite ?

La reprise est chiffrée dans le rapport, lot par lot, sur la base de ce que j'aurai réellement trouvé. Je préfère vous expliquer pourquoi je ne l'annonce pas aujourd'hui plutôt que de laisser un blanc : tout chiffre avancé maintenant serait inventé. Vous avez déjà fait développer cette application une fois ; vous méritez un devis fondé sur des faits.

Tarif jour ensuite : 600 € HT, garanti douze mois.

MON EXPÉRIENCE SUR CE SUJET

Je développe et j'exploite mon propre logiciel de gestion en production, avec exactement les briques dont il est question ici.

400-600

factures traitées par mois

~40 h

gagnées chaque mois

Lecture automatique des factures fournisseurs par IA
Rapprochement bancaire assisté par IA
Node.js, AdonisJS, PostgreSQL, TypeScript

Ce n'est pas une démonstration commerciale : c'est un outil dont je dépends pour ma propre comptabilité. J'ai donc déjà rencontré et résolu la plupart des problèmes que votre application rencontre probablement. Je peux vous le montrer en écran partagé pendant notre échange.

15 ans de développement, profil senior, applications métier sur mesure et IA appliquée.

HORS PÉRIMÈTRE DE L'AUDIT

Correction des anomalies trouvéeschiffrée dans le rapport
Nouvelles fonctionnalitésidem
Mise en productionaprès assainissement
Certification par un organismedémarche externe
Raccordement à une plateforme agrééechantier distinct
Conditions générales et mentions légalesrelève d'un juriste

CE DONT J'AI BESOIN POUR COMMENCER

Un accès en lecture à votre dépôt de code
45 minutes de votre temps pour le cadrage
Quelques documents réels pour mesurer la fiabilité

Accord de confidentialité signé avant tout accès, si vous le souhaitez. Rien d'autre.

Discutons de votre projet

Vingt minutes suffisent à savoir si l'audit a du sens dans votre cas. Je peux aussi vous montrer mon propre outil de facturation en fonctionnement, en écran partagé. Je réponds en moins de 4 h les jours ouvrés.

Vous préférez rester sur Codeur ? Répondez-moi directement, ça marche aussi.