Хотел бы поделиться интересным решением, которое, уверен, было бы полезно для кооперативов и товариществ.

Современные технологии постепенно проникают во все области нашей жизни. Сегодня сложно представить соседей многоквартирных домов или земельных участков СНТ/ДНТ без группового чата в мессенджере. Такие группы удобны для общения, они позволяют оперативно решать вопросы, публиковать объявления, делиться новостями и даже проводить опросы и голосования.

Кстати, голосование в мессенджере может иметь юридическую силу. Для этого нужно принять решение о возможности применения электронных средств при принятии решений общим собранием членов товарищества и внести соответствующие изменения в устав товарищества (п. 25 ч. 1 ст. 17 федерального закона № 217-ФЗ). При создании нашего товарищества так мы и сделали, и теперь большинство вопросов мы решаем удаленно через Telegram.

Результаты опросов, проведенных в Telegram, отображаются почти моментально в интерфейсе мессенджера. Однако такие результаты не учитывают случаи, когда количество голосов у членов товарищества отличается. Кроме того, в общем чате могут присутствовать супруги/родственники участников, которые могут проголосовать без права голоса. В итоге всё сводится к тому, что необходимо каждый раз пересчитывать голоса.

Чтобы не утомлять секретаря собрания лишней рутиной, мы решили автоматизировать этот процесс. И вот, что у нас получилось.

На скриншотах ниже представлены результаты одного из первых Telegram-опросов, которые мы провели.

Панели Pie Chart и Stat
Панели Pie Chart и Stat
Панель Geomap
Панель Geomap

Таким образом, участник товарищества просто отдает голос в опросе Telegram, а система автоматически в онлайн-режиме учитывает его голос (голоса) и отображает данные на дашборде.

Здорово, не так ли?

Визуальная часть нашего решения реализована в Grafana. Мы использовали панели Pie Chart, Stat и Geomap. Источником данных служит база данных MongoDB с коллекциями "Соседи", "Земли", "Опросы". Для подключения MongoDB в Grafana мы используем плагин grafana-mongodb-community-plugin.

Чтобы программно "отлавливать" голоса в Telegram, нужно чтобы опрос был создан Telegram-ботом. Такого бота мы написали на Golang с использованием библиотеки telegram-bot-api.

Учет голосов реализован в функции handlePollAnswer. Ниже представлена её упрощенная версия.

func handlePollAnswer(pollAnswer *tgbotapi.PollAnswer) {
	// Ищем пользователя в БД
	neighbor, err := db.GetNeighborByChatID(pollAnswer.User.ID)
	if err != nil {
		// handle error
        return
	}
	// Если пользователь отменил голос, исключим его голос из базы
	if len(pollAnswer.OptionIDs) == 0 {
		err := db.DeleteVote(pollAnswer.PollID, neighbor.ID)
		if err != nil {
			// handle error
			return
		}
	} else { // Если проголосовал, добавим голоса в базу
		for _, optionID := range pollAnswer.OptionIDs {
			err := db.AddVote(pollAnswer.PollID, neighbor, optionID)
			if err != nil {
				// handle error
				return
			}
		}
	}
}

Пример создания опроса в интерфейсе Telegram приведен на скриншоте ниже.

Пример создания опроса через интерфейс Telegram-бота
Пример создания опроса через интерфейс Telegram-бота

Для отображения данных на карте мы написали небольшой веб-сервис, который по данным коллекций "Опросы" и "Земли" формирует GeoJSON и возвращет его по HTTP-запросу. URL до нашего веб-сервиса мы указали в настройках панели Geomap. Там же настроили правила отображения.

Подложку для карты (тайлы) для нашего некоммерческого проекта мы сначала попросили у Yandex, так как на ней указаны названия улиц нашего посёлка. Но Yandex нам отказал. В итоге было принято решение взять подложку Here, за что мы им очень благодарны.

На этом у меня всё. Пишите Ваши вопросы в комментариях.

Спасибо за внимание!

Комментарии (4)


  1. aborouhin
    24.10.2023 02:00
    +1

    Всё это прекрасно, пока Вы не столкнётесь с достаточно доёпридирчивым и технически продвинутым членом товарищества, который поставит под вопрос достоверность Ваших результатов голосования. Впрочем, часто в судах прокатывает и "нотариальное удостоверение", и "заключения специалистов" в отношении почты, переписки в мессенджерах и пр., каковые заключаются просто в "взяли телефон, открыли программу, посмотрели"... но это, опять же, работает ровно пока кто-то не решит заморочиться. А поскольку заверения Telegram Messenger Inc., что у них на серверах всё ровно так же и никто ничего не подменял, Вы вряд ли получите, - то решение работоспособно ровно до определённой степени.


  1. vkomp
    24.10.2023 02:00

    Делаю свою систему принятия коллективных решений. Но пошел по классике "клиент-сервер" вместо телеги. Может потом до бота дойду, но пока разбираюсь с матчастью.
    - основным вижу формирование реестра участников. Для этого использую открытые данные Росреестра по объектам
    - в телеге может просто не быть многих участников. Для отсутствующих online и отказников предусмотрены листовки с доступом
    - кроме "простого большинства" есть метод Шульце - компромиссные решения.
    - на уровне сложности одного сообщества сложности решены. Сейчас добавляю важные плюшки. И завис с архитектурой и ux-дизайном.
    - картинки пофиг. На маленьком экране их не рассмотреть. А на большом вторичны за числами.
    Не вижу нормальной работы через телегу - лента удобна для срача, но не для модерируемого форума. За полдня набить сотню сообщений - и тупик.
    *** Вообще основная цель - осмысленное управление жилым пространством. И проблема больше не техническая. В основном в чате многоквартирного дома наблюдаю отсутствие времени, идей и инертность. Но это "в целом по больнице". Ваш пример поселка заряжает бодрячком.


    1. vsile Автор
      24.10.2023 02:00

      Действительно, формирование реестра участников является ключевой задачей и с административной стороны очень непростой. Некоторых соседей приходилось долго убеждать "поговорить" с ботом.

      Интересно также было формировать реестр земельных участков. Потребовалось составить полигоны с координатами углов земельных участков.

      "polygon" : [ 
          [ 
              38.8386627021692, 
              44.747769230334
          ], 
          [ 
              38.8385678400752, 
              44.7475401641553
          ], 
          [ 
              38.8390895815922, 
              44.7474301222369
          ], 
          [ 
              38.8391733764419, 
              44.7476367313806
          ], 
          [ 
              38.8386627021692, 
              44.747769230334
          ]
      ]

      Полигоны мы составили с использованием приложения rosreestr2coord. Чтобы немного упросить процесс, мы разработали скрипт, который проходил по списку кадастровых номеров и запускал cli-приложение.

      ./rosreestr2coord -c 23:26:0401000:3919 -P

      Также мы разработали скрипт, который из полученных файлов с данными из Росреестра формировал json-объекты земельных участков и помещал их в базу данных.


      1. vkomp
        24.10.2023 02:00

        Меня Росреестр больше по площадям интересовал. По координатам нет, потому что до графики еще не созрел