{"id":16616912,"url":"https://github.com/sebastienrousseau/pain001","last_synced_at":"2026-01-16T16:09:49.482Z","repository":{"id":137301283,"uuid":"612443798","full_name":"sebastienrousseau/pain001","owner":"sebastienrousseau","description":"Pain001, A Powerful Python Library that enables you to create ISO 20022-Compliant Payment Files from CSV, SQLite, or Python data structures.🐍","archived":false,"fork":false,"pushed_at":"2026-01-12T02:53:42.000Z","size":20605,"stargazers_count":35,"open_issues_count":34,"forks_count":14,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-01-12T18:50:28.126Z","etag":null,"topics":["automate-payments","banking","banking-payments","csv","customercredittransferinitiation","financial","iso-20022","iso20022","pain001","payment-processing","payments","sepa","sqlite"],"latest_commit_sha":null,"homepage":"http://pain001.com/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sebastienrousseau.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-03-11T00:55:57.000Z","updated_at":"2026-01-12T02:09:18.000Z","dependencies_parsed_at":"2023-11-19T12:32:13.109Z","dependency_job_id":"b7ee81cd-78b3-4568-86a3-869e469f5ae1","html_url":"https://github.com/sebastienrousseau/pain001","commit_stats":null,"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"purl":"pkg:github/sebastienrousseau/pain001","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebastienrousseau%2Fpain001","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebastienrousseau%2Fpain001/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebastienrousseau%2Fpain001/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebastienrousseau%2Fpain001/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sebastienrousseau","download_url":"https://codeload.github.com/sebastienrousseau/pain001/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebastienrousseau%2Fpain001/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28479485,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automate-payments","banking","banking-payments","csv","customercredittransferinitiation","financial","iso-20022","iso20022","pain001","payment-processing","payments","sepa","sqlite"],"created_at":"2024-10-12T02:14:37.012Z","updated_at":"2026-01-16T16:09:49.467Z","avatar_url":"https://github.com/sebastienrousseau.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pain001: Automate ISO 20022-Compliant Payment File Creation\n\n![Pain001 banner][banner]\n\n## Enterprise-Grade ISO 20022 Payment File Generation\n\n[![PyPI Version][pypi-badge]][03]\n[![Python Versions][python-versions-badge]][03]\n[![PyPI Downloads][pypi-downloads-badge]][07]\n[![License][license-badge]][01]\n[![Codecov][codecov-badge]][06]\n[![Tests][tests-badge]][tests-url]\n[![Quality][quality-badge]][quality-url]\n[![Documentation][docs-badge]][docs-url]\n\n\u003e **Latest Release: v0.0.46** - Enhanced exception hierarchy, validation service architecture, and IBAN/BIC pre-validation.\n\u003e [See what's new →][release-046]\n\n## Overview\n\n**Pain001** is an open-source Python library that you can use to create **ISO\n20022-compliant payment files** from your **CSV files**, **SQLite databases**,\nor **Python data structures** (lists and dictionaries).\n\n- **Website:** \u003chttps://pain001.com\u003e\n- **Source code:** \u003chttps://github.com/sebastienrousseau/pain001\u003e\n- **Bug reports:** \u003chttps://github.com/sebastienrousseau/pain001/issues\u003e\n\nThe library focuses specifically on **Payment Initiation and Advice Messages**,\ncommonly known as **Pain**. In a simplified way, a **pain.001** is a message\nthat initiates a customer payment.\n\n**Key Features:**\n\n- **Mandatory Data Validation:** Ensures all payment files are\n  ISO 20022-compliant before creation\n- **Multi-source Support:** Works with CSV files, SQLite databases,\n  and Python data structures\n- **Automatic XSD Validation:** Validates generated XML against\n  ISO 20022 schemas\n- **Comprehensive Testing:** 98.55% test coverage with 568 tests\n  ensuring reliability\n- **Secure by Design:** Uses `defusedxml` to prevent XXE attacks\n  and implements SQL injection protection\n- **Type-Safe:** Full type hints for better IDE support and type\n  checking with mypy\n- **Robust Error Handling:** Specific exception types for precise\n  error handling and debugging\n- **9 ISO 20022 Versions Supported:** Supports all 9 Customer Credit\n  Transfer Initiation versions: pain.001.001.03 through\n  pain.001.001.11\n- **Production-Ready:** Used in production environments for SEPA\n  and international payments\n\nAs of today, the library is designed to be compatible with the:\n\n- **Payments Initiation V03 (pain.001.001.03):** This version is\n  used for initiating credit transfers within the SEPA (Single Euro\n  Payments Area)\n- **Payments Initiation V04 (pain.001.001.04):** Enhanced with\n  additional optional fields and improved data structures\n- **Payments Initiation V05 (pain.001.001.05):** Brings further\n  refinements and clarifications to the ISO 20022 standard\n- **Payments Initiation V06 (pain.001.001.06):** Focused on\n  supporting instant credit transfers within the SEPA region\n- **Payments Initiation V07 (pain.001.001.07):** Extended schema\n  with additional optional elements for enhanced payment requests\n- **Payments Initiation V08 (pain.001.001.08):** Introduces support\n  for new transaction types and enhanced validation rules\n- **Payments Initiation V09 (pain.001.001.09):** Simplified message\n  structure with consolidated required fields\n- **Payments Initiation V10 (pain.001.001.10):** Enhanced with\n  improved data structures and additional compliance requirements\n- **Payments Initiation V11 (pain.001.001.11):** The latest version\n  with extended ISO 20022 compliance and advanced payment features\n\n### Version Comparison\n\n| Version | Status | CSV Fields | Key Features | Use Case |\n|---------|--------|------------|--------------|----------|\n| pain.001.001.03 | ✅ Stable | 42 | SEPA credit transfers | EU payments |\n| pain.001.001.04 | ✅ Stable | 47 | Extended fields | Enhanced payment details |\n| pain.001.001.05 | ✅ Stable | 47 | Schema refinements | ISO 20022 alignment |\n| pain.001.001.06 | ✅ Stable | 44 | Instant transfers | Real-time SEPA payments |\n| pain.001.001.07 | ✅ Stable | 44 | Additional elements | Extended functionality |\n| pain.001.001.08 | ✅ Stable | 44 | Enhanced validation | Improved compliance |\n| pain.001.001.09 | ✅ Stable | 23 | Simplified structure | Modern implementations |\n| pain.001.001.10 | ✅ Stable | 23 | Improved compliance | Enhanced data validation |\n| pain.001.001.11 | ✅ Latest | 23 | Advanced features | Future-proof payments |\n\nPayments usually start with a **pain.001 payment initiation message**. The payer\nsends it to the payee (or the payee’s bank) via a secure network. This network\ncould be **SWIFT**, **SEPA (Single Euro Payments Area)**, or other payment\nnetworks such as **CHAPS**, **BACS**, **Faster Payments**, etc. The message\ncontains the payer's and payee's bank account details, payment amount, and other\ninformation required to process the payment.\n\nThe **Pain001** library reduces payment processing complexity and costs by\ngenerating ISO 20022-compliant payment files with **mandatory validation**.\nThese files are automatically validated before creation, eliminating the need to\ncreate and validate them manually. This makes the payment process more efficient\nand cost-effective whilst saving you time and resources and minimising the risk\nof errors, ensuring accurate and seamless payment processing.\n\n**Use the Pain001 library to simplify, accelerate, and automate your payment\nprocessing with confidence that every file is ISO 20022-compliant.**\n\n## How It Works\n\n### Payment Processing Flow\n\n```mermaid\nflowchart LR\n    A[\"CSV / SQLite / Python\n    Data Source\"] --\u003e|Load \u0026 Validate| B[\"Pain001\n    Library\"]\n    B --\u003e|Generate XML| C[\"ISO 20022\n    Payment File\"]\n    C --\u003e|XSD Validation| D{Valid?}\n    D --\u003e|Yes| E[\"Submit to Bank\n    via SWIFT/SEPA\"]\n    D --\u003e|No| F[\"Error Report\n    \u0026 Fix Data\"]\n    F --\u003e|Retry| A\n    E --\u003e G[\"Payment\n    Processed\"]\n```\n\n## Table of Contents\n\n- [Pain001: Automate ISO 20022-Compliant Payment File Creation](#pain001-automate-iso-20022-compliant-payment-file-creation)\n  - [A Powerful Python Library that enables you to create ISO 20022-Compliant Payment Files directly from CSV or SQLite data files](#a-powerful-python-library-that-enables-you-to-create-iso-20022-compliant-payment-files-directly-from-csv-or-sqlite-data-files)\n  - [Overview](#overview)\n  - [Table of Contents](#table-of-contents)\n  - [Features](#features)\n  - [Requirements](#requirements)\n  - [Installation](#installation)\n    - [Install `virtualenv`](#install-virtualenv)\n    - [Create a Virtual Environment](#create-a-virtual-environment)\n    - [Activate environment](#activate-environment)\n    - [Getting Started](#getting-started)\n  - [Quick Start](#quick-start)\n    - [Arguments](#arguments)\n  - [CSV Data Format](#csv-data-format)\n    - [Required CSV Columns](#required-csv-columns)\n  - [Examples](#examples)\n    - [Using a CSV Data File as the source](#using-a-csv-data-file-as-the-source)\n    - [Using a SQLite Data File as the source](#using-a-sqlite-data-file-as-the-source)\n    - [Using the Source code](#using-the-source-code)\n      - [Pain.001.001.03](#pain00100103)\n      - [Pain.001.001.04](#pain00100104)\n      - [Pain.001.001.05](#pain00100105)\n      - [Pain.001.001.06](#pain00100106)\n      - [Pain.001.001.07](#pain00100107)\n      - [Pain.001.001.08](#pain00100108)\n      - [Pain.001.001.09](#pain00100109)\n      - [Pain.001.001.10](#pain00100110)\n      - [Pain.001.001.11](#pain00100111)\n    - [Embedded in an Application](#embedded-in-an-application)\n    - [Validation](#validation)\n  - [Output Files](#output-files)\n    - [Output Location](#output-location)\n  - [Troubleshooting](#troubleshooting)\n    - [Common Issues and Solutions](#common-issues-and-solutions)\n    - [Getting Help](#getting-help)\n  - [Documentation](#documentation)\n    - [Supported messages](#supported-messages)\n      - [Bank-to-Customer Cash Management](#bank-to-customer-cash-management)\n      - [Payments Clearing and Settlement](#payments-clearing-and-settlement)\n      - [Payments Initiation](#payments-initiation)\n  - [Development](#development)\n    - [Setting Up Development Environment](#setting-up-development-environment)\n    - [Running Tests](#running-tests)\n    - [Code Quality Tools](#code-quality-tools)\n  - [License](#license)\n  - [Contribution](#contribution)\n  - [Acknowledgements](#acknowledgements)\n\n## Features\n\n### Core Functionality\n\n- **Easy to Use:** Both developers and non-developers can easily use the library, as it requires minimal coding knowledge\n- **Open Source:** The library is open source and free to use, making it accessible to everyone\n- **Mandatory Data Validation:** Ensures payment file integrity and ISO 20022 compliance\n  - All data sources (CSV, SQLite, Python dict/list) are automatically validated\n  - Invalid data raises clear `ValueError` messages indicating what needs to be fixed\n  - Validates required fields, data types, boolean values, and field formats\n  - Prevents creation of non-compliant payment files\n  - No manual validation needed—it's built into every data load operation\n\n### Security \u0026 Quality\n\n- **Secure:** The library prioritises security with multiple layers of protection\n  - Uses `defusedxml` for secure XML parsing to prevent XXE attacks\n  - Implements SQL injection protection in database operations\n  - Regular security audits with Bandit and Safety tools\n  - All dependencies kept up to date to address known vulnerabilities\n  - No sensitive data storage—all information remains confidential\n  - OWASP Top 10 security best practices implemented\n- **🛡️ Enterprise Logging \u0026 Compliance:**\n  - **Structured Logging:** All logs emitted as JSON for seamless\n    integration with Splunk, Datadog, Elasticsearch, and CloudWatch\n  - **PII Protection:** Automatic masking of sensitive fields (IBANs,\n    BICs, names, account numbers) in logs to ensure GDPR Article 32 and\n    PCI-DSS Requirement 3.4 compliance\n  - **Event Standardization:** 17 standardized event types for\n    consistent observability across payment processing lifecycle\n  - **Zero PII Leakage:** Logs never expose clear-text payment data—all\n    sensitive information automatically redacted before logging\n- **Robust Development:** Comprehensive quality assurance with\n  - 98.56% test coverage with 561 comprehensive tests\n  - Code formatting with Black and Ruff\n  - Import sorting with isort\n  - Style checking with Flake8 (10.00/10 score)\n  - Static type checking with mypy (strict mode)\n  - Code quality analysis with Pylint\n  - Mutation testing with mutmut for test effectiveness\n  - Performance benchmarks: ~69,604 XML ops/sec\n\n### Business Benefits\n\n- **Customisable:** The library allows developers to customise the output, making it adaptable to specific business requirements and preferences\n- **Scalable Solution:** The **Pain001** library can handle varying volumes of payment files, making it suitable for businesses of different sizes and transaction volumes\n- **Time-Saving:** The automated file creation process reduces the time spent on manual data entry and file generation, increasing overall productivity\n- **Seamless Integration:** As a Python package, the Pain001 library is compatible with various Python-based applications and easily integrates into any existing projects or workflows\n- **Cross-Border Compatibility:** The library supports both Single Euro Payments Area (SEPA) and non-SEPA credit transfers, making it versatile for use in different countries and regions\n- **Improved Accuracy:** By providing precise data validation, the library reduces errors in payment file creation and processing\n- **Enhanced Efficiency:** Automates the creation of payment initiation message files\n- **Accelerated Processing:** Automates the process and reduces the time required to create payment files\n- **Guaranteed Compliance:** Validates all payment files to meet the ISO 20022 standards\n- **Simplified Workflow:** Provides a standardised payment file format for ISO 20022-compliant payment initiation messages\n- **Reduced Costs:** Removes manual data entry and file generation, reducing payment processing time and errors\n\n## Requirements\n\n**Pain001** works with macOS, Linux, and Windows and requires:\n\n- **Python 3.9.0 or higher**\n- **pip** (Python package installer)\n\n### Key Dependencies\n\n- `click` - Command-line interface creation\n- `defusedxml` - Secure XML parsing (protection against XXE attacks)\n- `xmlschema` - XML Schema validation\n- `rich` - Terminal output formatting\n- `lxml` - XML processing\n\nAll dependencies are automatically installed when you install Pain001.\n\n## Installation\n\nWe recommend creating a virtual environment to install **Pain001**. This will\nensure that the package is installed in an isolated environment and will not\naffect other projects. To install **Pain001** in a virtual environment, follow\nthese steps:\n\n### Install `virtualenv`\n\n```sh\npython -m pip install virtualenv\n```\n\n### Create a Virtual Environment\n\n```sh\npython -m venv venv\n```\n\n| Code  | Explanation                     |\n| ----- | ------------------------------- |\n| `-m`  | executes module `venv`          |\n| `env` | name of the virtual environment |\n\n### Activate environment\n\n**On macOS/Linux:**\n```sh\nsource venv/bin/activate\n```\n\n**On Windows:**\n```cmd\nvenv\\Scripts\\activate\n```\n\nYou'll see `(venv)` appear at the start of your command line prompt, indicating the virtual environment is active.\n\n### Getting Started\n\nIt takes just a few seconds to get up and running with **Pain001**. You can\ninstall Pain001 from PyPI with pip or your favourite package manager.\n\n**Step 1:** Open your terminal and run the following command to install the latest version:\n\n```sh\npython -m pip install pain001\n```\n\n**Step 2:** Verify the installation:\n\n```sh\npython -c \"import pain001; print('Pain001 is installed and ready to use')\"\n```\n\nYou should see a confirmation message indicating Pain001 is ready to use.\n\n**Updating Pain001:**\n\nIf `pain001` is already installed and you want to upgrade to the latest version:\n\n```sh\npython -m pip install -U pain001\n```\n\n## Quick Start\n\nAfter installation, you can run **Pain001** directly from the command line. Follow these simple steps:\n\n**Step 1:** Prepare your files\n\nYou'll need:\n- **XML template file** - Contains the structure for your payment message\n- **XSD schema file** - Used to validate the generated XML file\n- **Data source** - Your payment instructions from:\n  - CSV file (.csv)\n  - SQLite database (.db)\n  - Python list of dictionaries\n  - Python dictionary (single transaction)\n\n**Step 2:** Run Pain001\n\n```sh\npython3 -m pain001 \\\n    -t \u003cxml_message_type\u003e \\\n    -m \u003cxml_template_file_path\u003e \\\n    -s \u003cxsd_schema_file_path\u003e \\\n    -d \u003cdata_file_path\u003e\n```\n\n**Real Example:**\n\n```sh\npython3 -m pain001 \\\n    -t pain.001.001.03 \\\n    -m pain001/templates/pain.001.001.03/template.xml \\\n    -s pain001/templates/pain.001.001.03/pain.001.001.03.xsd \\\n    -d pain001/templates/pain.001.001.03/template.csv\n```\n\n**Step 3:** Check the output\n\nIf successful, you'll see:\n- ✓ Validation messages in your terminal\n- ✓ A new ISO 20022-compliant XML file at your specified location\n\n### Safe Validation (Dry-Run Mode)\n\nYou can validate your data against the ISO 20022 schema **without\ngenerating an output file** using the `--dry-run` flag (alias:\n`--validate-only`). This is ideal for:\n\n- **CI/CD Pipelines:** Pre-flight validation in automated builds\n- **Data Quality Checks:** Verify payment data before batch processing\n- **Template Development:** Test XML templates and schemas without file clutter\n- **Pre-Commit Hooks:** Validate data before committing to version control\n\n**Command:**\n\n```sh\npython3 -m pain001 \\\n    -t pain.001.001.03 \\\n    -m pain001/templates/pain.001.001.03/template.xml \\\n    -s pain001/templates/pain.001.001.03/pain.001.001.03.xsd \\\n    -d pain001/templates/pain.001.001.03/template.csv \\\n    --dry-run  # \u003c--- Validation-only mode\n```\n\n**Output:**\n\n```plaintext\n[SUCCESS] Validation passed. No XML file created.\n```\n\n**Exit Codes:**\n\n- `0` - Validation succeeded (safe to proceed)\n- `1` - Validation failed (data or schema errors detected)\n\n**What Gets Validated:**\n\n- ✓ XML template structure and syntax\n- ✓ XSD schema compliance\n- ✓ Payment data integrity (required fields, data types, formats)\n- ✓ Business rules (amounts \u003e 0, valid IBANs/BICs, etc.)\n\n**Note:** Dry-run mode uses the same validation logic as XML generation,\nensuring your data will be valid when you generate the actual file.\n\n### Arguments\n\nWhen running **Pain001**, you will need to specify four arguments:\n\n- An `xml_message_type`: This is the type of XML message you want to generate.\n\n  The currently supported types are:\n\n  - pain.001.001.03\n  - pain.001.001.04\n  - pain.001.001.05\n  - pain.001.001.06\n  - pain.001.001.07\n  - pain.001.001.08\n  - pain.001.001.09\n  - pain.001.001.10 _(New in v0.0.36)_\n  - pain.001.001.11 _(New in v0.0.36)_\n\n- An `xml_template_file_path`: This is the path to the XML template file you are\n  using that contains variables that will be replaced by the values in your\n\n  Data file.\n\n- An `xsd_schema_file_path`: This is the path to the XSD schema file you are\n  using to validate the generated XML file.\n\n- A `data_file_path`: This is the path to the CSV or SQLite Data file you want\n  to convert to XML format.\n\n## CSV Data Format\n\nBefore using **Pain001**, prepare your CSV file with the payment data. The CSV\nfile must include specific columns that map to ISO 20022 fields. Here's the\nrequired structure:\n\n### Required CSV Columns\n\n| Column Name | Description | Example |\n|------------|-------------|----------|\n| `id` | Unique message identifier | MSG-20260109-001 |\n| `date` | Creation date/time | 2026-01-09T10:30:00 |\n| `nb_of_txs` | Number of transactions | 1 |\n| `initiator_name` | Name of payment initiator | ABC Corporation |\n| `payment_information_id` | Payment batch ID | PAYMENT-BATCH-001 |\n| `payment_method` | Payment method code | TRF |\n| `creditor_name` | Beneficiary name | XYZ Limited |\n| `creditor_account` | Beneficiary IBAN | GB29NWBK60161331926819 |\n| `creditor_agent` | Beneficiary BIC | NWBKGB2L |\n| `amount` | Payment amount | 1000.00 |\n| `currency` | Currency code | EUR |\n| `end_to_end_id` | End-to-end reference | E2E-REF-001 |\n\n**Sample CSV File:**\n\n```csv\nid,date,nb_of_txs,initiator_name,payment_information_id,payment_method,creditor_name,creditor_account,creditor_agent,amount,currency,end_to_end_id\nMSG-001,2026-01-09T10:30:00,1,ABC Corp,PMT-001,TRF,XYZ Ltd,GB29NWBK60161331926819,NWBKGB2L,1000.00,EUR,E2E-001\n```\n\n**Finding Template Files:**\n\nTemplate CSV files for each supported pain message type are available in the `pain001/templates/` directory:\n\n```sh\n# If you installed via pip, find the templates with:\npython -c \"import pain001; import os; print(os.path.dirname(pain001.__file__))\"\n\n# Navigate to the templates directory:\ncd \u003cpath_from_above\u003e/templates/\n```\n\nEach template directory contains:\n- `template.csv` - Sample CSV file with required columns\n- `template.xml` - XML template file\n- `pain.001.001.XX.xsd` - XSD schema file for validation\n\n## Examples\n\nThe following examples demonstrate how to use **Pain001** to generate payment\ninitiation messages from different data sources (CSV file, SQLite database, and Python data structures).\n\n### Using a CSV Data File as the source\n\n```sh\npython3 -m pain001 \\\n    -t pain.001.001.03 \\\n    -m /path/to/your/template.xml \\\n    -s /path/to/your/pain.001.001.03.xsd \\\n    -d /path/to/your/template.csv\n```\n\n### Using a SQLite Data File as the source\n\n```sh\npython3 -m pain001 \\\n    -t pain.001.001.03 \\\n    -m /path/to/your/template.xml \\\n    -s /path/to/your/pain.001.001.03.xsd \\\n    -d /path/to/your/template.db\n```\n\n### Using Python Data Structures (Programmatic API)\n\nYou can use the library directly in Python with lists or dictionaries:\n\n```python\nfrom pain001 import process_files\n\n# Using a list of payment dictionaries\npayments = [\n    {\n        'id': 'MSG001',\n        'amount': '1000.00',\n        'currency': 'EUR',\n        # ... other required fields\n    }\n]\n\nresult = process_files(\n    xml_message_type='pain.001.001.03',\n    data_file_path=payments,  # Python list\n    xml_template_file_path='pain001/templates/pain.001.001.03/template.xml',\n    xsd_schema_file_path='pain001/templates/pain.001.001.03/pain.001.001.03.xsd'\n)\n\n# Using a single payment dictionary\npayment = {\n    'id': 'MSG001',\n    'amount': '1000.00',\n    'currency': 'EUR',\n    # ... other required fields\n}\n\nresult = process_files(\n    xml_message_type='pain.001.001.03',\n    data_file_path=payment,  # Single dict\n    xml_template_file_path='pain001/templates/pain.001.001.03/template.xml',\n    xsd_schema_file_path='pain001/templates/pain.001.001.03/pain.001.001.03.xsd'\n)\n```\n\n### Using the Source code\n\nYou can clone the source code and run the example code in your\nterminal/command-line. To check out the source code, clone the repository from\nGitHub:\n\n```sh\ngit clone https://github.com/sebastienrousseau/pain001.git\n```\n\n#### Pain.001.001.03\n\nThis will generate a payment initiation message in the format of\nPain.001.001.03.\n\n```sh\npython -m pain001 \\\n    -t pain.001.001.03 \\\n    -m pain001/templates/pain.001.001.03/template.xml \\\n    -s pain001/templates/pain.001.001.03/pain.001.001.03.xsd \\\n    -d pain001/templates/pain.001.001.03/template.csv\n```\n\n#### Pain.001.001.04\n\nThis will generate a payment initiation message in the format of\nPain.001.001.04.\n\n```sh\npython -m pain001 \\\n    -t pain.001.001.04 \\\n    -m pain001/templates/pain.001.001.04/template.xml \\\n    -s pain001/templates/pain.001.001.04/pain.001.001.04.xsd \\\n    -d pain001/templates/pain.001.001.04/template.csv\n```\n\n#### Pain.001.001.05\n\nThis will generate a payment initiation message in the format of\nPain.001.001.05.\n\n```sh\npython -m pain001 \\\n    -t pain.001.001.05 \\\n    -m pain001/templates/pain.001.001.05/template.xml \\\n    -s pain001/templates/pain.001.001.05/pain.001.001.05.xsd \\\n    -d pain001/templates/pain.001.001.05/template.csv\n```\n\n#### Pain.001.001.06\n\nThis will generate a payment initiation message in the format of\nPain.001.001.06.\n\n```sh\npython -m pain001 \\\n    -t pain.001.001.06 \\\n    -m pain001/templates/pain.001.001.06/template.xml \\\n    -s pain001/templates/pain.001.001.06/pain.001.001.06.xsd \\\n    -d pain001/templates/pain.001.001.06/template.csv\n```\n\n#### Pain.001.001.07\n\nThis will generate a payment initiation message in the format of\nPain.001.001.07.\n\n```sh\npython -m pain001 \\\n    -t pain.001.001.07 \\\n    -m pain001/templates/pain.001.001.07/template.xml \\\n    -s pain001/templates/pain.001.001.07/pain.001.001.07.xsd \\\n    -d pain001/templates/pain.001.001.07/template.csv\n```\n\n#### Pain.001.001.08\n\nThis will generate a payment initiation message in the format of\nPain.001.001.08.\n\n```sh\npython -m pain001 \\\n    -t pain.001.001.08 \\\n    -m pain001/templates/pain.001.001.08/template.xml \\\n    -s pain001/templates/pain.001.001.08/pain.001.001.08.xsd \\\n    -d pain001/templates/pain.001.001.08/template.csv\n```\n\n#### Pain.001.001.09\n\nThis will generate a payment initiation message in the format of\nPain.001.001.09.\n\n```sh\npython -m pain001 \\\n    -t pain.001.001.09 \\\n    -m pain001/templates/pain.001.001.09/template.xml \\\n    -s pain001/templates/pain.001.001.09/pain.001.001.09.xsd \\\n    -d pain001/templates/pain.001.001.09/template.csv\n```\n\n#### Pain.001.001.10\n\nThis will generate a payment initiation message in the format of\nPain.001.001.10 with enhanced compliance features.\n\n```sh\npython -m pain001 \\\n    -t pain.001.001.10 \\\n    -m pain001/templates/pain.001.001.10/template.xml \\\n    -s pain001/templates/pain.001.001.10/pain.001.001.10.xsd \\\n    -d pain001/templates/pain.001.001.10/template.csv\n```\n\n#### Pain.001.001.11\n\nThis will generate a payment initiation message in the format of\nPain.001.001.11, the latest ISO 20022 version with advanced payment features.\n\n```sh\npython -m pain001 \\\n    -t pain.001.001.11 \\\n    -m pain001/templates/pain.001.001.11/template.xml \\\n    -s pain001/templates/pain.001.001.11/pain.001.001.11.xsd \\\n    -d pain001/templates/pain.001.001.11/template.csv\n```\n\nYou can do the same with the sample SQLite Data file:\n\n```sh\npython3 -m pain001 \\\n    -t pain.001.001.03 \\\n    -m pain001/templates/pain.001.001.03/template.xml \\\n    -s pain001/templates/pain.001.001.03/pain.001.001.03.xsd \\\n    -d pain001/templates/pain.001.001.03/template.db\n```\n\n\u003e **Note:** The XML file that **Pain001** generates will automatically be\n\u003e validated against the XSD template file before the new XML file is saved. If\n\u003e the validation fails, **Pain001** will stop running and display an error\n\u003e message in your terminal.\n\n### Embedded in an Application\n\nTo embed **Pain001** in a new or existing application, import the main function\nand use it in your code.\n\n**Basic Integration:**\n\n```python\nfrom pain001 import main\n\nif __name__ == '__main__':\n    xml_message_type = 'pain.001.001.03'\n    xml_template_file_path = 'template.xml'\n    xsd_schema_file_path = 'schema.xsd'\n    data_file_path = 'data.csv'\n    main(\n        xml_message_type,\n        xml_template_file_path,\n        xsd_schema_file_path,\n        data_file_path\n    )\n```\n\n**Advanced Integration with Error Handling:**\n\n```python\nfrom pain001.core.core import process_files\nfrom pain001.xml.validate_via_xsd import validate_via_xsd\nimport os\n\ndef create_payment_file(data_file, output_dir='output'):\n    \"\"\"Create and validate an ISO 20022 payment file.\"\"\"\n    try:\n        # Define file paths\n        xml_message_type = 'pain.001.001.03'\n        xml_template = os.path.join(output_dir, 'payment.xml')\n        xsd_schema = 'pain001/templates/pain.001.001.03/pain.001.001.03.xsd'\n\n        # Generate the payment file\n        process_files(\n            xml_message_type,\n            xml_template,\n            xsd_schema,\n            data_file\n        )\n\n        # Validate the generated file\n        if validate_via_xsd(xml_template, xsd_schema):\n            print(f\"✓ Successfully created and validated: {xml_template}\")\n            return xml_template\n        else:\n            print(f\"✗ Validation failed for: {xml_template}\")\n            return None\n\n    except FileNotFoundError as e:\n        print(f\"Error: File not found - {e}\")\n        return None\n    except ValueError as e:\n        print(f\"Error: Invalid data - {e}\")\n        return None\n    except Exception as e:\n        print(f\"Error: {e}\")\n        return None\n\nif __name__ == '__main__':\n    # Example usage\n    result = create_payment_file('payments.csv')\n    if result:\n        print(f\"Payment file ready for submission: {result}\")\n```\n\n### Validation\n\n**Pain001** implements **mandatory data validation** to ensure all payment files are ISO 20022-compliant.\n\n#### How Validation Works\n\n**Pain001** performs validation in two stages:\n\n**Stage 1: Data Validation (Automatic)**\n\nEvery time you load data (from CSV, SQLite, or Python objects), **Pain001** automatically validates:\n- ✓ All required fields are present\n- ✓ Data types are correct (strings, numbers, booleans)\n- ✓ Boolean values are valid ('true'/'false' or 'yes'/'no')\n- ✓ Field formats meet ISO 20022 standards\n\n**Stage 2: XSD Schema Validation (Automatic)**\n\nAfter generating the XML file, **Pain001** validates it against the XSD schema to ensure:\n- ✓ XML structure is correct\n- ✓ All elements are properly formatted\n- ✓ File is ready for bank submission\n\n#### Handling Validation Errors\n\nIf validation fails, you'll get a clear error message:\n\n```python\nfrom pain001 import main\n\ntry:\n    main(\n        'pain.001.001.03',\n        'template.xml',\n        'schema.xsd',\n        'invalid_data.csv'  # CSV with invalid data\n    )\nexcept ValueError as e:\n    print(f\"Data validation failed: {e}\")\n    # Output: \"Data validation failed: CSV data validation failed\"\n```\n\n**XSD Schema Validation:**\n\nAfter generating the XML file, **Pain001** validates it against the XSD schema to ensure structural compliance:\n\n```python\nfrom pain001.xml.validate_via_xsd import validate_via_xsd\n\nxml_file = 'generated.xml'\nxsd_file = 'schema.xsd'\n\nis_valid = validate_via_xsd(xml_file, xsd_file)\nif is_valid:\n    print(\"✓ XML is valid and ready for submission\")\nelse:\n    print(\"✗ XML validation failed - check the error messages\")\n```\n\n**Why Mandatory Validation?**\n\nMandatory validation is the core principle of Pain001. It ensures:\n- Payment files are always ISO 20022-compliant\n- Banks won't reject files due to data errors\n- Issues are caught early in the development process\n- No silent failures - all problems are reported immediately\n\n#### Complete Validation Workflow\n\n```mermaid\n%%{init: {'theme':'default'}}%%\nflowchart TD\n    Start([1. Load Data Source]) --\u003e DataType{Data Type?}\n\n    DataType --\u003e|CSV| LoadCSV[Load CSV File]\n    DataType --\u003e|SQLite| LoadDB[Load SQLite Database]\n    DataType --\u003e|Python| LoadPython[Load Python Dict/List]\n\n    LoadCSV --\u003e Stage1[2. Automatic Data Validation]\n    LoadDB --\u003e Stage1\n    LoadPython --\u003e Stage1\n\n    Stage1 --\u003e CheckReq[Check Required Fields]\n    CheckReq --\u003e CheckTypes[Validate Data Types]\n    CheckTypes --\u003e CheckBool[Verify Boolean Values]\n    CheckBool --\u003e CheckFormats[Check ISO 20022 Formats]\n\n    CheckFormats --\u003e Valid1{All Checks\u003cbr/\u003ePassed?}\n\n    Valid1 --\u003e|No| ErrorData[ValueError Raised\u003cbr/\u003eFix Your Data]\n    Valid1 --\u003e|Yes| ValidData[Valid Data ✓]\n\n    ErrorData --\u003e Start\n\n    ValidData --\u003e Stage3[3. Generate XML File]\n    Stage3 --\u003e Stage4[4. XSD Schema Validation]\n\n    Stage4 --\u003e CheckStruct[Validate XML Structure]\n    CheckStruct --\u003e CheckElem[Check Element Formatting]\n    CheckElem --\u003e CheckComp[Verify ISO 20022 Compliance]\n\n    CheckComp --\u003e Valid2{XML Schema\u003cbr/\u003eValid?}\n\n    Valid2 --\u003e|No| ErrorXML[Validation Failed\u003cbr/\u003eCheck Error Message]\n    Valid2 --\u003e|Yes| ValidXML[Valid XML ✓]\n\n    ErrorXML --\u003e Start\n\n    ValidXML --\u003e Success([5. Payment File Ready\u003cbr/\u003efor Bank Submission ✓])\n```\n\n## Output Files\n\nWhen you run **Pain001**, it generates the following:\n\n1. **XML Payment File**: A fully compliant ISO 20022 pain.001 message file\n   - Generated in the same directory as your XML template\n   - Validated against the XSD schema before being saved\n   - Ready for submission to your bank or payment processor\n\n2. **Log Output**: Detailed logging information displayed in your terminal\n   - Shows validation progress and any errors\n   - Confirms successful file generation\n\n### Output Location\n\nThe generated XML file will be created at the path you specified in the\n`xml_template_file_path` argument. For example:\n\n```sh\npython3 -m pain001 \\\n    -t pain.001.001.03 \\\n    -m /output/payment_2026-01-09.xml \\\n    -s /path/to/schema.xsd \\\n    -d /path/to/data.csv\n```\n\nWill create `/output/payment_2026-01-09.xml`\n\n## Complete Workflow Example\n\nHere's a complete end-to-end example showing how to create a payment file:\n\n**Step 1: Create your CSV file** (`my_payments.csv`)\n\n```csv\nid,date,nb_of_txs,initiator_name,payment_information_id,payment_method,creditor_name,creditor_account,creditor_agent,amount,currency,end_to_end_id,debtor_name,debtor_account,debtor_agent\nMSG-2026-001,2026-01-09T14:30:00,1,My Company Ltd,PMT-BATCH-001,TRF,Supplier ABC,GB29NWBK60161331926819,NWBKGB2L,1500.00,EUR,INV-2026-001,My Company Ltd,DE89370400440532013000,COBADEFFXXX\n```\n\n**Step 2: Run Pain001**\n\n```sh\npython3 -m pain001 \\\n    -t pain.001.001.03 \\\n    -m output/payment.xml \\\n    -s pain001/templates/pain.001.001.03/pain.001.001.03.xsd \\\n    -d my_payments.csv\n```\n\n**Step 3: Verify the output**\n\n```sh\n# Check the generated file exists\nls -lh output/payment.xml\n\n# View the first few lines\nhead -20 output/payment.xml\n```\n\n**Step 4: Use in Python application**\n\n```python\nfrom pain001 import main\nimport os\n\ndef generate_payment_file():\n    \"\"\"Generate ISO 20022 payment file from CSV data.\"\"\"\n    try:\n        # Define paths\n        output_dir = 'output'\n        os.makedirs(output_dir, exist_ok=True)\n\n        # Generate payment file\n        main(\n            xml_message_type='pain.001.001.03',\n            xml_template_file_path=f'{output_dir}/payment.xml',\n            xsd_schema_file_path='pain001/templates/pain.001.001.03/pain.001.001.03.xsd',\n            data_file_path='my_payments.csv'\n        )\n\n        print(\"✓ Payment file generated successfully!\")\n        print(f\"✓ Location: {output_dir}/payment.xml\")\n        print(\"✓ File is ready for bank submission\")\n        return True\n\n    except ValueError as e:\n        print(f\"✗ Data validation error: {e}\")\n        print(\"→ Please check your CSV file for missing or invalid data\")\n        return False\n\n    except FileNotFoundError as e:\n        print(f\"✗ File not found: {e}\")\n        print(\"→ Please check all file paths are correct\")\n        return False\n\n    except Exception as e:\n        print(f\"✗ Unexpected error: {e}\")\n        return False\n\nif __name__ == '__main__':\n    success = generate_payment_file()\n    exit(0 if success else 1)\n```\n\n**Expected Output:**\n\n```\n✓ Payment file generated successfully!\n✓ Location: output/payment.xml\n✓ File is ready for bank submission\n```\n\n## Troubleshooting\n\n### Common Issues and Solutions\n\n**Issue: \"ModuleNotFoundError: No module named 'pain001'\"**\n\nSolution: Ensure you have installed pain001 and are using the correct Python environment:\n```sh\npython -m pip install pain001\n# Or if you're using a virtual environment:\nsource venv/bin/activate\npython -m pip install pain001\n```\n\n**Issue: \"Error: Invalid XML message type\"**\n\nSolution: Ensure you're using one of the supported message types:\n- pain.001.001.03\n- pain.001.001.04\n- pain.001.001.05\n- pain.001.001.06\n- pain.001.001.07\n- pain.001.001.08\n- pain.001.001.09\n- pain.001.001.10\n- pain.001.001.11\n\n**Issue: \"Error: XML template file does not exist\"**\n\nSolution: Verify the file path is correct and the file exists:\n```sh\nls -la /path/to/your/template.xml\n```\n\n**Issue: \"Error: Invalid CSV data\"**\n\nSolution: Check that your CSV file:\n- Contains all required columns\n- Has valid data in each column\n- Uses proper CSV formatting (commas as delimiters, quotes for text with commas)\n- Has a header row with column names\n\n**Issue: \"Validation failed\"**\n\nSolution: This means the generated XML doesn't match the XSD schema:\n- Ensure your data values match ISO 20022 format requirements\n- Check that IBANs, BICs, and currency codes are valid\n- Verify date/time formats are correct (ISO 8601: YYYY-MM-DDTHH:MM:SS)\n- Review the error message for specific field issues\n\n**Issue: Permission denied when writing output file**\n\nSolution: Ensure you have write permissions for the output directory:\n```sh\nchmod u+w /path/to/output/directory\n```\n\n### Getting Help\n\nIf you encounter issues not covered here:\n1. Check the [GitHub Issues](https://github.com/sebastienrousseau/pain001/issues) for similar problems\n2. Review the [Documentation](https://pain001.com) for detailed guides\n3. Create a new issue with:\n   - Your Python version (`python --version`)\n   - Pain001 version (`python -m pip show pain001`)\n   - Full error message\n   - Minimal example to reproduce the issue\n\n## Documentation\n\n\u003e **Info:** Do check out our [website][00] for comprehensive documentation.\n\n### Supported messages\n\nThis section gives access to the documentation related to the ISO 20022 message\ndefinitions supported by **Pain001**.\n\n#### Bank-to-Customer Cash Management\n\nSet of messages used to request and provide account information for\nreconciliation and cash positioning between an account servicer and its\ncustomer.\n\n| Status | Message type    | Name                               |\n| ------ | --------------- | ---------------------------------- |\n| ⏳      | camt.052.001.10 | Bank-to-Customer Account Statement |\n| ⏳      | camt.053.001.10 | Customer Account Identification    |\n| ⏳      | camt.054.001.10 | Customer Account Statement Request |\n| ⏳      | camt.060.001.10 | Customer Account Notification      |\n\n#### Payments Clearing and Settlement\n\nSet of messages used between financial institutions for the clearing and\nsettlement of payment transactions.\n\n| Status | Message type    | Name                               |\n| ------ | --------------- | ---------------------------------- |\n| ⏳      | pacs.002.001.12 | Credit Transfer Notification       |\n| ⏳      | pacs.003.001.09 | Direct Debit Initiation            |\n| ⏳      | pacs.004.001.11 | Direct Debit Reversal              |\n| ⏳      | pacs.007.001.11 | Customer Direct Debit Confirmation |\n| ⏳      | pacs.008.001.10 | Credit Transfer Initiation         |\n| ⏳      | pacs.009.001.10 | Credit Transfer Reversal           |\n| ⏳      | pacs.010.001.05 | Account Identification             |\n| ⏳      | pacs.028.001.05 | Account Statement Request          |\n\n#### Payments Initiation\n\nSet of messages exchanged between a debtor (or buyer) and its bank or between a\ncreditor (or seller) and its bank to initiate, collect, manage and monitor\npayments.\n\n| Status | Message type                       | Name              |\n| ------ | ---------------- | ----------------------------------- |\n| ✅      | pain.001.001.03 | Customer Credit Transfer Initiation |\n| ✅      | pain.001.001.04 | Customer Direct Debit Initiation    |\n| ✅      | pain.001.001.05 | Customer Direct Debit Reversal      |\n| ✅      | pain.001.001.06 | Customer Credit Transfer Reversal   |\n| ✅      | pain.001.001.07 | Customer Account Notification       |\n| ✅      | pain.001.001.08 | Customer Account Statement          |\n| ✅      | pain.001.001.09 | Customer Credit Transfer Initiation |\n| ✅      | pain.001.001.10 | Customer Credit Transfer Initiation |\n| ✅      | pain.001.001.11 | Customer Credit Transfer Initiation |\n\n## Development\n\n### Setting Up Development Environment\n\nPain001 uses [Poetry](https://python-poetry.org/) for dependency management and [mise](https://mise.jdx.dev/) for Python version management.\n\n```bash\n# Install Python version via mise\nmise install\n\n# Install dependencies\npoetry install\n\n# Activate the virtual environment\npoetry shell\n```\n\n### Development Workflow (Zero-Trust Quality Model)\n\nWe enforce a **Zero-Trust Quality Model** with mandatory quality gates. Before submitting a PR, you **must** run the local tollgates to ensure your changes meet our enterprise standards.\n\n#### Enterprise Quality Gates (Makefile)\n\nWe use a `Makefile` to orchestrate all quality checks. This ensures consistency between local development and CI/CD pipelines.\n\n```bash\n# Fast PR gate (non-blocking for iterative dev)\npoetry run make pr\n\n# Full quality gate (REQUIRED before commit)\npoetry run make check\n\n# Release preparation (advanced security, XSD, idempotency)\npoetry run make tollgates\n\n# Performance benchmarks (XML generation \u003c 500ms/1000 transactions)\npoetry run make perf\n\n# Cleanup build artifacts\npoetry run make clean\n```\n\n**Quality Gate Requirements:**\n\n| Gate | Command | What It Checks | Exit Code Required |\n|------|---------|----------------|--------------------|\n| **PR Gate** | `make pr` | Formatting (ruff, black, isort), Type checking (mypy), Tests (pytest), Coverage (≥99%) | 0 (PASS) |\n| **Full Gate** | `make check` | PR Gate + Security (bandit, safety), Lint (pylint) | 0 (PASS) |\n| **Tollgates** | `make tollgates` | Full Gate + XSD validation (9 versions), Advanced security, Idempotency checks | 0 (PASS) |\n\n**Note:** All PRs must pass the `check` target (exit code 0) and maintain **98%+ coverage**. No exceptions.\n\n### Manual Quality Tools (Advanced)\n\nIf you need to run individual tools:\n\n```bash\n# Linting\npoetry run ruff check .\npoetry run pylint pain001\n\n# Formatting\npoetry run black .\npoetry run ruff format .\n\n# Import sorting\npoetry run isort .\n\n# Type checking\npoetry run mypy pain001\n\n# Security scanning\npoetry run bandit -r pain001\npoetry run safety check\n\n# Testing\npoetry run pytest --cov=pain001 --cov-report=html\n```\n\n**However, we strongly recommend using `make check` instead of individual commands to ensure nothing is missed.**\n\n## License\n\nThe project is licensed under the terms of both the MIT license and the Apache\nLicense (Version 2.0).\n\n- [Apache License, Version 2.0][01]\n- [MIT license][02]\n\n## Contribution\n\nWe welcome contributions to **Pain001**. Please see the\n[contributing instructions][04] for more information.\n\nUnless you explicitly state otherwise, any contribution intentionally submitted\nfor inclusion in the work by you, as defined in the Apache-2.0 license, shall\nbe dual licensed as above, without any additional terms or conditions.\n\n## Acknowledgements\n\nWe would like to extend a big thank you to all the awesome contributors of\n[Pain001][05] for their help and support.\n\n[00]: https://pain001.com\n[01]: https://opensource.org/license/apache-2-0/\n[02]: http://opensource.org/licenses/MIT\n[03]: https://github.com/sebastienrousseau/pain001\n[04]: https://github.com/sebastienrousseau/pain001/blob/main/CONTRIBUTING.md\n[05]: https://github.com/sebastienrousseau/pain001/graphs/contributors\n[06]: https://codecov.io/github/sebastienrousseau/pain001?branch=main\n[07]: https://pypi.org/project/pain001/\n[release-045]: https://github.com/sebastienrousseau/pain001/releases/tag/v0.0.45\n[release-046]: https://github.com/sebastienrousseau/pain001/releases/tag/v0.0.46\n\n[banner]: https://kura.pro/pain001/images/banners/banner-pain001.svg 'Pain001, A Python Library for Automating ISO 20022-Compliant Payment Files Using CSV Or SQlite Data Files.'\n[codecov-badge]: https://img.shields.io/codecov/c/github/sebastienrousseau/pain001?style=for-the-badge 'Codecov badge'\n[coverage-floor-badge]: https://img.shields.io/badge/coverage-98.55%25-brightgreen?style=for-the-badge 'Coverage 98.55%'\n[docs-badge]: https://img.shields.io/github/actions/workflow/status/sebastienrousseau/pain001/docs.yml?branch=main\u0026label=Docs\u0026style=for-the-badge 'Documentation badge'\n[docs-url]: https://docs.pain001.com/\n[license-badge]: https://img.shields.io/pypi/l/pain001?style=for-the-badge 'License badge'\n[pypi-badge]: https://img.shields.io/pypi/v/pain001?style=for-the-badge 'PyPI version badge'\n[pypi-downloads-badge]: https://img.shields.io/pypi/dm/pain001.svg?style=for-the-badge 'PyPI Downloads badge'\n[python-matrix-badge]: https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12-blue?style=for-the-badge 'Python 3.9-3.12'\n[python-versions-badge]: https://img.shields.io/pypi/pyversions/pain001.svg?style=for-the-badge 'Python versions badge'\n[quality-badge]: https://img.shields.io/github/actions/workflow/status/sebastienrousseau/pain001/quality.yml?branch=main\u0026label=Quality\u0026style=for-the-badge 'Code quality badge'\n[quality-url]: https://github.com/sebastienrousseau/pain001/actions/workflows/quality.yml\n[security-hardened-badge]: https://img.shields.io/badge/security-hardened-blueviolet?style=for-the-badge 'Security: Hardened'\n[tests-badge]: https://img.shields.io/github/actions/workflow/status/sebastienrousseau/pain001/ci.yml?branch=main\u0026label=Tests\u0026style=for-the-badge 'Tests badge'\n[tests-url]: https://github.com/sebastienrousseau/pain001/actions/workflows/ci.yml\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsebastienrousseau%2Fpain001","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsebastienrousseau%2Fpain001","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsebastienrousseau%2Fpain001/lists"}