Sebastien Rousseau

PAIN001

Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001

Автоматизація платежів ISO 20022 та інжиніринг оптових платежів за допомогою pain001.

6 min read
Banner for: Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001

Резюме / Основні тези

  • ISO 20022 pain.001 (CustomerCreditTransferInitiation) — це структурований формат XML-повідомлень, що використовується для ініціювання кредитних переказів у межах SEPA (звід правил EPC SCT) та CBPR+ (стандарт транскордонного обміну повідомленнями SWIFT, обов'язковий для банків-кореспондентів з листопада 2025 року).
  • pain001 ⧉ зчитує платіжні дані з CSV або SQLite, сопоставляє рядки з ієрархією повідомлень pain.001.001.09 (GrpHdr → PmtInf → CdtTrfTxInf) та створює відповідний XML-файл за допомогою шаблонного генератора — усього три рядки коду Python від даних до перевіреного XML.
  • Валідація XSD виконується для кожного згенерованого файлу перед записом результату; бібліотека викликає описовий виняток із зазначенням помилкового елемента, кардинальності або невідповідності типів, завдяки чому помилки виявляються під час генерації, а не при поданні до банку.
  • CtrlSum та NbOfTxs обчислюються на основі набору транзакцій, а не вводяться вручну — це усуває найпоширенішу причину відхилення платіжних файлів на шлюзах обробки SEPA та CBPR+.
  • Обидва варіанти повідомлень — SEPA Credit Transfer (EUR, в межах зони SEPA) та CBPR+ (транскордонні, мультивалютні) — підтримуються за допомогою параметра message_type, а розбіжності у валідації на рівні полів обробляються внутрішньо.

pain001 ⧉ — це бібліотека Python з відкритим кодом для генерації файлів ініціювання платежів ISO 20022. Вона зчитує платіжні дані зі структурованого джерела (CSV або SQLite), перевіряє дані, створює відповідний XML-документ pain.001.001.09 та валідує вихідний результат за XSD-схемою ISO 20022 — і все це за один виклик функції.

У цій статті описано структуру повідомлень ISO 20022 pain.001, те, як pain001 сопоставляє вхідні дані з елементами повідомлення, конвеєр валідації, а також варіанти конфігурації для SEPA порівняно з CBPR+.

Структура повідомлень ISO 20022 pain.001

Повідомлення ISO 20022 pain.001.001.09 (CustomerCreditTransferInitiation) має три рівні:

GrpHdr (Груповий заголовок) — один на файл:

Елемент Опис Приклад
MsgId Унікальний ідентифікатор повідомлення ACME20240115-001
CreDtTm Дата та час створення 2024-01-15T09:00:00
NbOfTxs Загальна кількість транзакцій 3
CtrlSum Сума всіх зазначених сум 15000.00
InitgPty/Nm Назва сторони, що ініціює платіж Acme Corp

PmtInf (Інформація про платіж) — один або кілька на файл, групує транзакції за рахунком дебітора та датою платежу:

Елемент Опис
PmtInfId Ідентифікатор інформації про платіж
PmtMtd Метод платежу — завжди TRF для кредитного переказу
ReqdExctnDt/Dt Запитувана дата виконання
Dbtr/Nm Ім'я/найменування дебітора (відправника)
DbtrAcct/Id/IBAN IBAN дебітора
DbtrAgt/FinInstnId/BICFI BIC банку дебітора

CdtTrfTxInf (Інформація про транзакцію кредитного переказу) — один або кілька на блок PmtInf:

Елемент Опис
PmtId/EndToEndId Наскрізний референс (зберігається в усьому ланцюжку)
Amt/InstdAmt Зазначена сума з атрибутом валюти
CdtrAgt/FinInstnId/BICFI BIC банку кредитора
Cdtr/Nm Ім'я/найменування кредитора (отримувача)
CdtrAcct/Id/IBAN IBAN кредитора
RmtInf/Ustrd Неструктурована інформація про призначення платежу (номер рахунку-фактури тощо)

Генерація XML із CSV

Мінімальний виклик pain001:

from pain001 import create_xml_v9

create_xml_v9(
    data_file="payments.csv",
    data_file_type="csv",
    xml_file_path="output/pain001.xml"
)

CSV-файл сопоставляє назви стовпців із полями повідомлення. Мінімальний приклад:

id,date,nb_of_txs,ctrl_sum,initiating_party_name,debtor_name,debtor_account_IBAN,debtor_agent_BIC,creditor_name,creditor_account_IBAN,creditor_agent_BIC,instd_amt,instd_amt_ccy,end_to_end_id,remittance_info
1,2024-01-15,1,1000.00,Acme Corp,Acme Corp,GB29NWBK60161331926819,NWBKGB2L,Supplier Ltd,DE89370400440532013000,COBADEFFXXX,1000.00,EUR,ACME20240115001,INV-2024-0042

Бібліотека зчитує ctrl_sum та nb_of_txs з рядка CSV для однорядкових файлів. Для багаторядкових файлів (кілька транзакцій в одному пакеті) pain001 обчислює ці значення на основі набору транзакцій, а не довіряє вхідним значенням, що запобігає розбіжностям.

Інтерфейс SQLite використовує ту саму угоду щодо назв стовпців. Передайте data_file_type="sqlite" та шлях data_file до файлу бази даних SQLite; pain001 за замовчуванням зчитує таблицю payment.

Структура згенерованого XML

Коректно сформований документ pain.001.001.09 для рядка CSV вище:

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09">
  <CstmrCdtTrfInitn>
    <GrpHdr>
      <MsgId>ACME20240115-001</MsgId>
      <CreDtTm>2024-01-15T09:00:00</CreDtTm>
      <NbOfTxs>1</NbOfTxs>
      <CtrlSum>1000.00</CtrlSum>
      <InitgPty><Nm>Acme Corp</Nm></InitgPty>
    </GrpHdr>
    <PmtInf>
      <PmtInfId>ACME20240115-PMT-001</PmtInfId>
      <PmtMtd>TRF</PmtMtd>
      <ReqdExctnDt><Dt>2024-01-16</Dt></ReqdExctnDt>
      <Dbtr><Nm>Acme Corp</Nm></Dbtr>
      <DbtrAcct><Id><IBAN>GB29NWBK60161331926819</IBAN></Id></DbtrAcct>
      <DbtrAgt><FinInstnId><BICFI>NWBKGB2L</BICFI></FinInstnId></DbtrAgt>
      <CdtTrfTxInf>
        <PmtId><EndToEndId>ACME20240115001</EndToEndId></PmtId>
        <Amt><InstdAmt Ccy="EUR">1000.00</InstdAmt></Amt>
        <CdtrAgt><FinInstnId><BICFI>COBADEFFXXX</BICFI></FinInstnId></CdtrAgt>
        <Cdtr><Nm>Supplier Ltd</Nm></Cdtr>
        <CdtrAcct><Id><IBAN>DE89370400440532013000</IBAN></Id></CdtrAcct>
        <RmtInf><Ustrd>INV-2024-0042</Ustrd></RmtInf>
      </CdtTrfTxInf>
    </PmtInf>
  </CstmrCdtTrfInitn>
</Document>

Конвеєр валідації XSD

Після створення pain001 перевіряє вихідні дані за XSD-схемою ISO 20022 pain.001.001.09. Перевірки валідації включають:

Коли валідація не проходить, pain001 викликає виняток ValidationError з повідомленням про помилку від lxml, що вказує на хибний вираз XPath, назву елемента та обмеження. Це дозволяє виявляти неправильні конфігурації під час створення файлу, а не під час його подання до банку, де коди відхилення зазвичай менш інформативні.

Конфігурація SEPA порівняно з CBPR+

Кредитний переказ SEPA (ISO 20022 pain.001.001.09 згідно зі зводом правил EPC SCT) та CBPR+ (стандарт транскордонних платежів та звітності SWIFT Cross-Border Payments and Reporting Plus) використовують однакову схему повідомлень, але відрізняються наборами обов'язкових полів та обмеженнями значень:

Аспект SEPA SCT CBPR+
Валюта Тільки EUR Мультивалютний
Обов'язковість IBAN Так Так (для кредитора)
Обов'язковість BIC Ні (маршрутизація в зоні SEPA) Так
Платник комісії (ChrgBr) SLEV DEBT, CRED або SHAR
Охоплення Зона SEPA (36 країн) Глобальний кореспондентський банкінг

Налаштуйте тип повідомлення за допомогою параметра payment_initiation_message_type:

create_xml_v9(
    data_file="payments.csv",
    data_file_type="csv",
    xml_file_path="output/pain001.xml",
    payment_initiation_message_type="pain.001.001.09"  # за замовчуванням; також приймає "pain.001.001.03" для застарілих SEPA
)

Відповідність вимогам CBPR+ стала обов'язковою для кореспондентського банкінгу SWIFT у листопаді 2023 року для вхідних повідомлень та в листопаді 2025 року для вихідних. Генерація файлів pain.001, сумісних із CBPR+, вимагає заповнення поля BIC та наявності елемента ChrgBr.

Часті запитання

У чому різниця між pain.001 та pain.008? pain.001 (CustomerCreditTransferInitiation) ініціює кредитний переказ — банк відправника списує кошти з рахунку відправника та зараховує їх одержувачу. pain.008 (CustomerDirectDebitInitiation) ініціює пряме дебетування — банк кредитора стягує кошти з дебітора. Бібліотека pain001 генерує лише файли pain.001.

На яку версію ISO 20022 орієнтована бібліотека pain001? Основною цільовою версією є pain.001.001.09, яка необхідна для CBPR+ та рекомендована EPC для нових впроваджень SEPA. Бібліотека також підтримує pain.001.001.03 (застарілу версію SEPA) за допомогою параметра payment_initiation_message_type для організацій, які все ще використовують старіші банківські інтерфейси.

Чи може pain001 обробляти кілька рахунків дебіторів в одному файлі? Так. Кілька блоків PmtInf із різними IBAN дебіторів можуть бути створені шляхом групування рядків CSV з різними значеннями рахунків дебіторів. pain001 створює один блок PmtInf для кожної унікальної комбінації (IBAN дебітора, дата виконання), при цьому всі відповідні транзакції вкладаються як дочірні елементи CdtTrfTxInf.

Що відбувається у разі збою валідації XSD? pain001 викликає виняток pain001.exceptions.ValidationError з повідомленням про валідацію від lxml. XML-файл не записується на диск, якщо валідація не пройшла успішно, тому до вихідного шляху потрапляють лише валідні файли. Поширеними причинами збоїв є: неправильний формат IBAN, BIC не містить 8 або 11 символів, код валюти не відповідає стандарту ISO 4217 або відсутність обов'язкових елементів через відсутність необхідного стовпця CSV.

Джерела

  1. European Payments Council. SEPA Credit Transfer Scheme Customer-to-Bank Implementation Guidelines (v1.1). EPC, 2023. https://www.europeanpaymentscouncil.eu/document-library/implementation-guidelines/sepa-credit-transfer-scheme-customer-bank
  2. SWIFT. CBPR+ Usage Guidelines — Customer Credit Transfer Initiation (pain.001). SWIFT Standards, 2023. https://www.swift.com/standards/iso-20022/cbpr-plus-usage-guidelines
  3. ISO. ISO 20022 — Financial services — Universal financial industry message scheme. ISO.org, 2023. https://www.iso20022.org/
  4. Rousseau, S. pain001 — ISO 20022 payment file generator. GitHub, 2023. https://github.com/sebastienrousseau/pain001

Останній перегляд .

Останній перегляд .

Перепублікувати цю статтю

Скопіювати формат для Medium

# Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau

> Originally published at [https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/](https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/)

Автоматизуйте створення платіжних файлів ISO 20022 pain.001 з CSV або SQLite. pain001 — бібліотека Python з відкритим кодом, яка спрощує дотримання вимог.

Read the full article on sebastienrousseau.com: https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/

Скопіювати формат для Mastodon

Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau

Автоматизуйте створення платіжних файлів ISO 20022 pain.001 з CSV або SQLite. pain001 — бібліотека Python з відкритим кодом, яка спрощує дотримання вимог.

https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/

Копіювати відформатоване для LinkedIn

Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau

Автоматизуйте створення платіжних файлів ISO 20022 pain.001 з CSV або SQLite. pain001 - бібліотека Python з відкритим кодом, яка спрощує дотримання вимог.

Ось ключові стратегічні висновки:

- Структура повідомлень ISO 20022 pain.001. Повідомлення ISO 20022 pain.001.001.09 (CustomerCreditTransferInitiation) має три рівні:.
- Генерація XML із CSV. Мінімальний виклик pain001:.
- Структура згенерованого XML. Коректно сформований документ pain.001.001.09 для рядка CSV вище:.
- Конвеєр валідації XSD. Після створення pain001 перевіряє вихідні дані за XSD-схемою ISO 20022 pain.001.001.09.

Яким є підхід вашої організації до викликів, описаних у цій статті?

→ https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/

#Pain001 #Iso20022 #Pain.001.001.09 #Customercredittransferinitiation #SepaCreditTransfer

Sebastien Rousseau | CC-BY-4.0
Цитувати цю статтю

Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau

Автоматизуйте створення платіжних файлів ISO 20022 pain.001 з CSV або SQLite. pain001 — бібліотека Python з відкритим кодом, яка спрощує дотримання вимог.

BibTeX

@online{rousseau2023автоматизація,
  author  = {Rousseau, Sebastien},
  title   = {{Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau}},
  year    = {2023},
  url     = {https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/},
  urldate = {2023}
}

RIS

TY  - GEN
AU  - Rousseau, Sebastien
TI  - Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau
PY  - 2023
UR  - https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/
ER  -

Vancouver

Rousseau S. Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau. sebastienrousseau.com. 2023 Sep 29. Available from: https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/

Chicago

Rousseau, Sebastien. "Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau." sebastienrousseau.com. September 29, 2023. https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/.

APA

Rousseau, S. (2023, September 29). Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau. sebastienrousseau.com. https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/

Перевидати цю статтю

Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau

Автоматизуйте створення платіжних файлів ISO 20022 pain.001 з CSV або SQLite. pain001 — бібліотека Python з відкритим кодом, яка спрощує дотримання вимог.

Ця стаття поширюється за ліцензією Creative Commons Attribution 4.0 International. Перевидання вимагає посилання на канонічну URL-адресу.

Автоматизація створення платіжних файлів ISO 20022 за допомогою pain001 — Sebastien Rousseau

Автоматизуйте створення платіжних файлів ISO 20022 pain.001 з CSV або SQLite. pain001 — бібліотека Python з відкритим кодом, яка спрощує дотримання вимог.

Originally published at https://sebastienrousseau.com/uk/2023-09-29-avtomatyzatsiya-platizhnykh-faylov-iso-20022-z-pain001/ by Sebastien Rousseau.
Licensed under CC-BY-4.0.