# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/access_control/v1/keyapis_access_control_access_control_v1.proto, keyapis/access_control/v1/keyapis_access_control_access_point_group_v1.proto, keyapis/access_control/v1/keyapis_access_control_access_point_v1.proto, keyapis/access_control/v1/keyapis_access_control_broadcast_alert_v1.proto, keyapis/access_control/v1/keyapis_access_control_building_v1.proto, keyapis/access_control/v1/keyapis_access_control_entrance_v1.proto, keyapis/access_control/v1/keyapis_access_control_events_1.proto, keyapis/access_control/v1/keyapis_access_control_flatgramm_v1.proto, keyapis/access_control/v1/keyapis_access_control_rfid_v1.proto, keyapis/access_control/v1/keyapis_access_control_room_device_v1.proto, keyapis/access_control/v1/keyapis_access_control_room_user_v1.proto, keyapis/access_control/v1/keyapis_access_control_system_v1.proto
# plugin: python-betterproto
import warnings
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 RoomType(betterproto.Enum):
    """Тип"""

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

    FLOOR = 1
    """Этаж"""

    ENTRANCE = 2
    """Подъезд"""

    APARTMENT = 3
    """Апартаменты"""

    WATER_DISTRIBUTION = 4
    """Вводно-распределительные устройства"""

    HEAT_POINT = 5
    """Индивидуальный тепловой пункт"""

    PANTRY = 6
    """Кладовая"""

    WHEELCHAIR = 7
    """Колясочная"""

    WIRING_CLOSET = 8
    """Коммутационный шкаф"""

    CONCIERGE = 9
    """Консьержная"""

    CHECKPOINT = 10
    """КПП"""

    PARKING_PLACE = 11
    """Машиноместо"""

    OFFICE = 12
    """Офис"""

    BASEMENT = 13
    """Подвал"""

    SUBSTATION = 14
    """Подстанция"""

    HOMEOWNERS_ROOM = 15
    """Помещение правления ТСЖ"""

    TAMBOUR = 16
    """Тамбур"""

    INPUT_NODE = 17
    """Узел ввода"""

    LOBBY = 18
    """Лобби"""

    ATTIC = 19
    """Чердак"""

    ELEVATOR_SHAFT = 20
    """Шахта лифта"""

    SWITCHBOARD = 21
    """Электрощитовая"""

    DEFAULT_ROOM = 22
    """Квартира по умолчанию"""


class PatchRoomSetSubscriptionModeRequestModeType(betterproto.Enum):
    """Справочник значений режимов подписки"""

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

    DISABLED = 1
    """Выключено"""

    ENABLED = 2
    """Включено"""


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

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

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

    CREATED_AT = 2
    """По времени создания"""

    FLOOR_THEN_NUMBER = 3
    """По этажу и номеру"""

    NUMBER = 4
    """По номеру"""


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

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

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

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


class PrepareStartTaskPlayType(betterproto.Enum):
    """Тип проигрывания. # Тип: byte"""

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

    HANDSET_ONLY = 1
    """Только на аналоговые трубки"""

    SPEAKER_ONLY = 2
    """Tолько на динамик домофона"""

    HANDSET_AND_SPEAKER = 3
    """
    Сначала на аналоговые трубки проигрываем заданное количество тактов, затем
    на динамик домофона
    """

    SPEAKER_AND_HANDSET = 4
    """
    Сначала на динамик домофона проигрываем заданное количество тактов, затем
    на аналоговые трубки
    """


class DeleteRfidsFromAllDevicesResultTaskStatusType(betterproto.Enum):
    """Справочник статусов удаления ключа со всех устройств. # Тип: byte"""

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

    SUCCESS = 1
    """Настроен"""

    ERROR = 2
    """Ошибка"""


class PostBroadcastAlertStartRequestPlayType(betterproto.Enum):
    """Тип проигрывания. # Тип: byte"""

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

    HANDSET_ONLY = 1
    """Только на аналоговые трубки"""

    SPEAKER_ONLY = 2
    """Tолько на динамик домофона"""

    HANDSET_AND_SPEAKER = 3
    """
    Сначала на аналоговые трубки проигрываем заданное количество тактов, затем
    на динамик домофона
    """

    SPEAKER_AND_HANDSET = 4
    """
    Сначала на динамик домофона проигрываем заданное количество тактов, затем
    на аналоговые трубки
    """


class EntranceFilterCompanyRelationType(betterproto.Enum):
    """Справочник типов связи компании с подъездами"""

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

    DEFAULT = 1
    """Значение по умолчанию"""

    MANAGEMENT = 2
    """Управляющая компания владеет квартирограммой"""

    DEVICE_SERVICE = 3
    """Домофонная компания обслуживает квартирограмму"""


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

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

    ORPON_THEN_ENTRANCE_NUMBER = 1
    """По ОРПОНу и номеру подъезда"""


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

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

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

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


class EntranceDeviceRelationType(betterproto.Enum):
    """Тип связки"""

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

    FULL = 1
    """Полная связь"""

    PARTIAL = 2
    """Частичная связь"""


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

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

    ORPON_THEN_ENTRANCE_NUMBER = 1
    """По ОРПОНу и номеру подъезда"""

    DEVICE_ID = 2
    """По идентификатору устройства"""


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

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

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

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


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

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

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

    CREATED_AT = 2
    """По времени создания"""

    STREET_THEN_NUMBER_THEN_PART = 3
    """По улице, номеру дома, корпусу"""


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

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

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

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


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

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

    ENABLED = 1
    """Режим работы с подписками включен на всех помещениях дома"""

    PARTIALLY_ENABLED = 2
    """Режим работы с подписками включен на некоторых помещениях дома"""

    DISABLED = 3
    """Режим работы с подписками выключен на всех помещениях дома"""


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

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

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

    CREATED_AT = 2
    """По времени создания"""

    CHANGED_AT = 3
    """По времени изменения"""

    RANK = 4
    """
    По рангу для поиска по тексту. Применяется когда передано поле для поиска
    по тексту. В случае если текстовое поле не передано, применяется значение
    по умолчанию
    """


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

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

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

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


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

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

    COMPANY_ID = 1
    """По Идентификатору домофонной компании"""

    FLATGRAMM_ID = 2
    """По Идентификатору квартирограммы"""


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

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

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

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


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

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

    COMPANY_ID = 1
    """По Идентификатору компании"""

    FLATGRAMM_ID = 2
    """По Идентификатору квартирограммы"""


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

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

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

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


class FlatgrammCompanyRelationType(betterproto.Enum):
    """Тип связи компании и квартирограммы. По умолчанию OWNER. # Тип: byte"""

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

    MANAGEMENT = 1
    """Управляющая компания владеет квартирограммой"""

    DEVICE_SERVICE = 2
    """Домофонная компания обслуживает квартирограмму"""


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

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

    GROUP_ID = 1
    """По идентификатору группы"""

    ACCESS_POINT_ID = 2
    """По идентификатору точки доступа"""

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


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

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

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

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


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

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

    ORPON_THEN_ENTRANCE_NUMBER = 1
    """По ОРПОНу и номеру подъезда"""

    DEVICE_ID = 2
    """По идентификатору устройства"""


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

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

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

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


class RfidPayType(betterproto.Enum):
    """Тип оплаты"""

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

    PAID = 1
    """Платный"""

    FREE = 2
    """Бесплатный"""


class RfidHolderType(betterproto.Enum):
    """Тип владельца ключа"""

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

    MASTER = 1
    """Жилец"""

    COMPANY = 2
    """Сотрудник УК"""

    EXTERNAL_SELLER = 3
    """Ключ сотрудника ГАП"""

    SYSTEM = 4
    """Системный ключ"""


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

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

    CREATED_AT = 1
    """По времени создания"""

    CHANGED_AT = 2
    """По времени изменения"""


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

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

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

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


class AccessPointDirectionType(betterproto.Enum):
    """Тип направления. # Тип: byte"""

    DIRECTION_TYPE_UNKNOWN = 0
    """Не указано"""

    IN = 1
    """Вход"""

    OUT = 2
    """Выход"""

    REVERSE = 3
    """В обоих направлениях"""


class AccessPointCameraRecognitionType(betterproto.Enum):
    """
    Тип распознавания. Атрибут, определяющий тип данных, который распознает
    камера. # Тип: byte
    """

    RECOGNITION_TYPE_UNKNOWN = 0
    """Не указано"""

    CAR_NUMBER = 1
    """По номеру авто"""

    VEHICLE_TYPE = 2
    """По типу транспорта"""


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

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

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

    TITLE = 2
    """По наименованию"""

    CHANGED_AT = 3
    """Дата последнего изменения"""

    CREATED_AT = 4
    """Дата создания"""

    RANK = 5
    """
    По рангу для поиска по тексту. Применяется когда передано поле для поиска
    по тексту. В случае если текстовое поле не передано, применяется значение
    по умолчанию
    """


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

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

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

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


class PostAccessPointOpenRequestVehicleType(betterproto.Enum):
    """Тип ТС"""

    VEHICLE_TYPE_UNKNOWN = 0
    """Не указано"""

    EMERGENCY = 1
    """МЧС"""

    POLICE = 2
    """Полиция"""

    AMBULANCE = 3
    """Скорая помощь"""

    GARBAGE_TRUCK = 4
    """Мусоровоз"""

    TAXI = 5
    """Такси"""


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

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

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

    ORPON_THEN_NUMBER = 2
    """По ОРПОНу и номеру"""


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

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

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

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


@dataclass(eq=False, repr=False)
class Room(betterproto.Message):
    """Квартира"""

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

    number: str = betterproto.string_field(2)
    """Номер"""

    entrance: int = betterproto.int32_field(3)
    """Подъезд"""

    floor: int = betterproto.int32_field(4)
    """Этаж"""

    area: float = betterproto.float_field(5)
    """Площадь"""

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

    company_id: int = betterproto.int32_field(7)
    """Идентификатор компании"""

    abonent_id: str = betterproto.string_field(8)
    """Номер абонента"""

    type: "RoomType" = betterproto.enum_field(9)
    """Тип"""

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

    deleted_at: datetime = betterproto.message_field(11)
    """Дата удаления. # Тип: DateTime"""

    is_subscription_mode_enabled: bool = betterproto.bool_field(12)
    """Включен ли режим подписок"""


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

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


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

    data: "Room" = betterproto.message_field(1, group="type")
    """Квартира"""

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


@dataclass(eq=False, repr=False)
class GetRoomResponseError(betterproto.Message):
    """Ошибка"""

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


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

    mrf_ids: List[int] = betterproto.int32_field(1)
    """Список идентификаторов МРФ"""

    rf_ids: List[int] = betterproto.int32_field(2)
    """Список идентификаторов РФ"""

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

    room_numbers: List[str] = betterproto.string_field(4)
    """Список номеров квартир"""

    mode_type: "PatchRoomSetSubscriptionModeRequestModeType" = betterproto.enum_field(5)
    """Значение режима подписок"""


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

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


@dataclass(eq=False, repr=False)
class PatchRoomSetSubscriptionModeResponseError(betterproto.Message):
    """Ошибка"""

    orpon_expected: "PatchRoomSetSubscriptionModeResponseErrorOrponExpected" = (
        betterproto.message_field(1, group="reason")
    )
    """Не передано значение ОРПОН"""

    id_expected: "PatchRoomSetSubscriptionModeResponseErrorIdExpected" = (
        betterproto.message_field(2, group="reason")
    )
    """Не передан хотя бы один идентификатор"""

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


@dataclass(eq=False, repr=False)
class PatchRoomSetSubscriptionModeResponseErrorOrponExpected(betterproto.Message):
    """
    Не передано значение ОРПОН: - Если переданы номера квартир, то значение
    параметра ОРПОН обязательно
    """

    pass


@dataclass(eq=False, repr=False)
class PatchRoomSetSubscriptionModeResponseErrorIdExpected(betterproto.Message):
    """
    Не передан хотя бы один идентификатор: - Должен быть передан хотя бы один
    из параметров:  - mrf_ids;  - rf_ids;  - opron_id
    """

    pass


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

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

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


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

    data: "Room" = betterproto.message_field(1, group="type")
    """Квартира"""

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


@dataclass(eq=False, repr=False)
class GetRoomListResponseError(betterproto.Message):
    """Ошибка"""

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


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

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


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

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


@dataclass(eq=False, repr=False)
class RoomFilter(betterproto.Message):
    """Фильтр по квартирам"""

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

    entrances: List[int] = betterproto.int32_field(2)
    """По подъездам"""

    floors: List[int] = betterproto.int32_field(3)
    """По этажам"""

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

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

    device_ids: List[int] = betterproto.int32_field(6)
    """По идентификаторам устройств"""

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

    is_service_flag: Optional[bool] = betterproto.message_field(
        8, wraps=betterproto.TYPE_BOOL
    )
    """По признаку служебной квартиры"""

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


