image image image image
Сквозная связка для сервисного бизнеса: заявка с сайта падает мастеру в Telegram, мастер оценивает работу и выставляет счёт, клиент платит картой, статус заявки меняется сам после подтверждения кассы, клиент видит его по личной ссылке без пароля. Внутри: Node.js, TypeScript, SQLite, ЮKassa, Docker, 28 тестов. Три решения, на которых всё держится: 1. Касса спрятана за интерфейсом из двух методов. ЮKassa и встроенный эмулятор — две реализации одного интерфейса, маршруты не знают, с кем разговаривают. Поэтому демо-стенд показывает весь путь целиком, а переход на живые платежи не меняет ни строчки логики. 2. Вебхуку об оплате не верят. ЮKassa не подписывает уведомления, поэтому тело запроса — только повод перезапросить платёж в кассе. Статус меняет ответ кассы, а не содержимое запроса. Иначе любой, кто узнал адрес вебхука, объявляет чужую заявку оплаченной; тест на это в наборе есть. 3. Деньги хранятся в копейках целым числом. Рубли в дробных числах однажды дают 4899.999999 и потерянную копейку в отчёте. Статусы идут по одной дороге: Новая — Оценена — Счёт выставлен — Оплачена — Сдана. После оплаты отмены нет: это возврат денег, он делается в кассе, а не сменой строки в базе. Демонстрационный стенд, данные вымышленные.