Сумма перевода и комиссия должны фиксироваться одной транзакцией с идемпотентностью и проверкой средств. Сначала уточните, добавляется комиссия сверху или удерживается из суммы получателя.
Псевдокодом реализуйте взимание комиссии в существующем методе `User.transfer`: какие проводки и проверки необходимы?
Сумма перевода и комиссия должны фиксироваться одной транзакцией с идемпотентностью и проверкой средств. Сначала уточните, добавляется комиссия сверху или удерживается из суммы получателя.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Сумма перевода и комиссия должны фиксироваться одной транзакцией с идемпотентностью и проверкой средств. Сначала уточните, добавляется комиссия сверху или удерживается из суммы получателя.
Для варианта «сверху» псевдокод:
проверить владельца, валюту, сумму > 0
вычислить комиссию по сохранённым правилам округления
начать транзакцию
создать уникальную операцию по idempotency_key
заблокировать затрагиваемые счета в общем порядке
проверить баланс отправителя >= сумма + комиссия
записать движение: отправитель -> получатель, сумма
записать движение: отправитель -> счёт комиссии, комиссия
зафиксировать транзакцию
Проводки должны быть сбалансированы в рамках принятой модели ledger; деньги считают целыми минимальными единицами. Повтор возвращает прежний результат, а отмена создаёт компенсирующие записи. Исходный User.transfer не приведён, поэтому это контракт алгоритма, не точечный патч его кода.