# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/subscription/v1/keyapis_subscription_events_v1.proto, keyapis/subscription/v1/keyapis_subscription_offer_v1.proto, keyapis/subscription/v1/keyapis_subscription_plan_v1.proto, keyapis/subscription/v1/keyapis_subscription_privilege_v1.proto, keyapis/subscription/v1/keyapis_subscription_service_v1.proto, keyapis/subscription/v1/keyapis_subscription_subscription_v1.proto, keyapis/subscription/v1/keyapis_subscription_system_v1.proto
# plugin: python-betterproto
from dataclasses import dataclass
from datetime import datetime
from typing import (
    TYPE_CHECKING,
    AsyncIterator,
    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 PrivilegeType(betterproto.Enum):
    """Типы привилегий"""

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

    INTERCOM_USE = 1
    """
    Умный домофон. Базовые функции. Право доступа к разделу с домофонами и
    калиткаи. Действие. Закрывает услуги: get_devices_intercom
    """

    INTERCOM_OPEN = 2
    """
    Умный домофон. Базовые функции. Право использовать функционал открытия
    двери домофона и калитки. Действие. Закрывает услуги:
    post_devices_open_intercom
    """

    INTERCOM_CODE_USE = 3
    """
    Умный домофон. Коды. Право использовать функционал кодов домофонов и
    калиток. Действие. Закрывает услуги: get_devices_codes_intercom,
    post_devices_codes_intercom, delete_devices_codes_intercom
    """

    INTERCOM_RFID_USE = 4
    """
    Умный домофон. Ключи. Право использовать функционал физических ключей
    домофонов и калиток. Действие. Закрывает услуги:
    get_devices_rfids_intercom, post_devices_rfids_barrier,
    delete_devices_rfids_barrier
    """

    INTERCOM_EVENT_USE = 5
    """
    Умный домофон. События. Право использовать функционал журнала событий
    домофонов и калиток. Действие. Закрывает услуги: get_events_intercom
    """

    INTERCOM_CAMERA_USE = 6
    """
    Умный домофон. Камеры. Право использовать функционал просмотра камер и лайв
    видео с домофонов и калиток. Действие. Закрывает услуги:
    get_devices_camera_intercom
    """

    INTERCOM_CAMERA_ARCHIVE = 7
    """
    Умный домофон. Камеры. Право использовать функционал архива видео с камер
    домофонов и калиток. Действие. Закрывает услуги: get_video_archive_intercom
    """

    INTERCOM_CALLREDIRECT_APP = 8
    """
    Умный домофон. Переадресация. Право перенаправления входящих вызова от
    домофона в приложения, используется только на сервере. Поведение. Закрывает
    услуги: devices_call_redirect_to_mobile_app_behavior
    """

    INTERCOM_CALLREDIRECT_PSTN = 9
    """
    Умный домофон. Переадресация. Право перенаправление входящих вызовов от
    домофона на номера ТФОП, используется только на сервере. Поведение.
    Закрывает услуги: devices_call_redirect_to_pstn_behavior
    """

    INTERCOM_CALLREDIRECT_SIP = 10
    """
    Умный домофон. Переадресация. Право перенаправление входящих вызовов от
    домофона на номера SIP, используется только на сервере. Поведение.
    Закрывает услуги: devices_call_redirect_to_sip_behavior
    """

    BARRIER_USE = 11
    """
    Умный шлагбаум. Базовые функции. Право доступа к разделу шлагбаумов.
    Действие. Закрывает услуги: get_devices_barrier
    """

    BARRIER_OPEN = 12
    """
    Умный шлагбаум. Базовые функции. Право использовать функционала поднятия
    стрелы шлагбаума. Действие. Закрывает услуги: post_devices_open_barrier
    """

    BARRIER_CODE_USE = 13
    """
    Умный шлагбаум. Коды. Право использовать функционал открытия шлагбаума по
    звонку на короткий номер. Действие. Закрывает услуги:
    get_devices_codes_barrier, post_devices_codes_barrier,
    delete_devices_codes_barrier
    """

    BARRIER_EVENT_USE = 14
    """
    Умный шлагбаум. События. Право использовать функционал журнала событий
    шлагбаума. Действие. Закрывает услуги: get_events_barrier
    """

    BARRIER_CAMERA_USE = 15
    """
    Умный шлагбаум. Камеры. Право использовать функционал просмотра камер и
    лайв видео с шлагбаумов. Действие. Закрывает услуги:
    get_devices_camera_barrier
    """

    BARRIER_CAMERA_ARCHIVE = 16
    """
    Умный шлагбаум. Камеры. Право использовать функционал архива видео с камер,
    направленных на шлагбаум. Действие. Закрывает услуги:
    get_video_archive_barrier
    """

    FR_USE = 17
    """
    Распознавание лица. Фото. Право доступа к разделу распознавания лиц.
    Действие. Закрывает услуги: get_photo_fr_intercom,
    fr_intercom_access_behavior, post_photo_fr_intercom,
    delete_photo_fr_intercom
    """

    TELEMETRY_USE = 18
    """
    Телеметрия. Базовые функции. Право доступа к разделу показаний приборов
    учёта. Действие. Закрывает услуги: get_telemetry_rooms_layout
    """

    CAMERA_USE = 19
    """
    Камеры. Базовые функции. Право доступа к разделу камер и лайв видео с них.
    Действие. Закрывает услуги: get_devices_camera, get_events_camera,
    get_devices_camera_access_control_panel, get_devices_camera_barrier,
    get_devices_camera_intercom
    """

    CAMERA_ARCHIVE = 20
    """
    Камеры. Базовые функции. Право использовать функционал архива видео с камер
    видеонаблюдения. Действие. Закрывает услуги: get_video_archive,
    get_video_archive_access_control_panel
    """

    INTERCOM_CMS_PHONES_USE = 21
    """
    Умный домофон. Переадресация. Право приёма входящих вызовов от домофона на
    аналоговую трубку, используется только на сервере. Поведение. Закрывает
    услуги: devices_call_to_cms_phones_behavior
    """

    CAMERA_EVENT_USE = 22
    """
    Умный домофон. Переадресация. Право приёма входящих вызовов от домофона на
    аналоговую трубку, используется только на сервере. Поведение. Закрывает
    услуги: get_events_camera
    """


class PrivilegeStateType(betterproto.Enum):
    """Типы состояний привилегий"""

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

    CAN_BE_PAID = 1
    """
    Услуга доступная для подключения на доме пользователя, но не активна.
    Услуга есть в доступных КВ на ОРПОН, но её нет у пользователя
    """

    NOT_PAID = 2
    """
    Услуга не оплачена и не активна. Услуга есть в подписке в статусе: BLOCKED
    """

    TURNS_OFF = 3
    """
    Услуга отключается, но ещё активна. Услуга есть в подписке в статусе:
    SCHEDULED_CANCELED
    """

    PROMO = 4
    """
    Услуга в промо-периоде и активна. Услуга есть в подписке в статусе: SETUP.
    Обычно так создают промоподписки
    """

    PAID = 5
    """
    Услуга оплачена и активна. Услуга есть в подписке в статусе: ACTIVE. Либо
    услуга есть в подписке с неблокируемой услугой
    """


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

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

    KEY = 1
    """По уникальному ключу: orpon+flat_number+type"""


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

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

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

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


class PlanIconType(betterproto.Enum):
    """Справочник типов иконок"""

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

    FAST = 1
    """Быстро"""

    FACE_REC = 2
    """Распознавание лиц"""

    SAFE = 3
    """Безопасно"""


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

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

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


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

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

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

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


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

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

    ORPON_THEN_FLAT_NUMBER = 1
    """По ОРПОНу, затем по номеру квартиры"""


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

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

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

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


class OfferType(betterproto.Enum):
    """Типы коммерческих возможностей"""

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

    COMPANY = 1
    """УК. Услуги, которые назначаются на управляющие компанию"""

    RTK = 2
    """
    Ростелеком. Услуги, которые Ростелеком подключает напрямую физическим лицам
    """

    SHARED = 3
    """Общая. Услуги, которые видят клиенты обоих типов"""


class OfferStatusType(betterproto.Enum):
    """Типы статусов коммерческих возможностей"""

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

    ACTIVE = 1
    """Активно. Доступно"""

    BLOCKED = 2
    """Заблокировано. Приостановлено"""


class OfferDiscountRequirementType(betterproto.Enum):
    """Справочник условий на скидки"""

    DISCOUNT_REQUIREMENT_TYPE_UNKNOWN = 0
    """
    Значение не указано. Если указана цена по скидке, а условие не проставлено,
    скидка не отображается и не применяется
    """

    NO_CONDITIONS = 1
    """Безусловная скидка"""

    INTERNET_IS_PAID = 2
    """ШПД интернет оплачен"""


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

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

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

    PRICE = 2
    """По цене"""


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

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

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

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


class SubscriptionStatusType(betterproto.Enum):
    """Типы статусов подписки"""

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

    SETUP = 1
    """
    Настроена. Подписка переведена в статус настройки. Это промо-период, либо
    монтажник проверяет работу оборудования. Услуги подписки не оплачены, но
    доступны для использования. Финальный статус
    """

    ACTIVE = 2
    """
    Активна. Подписка активирована. С этого момента считаем что нужно считать
    денежки. Услуги подписки оплачены и доступны для использования. Финальный
    статус
    """

    BLOCKED = 3
    """
    Заблокирована. Подписка фин. заблокирована. Подписка в фин. блокировке.
    Услуги подписки не оплачены и не доступны. Финальный статус
    """

    CANCELED = 4
    """
    Отменена. Подписка отменена. Пользователь отменил подписку. Услуги подписки
    больше не существуют и не доступны абоненту
    """

    SCHEDULED_CANCELED = 5
    """
    Запланированная отмена. Пользователь решил отказаться от услуги, но уже
    заплатил. Подписка запланирована к отмене, будет действовать до истечения
    срока действия в подписке. Услуги подписки оплачены и доступны для
    использования. Финальный статус
    """


class SubscriptionBillingType(betterproto.Enum):
    """Типы биллинга подпискии"""

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

    ASR_MRF = 1
    """
    АСР МРФ. Обслуживание счетов и расчёты с клиентами происходят в АСР МРФ
    """

    ASR_KEY = 2
    """
    АСР Ключ. Обслуживание счетов и расчёты с клиентами происходят внутри Ключа
    """

    ASR_MC = 3
    """
    АСР УК. Обслуживание счетов и расчёты с клиентами происходят во внешнем АСР
    от управляющей компании
    """


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

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

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


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

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

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

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


@dataclass(eq=False, repr=False)
class Privilege(betterproto.Message):
    """Привилегия"""

    orpon: int = betterproto.int64_field(1)
    """ОРПОН. Идентификатор дома. Уникальный ключ: поля в порядке 1,2,3"""

    flat_number: str = betterproto.string_field(2)
    """Номер квартиры"""

    type: "PrivilegeType" = betterproto.enum_field(3)
    """Тип привилегии"""

    state_type: "PrivilegeStateType" = betterproto.enum_field(4)
    """Состояние привилегии"""


@dataclass(eq=False, repr=False)
class PrivilegeFilter(betterproto.Message):
    """Фильтр по привилегиям"""

    orpons: List[int] = betterproto.int64_field(1)
    """По ОРПОНам"""

    flat_numbers: List[str] = betterproto.string_field(2)
    """Номера квартир"""

    types: List["PrivilegeType"] = betterproto.enum_field(3)
    """По типам привилегий"""

    state_types: List["PrivilegeStateType"] = betterproto.enum_field(4)
    """По состояниям привилегий"""


@dataclass(eq=False, repr=False)
class PrivilegeFilterValidationError(betterproto.Message):
    """
    Ошибка валидации фильтра по привилегиям. Эти проверки выполняются до
    обращения в базу данных
    """

    orpons: "PrivilegeFilterValidationErrorOrponsInvalid" = betterproto.message_field(
        1, group="reason"
    )
    """Формат ОРПОН некорректен"""

    flat_numbers: "PrivilegeFilterValidationErrorFlatNumbersInvalid" = (
        betterproto.message_field(2, group="reason")
    )
    """Формат квартиры некорректен"""


@dataclass(eq=False, repr=False)
class PrivilegeFilterValidationErrorOrponsInvalid(betterproto.Message):
    """
    Причины: - Формат ОРПОН некорректен; - Передано отрицательное значение
    """

    pass


@dataclass(eq=False, repr=False)
class PrivilegeFilterValidationErrorFlatNumbersInvalid(betterproto.Message):
    """
    Причины: - Формат квартиры некорректен (например, длина номера квартира
    более 4 знаков); - Номер квартиры содержит буквы
    """

    pass


@dataclass(eq=False, repr=False)
class PrivilegePaging(betterproto.Message):
    """Пагинация по привилегиям"""

    order_by_type: "PrivilegePagingOrderByType" = betterproto.enum_field(1)
    """Тип значения сортировки. По умолчанию: KEY"""

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

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

    offset: int = betterproto.int32_field(4)
    """Сдвиг. По умолчанию: 0"""


@dataclass(eq=False, repr=False)
class PrivilegePagingValidationError(betterproto.Message):
    """
    Ошибка валидации постраничной пагинации по привилегиям. Эти проверки
    выполняются до обращения в базу данных
    """

    limit: "PrivilegePagingValidationErrorLimitInvalid" = betterproto.message_field(
        1, group="reason"
    )
    """Количество передано некорректно"""

    offset: "PrivilegePagingValidationErrorOffsetInvalid" = betterproto.message_field(
        2, group="reason"
    )
    """Сдвиг передан некорректно"""


@dataclass(eq=False, repr=False)
class PrivilegePagingValidationErrorLimitInvalid(betterproto.Message):
    """Причины: - Значение количества < 0 или > 100"""

    pass


@dataclass(eq=False, repr=False)
class PrivilegePagingValidationErrorOffsetInvalid(betterproto.Message):
    """Причины: - Значение сдвига < 0"""

    pass


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

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

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


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

    data: "Privilege" = betterproto.message_field(1, group="type")
    """Предоставленная привилегия"""

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


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

    privilege_filter_validation: "PrivilegeFilterValidationError" = (
        betterproto.message_field(1, group="reason")
    )
    """Ошибка фильтрации по страницам"""

    privilege_paging_validation: "PrivilegePagingValidationError" = (
        betterproto.message_field(2, group="reason")
    )
    """Ошибка пагинации по страницам"""


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

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


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

    data: int = betterproto.int32_field(1, group="type")
    """Всего привилегий"""

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


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

    privilege_filter_validation: "PrivilegeFilterValidationError" = (
        betterproto.message_field(1, group="reason")
    )
    """Ошибка фильтрации по страницам по привилегиям"""


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

    orpon: int = betterproto.int64_field(1)
    """ОРПОН. Идентификатор дома"""

    flat_number: str = betterproto.string_field(2)
    """Номер квартиры"""

    privilege_type: "PrivilegeType" = betterproto.enum_field(3)
    """Тип привилегии"""


@dataclass(eq=False, repr=False)
class GetPrivilegeCheckResponse(betterproto.Message):
    """Результат запроса метода проверки предоставленной привилегии"""

    data: bool = betterproto.bool_field(1, group="type")
    """
    Доступна ли привилегия на квартире. Вернётся true если статусы: - PROMO; -
    PAID; - TURNS_OFF. Вернётся false если статусы: - NOT_PAID; - CAN_BE_PAID;
    - STATE_TYPE_UNKNOWN; - Не найден
    """


@dataclass(eq=False, repr=False)
class Plan(betterproto.Message):
    """Технологический план(ТП)"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""

    title: str = betterproto.string_field(2)
    """Название"""

    description: Optional[str] = betterproto.message_field(
        3, wraps=betterproto.TYPE_STRING
    )
    """Описание"""

    created_at: datetime = betterproto.message_field(4)
    """Дата создания записи. Заполняется сервером"""

    changed_at: datetime = betterproto.message_field(5)
    """
    Дата последнего изменения. Заполняется и обновляется сервером. Заполняется
    при создании и изменении. Является версией объекта
    """

    parent_ids: List[int] = betterproto.int32_field(6)
    """Идентификаторы родительских технологических планов(ТП)"""

    rf_ids: List[int] = betterproto.int32_field(7)
    """Идентификаторы регионов, в которых доступен технологический план(ТП)"""

    summary: Optional[str] = betterproto.message_field(8, wraps=betterproto.TYPE_STRING)
    """Краткое описание"""

    icon_type: "PlanIconType" = betterproto.enum_field(9)
    """Тип иконки"""

    option_descriptions: List["PlanOptionDescription"] = betterproto.message_field(10)
    """Описание опций"""

    privilege_types: List["PrivilegeType"] = betterproto.enum_field(11)
    """Привилегии. Массив услуг доступных по технологическому плану"""


@dataclass(eq=False, repr=False)
class PlanOptionDescription(betterproto.Message):
    """Описание опции"""

    icon_type: "PlanIconType" = betterproto.enum_field(1)
    """Тип иконки"""

    title: str = betterproto.string_field(2)
    """Название"""

    summary: Optional[str] = betterproto.message_field(3, wraps=betterproto.TYPE_STRING)
    """Краткое описание"""


@dataclass(eq=False, repr=False)
class PlanFilter(betterproto.Message):
    """Фильтр по технологическим планам"""

    text: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING)
    """
    По тексту. Если значение не передано то поиск по нему не производится. #
    Поиск производится по полям: # - Название; # - Описание; # - Краткое
    описание
    """

    rf_ids: List[int] = betterproto.int32_field(2)
    """По идентификаторам регионов"""


@dataclass(eq=False, repr=False)
class PlanFilterValidationError(betterproto.Message):
    """
    Ошибки валидации фильтра по технологическим планам. Эти проверки
    выполняются до обращения в базу данных
    """

    text: "PlanFilterValidationErrorTextInvalid" = betterproto.message_field(
        1, group="reason"
    )
    """Текст передан некорректно"""


@dataclass(eq=False, repr=False)
class PlanFilterValidationErrorTextInvalid(betterproto.Message):
    """Причины: - Длина текста < 3 символов и >= 64"""

    pass


@dataclass(eq=False, repr=False)
class PlanPaging(betterproto.Message):
    """Пагинация по технологическим планам"""

    order_by_type: "PlanPagingOrderByType" = betterproto.enum_field(1)
    """Тип значения сортировки. По умолчанию: ID"""

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

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

    offset: int = betterproto.int32_field(4)
    """Сдвиг. По умолчанию: 0"""


@dataclass(eq=False, repr=False)
class PlanPagingValidationError(betterproto.Message):
    """
    Ошибка валидации постраничной пагинации по технологическим планам. Эти
    проверки выполняются до обращения в базу данных
    """

    limit: "PlanPagingValidationErrorLimitInvalid" = betterproto.message_field(
        1, group="reason"
    )
    """Количество передано некорректно"""

    offset: "PlanPagingValidationErrorOffsetInvalid" = betterproto.message_field(
        2, group="reason"
    )
    """Сдвиг передан некорректно"""


@dataclass(eq=False, repr=False)
class PlanPagingValidationErrorLimitInvalid(betterproto.Message):
    """Причины: - Значение количества < 0 или > 100"""

    pass


@dataclass(eq=False, repr=False)
class PlanPagingValidationErrorOffsetInvalid(betterproto.Message):
    """Причины: - Значение сдвига < 0"""

    pass


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

    id: int = betterproto.int32_field(1)
    """Идентификатор"""


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

    data: "Plan" = betterproto.message_field(1, group="type")
    """Технологический план"""


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

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

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


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

    data: "Plan" = betterproto.message_field(1, group="type")
    """Технологический план"""

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


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

    plan_filter_validation: "PlanFilterValidationError" = betterproto.message_field(
        1, group="reason"
    )
    """Ошибка фильтрации"""

    plan_paging_validation: "PlanPagingValidationError" = betterproto.message_field(
        2, group="reason"
    )
    """Ошибка пагинации по страницам"""


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

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


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

    data: int = betterproto.int32_field(1, group="type")
    """Всего технологических планов"""

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


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

    plan_filter_validation: "PlanFilterValidationError" = betterproto.message_field(
        1, group="reason"
    )
    """Ошибка фильтрации"""


@dataclass(eq=False, repr=False)
class Sevice(betterproto.Message):
    """Услуга. TODO: deprecated"""

    name: str = betterproto.string_field(1)
    """Название услуги на английском"""

    is_active: bool = betterproto.bool_field(2)
    """
    Доступна ли услуга на квартире. Вернётся true если статусы привилегии: -
    PROMO; - PAID; - TURNS_OFF. Вернётся false если статусы привилегии: -
    NOT_PAID; - CAN_BE_PAID; - STATE_TYPE_UNKNOWN; - Не найден (нет на
    кваритре, но есть в справочнике привилегий)
    """


@dataclass(eq=False, repr=False)
class Service(betterproto.Message):
    """Услуга"""

    name: str = betterproto.string_field(1)
    """Название услуги на английском"""

    is_active: bool = betterproto.bool_field(2)
    """
    Доступна ли услуга на квартире. Вернётся true если статусы привилегии: -
    PROMO; - PAID; - TURNS_OFF. Вернётся false если статусы привилегии: -
    NOT_PAID; - CAN_BE_PAID; - STATE_TYPE_UNKNOWN; - Не найден (нет на
    кваритре, но есть в справочнике привилегий)
    """

    orpon: Optional[int] = betterproto.message_field(3, wraps=betterproto.TYPE_INT64)
    """ОРПОН дома"""

    flat_number: Optional[str] = betterproto.message_field(
        4, wraps=betterproto.TYPE_STRING
    )
    """Номер квартиры"""


@dataclass(eq=False, repr=False)
class ServiceKind(betterproto.Message):
    """Элемент справочника видов услуг"""

    id: int = betterproto.int32_field(1)
    """Идентификатор услуги"""

    category: str = betterproto.string_field(2)
    """Категория услуги. Аналогично V1ServiceDto.type"""

    name: str = betterproto.string_field(3)
    """Название услуги на английском"""

    title: str = betterproto.string_field(4)
    """Название услуги"""

    description: Optional[str] = betterproto.message_field(
        5, wraps=betterproto.TYPE_STRING
    )
    """Описание услуги"""

    parent_id: Optional[int] = betterproto.message_field(
        6, wraps=betterproto.TYPE_INT32
    )
    """Идентификатор родительской услуги"""


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

    orpon: int = betterproto.int64_field(1)
    """ОРПОН. Идентификатор дома"""

    flat_number: str = betterproto.string_field(2)
    """Номер квартиры"""


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

    data: "Sevice" = betterproto.message_field(1, group="type")
    """Услуга"""


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

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

    paging: "ServicePrivilegePaging" = betterproto.message_field(2, group="pagination")
    """Стандартный постраничный вывод"""


@dataclass(eq=False, repr=False)
class GetServicePrivilegeListResponse(betterproto.Message):
    """Результат запроса получения списка услуг"""

    data: "Service" = betterproto.message_field(1, group="type")
    """Услуга"""


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

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

    paging: "ServicePrivilegePaging" = betterproto.message_field(2, group="pagination")
    """Стандартный постраничный вывод"""


@dataclass(eq=False, repr=False)
class GetServicePrivilegeCountResponse(betterproto.Message):
    """Результат запроса получения количества услуг"""

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


@dataclass(eq=False, repr=False)
class ServicePrivilegeFilter(betterproto.Message):
    """Фильтр услуг"""

    orpons: List[int] = betterproto.int64_field(1)
    """По ОРПОН"""

    flat_numbers: List[str] = betterproto.string_field(2)
    """По номеру квартиры"""


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

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

    direction_type: "ServicePrivilegePagingDirectionType" = 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 GetServiceKindListRequest(betterproto.Message):
    """Запрос получения справочника видов услуг"""

    pass


@dataclass(eq=False, repr=False)
class GetServiceKindListResponse(betterproto.Message):
    """Результат запроса получения справочника видов услуг"""

    data: "ServiceKind" = betterproto.message_field(1, group="type")
    """Элемент справочника услуг"""


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

    pass


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

    pass


@dataclass(eq=False, repr=False)
class Offer(betterproto.Message):
    """Коммерческая возможность(КВ)"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""

    type: "OfferType" = betterproto.enum_field(2)
    """Тип коммерческой возможности"""

    orpon: int = betterproto.int64_field(3)
    """ОРПОН. Идентификатор дома"""

    company_id: Optional[int] = betterproto.message_field(
        4, wraps=betterproto.TYPE_INT32
    )
    """Идентификатор компании"""

    plan_id: int = betterproto.int32_field(5)
    """Идентификатор технологического плана"""

    is_enable_auto_subscribe: bool = betterproto.bool_field(6)
    """Подключать ли автоматическую подписку"""

    status_type: "OfferStatusType" = betterproto.enum_field(7)
    """Тип статуса заказа"""

    price: Optional[float] = betterproto.message_field(8, wraps=betterproto.TYPE_DOUBLE)
    """Цена"""

    is_digital_way: bool = betterproto.bool_field(9)
    """Признак принадлежности к цифровому пути"""

    created_at: datetime = betterproto.message_field(10)
    """Дата создания записи. Заполняется сервером"""

    changed_at: datetime = betterproto.message_field(11)
    """
    Дата последнего изменения. Заполняется и обновляется сервером. Заполняется
    при создании и изменении. Является версией объекта
    """

    offer_url: Optional[str] = betterproto.message_field(
        12, wraps=betterproto.TYPE_STRING
    )
    """Адрес размещения офферты. Полный url до файла"""

    plan: "Plan" = betterproto.message_field(13)
    """
    Снапшот состояния технологического плана на момент создания предложения. В
    данный момент это ссылка в базе на запись, в будущем это будет снапшот
    """

    discount_price: Optional[float] = betterproto.message_field(
        14, wraps=betterproto.TYPE_DOUBLE
    )
    """Цена по скидке"""

    discount_requirement_types: List["OfferDiscountRequirementType"] = (
        betterproto.enum_field(15)
    )
    """
    Условия на скидку. Если условий много то для срабатывания должны выполнять
    все условия
    """


@dataclass(eq=False, repr=False)
class OfferFilter(betterproto.Message):
    """Фильтр по коммерческим возможностям"""

    types: List["OfferType"] = betterproto.enum_field(1)
    """По типам"""

    orpons: List[int] = betterproto.int64_field(2)
    """По ОРПОНам"""

    company_ids: List[int] = betterproto.int32_field(3)
    """По идентификаторам компаний"""


@dataclass(eq=False, repr=False)
class OfferFilterValidationError(betterproto.Message):
    """
    Ошибки валидации фильтра по коммерческим возможностям. Эти проверки
    выполняются до обращения в базу данных
    """

    orpons: "OfferFilterValidationErrorOrponsInvalid" = betterproto.message_field(
        1, group="reason"
    )
    """Формат ОРПОН некорректен"""

    company_ids: "OfferFilterValidationErrorCompanyIdsInvalid" = (
        betterproto.message_field(2, group="reason")
    )
    """Формат идентификатора компании некорректен"""


@dataclass(eq=False, repr=False)
class OfferFilterValidationErrorOrponsInvalid(betterproto.Message):
    """
    - Формат ОРПОН некорректен; - ОРПОН передан некорректно, к примеру,
    значение <= 1
    """

    pass


@dataclass(eq=False, repr=False)
class OfferFilterValidationErrorCompanyIdsInvalid(betterproto.Message):
    """
    Причины: - Формат идентификатора компании некорректен; - Идентификатора
    компании передан некорректно, к примеру, значение <= 1
    """

    pass


@dataclass(eq=False, repr=False)
class OfferPaging(betterproto.Message):
    """Пагинация по коммерческим возможностям"""

    order_by_type: "OfferPagingOrderByType" = betterproto.enum_field(1)
    """Тип значения сортировки. По умолчанию: ID"""

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

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

    offset: int = betterproto.int32_field(4)
    """Сдвиг. По умолчанию: 0"""


@dataclass(eq=False, repr=False)
class OfferPagingValidationError(betterproto.Message):
    """
    Ошибка валидации постраничной пагинации по коммерческим возможностям. Эти
    проверки выполняются до обращения в базу данных
    """

    limit: "OfferPagingValidationErrorLimitInvalid" = betterproto.message_field(
        1, group="reason"
    )
    """Количество передано некорректно"""

    offset: "OfferPagingValidationErrorOffsetInvalid" = betterproto.message_field(
        2, group="reason"
    )
    """Сдвиг передан некорректно"""


@dataclass(eq=False, repr=False)
class OfferPagingValidationErrorLimitInvalid(betterproto.Message):
    """Причины: - Значение количества < 0 или > 100"""

    pass


@dataclass(eq=False, repr=False)
class OfferPagingValidationErrorOffsetInvalid(betterproto.Message):
    """Причины: - Значение сдвига < 0"""

    pass


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

    id: str = betterproto.string_field(1)
    """Идентификатор коммерческой возможности"""


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

    data: "Offer" = betterproto.message_field(1, group="type")
    """Коммерческая возможность"""


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

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

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


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

    data: "Offer" = betterproto.message_field(1, group="type")
    """Коммерческая возможность"""

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


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

    offer_filter_validation: "OfferFilterValidationError" = betterproto.message_field(
        1, group="reason"
    )
    """Ошибка фильтрации"""

    offer_paging_validation: "OfferPagingValidationError" = betterproto.message_field(
        2, group="reason"
    )
    """Ошибка пагинации по страницам"""


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

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


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

    data: int = betterproto.int32_field(1, group="type")
    """Всего коммерческих возможностей"""

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


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

    offer_filter_validation: "OfferFilterValidationError" = betterproto.message_field(
        1, group="reason"
    )
    """Ошибка фильтрации"""


@dataclass(eq=False, repr=False)
class CommercialOfferCmsAvailableTask(betterproto.Message):
    """
    Событие о появлении коммерческой возможности с услугой аналоговой трубки.
    Очередь key.subscription.cms_available
    """

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

    orpon_id: int = betterproto.int64_field(2)
    """Идентификатор ОРПОН дома"""

    privileged_room_numbers: List[str] = betterproto.string_field(3)
    """
    Номера квартир, с привилегией "Аналоговая трубка" в статусе: Оплачено,
    Промо, Отключается
    """


@dataclass(eq=False, repr=False)
class CommercialOfferCmsUnavailableTask(betterproto.Message):
    """
    Событие о прекращении действия коммерческой возможности с услугой
    аналоговой трубки. Очередь key.subscription.cms_unavailable
    """

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

    orpon_id: int = betterproto.int64_field(2)
    """Идентификатор ОРПОН дома"""


@dataclass(eq=False, repr=False)
class PrivilegeStateChangeTask(betterproto.Message):
    """
    Сообщение об изменении состояния привилегии. Очередь
    key.subscription.privilege_state_change
    """

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

    orpon_id: int = betterproto.int64_field(2)
    """Идентификатор ОРПОН дома"""

    room_number: str = betterproto.string_field(3)
    """Номер квартиры"""

    privilege_type: "PrivilegeType" = betterproto.enum_field(4)
    """Тип привилегии"""

    state_type: "PrivilegeStateType" = betterproto.enum_field(5)
    """Тип состояния привилегий"""

    previous_state_type: "PrivilegeStateType" = betterproto.enum_field(6)
    """Предыдущий тип состояния привилегии"""

    updated_at: datetime = betterproto.message_field(7)
    """Дата обновления состояния привилегии"""


@dataclass(eq=False, repr=False)
class CmsInitTask(betterproto.Message):
    """
    Событие инициализации сценария обновления статусов аналоговых трубок.
    Очередь key.subscription.cms_init
    """

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

    orpons: List[int] = betterproto.int64_field(2)
    """ОРПОНы домов"""


@dataclass(eq=False, repr=False)
class Subscription(betterproto.Message):
    """Подписка"""

    id: str = betterproto.string_field(1)
    """Идентификатор. Может быть явно задан при создании. Тип: Guid"""

    orpon: int = betterproto.int64_field(2)
    """ОРПОН. Идентификатор дома"""

    flat_number: str = betterproto.string_field(3)
    """Номер квартиры"""

    offer_id: int = betterproto.int32_field(4)
    """
    Идентификатор коммерческой возможности(КВ). Заполняется сервером на основе
    идентификатора из технологического плана(ТП)
    """

    status_type: "SubscriptionStatusType" = betterproto.enum_field(5)
    """Cтатус подписки. При создании может быть: SETUP, ACTIVE"""

    previous_status_type: "SubscriptionStatusType" = betterproto.enum_field(6)
    """
    Предыдущий статус подписки. В справочник входят только финальные статусы.
    Заполняется сервером при изменении статусов
    """

    price: Optional[float] = betterproto.message_field(7, wraps=betterproto.TYPE_DOUBLE)
    """Цена"""

    created_at: datetime = betterproto.message_field(8)
    """Дата создания записи. Заполняется сервером"""

    changed_at: datetime = betterproto.message_field(9)
    """
    Дата последнего изменения. Заполняется и обновляется сервером. Заполняется
    при создании и изменении. Является версией объекта
    """

    is_enable_auto_subscribe: bool = betterproto.bool_field(10)
    """
    Признак для определения автоподписок. Редактировать флаг запрещено.
    Проставляется сервером в true при создании через задачу на автоподписку
    """

    billing_type: "SubscriptionBillingType" = betterproto.enum_field(11)
    """Тип биллинга"""

    expired_at: datetime = betterproto.message_field(12)
    """Срок действия. Проставляется при создании"""

    parent_id: Optional[str] = betterproto.message_field(
        13, wraps=betterproto.TYPE_STRING
    )
    """
    Идентификатор подписки, в зависимости от которой подключена данная.
    Заполняется в подписках на опции. Тип: Guid
    """

    account: Optional[int] = betterproto.message_field(14, wraps=betterproto.TYPE_INT64)
    """Аккаунт"""

    offer: "Offer" = betterproto.message_field(15)
    """
    Снапшот состояния коммерческой возможности на момент создания подписки. В
    данный момент это ссылка в базе на запись, в будущем это будет снапшот
    """

    discount_price: Optional[float] = betterproto.message_field(
        16, wraps=betterproto.TYPE_DOUBLE
    )
    """
    Цена по скидки. Заполнена если оплата подписки прошла по скидке, иначе
    очищается
    """


@dataclass(eq=False, repr=False)
class SubscriptionFilter(betterproto.Message):
    """Фильтр подписок"""

    orpons: List[int] = betterproto.int64_field(1)
    """По ОРПОНам"""

    flat_numbers: List[str] = betterproto.string_field(2)
    """По номерам квартир"""


@dataclass(eq=False, repr=False)
class SubscriptionFilterValidationError(betterproto.Message):
    """
    Ошибки валидации фильтра по подпискам. Эти проверки выполняются до
    обращения в базу данных
    """

    orpons: "SubscriptionFilterValidationErrorOrponsInvalid" = (
        betterproto.message_field(1, group="reason")
    )
    """Формат ОРПОН некорректен"""

    flat_numbers: "SubscriptionFilterValidationErrorFlatNumbersInvalid" = (
        betterproto.message_field(2, group="reason")
    )
    """Формат квартиры некорректен"""


@dataclass(eq=False, repr=False)
class SubscriptionFilterValidationErrorOrponsInvalid(betterproto.Message):
    """
    Причины: - Формат ОРПОН некорректен; - ОРПОН передан некорректно, к
    примеру, значение <= 1
    """

    pass


@dataclass(eq=False, repr=False)
class SubscriptionFilterValidationErrorFlatNumbersInvalid(betterproto.Message):
    """
    Причины: - Формат квартиры некорректен (например, длина номера квартира
    более 4 знаков или отрицательное значение)
    """

    pass


@dataclass(eq=False, repr=False)
class SubscriptionPaging(betterproto.Message):
    """Пагинация по подпискам"""

    order_by_type: "SubscriptionPagingOrderByType" = betterproto.enum_field(1)
    """Тип значения сортировки. По умолчанию: ID"""

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

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

    offset: int = betterproto.int32_field(4)
    """Сдвиг. По умолчанию: 0"""


@dataclass(eq=False, repr=False)
class SubscriptionPagingValidationError(betterproto.Message):
    """
    Ошибка валидации постраничной пагинации по подпискам. Эти проверки
    выполняются до обращения в базу данных
    """

    limit: "SubscriptionPagingValidationErrorLimitInvalid" = betterproto.message_field(
        1, group="reason"
    )
    """Количество передано некорректно"""

    offset: "SubscriptionPagingValidationErrorOffsetInvalid" = (
        betterproto.message_field(2, group="reason")
    )
    """Сдвиг передан некорректно"""


@dataclass(eq=False, repr=False)
class SubscriptionPagingValidationErrorLimitInvalid(betterproto.Message):
    """Причины: - Значение количества < 0 или > 100"""

    pass


@dataclass(eq=False, repr=False)
class SubscriptionPagingValidationErrorOffsetInvalid(betterproto.Message):
    """Причины: - Значение сдвига < 0"""

    pass


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

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


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

    data: "Subscription" = betterproto.message_field(1, group="type")
    """Подписка"""


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

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

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


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

    data: "Subscription" = betterproto.message_field(1, group="type")
    """Подписка"""

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


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

    subscription_filter_validation: "SubscriptionFilterValidationError" = (
        betterproto.message_field(1, group="reason")
    )
    """Ошибка фильтрации"""

    subscription_paging_validation: "SubscriptionPagingValidationError" = (
        betterproto.message_field(2, group="reason")
    )
    """Ошибка пагинации  по страницам"""


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

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


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

    data: int = betterproto.int32_field(1, group="type")
    """Всего подписок"""

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


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

    subscription_filter_validation: "SubscriptionFilterValidationError" = (
        betterproto.message_field(1, group="reason")
    )
    """Ошибка фильтрации подписок"""


class PrivilegeServiceStub(betterproto.ServiceStub):
    async def get_privilege_list(
        self,
        get_privilege_list_request: "GetPrivilegeListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetPrivilegeListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.subscription.v1.PrivilegeService/GetPrivilegeList",
            get_privilege_list_request,
            GetPrivilegeListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_privilege_count(
        self,
        get_privilege_count_request: "GetPrivilegeCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetPrivilegeCountResponse":
        return await self._unary_unary(
            "/keyapis.subscription.v1.PrivilegeService/GetPrivilegeCount",
            get_privilege_count_request,
            GetPrivilegeCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_privilege_check(
        self,
        get_privilege_check_request: "GetPrivilegeCheckRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetPrivilegeCheckResponse":
        return await self._unary_unary(
            "/keyapis.subscription.v1.PrivilegeService/GetPrivilegeCheck",
            get_privilege_check_request,
            GetPrivilegeCheckResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class PlanServiceStub(betterproto.ServiceStub):
    async def get_plan(
        self,
        get_plan_request: "GetPlanRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetPlanResponse":
        return await self._unary_unary(
            "/keyapis.subscription.v1.PlanService/GetPlan",
            get_plan_request,
            GetPlanResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_plan_list(
        self,
        get_plan_list_request: "GetPlanListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetPlanListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.subscription.v1.PlanService/GetPlanList",
            get_plan_list_request,
            GetPlanListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_plan_count(
        self,
        get_plan_count_request: "GetPlanCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetPlanCountResponse":
        return await self._unary_unary(
            "/keyapis.subscription.v1.PlanService/GetPlanCount",
            get_plan_count_request,
            GetPlanCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class ServiceServiceStub(betterproto.ServiceStub):
    async def get_service_list(
        self,
        get_service_list_request: "GetServiceListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetServiceListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.subscription.v1.ServiceService/GetServiceList",
            get_service_list_request,
            GetServiceListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_service_privilege_list(
        self,
        get_service_privilege_list_request: "GetServicePrivilegeListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetServicePrivilegeListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.subscription.v1.ServiceService/GetServicePrivilegeList",
            get_service_privilege_list_request,
            GetServicePrivilegeListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_service_privilege_count(
        self,
        get_service_privilege_count_request: "GetServicePrivilegeCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetServicePrivilegeCountResponse":
        return await self._unary_unary(
            "/keyapis.subscription.v1.ServiceService/GetServicePrivilegeCount",
            get_service_privilege_count_request,
            GetServicePrivilegeCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_service_kind_list(
        self,
        get_service_kind_list_request: "GetServiceKindListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetServiceKindListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.subscription.v1.ServiceService/GetServiceKindList",
            get_service_kind_list_request,
            GetServiceKindListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response


class SystemServiceStub(betterproto.ServiceStub):
    async def get_system_status(
        self,
        get_system_status_request: "GetSystemStatusRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetSystemStatusResponse":
        return await self._unary_unary(
            "/keyapis.subscription.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class OfferServiceStub(betterproto.ServiceStub):
    async def get_offer(
        self,
        get_offer_request: "GetOfferRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetOfferResponse":
        return await self._unary_unary(
            "/keyapis.subscription.v1.OfferService/GetOffer",
            get_offer_request,
            GetOfferResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_offer_list(
        self,
        get_offer_list_request: "GetOfferListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetOfferListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.subscription.v1.OfferService/GetOfferList",
            get_offer_list_request,
            GetOfferListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_offer_count(
        self,
        get_offer_count_request: "GetOfferCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetOfferCountResponse":
        return await self._unary_unary(
            "/keyapis.subscription.v1.OfferService/GetOfferCount",
            get_offer_count_request,
            GetOfferCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class SubscriptionServiceStub(betterproto.ServiceStub):
    async def get_subscription(
        self,
        get_subscription_request: "GetSubscriptionRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetSubscriptionResponse":
        return await self._unary_unary(
            "/keyapis.subscription.v1.SubscriptionService/GetSubscription",
            get_subscription_request,
            GetSubscriptionResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_subscription_list(
        self,
        get_subscription_list_request: "GetSubscriptionListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetSubscriptionListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.subscription.v1.SubscriptionService/GetSubscriptionList",
            get_subscription_list_request,
            GetSubscriptionListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_subscription_count(
        self,
        get_subscription_count_request: "GetSubscriptionCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetSubscriptionCountResponse":
        return await self._unary_unary(
            "/keyapis.subscription.v1.SubscriptionService/GetSubscriptionCount",
            get_subscription_count_request,
            GetSubscriptionCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class PrivilegeServiceBase(ServiceBase):

    async def get_privilege_list(
        self, get_privilege_list_request: "GetPrivilegeListRequest"
    ) -> AsyncIterator["GetPrivilegeListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_privilege_count(
        self, get_privilege_count_request: "GetPrivilegeCountRequest"
    ) -> "GetPrivilegeCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_privilege_check(
        self, get_privilege_check_request: "GetPrivilegeCheckRequest"
    ) -> "GetPrivilegeCheckResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_privilege_list(
        self,
        stream: "grpclib.server.Stream[GetPrivilegeListRequest, GetPrivilegeListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_privilege_list,
            stream,
            request,
        )

    async def __rpc_get_privilege_count(
        self,
        stream: "grpclib.server.Stream[GetPrivilegeCountRequest, GetPrivilegeCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_privilege_count(request)
        await stream.send_message(response)

    async def __rpc_get_privilege_check(
        self,
        stream: "grpclib.server.Stream[GetPrivilegeCheckRequest, GetPrivilegeCheckResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_privilege_check(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.subscription.v1.PrivilegeService/GetPrivilegeList": grpclib.const.Handler(
                self.__rpc_get_privilege_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetPrivilegeListRequest,
                GetPrivilegeListResponse,
            ),
            "/keyapis.subscription.v1.PrivilegeService/GetPrivilegeCount": grpclib.const.Handler(
                self.__rpc_get_privilege_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPrivilegeCountRequest,
                GetPrivilegeCountResponse,
            ),
            "/keyapis.subscription.v1.PrivilegeService/GetPrivilegeCheck": grpclib.const.Handler(
                self.__rpc_get_privilege_check,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPrivilegeCheckRequest,
                GetPrivilegeCheckResponse,
            ),
        }


class PlanServiceBase(ServiceBase):

    async def get_plan(self, get_plan_request: "GetPlanRequest") -> "GetPlanResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_plan_list(
        self, get_plan_list_request: "GetPlanListRequest"
    ) -> AsyncIterator["GetPlanListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_plan_count(
        self, get_plan_count_request: "GetPlanCountRequest"
    ) -> "GetPlanCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_plan(
        self, stream: "grpclib.server.Stream[GetPlanRequest, GetPlanResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_plan(request)
        await stream.send_message(response)

    async def __rpc_get_plan_list(
        self, stream: "grpclib.server.Stream[GetPlanListRequest, GetPlanListResponse]"
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_plan_list,
            stream,
            request,
        )

    async def __rpc_get_plan_count(
        self, stream: "grpclib.server.Stream[GetPlanCountRequest, GetPlanCountResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_plan_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.subscription.v1.PlanService/GetPlan": grpclib.const.Handler(
                self.__rpc_get_plan,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPlanRequest,
                GetPlanResponse,
            ),
            "/keyapis.subscription.v1.PlanService/GetPlanList": grpclib.const.Handler(
                self.__rpc_get_plan_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetPlanListRequest,
                GetPlanListResponse,
            ),
            "/keyapis.subscription.v1.PlanService/GetPlanCount": grpclib.const.Handler(
                self.__rpc_get_plan_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPlanCountRequest,
                GetPlanCountResponse,
            ),
        }


class ServiceServiceBase(ServiceBase):

    async def get_service_list(
        self, get_service_list_request: "GetServiceListRequest"
    ) -> AsyncIterator["GetServiceListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_service_privilege_list(
        self, get_service_privilege_list_request: "GetServicePrivilegeListRequest"
    ) -> AsyncIterator["GetServicePrivilegeListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_service_privilege_count(
        self, get_service_privilege_count_request: "GetServicePrivilegeCountRequest"
    ) -> "GetServicePrivilegeCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_service_kind_list(
        self, get_service_kind_list_request: "GetServiceKindListRequest"
    ) -> AsyncIterator["GetServiceKindListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_service_list(
        self,
        stream: "grpclib.server.Stream[GetServiceListRequest, GetServiceListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_service_list,
            stream,
            request,
        )

    async def __rpc_get_service_privilege_list(
        self,
        stream: "grpclib.server.Stream[GetServicePrivilegeListRequest, GetServicePrivilegeListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_service_privilege_list,
            stream,
            request,
        )

    async def __rpc_get_service_privilege_count(
        self,
        stream: "grpclib.server.Stream[GetServicePrivilegeCountRequest, GetServicePrivilegeCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_service_privilege_count(request)
        await stream.send_message(response)

    async def __rpc_get_service_kind_list(
        self,
        stream: "grpclib.server.Stream[GetServiceKindListRequest, GetServiceKindListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_service_kind_list,
            stream,
            request,
        )

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.subscription.v1.ServiceService/GetServiceList": grpclib.const.Handler(
                self.__rpc_get_service_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetServiceListRequest,
                GetServiceListResponse,
            ),
            "/keyapis.subscription.v1.ServiceService/GetServicePrivilegeList": grpclib.const.Handler(
                self.__rpc_get_service_privilege_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetServicePrivilegeListRequest,
                GetServicePrivilegeListResponse,
            ),
            "/keyapis.subscription.v1.ServiceService/GetServicePrivilegeCount": grpclib.const.Handler(
                self.__rpc_get_service_privilege_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetServicePrivilegeCountRequest,
                GetServicePrivilegeCountResponse,
            ),
            "/keyapis.subscription.v1.ServiceService/GetServiceKindList": grpclib.const.Handler(
                self.__rpc_get_service_kind_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetServiceKindListRequest,
                GetServiceKindListResponse,
            ),
        }


class SystemServiceBase(ServiceBase):

    async def get_system_status(
        self, get_system_status_request: "GetSystemStatusRequest"
    ) -> "GetSystemStatusResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_system_status(
        self,
        stream: "grpclib.server.Stream[GetSystemStatusRequest, GetSystemStatusResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_system_status(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.subscription.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }


class OfferServiceBase(ServiceBase):

    async def get_offer(
        self, get_offer_request: "GetOfferRequest"
    ) -> "GetOfferResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_offer_list(
        self, get_offer_list_request: "GetOfferListRequest"
    ) -> AsyncIterator["GetOfferListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_offer_count(
        self, get_offer_count_request: "GetOfferCountRequest"
    ) -> "GetOfferCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_offer(
        self, stream: "grpclib.server.Stream[GetOfferRequest, GetOfferResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_offer(request)
        await stream.send_message(response)

    async def __rpc_get_offer_list(
        self, stream: "grpclib.server.Stream[GetOfferListRequest, GetOfferListResponse]"
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_offer_list,
            stream,
            request,
        )

    async def __rpc_get_offer_count(
        self,
        stream: "grpclib.server.Stream[GetOfferCountRequest, GetOfferCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_offer_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.subscription.v1.OfferService/GetOffer": grpclib.const.Handler(
                self.__rpc_get_offer,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetOfferRequest,
                GetOfferResponse,
            ),
            "/keyapis.subscription.v1.OfferService/GetOfferList": grpclib.const.Handler(
                self.__rpc_get_offer_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetOfferListRequest,
                GetOfferListResponse,
            ),
            "/keyapis.subscription.v1.OfferService/GetOfferCount": grpclib.const.Handler(
                self.__rpc_get_offer_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetOfferCountRequest,
                GetOfferCountResponse,
            ),
        }


class SubscriptionServiceBase(ServiceBase):

    async def get_subscription(
        self, get_subscription_request: "GetSubscriptionRequest"
    ) -> "GetSubscriptionResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_subscription_list(
        self, get_subscription_list_request: "GetSubscriptionListRequest"
    ) -> AsyncIterator["GetSubscriptionListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_subscription_count(
        self, get_subscription_count_request: "GetSubscriptionCountRequest"
    ) -> "GetSubscriptionCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_subscription(
        self,
        stream: "grpclib.server.Stream[GetSubscriptionRequest, GetSubscriptionResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_subscription(request)
        await stream.send_message(response)

    async def __rpc_get_subscription_list(
        self,
        stream: "grpclib.server.Stream[GetSubscriptionListRequest, GetSubscriptionListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_subscription_list,
            stream,
            request,
        )

    async def __rpc_get_subscription_count(
        self,
        stream: "grpclib.server.Stream[GetSubscriptionCountRequest, GetSubscriptionCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_subscription_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.subscription.v1.SubscriptionService/GetSubscription": grpclib.const.Handler(
                self.__rpc_get_subscription,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSubscriptionRequest,
                GetSubscriptionResponse,
            ),
            "/keyapis.subscription.v1.SubscriptionService/GetSubscriptionList": grpclib.const.Handler(
                self.__rpc_get_subscription_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetSubscriptionListRequest,
                GetSubscriptionListResponse,
            ),
            "/keyapis.subscription.v1.SubscriptionService/GetSubscriptionCount": grpclib.const.Handler(
                self.__rpc_get_subscription_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSubscriptionCountRequest,
                GetSubscriptionCountResponse,
            ),
        }
