Чтобы уверенно растить бизнес, необходимо ставить цели для роста и следить за их достижением. Чтобы следить было проще, хорошо иметь перед глазами и цель, и свой прогресс на пути к ней. Александр Македонский возил с собой карту мира, который желал захватить. Мы сделаем себе экран, который будет в реальном времени показывать текущее состояние расчетных счетов, выручку за месяц, график выручки по месяцам и прогресс выполнения целей на год.
Уровень сложности: поднять сервер на Линукс, разбираться в Python для web и nginx. Или показать статью такому человеку, чтобы он все сделал.
Ламетрика транслирует актуальное состояние расчетных счетов моих бизнесов.
Цели, задачи, реквизит
Нужно показывать актуальные данные о финансах нескольких бизнесов на умных часах LaMetric. Учет финансов происходит в сервисе Финолог.
Финолог — это сервис управления деньгами в бизнесе. Он предоставляет публичный REST API с api-token авторизацией. Документация очень подробная, АПИ очень гибкий. На каждом endpoint по реквест параметрам доступны широкие возможности для фильтрации, чем мы в дальнейшем воспользуемся.
LaMetric — позиционируются как умные часы. На самом деле, это интерактивная панель вывода информации, куда можно транслировать не только время, но и погоду, количество подписчиков в инстаграме, курс валют и что угодно еще. Есть библиотека с готовыми решениями, а есть приложение для трансляции собственных данных. Чтобы наши данные отобразить на часах, нужно повесить их в формате JSON на статичном URL. Часы подключены к интернету и регулярно опрашивают URL. Полученные оттуда данные отображаются на дисплее.
Цель — визуализировать данные управленческого учета из Финолога на LaMetric для двух бизнесов: студии аутсорс-разработки и магазина разливного пива.
Мы показываем:
текущий остаток по счету;
процент получения запланированной выручки за год (например, в плане годовая выручка 1000 руб., на данный момент имеем 300, показываем заполненную на 30% шкалу);
график распределения выручки по месяцам за текущий год.
Нам для этого требуется:
Взять данные по остатку на всех счетах бизнеса и сформировать фрейм типа text с выводом остатка в тысячах рублей.
Взять данные по всем по всем приходам статьи Выручка месяцам текущего года и из месячных сумм сформировать данные для фрейма chartData.
Взять сумму всей выручки за текущий год, задать планку 100% и сформировать фрейм goalData.
Как-то держать информацию в актуальном виде.
Сформировать 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_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 токена в переменную окружения.
Это позволяет выполнить маршрутизацию для www.domain.ru/secret-path-to-lametric-frames существующими средствами и не использовать, например, flask. Кроме того, все внешние запросы будут передаваться до nginx по https, что важно при передаче API токена в заголовке HTTP запроса.
В проекте не используется база данных. Все ответы сервера формируются на лету по факту поступления запроса.