Pain001

Прямі відповіді для казначеїв, платіжних операцій, інженерів та аудиторів. Питання сформульовані так, як їх насправді ставлять. Глибші технічні деталі — у технічному довіднику.


Для керівників казначейства та фінансів#

Що таке pain.001, одним абзацом?

pain.001 — це повідомлення ISO 20022, яке клієнт надсилає своєму банку для ініціювання кредитових переказів — XML-наступник форматів на кшталт SWIFT MT101 і національних плоских файлів. Перш ніж прийняти файл, банк перевіряє його за схемою та збірником правил платіжної схеми. Pain001 (програма) формує ці файли з даних, які ви вже маєте, і доводить їхню валідність до подання.

У чому різниця між pain.001 та pain.008?

У напрямку руху коштів. pain.001 ініціює кредитові перекази — ви надсилаєте гроші. pain.008 ініціює прямі дебети — ви стягуєте належні вам кошти за мандатом. Pain001 генерує обидва: десять версій pain.001 (від .001.03 до .001.12) та pain.008.001.02.

Ми досі надсилаємо файли MT101. Наскільки термінова міграція?

Термінова. У листопаді 2025 року SWIFT вивів з експлуатації повідомлення MT категорій 1, 2 і 9 для транскордонних міжбанківських платіжних інструкцій; корпоративні канали, що досі приймають MT, роблять це на розсуд кожного банку та в позичений час. Завантажувач MT101 перетворює наявні потоки MT101 на перевірений pain.001 без повторного введення даних.

Що для нас означає дедлайн щодо структурованих адрес у листопаді 2026 року?

З кінця листопада 2026 року повністю неструктуровані поштові адреси більше не приймаються в транскордонних платежах CBPR+; адреси мають бути структурованими або гібридними — окремі елементи, як-от місто () і країна (), замість рядків вільного тексту. Якщо ваші майстер-дані зберігають адреси суцільним текстом, робота лежить у ваших даних, а не в підключенні до банку. Почніть звідти. Брифінг 2026 детально описує терміни.

Скільки коштує Pain001?

Нічого. Ядро має подвійну ліцензію Apache-2.0 / MIT; супутні пакети — Apache-2.0. Комерційне використання, модифікація та розповсюдження дозволені. Для масштабу: лише SDK трансляції від SWIFT коштує за прайсом €10,000–30,000 на рік.


Для платіжних операцій#

Чому банки відхиляють платіжні файли?

Чотири повторювані причини: порушення схеми (не той елемент, не та версія, не той простір імен), погані ідентифікатори (помилки контрольної суми IBAN, некоректні BIC), розбіжні контрольні підсумки (NbOfTxs / CtrlSum не збігаються з транзакціями) та символи поза латинським набором ISO 20022. Pain001 перевіряє всі чотири до появи файлу: валідація JSON Schema для кожного запису, перевірки mod-97 для IBAN та ISO 9362 для BIC, переобчислення контрольних підсумків, транслітерація набору символів і фінальна валідація сформованого XML за XSD.

Чи можна перевірити файл, нічого не генеруючи?

Так — pain001 --dry-run (або підкоманда validate, або POST /api/v1/validate). Код виходу 0 означає валідність; 1 — валідація не пройдена, з помилками на рівні полів. Вбудуйте це в CI або в чек-лист перед поданням.

Які збірники правил SEPA покриті?

П'ять збірників правил схем вбудовано: SEPA Credit Transfer (sepa-sct), SEPA Instant (sepa-inst), SEPA Direct Debit Core (sepa-sdd), SEPA B2B (sepa-b2b) і транскордонний кредитовий переказ (xborder-ct). Використовуйте --scheme --explain, щоб побачити кожне пройдене чи непройдене правило.

Наші дані живуть в Excel. У чому підступ?

Excel непомітно перетворює IBAN-подібні рядки на числа. Завантажувач Excel читає .xlsx/.xlsm напряму та жорстко зупиняється, якщо стовпці IBAN містять числові комірки — пошкодження виявляється під час завантаження, а не в банку.

Як він обробляє пакет із 500,000 рядків?

--streaming обробляє вхід блоками з обмеженням пам'яті (типово 1,000 транзакцій); кожен блок виводиться окремим XML-файлом із коректно переобчисленими контрольними підсумками. REST API з тієї ж причини пропонує POST /api/v1/generate/async з опитуванням завдань.


Для інженерів та архітекторів#

Як інтегрувати — бібліотека, CLI чи API?

Усі три існують як повноцінні інтерфейси: типізований Python API, CLI зі зручними для CI кодами виходу та мікросервіс FastAPI (pain001 serve) з ендпоінтами синхронної генерації, асинхронних завдань, перевірки стану та метрик Prometheus. Під ними один і той самий конвеєр валідації, тому результати ніколи не розходяться між інтерфейсами.

Чи справді генерація XML захищена від округлення float?

Суми — це decimal.Decimal від початку до кінця в генерації та перевірці правил схем: розбираються як точні десяткові числа, підсумовуються як точні десяткові числа, записуються без рухомого подання. Контрольні підсумки переобчислюються з перевірених записів і ніколи не беруться на віру з вхідних даних.

Який стан безпеки?

Увесь розбір XML іде через defusedxml (що блокує атаки XXE та розширення сутностей); у дереві залежностей немає lxml. Вхідні дані проходять валідатор обходу шляхів. Образ Docker працює не від root. Для релізів ядра генерується CycloneDX SBOM, а виявлення сторонніх плагінів можна повністю вимкнути через PAIN001_DISABLE_PLUGINS=1.

Як забезпечується якість?

100% покриття рядків і гілок як жорсткий CI-гейт на ядрі (перевірювано: 3,828 рядків, 926 гілок на 100%), суворий mypy, 100% покриття docstring, лінтинг безпеки Bandit і pip-audit та сканування CodeQL. Супутні пакети дотримуються тієї ж дисципліни 100% покриття.

Чи можна розширити його для пропрієтарного формату?

Так — чотири групи точок входу для плагінів (pain001.loaders, pain001.validators, pain001.schemes, pain001.writers). Завантажувач Excel сам є плагіном на публічному протоколі, тож водночас слугує еталонною реалізацією.


Для аудиторів і комплаєнсу#

Чи можемо ми відтворити файл, згенерований минулого кварталу?

Так. Зафіксуйте версію пакета, повторіть той самий ввід — і результат детермінований. Оскільки інструментарій має відкритий код, аудиторський слід сягає самого коду, а не обмежується запевненням постачальника.

Чи залишають платіжні дані наше середовище?

Ні. Кожен компонент — CLI, бібліотека, REST API, сервер MCP, LSP — виконується локально. Немає телеметрії, звернень до SaaS і зовнішнього сервісу валідації. Сервер MCP працює лише через stdio, і всі його 17 інструментів позначені як read-only та ідемпотентні.

Хто підтримує Pain001?

Sebastien Rousseau, лондонський керівник фінтех-інжинірингу, разом з учасниками спільноти. Розробка відкрита на GitHub, релізи публікуються в PyPI, а журнал змін версіонується з кожним релізом.