@dataclass(eq=False, repr=False)
class GetRoomOrponNumberExistsRequest(betterproto.Message):
    """Запрос проверки существования квартиры по ОРПОН и её номеру"""

    orpon: int = betterproto.int64_field(1)
    """ОРПОН дома. # Диапазон: 1..9223372036854775807"""

    room_number: str = betterproto.string_field(2)
    """Номер квартиры. # Диапазон: 1..4"""


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

    data: bool = betterproto.bool_field(1, group="type")
    """
    Результат проверки: true - если квартира существует, false - в противном
    случае
    """

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


@dataclass(eq=False, repr=False)
class GetRoomOrponNumberExistsResponseError(betterproto.Message):
    """Ошибка"""

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


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

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

    direction_type: "RoomPagingDirectionType" = 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 ValidationError(betterproto.Message):
    """
    Ошибки валидации. Эти проверки выполняются до обращения в базу данных
    """

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

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


@dataclass(eq=False, repr=False)
class ActivateCmsSettingsTask(betterproto.Message):
    """
    Задача на активацию аналоговых трубок квартир для устройства на доме.
    Очередь key.access_control.activate_cms
    """

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

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

    device_id: int = betterproto.int32_field(3)
    """Идентификатор устройства"""

    room_numbers: List[str] = betterproto.string_field(4)
    """
    Номера квартир с включенным режимом подписок, у которых блокируется
    аналоговая трубка
    """


@dataclass(eq=False, repr=False)
class BlockCmsSettingsTask(betterproto.Message):
    """
    Задача на блокировку аналоговых трубок квартир для устройства на доме.
    Очередь key.access_control.block_cms
    """

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

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

    device_id: int = betterproto.int32_field(3)
    """Идентификатор устройства"""

    room_numbers: List[str] = betterproto.string_field(4)
    """
    Номера квартир с включенным режимом подписок, у которых активируется
    аналоговая трубка
    """


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

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

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

    device_id: int = betterproto.int32_field(3)
    """Идентификатор устройства"""

    room_numbers: List[str] = betterproto.string_field(4)
    """Номера квартир для которых необходимо активация аналоговых трубок"""


@dataclass(eq=False, repr=False)
class ConfigureRoomsResultTask(betterproto.Message):
    """
    Задача ответ на конфигурацию квартир. Очередь
    key.access_control.configure_rooms_result
    """

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

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    rooms: List["ConfigureRoomsResultTaskRoom"] = betterproto.message_field(3)
    """Список квартир с результатом конфигурации"""


@dataclass(eq=False, repr=False)
class ConfigureRoomsResultTaskRoom(betterproto.Message):
    """Результат конфигурации квартиры"""

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

    is_configured: bool = betterproto.bool_field(2)
    """Признак "Сконфигурировано"""

    error_message: str = betterproto.string_field(3)
    """Текст ошибки"""


@dataclass(eq=False, repr=False)
class LoadRfidsToDevicesTask(betterproto.Message):
    """
    Задача на добавление ключей на устройства. Очередь
    key.access_control.load_rfids_to_devices
    """

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

    rfids: List["LoadRfidsToDevicesTaskRfid"] = betterproto.message_field(2)
    """Список ключей"""

    device_ids: List[int] = betterproto.int32_field(3)
    """Список идентификаторов устройств"""


@dataclass(eq=False, repr=False)
class LoadRfidsToDevicesTaskRfid(betterproto.Message):
    """Ключ"""

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

    key: str = betterproto.string_field(2)
    """Значение ключа"""

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

    room_id: int = betterproto.int32_field(4)
    """Идентификатор квартиры"""


@dataclass(eq=False, repr=False)
class LoadCodesToDevicesTask(betterproto.Message):
    """
    Задача на добавление кодов на устройства. Очередь
    key.access_control.load_codes_to_devices
    """

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

    codes: List["LoadCodesToDevicesTaskCode"] = betterproto.message_field(2)
    """Список кодов"""

    device_ids: List[int] = betterproto.int32_field(3)
    """Список идентификаторов устройств"""


@dataclass(eq=False, repr=False)
class LoadCodesToDevicesTaskCode(betterproto.Message):
    """Код"""

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

    code: str = betterproto.string_field(2)
    """Значение кода"""

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

    room_id: int = betterproto.int32_field(4)
    """Идентификатор квартиры"""


@dataclass(eq=False, repr=False)
class DeleteRfidsFromDevicesTask(betterproto.Message):
    """
    Задача на удаление ключей с устройств. Очередь
    key.access_control.delete_rfids_from_devices
    """

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

    rfids: List["DeleteRfidsFromDevicesTaskRfid"] = betterproto.message_field(2)
    """Список ключей"""

    device_ids: List[int] = betterproto.int32_field(3)
    """Список идентификаторов устройств"""

    is_force_delete: Optional[bool] = betterproto.message_field(
        4, wraps=betterproto.TYPE_BOOL
    )
    """Удаление без ожидания ответа от устройства"""


@dataclass(eq=False, repr=False)
class DeleteRfidsFromDevicesTaskRfid(betterproto.Message):
    """Ключ"""

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

    key: str = betterproto.string_field(2)
    """Значение ключа"""

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

    room_id: int = betterproto.int32_field(4)
    """Идентификатор квартиры"""


@dataclass(eq=False, repr=False)
class DeleteCodesFromDevicesTask(betterproto.Message):
    """
    Задача на удаление кодов с устройств. Очередь
    key.access_control.delete_codes_from_devices
    """

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

    codes: List["DeleteCodesFromDevicesTaskCode"] = betterproto.message_field(2)
    """Список кодов"""

    device_ids: List[int] = betterproto.int32_field(3)
    """Список идентификаторов устройств"""

    is_force_delete: Optional[bool] = betterproto.message_field(
        4, wraps=betterproto.TYPE_BOOL
    )
    """Удаление без ожидания ответа от устройства"""


@dataclass(eq=False, repr=False)
class DeleteCodesFromDevicesTaskCode(betterproto.Message):
    """Код"""

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

    code: str = betterproto.string_field(2)
    """Значение кода"""

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

    room_id: int = betterproto.int32_field(4)
    """Идентификатор квартиры"""


@dataclass(eq=False, repr=False)
class PrepareStartTask(betterproto.Message):
    """
    Команда на подготовку и старт оповещения через домофоны. Очередь
    key.access_control.alert.prepare_start
    """

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

    sound_file_uri: str = betterproto.string_field(2)
    """
    Ссылка на звуковой файл для проигрывания. Файл должен лежать на внутреннем
    хранилище. # Диапазон: 2..100
    """

    orpon: int = betterproto.int64_field(3)
    """Идентификатор ОРПОН дома, на котором запускаем проигрывание"""

    tact_play_duration: int = betterproto.int32_field(4)
    """
    Длительность воспроизведения такта в секундах. Такт включает в себя
    проигрывание файла на трубках или на динамике. # Диапазон: 0..65536
    """

    tact_repeat_count: int = betterproto.int32_field(5)
    """
    Количество последовательных повторов тактов перед сменой динамика на трубки
    или наоборот. # Диапазон: 0..65536
    """

    play_repeat_count: int = betterproto.int32_field(6)
    """
    Количество дополнительных повторов тактов, т.е. умолчание=0 - это
    проигрывание одного такта. # Диапазон: 0..65536
    """

    play_type: "PrepareStartTaskPlayType" = betterproto.enum_field(7)
    """Тип проигрывания"""


@dataclass(eq=False, repr=False)
class DeleteRfidsFromAllDevicesTask(betterproto.Message):
    """
    Задача на удаление ключей со всех устройств. Очередь
    key.access_control.delete_rfids_from_all_devices
    """

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

    rfids: List["DeleteRfidsFromAllDevicesTaskRfid"] = betterproto.message_field(2)
    """Список ключей"""

    is_force_delete: Optional[bool] = betterproto.message_field(
        3, wraps=betterproto.TYPE_BOOL
    )
    """Удаление без ожидания ответа от устройства"""


@dataclass(eq=False, repr=False)
class DeleteRfidsFromAllDevicesTaskRfid(betterproto.Message):
    """Ключ"""

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

    key: str = betterproto.string_field(2)
    """Значение ключа"""

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

    room_id: int = betterproto.int32_field(4)
    """Идентификатор квартиры"""


@dataclass(eq=False, repr=False)
class DeleteRfidsFromAllDevicesResultTask(betterproto.Message):
    """
    Результат задачи на удаление ключа со всех устройств. Очередь
    key.access_control.delete_rfids_from_all_devices_result
    """

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

    rfid_id: int = betterproto.int32_field(2)
    """Идентификатор ключа"""

    status_type: "DeleteRfidsFromAllDevicesResultTaskStatusType" = (
        betterproto.enum_field(3)
    )
    """Статус удаления ключа со всех устройств"""


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

    pass


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

    pass


@dataclass(eq=False, repr=False)
class PostBroadcastAlertStartRequest(betterproto.Message):
    """Запрос на запуск массового оповещения через домофоны"""

    sound_file_uri: str = betterproto.string_field(1)
    """
    Ссылка на звуковой файл для проигрывания. Файл должен лежать на внутреннем
    хранилище. # Диапазон: 2..100
    """

    orpons: List[int] = betterproto.int64_field(2)
    """
    Массив ОРПОНов домов, на которых запускаем проигрывание. # Диапазон: 1..100
    """

    tact_play_duration: int = betterproto.int32_field(3)
    """
    Длительность воспроизведения такта в секундах. Такт включает в себя
    проигрывание файла на трубках или на динамике. # Диапазон: 0..65536
    """

    tact_repeat_count: int = betterproto.int32_field(4)
    """
    Количество последовательных повторов тактов перед сменой динамика на трубки
    или наоборот. # Диапазон: 0..65536
    """

    play_repeat_count: int = betterproto.int32_field(5)
    """
    Количество дополнительных повторов тактов, т.е. умолчание=0 - это
    проигрывание одного такта. # Диапазон: 0..65536
    """

    play_type: "PostBroadcastAlertStartRequestPlayType" = betterproto.enum_field(6)
    """Тип проигрывания"""


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

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


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

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

    sound_file_not_found: "PostBroadcastAlertStartResponseErrorSoundFileNotFound" = (
        betterproto.message_field(2, group="reason")
    )
    """Звуковой файл не найден"""


@dataclass(eq=False, repr=False)
class PostBroadcastAlertStartResponseErrorSoundFileNotFound(betterproto.Message):
    """Звуковой файл не найден"""

    pass


@dataclass(eq=False, repr=False)
class PostBroadcastAlertStopRequest(betterproto.Message):
    """Запрос на прекращение массового оповещения через домофоны"""

    orpons: List[int] = betterproto.int64_field(1)
    """
    Массив ОРПОНов домов, на которых запускаем проигрывание. # Диапазон: 1..100
    """


@dataclass(eq=False, repr=False)
class PostBroadcastAlertStopResponse(betterproto.Message):
    """Ответ на запрос на прекращение массового оповещения через домофоны"""

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


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

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


@dataclass(eq=False, repr=False)
class Entrance(betterproto.Message):
    """Подъезд"""

    orpon: int = betterproto.int64_field(1)
    """ОРПОН дома"""

    entrance_number: int = betterproto.int32_field(2)
    """Номер подъезда. # Диапазон: 1..100"""

    start_room_number: int = betterproto.int32_field(3)
    """Номер начального помещения. # Диапазон: 1..9999"""

    rooms_count_per_floor: int = betterproto.int32_field(4)
    """Количество помещений на этаже. # Диапазон: 1..1000"""

    floors_count: int = betterproto.int32_field(5)
    """Количество этажей. # Диапазон: 1..100"""


@dataclass(eq=False, repr=False)
class EntranceFilter(betterproto.Message):
    """Фильтр подъездов"""

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

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

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

    company_relation_type: "EntranceFilterCompanyRelationType" = betterproto.enum_field(
        4
    )
    """Тип связи компании с подъездами"""


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

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

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

    filter: "EntranceFilter" = betterproto.message_field(1)
    """Фильтр по подъездам"""

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


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

    data: "Entrance" = betterproto.message_field(1, group="type")
    """Подъезд"""

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


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

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


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

    entrance_device: "EntranceDevice" = betterproto.message_field(1)
    """Связь подъезда и устройства"""


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

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


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

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


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

    entrance_device: "EntranceDevice" = betterproto.message_field(1)
    """Связь подъезда и устройства"""


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

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


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

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


