Source code for qpay_client.v2.error

from dataclasses import dataclass
from enum import Enum


@dataclass
class QpayErrorDescription:
    """English and Mongolian description of QPay error keys."""

    en: str
    mn: str


class QPayErrorCode(int, Enum):
    """QPay error codes."""

    SUCCESS = 200
    VALIDATION_ERROR = 400
    UNAUTHORIZED_ERROR = 401
    FORBIDDEN_ERROR = 403
    UNIQUE_ERROR = 409
    NOT_FOUND_ERROR = 422
    INTERNAL_ERROR = 500


class QPayErrorKey(str, Enum):
    """QPay error keys."""

    account_bank_duplicated = "ACCOUNT_BANK_DUPLICATED"  # Changed to lowercase
    account_selection_invalid = "ACCOUNT_SELECTION_INVALID"
    authentication_failed = "AUTHENTICATION_FAILED"
    bank_account_notfound = "BANK_ACCOUNT_NOTFOUND"
    bank_mcc_already_added = "BANK_MCC_ALREADY_ADDED"
    bank_mcc_not_found = "BANK_MCC_NOT_FOUND"
    card_terminal_notfound = "CARD_TERMINAL_NOTFOUND"
    client_notfound = "CLIENT_NOTFOUND"
    client_username_duplicated = "CLIENT_USERNAME_DUPLICATED"
    customer_duplicate = "CUSTOMER_DUPLICATE"
    customer_notfound = "CUSTOMER_NOTFOUND"
    customer_register_invalid = "CUSTOMER_REGISTER_INVALID"
    ebarimt_cancel_notsupperded = "EBARIMT_CANCEL_NOTSUPPERDED"
    ebarimt_not_registered = "EBARIMT_NOT_REGISTERED"
    ebarimt_qr_code_invalid = "EBARIMT_QR_CODE_INVALID"
    inform_notfound = "INFORM_NOTFOUND"
    input_code_registered = "INPUT_CODE_REGISTERED"
    input_notfound = "INPUT_NOTFOUND"
    invalid_amount = "INVALID_AMOUNT"
    invalid_object_type = "INVALID_OBJECT_TYPE"
    invoice_already_canceled = "INVOICE_ALREADY_CANCELED"
    invoice_code_invalid = "INVOICE_CODE_INVALID"
    invoice_code_registered = "INVOICE_CODE_REGISTERED"
    invoice_line_required = "INVOICE_LINE_REQUIRED"
    invoice_notfound = "INVOICE_NOTFOUND"
    invoice_paid = "INVOICE_PAID"
    invoice_receiver_data_address_required = "INVOICE_RECEIVER_DATA_ADDRESS_REQUIRED"
    invoice_receiver_data_email_required = "INVOICE_RECEIVER_DATA_EMAIL_REQUIRED"
    invoice_receiver_data_phone_required = "INVOICE_RECEIVER_DATA_PHONE_REQUIRED"
    invoice_receiver_data_required = "INVOICE_RECEIVER_DATA_REQUIRED"
    max_amount_err = "MAX_AMOUNT_ERR"
    mcc_notfound = "MCC_NOTFOUND"
    merchant_already_registered = "MERCHANT_ALREADY_REGISTERED"
    merchant_inactive = "MERCHANT_INACTIVE"
    merchant_notfound = "MERCHANT_NOTFOUND"
    min_amount_err = "MIN_AMOUNT_ERR"
    no_credendials = "NO_CREDENDIALS"
    object_data_error = "OBJECT_DATA_ERROR"
    p2p_terminal_notfound = "P2P_TERMINAL_NOTFOUND"
    payment_already_canceled = "PAYMENT_ALREADY_CANCELED"
    payment_not_paid = "PAYMENT_NOT_PAID"
    payment_notfound = "PAYMENT_NOTFOUND"
    permission_denied = "PERMISSION_DENIED"
    qraccount_inactive = "QRACCOUNT_INACTIVE"
    qraccount_notfound = "QRACCOUNT_NOTFOUND"
    qrcode_notfound = "QRCODE_NOTFOUND"
    qrcode_used = "QRCODE_USED"
    sender_branch_data_required = "SENDER_BRANCH_DATA_REQUIRED"
    tax_line_required = "TAX_LINE_REQUIRED"
    tax_product_code_required = "TAX_PRODUCT_CODE_REQUIRED"
    transaction_not_approved = "TRANSACTION_NOT_APPROVED"
    transaction_required = "TRANSACTION_REQUIRED"


