Разработка модуля учета платежей (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

FL-Core — Биржа безопасных сделок и фриланса

FL-Core — современная инновационная платформа для поиска заказчиков и исполнителей. Безопасная сделка, удобный чат, кастомные услуги и прозрачный арбитраж.

Разделы сайта:

  • Услуги фрилансеров (Кворки)
  • Каталог фрилансеров
  • Справка и помощь (FAQ)
  • Контакты и реквизиты