@dataclass(eq=False, repr=False)
class PostEntranceRequest(betterproto.Message):
    """Запрос сохранения подъезда"""

    data: "Entrance" = betterproto.message_field(1)
    """Подъезд"""


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

    data: "Entrance" = betterproto.message_field(1, group="type")
    """Подъезд"""

    error: "PostEntranceResponseError" = betterproto.message_field(2, group="type")
    """Ошибка при удалении"""


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

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


@dataclass(eq=False, repr=False)
class DeleteEntranceRequest(betterproto.Message):
    """Запрос на удаление подъезда"""

    orpon: int = betterproto.int64_field(1)
    """ОРПОН дома"""

    entrance_number: int = betterproto.int32_field(2)
    """Номер подъезда. # Диапазон: 1..100"""


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

    error: "DeleteEntranceResponseError" = betterproto.message_field(1, group="type")
    """Ошибка при удалении"""


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

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

    linked_devices_exists: "DeleteEntranceResponseErrorLinkedDevicesExists" = (
        betterproto.message_field(2, group="reason")
    )
    """Существуют связанные устройства"""


@dataclass(eq=False, repr=False)
class DeleteEntranceResponseErrorLinkedDevicesExists(betterproto.Message):
    """
    Существуют устройства, связанные с квартирами данного подъезда. Следует
    отвязать устройства перед удалением подъезда
    """

    pass


@dataclass(eq=False, repr=False)
class EntranceDevice(betterproto.Message):
    """
    Связка подъезда и устройства. Реализуется через связь всех помещений в
    подъезде и устройства
    """

    orpon: int = betterproto.int64_field(1)
    """ОРПОН дома"""

    entrance_number: int = betterproto.int32_field(2)
    """Номер подъезда. # Диапазон: 1..100"""

    device_id: int = betterproto.int32_field(3)
    """Идентификатор устройства. # Диапазон: 1..2147483647"""

    relation_type: "EntranceDeviceRelationType" = betterproto.enum_field(4)
    """Тип связки. Игнорируется в методах создания и удаления связи"""


@dataclass(eq=False, repr=False)
class EntranceDeviceFilter(betterproto.Message):
    """Фильтр связок подъезд-устройство"""

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

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

    entrance_numbers: List[int] = betterproto.int32_field(3)
    """По номерам подъезда"""

    device_ids: List[int] = betterproto.int32_field(4)
    """По идентификаторам привязанных устройств"""


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

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

    direction_type: "EntranceDevicePagingDirectionType" = 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 GetEntranceDeviceListRequest(betterproto.Message):
    """Запрос на получение связок подъезд-устройство"""

    filter: "EntranceDeviceFilter" = betterproto.message_field(1)
    """Фильтр по связкам подъезд-устройство"""

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


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

    data: "EntranceDevice" = betterproto.message_field(1, group="type")
    """Связка подъезд-устройство"""

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


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

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


@dataclass(eq=False, repr=False)
class Building(betterproto.Message):
    """Дом"""

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

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

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

    orpon: int = betterproto.int64_field(4)
    """ОРПОН"""

    city: str = betterproto.string_field(5)
    """Город"""

    street: str = betterproto.string_field(6)
    """Улица"""

    number: str = betterproto.string_field(7)
    """Номер дома"""

    part: str = betterproto.string_field(8)
    """Корпус"""

    company_id: int = betterproto.int32_field(9)
    """Идентификатор компании"""

    prefix: str = betterproto.string_field(10)
    """Префикс"""

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

    deleted_at: datetime = betterproto.message_field(12)
    """Дата удаления. # Тип: DateTime"""

    flatgramm_id: int = betterproto.int32_field(13)
    """Идентификатор квартирограммы"""

    city_orpon: int = betterproto.int64_field(14)
    """ОРПОН города, в котором находится дом"""

    fias: Optional[str] = betterproto.message_field(15, wraps=betterproto.TYPE_STRING)
    """
    Идентификатор в федеральной информационной адресной системе. Тип: Guid
    """

    district: Optional[str] = betterproto.message_field(
        16, wraps=betterproto.TYPE_STRING
    )
    """Наименование района города. # Диапазон: 0..200"""

    unom: Optional[int] = betterproto.message_field(17, wraps=betterproto.TYPE_INT64)
    """Уникальный номер адреса. # Диапазон: 0..9999999999"""

    region_orpon: int = betterproto.int64_field(18)
    """ОРПОН региона"""

    utc_offset: int = betterproto.int32_field(19)
    """Смещение таймзоны в минутах. # Диапазон: -720..840"""

    is_key_purchase_possible_in_sale_points: bool = betterproto.bool_field(20)
    """
    Флаг указывает на то могут ли жители этого дома приобрести ключи домофона в
    партнёрских салонах или на маркетплейсах
    """

    is_key_purchase_possible_in_management_company: bool = betterproto.bool_field(21)
    """
    Флаг указывает на то могут ли жители этого дома приобретать ключи через
    управляющую компанию
    """

    is_key_purchase_possible_in_intercom_company: bool = betterproto.bool_field(22)
    """
    Флаг указывает на то могут ли жители этого дома приобрести ключи напрямую у
    домофонной компании
    """

    is_rfid_mifare_supported: bool = betterproto.bool_field(23)
    """
    Флаг указывает на то поддерживает ли дом использование RFID-меток с типом
    MIFARE
    """

    area: Optional[str] = betterproto.message_field(24, wraps=betterproto.TYPE_STRING)
    """Наименование муниципального района. # Диапазон: 0..64"""

    area_orpon: Optional[int] = betterproto.message_field(
        25, wraps=betterproto.TYPE_INT64
    )
    """ОРПОН муниципального района. # Диапазон: 0..9999999999"""

    area_kladr: Optional[str] = betterproto.message_field(
        26, wraps=betterproto.TYPE_STRING
    )
    """КЛАДР муниципального района. # Диапазон: 0..32"""

    capital_marker: Optional[int] = betterproto.message_field(
        27, wraps=betterproto.TYPE_INT32
    )
    """
    Признак принадлежности населённого пункта к столичному статусу. 1 — центр
    района. 2 — центр региона. 3 — центр района и региона. 4 — центральный
    район региона. 0 — ничего из перечисленного. # Диапазон: 0..4
    """

    city_kladr: Optional[str] = betterproto.message_field(
        28, wraps=betterproto.TYPE_STRING
    )
    """КЛАДР-код города. # Диапазон: 0..17"""

    kladr: Optional[str] = betterproto.message_field(29, wraps=betterproto.TYPE_STRING)
    """КЛАДР-код строения. # Диапазон: 0..17"""

    fias_level: Optional[int] = betterproto.message_field(
        30, wraps=betterproto.TYPE_INT32
    )
    """
    Уровень детализации, до которого адрес найден в ФИАС. 0 — страна. 1 —
    регион. 3 — район. 4 — город. 5 — район города. 6 — населенный пункт. 7 —
    улица. 8 — дом. 9 — квартира. 65 — планировочная структура. 90 — доп.
    территория. 91 — улица в доп. территории. -1 — иностранный или пустой. #
    Диапазон: -1..99
    """

    fias_actuality_state: Optional[int] = betterproto.message_field(
        31, wraps=betterproto.TYPE_INT32
    )
    """
    Уровень детализации, до которого адрес найден в ФИАС. 0 — актуальный. 1-50
    — переименован. 51 — переподчинен. 99 — удален. # Диапазон: 0..99
    """

    geo_lat: Optional[float] = betterproto.message_field(
        32, wraps=betterproto.TYPE_DOUBLE
    )
    """Координаты: широта"""

    geo_lon: Optional[float] = betterproto.message_field(
        33, wraps=betterproto.TYPE_DOUBLE
    )
    """Координаты: долгота"""

    okato: Optional[int] = betterproto.message_field(34, wraps=betterproto.TYPE_INT32)
    """Код ОКАТО"""

    oktmo: Optional[int] = betterproto.message_field(35, wraps=betterproto.TYPE_INT32)
    """Код ОКТМО"""

    postal_code: Optional[int] = betterproto.message_field(
        36, wraps=betterproto.TYPE_INT32
    )
    """Почтовый индекс"""

    region: Optional[str] = betterproto.message_field(37, wraps=betterproto.TYPE_STRING)
    """Наименование региона. # Диапазон: 0..64"""

    region_kladr: Optional[str] = betterproto.message_field(
        38, wraps=betterproto.TYPE_STRING
    )
    """КЛАДР-код региона. # Диапазон: 0..32"""

    street_kladr: Optional[str] = betterproto.message_field(
        39, wraps=betterproto.TYPE_STRING
    )
    """КЛАДР-код улицы. # Диапазон: 0..32"""

    street_orpon: Optional[int] = betterproto.message_field(
        40, wraps=betterproto.TYPE_INT64
    )
    """ОРПОН улицы. # Диапазон: 0..9999999999"""


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

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


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

    data: "Building" = betterproto.message_field(1, group="type")
    """Квартира"""

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


@dataclass(eq=False, repr=False)
class GetBuildingResponseError(betterproto.Message):
    """Ошибка"""

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


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

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

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


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

    data: "Building" = betterproto.message_field(1, group="type")
    """Квартира"""

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


@dataclass(eq=False, repr=False)
class GetBuildingListResponseError(betterproto.Message):
    """Ошибка"""

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


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

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


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

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


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

    mrf_ids: List[int] = betterproto.int32_field(1)
    """По идентификаторам МРФ"""

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

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

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

    orpons: List[int] = betterproto.int64_field(5)
    """По орпонам"""


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

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

    direction_type: "BuildingPagingDirectionType" = 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 BuildingSubscriptionMode(betterproto.Message):
    """Агрегированный статус режима работы с подписками на доме"""

    subscription_mode_type: "BuildingSubscriptionModeSubscriptionModeType" = (
        betterproto.enum_field(1)
    )
    """Режим работы с подписками на доме"""


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

    orpon: int = betterproto.int64_field(1)
    """ОРПОН. # Диапазон: 1..9223372036854775807"""


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

    data: "BuildingSubscriptionMode" = betterproto.message_field(1, group="type")
    """Агрегированный статус режима работы с подписками дома"""

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


@dataclass(eq=False, repr=False)
class GetBuildingOrponSubscriptionModeResponseError(betterproto.Message):
    """Ошибка"""

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


@dataclass(eq=False, repr=False)
class GetBuildingOrponExistsRequest(betterproto.Message):
    """Запрос проверки существования дома по ОРПОН"""

    orpon: int = betterproto.int64_field(1)
    """ОРПОН дома. # Диапазон: 1..9223372036854775807"""


@dataclass(eq=False, repr=False)
class GetBuildingOrponExistsResponse(betterproto.Message):
    """Ответ на запрос проверки существования дома по ОРПОН"""

    data: bool = betterproto.bool_field(1, group="type")
    """
    Результат проверки: true - если дом существует, false - в противном случае
    """

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


@dataclass(eq=False, repr=False)
class GetBuildingOrponExistsResponseError(betterproto.Message):
    """Ошибка"""

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


@dataclass(eq=False, repr=False)
class Flatgramm(betterproto.Message):
    """Облегченная квартирограмма"""

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

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

    company_id: int = betterproto.int32_field(3)
    """Идентификатор компании - владельца"""

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

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


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

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


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

    data: "Flatgramm" = betterproto.message_field(1, group="type")
    """Упрощенная квартирограмма"""

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


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

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


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

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

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


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

    data: "Flatgramm" = betterproto.message_field(1, group="type")
    """Упрощенная квартирограмма"""

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


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

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


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

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


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

    data: int = betterproto.int32_field(1, group="type")
    """Всего упрощенных квартирограмм"""


