Кейс
POS-платформа для розницы — переписана во вторую версию
Кассовая система на штрихкодах: начиналась как монолит на Django в реальном магазине и была переписана во вторую версию на новой архитектуре — FastAPI + React, более лёгкий и быстрый интерфейс, смены, инвентаризации, возвраты, лояльность и Telegram-бот для владельца.
- Клиент
- Розничные магазины
- Роль
- Единственный разработчик — требования, архитектура, обе версии
- Сроки
- v1 — 2024 · v2 (переписывание) — 2026
- Стек
- PythonFastAPIPostgreSQLRedisCeleryReactTypeScriptWebSocketTelegram Bot APIDjango (v1)
Задача
Первая версия заменила тетради в небольшом магазине: продажи, приёмка товара, долги покупателей и еженедельный отчёт. Она работала, но монолит с серверным рендерингом замедлял каждое сканирование и переход между страницами, бизнес-правила были размазаны по представлениям, а выйти за пределы одного магазина было нереально.
Вторая версия должна была сохранить всё, на что опирался магазин, снять ограничения по скорости и структуре и стать продуктом, который смогут использовать и другие магазины.
Подход и архитектура
- Сначала задокументировал существующую систему — бизнес- и функциональные требования, модели данных, API и руководство по миграции, — а затем спроектировал v2 по этой спецификации, а не переносил код.
- Новая архитектура: слоистый бэкенд на FastAPI (эндпоинты → сервисы → CRUD → модели) с правами доступа для ролей администратора, менеджера и продавца, PostgreSQL, кэш в Redis и Celery для импорта, отчётов и напоминаний.
- Более лёгкий и быстрый интерфейс: одностраничное приложение на React без перезагрузок между сканированиями, мгновенное обновление корзины, распознавание сканера штрихкодов по таймингу с защитой от двойного считывания и обновления в реальном времени через WebSocket.
- Деньги — как бухгалтерский журнал: долги в неизменяемом журнале только с добавлением записей; смены с X/Z-отчётами и «слепой» сверкой кассы; инвентаризация со слепым пересчётом и отчётом о расхождениях; возвраты с возвратом на склад по каждой позиции.
- Архитектура готова к двухуровневой схеме — сервер в магазине для работы без зависимости от интернета и облачный сервер, куда синхронизируются данные, — плюс Telegram-бот с оповещениями для владельца и напоминаниями о долгах.
Результат
- v1 используется в магазине с 2024 года; v2 покрывает примерно 85–90% спецификации, ядро POS готово к работе в одном магазине.
- Четыре типа корзин, пять способов оплаты, лояльность и кэшбэк, аналитика по 15+ метрикам, мастер настройки из шести шагов, интерфейс на русском и узбекском.
Что обеспечило надёжность
- 280+ тестов бэкенда; CI запускает линтеры, проверку форматирования, тесты с покрытием, миграции и проверку забытых миграций, собирает Docker-образ.
- Независимый разбор v2 нашёл 60+ проблем — включая гонку при списании остатков и проверку скидок, — и они вошли в план исправлений, а не остались пользователям.
- Идемпотентные операции, усиленная авторизация с обязательной сменой пароля при первом входе, таймауты, скрипты бэкапа и восстановления.
Похожая задача?
Расскажите о ней — честно оценю объём, подход и то, каким может быть первый этап.