# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/invoice/v1/keyapis_invoice_invoice_v1.proto, keyapis/invoice/v1/keyapis_invoice_paymethod_v1.proto
# plugin: python-betterproto
# This file has been @generated

from datetime import datetime
from typing import TYPE_CHECKING

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase
from pydantic import model_validator
from pydantic.dataclasses import (
    dataclass,
    rebuild_dataclass,
)

if TYPE_CHECKING:
    import grpclib.server
    from betterproto.grpc.grpclib_client import MetadataLike
    from grpclib.metadata import Deadline


class PayMethodType(betterproto.Enum):
    """Справочник типов способов оплаты"""

    TYPE_UNKNOWN = 0
    """Значение не указано"""

    BANK_CARD = 1
    """Банковская карта"""

    SBP = 2
    """Сервис быстрых платежей"""

    SBER_BIND = 3
    """Связка Сбербанка"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class PayMethodCardType(betterproto.Enum):
    """Справочник типов банковских карт"""

    CARD_TYPE_UNKNOWN = 0
    """Значение не указано"""

    VISA = 1
    """Карта VISA"""

    EC_MC = 2
    """Карта EuroCard/MasterCard"""

    DCL = 3
    """Карта DinersClub"""

    JCB = 4
    """Карта JCB"""

    AMEX = 5
    """Карта American Express"""

    MIR = 6
    """Платежная система "Мир"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class PayMethodStatusType(betterproto.Enum):
    """Статус способа оплаты"""

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    VALID = 1
    """Исправный"""

    EXPIRED = 2
    """Истекший"""

    BLOCKED = 3
    """Заблокированный"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class InvoiceInvoiceStatusType(betterproto.Enum):
    """Справочник типов статусов оплаты счёта"""

    INVOICE_STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    PLANNED = 1
    """Создан, ожидает подтверждения"""

    PENDING = 2
    """Ожидает оплаты"""

    ERROR = 3
    """Ошибка оплаты"""

    PAID = 4
    """Оплачен"""

    CANCELLED = 5
    """Отменен"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class InvoiceCardType(betterproto.Enum):
    """Справочник банковских карт"""

    CARD_TYPE_UNKNOWN = 0
    """Значение не указано"""

    VISA = 1
    """Карта VISA"""

    EC_MC = 2
    """Карта EuroCard/MasterCard"""

    DCL = 3
    """Карта DinersClub"""

    JCB = 4
    """Карта JCB"""

    AMEX = 5
    """Карта American Express"""

    MIR = 6
    """Платежная система "Мир"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class InvoicePayInterfaceType(betterproto.Enum):
    """Справочник методов платежа"""

    PAY_INTERFACE_TYPE_UNKNOWN = 0
    """Значение не указано"""

    GUI = 1
    """Оплата через интерфейс предпроцессинга"""

    M2M = 2
    """
    Оплата с использованием ранее созданного способа платежа, настроенного по умолчанию
    """

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class InvoicePaywayType(betterproto.Enum):
    """Справочник типов платежных средств"""

    PAYWAY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    BANK_CARD = 1
    """Банковская карта"""

    SBP = 2
    """Сервис быстрых платежей"""

    SBER_PAY = 3
    """Связка Сбербанка"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class InvoicePagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ID = 1
    """По идентификатору"""

    PAID_AT = 2
    """По дате оплаты"""

    CREATED_AT = 3
    """По дате создания"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class InvoicePagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки.
     # Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PayMethod(betterproto.Message):
    """Способ оплаты"""

    pay_method_id: str = betterproto.string_field(1)
    """Идентификатор способа оплаты"""

    user_id: int = betterproto.int32_field(2)
    """Идентификатор пользователя"""

    type: "PayMethodType" = betterproto.enum_field(3)
    """Тип способа оплаты"""

    is_active: bool = betterproto.bool_field(4)
    """Признак активной записи"""

    is_default: bool = betterproto.bool_field(5)
    """Способ оплаты по умолчанию"""

    pay_method_contact: str = betterproto.string_field(6)
    """Мобильный телефон, на который будут отправляться уведомления"""

    pay_method_description: str = betterproto.string_field(7)
    """Описание способа оплаты"""

    pay_method_alias: str = betterproto.string_field(8)
    """Псевдоним способа оплаты"""

    card_type: "PayMethodCardType" = betterproto.enum_field(9)
    """Тип банковской карты"""

    masked_num: str = betterproto.string_field(10)
    """Маскированный номер карты или идентификатора привязки счета СБП"""

    bank_name: str = betterproto.string_field(11)
    """Наименование банка"""

    is_auth: bool = betterproto.bool_field(12)
    """Признак авторизации БК"""

    status_type: "PayMethodStatusType" = betterproto.enum_field(13)
    """Статус способа оплаты"""

    register_at: datetime = betterproto.message_field(14)
    """
    Дата регистрации способа оплаты.
     # Тип: DateTime
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPayMethodListRequest(betterproto.Message):
    """Запрос на получение списка способов оплаты"""

    user_id: int = betterproto.int32_field(1)
    """Идентификатор пользователя"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPayMethodListResponse(betterproto.Message):
    """Ответ на запрос получения списка способов оплаты"""

    data: "list[PayMethod]" = betterproto.message_field(1)
    """Способы оплаты"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeletePayMethodRequest(betterproto.Message):
    """Запрос на удаление способа оплаты"""

    pay_method_id: str = betterproto.string_field(1)
    """Идентификатор способа оплаты"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeletePayMethodResponse(betterproto.Message):
    """Ответ на запрос удаления способа оплаты"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodDefaultRequest(betterproto.Message):
    """Запрос установки способа оплаты по умолчанию"""

    pay_method_id: str = betterproto.string_field(1)
    """Идентификатор способа оплаты"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodDefaultResponse(betterproto.Message):
    """Ответ на запрос установки способа оплаты по умолчанию"""

    error: "PostPayMethodDefaultResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodDefaultResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodBankcardRequest(betterproto.Message):
    """Запрос на добавления способа оплаты с типом "Банковская карта"""

    url_return_ok: str = betterproto.string_field(1)
    """URL для переадресации абонента в случае успешной регистрации карты"""

    url_return_no: str = betterproto.string_field(2)
    """URL для переадресации абонента в случае неуспешной регистрации карты"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodBankcardResponse(betterproto.Message):
    """Ответ на запрос добавления способа оплаты с типом "Банковская карта"""

    error: "PostPayMethodBankcardResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка валидации"""

    data: "PostPayMethodBankcardResponseRegisterData | None" = (
        betterproto.message_field(2, optional=True, group="type")
    )
    """Данные регистрации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodBankcardResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodBankcardResponseRegisterData(betterproto.Message):
    """Данные регистрации"""

    req_id: str = betterproto.string_field(1)
    """Идентификатор запроса на регистрацию"""

    url_registration: str = betterproto.string_field(2)
    """Ссылка для переадресации клиента для продолжения регистрации"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodSbpRequest(betterproto.Message):
    """Запрос на добавления способа оплаты с типом "СБП"""

    url_return_ok: str = betterproto.string_field(1)
    """URL для переадресации абонента в случае успешной регистрации карты"""

    url_return_no: str = betterproto.string_field(2)
    """URL для переадресации абонента в случае неуспешной регистрации карты"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodSbpResponse(betterproto.Message):
    """Ответ на запрос добавления способа оплаты с типом "СБП"""

    error: "PostPayMethodSbpResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка валидации"""

    data: "PostPayMethodSbpResponseRegisterData | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Данные регистрации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodSbpResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPayMethodSbpResponseRegisterData(betterproto.Message):
    """Данные регистрации"""

    req_id: str = betterproto.string_field(1)
    """Идентификатор запроса на регистрацию"""

    url_registration: str = betterproto.string_field(2)
    """Ссылка для переадресации клиента для продолжения регистрации"""

    sbp_payload: str = betterproto.string_field(3)
    """Содержимое QR кода для регистрации платежного СБП-токена"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ValidationError(betterproto.Message):
    """Ошибка валидации"""

    path: str = betterproto.string_field(1)
    """Путь к полю в формате наименования прото"""

    message: str = betterproto.string_field(2)
    """Валидационное сообщение"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Invoice(betterproto.Message):
    """Выставленный счёт"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор платежа.
     # Тип: Guid
    """

    title: str = betterproto.string_field(2)
    """Описание платежа"""

    user_id: int = betterproto.int32_field(3)
    """Идентификатор пользователя"""

    invoice_status_type: "InvoiceInvoiceStatusType" = betterproto.enum_field(4)
    """Статус платежа"""

    created_at: datetime = betterproto.message_field(5)
    """
    Дата создания платежа.
     # Тип: DateTime
    """

    updated_at: datetime = betterproto.message_field(6)
    """
    Дата обновления платежа.
     # Тип: DateTime
    """

    positions: "list[InvoicePosition]" = betterproto.message_field(7)
    """Позиция счета"""

    pay_interface_type: "InvoicePayInterfaceType" = betterproto.enum_field(8)
    """Метод платежа"""

    payway_type: "InvoicePaywayType" = betterproto.enum_field(9)
    """Способ оплаты"""

    status_changed_at: datetime = betterproto.message_field(10)
    """
    Дата изменения статуса платежа.
     # Тип: DateTime
    """

    paid_at: datetime = betterproto.message_field(11)
    """
    Дата платежа.
     # Тип: DateTime
    """

    pay_url: str = betterproto.string_field(12)
    """Платежная ссылка"""

    paid_by_card_masked: str = betterproto.string_field(13)
    """Маскированный номер карты при платеже"""

    paid_by_card_espp_id: str = betterproto.string_field(14)
    """Идентификатор платежного средства в внешней системы"""

    card_type: "InvoiceCardType" = betterproto.enum_field(15)
    """Тип банковской карты"""

    espp_req_status: int = betterproto.int32_field(16)
    """Код ошибки внешней системы"""

    espp_req_user_msg: str = betterproto.string_field(17)
    """Комментарий к статусу платежа из внешней системы"""

    espp_invoice_id: str = betterproto.string_field(18)
    """Уникальный номер транзакции в внешней системы"""

    phone_number: str = betterproto.string_field(19)
    """Номер телефона"""

    email: str = betterproto.string_field(20)
    """Электронная почта"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class InvoiceExternalError(betterproto.Message):
    """Ошибки внешней системы"""

    external_system_error: "InvoiceExternalErrorExternalSystemError | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Запрос к внешней системе вернул ошибку или прекращен по таймауту"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class InvoiceExternalErrorExternalSystemError(betterproto.Message):
    """Запрос к внешней системе вернул ошибку или прекращен по таймауту"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class InvoicePosition(betterproto.Message):
    """Позиция счета"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор позиции.
     # Тип: Guid
    """

    invoice_id: str = betterproto.string_field(2)
    """
    Идентификатор платежа.
     # Тип: Guid
    """

    title: str = betterproto.string_field(3)
    """Название позиции"""

    category: str = betterproto.string_field(4)
    """Категория позиции (='subscription')"""

    amount: float = betterproto.float_field(5)
    """
    Цена в рублях.
     Число должно быть больше 0
    """

    created_at: datetime = betterproto.message_field(6)
    """
    Дата создания позиции платежа.
     # Тип: DateTime
    """

    updated_at: datetime = betterproto.message_field(7)
    """
    Дата обновления позиции платежа.
     # Тип: DateTime
    """

    mrf_id: int = betterproto.int32_field(8)
    """Идентификатор МРФ"""

    rf_id: int = betterproto.int32_field(9)
    """Идентификатор РФ"""

    instance_id: str = betterproto.string_field(10)
    """
    Идентификатор экземпляра оплачиваемой подписки.
     # Тип: Guid
    """

    offering_id: int = betterproto.int32_field(11)
    """Идентификатор предложения оплачиваемой подписки"""

    due_date_at: datetime = betterproto.message_field(12)
    """Срок окончания оплачиваемого периода"""

    svc_type_id: str = betterproto.string_field(13)
    """Идентификатор получателя платежа"""

    is_discount: bool = betterproto.bool_field(14)
    """Признак скидки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class InvoiceSavingError(betterproto.Message):
    """
    Ошибка сохранения.
     Эти проверки выполняются при работе с базой данных и сторонними сервисами
    """

    invoice_already_exists: "InvoiceSavingErrorInvoiceAlreadyExists | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """У пользователя уже есть платеж со статусом PENDING"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class InvoiceSavingErrorInvoiceAlreadyExists(betterproto.Message):
    """У пользователя уже есть платеж со статусом PENDING"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class InvoiceFilter(betterproto.Message):
    """Фильтр инвойсов"""

    user_id: int = betterproto.int32_field(1)
    """Идентификатор пользователя"""

    invoice_status_type: "InvoiceInvoiceStatusType" = betterproto.enum_field(2)
    """Статус платежа"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class InvoicePaging(betterproto.Message):
    """Постраничный вывод"""

    order_by_type: "InvoicePagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию.
     # По умолчанию: PAID_AT
    """

    direction_type: "InvoicePagingDirectionType" = betterproto.enum_field(2)
    """
    Тип направления сортировки.
     # По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     # Диапазон: 0..100.
     # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CreateInvoiceRequest(betterproto.Message):
    """Запрос на создание платежа"""

    user_id: int = betterproto.int32_field(1)
    """Идентификатор пользователя"""

    positions: "list[InvoicePosition]" = betterproto.message_field(2)
    """Позиция счета"""

    pay_interface_type: "InvoicePayInterfaceType" = betterproto.enum_field(3)
    """Метод платежа"""

    payway_type: "InvoicePaywayType" = betterproto.enum_field(4)
    """
    Способ оплаты.
     По умолчанию: BANK_CARD
    """

    return_url: str = betterproto.string_field(5)
    """
    Ссылка для перехода после оплаты.
     Если не передан подставится значение по умолчанию
    """

    phone_number: str = betterproto.string_field(6)
    """
    Номер телефона.
     Должно быть означено поле phone_number, либо поле email
    """

    email: str = betterproto.string_field(7)
    """
    Электронная почта.
     Должно быть означено поле phone_number, либо поле email
    """

    title: str = betterproto.string_field(8)
    """
    Описание платежа.
     По умолчанию подставляется "Счёт от {DD.MM.YYYY}г."
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CreateInvoiceResponse(betterproto.Message):
    """Ответ на запрос создание платежа"""

    error: "CreateInvoiceResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка валидации"""

    data: "Invoice | None" = betterproto.message_field(2, optional=True, group="type")
    """Платеж"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CreateInvoiceResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    missing_user_contacts: "CreateInvoiceResponseErrorMissingUserContacts | None" = (
        betterproto.message_field(2, optional=True, group="reason")
    )
    """Должно быть означено поле phone_number, либо поле email"""

    external: "InvoiceExternalError | None" = betterproto.message_field(
        3, optional=True, group="reason"
    )
    """Ошибки внешней системы"""

    saving: "InvoiceSavingError | None" = betterproto.message_field(
        4, optional=True, group="reason"
    )
    """Ошибка сохранения"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CreateInvoiceResponseErrorMissingUserContacts(betterproto.Message):
    """Должно быть означено поле phone_number, либо поле email"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetInvoiceRequest(betterproto.Message):
    """Запрос на получение статуса платежа"""

    invoice_id: str = betterproto.string_field(1)
    """
    Идентификатор платежа в Ключе.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetInvoiceResponse(betterproto.Message):
    """Ответ на запрос получения платежа"""

    error: "GetInvoiceResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    data: "Invoice | None" = betterproto.message_field(2, optional=True, group="type")
    """Платеж"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetInvoiceResponseError(betterproto.Message):
    """Ошибка запроса"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostInvoiceConfirmRequest(betterproto.Message):
    """Запрос на подтверждение платежа"""

    src_pay_id: str = betterproto.string_field(1)
    """Идентификатор платежа в Ключе"""

    espp_pay_id: str = betterproto.string_field(2)
    """Идентификатор платежа во внешней системе"""

    pay_status: int = betterproto.int32_field(3)
    """Статус платежа из внешней системы"""

    req_type: str = betterproto.string_field(4)
    """
    Тип запроса.
     Должно иметь значение "confirmPayment"
    """

    amount: float = betterproto.float_field(5)
    """Сумма платежа в минимальных единицах валюты"""

    currency: str = betterproto.string_field(6)
    """Код валюты платежа"""

    pay_method: str = betterproto.string_field(7)
    """Код способа оплаты"""

    create_time_at: datetime = betterproto.message_field(8)
    """
    Дата регистрации платежа.
     # Тип: DateTime
    """

    req_note: str = betterproto.string_field(9)
    """Комментарий или сообщение об ошибке"""

    req_user_msg: str = betterproto.string_field(10)
    """Сообщение, отображаемое пользователю"""

    pay_time_at: datetime = betterproto.message_field(11)
    """
    Время фактической оплаты. Время фактической оплаты на стороне Процессинга. Возвращается, если оплата состоялась
    """

    abandon_time_at: datetime = betterproto.message_field(12)
    """
    Время фактической отмены оплаты.
     Время фактической отмены оплаты на стороне Процессинга.
     Возвращается, если отмена оплаты состоялась
    """

    card: "PostInvoiceConfirmRequestCard" = betterproto.message_field(13)
    """
    Структура с информацией о карте плательщика.
     Передаётся только при успешном платеже и если указаны способы оплаты payMethod = StoredBankCard либо BankCard
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostInvoiceConfirmRequestCard(betterproto.Message):
    """Структура с информацией о карте плательщика"""

    espp_card_id: int = betterproto.int32_field(1)
    """
    Идентификатор платежного средства во внешней системы.
     Возвращается в случае успешной привязки БК к УЗ
    """

    card_num: str = betterproto.string_field(2)
    """
    Номер платежного средства.
     Маскированный номер карты. Например: 123456******7890
    """

    card_kind: str = betterproto.string_field(3)
    """Тип банковской карты"""

    bank_name: str = betterproto.string_field(4)
    """
    Банк-эмитент.
     Наименование банка-эмитента. Процессинг может вернуть значение "НЕ ЗАДАВАЛСЯ".
     В этом случае рекомендуется не отображать эту информацию для пользователя
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostInvoiceConfirmResponse(betterproto.Message):
    """Ответ на запрос подтверждения платежа"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetInvoiceListRequest(betterproto.Message):
    """Запрос на получение списка платежей"""

    filter: "InvoiceFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "InvoicePaging | None" = betterproto.message_field(
        2, optional=True, group="pagination"
    )
    """Пагинация"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetInvoiceListResponse(betterproto.Message):
    """Ответ на запрос получения списка платежей"""

    data: "list[Invoice]" = betterproto.message_field(1)
    """Платежи"""

    error: "GetInvoiceListResponseError" = betterproto.message_field(2)
    """Ошибка"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetInvoiceListResponseError(betterproto.Message):
    """Ошибка запроса на получение списка платежей"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetInvoiceCountRequest(betterproto.Message):
    """Запрос на получение количества платежей"""

    filter: "InvoiceFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetInvoiceCountResponse(betterproto.Message):
    """Ответ на запрос получения количества платежей"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Количество"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


class PayMethodServiceStub(betterproto.ServiceStub):
    async def get_pay_method_list(
        self,
        get_pay_method_list_request: "GetPayMethodListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetPayMethodListResponse":
        return await self._unary_unary(
            "/keyapis.invoice.v1.PayMethodService/GetPayMethodList",
            get_pay_method_list_request,
            GetPayMethodListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_pay_method(
        self,
        delete_pay_method_request: "DeletePayMethodRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeletePayMethodResponse":
        return await self._unary_unary(
            "/keyapis.invoice.v1.PayMethodService/DeletePayMethod",
            delete_pay_method_request,
            DeletePayMethodResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_pay_method_default(
        self,
        post_pay_method_default_request: "PostPayMethodDefaultRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostPayMethodDefaultResponse":
        return await self._unary_unary(
            "/keyapis.invoice.v1.PayMethodService/PostPayMethodDefault",
            post_pay_method_default_request,
            PostPayMethodDefaultResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_pay_method_bankcard(
        self,
        post_pay_method_bankcard_request: "PostPayMethodBankcardRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostPayMethodBankcardResponse":
        return await self._unary_unary(
            "/keyapis.invoice.v1.PayMethodService/PostPayMethodBankcard",
            post_pay_method_bankcard_request,
            PostPayMethodBankcardResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_pay_method_sbp(
        self,
        post_pay_method_sbp_request: "PostPayMethodSbpRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostPayMethodSbpResponse":
        return await self._unary_unary(
            "/keyapis.invoice.v1.PayMethodService/PostPayMethodSbp",
            post_pay_method_sbp_request,
            PostPayMethodSbpResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class InvoiceServiceStub(betterproto.ServiceStub):
    async def create_invoice(
        self,
        create_invoice_request: "CreateInvoiceRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "CreateInvoiceResponse":
        return await self._unary_unary(
            "/keyapis.invoice.v1.InvoiceService/CreateInvoice",
            create_invoice_request,
            CreateInvoiceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_invoice(
        self,
        get_invoice_request: "GetInvoiceRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetInvoiceResponse":
        return await self._unary_unary(
            "/keyapis.invoice.v1.InvoiceService/GetInvoice",
            get_invoice_request,
            GetInvoiceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_invoice_confirm(
        self,
        post_invoice_confirm_request: "PostInvoiceConfirmRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostInvoiceConfirmResponse":
        return await self._unary_unary(
            "/keyapis.invoice.v1.InvoiceService/PostInvoiceConfirm",
            post_invoice_confirm_request,
            PostInvoiceConfirmResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_invoice_list(
        self,
        get_invoice_list_request: "GetInvoiceListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetInvoiceListResponse":
        return await self._unary_unary(
            "/keyapis.invoice.v1.InvoiceService/GetInvoiceList",
            get_invoice_list_request,
            GetInvoiceListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_invoice_count(
        self,
        get_invoice_count_request: "GetInvoiceCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetInvoiceCountResponse":
        return await self._unary_unary(
            "/keyapis.invoice.v1.InvoiceService/GetInvoiceCount",
            get_invoice_count_request,
            GetInvoiceCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class PayMethodServiceBase(ServiceBase):

    async def get_pay_method_list(
        self, get_pay_method_list_request: "GetPayMethodListRequest"
    ) -> "GetPayMethodListResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_pay_method(
        self, delete_pay_method_request: "DeletePayMethodRequest"
    ) -> "DeletePayMethodResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_pay_method_default(
        self, post_pay_method_default_request: "PostPayMethodDefaultRequest"
    ) -> "PostPayMethodDefaultResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_pay_method_bankcard(
        self, post_pay_method_bankcard_request: "PostPayMethodBankcardRequest"
    ) -> "PostPayMethodBankcardResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_pay_method_sbp(
        self, post_pay_method_sbp_request: "PostPayMethodSbpRequest"
    ) -> "PostPayMethodSbpResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_pay_method_list(
        self,
        stream: "grpclib.server.Stream[GetPayMethodListRequest, GetPayMethodListResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_pay_method_list(request)
        await stream.send_message(response)

    async def __rpc_delete_pay_method(
        self,
        stream: "grpclib.server.Stream[DeletePayMethodRequest, DeletePayMethodResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_pay_method(request)
        await stream.send_message(response)

    async def __rpc_post_pay_method_default(
        self,
        stream: "grpclib.server.Stream[PostPayMethodDefaultRequest, PostPayMethodDefaultResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_pay_method_default(request)
        await stream.send_message(response)

    async def __rpc_post_pay_method_bankcard(
        self,
        stream: "grpclib.server.Stream[PostPayMethodBankcardRequest, PostPayMethodBankcardResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_pay_method_bankcard(request)
        await stream.send_message(response)

    async def __rpc_post_pay_method_sbp(
        self,
        stream: "grpclib.server.Stream[PostPayMethodSbpRequest, PostPayMethodSbpResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_pay_method_sbp(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.invoice.v1.PayMethodService/GetPayMethodList": grpclib.const.Handler(
                self.__rpc_get_pay_method_list,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPayMethodListRequest,
                GetPayMethodListResponse,
            ),
            "/keyapis.invoice.v1.PayMethodService/DeletePayMethod": grpclib.const.Handler(
                self.__rpc_delete_pay_method,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeletePayMethodRequest,
                DeletePayMethodResponse,
            ),
            "/keyapis.invoice.v1.PayMethodService/PostPayMethodDefault": grpclib.const.Handler(
                self.__rpc_post_pay_method_default,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostPayMethodDefaultRequest,
                PostPayMethodDefaultResponse,
            ),
            "/keyapis.invoice.v1.PayMethodService/PostPayMethodBankcard": grpclib.const.Handler(
                self.__rpc_post_pay_method_bankcard,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostPayMethodBankcardRequest,
                PostPayMethodBankcardResponse,
            ),
            "/keyapis.invoice.v1.PayMethodService/PostPayMethodSbp": grpclib.const.Handler(
                self.__rpc_post_pay_method_sbp,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostPayMethodSbpRequest,
                PostPayMethodSbpResponse,
            ),
        }


class InvoiceServiceBase(ServiceBase):

    async def create_invoice(
        self, create_invoice_request: "CreateInvoiceRequest"
    ) -> "CreateInvoiceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_invoice(
        self, get_invoice_request: "GetInvoiceRequest"
    ) -> "GetInvoiceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_invoice_confirm(
        self, post_invoice_confirm_request: "PostInvoiceConfirmRequest"
    ) -> "PostInvoiceConfirmResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_invoice_list(
        self, get_invoice_list_request: "GetInvoiceListRequest"
    ) -> "GetInvoiceListResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_invoice_count(
        self, get_invoice_count_request: "GetInvoiceCountRequest"
    ) -> "GetInvoiceCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_create_invoice(
        self,
        stream: "grpclib.server.Stream[CreateInvoiceRequest, CreateInvoiceResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.create_invoice(request)
        await stream.send_message(response)

    async def __rpc_get_invoice(
        self, stream: "grpclib.server.Stream[GetInvoiceRequest, GetInvoiceResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_invoice(request)
        await stream.send_message(response)

    async def __rpc_post_invoice_confirm(
        self,
        stream: "grpclib.server.Stream[PostInvoiceConfirmRequest, PostInvoiceConfirmResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_invoice_confirm(request)
        await stream.send_message(response)

    async def __rpc_get_invoice_list(
        self,
        stream: "grpclib.server.Stream[GetInvoiceListRequest, GetInvoiceListResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_invoice_list(request)
        await stream.send_message(response)

    async def __rpc_get_invoice_count(
        self,
        stream: "grpclib.server.Stream[GetInvoiceCountRequest, GetInvoiceCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_invoice_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.invoice.v1.InvoiceService/CreateInvoice": grpclib.const.Handler(
                self.__rpc_create_invoice,
                grpclib.const.Cardinality.UNARY_UNARY,
                CreateInvoiceRequest,
                CreateInvoiceResponse,
            ),
            "/keyapis.invoice.v1.InvoiceService/GetInvoice": grpclib.const.Handler(
                self.__rpc_get_invoice,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetInvoiceRequest,
                GetInvoiceResponse,
            ),
            "/keyapis.invoice.v1.InvoiceService/PostInvoiceConfirm": grpclib.const.Handler(
                self.__rpc_post_invoice_confirm,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostInvoiceConfirmRequest,
                PostInvoiceConfirmResponse,
            ),
            "/keyapis.invoice.v1.InvoiceService/GetInvoiceList": grpclib.const.Handler(
                self.__rpc_get_invoice_list,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetInvoiceListRequest,
                GetInvoiceListResponse,
            ),
            "/keyapis.invoice.v1.InvoiceService/GetInvoiceCount": grpclib.const.Handler(
                self.__rpc_get_invoice_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetInvoiceCountRequest,
                GetInvoiceCountResponse,
            ),
        }


rebuild_dataclass(PayMethod)  # type: ignore
rebuild_dataclass(GetPayMethodListResponse)  # type: ignore
rebuild_dataclass(PostPayMethodDefaultResponse)  # type: ignore
rebuild_dataclass(PostPayMethodDefaultResponseError)  # type: ignore
rebuild_dataclass(PostPayMethodBankcardResponse)  # type: ignore
rebuild_dataclass(PostPayMethodBankcardResponseError)  # type: ignore
rebuild_dataclass(PostPayMethodSbpResponse)  # type: ignore
rebuild_dataclass(PostPayMethodSbpResponseError)  # type: ignore
rebuild_dataclass(Invoice)  # type: ignore
rebuild_dataclass(InvoiceExternalError)  # type: ignore
rebuild_dataclass(InvoicePosition)  # type: ignore
rebuild_dataclass(InvoiceSavingError)  # type: ignore
rebuild_dataclass(InvoiceFilter)  # type: ignore
rebuild_dataclass(InvoicePaging)  # type: ignore
rebuild_dataclass(CreateInvoiceRequest)  # type: ignore
rebuild_dataclass(CreateInvoiceResponse)  # type: ignore
rebuild_dataclass(CreateInvoiceResponseError)  # type: ignore
rebuild_dataclass(GetInvoiceResponse)  # type: ignore
rebuild_dataclass(GetInvoiceResponseError)  # type: ignore
rebuild_dataclass(PostInvoiceConfirmRequest)  # type: ignore
rebuild_dataclass(GetInvoiceListRequest)  # type: ignore
rebuild_dataclass(GetInvoiceListResponse)  # type: ignore
rebuild_dataclass(GetInvoiceListResponseError)  # type: ignore
rebuild_dataclass(GetInvoiceCountRequest)  # type: ignore