@dataclass(eq=False, repr=False)
class FlatgrammFilter(betterproto.Message):
    """Фильтр квартирограмм"""

    company_ids: List[int] = betterproto.int32_field(1)
    """
    По идентификаторам компаний. Фильтрация среди компаний, тип связи компании
    и КВГ определяется по полю company_relation_types. Если
    company_relation_types не передан, то учитываются все значения типа
    FlatgrammCompanyRelation.Type
    """

    text: str = betterproto.string_field(2)
    """
    Поиск по тексту. Если значение не передано то поиск по нему не
    производится. # Диапазон: 3..64. # Поиск производится по полям: # -
    Наименование
    """

    dc_company_ids: List[int] = betterproto.int32_field(3)
    """
    По идентификаторам компаний. Фильтрация среди компаний, привязанных как
    домофонные компании
    """

    flatgramm_company_relation_types: List["FlatgrammCompanyRelationType"] = (
        betterproto.enum_field(4)
    )
    """По типу связи квартирограмм и компаний"""

    def __post_init__(self) -> None:
        super().__post_init__()
        if self.is_set("dc_company_ids"):
            warnings.warn(
                "FlatgrammFilter.dc_company_ids is deprecated", DeprecationWarning
            )


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

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

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

    filter: "DcCompanyFlatgrammFilter" = betterproto.message_field(1)
    """Фильтр связей квартирограмм и домофонной компании"""

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

    def __post_init__(self) -> None:
        warnings.warn(
            "GetFlatgrammDcCompanyListRequest is deprecated", DeprecationWarning
        )
        super().__post_init__()


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

    filter: "FlatgrammCompanyRelationFilter" = betterproto.message_field(1)
    """Фильтр связей квартирограмм и компаний"""

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


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

    filter: "DcCompanyFlatgrammFilter" = betterproto.message_field(1)
    """Фильтр связей квартирограмм и домофонной компании"""

    def __post_init__(self) -> None:
        warnings.warn(
            "GetFlatgrammDcCompanyCountRequest is deprecated", DeprecationWarning
        )
        super().__post_init__()


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

    filter: "FlatgrammCompanyRelationFilter" = betterproto.message_field(1)
    """Фильтр связей квартирограмм и компании"""


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

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

    data: int = betterproto.int32_field(2, group="type")
    """Всего связей квартирограмм и домофонной компании"""

    def __post_init__(self) -> None:
        warnings.warn(
            "GetFlatgrammDcCompanyCountResponse is deprecated", DeprecationWarning
        )
        super().__post_init__()


@dataclass(eq=False, repr=False)
class GetFlatgrammDcCompanyCountResponseError(betterproto.Message):
    """Ошибка"""

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


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

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

    data: int = betterproto.int32_field(2, group="type")
    """Всего связей квартирограмм и компаний"""


@dataclass(eq=False, repr=False)
class GetFlatgrammCompanyRelationCountResponseError(betterproto.Message):
    """Ошибка"""

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


@dataclass(eq=False, repr=False)
class DcCompanyFlatgrammPaging(betterproto.Message):
    """Пагинация квартирограмм и домофонной компании"""

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

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

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

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

    def __post_init__(self) -> None:
        warnings.warn("DcCompanyFlatgrammPaging is deprecated", DeprecationWarning)
        super().__post_init__()


