Перейти к содержанию

Модуль «Финансы»: архитектура, реализация и доработки

Цели и охват

  • Двойная запись (double-entry) с отложенными проверками баланса.
  • Номинальные счета, комиссионные доходы, задолженности партнёрам, возвраты.
  • Мульти‑тенант: tenant_id в каждой таблице и функции.
  • Идемпотентность, защита от дублей вебхуков, неизменяемость проводок.
  • Автоматические синхронизации балансов кошельков.
  • Отчёты: GMV, net revenue, ожидающие выплаты.
  • RPC‑функции для безопасных транзакций: create_ledger_transaction, create_refund_transaction.
  • FastAPI API, React UI (shadcn‑UI) для админов.

Данные и ограничения

  • Таблицы: accounts, wallets, ledger_transactions, ledger_entries, payout_requests, invoice_documents, webhook_events_in.
  • Ограничения:
  • ledger_entries неизменяемы после вставки.
  • Constraint trigger enforce_double_entry проверяет равенство суммы дебетов и кредитов.
  • wallets синхронизируются из ledger_entries при изменении (триггеры).
  • Идемпотентность и антиповторы на уровне индексов.

RPC‑функции

  • create_ledger_transaction(...):
  • Создаёт транзакцию ledger_transactions со статусом posted.
  • Вставляет массив проводок ledger_entries для этой транзакции.
  • Возвращает JSON с идентификаторами.
  • create_refund_transaction(...):
  • Находит исходную транзакцию и проверяет суммы.
  • Создаёт возврат refund с инверсией направлений проводок.
  • Делит сумму возврата пропорционально исходным проводкам, учитывая округление.

FastAPI

  • Роутер /api/v1/finance:
  • POST /charges — создание операции списания с разнесением на номинальный счёт, задолженность партнёру и комиссию портала.
  • POST /refunds — частичный или полный возврат.
  • POST /payouts/requests — заявка на выплату партнёру.
  • GET /wallets — список кошельков текущего tenant.
  • GET /reports/gmv и GET /reports/net-revenue — отчёты за период.
  • GET /reports/pending-payouts — ожидающие выплаты.
  • Сервис:
  • Автосоздание недостающих счётов при первом обращении.
  • Привязка реальных account_id по code+currency с владельцем.

React (Админ)

  • Страница /admin/finance:
  • Фильтр по дате.
  • Карточки GMV, net revenue, ожидающие выплаты.
  • Таблица кошельков: баланс/доступно/ожидает.
  • Форма создания payout‑заявки с идемпотентным заголовком.

Верификация и тесты

  • Линт/типизация: npm run lint, сборка.
  • Интеграционные тесты RPC:
  • Проверяют пропорциональный partial refund.
  • Гарантируют double‑entry баланс при транзакциях.

Доработки

  • Чарт‑оф‑аккаунтс: выделить обязательные шаблоны по аренде/страховке/доп.услугам и миграции для их начального наполнения.
  • Расширить отчёты: маржинальность по направлениям, комиссии по поставщикам, удержания, акты сверок.
  • Провести нормализацию кошельков: разделить кошельки партнёров и номинальные на уровень справочника.
  • Настроить роле‑бэйзд доступ: только админы могут видеть агрегированные отчёты; партнёры — только свои кошельки и выплаты.
  • Добавить события в шину: finance.transaction.posted, finance.payout.requested для аудита и нотификаций.
  • Метрики и алерты: ошибки double‑entry, недостающие счета, отклонения по отчётам.
  • Вебхуки провайдеров: валидация подписей и регламент повторной доставки.