Разработал систему полного контроля сети из 30 торговых точек (кофейни, пекарни, мини-маркеты) через Telegram-бот.
Основные модули:
• Открытие / закрытие смены
• Касса: размен, наличные/карта/QR/перевод, инкассация, выплаты ЗП, расчёт расхождений
• Учёт упаковки (5 позиций ежедневно)
• Накладные (вода, фантики, ванны кг) + перемещения между точками
• Списания (с порогами, обязательным фото и подтверждением)
• Инвентаризация (2 раза в неделю, с авто-расчётом разниц)
• Генерация Excel-отчётов (несколько листов)
• Автоудаление финансовых сообщений в чате
• Разграничение ролей (кассир / старший смены / владелец / админ)
Технический стек строго по ТЗ заказчика:
• Python + aiogram 3.x (Telegram-бот)
• PostgreSQL (все данные и логика)
• Планировщик задач на базе БД
• Идемпотентность операций
• Транзакции Serializable + FOR UPDATE
• Защита от дублей и повторных кликов
Telegram — только интерфейс (Web App + обычные сообщения). Вся бизнес-логика, расчёты и хранение — на бэкенде.
Ключевые технические решения:
Защита от дублей
Каждой операции присваивается уникальный idempotency-key (UUID), генерируемый на клиенте. Ключ сохраняется в Redis (TTL 24 ч) и в таблице idempotency_log. Перед выполнением проверяем:
• Есть ли уже запись с этим ключом? → возвращаем сохранённый результат
• Нет → выполняем в транзакции и сохраняем
Планировщик задач
Таблица jobs в PostgreSQL:
• id, name, schedule (cron), next_run (timestamp), status (scheduled/processing/completed/failed), lock_until, last_result
• Каждые 30 секунд cron-таск (APScheduler) берёт задачи, где next_run ≤ now() и status = scheduled
• Ставит status = processing и lock_until = now + 5 мин
• После выполнения обновляет next_run и status
• Если задача упала — retry до 3 раз, потом failed + алерт в Telegram админу
Корректность кассовых операций
Все операции с деньгами/остатками — внутри SERIALIZABLE-транзакций PostgreSQL:
BEGIN;
SELECT ... FOR UPDATE; ← блокировка строки
UPDATE balance ...;
INSERT INTO transactions ...;
COMMIT;
При конфликте сериализации — retry (2 раза). Это исключает отрицательные остатки и двойные списания даже при одновременных действиях двух кассиров.
Система запущена в продакшене на 30 точках.
• Кассиры проводят операции за 5–10 секунд
• Нет случаев двойных списаний или отрицательных остатков
• Владелец получает ежедневные Excel-отчёты автоматически
• Списания без фото блокируются (защита от воровства)
• Автоудаление финансовых сообщений снижает риск утечек
• Разграничение ролей: кассир видит только свою точку, админ — всю сеть
Проект полностью соответствует требованиям заказчика и уже окупается за счёт снижения потерь и ручного труда.