@dataclass(eq=False, repr=False)
class FlatgrammCompanyRelationPaging(betterproto.Message):
    """Пагинация квартирограмм и компаний"""

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

    direction_type: "FlatgrammCompanyRelationPagingDirectionType" = (
        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 GetFlatgrammDcCompanyListResponse(betterproto.Message):
    """
    Ответ на запрос получения списка связей квартирограмм и домофонной компании
    """

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

    data: "DcCompanyFlatgramm" = betterproto.message_field(2, group="type")
    """Связь квартирограммы и домофонной компании"""

    def __post_init__(self) -> None:
        warnings.warn(
            "GetFlatgrammDcCompanyListResponse is deprecated", DeprecationWarning
        )
        super().__post_init__()


@dataclass(eq=False, repr=False)
class GetFlatgrammDcCompanyListResponseError(betterproto.Message):
    """Ошибка"""

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


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

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

    data: "FlatgrammCompanyRelation" = betterproto.message_field(2, group="type")
    """Связь квартирограммы и компании"""


@dataclass(eq=False, repr=False)
class GetFlatgrammCompanyRelationListResponseError(betterproto.Message):
    """Ошибка"""

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


@dataclass(eq=False, repr=False)
class PutFlatgrammDcCompanyAttachRequest(betterproto.Message):
    """Запрос сохранения связей квартирограммы и домофонной компании"""

    dc_company_flatgramm: "DcCompanyFlatgramm" = betterproto.message_field(1)
    """Связь квартирограммы и домофонной компании"""

    def __post_init__(self) -> None:
        warnings.warn(
            "PutFlatgrammDcCompanyAttachRequest is deprecated", DeprecationWarning
        )
        super().__post_init__()


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

    flatgramm_company_relation: "FlatgrammCompanyRelation" = betterproto.message_field(
        1
    )
    """Связь квартирограммы и компании"""


@dataclass(eq=False, repr=False)
class PutFlatgrammDcCompanyAttachResponse(betterproto.Message):
    """
    Ответ на запрос сохранения связи квартирограммы и домофонной компании
    """

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

    def __post_init__(self) -> None:
        warnings.warn(
            "PutFlatgrammDcCompanyAttachResponse is deprecated", DeprecationWarning
        )
        super().__post_init__()


@dataclass(eq=False, repr=False)
class PutFlatgrammDcCompanyAttachResponseError(betterproto.Message):
    """Ошибка запроса сохранения связи квартирограммы и домофонной компании"""

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


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

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


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

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


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

    dc_company_flatgramm: "DcCompanyFlatgramm" = betterproto.message_field(1)
    """Связь квартирограммы и домофонной компании"""

    def __post_init__(self) -> None:
        warnings.warn(
            "PutFlatgrammDcCompanyDetachRequest is deprecated", DeprecationWarning
        )
        super().__post_init__()


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

    flatgramm_company_relation: "FlatgrammCompanyRelation" = betterproto.message_field(
        1
    )
    """Связь квартирограммы и компании"""


@dataclass(eq=False, repr=False)
class DcCompanyFlatgramm(betterproto.Message):
    """
    Связка квартирограммы и домофонной компании. Задает область ресурсов
    (resource scope), доступную пользователю. Используется для контроля доступа
    к квартирограмме
    """

    company_id: int = betterproto.int32_field(1)
    """Идентификатор домофонной компании. # Диапазон: 0..2147483647"""

    flatgramm_id: int = betterproto.int32_field(2)
    """Идентификатор квартирограммы. # Диапазон: 0..2147483647"""

    def __post_init__(self) -> None:
        warnings.warn("DcCompanyFlatgramm is deprecated", DeprecationWarning)
        super().__post_init__()


@dataclass(eq=False, repr=False)
class FlatgrammCompanyRelation(betterproto.Message):
    """
    Связка квартирограммы и компании. Задает область ресурсов (resource scope),
    доступную пользователю. Используется для контроля доступа к квартирограмме
    """

    company_id: int = betterproto.int32_field(1)
    """Идентификатор компании. # Диапазон: 1..2147483647"""

    flatgramm_id: int = betterproto.int32_field(2)
    """Идентификатор квартирограммы. # Диапазон: 1..2147483647"""

    type: "FlatgrammCompanyRelationType" = betterproto.enum_field(3)
    """Тип связи компании и квартирограммы"""


@dataclass(eq=False, repr=False)
class DcCompanyFlatgrammFilter(betterproto.Message):
    """
    Фильтр для запроса связей квартирограммы и домофонной компании. При
    передаче массива в параметр фильтра элементы массива работают в выборке
    через ИЛИ. При передаче нескольких разных параметров фильтра они работают в
    выборке через И
    """

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

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

    def __post_init__(self) -> None:
        warnings.warn("DcCompanyFlatgrammFilter is deprecated", DeprecationWarning)
        super().__post_init__()


@dataclass(eq=False, repr=False)
class FlatgrammCompanyRelationFilter(betterproto.Message):
    """
    Фильтр для запроса связей квартирограммы и компании. При передаче массива в
    параметр фильтра элементы массива работают в выборке через ИЛИ. При
    передаче нескольких разных параметров фильтра они работают в выборке через
    И
    """

    flatgramm_ids: List[int] = betterproto.int32_field(1)
    """По Идентификатору квартирограммы"""

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

    flatgramm_company_relation_types: List["FlatgrammCompanyRelationType"] = (
        betterproto.enum_field(3)
    )
    """Тип назначения компании для квартирограммы"""


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

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

    def __post_init__(self) -> None:
        warnings.warn(
            "PutFlatgrammDcCompanyDetachResponse is deprecated", DeprecationWarning
        )
        super().__post_init__()


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

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


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

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


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

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


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

    access_point_id: str = betterproto.string_field(1)
    """Идентификатор точки доступа. # Тип: Guid"""

    group_id: str = betterproto.string_field(2)
    """Идентификатор группы. # Тип: Guid"""


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

    access_point_ids: List[str] = betterproto.string_field(1)
    """По идентификаторам точки доступа. # Тип: Guid"""

    group_ids: List[str] = betterproto.string_field(2)
    """По идентификаторам группы. # Тип: Guid"""


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

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

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

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

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


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

    data: "AccessPointGroup" = betterproto.message_field(1, group="type")
    """Связь точки доступа и группы"""

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


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

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


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

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


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

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

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


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

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


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

    access_point_group: "AccessPointGroup" = betterproto.message_field(1)
    """Связь точки доступа и группы"""


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

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


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

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


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

    access_point_group: "AccessPointGroup" = betterproto.message_field(1)
    """Связь точки доступа и группы"""


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

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


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

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


@dataclass(eq=False, repr=False)
class RoomDevice(betterproto.Message):
    """Связка квартиры и устройства"""

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

    room_number: str = betterproto.string_field(2)
    """Номер квартиры. # Диапазон: 1..4"""

    device_id: int = betterproto.int32_field(3)
    """Идентификатор устройства. # Диапазон: 1..2147483647"""


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

    room_device: "RoomDevice" = betterproto.message_field(1)
    """Связь квартиры и устройства"""


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

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


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

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


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

    room_device: "RoomDevice" = betterproto.message_field(1)
    """Связь квартиры и устройства"""


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

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


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

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


@dataclass(eq=False, repr=False)
class RoomDeviceFilter(betterproto.Message):
    """Фильтр связок помещение-устройство"""

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

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

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

    device_ids: List[int] = betterproto.int32_field(4)
    """По идентификаторам привязанных устройств"""


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

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

    direction_type: "RoomDevicePagingDirectionType" = 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 GetRoomDeviceListRequest(betterproto.Message):
    """Запрос на получение связок помещение-устройство"""

    filter: "RoomDeviceFilter" = betterproto.message_field(1)
    """Фильтр по связкам помещение-устройство"""

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


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

    data: "RoomDevice" = betterproto.message_field(1, group="type")
    """Связка помещение-устройство"""

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


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

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


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

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


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

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


@dataclass(eq=False, repr=False)
class Rfid(betterproto.Message):
    """Ключ. # Описание модели"""

    id: int = betterproto.int32_field(1)
    """Идентификатор ключа. # Диапазон: 0..2147483647"""

    user_id: Optional[int] = betterproto.message_field(2, wraps=betterproto.TYPE_INT32)
    """Идентификатор пользователя"""

    description: Optional[str] = betterproto.message_field(
        3, wraps=betterproto.TYPE_STRING
    )
    """
    Системное описание. Обычно оставляет УК/Админ, пользователь его не видет
    """

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

    creator_id: Optional[int] = betterproto.message_field(
        5, wraps=betterproto.TYPE_INT32
    )
    """Идентификатор создателя"""

    key: str = betterproto.string_field(6)
    """
    Код ключа (UID). Уникальное значение. # Паттерн: /^[0-9a-fA-F]{1,14}$/
    """

    pay_type: "RfidPayType" = betterproto.enum_field(7)
    """Тип оплаты"""

    holder_type: "RfidHolderType" = betterproto.enum_field(8)
    """Тип владельца ключа"""

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

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

    orpon: int = betterproto.int64_field(11)
    """ОРПОН дома. # Диапазон: 1..9223372036854775807"""

    room_number: str = betterproto.string_field(12)
    """Номер квартиры. # Диапазон: 1..4"""


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

    conflict: "RfidSavingErrorConflict" = betterproto.message_field(1, group="reason")
    """Конфликт версий"""

    key_exist: "RfidSavingErrorKeyExist" = betterproto.message_field(2, group="reason")
    """Данный ключ уже существует"""

    key_code_cannot_be_changed: "RfidSavingErrorKeyCodeCannotBeChanged" = (
        betterproto.message_field(3, group="reason")
    )
    """Нельзя изменить код ключа"""

    exceeded_quantity_of_keys_for_room: (
        "RfidSavingErrorExceededQuantityOfKeysForRoom"
    ) = betterproto.message_field(4, group="reason")
    """Превышено максимально допустимое количество ключей (16) для квартиры"""

    key_is_used: "RfidSavingErrorKeyIsUsed" = betterproto.message_field(
        5, group="reason"
    )
    """Ключ используется на другой квартире"""

    holder_type_forbidden: "RfidSavingErrorHolderTypeForbidden" = (
        betterproto.message_field(6, group="reason")
    )
    """Нельзя создавать / изменять ключ с переданным типом владельца"""


@dataclass(eq=False, repr=False)
class RfidSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий. Причины: - В базе хранится другая версия строки, значения
    changed_at отличаются
    """

    pass


@dataclass(eq=False, repr=False)
class RfidSavingErrorKeyExist(betterproto.Message):
    """
    Данный ключ уже существует. Причины: - При попытке создания ключа в системе
    уже существует ключ с таким же кодом
    """

    pass


@dataclass(eq=False, repr=False)
class RfidSavingErrorKeyCodeCannotBeChanged(betterproto.Message):
    """
    Нельзя изменить код ключа. Причины: - При изменении ключа нельзя менять
    поле key (код ключа)
    """

    pass


@dataclass(eq=False, repr=False)
class RfidSavingErrorExceededQuantityOfKeysForRoom(betterproto.Message):
    """Превышено максимально допустимое количество ключей (16) для квартиры"""

    pass


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

    pass


@dataclass(eq=False, repr=False)
class RfidSavingErrorHolderTypeForbidden(betterproto.Message):
    """
    Нельзя создавать / изменять ключ с переданным типом владельца. Доступные
    типы владельца: - Жилец (мастер)
    """

    pass


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

    id: int = betterproto.int32_field(1)
    """Идентификатор ключа. # Диапазон: 0..2147483647"""


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

    data: "Rfid" = betterproto.message_field(1, group="type")
    """Ключ"""

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


@dataclass(eq=False, repr=False)
class GetRfidResponseError(betterproto.Message):
    """Ошибка"""

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


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

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

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


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

    data: "Rfid" = betterproto.message_field(1, group="type")
    """Ключ"""

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


@dataclass(eq=False, repr=False)
class GetRfidListResponseError(betterproto.Message):
    """Ошибка"""

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


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

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


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

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

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


@dataclass(eq=False, repr=False)
class GetRfidCountResponseError(betterproto.Message):
    """Ошибка"""

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


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

    data: "Rfid" = betterproto.message_field(1)
    """Ключ"""


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

    data: "Rfid" = betterproto.message_field(1, group="type")
    """Ключ"""

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


@dataclass(eq=False, repr=False)
class PostRfidResponseError(betterproto.Message):
    """Ошибка"""

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

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


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

    id: int = betterproto.int32_field(1)
    """Идентификатор ключа. # Диапазон: 0..2147483647"""

    is_force_delete: bool = betterproto.bool_field(2)
    """
    Флаг принудительного удаления ключа. При принудительном удалении не
    гарантируется удаление ключа со всех физических устройств
    """


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

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


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

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


@dataclass(eq=False, repr=False)
class RfidFilter(betterproto.Message):
    """Фильтр по ключам"""

    holder_types: List["RfidHolderType"] = betterproto.enum_field(1)
    """По типам владельца"""

    pay_types: List["RfidPayType"] = betterproto.enum_field(2)
    """По типам оплаты"""

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

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

    user_ids: List[int] = betterproto.int32_field(5)
    """По идентификаторам пользователей"""

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

    keys: List[str] = betterproto.string_field(7)
    """По кодам ключа"""


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

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

    direction_type: "RfidPagingDirectionType" = 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 AccessPoint(betterproto.Message):
    """Точка доступа. # Описание модели"""

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

    title: str = betterproto.string_field(2)
    """Наименование. # Диапазон: 3..40"""

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

    device_id: int = betterproto.int32_field(4)
    """Идентификатор устройства. # Диапазон: 1..2147483647"""

    relay_index: Optional[int] = betterproto.message_field(
        5, wraps=betterproto.TYPE_INT32
    )
    """Номер реле. # Диапазон: 0..100"""

    delay: int = betterproto.int32_field(6)
    """Время задержки в секундах. # Диапазон: 1..3600"""

    flatgramm_id: int = betterproto.int32_field(7)
    """Идентификатор квартирограммы. # Диапазон: 1..2147483647"""

    direction_type: "AccessPointDirectionType" = betterproto.enum_field(8)
    """Тип направления"""

    cameras: List["AccessPointCamera"] = betterproto.message_field(9)
    """Список камер"""

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

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

    deleted_at: datetime = betterproto.message_field(12)
    """Дата удаления. # Тип: DateTime?"""


@dataclass(eq=False, repr=False)
class AccessPointCamera(betterproto.Message):
    """Камера"""

    uid: str = betterproto.string_field(1)
    """UID камеры"""

    recognition_types: List["AccessPointCameraRecognitionType"] = (
        betterproto.enum_field(2)
    )
    """Типы распознавания"""


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

    conflict: "AccessPointSavingErrorConflict" = betterproto.message_field(
        1, group="reason"
    )
    """Конфликт версий"""


@dataclass(eq=False, repr=False)
class AccessPointSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий. Причины: - В базе хранится другая версия строки, значения
    changed_at оличаются
    """

    pass


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

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

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

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

    direction_types: List["AccessPointDirectionType"] = betterproto.enum_field(4)
    """По типам направления"""

    group_ids: List[str] = betterproto.string_field(5)
    """По идентификаторам группы. # Тип: Guid"""

    camera_uids: List[str] = betterproto.string_field(6)
    """По идентификаторам камер"""


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

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

    direction_type: "AccessPointPagingDirectionType" = 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 PostAccessPointRequest(betterproto.Message):
    """Запрос на создание/изменение точки доступа"""

    data: "AccessPoint" = betterproto.message_field(1)
    """Точка доступа"""


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

    data: "AccessPoint" = betterproto.message_field(1, group="type")
    """Точка доступа"""

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


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

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

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


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

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

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


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

    data: "AccessPoint" = betterproto.message_field(1, group="type")
    """Точка доступа"""

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


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

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


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

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


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

    data: "AccessPoint" = betterproto.message_field(1, group="type")
    """Точка доступа"""

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


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

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


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

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


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

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

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


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

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


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

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


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

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


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

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


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

    access_point_id: str = betterproto.string_field(1)
    """Идентификатор точки доступа. # Тип: Guid"""

    car_number: Optional[str] = betterproto.message_field(
        2, wraps=betterproto.TYPE_STRING
    )
    """ГРЗ авто. # Диапазон: 3..20"""

    vehicle_type: "PostAccessPointOpenRequestVehicleType" = betterproto.enum_field(3)
    """Тип ТС"""

    courier_company_name: Optional[str] = betterproto.message_field(
        4, wraps=betterproto.TYPE_STRING
    )
    """Наименование курьерской компании. # Диапазон: 3..150"""

    order_number: Optional[str] = betterproto.message_field(
        5, wraps=betterproto.TYPE_STRING
    )
    """Номер заказа. # Диапазон: 3..64"""

    courier_id: Optional[str] = betterproto.message_field(
        6, wraps=betterproto.TYPE_STRING
    )
    """Идентификатор курьера. # Диапазон: 3..64"""


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

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


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

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


@dataclass(eq=False, repr=False)
class RoomUser(betterproto.Message):
    """Связь помещения и пользователя"""

    orpon: int = betterproto.int64_field(1)
    """ОРПОН дома"""

    room_number: str = betterproto.string_field(2)
    """Номер квартиры. # Диапазон: 1..4"""

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


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

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

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


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

    data: "RoomUser" = betterproto.message_field(1, group="type")
    """Связь помещения и пользователя"""

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


@dataclass(eq=False, repr=False)
class GetRoomUserListResponseError(betterproto.Message):
    """Ошибка"""

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


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

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


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

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


@dataclass(eq=False, repr=False)
class RoomUserFilter(betterproto.Message):
    """Фильтр по связям помещений и пользователей"""

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

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

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


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

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

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

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

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


class AccessControlServiceStub(betterproto.ServiceStub):
    async def get_room(
        self,
        get_room_request: "GetRoomRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetRoomResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessControlService/GetRoom",
            get_room_request,
            GetRoomResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_room_list(
        self,
        get_room_list_request: "GetRoomListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetRoomListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.AccessControlService/GetRoomList",
            get_room_list_request,
            GetRoomListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_room_count(
        self,
        get_room_count_request: "GetRoomCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetRoomCountResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessControlService/GetRoomCount",
            get_room_count_request,
            GetRoomCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def patch_room_set_subscription_mode(
        self,
        patch_room_set_subscription_mode_request: "PatchRoomSetSubscriptionModeRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PatchRoomSetSubscriptionModeResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessControlService/PatchRoomSetSubscriptionMode",
            patch_room_set_subscription_mode_request,
            PatchRoomSetSubscriptionModeResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_room_orpon_number_exists(
        self,
        get_room_orpon_number_exists_request: "GetRoomOrponNumberExistsRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetRoomOrponNumberExistsResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessControlService/GetRoomOrponNumberExists",
            get_room_orpon_number_exists_request,
            GetRoomOrponNumberExistsResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


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.access_control.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class BroadcastAlertServiceStub(betterproto.ServiceStub):
    async def post_broadcast_alert_start(
        self,
        post_broadcast_alert_start_request: "PostBroadcastAlertStartRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostBroadcastAlertStartResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.BroadcastAlertService/PostBroadcastAlertStart",
            post_broadcast_alert_start_request,
            PostBroadcastAlertStartResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_broadcast_alert_stop(
        self,
        post_broadcast_alert_stop_request: "PostBroadcastAlertStopRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostBroadcastAlertStopResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.BroadcastAlertService/PostBroadcastAlertStop",
            post_broadcast_alert_stop_request,
            PostBroadcastAlertStopResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class EntranceServiceStub(betterproto.ServiceStub):
    async def post_entrance(
        self,
        post_entrance_request: "PostEntranceRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostEntranceResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.EntranceService/PostEntrance",
            post_entrance_request,
            PostEntranceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_entrance(
        self,
        delete_entrance_request: "DeleteEntranceRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteEntranceResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.EntranceService/DeleteEntrance",
            delete_entrance_request,
            DeleteEntranceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_entrance_list(
        self,
        get_entrance_list_request: "GetEntranceListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetEntranceListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.EntranceService/GetEntranceList",
            get_entrance_list_request,
            GetEntranceListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def put_entrance_device_attach(
        self,
        put_entrance_device_attach_request: "PutEntranceDeviceAttachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutEntranceDeviceAttachResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.EntranceService/PutEntranceDeviceAttach",
            put_entrance_device_attach_request,
            PutEntranceDeviceAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_entrance_device_detach(
        self,
        put_entrance_device_detach_request: "PutEntranceDeviceDetachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutEntranceDeviceDetachResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.EntranceService/PutEntranceDeviceDetach",
            put_entrance_device_detach_request,
            PutEntranceDeviceDetachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_entrance_device_list(
        self,
        get_entrance_device_list_request: "GetEntranceDeviceListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetEntranceDeviceListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.EntranceService/GetEntranceDeviceList",
            get_entrance_device_list_request,
            GetEntranceDeviceListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response


class BuildingServiceStub(betterproto.ServiceStub):
    async def get_building(
        self,
        get_building_request: "GetBuildingRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetBuildingResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.BuildingService/GetBuilding",
            get_building_request,
            GetBuildingResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_building_list(
        self,
        get_building_list_request: "GetBuildingListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetBuildingListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.BuildingService/GetBuildingList",
            get_building_list_request,
            GetBuildingListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_building_count(
        self,
        get_building_count_request: "GetBuildingCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetBuildingCountResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.BuildingService/GetBuildingCount",
            get_building_count_request,
            GetBuildingCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_building_orpon_subscription_mode(
        self,
        get_building_orpon_subscription_mode_request: "GetBuildingOrponSubscriptionModeRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetBuildingOrponSubscriptionModeResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.BuildingService/GetBuildingOrponSubscriptionMode",
            get_building_orpon_subscription_mode_request,
            GetBuildingOrponSubscriptionModeResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_building_orpon_exists(
        self,
        get_building_orpon_exists_request: "GetBuildingOrponExistsRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetBuildingOrponExistsResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.BuildingService/GetBuildingOrponExists",
            get_building_orpon_exists_request,
            GetBuildingOrponExistsResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class FlatgrammServiceStub(betterproto.ServiceStub):
    async def get_flatgramm(
        self,
        get_flatgramm_request: "GetFlatgrammRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetFlatgrammResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgramm",
            get_flatgramm_request,
            GetFlatgrammResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_flatgramm_list(
        self,
        get_flatgramm_list_request: "GetFlatgrammListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetFlatgrammListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammList",
            get_flatgramm_list_request,
            GetFlatgrammListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_flatgramm_count(
        self,
        get_flatgramm_count_request: "GetFlatgrammCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetFlatgrammCountResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammCount",
            get_flatgramm_count_request,
            GetFlatgrammCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_flatgramm_dc_company_list(
        self,
        get_flatgramm_dc_company_list_request: "GetFlatgrammDcCompanyListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetFlatgrammDcCompanyListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammDcCompanyList",
            get_flatgramm_dc_company_list_request,
            GetFlatgrammDcCompanyListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_flatgramm_company_relation_list(
        self,
        get_flatgramm_company_relation_list_request: "GetFlatgrammCompanyRelationListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetFlatgrammCompanyRelationListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammCompanyRelationList",
            get_flatgramm_company_relation_list_request,
            GetFlatgrammCompanyRelationListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_flatgramm_dc_company_count(
        self,
        get_flatgramm_dc_company_count_request: "GetFlatgrammDcCompanyCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetFlatgrammDcCompanyCountResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammDcCompanyCount",
            get_flatgramm_dc_company_count_request,
            GetFlatgrammDcCompanyCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_flatgramm_company_relation_count(
        self,
        get_flatgramm_company_relation_count_request: "GetFlatgrammCompanyRelationCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetFlatgrammCompanyRelationCountResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammCompanyRelationCount",
            get_flatgramm_company_relation_count_request,
            GetFlatgrammCompanyRelationCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_flatgramm_dc_company_attach(
        self,
        put_flatgramm_dc_company_attach_request: "PutFlatgrammDcCompanyAttachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutFlatgrammDcCompanyAttachResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.FlatgrammService/PutFlatgrammDcCompanyAttach",
            put_flatgramm_dc_company_attach_request,
            PutFlatgrammDcCompanyAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_flatgramm_company_relation_attach(
        self,
        put_flatgramm_company_relation_attach_request: "PutFlatgrammCompanyRelationAttachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutFlatgrammCompanyRelationAttachResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.FlatgrammService/PutFlatgrammCompanyRelationAttach",
            put_flatgramm_company_relation_attach_request,
            PutFlatgrammCompanyRelationAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_flatgramm_dc_company_detach(
        self,
        put_flatgramm_dc_company_detach_request: "PutFlatgrammDcCompanyDetachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutFlatgrammDcCompanyDetachResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.FlatgrammService/PutFlatgrammDcCompanyDetach",
            put_flatgramm_dc_company_detach_request,
            PutFlatgrammDcCompanyDetachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_flatgramm_company_relation_detach(
        self,
        put_flatgramm_company_relation_detach_request: "PutFlatgrammCompanyRelationDetachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutFlatgrammCompanyRelationDetachResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.FlatgrammService/PutFlatgrammCompanyRelationDetach",
            put_flatgramm_company_relation_detach_request,
            PutFlatgrammCompanyRelationDetachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class AccessPointGroupServiceStub(betterproto.ServiceStub):
    async def get_access_point_group_list(
        self,
        get_access_point_group_list_request: "GetAccessPointGroupListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetAccessPointGroupListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.AccessPointGroupService/GetAccessPointGroupList",
            get_access_point_group_list_request,
            GetAccessPointGroupListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_access_point_group_count(
        self,
        get_access_point_group_count_request: "GetAccessPointGroupCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetAccessPointGroupCountResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessPointGroupService/GetAccessPointGroupCount",
            get_access_point_group_count_request,
            GetAccessPointGroupCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_access_point_group_attach(
        self,
        put_access_point_group_attach_request: "PutAccessPointGroupAttachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutAccessPointGroupAttachResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessPointGroupService/PutAccessPointGroupAttach",
            put_access_point_group_attach_request,
            PutAccessPointGroupAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_access_point_group_detach(
        self,
        put_access_point_group_detach_request: "PutAccessPointGroupDetachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutAccessPointGroupDetachResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessPointGroupService/PutAccessPointGroupDetach",
            put_access_point_group_detach_request,
            PutAccessPointGroupDetachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class RoomDeviceServiceStub(betterproto.ServiceStub):
    async def put_room_device_attach(
        self,
        put_room_device_attach_request: "PutRoomDeviceAttachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutRoomDeviceAttachResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.RoomDeviceService/PutRoomDeviceAttach",
            put_room_device_attach_request,
            PutRoomDeviceAttachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_room_device_detach(
        self,
        put_room_device_detach_request: "PutRoomDeviceDetachRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutRoomDeviceDetachResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.RoomDeviceService/PutRoomDeviceDetach",
            put_room_device_detach_request,
            PutRoomDeviceDetachResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_room_device_list(
        self,
        get_room_device_list_request: "GetRoomDeviceListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetRoomDeviceListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.RoomDeviceService/GetRoomDeviceList",
            get_room_device_list_request,
            GetRoomDeviceListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_room_device_count(
        self,
        get_room_device_count_request: "GetRoomDeviceCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetRoomDeviceCountResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.RoomDeviceService/GetRoomDeviceCount",
            get_room_device_count_request,
            GetRoomDeviceCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class RfidServiceStub(betterproto.ServiceStub):
    async def get_rfid(
        self,
        get_rfid_request: "GetRfidRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetRfidResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.RfidService/GetRfid",
            get_rfid_request,
            GetRfidResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_rfid_list(
        self,
        get_rfid_list_request: "GetRfidListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetRfidListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.RfidService/GetRfidList",
            get_rfid_list_request,
            GetRfidListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_rfid_count(
        self,
        get_rfid_count_request: "GetRfidCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetRfidCountResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.RfidService/GetRfidCount",
            get_rfid_count_request,
            GetRfidCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_rfid(
        self,
        post_rfid_request: "PostRfidRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostRfidResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.RfidService/PostRfid",
            post_rfid_request,
            PostRfidResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_rfid(
        self,
        delete_rfid_request: "DeleteRfidRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteRfidResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.RfidService/DeleteRfid",
            delete_rfid_request,
            DeleteRfidResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class AccessPointServiceStub(betterproto.ServiceStub):
    async def post_access_point(
        self,
        post_access_point_request: "PostAccessPointRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostAccessPointResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessPointService/PostAccessPoint",
            post_access_point_request,
            PostAccessPointResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_access_point(
        self,
        get_access_point_request: "GetAccessPointRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetAccessPointResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessPointService/GetAccessPoint",
            get_access_point_request,
            GetAccessPointResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_access_point_list(
        self,
        get_access_point_list_request: "GetAccessPointListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetAccessPointListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.AccessPointService/GetAccessPointList",
            get_access_point_list_request,
            GetAccessPointListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_access_point_count(
        self,
        get_access_point_count_request: "GetAccessPointCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetAccessPointCountResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessPointService/GetAccessPointCount",
            get_access_point_count_request,
            GetAccessPointCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_access_point(
        self,
        delete_access_point_request: "DeleteAccessPointRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteAccessPointResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessPointService/DeleteAccessPoint",
            delete_access_point_request,
            DeleteAccessPointResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_access_point_open(
        self,
        post_access_point_open_request: "PostAccessPointOpenRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostAccessPointOpenResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.AccessPointService/PostAccessPointOpen",
            post_access_point_open_request,
            PostAccessPointOpenResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class RoomUserServiceStub(betterproto.ServiceStub):
    async def get_room_user_list(
        self,
        get_room_user_list_request: "GetRoomUserListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetRoomUserListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.access_control.v1.RoomUserService/GetRoomUserList",
            get_room_user_list_request,
            GetRoomUserListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_room_user_count(
        self,
        get_room_user_count_request: "GetRoomUserCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetRoomUserCountResponse":
        return await self._unary_unary(
            "/keyapis.access_control.v1.RoomUserService/GetRoomUserCount",
            get_room_user_count_request,
            GetRoomUserCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class AccessControlServiceBase(ServiceBase):

    async def get_room(self, get_room_request: "GetRoomRequest") -> "GetRoomResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_room_list(
        self, get_room_list_request: "GetRoomListRequest"
    ) -> AsyncIterator["GetRoomListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_room_count(
        self, get_room_count_request: "GetRoomCountRequest"
    ) -> "GetRoomCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def patch_room_set_subscription_mode(
        self,
        patch_room_set_subscription_mode_request: "PatchRoomSetSubscriptionModeRequest",
    ) -> "PatchRoomSetSubscriptionModeResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_room_orpon_number_exists(
        self, get_room_orpon_number_exists_request: "GetRoomOrponNumberExistsRequest"
    ) -> "GetRoomOrponNumberExistsResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_room(
        self, stream: "grpclib.server.Stream[GetRoomRequest, GetRoomResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_room(request)
        await stream.send_message(response)

    async def __rpc_get_room_list(
        self, stream: "grpclib.server.Stream[GetRoomListRequest, GetRoomListResponse]"
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_room_list,
            stream,
            request,
        )

    async def __rpc_get_room_count(
        self, stream: "grpclib.server.Stream[GetRoomCountRequest, GetRoomCountResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_room_count(request)
        await stream.send_message(response)

    async def __rpc_patch_room_set_subscription_mode(
        self,
        stream: "grpclib.server.Stream[PatchRoomSetSubscriptionModeRequest, PatchRoomSetSubscriptionModeResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.patch_room_set_subscription_mode(request)
        await stream.send_message(response)

    async def __rpc_get_room_orpon_number_exists(
        self,
        stream: "grpclib.server.Stream[GetRoomOrponNumberExistsRequest, GetRoomOrponNumberExistsResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_room_orpon_number_exists(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_control.v1.AccessControlService/GetRoom": grpclib.const.Handler(
                self.__rpc_get_room,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRoomRequest,
                GetRoomResponse,
            ),
            "/keyapis.access_control.v1.AccessControlService/GetRoomList": grpclib.const.Handler(
                self.__rpc_get_room_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetRoomListRequest,
                GetRoomListResponse,
            ),
            "/keyapis.access_control.v1.AccessControlService/GetRoomCount": grpclib.const.Handler(
                self.__rpc_get_room_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRoomCountRequest,
                GetRoomCountResponse,
            ),
            "/keyapis.access_control.v1.AccessControlService/PatchRoomSetSubscriptionMode": grpclib.const.Handler(
                self.__rpc_patch_room_set_subscription_mode,
                grpclib.const.Cardinality.UNARY_UNARY,
                PatchRoomSetSubscriptionModeRequest,
                PatchRoomSetSubscriptionModeResponse,
            ),
            "/keyapis.access_control.v1.AccessControlService/GetRoomOrponNumberExists": grpclib.const.Handler(
                self.__rpc_get_room_orpon_number_exists,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRoomOrponNumberExistsRequest,
                GetRoomOrponNumberExistsResponse,
            ),
        }


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.access_control.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }


class BroadcastAlertServiceBase(ServiceBase):

    async def post_broadcast_alert_start(
        self, post_broadcast_alert_start_request: "PostBroadcastAlertStartRequest"
    ) -> "PostBroadcastAlertStartResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_broadcast_alert_stop(
        self, post_broadcast_alert_stop_request: "PostBroadcastAlertStopRequest"
    ) -> "PostBroadcastAlertStopResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_broadcast_alert_start(
        self,
        stream: "grpclib.server.Stream[PostBroadcastAlertStartRequest, PostBroadcastAlertStartResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_broadcast_alert_start(request)
        await stream.send_message(response)

    async def __rpc_post_broadcast_alert_stop(
        self,
        stream: "grpclib.server.Stream[PostBroadcastAlertStopRequest, PostBroadcastAlertStopResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_broadcast_alert_stop(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_control.v1.BroadcastAlertService/PostBroadcastAlertStart": grpclib.const.Handler(
                self.__rpc_post_broadcast_alert_start,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostBroadcastAlertStartRequest,
                PostBroadcastAlertStartResponse,
            ),
            "/keyapis.access_control.v1.BroadcastAlertService/PostBroadcastAlertStop": grpclib.const.Handler(
                self.__rpc_post_broadcast_alert_stop,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostBroadcastAlertStopRequest,
                PostBroadcastAlertStopResponse,
            ),
        }


class EntranceServiceBase(ServiceBase):

    async def post_entrance(
        self, post_entrance_request: "PostEntranceRequest"
    ) -> "PostEntranceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_entrance(
        self, delete_entrance_request: "DeleteEntranceRequest"
    ) -> "DeleteEntranceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_entrance_list(
        self, get_entrance_list_request: "GetEntranceListRequest"
    ) -> AsyncIterator["GetEntranceListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_entrance_device_attach(
        self, put_entrance_device_attach_request: "PutEntranceDeviceAttachRequest"
    ) -> "PutEntranceDeviceAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_entrance_device_detach(
        self, put_entrance_device_detach_request: "PutEntranceDeviceDetachRequest"
    ) -> "PutEntranceDeviceDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_entrance_device_list(
        self, get_entrance_device_list_request: "GetEntranceDeviceListRequest"
    ) -> AsyncIterator["GetEntranceDeviceListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_entrance(
        self, stream: "grpclib.server.Stream[PostEntranceRequest, PostEntranceResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_entrance(request)
        await stream.send_message(response)

    async def __rpc_delete_entrance(
        self,
        stream: "grpclib.server.Stream[DeleteEntranceRequest, DeleteEntranceResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_entrance(request)
        await stream.send_message(response)

    async def __rpc_get_entrance_list(
        self,
        stream: "grpclib.server.Stream[GetEntranceListRequest, GetEntranceListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_entrance_list,
            stream,
            request,
        )

    async def __rpc_put_entrance_device_attach(
        self,
        stream: "grpclib.server.Stream[PutEntranceDeviceAttachRequest, PutEntranceDeviceAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_entrance_device_attach(request)
        await stream.send_message(response)

    async def __rpc_put_entrance_device_detach(
        self,
        stream: "grpclib.server.Stream[PutEntranceDeviceDetachRequest, PutEntranceDeviceDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_entrance_device_detach(request)
        await stream.send_message(response)

    async def __rpc_get_entrance_device_list(
        self,
        stream: "grpclib.server.Stream[GetEntranceDeviceListRequest, GetEntranceDeviceListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_entrance_device_list,
            stream,
            request,
        )

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_control.v1.EntranceService/PostEntrance": grpclib.const.Handler(
                self.__rpc_post_entrance,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostEntranceRequest,
                PostEntranceResponse,
            ),
            "/keyapis.access_control.v1.EntranceService/DeleteEntrance": grpclib.const.Handler(
                self.__rpc_delete_entrance,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteEntranceRequest,
                DeleteEntranceResponse,
            ),
            "/keyapis.access_control.v1.EntranceService/GetEntranceList": grpclib.const.Handler(
                self.__rpc_get_entrance_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetEntranceListRequest,
                GetEntranceListResponse,
            ),
            "/keyapis.access_control.v1.EntranceService/PutEntranceDeviceAttach": grpclib.const.Handler(
                self.__rpc_put_entrance_device_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutEntranceDeviceAttachRequest,
                PutEntranceDeviceAttachResponse,
            ),
            "/keyapis.access_control.v1.EntranceService/PutEntranceDeviceDetach": grpclib.const.Handler(
                self.__rpc_put_entrance_device_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutEntranceDeviceDetachRequest,
                PutEntranceDeviceDetachResponse,
            ),
            "/keyapis.access_control.v1.EntranceService/GetEntranceDeviceList": grpclib.const.Handler(
                self.__rpc_get_entrance_device_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetEntranceDeviceListRequest,
                GetEntranceDeviceListResponse,
            ),
        }


class BuildingServiceBase(ServiceBase):

    async def get_building(
        self, get_building_request: "GetBuildingRequest"
    ) -> "GetBuildingResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_building_list(
        self, get_building_list_request: "GetBuildingListRequest"
    ) -> AsyncIterator["GetBuildingListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_building_count(
        self, get_building_count_request: "GetBuildingCountRequest"
    ) -> "GetBuildingCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_building_orpon_subscription_mode(
        self,
        get_building_orpon_subscription_mode_request: "GetBuildingOrponSubscriptionModeRequest",
    ) -> "GetBuildingOrponSubscriptionModeResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_building_orpon_exists(
        self, get_building_orpon_exists_request: "GetBuildingOrponExistsRequest"
    ) -> "GetBuildingOrponExistsResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_building(
        self, stream: "grpclib.server.Stream[GetBuildingRequest, GetBuildingResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_building(request)
        await stream.send_message(response)

    async def __rpc_get_building_list(
        self,
        stream: "grpclib.server.Stream[GetBuildingListRequest, GetBuildingListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_building_list,
            stream,
            request,
        )

    async def __rpc_get_building_count(
        self,
        stream: "grpclib.server.Stream[GetBuildingCountRequest, GetBuildingCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_building_count(request)
        await stream.send_message(response)

    async def __rpc_get_building_orpon_subscription_mode(
        self,
        stream: "grpclib.server.Stream[GetBuildingOrponSubscriptionModeRequest, GetBuildingOrponSubscriptionModeResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_building_orpon_subscription_mode(request)
        await stream.send_message(response)

    async def __rpc_get_building_orpon_exists(
        self,
        stream: "grpclib.server.Stream[GetBuildingOrponExistsRequest, GetBuildingOrponExistsResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_building_orpon_exists(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_control.v1.BuildingService/GetBuilding": grpclib.const.Handler(
                self.__rpc_get_building,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetBuildingRequest,
                GetBuildingResponse,
            ),
            "/keyapis.access_control.v1.BuildingService/GetBuildingList": grpclib.const.Handler(
                self.__rpc_get_building_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetBuildingListRequest,
                GetBuildingListResponse,
            ),
            "/keyapis.access_control.v1.BuildingService/GetBuildingCount": grpclib.const.Handler(
                self.__rpc_get_building_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetBuildingCountRequest,
                GetBuildingCountResponse,
            ),
            "/keyapis.access_control.v1.BuildingService/GetBuildingOrponSubscriptionMode": grpclib.const.Handler(
                self.__rpc_get_building_orpon_subscription_mode,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetBuildingOrponSubscriptionModeRequest,
                GetBuildingOrponSubscriptionModeResponse,
            ),
            "/keyapis.access_control.v1.BuildingService/GetBuildingOrponExists": grpclib.const.Handler(
                self.__rpc_get_building_orpon_exists,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetBuildingOrponExistsRequest,
                GetBuildingOrponExistsResponse,
            ),
        }


class FlatgrammServiceBase(ServiceBase):

    async def get_flatgramm(
        self, get_flatgramm_request: "GetFlatgrammRequest"
    ) -> "GetFlatgrammResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_flatgramm_list(
        self, get_flatgramm_list_request: "GetFlatgrammListRequest"
    ) -> AsyncIterator["GetFlatgrammListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_flatgramm_count(
        self, get_flatgramm_count_request: "GetFlatgrammCountRequest"
    ) -> "GetFlatgrammCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_flatgramm_dc_company_list(
        self, get_flatgramm_dc_company_list_request: "GetFlatgrammDcCompanyListRequest"
    ) -> AsyncIterator["GetFlatgrammDcCompanyListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_flatgramm_company_relation_list(
        self,
        get_flatgramm_company_relation_list_request: "GetFlatgrammCompanyRelationListRequest",
    ) -> AsyncIterator["GetFlatgrammCompanyRelationListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_flatgramm_dc_company_count(
        self,
        get_flatgramm_dc_company_count_request: "GetFlatgrammDcCompanyCountRequest",
    ) -> "GetFlatgrammDcCompanyCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_flatgramm_company_relation_count(
        self,
        get_flatgramm_company_relation_count_request: "GetFlatgrammCompanyRelationCountRequest",
    ) -> "GetFlatgrammCompanyRelationCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_flatgramm_dc_company_attach(
        self,
        put_flatgramm_dc_company_attach_request: "PutFlatgrammDcCompanyAttachRequest",
    ) -> "PutFlatgrammDcCompanyAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_flatgramm_company_relation_attach(
        self,
        put_flatgramm_company_relation_attach_request: "PutFlatgrammCompanyRelationAttachRequest",
    ) -> "PutFlatgrammCompanyRelationAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_flatgramm_dc_company_detach(
        self,
        put_flatgramm_dc_company_detach_request: "PutFlatgrammDcCompanyDetachRequest",
    ) -> "PutFlatgrammDcCompanyDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_flatgramm_company_relation_detach(
        self,
        put_flatgramm_company_relation_detach_request: "PutFlatgrammCompanyRelationDetachRequest",
    ) -> "PutFlatgrammCompanyRelationDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_flatgramm(
        self, stream: "grpclib.server.Stream[GetFlatgrammRequest, GetFlatgrammResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_flatgramm(request)
        await stream.send_message(response)

    async def __rpc_get_flatgramm_list(
        self,
        stream: "grpclib.server.Stream[GetFlatgrammListRequest, GetFlatgrammListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_flatgramm_list,
            stream,
            request,
        )

    async def __rpc_get_flatgramm_count(
        self,
        stream: "grpclib.server.Stream[GetFlatgrammCountRequest, GetFlatgrammCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_flatgramm_count(request)
        await stream.send_message(response)

    async def __rpc_get_flatgramm_dc_company_list(
        self,
        stream: "grpclib.server.Stream[GetFlatgrammDcCompanyListRequest, GetFlatgrammDcCompanyListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_flatgramm_dc_company_list,
            stream,
            request,
        )

    async def __rpc_get_flatgramm_company_relation_list(
        self,
        stream: "grpclib.server.Stream[GetFlatgrammCompanyRelationListRequest, GetFlatgrammCompanyRelationListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_flatgramm_company_relation_list,
            stream,
            request,
        )

    async def __rpc_get_flatgramm_dc_company_count(
        self,
        stream: "grpclib.server.Stream[GetFlatgrammDcCompanyCountRequest, GetFlatgrammDcCompanyCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_flatgramm_dc_company_count(request)
        await stream.send_message(response)

    async def __rpc_get_flatgramm_company_relation_count(
        self,
        stream: "grpclib.server.Stream[GetFlatgrammCompanyRelationCountRequest, GetFlatgrammCompanyRelationCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_flatgramm_company_relation_count(request)
        await stream.send_message(response)

    async def __rpc_put_flatgramm_dc_company_attach(
        self,
        stream: "grpclib.server.Stream[PutFlatgrammDcCompanyAttachRequest, PutFlatgrammDcCompanyAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_flatgramm_dc_company_attach(request)
        await stream.send_message(response)

    async def __rpc_put_flatgramm_company_relation_attach(
        self,
        stream: "grpclib.server.Stream[PutFlatgrammCompanyRelationAttachRequest, PutFlatgrammCompanyRelationAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_flatgramm_company_relation_attach(request)
        await stream.send_message(response)

    async def __rpc_put_flatgramm_dc_company_detach(
        self,
        stream: "grpclib.server.Stream[PutFlatgrammDcCompanyDetachRequest, PutFlatgrammDcCompanyDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_flatgramm_dc_company_detach(request)
        await stream.send_message(response)

    async def __rpc_put_flatgramm_company_relation_detach(
        self,
        stream: "grpclib.server.Stream[PutFlatgrammCompanyRelationDetachRequest, PutFlatgrammCompanyRelationDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_flatgramm_company_relation_detach(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgramm": grpclib.const.Handler(
                self.__rpc_get_flatgramm,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetFlatgrammRequest,
                GetFlatgrammResponse,
            ),
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammList": grpclib.const.Handler(
                self.__rpc_get_flatgramm_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetFlatgrammListRequest,
                GetFlatgrammListResponse,
            ),
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammCount": grpclib.const.Handler(
                self.__rpc_get_flatgramm_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetFlatgrammCountRequest,
                GetFlatgrammCountResponse,
            ),
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammDcCompanyList": grpclib.const.Handler(
                self.__rpc_get_flatgramm_dc_company_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetFlatgrammDcCompanyListRequest,
                GetFlatgrammDcCompanyListResponse,
            ),
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammCompanyRelationList": grpclib.const.Handler(
                self.__rpc_get_flatgramm_company_relation_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetFlatgrammCompanyRelationListRequest,
                GetFlatgrammCompanyRelationListResponse,
            ),
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammDcCompanyCount": grpclib.const.Handler(
                self.__rpc_get_flatgramm_dc_company_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetFlatgrammDcCompanyCountRequest,
                GetFlatgrammDcCompanyCountResponse,
            ),
            "/keyapis.access_control.v1.FlatgrammService/GetFlatgrammCompanyRelationCount": grpclib.const.Handler(
                self.__rpc_get_flatgramm_company_relation_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetFlatgrammCompanyRelationCountRequest,
                GetFlatgrammCompanyRelationCountResponse,
            ),
            "/keyapis.access_control.v1.FlatgrammService/PutFlatgrammDcCompanyAttach": grpclib.const.Handler(
                self.__rpc_put_flatgramm_dc_company_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutFlatgrammDcCompanyAttachRequest,
                PutFlatgrammDcCompanyAttachResponse,
            ),
            "/keyapis.access_control.v1.FlatgrammService/PutFlatgrammCompanyRelationAttach": grpclib.const.Handler(
                self.__rpc_put_flatgramm_company_relation_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutFlatgrammCompanyRelationAttachRequest,
                PutFlatgrammCompanyRelationAttachResponse,
            ),
            "/keyapis.access_control.v1.FlatgrammService/PutFlatgrammDcCompanyDetach": grpclib.const.Handler(
                self.__rpc_put_flatgramm_dc_company_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutFlatgrammDcCompanyDetachRequest,
                PutFlatgrammDcCompanyDetachResponse,
            ),
            "/keyapis.access_control.v1.FlatgrammService/PutFlatgrammCompanyRelationDetach": grpclib.const.Handler(
                self.__rpc_put_flatgramm_company_relation_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutFlatgrammCompanyRelationDetachRequest,
                PutFlatgrammCompanyRelationDetachResponse,
            ),
        }


class AccessPointGroupServiceBase(ServiceBase):

    async def get_access_point_group_list(
        self, get_access_point_group_list_request: "GetAccessPointGroupListRequest"
    ) -> AsyncIterator["GetAccessPointGroupListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_access_point_group_count(
        self, get_access_point_group_count_request: "GetAccessPointGroupCountRequest"
    ) -> "GetAccessPointGroupCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_access_point_group_attach(
        self, put_access_point_group_attach_request: "PutAccessPointGroupAttachRequest"
    ) -> "PutAccessPointGroupAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_access_point_group_detach(
        self, put_access_point_group_detach_request: "PutAccessPointGroupDetachRequest"
    ) -> "PutAccessPointGroupDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_access_point_group_list(
        self,
        stream: "grpclib.server.Stream[GetAccessPointGroupListRequest, GetAccessPointGroupListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_access_point_group_list,
            stream,
            request,
        )

    async def __rpc_get_access_point_group_count(
        self,
        stream: "grpclib.server.Stream[GetAccessPointGroupCountRequest, GetAccessPointGroupCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_access_point_group_count(request)
        await stream.send_message(response)

    async def __rpc_put_access_point_group_attach(
        self,
        stream: "grpclib.server.Stream[PutAccessPointGroupAttachRequest, PutAccessPointGroupAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_access_point_group_attach(request)
        await stream.send_message(response)

    async def __rpc_put_access_point_group_detach(
        self,
        stream: "grpclib.server.Stream[PutAccessPointGroupDetachRequest, PutAccessPointGroupDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_access_point_group_detach(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_control.v1.AccessPointGroupService/GetAccessPointGroupList": grpclib.const.Handler(
                self.__rpc_get_access_point_group_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetAccessPointGroupListRequest,
                GetAccessPointGroupListResponse,
            ),
            "/keyapis.access_control.v1.AccessPointGroupService/GetAccessPointGroupCount": grpclib.const.Handler(
                self.__rpc_get_access_point_group_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetAccessPointGroupCountRequest,
                GetAccessPointGroupCountResponse,
            ),
            "/keyapis.access_control.v1.AccessPointGroupService/PutAccessPointGroupAttach": grpclib.const.Handler(
                self.__rpc_put_access_point_group_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutAccessPointGroupAttachRequest,
                PutAccessPointGroupAttachResponse,
            ),
            "/keyapis.access_control.v1.AccessPointGroupService/PutAccessPointGroupDetach": grpclib.const.Handler(
                self.__rpc_put_access_point_group_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutAccessPointGroupDetachRequest,
                PutAccessPointGroupDetachResponse,
            ),
        }


class RoomDeviceServiceBase(ServiceBase):

    async def put_room_device_attach(
        self, put_room_device_attach_request: "PutRoomDeviceAttachRequest"
    ) -> "PutRoomDeviceAttachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_room_device_detach(
        self, put_room_device_detach_request: "PutRoomDeviceDetachRequest"
    ) -> "PutRoomDeviceDetachResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_room_device_list(
        self, get_room_device_list_request: "GetRoomDeviceListRequest"
    ) -> AsyncIterator["GetRoomDeviceListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_room_device_count(
        self, get_room_device_count_request: "GetRoomDeviceCountRequest"
    ) -> "GetRoomDeviceCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_put_room_device_attach(
        self,
        stream: "grpclib.server.Stream[PutRoomDeviceAttachRequest, PutRoomDeviceAttachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_room_device_attach(request)
        await stream.send_message(response)

    async def __rpc_put_room_device_detach(
        self,
        stream: "grpclib.server.Stream[PutRoomDeviceDetachRequest, PutRoomDeviceDetachResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_room_device_detach(request)
        await stream.send_message(response)

    async def __rpc_get_room_device_list(
        self,
        stream: "grpclib.server.Stream[GetRoomDeviceListRequest, GetRoomDeviceListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_room_device_list,
            stream,
            request,
        )

    async def __rpc_get_room_device_count(
        self,
        stream: "grpclib.server.Stream[GetRoomDeviceCountRequest, GetRoomDeviceCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_room_device_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_control.v1.RoomDeviceService/PutRoomDeviceAttach": grpclib.const.Handler(
                self.__rpc_put_room_device_attach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutRoomDeviceAttachRequest,
                PutRoomDeviceAttachResponse,
            ),
            "/keyapis.access_control.v1.RoomDeviceService/PutRoomDeviceDetach": grpclib.const.Handler(
                self.__rpc_put_room_device_detach,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutRoomDeviceDetachRequest,
                PutRoomDeviceDetachResponse,
            ),
            "/keyapis.access_control.v1.RoomDeviceService/GetRoomDeviceList": grpclib.const.Handler(
                self.__rpc_get_room_device_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetRoomDeviceListRequest,
                GetRoomDeviceListResponse,
            ),
            "/keyapis.access_control.v1.RoomDeviceService/GetRoomDeviceCount": grpclib.const.Handler(
                self.__rpc_get_room_device_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRoomDeviceCountRequest,
                GetRoomDeviceCountResponse,
            ),
        }


class RfidServiceBase(ServiceBase):

    async def get_rfid(self, get_rfid_request: "GetRfidRequest") -> "GetRfidResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_rfid_list(
        self, get_rfid_list_request: "GetRfidListRequest"
    ) -> AsyncIterator["GetRfidListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_rfid_count(
        self, get_rfid_count_request: "GetRfidCountRequest"
    ) -> "GetRfidCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_rfid(
        self, post_rfid_request: "PostRfidRequest"
    ) -> "PostRfidResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_rfid(
        self, delete_rfid_request: "DeleteRfidRequest"
    ) -> "DeleteRfidResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_rfid(
        self, stream: "grpclib.server.Stream[GetRfidRequest, GetRfidResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_rfid(request)
        await stream.send_message(response)

    async def __rpc_get_rfid_list(
        self, stream: "grpclib.server.Stream[GetRfidListRequest, GetRfidListResponse]"
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_rfid_list,
            stream,
            request,
        )

    async def __rpc_get_rfid_count(
        self, stream: "grpclib.server.Stream[GetRfidCountRequest, GetRfidCountResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_rfid_count(request)
        await stream.send_message(response)

    async def __rpc_post_rfid(
        self, stream: "grpclib.server.Stream[PostRfidRequest, PostRfidResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_rfid(request)
        await stream.send_message(response)

    async def __rpc_delete_rfid(
        self, stream: "grpclib.server.Stream[DeleteRfidRequest, DeleteRfidResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_rfid(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_control.v1.RfidService/GetRfid": grpclib.const.Handler(
                self.__rpc_get_rfid,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRfidRequest,
                GetRfidResponse,
            ),
            "/keyapis.access_control.v1.RfidService/GetRfidList": grpclib.const.Handler(
                self.__rpc_get_rfid_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetRfidListRequest,
                GetRfidListResponse,
            ),
            "/keyapis.access_control.v1.RfidService/GetRfidCount": grpclib.const.Handler(
                self.__rpc_get_rfid_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRfidCountRequest,
                GetRfidCountResponse,
            ),
            "/keyapis.access_control.v1.RfidService/PostRfid": grpclib.const.Handler(
                self.__rpc_post_rfid,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostRfidRequest,
                PostRfidResponse,
            ),
            "/keyapis.access_control.v1.RfidService/DeleteRfid": grpclib.const.Handler(
                self.__rpc_delete_rfid,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteRfidRequest,
                DeleteRfidResponse,
            ),
        }


class AccessPointServiceBase(ServiceBase):

    async def post_access_point(
        self, post_access_point_request: "PostAccessPointRequest"
    ) -> "PostAccessPointResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_access_point(
        self, get_access_point_request: "GetAccessPointRequest"
    ) -> "GetAccessPointResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_access_point_list(
        self, get_access_point_list_request: "GetAccessPointListRequest"
    ) -> AsyncIterator["GetAccessPointListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_access_point_count(
        self, get_access_point_count_request: "GetAccessPointCountRequest"
    ) -> "GetAccessPointCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_access_point(
        self, delete_access_point_request: "DeleteAccessPointRequest"
    ) -> "DeleteAccessPointResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_access_point_open(
        self, post_access_point_open_request: "PostAccessPointOpenRequest"
    ) -> "PostAccessPointOpenResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_access_point(
        self,
        stream: "grpclib.server.Stream[PostAccessPointRequest, PostAccessPointResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_access_point(request)
        await stream.send_message(response)

    async def __rpc_get_access_point(
        self,
        stream: "grpclib.server.Stream[GetAccessPointRequest, GetAccessPointResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_access_point(request)
        await stream.send_message(response)

    async def __rpc_get_access_point_list(
        self,
        stream: "grpclib.server.Stream[GetAccessPointListRequest, GetAccessPointListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_access_point_list,
            stream,
            request,
        )

    async def __rpc_get_access_point_count(
        self,
        stream: "grpclib.server.Stream[GetAccessPointCountRequest, GetAccessPointCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_access_point_count(request)
        await stream.send_message(response)

    async def __rpc_delete_access_point(
        self,
        stream: "grpclib.server.Stream[DeleteAccessPointRequest, DeleteAccessPointResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_access_point(request)
        await stream.send_message(response)

    async def __rpc_post_access_point_open(
        self,
        stream: "grpclib.server.Stream[PostAccessPointOpenRequest, PostAccessPointOpenResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_access_point_open(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_control.v1.AccessPointService/PostAccessPoint": grpclib.const.Handler(
                self.__rpc_post_access_point,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostAccessPointRequest,
                PostAccessPointResponse,
            ),
            "/keyapis.access_control.v1.AccessPointService/GetAccessPoint": grpclib.const.Handler(
                self.__rpc_get_access_point,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetAccessPointRequest,
                GetAccessPointResponse,
            ),
            "/keyapis.access_control.v1.AccessPointService/GetAccessPointList": grpclib.const.Handler(
                self.__rpc_get_access_point_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetAccessPointListRequest,
                GetAccessPointListResponse,
            ),
            "/keyapis.access_control.v1.AccessPointService/GetAccessPointCount": grpclib.const.Handler(
                self.__rpc_get_access_point_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetAccessPointCountRequest,
                GetAccessPointCountResponse,
            ),
            "/keyapis.access_control.v1.AccessPointService/DeleteAccessPoint": grpclib.const.Handler(
                self.__rpc_delete_access_point,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteAccessPointRequest,
                DeleteAccessPointResponse,
            ),
            "/keyapis.access_control.v1.AccessPointService/PostAccessPointOpen": grpclib.const.Handler(
                self.__rpc_post_access_point_open,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostAccessPointOpenRequest,
                PostAccessPointOpenResponse,
            ),
        }


class RoomUserServiceBase(ServiceBase):

    async def get_room_user_list(
        self, get_room_user_list_request: "GetRoomUserListRequest"
    ) -> AsyncIterator["GetRoomUserListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_room_user_count(
        self, get_room_user_count_request: "GetRoomUserCountRequest"
    ) -> "GetRoomUserCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_room_user_list(
        self,
        stream: "grpclib.server.Stream[GetRoomUserListRequest, GetRoomUserListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_room_user_list,
            stream,
            request,
        )

    async def __rpc_get_room_user_count(
        self,
        stream: "grpclib.server.Stream[GetRoomUserCountRequest, GetRoomUserCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_room_user_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.access_control.v1.RoomUserService/GetRoomUserList": grpclib.const.Handler(
                self.__rpc_get_room_user_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetRoomUserListRequest,
                GetRoomUserListResponse,
            ),
            "/keyapis.access_control.v1.RoomUserService/GetRoomUserCount": grpclib.const.Handler(
                self.__rpc_get_room_user_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetRoomUserCountRequest,
                GetRoomUserCountResponse,
            ),
        }
