# 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
from dataclasses import dataclass
from datetime import datetime
from typing import (
    TYPE_CHECKING,
    Dict,
    List,
    Optional,
)

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase

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
    """Связка Сбербанка"""


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
    """Платежная система "Мир"""


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

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

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

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

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


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

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

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

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

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

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

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


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
    """Платежная система "Мир"""


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

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

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

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


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

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

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

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

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


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

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

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

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

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


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

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

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

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


@dataclass(eq=False, repr=False)
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)
class GetPayMethodListRequest(betterproto.Message):
    """Запрос на получение списка способов оплаты"""

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


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

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


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

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


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

    pass


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

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


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

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


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

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


@dataclass(eq=False, repr=False)
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)
class PostPayMethodBankcardResponse(betterproto.Message):
    """Ответ на запрос добавления способа оплаты с типом "Банковская карта"""

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

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


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

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


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

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

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


@dataclass(eq=False, repr=False)
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)
class PostPayMethodSbpResponse(betterproto.Message):
    """Ответ на запрос добавления способа оплаты с типом "СБП"""

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

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


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

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


@dataclass(eq=False, repr=False)
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)
class ValidationError(betterproto.Message):
    """Ошибка валидации"""

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

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


@dataclass(eq=False, repr=False)
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)
class InvoiceExternalError(betterproto.Message):
    """Ошибки внешней системы"""

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


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

    pass


@dataclass(eq=False, repr=False)
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)
class InvoiceSavingError(betterproto.Message):
    """
    Ошибка сохранения. Эти проверки выполняются при работе с базой данных и
    сторонними сервисами
    """

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


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

    pass


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

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

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


@dataclass(eq=False, repr=False)
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)
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)
class CreateInvoiceResponse(betterproto.Message):
    """Ответ на запрос создание платежа"""

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

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


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

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

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

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

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


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

    pass


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

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


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

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

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


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

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


@dataclass(eq=False, repr=False)
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)
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)
class PostInvoiceConfirmResponse(betterproto.Message):
    """Ответ на запрос подтверждения платежа"""

    pass


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

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

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


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

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

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


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

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


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

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


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

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


class PayMethodServiceStub(betterproto.ServiceStub):
    async def get_pay_method_list(
        self,
        get_pay_method_list_request: "GetPayMethodListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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,
            ),
        }
