Необходимо разработать веб-приложение (модуль) для учета финансовых транзакций по заказам. Это тестовое задание для проверки навыков архитектуры, работы с транзакциями БД, обработки конкурентных запросов и граничных случаев.
Бизнес-контекст:
Дан список заказов (10–15 шт., тестовые данные) с полями:
- `id` — идентификатор заказа
- `total_amount` — сумма к оплате
- `status` — текущий статус (по умолчанию `pending`)
- `payments` — массив уже проведённых платежей (дата, сумма)
Функционал, который нужно реализовать:
1. API-метод добавления платежа
- Принимает `order_id` и `payment_amount`.
- Производит пересчет остатка задолженности.
- Автоматически обновляет статус заказа на один из трех:
`pending` — не оплачен (остаток = total_amount)
`partially_paid` — частично оплачен (0 < остаток < total_amount)
`paid` — полностью оплачен (остаток = 0)
2. Обработка граничных сценариев (критично):
- Частичная оплата — корректное изменение остатка.
- Переплата — система должна запретить проведение платежа, если сумма платежа превышает остаток (либо предложить механизм создания кредитового баланса — на ваше усмотрение, но нужно обосновать выбор в README).
- Задвоение платежа — защита от повторного списания. Реализовать идемпотентность через механизм `idempotency_key` (временное хранение в Redis) или уникальный индекс в БД.
3. Генерация отчетности
- Сводный отчет по всем заказам с колонками:
Сумма заказа
Сумма оплаченных средств
Остаток задолженности
- Итоговая строка с глобальными агрегатами по всему списку заказов.
4. Документация (README)
В `README.md` обязательно описать:
- Почему выбрана именно такая модель данных (структура таблиц БД).
- Как реализована защита от конкурентных запросов (например, использование `SELECT ... FOR UPDATE` или оптимистических блокировок).
- Что кандидат сделал бы иначе, если бы проект нужно было сдать в 2 раза быстрее (компромиссы по архитектуре).
Технические требования к стеку (фиксированные):
Язык: TypeScript (строгая типизация обязательна)
Backend-фреймворк: NestJS (предпочтительно) или Express.js / Fastify с обязательной слоистой архитектурой (Controller → Service → Repository)
Frontend-фреймворк: React (минимальное SPA для демонстрации)
База данных: PostgreSQL (использование ACID-транзакций обязательно)
Кеширование / блокировки: Redis (для хранения idempotency-ключей и/или распределенных блокировок)
Контейнеризация: Docker + docker-compose (для поднятия окружения одной командой)
Тестирование: Jest или Vitest (написать минимум 2-3 теста на конкурентные сценарии)
Опубликован 20.07.2026 в 15:00