QpayErrorDetail = {
    QPayErrorKey.account_bank_duplicated.value: QpayErrorDescription(
        en="Bank account is already registered!", mn="Банкны данс давхацсан байна"
    ),
    QPayErrorKey.account_selection_invalid.value: QpayErrorDescription(
        en="Account selection is invalid!", mn="Дансны сонголт буруу"
    ),
    QPayErrorKey.authentication_failed.value: QpayErrorDescription(
        en="Your username and password are wrong!", mn="Нэвтрэх нэр нууц үг буруу"
    ),
    QPayErrorKey.bank_account_notfound.value: QpayErrorDescription(
        en="Bank account is not found!", mn="Банкны данс олдсонгүй"
    ),
    QPayErrorKey.bank_mcc_already_added.value: QpayErrorDescription(
        en="Bank MCC is already added!", mn="Банкны MCC кодыг нэмчихсэн байна"
    ),
    QPayErrorKey.bank_mcc_not_found.value: QpayErrorDescription(
        en="Bank MCC is not found!", mn="Банкны MCC код олдсонгүй"
    ),
    QPayErrorKey.card_terminal_notfound.value: QpayErrorDescription(
        en="Card terminal is not registered!", mn="Картын терминал бүртгэлгүй байна"
    ),
    QPayErrorKey.client_notfound.value: QpayErrorDescription(
        en="Client is not registered!", mn="Клиентийн бүртгэл олдсонгүй"
    ),
    QPayErrorKey.client_username_duplicated.value: QpayErrorDescription(
        en="Client username is already exist!", mn="Клиентийн хэрэглэгчийн нэр давхацсан"
    ),
    QPayErrorKey.customer_duplicate.value: QpayErrorDescription(
        en="Customer register duplicated!", mn="Харилцагчийн регистрийн дугаар давхацсан байна!"
    ),
    QPayErrorKey.customer_notfound.value: QpayErrorDescription(
        en="Customer not registered!", mn="Харилцагч бүртгэгдээгүй байна!"
    ),
    QPayErrorKey.customer_register_invalid.value: QpayErrorDescription(
        en="Customer register is wrong!", mn="Харилцагч регистрийн дугаар байна!"
    ),
    QPayErrorKey.ebarimt_cancel_notsupperded.value: QpayErrorDescription(
        en="qPay service eBarimt unregister function not supported",
        mn="qPay үйлчилгээ и-баримтыг цуцлах боломжгүй байна.",
    ),
    QPayErrorKey.ebarimt_not_registered.value: QpayErrorDescription(
        en="eBarimt not registered!", mn="и-Баримт үүсээгүй байна."
    ),
    QPayErrorKey.ebarimt_qr_code_invalid.value: QpayErrorDescription(
        en="eBarimt QR code invalid by merchant", mn="Төлбөр хүлээн авагчийн илгээсэн и-баримт-ын QR код буруу байна."
    ),
    QPayErrorKey.inform_notfound.value: QpayErrorDescription(
        en="Inform is not found!", mn="Мэдэгдэлийн хаяг олдсонгүй"
    ),
    QPayErrorKey.input_code_registered.value: QpayErrorDescription(
        en="Input code is already registered!", mn="Input олдсонгүй"
    ),
    QPayErrorKey.input_notfound.value: QpayErrorDescription(
        en="Input not registered!", mn="Банкны данс давхацсан байна"
    ),
    QPayErrorKey.invalid_amount.value: QpayErrorDescription(en="Amount is invalid!", mn="Үнийн дүн буруу"),
    QPayErrorKey.invalid_object_type.value: QpayErrorDescription(en="Object type is invalid!", mn="object_type буруу"),
    QPayErrorKey.invoice_already_canceled.value: QpayErrorDescription(
        en="Invoice is already cancelled!", mn="Нэхэмжлэл цуцлагдсан байна"
    ),
    QPayErrorKey.invoice_code_invalid.value: QpayErrorDescription(
        en="Invoice code is wrong!", mn="Нэхэмжлэлийн код буруу"
    ),
    QPayErrorKey.invoice_code_registered.value: QpayErrorDescription(
        en="Invoice code is already registered!", mn="Нэхэмжлэлийн код бүртгэгдсэн байна"
    ),
    QPayErrorKey.invoice_line_required.value: QpayErrorDescription(
        en="Invoice line is required!", mn="Нэхэмжлэлийн мөр шаардлагатай"
    ),
    QPayErrorKey.invoice_notfound.value: QpayErrorDescription(en="Invoice is not found!", mn="Нэхэмжлэл олдсонгүй"),
    QPayErrorKey.invoice_paid.value: QpayErrorDescription(en="Invoice is paid!", mn="Нэхэмжлэл төлөгдсөн"),
    QPayErrorKey.invoice_receiver_data_address_required.value: QpayErrorDescription(
        en="Invoice receiver address is required!", mn="Нэхэмжлэл хүлээн авагчийн хаягийн мэдээлэл шаардлагатай"
    ),
    QPayErrorKey.invoice_receiver_data_email_required.value: QpayErrorDescription(
        en="Нэхэмжлэл хүлээн авагчийн имэйл хаяг шаардлагатай", mn="Invoice receiver email is required!"
    ),
    QPayErrorKey.invoice_receiver_data_phone_required.value: QpayErrorDescription(
        en="Invoice receiver phone is required!", mn="Нэхэмжлэл хүлээн авагчийн утасны дугаар шаардлагатай"
    ),
    QPayErrorKey.invoice_receiver_data_required.value: QpayErrorDescription(
        en="Invoice receiver data is required!", mn="Нэхэмжлэл хүлээн авагчийн мэдээлэл шаардлагатай"
    ),
    QPayErrorKey.max_amount_err.value: QpayErrorDescription(
        en="Amount is over than max value!", mn="Үнийн дүн хэт их байна"
    ),
    QPayErrorKey.mcc_notfound.value: QpayErrorDescription(en="MCC is not found!", mn="MCC код олдсонгүй"),
    QPayErrorKey.merchant_already_registered.value: QpayErrorDescription(
        en="Merchant is already registered!", mn="Мерчантын бүртгэл давхацсан"
    ),
    QPayErrorKey.merchant_inactive.value: QpayErrorDescription(en="Merchant is inactive!", mn="Мерчант идэвхигүй"),
    QPayErrorKey.merchant_notfound.value: QpayErrorDescription(
        en="Merchant is not registered!", mn="Мерчант бүртгэлгүй байна"
    ),
    QPayErrorKey.min_amount_err.value: QpayErrorDescription(
        en="Amount is less than minimum value!", mn="Үнийн дүн хэт бага байна"
    ),
    QPayErrorKey.no_credendials.value: QpayErrorDescription(
        en="Your credential is invalid. Please login!", mn="Хандах эрхгүй байна. Нэвтрэнэ үү."
    ),
    QPayErrorKey.object_data_error.value: QpayErrorDescription(en="Object data is wrong!", mn="object_data алдаа"),
    QPayErrorKey.p2p_terminal_notfound.value: QpayErrorDescription(
        en="P2P terminal is not registered!", mn="P2P терминал бүртгэлгүй байна"
    ),
    QPayErrorKey.payment_already_canceled.value: QpayErrorDescription(
        en="Payment is already cancelled!", mn="Төлбөр цуцлагдсан байна"
    ),
    QPayErrorKey.payment_not_paid.value: QpayErrorDescription(
        en="Payment is not paid!", mn="Төлбөр төлөлт хийгдээгүй байна"
    ),
    QPayErrorKey.payment_notfound.value: QpayErrorDescription(en="Payment is not found!", mn="Төлбөр олдсонгүй"),
    QPayErrorKey.permission_denied.value: QpayErrorDescription(
        en="Your access permission is not allowed!", mn="Хандах эрх хүрэхгүй байна"
    ),
    QPayErrorKey.qraccount_inactive.value: QpayErrorDescription(en="QR account is inactive!", mn="QR данс идэвхигүй"),
    QPayErrorKey.qraccount_notfound.value: QpayErrorDescription(en="QR account is not found!", mn="QR данс олдсонгүй"),
    QPayErrorKey.qrcode_notfound.value: QpayErrorDescription(en="QR code is not found!", mn="QR код олдсонгүй"),
    QPayErrorKey.qrcode_used.value: QpayErrorDescription(en="QR code is already used!", mn="QR код ашиглагдаж байна"),
    QPayErrorKey.sender_branch_data_required.value: QpayErrorDescription(
        en="Sender branch data is required!", mn="Илгээгчийн салбарын мэдээлэл шаардлагатай"
    ),
    QPayErrorKey.tax_line_required.value: QpayErrorDescription(
        en="Tax line is required!", mn="Татварын мөр шаардлагатай"
    ),
    QPayErrorKey.tax_product_code_required.value: QpayErrorDescription(
        en="Tax product code is required!", mn="Татварын бүтээгдэхүүний код шаардлагатай"
    ),
    QPayErrorKey.transaction_not_approved.value: QpayErrorDescription(
        en="Transaction line is not approved!", mn="Гүйлгээний мөр зөвшөөрөгдөөгүй байна"
    ),
    QPayErrorKey.transaction_required.value: QpayErrorDescription(
        en="Transaction line is required!", mn="Гүйлгээний мөр шаардлагатай байна"
    ),
}


