lerk

Бот3 мин чтения

Сервис напоминаний о регулярных платежах: технический кейс

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

Дмитрий

Обложка поста про сервис напоминаний о регулярных платежах

Задача#

Администратор вносит платежи, бот за три дня до срока пишет в чат, а команда отмечает оплату. В любой момент видно три вещи: что и когда оплатить, что уже оплачено и что просрочено.

Основу собрал примерно за 10 часов из 30, которые были на хакатоне. Остальное время ушло на тесты, защиту входа, импорт из CSV и webhook.

Что делает бот#

  • за три дня до срока присылает название, сумму, валюту и дату оплаты, по одному разу на период;
  • в каждом напоминании есть кнопка «Оплачено»: нажатие отмечает период оплаченным, сообщение обновляется, повторное нажатие безвредно;
  • нажимать могут только участники чата, это проверяется на стороне сервера;
  • если срок прошёл, а оплату не отметили, на следующий день приходит одно повторное напоминание «Платёж просрочен».

Работает в Telegram и в MAX, каналы независимы: можно включить один или оба.

Как устроено#

FastAPI и SQLAlchemy, база SQLite в Docker volume, планировщик внутри того же процесса. Всё поднимается одной командой через Docker Compose, данные переживают перезапуск.

Пара решений, которыми доволен:

  • просрочка не хранится, а вычисляется: платёж не оплачен, и срок уже прошёл;
  • даты периодов считаются от первой даты, а не цепочкой: платёж с 31 числа не «уезжает» на 28 после февраля;
  • администратор задаётся только в настройках окружения, через API его нельзя создать, изменить или удалить;
  • все ручки под /api/v1, документация Swagger лежит на /api/v1/docs.

Что ещё внутри#

Кроме обязательной части сделал бонусы, потому что на них ушёл остаток времени:

  • напоминания по email и webhook с подписью HMAC-SHA256, чтобы получатель мог проверить отправителя;
  • двухфакторный вход администратора (TOTP) и API-токены «только чтение» или «чтение и запись»;
  • журнал входов, оплат и изменений, пароли туда не попадают;
  • интерфейс на русском и английском, светлая и тёмная темы.

Защита и удобства#

После 5 неверных паролей подряд логин закрывается на 15 минут. Пароли хранятся хэшем argon2, в базе лежит только хэш токена сессии, а смена пароля закрывает остальные сессии.

Из удобств: импорт платежей из CSV с проверкой без записи (панель показывает каждую строку с ошибками), пауза платежа, категории, ответственный за платёж, календарь оплат и бюджет по валютам.

Пока честно: приложение рассчитано на один процесс, замок напоминаний живёт внутри него. Несколько воркеров запускать нельзя.

Расскажите о задаче

Пара фраз и ссылка на сайт, если он уже есть. Отвечаю сам: задам вопросы, назову срок и цену.

Заказать похожее

Ещё посты