Транслируем бюджет бизнеса из Финолога на экран Ламетрика

Транслируем бюджет бизнеса из Финолога на экран Ламетрика

Чтобы уверенно растить бизнес, необходимо ставить цели для роста и следить за их достижением. Чтобы следить было проще, хорошо иметь перед глазами и цель, и свой прогресс на пути к ней. Александр Македонский возил с собой карту мира, который желал захватить. Мы сделаем себе экран, который будет в реальном времени показывать текущее состояние расчетных счетов, выручку за месяц, график выручки по месяцам и прогресс выполнения целей на год.

Уровень сложности: поднять сервер на Линукс, разбираться в Python для web и nginx. Или показать статью такому человеку, чтобы он все сделал.

Ламетрика транслирует актуальное состояние расчетных счетов моих бизнесов

Цели, задачи, реквизит

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

Финолог — это сервис управления деньгами в бизнесе. Он предоставляет публичный REST API с api-token авторизацией. Документация очень подробная, АПИ очень гибкий. На каждом endpoint по реквест параметрам доступны широкие возможности для фильтрации, чем мы в дальнейшем воспользуемся.

LaMetric — позиционируются как умные часы. На самом деле, это интерактивная панель вывода информации, куда можно транслировать не только время, но и погоду, количество подписчиков в инстаграме, курс валют и что угодно еще. Есть библиотека с готовыми решениями, а есть приложение для трансляции собственных данных. Чтобы наши данные отобразить на часах, нужно повесить их в формате JSON на статичном URL. Часы подключены к интернету и регулярно опрашивают URL. Полученные оттуда данные отображаются на дисплее.

Цель — визуализировать данные управленческого учета из Финолога на LaMetric для двух бизнесов: студии аутсорс-разработки и магазина разливного пива.

Мы показываем:

  • текущий остаток по счету;
  • процент получения запланированной выручки за год (например, в плане годовая выручка 1000 руб., на данный момент имеем 300, показываем заполненную на 30% шкалу);
  • график распределения выручки по месяцам за текущий год.

Нам для этого требуется:

  1. Взять данные по остатку на всех счетах бизнеса и сформировать фрейм типа text с выводом остатка в тысячах рублей.
  2. Взять данные по всем по всем приходам статьи Выручка месяцам текущего года и из месячных сумм сформировать данные для фрейма chartData.
  3. Взять сумму всей выручки за текущий год, задать планку 100% и сформировать фрейм  goalData.
  4. Как-то держать информацию в актуальном виде.
  5. Сформировать JSON для двух бизнесов и повесить это на доступном для LaMetric URL.
Умные часы подключены к домашнему Wi-Fi, откуда получают информацию в реальном времени

Процесс

Для реализации на серверной стороне я использовал python3. Хотелось выбрать что-то максимально простое, желательно без СУБД и чтобы можно было встроить на действующий VPS без сложной маршрутизации.

В качестве веб сервера работает стандартный wsgiref.simple_server. Под него написано простое WSGI приложение. Каждый раз, когда на сервер поступает запрос от LaMetric, сервер создает экземпляр FramesCatalog. Этот FramesCatalog опрашивает API Финолог и создает ответ в формате JSON и понятный LaMetric. Ответ сервер возвращает вместе с нужными заголовками и статусом.

server.py:

from wsgiref.simple_server import make_server

import settings
from puller import FramesCatalog


def 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.8

WORKDIR /home

RUN pip install -U pip requests
COPY *.py ./

ARG api_key
ENV API_KEY $api_key

ENTRYPOINT ["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, уже рассказывал, как борется с прокрастинацией. Трансляция актуальных финансовых показателей — это еще один способ мотивации себя и команды.