← appsuper.ru Кейс проекта · 2026
Telegram Mini App + Bot учёт остатков хоз.склада

Склад АХО

Склад, который сам следит за остатками.

Лёгкая система управления складом прямо в Telegram. Уборщики в пару касаний заказывают расходники на свою локацию, интерфейс не даёт заказать больше, чем есть, а при падении ниже критического остатка система сама шлёт заявку закупщику. Вместо дорогой БД — Google Таблицы. Спроектировано и написано в одиночку.

FastAPI + aiogram Google Sheets как БД Telegram Mini App HMAC-подпись
Какую боль решает
Остатки на складе синхронизировано
Туалетная бумагашт24
Перчатки нитриловыепар40
Микрофибрашт12
Моющее средстволкритично · 4
→ авто-заявка закупщику отправлена
01
Проблема

Четыре боли снабжения — и как они закрыты

Закупка расходников в офисах и на объектах — это вечная «пожарная» история: то бумага кончилась, то заказали лишнего, то никто не знает, что вообще на складе. Вот что болит и что с этим делает Склад АХО.

!Заканчивается в самый неподходящий момент

Расходники внезапно кончаются на локации — и это замечают, когда уже поздно. Ручной контроль запасов не масштабируется.

✓Система следит за остатками и при падении до критического уровня сама формирует заявку закупщику — без ручного мониторинга.
!Бумажные журналы и Excel-хаос

Учёт ведётся вручную в тетрадях или разрозненных таблицах. Актуальных остатков не знает никто, ошибки копятся.

✓Единый каталог с живыми остатками в Telegram, а каждая операция автоматически пишется в Google Таблицу.
!Заказали больше, чем есть

Заявки на несуществующий товар порождают пересорт, недостачи и споры «где мои позиции».

✓Интерфейс физически не даёт добавить в заказ больше, чем сейчас на складе. Ошибка исключена на входе.
!Непрозрачность и лишние приложения

Кто, что и куда заказал — непонятно. А ставить сотрудникам ещё одно приложение никто не хочет.

✓Всё работает внутри Telegram. Каждый заказ фиксирует кто / когда / куда / что, а админ получает уведомление в реальном времени.
02
Как это работает

Путь одного заказа — от корзины до поставки

Один короткий цикл связывает уборщика, администратора и закупщика. Всё внутри Telegram, всё логируется в таблицу.

01
👤

Вход по роли

Уборщик открывает мини-приложение. Роль определяется автоматически по Telegram ID — без логинов и паролей.

02
🧺

Каталог и корзина

Видит товары с актуальными остатками и набирает корзину. Больше, чем есть на складе, добавить невозможно.

03
📍

Склад назначения

Перед оформлением обязательно выбирается локация — куда принести товары. Заказ без адреса не уйдёт.

04
📉

Списание и журнал

Остатки уменьшаются, а операция мгновенно попадает в лист «Журнал заказов» в Google Таблице.

05
🔔

Уведомления

Админу — пуш о новом заказе. Если остаток стал ≤ критического — закупщику уходит сводная заявка, без дублей.

06
📦

Поставка в один клик

Админ жмёт «Поставка» — запасы пополняются на объём поставки, а флаги ожидания закупки сбрасываются.

03
Ролевая модель

Три роли, определяются по Telegram ID

Приложение само понимает, кто его открыл, и показывает нужный интерфейс. Никаких логинов — авторизация по идентификатору Telegram.

🧹

Уборщик

Клининг
  • Каталог товаров с актуальными остатками
  • Корзина с блокировкой заказа сверх доступного
  • Оформление с обязательным складом назначения
🛠️

Администратор

Контроль
  • Уведомления о новых заказах в реальном времени
  • Кнопка «Поставка» — пополнение в один клик
  • Сброс флагов ожидания закупок после поставки
🚚

Закупщик

Снабжение
  • Сводные авто-заявки при остатке ≤ критического
  • Анти-спам: одна заявка на товар, без дублей
  • Понятный список того, что пора закупить
04
Живое демо · весь цикл

Пройдите цикл своими руками

Ниже — не скриншот, а рабочая мини-версия системы. Оформите заказ как уборщик, посмотрите ленту администратора, доведите товар до критического остатка и увидите авто-заявку закупщику. Всё состояние — общее, как в реальном приложении.

🏬
Склад АХОTelegram Mini App · переключайте роль ↓
Склад назначения (обязательно)
Офис · 1 этаж Офис · 3 этаж Кухня Переговорная
Наберите количество и выберите локацию
Пополнит остатки на объём поставки и сбросит флаги
GЖурнал заказов · Google Sheets 0 записей
ВремяТипТоварКол-воЛокацияКто

Подсказка: доведите «Моющее средство» до 5 и ниже — увидите, как загорится вкладка «Закупщик».

05
Безопасность

Проверка подписи Telegram initData

Мини-приложение живёт в браузере, поэтому серверу нельзя слепо верить входящим данным. Каждый запрос несёт криптографическую подпись Telegram, а бэкенд пересчитывает HMAC-SHA256 и сверяет её. Подделка отсекается. Включите тумблер — эмулируйте атаку.

📱 Telegram Mini App

