
Цели, задачи, реквизит
Процесс
Результат
Чтобы уверенно растить бизнес, необходимо ставить цели для роста и следить за их достижением. Чтобы следить было проще, хорошо иметь перед глазами и цель, и свой прогресс на пути к ней. Александр Македонский возил с собой карту мира, который желал захватить. Мы сделаем себе экран, который будет в реальном времени показывать текущее состояние расчетных счетов, выручку за месяц, график выручки по месяцам и прогресс выполнения целей на год.
Уровень сложности: поднять сервер на Линукс, разбираться в Python для web и nginx. Или показать статью такому человеку, чтобы он все сделал.

Цели, задачи, реквизит
Нужно показывать актуальные данные о финансах нескольких бизнесов на умных часах LaMetric. Учет финансов происходит в сервисе Финолог.
Финолог — это сервис управления деньгами в бизнесе. Он предоставляет публичный REST API с api-token авторизацией. Документация очень подробная, АПИ очень гибкий. На каждом endpoint по реквест параметрам доступны широкие возможности для фильтрации, чем мы в дальнейшем воспользуемся.
LaMetric — позиционируются как умные часы. На самом деле, это интерактивная панель вывода информации, куда можно транслировать не только время, но и погоду, количество подписчиков в инстаграме, курс валют и что угодно еще. Есть библиотека с готовыми решениями, а есть приложение для трансляции собственных данных. Чтобы наши данные отобразить на часах, нужно повесить их в формате JSON на статичном URL. Часы подключены к интернету и регулярно опрашивают URL. Полученные оттуда данные отображаются на дисплее.
Цель — визуализировать данные управленческого учета из Финолога на LaMetric для двух бизнесов: студии аутсорс-разработки и магазина разливного пива.
Мы показываем:
- текущий остаток по счету;
- процент получения запланированной выручки за год (например, в плане годовая выручка 1000 руб., на данный момент имеем 300, показываем заполненную на 30% шкалу);
- график распределения выручки по месяцам за текущий год.
Нам для этого требуется:
- Взять данные по остатку на всех счетах бизнеса и сформировать фрейм типа text с выводом остатка в тысячах рублей.
- Взять данные по всем по всем приходам статьи Выручка месяцам текущего года и из месячных сумм сформировать данные для фрейма chartData.
- Взять сумму всей выручки за текущий год, задать планку 100% и сформировать фрейм goalData.
- Как-то держать информацию в актуальном виде.
- Сформировать JSON для двух бизнесов и повесить это на доступном для LaMetric URL.

Процесс
Для реализации на серверной стороне я использовал python3. Хотелось выбрать что-то максимально простое, желательно без СУБД и чтобы можно было встроить на действующий VPS без сложной маршрутизации.
В качестве веб сервера работает стандартный wsgiref.simple_server. Под него написано простое WSGI приложение. Каждый раз, когда на сервер поступает запрос от LaMetric, сервер создает экземпляр FramesCatalog. Этот FramesCatalog опрашивает API Финолог и создает ответ в формате JSON и понятный LaMetric. Ответ сервер возвращает вместе с нужными заголовками и статусом.
server.py:
from wsgiref.simple_server import make_serverimport settingsfrom puller import FramesCatalogdef my_app(environ, start_response): status = '200 OK' headers = [('Content-type', 'application/json; charset=utf-8')] start_response(status, headers) response = FramesCatalog().get_frames_json() return [response.encode()]if __name__ == '__main__': with make_server(settings.HOST, settings.PORT, my_app) as srv: srv.serve_forever()
FramesCatalog — это класс-каталог, который в зависимости от настроек в settings.py создает классы представления бизнесов Финолога. В эти классы встроены возможность опрашивать API Финолога и формировать нужные фреймы.
Авторизация на api.finolog.ru выполняется по API токену. Скрипт берет токен из соответствующей переменной окружения.
settings.py:
FINOLOG_API_KEY = os.environ.get('API_KEY')
Весь скрипт помещен в контейнер Docker. Dockrfile максимально простой, через директивы ARG и ENV реализована передача API токена в переменную окружения.
Dockerfile:
FROM python:3.8WORKDIR /homeRUN pip install -U pip requestsCOPY *.py ./ARG api_keyENV API_KEY $api_keyENTRYPOINT ["python", "server.py"]
Запускается контейнер в режиме демонизации с пробросом внутреннего TCP-порта 8088 на внешний 8123.
Вся описанная конструкция работает под обратным прокси nginx. В nginx используется отдельная директива location. В простейшем случае:
location /secret-path-to-lametric-frames { proxy_pass http//0.0.0.0:8123;}
Это позволяет выполнить маршрутизацию для www.domain.ru/secret-path-to-lametric-frames существующими средствами и не использовать, например, flask. Кроме того, все внешние запросы будут передаваться до nginx по https, что важно при передаче API токена в заголовке HTTP запроса.
В проекте не используется база данных. Все ответы сервера формируются на лету по факту поступления запроса.
Весь код можно посмотреть на GitHub.
Результат
Подобный экран — отличный инструмент для визуализации целей.
Кирилл, руководитель WB—Tech, уже рассказывал, как борется с прокрастинацией. Трансляция актуальных финансовых показателей — это еще один способ мотивации себя и команды.
Посмотрите разные автоматизации бизнес-процессов и выберите решение, которое подходит для вашей компании.
Подпишитесь на блог WB—Tech
Никакого спама, только анонсы новых статей