Видеонаблюдение — услуга под ключ
Видеонаблюдение (/admin/video/) — продажа и
обслуживание видеонаблюдения как услуги: от заявки до ежемесячной абонплаты.
Модуль ведёт объекты клиента с камерами, воронку монтажных проектов с
документами, пульт оператора охраны, собственный медиа-сервер и архив записей.
Деньги идут через отдельный лицевой счёт объекта, оборудование — через
склад, сделки — общие с CRM.
Шесть шагов работы с модулем на живых экранах: объекты и камеры, проекты, подписки и оплата.
Как устроен модуль
Ядро — объект наблюдения: адрес клиента, на котором стоят камеры. У объекта свой лицевой счёт, поэтому долг за видео отключает камеры, но не трогает интернет. Всё остальное навешивается на объект:
flowchart LR A["Клиент"] --> B["Объект наблюдения"] B --> C["Камеры"] B --> D["Оборудование"] B --> E["Подписки"] B --> F["Проект (сделка)"] E --> G["Ежемесячные списания"] C --> H["Медиа-сервер"] H --> I["Архив записей"] B --> J["Пульт ЧОПа"]
Все страницы раздела устроены одинаково (каркас списков биллинга): в шапке — название и главные действия, под ней сводка, затем строка срезов со счётчиками, поиск и выбор колонок. Действия со строкой — в меню ⋮, окна открываются поверх списка, удаление всегда спрашивает подтверждение и перечисляет, что уйдёт вместе с записью. Каждое изменение пишется в журнал в виде «было → стало»; если ничего не поменялось, окно отвечает «Изменений нет» и журнал не трогает.
Сводка на дашборде
| Показатель | Как считается |
|---|---|
| Объекты, камеры | всё, что видно сотруднику по его организациям; клик ведёт в список |
| Проектов в работе | все стадии, кроме «Сдан» и «Отменён», из общего числа проектов |
| Абонплата в месяц | сумма активных подписок; облачный архив — за каждую камеру. Та же формула — в сводке объектов |
| В работе по проектам | сумма проектов, которые ещё не сданы и не отменены |
| Проектов сдано | доля проектов, дошедших до стадий «Сдан» или «На сервисе» |
| Объектов с подпиской | доля объектов, у которых есть хотя бы одна активная подписка |
Полоса «Камер в облачном архиве» показывает, сколько осталось до порога, после которого своё облако выгоднее аренды. Кнопка «Удалить демо-данные» видна только суперадминистратору и только когда такие данные есть; чтобы удалить, нужно ввести число удаляемых объектов.
Объект и проект — разные вещи. Объект живёт постоянно (камеры, подписки, архив), проект — это разовая сделка на монтаж или расширение. У одного объекта может быть несколько проектов: первая очередь, вторая, ремонт после грозы.
Объекты и камеры
Список объектов — /admin/video/objects/. Сводка показывает,
сколько камер в эфире из общего числа, абонплату в месяц и объём облачного
архива (если архив в облаке включён). Срезы со счётчиками:
- Камеры не в эфире — хотя бы одна камера объекта сейчас не отдаёт видео. Срез появляется, только когда медиа-сервер ответил: без его ответа система не выдаёт «ноль в эфире» за факт.
- С подписками и Без подписок.
- Камеры отключены — камеры погашены за долг.
- С долгом — отрицательный баланс счёта объекта.
Рядом — поиск по объекту, адресу и клиенту, выбор типа и организации, настройка колонок (баланс и архив по умолчанию скрыты) и выгрузка показанных строк в CSV. Колонка «В эфире» — «3 / 4» зелёным, если все камеры работают, жёлтым — если часть, красным — если ни одна. Под названием объекта — метки «камеры отключены» и «долг». Клик по клиенту открывает его боковую панель, по названию — вкладку «Видео» в карточке клиента.
Окно объекта: клиент (при создании — поиск по имени, договору, телефону, адресу), название, тип, организация, адрес и заметка. Для типа «Охраняемый объект (ЧОП)» окно подсказывает, что объект появится на пульте. Организация «как у клиента» берётся из карточки клиента — объект без организации больше не остаётся «ничьим» и не виден чужим компаниям. Адрес по умолчанию подставляется из карточки клиента; кнопка «Подставить адрес клиента» возвращает его, если вписали другой.
Удаление спрашивает подтверждение и перечисляет, что уйдёт вместе с объектом: камеры, оборудование, проекты и активные подписки (их списания прекратятся). В журнал записывается, сколько чего было удалено.
Тот же список объектов клиента доступен из его карточки — вкладка «Видео», там же камеры, оборудование и подписки.
Проекты: воронка и документы
Путь проекта от заявки до абонплаты:
flowchart LR L["Заявка"] --> S["Обследование"] S --> D["Проект / КП"] D --> C["Договор"] C --> M["Монтаж"] M --> P["ПНР"] P --> G["Сдан"] G --> V["На сервисе"] D -. "КП, согласие ПДн" .-> DOC["Документы"] C -. "договор" .-> DOC G -. "акт сдачи-приёмки" .-> DOC V --> B["Ежемесячная абонплата"]
Канбан проектов — /admin/video/projects/. Девять стадий: заявка,
обследование, проект/КП, договор, монтаж, ПНР, сдан, на сервисе, отменён. В
шапке колонки — количество сделок и сумма по стадии, в сводке — сколько
проектов в работе и на какую сумму. Поиск ищет по проекту, объекту и клиенту,
фильтр — по сегменту.
Стадию меняют перетаскиванием карточки или из меню ⋮ → «Сменить стадию». Меню карточки: изменить, сменить стадию, четыре документа, сделка в CRM, камеры клиента, удалить. На доске видны и сделки, заведённые в CRM без объекта, — у них подпись «объект не указан» и нет кнопок документов.
Окно проекта открывается кликом по названию: название, сегмент, число камер, смета оборудования и работ, итог по предложению (пусто — сумма двух смет, подсказка под полем показывает её) и комментарий. Отрицательные суммы сервер не примет. В журнал записываются изменённые поля и смена стадии словами — «Заявка» → «Договор».
Новая заявка — кнопкой «+ Заявка»: клиент, объект (можно создать новый по названию заявки), название, сегмент и примерное число камер. Смету заполняют позже.
Проект видеонаблюдения — это та же сделка, что в CRM
(deal_type='video'), просто показанная в своём разрезе. Кнопка
«Воронка в CRM» открывает воронку видеонаблюдения, из карточки сделки —
задачи, звонки, теги и история стадий. Старый адрес заявок
/admin/video/leads/ тоже ведёт в эту воронку.
С карточки проекта печатаются документы: коммерческое предложение, договор,
акт сдачи-приёмки и согласие на обработку персональных данных (152-ФЗ). Тексты
редактируются в едином центре документов /admin/documents/templates/
— шапка с реквизитами, логотип и печать берутся из брендинга организации.
Сервисные планы и подписки
Как подписка превращается в деньги:
flowchart LR PL["Сервисный план"] --> SUB["Подписка объекта"] SUB --> UU["Периодическая услуга"] UU --> BW["Списание раз в месяц"] BW --> ACC["Счёт объекта"] ACC -- "минус" --> BLK["Камеры отключены"] ACC -- "оплачен" --> OK["Камеры работают"]
Счёт видеонаблюдения отдельный: долг гасит камеры, но интернет клиента продолжает работать. Обратное поведение включается настройкой «Отключать и интернет».
/admin/video/plans/ — карточки планов обслуживания, их удобно
сравнивать между собой. Срезы: активные, выключенные и без услуги
списания — подписка по такому плану не списывается. В сводке —
число активных подписок по всем планам.
Окно плана из трёх разделов:
- План — название, диапазон камер (0 в поле «до» — без верхней границы), цена в месяц, предлагать ли при подключении.
- Условия — срок архива (указывается в согласии на обработку персональных данных), время реакции в минутах, текст реакции для клиента, видеоаналитика, плановый осмотр раз в квартал. Время реакции в минутах — норма, по которой отчётность ЧОП считает тревоги, принятые вовремя; пока оно не задано, в отчёте прочерк.
- Списание — услуга каталога и сопутствующие услуги пакета (услуги с типом «Видеонаблюдение»).
Новая цена не меняет сумму уже подключённых подписок — окно предупреждает об этом, если на плане есть подписки. План, выбранный хотя бы в одной подписке, удалить нельзя: его выключают, и новые подписки его не видят.
Подписка привязывает план к объекту и создаёт периодическую услугу
(system_type=20), которую биллинг списывает раз в месяц — с
отдельного счёта объекта, без скидок интернет-лояльности.
Каталог оборудования и склад
/admin/video/models/ — справочник моделей: камеры, регистраторы,
PoE-коммутаторы, ИБП, накопители, коммутаторы. Срезы — по типу со счётчиками,
рядом выбор состояния (активные, выключенные, без связи со складом). Колонка
«На объектах» показывает, у скольких камер и устройств модель
уже выбрана.
Окно модели — разделы «Модель» (тип, бренд, модель, разрешение, поворотная, уличная, цена-ориентир, предлагать ли в окне камеры) и «Склад и паспорт» (позиция склада, ссылка на паспорт, заметка). Паспорт открывается из меню строки. Выключить и включить модель можно прямо из меню — меняется только это поле.
Модель, выбранную у камер, удалить нельзя: окно заранее говорит, что её выключат, и перечисляет, сколько раз она используется. Новые камеры такую модель не увидят, выбранные останутся.
Модель связывается с позицией склада. Тогда в каталоге видно фото, закупочную цену и остаток, а в карточке сделки считается экономика проекта: смета оборудования и работ против фактической себестоимости списанного со склада, маржа в рублях и процентах. Пока по сделке ничего не списано, маржа не показывается — иначе она равнялась бы всей сумме КП.
Медиа-сервер
Состояния камеры и что с ними делать:
stateDiagram-v2 [*] --> Заведена_в_биллинге Заведена_в_биллинге --> Не_заведена: потока на сервере нет Не_заведена --> В_эфире: кнопка «Завести» В_эфире --> Нет_сигнала: источник молчит Нет_сигнала --> В_эфире: связь восстановилась В_эфире --> Выключена: снята «Транслировать камеру» Выключена --> В_эфире: включили обратно
«Не заведена» и «нет сигнала» — разные неисправности. Первая лечится кнопкой в биллинге, вторая — выездом или проверкой канала: поток создан, но камера не отдаёт картинку.
/admin/video/streams/ — все потоки медиа-сервера и их
сопоставление с камерами биллинга. Над списком — состояние связи с сервером и
предупреждение, если не задан адрес для просмотра (без него камеры не открыть);
адреса задаются в настройках. В сводке — сколько
человек смотрят камеры сейчас. Срезы: в эфире, не в эфире, не
заведены (камера есть в биллинге, потока на сервере нет), без
камеры (поток есть только на сервере) и с архивом.
Меню строки: смотреть, архив записей, изменить камеру, клиент. У незаведённой камеры вместо «Смотреть» — «Завести поток», рядом та же кнопка «Завести». «Завести все» в шапке создаёт потоки для всех таких камер разом; камеры с ошибкой в адресе остаются в срезе и перечисляются в уведомлении.
Окно просмотра — живое видео и записи за сутки; клик по фрагменту проигрывает его, «Весь архив камеры» открывает страницу архива. Окно камеры — объект и клиент (при создании — выбор клиента и его объекта), метка зоны, адрес источника видео и переключатель «Транслировать камеру».
Пароли камер не показываются. В списке и в API строка
источника маскируется (rtsp://user:•••@host). Оставьте строку как
есть — пароль не изменится. Полный адрес открывает только администратор —
кнопкой с глазом в окне камеры, и каждый показ записывается в журнал.
Архив записей
Архив камеры открывается из медиа-сервера или карточки объекта. На странице живой поток, шкала суток с сегментами записи и список фрагментов.
- Выбор даты — стрелки день назад и вперёд, поле даты, кнопка «Сегодня». Без выбора показываются последние сутки.
- Шкала — 24 часа с отметками записи: сразу видно, в котором часу записи нет. Клик по сегменту проигрывает фрагмент.
- Кадр — сохранить текущий стоп-кадр камеры.
- Скачать фрагмент — значок у каждого интервала, файл mp4 отдаёт медиа-сервер.
Пульт ЧОПа
Жизненный цикл тревоги — и откуда берётся время реакции:
stateDiagram-v2
[*] --> Новая: сигнал с объекта
Новая --> Принята: дежурный нажал «Принять»
Новая --> Ложная: помечена ложной
Принята --> Обработана: выезд завершён
Принята --> Ложная: подтвердилась как ложная
Обработана --> [*]
Ложная --> [*]
note right of Принята
время от «Новой» до «Принята»
и есть время реакции в отчёте
end note
/admin/dispatch/ — рабочее место дежурного охраны: стена камер
охраняемых объектов на всю ширину, счётчики, список объектов и панель тревог.
Плитка камеры показывает своё состояние: «в эфире», «нет сигнала» (поток есть,
источник молчит), «не заведена» или «выключена»; снизу — название камеры и
объекта. Клик по объекту в списке оставляет на стене только его камеры.
У тревоги всегда одно очевидное действие: новая — «Принять», принятая — «Обработана»; «Ложная» спрашивает подтверждение, потому что тревога закроется без выезда. Закрытую тревогу повторно не изменить. Рядом видно, кто принял и когда, а у непринятой тикает счётчик ожидания — это и есть время реакции. Новая тревога поднимает баннер со звуком; при открытии пульта баннер о неразобранной тревоге показывается без звука.
Кнопка «+ Тревога» регистрирует тревогу вручную: объект, что случилось, комментарий.
Кнопка с антенной открывает приёмник сигналов охранных панелей:
- Приём — адрес, на который приёмник охранного предприятия отправляет сигналы (кнопка копирования), включение приёма, секретный ключ (в браузер не отдаётся; оставьте поле как есть, чтобы не менять), разрешённые адреса и через сколько минут молчания объекта создать тревогу «Потеря связи». Объект находится по пультовому номеру из карточки объекта.
- Уведомления — сообщения о тревогах в группу Telegram (и тему в ней) и push-уведомления сотрудникам.
- Проверка — отправить сигнал без панели: пультовый номер, тип, зона. Проверка создаёт настоящую тревогу, поэтому спрашивает подтверждение и записывается в журнал.
На телефоне тревоги стоят первым блоком, выше стены камер: дежурный не должен пролистывать десятки плиток, чтобы увидеть тревогу.
Отчётность ЧОП
/admin/video/reports/ — отчёт по охраняемым объектам за период.
Период (7, 30, 90 дней, год) и «Выгрузить» в CSV — в шапке; выгрузка всегда
берёт выбранный период. Сводка: средняя доступность, средняя реакция (медиана —
в подсказке), доля тревог, принятых вовремя, абонплата в месяц, число объектов
охраны и тревог за период.
Ниже — графики доступности по дням и тревог со средним временем реакции, таблица по объектам (доступность, простой, тревоги, реакция с нормой из плана, абонплата; колонки настраиваются), сводки по охранным предприятиям и по дежурным.
Доступность считается по событиям потери и восстановления связи. Если таких событий за период не было, отчёт ставит прочерк, а не рисует ровные 100 %, которых никто не измерял. «Тревог принято вовремя» считается только по объектам, у плана которых задано время реакции в минутах.
Права и организации
flowchart TD
U["Сотрудник"] --> O{"Его организации"}
O -->|"свои"| VIS["Объекты, камеры, сметы, тревоги"]
O -->|"чужие"| X404["404 даже по прямой ссылке"]
U --> R{"Права разделов"}
R -->|"sec_video"| SV["Раздел «Видеонаблюдение»"]
R -->|"sec_dispatch"| SD["Пульт ЧОПа"]
Раздел скоупится по организациям: сотрудник видит объекты, камеры, сметы и тревоги только своих компаний, а переключатель организации в шапке фильтрует списки. Переход по прямой ссылке на чужой объект отдаёт 404.
Права разведены на два ключа:
sec_video— раздел «Видеонаблюдение»: объекты, проекты, планы, каталог, медиа-сервер, отчётность;sec_dispatch— пульт ЧОПа. Группаsecurity_operatorзаведена для операторов охраны: пульт им нужен, воронка продаж со сметами — нет.
Настраиваются в /admin/settings/permission_settings/.
Настройки модуля
/admin/video/settings/ — четыре группы:
- Основные — включение модуля, отдельный счёт под видеонаблюдение.
- Оплата и отключения — отключать камеры при долге, отключать ли заодно интернет (по умолчанию нет), аванс по проекту от 0 до 100 %, партнёрская услуга «Реагирование охраны».
- Медиа-сервер — где хранится видео (свой медиа-сервер, облако партнёра или запись на регистраторе клиента), внутренний адрес медиа-сервера, адрес для просмотра (через него камеры смотрят сотрудники и клиенты), ключ доступа к облаку партнёра и проверка связи. Ключ на странице не показывается: оставьте поле как есть, чтобы не менять.
- Архив записей — запись камер на диск сервера, копия в облачное хранилище, папка в хранилище и удаление записи с диска после копирования.
Внизу — панель сохранения: сколько полей изменено и кнопка «Вернуть как было». «Сохранить» показывает список изменений и спрашивает подтверждение (отдельно предупреждает, если включается удаление записей с диска). В журнал пишется только изменённое, «было → стало». Шаблоны документов и сервисные планы открываются кнопками в шапке.
Чек-лист запуска
- Включить модуль в
/admin/settings/modules/. - Завести услуги типа «Видеонаблюдение» в каталоге услуг и сервисные планы на их основе; в плане задать время реакции в минутах, если есть охрана.
- Наполнить каталог моделей и связать их с позициями склада — иначе себестоимость проектов не сойдётся.
- Настроить медиа-сервер: внутренний адрес и адрес для просмотра камер.
- Включить архив, если записи хранятся на своей стороне.
- Раздать права:
sec_videoинженерам и продажам,sec_dispatch— операторам пульта. - Завести первый объект, камеру и подписку; проверить, что списание прошло по счёту объекта.
Видеонаблюдение — доп.услуга «под ключ»
Модуль продажи видеонаблюдения через биллинг: от заявки и обследования до монтажа, recurring-подписок и документов. Реализован как собственный сервисно-инсталляционный домен (объект → проект → камеры/оборудование → подписки), а не плоская интеграция. Использует существующее ядро биллинга: тарификацию Usluga/UsersUsluga, ежемесячное списание billing_worker, FinanceOperations, генерацию PDF (WeasyPrint), фискализацию.
3 слоя дохода — как продавать правильно
Ключевой принцип: маржа бизнеса — в recurring-подписке, а не в разовом монтаже. Продажа только «установки под ключ» убыточна, потому что облако (хранилище, трафик) — постоянная затрата, которую нужно отбивать ежемесячной платой.
| Слой | Услуга | Цена | Тип |
|---|---|---|---|
| 1. Разовый проект | Установка камеры под ключ | 13 500 ₽ | разово |
| 2. Облако на камеру | Cloud Start (архив 7 дн) | 490 ₽/камера/мес | recurring |
| 2. Облако на камеру | Cloud Pro (архив 30 дн + аналитика) | 690 ₽/камера/мес | recurring |
| 3. Сервис на объект | Сервис Home (до 4 камер, ТО+гарантия) | 390 ₽/мес | recurring |
| 3. Сервис на объект | Сервис Pro (5+ камер, SLA-выезд) | 990 ₽/мес | recurring |
Пример экономики (частный дом, 4 камеры): установка 13 500 ₽ разово + recurring 4×490 (облако) + 390 (сервис) = 2 350 ₽/мес = 28 200 ₽/год. Recurring-слой — это то, чего нет при продаже «только установки».
Цены хранятся в каталоге услуг (Usluga.summa, тип «Видеонаблюдение») и редактируются оператором. Конкретная сумма подписки берётся из услуги/плана, но может быть переопределена индивидуально на клиенте.
Жизненный цикл сделки — от заявки до ежемесячной выручки:
flowchart LR L["📥 Заявка
VideoLead"] --> P["📋 Проект
обследование · КП · договор"] P --> I["🔧 Монтаж + ПНР
разовый платёж 13 500 ₽"] I --> O["🏠 Объект сдан
VideoObject"] O --> S["🔁 Подписки
облако + сервис"] S --> B["💰 billing_worker
списание/мес с видео-счёта"] B -.->|каждый месяц| S style L fill:#eef2ff,stroke:#6366f1,color:#1b1b1b style I fill:#fef9c3,stroke:#ca8a04,color:#1b1b1b style S fill:#dcfce7,stroke:#16a34a,color:#1b1b1b style B fill:#43b77a,stroke:#2d9a5f,color:#fff
Раздел /admin/video/
Раздел сайдбара «Видеонаблюдение» с 5 страницами: дашборд, проекты (канбан), объекты, сервисные планы, заявки.
- Дашборд — 8 KPI: объекты, камеры, активные проекты, подписки, MRR (recurring/мес), сумма воронки, конверсия, attach-rate; воронка проектов по 9 статусам; последние проекты.
- Проекты (канбан) — drag-drop по статусам (Заявка → Обследование → Проект/КП → Договор → Монтаж → ПНР → Сдан → На сервисе); на карточке — кнопки документов.
- Сервисные планы — CRUD SLA-пакетов (камеры от/до, цена/мес, SLA-реакция, health-check, связь с услугой каталога).
UI/UX раздела
В разделе есть фильтры, редактирование в модальных окнах, просмотр камер, тёмная тема и работа с телефона:
- Объекты — фильтры по типу и компании, чипы «С подписками / Заблокированные / Долг» со счётчиками, редактирование и удаление в модальных окнах (с выбором организации), цветовая индикация баланса (красный долг / зелёный плюс).
- Проекты — на карточке лейбл организации; меню «⋮» содержит Редактировать и Удалить (модалка редактирования сметы + confirm-удаление).
- Медиа-сервер — отдельная колонка «Клиент», фильтры (онлайн / оффлайн / архив / не привязан), модалка просмотра камеры (live-видео через HLS + список архивных записей за 24ч), добавление/редактирование потока с привязкой к клиенту и автоматическим заведением в go2rtc.
- Настройки — раскладка в 2 колонки на десктопе; новая группа «Архив записей (MediaMTX + GCS)» с тумблером
Записывать в GCS(резервное копирование сегментов архива в облако через Celery-задачуvideo-archive-gcs-upload). - Тёмная тема и мобильный — бейджи и блоки кода читаемы в тёмной теме; на экранах уже 768 px широкие таблицы показываются карточками.
Превью камер, просмотр в модалке и «Диск, Гб»
Доработка раздела «Объекты» и панели объекта: камеры теперь с превью и просмотром live/архива прямо в модальном окне, без перехода на другую страницу.
- Превью камер в панели объекта — при клике на клиента в списке «Объекты» открывается боковая панель (drawer), а в ней блок «Видеонаблюдение» → панель объекта со списком камер. Каждая камера показана стоп-кадром (snapshot go2rtc
/api/frame.jpeg), а если поток не заведён — плейсхолдером. - Кнопки «Трансляция / Архив / Поток» у каждой камеры. Трансляция и Архив открываются в модальном окне (плеер в iframe поверх панели), не в новой вкладке. Клик по самому превью также открывает трансляцию. Внутри модалки есть кнопка «открыть в новой вкладке» и закрытие по Esc / клику вне / крестику (поток и звук останавливаются при закрытии).
- Страница архива камеры (
/admin/video/camera/<id>/archive/) — live-видео (HLS через hls.js) + таймлайн архивных записей за 24 часа с возможностью проиграть любой фрагмент. Для встраивания в модалку используется облегчённый режим?embed=1(без сайдбара). - Колонка «Диск, Гб» вместо «Счёт, ₽» в списке объектов — показывает, сколько гигабайт занимает архив объекта в Google Cloud Storage (суммарно по всем камерам). «—» если выгрузка архива в GCS выключена.
- Компактная колонка «Компания» — без фона-бейджа, текст в одну строку с сокращением (полное название во всплывающей подсказке), приглушённая иконка.
stream.html в iframe)
· «Архив» →
Модалка: embed-страница — live + таймлайн 24ч
· «Поток» →
Модалка: WebRTC (low-latency)
Архив в GCS через прокси (роль «GCS»)
Из российских сетей storage.googleapis.com и oauth2.googleapis.com недоступны напрямую. Чтобы биллинг мог считать размер архива и выгружать сегменты в облако, добавлена отдельная роль «GCS» у прокси-сервера.
- В разделе Настройки → Система → Прокси у каждого прокси в меню «⋮» появился пункт «Добавить / Снять роль GCS» — это дополнительная роль, не сбрасывает роли Telegram и Нейросеть.
- Для GCS используется HTTP-прокси (CONNECT) — он нативно поддерживается клиентом Google Cloud Storage. Доступность прокси проверяется по
storage.googleapis.com. - Подсчёт «Диск, Гб» делает один запрос со списком объектов GCS (с кэшем 10 минут) и суммирует размеры по каждой камере объекта.
Отчётность ЧОП (Фаза 4) — SLA, uptime, выручка
Раздел /admin/video/reports/ («Видео → Отчётность ЧОП») — единый экран по охраняемым объектам ЧОПа. Отвечает на три вопроса заказчика: насколько стабильна связь (SLA-uptime %), как быстро оператор реагирует на тревоги (время реакции + % в пределах SLA) и сколько объект приносит в месяц (recurring-выручка). Это доказуемый SLA — ключевая ценность, которую мы продаём охранным предприятиям.
KPI и как они считаются
| KPI | Источник / формула |
|---|---|
| 📡 Средний uptime | downtime из пар тревог offline → restore (SecurityAlarm); 1 − downtime/период. «—» если событий связи за период нет |
| ⏱ Ср. реакция | acked_at − event_time по принятым тревогам (среднее + медиана) |
| ✅ % в пределах SLA | доля тревог с реакцией ≤ VideoServicePlan.sla_react_minutes (числовое целевое время реакции по плану) |
| 💰 Выручка/мес (MRR) | Σ активных VideoSubscription.price_month (для облака × число камер) |
| 🛡 Объектов охраны | VideoObject(object_type='security') + сколько с заблокированными камерами |
| 🚨 Тревог за период | всего + сколько принято операторами |
Под KPI — таблица по объектам (uptime, простой, тревоги, реакция, выручка), сводка по охранным предприятиям (группировка по security_company) и реакция по операторам (через acked_by).
Период и экспорт
Кнопки периода 7 / 30 / 90 дней / Год перезапрашивают данные через /admin/video/reports/json/ без перезагрузки. Экспорт CSV (/admin/video/reports/export/) — UTF-8 BOM + ; для Excel, колонки по объектам.
Тёмная тема и мобильная вёрстка поддержаны; uptime начнёт наполняться, когда заработает приём сигналов с панелей (Фаза 3) — сейчас приёмник выключен до аудита оборудования ЧОПа.
Вкладка клиента и ЛК
На карточке клиента — вкладка «📹 Видеонаблюдение»: объекты → камеры / оборудование / подписки / проекты, с модалкой объекта (side-nav). У каждого объекта — отдельный лицевой счёт под видео (не смешивается с интернет-балансом). Recurring-подписки списываются с этого счёта; при минусе блокируются камеры/облако (настройка VIDEO_BLOCK_ON_NEGBAL), интернет не трогается.
В личном кабинете (/lk/video/) и мобильном приложении (GET /mobile-api/v1/video/objects) клиент видит свои объекты, камеры, подписки, статус проекта, баланс видео-счёта и кнопку пополнения.
Как списываются подписки — пошагово
Видеоподписка — это recurring-услуга (UsersUsluga, system_type=20), которую billing_worker списывает 1-го числа каждого месяца. Деньги берутся с отдельного видео-счёта объекта (VideoObject.account) — интернет-баланс клиента не затрагивается.
390 ₽/мес
списывает 390 ₽
(интернет работает)
| Тип подписки | Цена считается | Пример |
|---|---|---|
| Сервис / SLA (service) | фиксировано за объект | Сервис Home 390 ₽, Сервис Pro 990 ₽ |
| Облако (cloud) | × число камер | Cloud Start 490 ₽ × 4 камеры = 1960 ₽/мес |
Важно: цены подписок хранятся в каталоге услуг (тип «Видеонаблюдение»), а не в тарифах — линейка «Видеонаблюдение» в разделе «Тарифы» остаётся пустой намеренно. Скидки лояльности интернета на видео не распространяются — это отдельный продукт со своим счётом.
Архив записей в ЛК — календарь, выделение, выбор камеры
Страница архива камеры (/lk/video/archive/<camera>/) даёт клиенту просмотр и выгрузку записей за период хранения (retention из подписки).
- Календарь даты — выбор дня в пределах глубины архива; дни с записью помечены точкой.
- Таймлайн суток — зелёным показаны интервалы доступной записи; клик по таймлайну запускает просмотр с выбранного момента.
- Выделение участка (как обрезка в онлайн-сервисах) — потяните по таймлайну, появятся две ручки и панель «Просмотр / Скачать фрагмент / Сбросить». Вырезанный фрагмент скачивается одним файлом MP4.
- Выбор камеры — если у объекта несколько камер с записью, в шапке появляется селектор камеры (дата сохраняется при переключении).
Уведомления о сбоях записи
Клиент может подключить уведомления о прерывании записи прямо в ЛК (вкладка «Архив» карточки объекта). Опция доступна только если у объекта активна запись. Канал — Telegram / Email / оба; контакты берутся из профиля клиента.
Серверный health-мониторинг (video-archive-health, каждые 10 мин) проверяет свежесть последнего записанного сегмента по каждой archive_enabled камере. Если записи нет дольше 15 минут — запись считается отвалившейся: billing_worker-независимая задача шлёт Telegram-алерт оператору, а при включённой подписке на уведомления — ещё и клиенту (группировка по объекту, анти-спам 6 ч).
Документы (КП / договор / акт / согласие 152-ФЗ)
Из проекта генерируются 5 типов PDF (WeasyPrint, реквизиты из настроек компании, загрузка в облако):
- Акт обследования объекта
- Коммерческое предложение (оборудование + работы + сервис)
- Договор на установку
- Акт сдачи-приёмки с 11-пунктным чек-листом приёмки
- Согласие на обработку ПДн (152-ФЗ) — обязательно до начала съёмки (видео с людьми = персональные данные)
Настройки модуля
Страница /admin/video/settings/ — 4 группы настроек в карточках: Основные (включение, отдельный счёт), Биллинг и блокировки, Облако VSaaS. У облака — кнопка «Проверить соединение» прямо со страницы.
Блокировка камер по балансу
Настройка VIDEO_BLOCK_ON_NEGBAL реально работает: при отрицательном балансе видео-счёта камеры объекта блокируются, при пополнении — разблокируются. Срабатывает в трёх точках:
- После списания подписки в
billing_worker— мгновенная блокировка при уходе в минус; - При пополнении видео-счёта — мгновенная разблокировка;
- Ежечасная фоновая задача (
video.enforce_balances) — подстраховка, обходит все объекты с отдельным счётом.
Логика облако-агностична: флаг cameras_blocked на объекте + вызов VSaaS-провайдера (в MVP без облака — только флаг и запись в аудит, интернет клиента не трогается).
Облако VSaaS (вариант B)
Ядро готово к реселлу облачного видеонаблюдения: абстракция провайдера (BaseVsaasProvider) + заглушка (MVP без облака) + реестр. Реальный облачный провайдер добавляется без переписывания вызывающего кода — выбирается в настройках (VIDEO_CLOUD_PROVIDER) вместе с API URL и ключом. Пока спрос/поставщик не определены — модуль работает в режиме «локальный NVR».
По исследованиям (финансовая модель + анализ платформ) платформа старта — TRASSIR Cloud (DSSL): провайдер TrassirProvider зарегистрирован в реестре (каркас, реальные вызовы API — при получении ключа). Стратегия: TRASSIR Cloud (0–12 мес) → собственное облако Xeoma при достижении ~1000 камер. На дашборде /admin/video/ — метрика «камер в облаке / порог 1000» с сигналом «пора на своё облако» и расчётом дополнительной прибыли.
Срок архива — параметр сервисного плана (retention_days: Дом 7 дн, Семья/Бизнес 30 дн, Бизнес+ 90 дн). Указывается в согласии на обработку ПДн (152-ФЗ — «видеозаписи хранятся не дольше N дней»).
Справочник моделей оборудования
Модели камер и оборудования ведутся в каталоге /admin/video/models/ (раздел «Видео» → «Модели оборудования»), а не вводятся текстом. Каждая модель — тип (камера/NVR/PoE/ИБП/диск), бренд, модель, характеристики (Мп/PTZ/уличная для камер), цена-ориентир. В модалках камеры и оборудования объекта — выбор из справочника с автозаполнением характеристик; свободный текст остаётся как fallback. Цена-ориентир используется в КП/смете проекта.
Мульти-орг: чей клиент
Один биллинг обслуживает несколько компаний. Клиент привязан к организации (с кем подписан договор); объект видеонаблюдения наследует организацию от клиента, при необходимости переопределяется вручную (один клиент — разные компании по разным объектам). От организации зависят реквизиты документов (КП/договор/акт/152-ФЗ). В карточке клиента в блоке «Договор и контакты» отображается «Чей клиент: <организация>».
Модуль в реестре и лицензии
Видеонаблюдение — продаваемый модуль тарифа Pro. Управляется на /admin/settings/modules/: включение/выключение, замок при отсутствии в тарифе. При выключении модуль недоступен везде — раздел скрыт из меню, прямой URL даёт редирект, AJAX/API отвечает 403, вкладка в карточке клиента и раздел в ЛК/мобильном скрыты.
Выключение модуля также скрывает связанные с ним сущности в тарификации и CRM: линейки услуг, тарифы этих линеек, вкладки типов сделок в разделе «Документы» CRM и типы сделок в воронке. Для модуля «Видеонаблюдение» это линейки Видеонаблюдение, Домофон и ЧОП (домофон и охрана — часть видеонаправления). Привязка линейки к модулю определяется полем «Модуль» в карточке линейки, а если оно пустое — по названию линейки. Услуги отдельно не скрываются: они низкоуровневые и уходят из вида вместе со своими тарифами.
Перед запуском: модуль выключен по умолчанию (VIDEO_ENABLED=false). Включается после заведения услуг-пакетов, реквизитов компании и юридического контура 152-ФЗ (согласия + уведомление РКН). Охранный мониторинг с реагированием оказывает партнёр-ЧОО (лицензия), оператор связи — технический сервис.
Домофонный домен
Домофония для новостроек реализована как рескин существующего биллинга, а не отдельный модуль: иерархия «оператор → ЖК → подъезд → квартира» укладывается на MPTT-дерево клиентов один-в-один, пакеты домофона — это тарифы, абонентская плата — recurring-услуги (списываются billing_worker). Все клиенты домофонных/видео-услуг привязаны к оператору домофонии (отдельная папка-юр.лицо).
Доменная модель
- Оператор = папка клиентов (
is_folder=True, company=True) с реквизитами юр.лица. - ЖК / подъезд = вложенные папки.
- Квартира = клиент (
Abonents) с тарифом-пакетом, адресом (Homes) и отдельным лицевым счётом. - Пакеты домофона = тарифы: Standard 52 ₽, IP Smart 75 ₽, Integrated 145 ₽ (цена через
TarifUsersUsluga → Usluga.summa). - Видеонаблюдение = модуль
VideoObject(объект → камеры → подписки) с отдельным видео-счётом; дверь = доп.услуга «Мобильный доступ к двери».