[docs] class QPayError(Exception): """ Raised when the QPay API returns an error response. Attributes: status_code: HTTP status code from the API (e.g. ``400``, ``401``, ``422``). error_key: Machine-readable key from QPay (e.g. ``"INVOICE_NOTFOUND"``). error_detail: Human-readable description in English and Mongolian, or ``"No description."`` if the key is not recognised. Example:: try: invoice = client.invoice_get(invoice_id) except QPayError as e: print(e.status_code) # 422 print(e.error_key) # "INVOICE_NOTFOUND" print(e.error_detail.en) # "Invoice is not found!" """ def __init__(self, *, status_code: int, error_key: str) -> None: self.status_code = status_code self.error_key = error_key self.error_detail = QpayErrorDetail.get(self.error_key, "No description.") self.exception_message = ( f"status_code: {self.status_code}, error_key: {self.error_key}, error_description: {self.error_detail}" ) super().__init__(self.exception_message) def __repr__(self) -> str: return self.exception_message
class ClientConfigError(Exception): """Raised when the client is configured wrong.""" def __init__(self, *attr) -> None: self.exception_message = f"incorrect attributes: {attr}" super().__init__(self.exception_message) class AuthError(Exception): """Raised when Authentication error has occured.""" def __init__(self, detail: str) -> None: super().__init__(detail) class NetworkError(Exception): """Raised when transport retries are exhausted by a network failure.""" def __init__(self, detail: str) -> None: super().__init__(detail)