Разработка модуля учета платежей (Full-stack на TypeScript) с защитой от дублей и переплат

Бюджет: по договоренности
Необходимо разработать веб-приложение (модуль) для учета финансовых транзакций по заказам. Это тестовое задание для проверки навыков архитектуры, работы с транзакциями БД, обработки конкурентных запросов и граничных случаев.

Бизнес-контекст:  
Дан список заказов (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

Выберите способ верификации:

Обновите страницу после прохождения верификации.