Разработка модуля учета платежей (Full-stack на TypeScript) с защитой от дублей и переплат (для всех)
Категория: Сайты и IT
Бюджет: 3,500.00 руб.
Срок выполнения: 3 дней.
Город: Удаленная работа
Описание задачи:
Необходимо разработать веб-приложение (модуль) для учета финансовых транзакций по заказам. Это тестовое задание для проверки навыков архитектуры, работы с транзакциями БД, обработки конкурентных запросов и граничных случаев.
Бизнес-контекст:
Дан список заказов (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 (с
Требуемые навыки: Программирование / Fullstack
Заказчик: @fl_client