Justif
Photographie ton justificatif. Range-le. Extrais-le.
Présentation
Justif · Photographie ton justificatif. Range-le. Extrais-le.
Justif transforme ton téléphone en scanner de factures relié à ton classeur comptable. Tu ouvres le site sur ton mobile, tu choisis d'abord OÙ va le document (un dossier récent, un nouveau dossier, ou un chemin entier comme Clients/Acme/2026), puis tu photographies ta facture. Tu places toi-même les quatre coins — pas de détection automatique qui se trompe — et Justif redresse la perspective et rend un vrai scan : à plat, contrasté, fond blanc franc, en PDF léger. Pas une photo de travers dans ta pellicule. Ensuite, quand tu le décides, tu cliques sur « Extraire » : Mistral Document AI lit le document et remplit les champs — fournisseur, numéro de TVA, n° de facture, date, HT, TVA par taux, TTC. Tu vérifies à côté du scan, tu corriges ce qui cloche, tu valides. En fin de mois, tu sélectionnes une période et tu sors un CSV prêt pour ton comptable avec le ZIP des PDF nommés proprement. Gratuit, avec un quota d'extractions.
Le problème
Le justificatif, c'est la corvée que tout indépendant repousse. Le ticket reste dans la poche, la facture reste au fond du sac, et en fin de trimestre tu passes une soirée à tout photographier en vrac dans ta pellicule. Les photos sont de travers, sombres, illisibles — ton comptable les refuse. Les applis de scan mobiles font un beau PDF mais s'arrêtent là : aucun champ extrait, aucun montant, rien à exporter. Les vrais logiciels de compta font l'extraction mais demandent un abonnement, un onboarding et un engagement, pour un besoin qui tient en trois gestes. Et personne ne te demande où ranger le document AU MOMENT où tu le scannes — alors tout finit dans un dossier fourre-tout que tu ne retries jamais.
Fonctionnalités
- Comptes utilisateurs : inscription et connexion par identifiant (email) + mot de passe, vérification d'email, réinitialisation, rate limit sur le login. Première app du sprint avec des données personnelles persistantes : chaque document appartient à un compte, stockage privé, jamais d'URL publique, export et suppression du compte (RGPD)
- Destination choisie AVANT le scan : l'écran d'entrée demande « où va ce document ? ». Dossiers récents (les derniers utilisés, en un tap), recherche, « Créer un dossier », « Créer un chemin » (arborescence type Clients/Acme/2026, niveaux manquants créés à la volée). Aucun scan ne démarre sans destination — zéro document orphelin
- Capture caméra mobile : accès direct à la caméra arrière depuis le navigateur (getUserMedia, repli sur input capture), cadre guide, conseils de prise de vue, capture multi-pages (plusieurs clichés assemblés en un seul document)
- Recadrage manuel : quatre poignées de coins déplaçables sur l'image, loupe au doigt pour viser au pixel, rotation 90°, annuler. Aucune détection automatique de bords — c'est l'utilisateur qui décide où sont les coins
- Rendu SCAN, pas photo : redressement de perspective du quadrilatère vers un rectangle A4, puis traitement image — niveaux de gris, seuillage adaptatif, suppression d'ombre, blanc franc. Trois modes (Document N&B, Niveaux de gris, Couleur), aperçu avant / après, sortie PDF A4 léger et lisible
- Extraction À LA DEMANDE : un bouton « Extraire les infos » par document, jamais d'extraction automatique. Appel Mistral Document AI (OCR 4 + schéma JSON) qui renvoie fournisseur, numéro de TVA / SIRET, n° de facture, date, échéance, HT, TVA par taux, TTC, devise, moyen de paiement. Traitement en file d'attente avec état visible (en attente / en cours / extrait / échec + relance)
- Vérification et correction : les champs extraits s'affichent à côté du scan, indice de confiance par champ, champs douteux surlignés, correction manuelle toujours possible. Le document passe de « à vérifier » à « validé » quand l'utilisateur confirme — rien n'est réputé juste tant qu'il n'a pas validé
- Classeur et recherche : arborescence de dossiers, liste des documents avec vignette, fournisseur, date, TTC et statut. Recherche plein texte dans le contenu OCR, filtres par dossier, période, fournisseur et montant, totaux HT / TVA / TTC par dossier et par période
- Export compta : sélection multiple ou période entière → CSV aux colonnes prêtes pour un comptable + ZIP des PDF nommés proprement (2026-07-30_Fournisseur_123-45.pdf), le CSV référençant chaque nom de fichier. Quota d'extractions affiché en clair, états vides / erreurs / offline, responsive mobile-first + BuyMeACoffee
Pour qui
Freelances, auto-entrepreneurs, TPE et artisans qui doivent conserver leurs factures d'achat pour leur compta. Toute personne qui accumule des justificatifs sur le terrain (déplacements, matériel, restaurants, fournitures) et qui veut les archiver proprement au moment où elle les reçoit, pas trois mois plus tard, sans souscrire à un logiciel de comptabilité complet.
Stack
Laravel + Livewire, Alpine.js et Tailwind CSS. LE POINT CLÉ = le pipeline image tourne DANS LE NAVIGATEUR, et l'extraction est la seule opération payante, déclenchée explicitement. PIPELINE SCAN (client) : capture via getUserMedia (caméra arrière, contrainte facingMode environment, repli sur <input type=file accept=image/* capture=environment> sur les navigateurs récalcitrants) → l'utilisateur pose 4 coins → homographie calculée depuis ces 4 points et appliquée en canvas / WebGL pour redresser vers un rectangle A4 → traitement scan (niveaux de gris, seuillage adaptatif type Sauvola par blocs, suppression d'ombre, blanc franc) → JPEG qualité ~80. On n'uploade JAMAIS la photo brute de 4 Mo : on uploade la page traitée, beaucoup plus légère (essentiel en 4G). Isoler ce cœur dans des modules JS testables (scan/perspective.js, scan/threshold.js, scan/capture.js) — surtout pas noyé dans le Blade. Tester tôt sur de VRAIS tickets : thermique délavé, facture froissée, éclairage jaune, ombre de la main. C'est là que le produit se joue. ASSEMBLAGE PDF : côté serveur (Imagick ou FPDF), une page traitée = une page A4, métadonnées EXIF supprimées. EXTRACTION (seule surface payante) : POST https://api.mistral.ai/v1/ocr, modèle mistral-ocr-4-0 (Document AI = OCR + document_annotation_format en json_schema, la sortie OCR étant repassée à un petit modèle pour remplir le schéma). Envoyer le PDF/l'image en base64 ou par URL signée à durée très courte. Schéma JSON strict : fournisseur, numero_tva, numero_facture, date, echeance, total_ht, tva (tableau taux/montant), total_ttc, devise, moyen_paiement — VÉRIFIER les noms de paramètres exacts dans la doc Mistral au ticket 1, l'API bouge vite. Toujours en job de queue (driver database suffit), jamais en synchrone dans la requête HTTP. Stocker la réponse brute (raw_json) en plus des champs pour pouvoir déboguer et rejouer sans repayer. Compter le coût et décrémenter le quota À L'APPEL, pas au succès, et gérer proprement l'échec (relance manuelle, quota non consommé si l'API renvoie une erreur). BDD : users, folders (arbre avec parent_id + chemin matérialisé pour la recherche et l'affichage), documents (user_id, folder_id, pdf_path, pages, statut, hash), extractions (document_id, raw_json, champs, confiance, cout, extracted_at). STOCKAGE : disque privé (jamais public/), accès par route signée qui vérifie la propriété — un document ne doit JAMAIS être servi par une URL devinable. SÉCURITÉ / RGPD : validation stricte des types et tailles de fichier, EXIF strippé, rate limit sur login ET sur extraction, export complet du compte et suppression définitive (documents + fichiers) depuis les réglages, mention claire que les documents sont envoyés à Mistral au moment de l'extraction et à ce moment-là seulement.