ТЗ - куар для UA банков

Речь про: https://bots.duckholding.com/partners/3/bank-infos

Сейчас у партнёров генерируется QR для оплат по реквизитам в РФ банки.

Партнер должен уметь генерировать QR для украинских банков.

Код генерации куаров

import base64
import qrcode
from pathlib import Path


def base64url_utf8(value: str) -> str:
    return base64.urlsafe_b64encode(value.encode("utf-8")).decode().rstrip("=")


def create_ukraine_iban_qr_payload(
    receiver_name: str,
    iban: str,
    recipient_code: str,
    payment_purpose: str,
    amount: str | None = None,
) -> str:
    amount_line = f"UAH{amount}" if amount else ""

    open_structure = "\n".join([
        "BCD",
        "002",
        "1",              # UTF-8
        "UCT",
        "",               # BIC, reserved
        receiver_name,
        iban,
        amount_line,
        recipient_code,
        "",               # Ціль, reserved
        "",               # Reference, reserved
        payment_purpose,
        "",               # Display
    ]) + "\n"

    encoded = base64url_utf8(open_structure)
    return f"https://bank.gov.ua/qr/{encoded}"


def save_qr_png(payload: str, output_path: str = "ukraine_iban_qr.png") -> None:
    qr = qrcode.QRCode(
        version=None,  # авторазмер
        error_correction=qrcode.constants.ERROR_CORRECT_M,
        box_size=10,
        border=4,
    )

    qr.add_data(payload)
    qr.make(fit=True)

    img = qr.make_image(fill_color="black", back_color="white")
    img.save(output_path)


payload = create_ukraine_iban_qr_payload(
    receiver_name="ТОВ «Test Company»",
    iban="UA123456789012345678901234567",
    recipient_code="12345678",  # ЄДРПОУ / РНОКПП
    amount="1000",
    payment_purpose="Оплата за рахунком №INV-123 від 09.07.2026, без ПДВ",
)

save_qr_png(payload, "ukraine_iban_qr.png")

print("QR payload:")
print(payload)
print("Saved to ukraine_iban_qr.png")

Для партнёра уже известны

receiver_name="ТОВ «Test Company»",
recipient_code="12345678",  # ЄДРПОУ / РНОКПП

Также как и в РФ у нас остаётся

payment_purpose="Счёт-поручение / Ордер",

но с переводом на украинский

Параметр

iban="UA123456789012345678901234567",

зависит от банка