Pain001

Des réponses directes pour les trésoriers, les opérations de paiement, les ingénieurs et les auditeurs. Les questions sont formulées comme les gens les posent réellement. Pour plus de détails techniques, consultez la référence technique.


Pour les responsables trésorerie et finance#

Qu'est-ce que pain.001, en un paragraphe ?

pain.001 est le message ISO 20022 qu'un client envoie à sa banque pour initier des virements — le successeur XML de formats comme SWIFT MT101 et les fichiers plats domestiques. Votre banque le valide contre un schéma et un recueil de règles avant de l'accepter. Pain001 (le logiciel) produit ces fichiers à partir des données que vous possédez déjà et prouve leur validité avant que vous ne les soumettiez.

Quelle est la différence entre pain.001 et pain.008 ?

Le sens du flux. pain.001 initie des virements — vous poussez de l'argent vers l'extérieur. pain.008 initie des prélèvements — vous encaissez des sommes qui vous sont dues au titre d'un mandat. Pain001 génère les deux : dix versions de pain.001 (.001.03 à .001.12) et pain.008.001.02.

Nous envoyons encore des fichiers MT101. La migration est-elle urgente ?

Urgente. SWIFT a retiré les messages MT des catégories 1, 2 et 9 pour les instructions de paiement interbancaires transfrontalières en novembre 2025 ; les canaux entreprises qui acceptent encore le MT le font à la discrétion de chaque banque et en sursis. Le loader MT101 convertit les flux MT101 existants en pain.001 validé sans rien ressaisir.

Que signifie pour nous l'échéance des adresses structurées de novembre 2026 ?

À partir de fin novembre 2026, les adresses postales entièrement non structurées ne sont plus acceptées dans les paiements transfrontaliers CBPR+ ; les adresses doivent être structurées ou hybrides — des éléments discrets comme la ville () et le pays () au lieu de lignes en texte libre. Si vos données de référence stockent les adresses en blocs de texte, le travail se situe dans vos données, pas dans votre connexion bancaire. Commencez par là. Le briefing 2026 détaille le calendrier.

Combien coûte Pain001 ?

Rien. Le cœur est sous double licence Apache-2.0 / MIT ; les paquets compagnons sont sous Apache-2.0. L'usage commercial, la modification et la redistribution sont tous permis. Pour donner un ordre de grandeur, le seul SDK de traduction de SWIFT est affiché à €10,000–30,000 par an.


Pour les opérations de paiement#

Pourquoi les banques rejettent-elles des fichiers de paiement ?

Quatre causes récurrentes : violations de schéma (mauvais élément, mauvaise version, mauvais espace de noms), identifiants invalides (échecs de somme de contrôle IBAN, BIC mal formés), totaux de contrôle incohérents (NbOfTxs / CtrlSum ne correspondant pas aux transactions) et caractères hors du jeu latin ISO 20022. Pain001 vérifie les quatre avant même qu'un fichier n'existe : validation JSON Schema par enregistrement, contrôles IBAN mod-97 et BIC ISO 9362, totaux de contrôle recalculés, translittération du jeu de caractères et validation XSD finale du XML rendu.

Peut-on valider un fichier sans rien générer ?

Oui — pain001 --dry-run (ou la sous-commande validate, ou POST /api/v1/validate). Le code de sortie 0 signifie valide ; 1 signifie que la validation a échoué, avec des erreurs au niveau du champ. Intégrez-le à la CI ou à une liste de contrôle avant soumission.

Quels recueils de règles SEPA sont couverts ?

Cinq recueils de règles sont intégrés : SEPA Credit Transfer (sepa-sct), SEPA Instant (sepa-inst), SEPA Direct Debit Core (sepa-sdd), SEPA B2B (sepa-b2b) et virement transfrontalier (xborder-ct). Utilisez --scheme --explain pour voir chaque règle réussie ou échouée.

Nos données vivent dans Excel. Où est le piège ?

Excel convertit silencieusement en nombres les chaînes ressemblant à des IBAN. Le loader Excel lit directement .xlsx/.xlsm et s'arrête net si des colonnes IBAN contiennent des cellules numériques — la corruption est détectée au chargement, pas à la banque.

Comment gère-t-il un lot de 500,000 lignes ?

--streaming traite l'entrée en blocs à mémoire bornée (1,000 transactions par défaut), chacun émis comme son propre fichier XML avec des totaux de contrôle correctement recalculés. L'API REST offre POST /api/v1/generate/async avec suivi de travaux pour la même raison.


Pour les ingénieurs et architectes#

Comment l'intégrer — bibliothèque, CLI ou API ?

Les trois existent comme surfaces de premier rang : une API Python typée, une CLI avec des codes de sortie adaptés à la CI, et un microservice FastAPI (pain001 serve) avec des points d'accès synchrones, de travaux asynchrones, de santé et de métriques Prometheus. Le pipeline de validation sous-jacent est le même, si bien que les résultats ne divergent jamais d'une surface à l'autre.

La génération XML est-elle réellement à l'abri des arrondis flottants ?

Les montants sont en decimal.Decimal de bout en bout dans la génération et la validation de schéma — analysés comme décimaux exacts, additionnés comme décimaux exacts, rendus sans représentation flottante. Les totaux de contrôle sont recalculés à partir des enregistrements validés, jamais acceptés tels quels depuis l'entrée.

Quelle est la posture de sécurité ?

Toute l'analyse XML passe par defusedxml (bloquant les attaques XXE et d'expansion d'entités) ; il n'y a pas de lxml dans l'arbre de dépendances. Les entrées passent un validateur anti-traversée de chemin. L'image Docker s'exécute sans privilèges root. Un SBOM CycloneDX est généré pour les releases du cœur, et la découverte de plugins tiers peut être désactivée entièrement avec PAIN001_DISABLE_PLUGINS=1.

Comment la qualité est-elle imposée ?

Couverture de lignes et de branches à 100% comme porte CI stricte sur le cœur (vérifiable : 3,828 lignes, 926 branches à 100%), mypy strict, couverture de docstrings à 100%, analyses de sécurité Bandit et pip-audit, et analyse CodeQL. Les paquets compagnons appliquent la même discipline de couverture à 100%.

Peut-on l'étendre pour un format propriétaire ?

Oui — quatre groupes de points d'entrée pour plugins (pain001.loaders, pain001.validators, pain001.schemes, pain001.writers). Le loader Excel est lui-même un plugin utilisant le protocole public, il sert donc aussi d'implémentation de référence.


Pour les auditeurs et la conformité#

Peut-on reproduire un fichier généré au trimestre dernier ?

Oui. Épinglez la version du paquet, rejouez la même entrée, et la sortie est déterministe. La chaîne d'outils étant open source, la piste d'audit s'étend jusque dans le chemin de code lui-même — et ne se limite pas à une attestation d'éditeur.

Les données de paiement quittent-elles notre environnement ?

Non. Chaque composant — CLI, bibliothèque, API REST, serveur MCP, LSP — s'exécute localement. Il n'y a ni télémétrie, ni rappel SaaS, ni service de validation externe. Le serveur MCP ne parle que stdio et ses 17 outils sont tous annotés en lecture seule et idempotents.

Qui maintient Pain001 ?

Sebastien Rousseau, dirigeant en ingénierie fintech basé à Londres, avec des contributeurs de la communauté. Le développement est public sur GitHub, les releases sont publiées sur PyPI et le journal des modifications est versionné à chaque release.