03 / Операционная система
Прокат от выдачи до возврата
Прокат ведёт ежедневную работу — от выдачи инвентаря до закрытия смены — в одной системе.
Задача
Сотруднику нужно выдать свободное оборудование, принять оплату и правильно оформить возврат — в том числе когда клиент продлевает аренду или меняет устройство.
Что сделали
Заказы связаны с оборудованием и оплатами. Выдача и возврат работают по QR-коду, а спорные платежи можно проверить отдельно.
Повторная выдача занятого устройства заблокирована
Оплата картой, через СБП или наличными
Возвраты, ремонт и закрытие смены в одной системе

Ещё экраны продукта



Как это работает
- Проверка и оформление
Сотрудник сканирует QR-код оборудования и формирует заказ с одной или несколькими позициями оборудования и сувенирами.
- Оплата
Клиент платит, а система получает подтверждение от платёжного сервиса.
- Проверка спорных оплат
Если подтверждение задержалось, сотрудник видит операцию в отдельной очереди и может её проверить.
- Обслуживание
Активный заказ можно продлить, отредактировать или завершить; оборудование можно заменить при необходимости.
- Закрытие дня
Ежедневные фоновые задачи закрывают смены, обновляют состояние батарей и выгружают отчёты ровно один раз в день.
Для технической команды: как устроено решение
Веб-приложение обслуживает точки проката и подключается к внешнему платёжному сервису и базе данных; отдельный процесс scheduler один раз в день закрывает смены, обновляет заряд батарей и выгружает отчёты.
- Веб-приложение для точек проката
- Внешний платёжный сервис
- Scheduler ежедневных задач
Надёжность
- Роли доступа привязаны к конкретной точке; управляющий уровень видит все локации.
- История обслуживания и ремонта оборудования сохраняется как часть его жизненного цикла.
- Ежедневные задачи не останавливаются целиком из-за ошибки в одной из них.
- Возврат оплаты — только полный и только один раз на операцию: система не позволяет вернуть больше, чем было получено.
Решения и ограничения
Неопределённый результат переводит операцию в отдельную очередь на ручную проверку, а не считается автоматическим успехом или отказом.
Результат платёжной операции на удалённом устройстве не всегда известен немедленно.
Ошибка сети не приводит к обслуживанию клиента без подтверждённой оплаты и не блокирует точку без причины.
Возврат рассчитывается от исходной операции и уже возвращённой суммы, а не как отдельное независимое действие.
Возврат должен учитывать, что уже было возвращено ранее по тому же заказу.
Повторный возврат не может задвоить сумму клиенту.
Каждая задача защищена блокировкой на уровне процесса и отдельной записью о выполнении, которая не создаётся повторно за один день.
Ежедневные задачи должны выполняться ровно один раз в день даже после перезапуска сервиса.
Смены не закрываются повторно, а отчёты не задваиваются при рестарте.
Предусмотрен резервный сценарий выдачи без кассы для случаев, когда основной платёжный контур недоступен.
Кассовый или платёжный сервис может быть временно недоступен, а точка проката не должна останавливать обслуживание клиентов.
Сбой внешнего сервиса не блокирует работу точки проката.
Новая продажа на устройстве блокируется, если по нему уже есть операция в обработке.
Один и тот же кассовый терминал не должен принимать новую оплату, пока предыдущая операция на нём ещё обрабатывается.
Два платежа на одном терминале не пересекаются и не создают путаницу в кассовых итогах.
Технологии
- Python
- Flask
- PostgreSQL
- APScheduler
- Gunicorn