отправляет данные пользователя + подпись
user=252218804&auth_date=1770…&hash=a3f91c…d7e2
→

⚙️ FastAPI backend

пересчитывает HMAC и сравнивает
HMAC_SHA256(data, bot_token) == hash
✓ 200 OK · запрос принят
Подделать данные (эмуляция атаки)
06
Архитектура

Облегчённый клиент-сервер для MVP

Бот и API живут в одном процессе: aiogram запускается внутри lifespan FastAPI. Данные лежат в Google Таблицах, а конкурентный доступ к остаткам защищён блокировкой. Наведите на узел — подсветятся связи.

initData asyncio.Lock Service Acct notify / start lifespan Mini App HTML · JS · Tailwind FastAPI REST · HMAC-проверка aiogram бот в lifespan gspread клиент Google API Google Sheets таблицы как БД Telegram админ · закупщик
HTTP / Telegram один процесс · Lock Google Sheets
07
Хранение данных

База — это Google Таблица

Ноль серверов баз данных и ноль админ-панелей: данные лежат на листах Google Sheets, которые менеджер открывает в привычном интерфейсе и читает как отчёт. Четыре листа держат весь проект.

G

Товары

Название · Ед.позиция каталога и единица измерения
Остатоктекущее количество на складе
Крит. остатокпорог, ниже которого — заявка
Объём поставкина сколько пополняет «Поставка»
Ожиданиефлаг анти-спама заявок
Одна строка — один товар. Ожидание не даёт слать закупщику дубли.
G

Пользователи

Telegram IDидентификатор сотрудника
Рольуборщик · админ · закупщик
Роль по ID — интерфейс подстраивается автоматически, без логинов.
G

Локации

Названиесклад назначения для доставки
Выбор локации обязателен при оформлении заказа.
G

Журнал заказов

Время · Ктометка и инициатор операции
Типсписание или поставка
Товар · Кол-вочто и сколько прошло
Локациякуда (для заказов)
Пишется автоматически при каждом списании и пополнении.
08
Инженерные решения

Простой снаружи, аккуратный внутри

MVP не значит «на коленке». Четыре решения, которые делают лёгкую систему надёжной.

Решение 01 · Хранилище

Google Sheets вместо тяжёлой БД

Полноценная база и админ-панель для склада на десяток позиций — это дорого и долго для MVP, а менеджеру всё равно нужен привычный отчёт.

Решение: данные живут в Google Sheets через gspread и сервис-аккаунт. Ноль инфраструктуры, бесплатно, а отчётность открывается в знакомом интерфейсе.

0серверов БД и админок · привычный отчёт
Решение 02 · Конкурентность

Остатки не «плывут» при гонке

Два человека заказывают один товар одновременно. Чтение-изменение-запись в таблицу не атомарны — остаток может списаться неверно.

Решение: критическая секция обёрнута в asyncio.Lock. Одновременные заказы сериализуются, и остаток всегда считается корректно.

консистентнопри конкурентных заказах
Решение 03 · Безопасность

API нельзя дёрнуть в обход Telegram

Мини-приложение — это web-страница. Без защиты любой мог бы слать серверу поддельные запросы и списывать чужие остатки.

Решение: бэкенд проверяет подпись initData через HMAC-SHA256 с токеном бота. Данные без валидной подписи отклоняются.

403на любой поддельный запрос
Решение 04 · Анти-спам

Закупщик не тонет в дублях

Если слать заявку при каждом заказе ниже критического, закупщик получит десятки одинаковых сообщений по одному товару.

Решение: флаг «ожидание закупки» ставится один раз на товар и сбрасывается только «Поставкой». Одна позиция — одна заявка.

без дублейзаявок закупщику
09
Стек

Из чего собрано

Backend · Python 3.10+

FastAPIасинхронный REST API
aiogramTelegram-бот в lifespan
gspreadGoogle Sheets как БД
Service Accountдоступ по JSON-ключу
Pydanticсхемы запросов и ответов
HMAC · asyncio.Lockподпись и защита от гонок

Frontend · Telegram Mini App

HTML + CSSбез тяжёлых фреймворков
JavaScriptapp.js — вся логика клиента
Tailwind CSSчерез CDN, адаптивная вёрстка
Telegram.WebAppданные юзера, тема, закрытие
10
Итог

Что этот проект демонстрирует

Реальная операционная задача бизнеса, решённая целиком и минимальными средствами — от бэкенда до интерфейса в Telegram.

01Асинхронный бэкенд: FastAPI и aiogram в одном процессе через lifespan
02Интеграция без БД: Google Sheets как хранилище через gspread и сервис-аккаунт
03Безопасность: проверка подписи Telegram initData через HMAC
04Конкурентность: защита остатков от гонок данных с asyncio.Lock
05Бизнес-логика: ролевой доступ, критические остатки, авто-заявки и анти-спам
06Продуктовое мышление: дешёвое и поддерживаемое решение реальной боли снабжения

Порядок на складе без хаоса

Склад АХО заменяет тетради и таблицы удобным заказом в Telegram и сам следит, чтобы расходники не кончались.

// вставьте ссылку на бота в атрибут href кнопки выше