Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 

Repository files navigation

Кейс для отбора на стажировку

T-Образование

Блокировка платежей (API + БД)

Условие

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

Задача бизнеса

  • нужна возможность заблокировать платежи конкретного клиента
  • нужна возможность разблокировать платежи клиента
  • нужна возможность отложить блокировки мошенников от блокировки добропорядочных клиентов

Тебе надо предложить решение по реализации этого запроса бизнеса

  • Подготовить спецификацию (желательно в формате OpenAPI / Swagger) endpoint'ов для реализации задач выше
  • Предложить структуру хранения нужной информации в БД

Особенности реализации:

Основные сущности в системе - это клиенты, счета, платежи.


Клиент имеет следующие статусы: CREATED, ACTIVE, TEMPORARILY_BLOCKED, BLOCKED, CLOSED.

🟢 CREATED

  • Клиент создан в системе, но ещё не прошёл активацию
  • Дефолтный статус при регистрации, до завершения проверок документов, ввода всех реквизитов, интеграций с другими системами
  • Ограничения: работа со счетами, переводы и операции недоступны

🟢 ACTIVE

  • Основной рабочий статус клиента
  • Клиент прошёл все проверки и может создавать счета, проводить с них платежи

🟡 TEMPORARILY_BLOCKED

  • Временная блокировка всех платежей до выяснения обстоятельств
  • Применяется при подозрениях в мошенничестве, технических ошибках или необходимости дополнительной проверки
  • Ограничения: новые платежи отклоняются, все начатые платежи, после получения такого статуса, приостанавливаются и получают статус ON_HOLD. Клиент не может инициировать новые переводы (даже на свои счета) и открывать новые счета, пока блокировка не снята

🔴 BLOCKED

  • Клиент полностью заблокирован. Все его счета также заблокированы
  • Применяется при подтверждённом мошенничестве, нарушении договора или решении банка прекратить обслуживание
  • Ограничения: все платежи отклоняются, а находящиеся в статусе ON_HOLD получают статус REJECTED. Открывать счета и проводить новые платежи невозможно. Разблокировка возможна только вручную

⚫ CLOSED

  • Клиент закрыт и больше не обслуживается
  • Устанавливается при расторжении договора, добровольного закрытия клиентом
  • Ограничения: Новые платежи невозможны, статус финальный

Клиент может быть двух типов: NATURAL_PERSON и LEGAL_PERSON. Базовый клиент хранит общий набор данных, одинаковый для физических и юридических лиц. Специализированные сущности при этом ссылаются на базового клиента и имеют собственный набор полей. (На данном этапе не рассматривается устройство этих таблиц)


Сущность счет отражает расчетный счет клиента в системе. Используется для проведения исходящих платежей.

🟢 CREATED

  • Счёт создан в системе, но ещё не активирован для операций
  • Дефолтный статус при открытии счёта
  • Ограничения: нельзя проводить платежи

🟡 ACTIVE

  • Счёт готов к полноценной работе и доступен для платежей
  • Основной рабочий статус используемого счёта
  • Ограничения: необходимо соблюдать стандартные лимиты и правила банка при проведении платежей

🟠 BLOCKED

  • Счёт временно или полностью заблокирован для проведения платежей
  • Может использоваться для фиксации проблем (например, подозрение в мошенничестве, судебные ограничения, нарушение договора)
  • Ограничения: нельзя проводить платежи. Счет может быть разблокирован банком. Если клиент уклоняется от проверки или подает ложные сведения, банк может не только оставить блокировку, но и закрыть счет окончательно

🔴 CLOSED

  • Счёт закрыт и более не используется
  • Конечный статус, перевод средств невозможен
  • Ограничения: счёт нельзя активировать повторно, для работы требуется открыть новый счёт

У клиента может быть несколько счетов, с которых он может совершать платежи. Счет требует указать тип валюты, в которой будут храниться сбережения (RUB, USD, EUR и т.д.)


Платёж инициируется клиентом и всегда осуществляется с одного из его счетов.

Платеж также проходит несколько стадий. Его статусы: CREATED, DRAFTED, VALIDATED, ON_HOLD, REJECTED, SENT_TO_BANK, SUCCESS, FAILED, CANCELLED.

🟢 CREATED

  • Платёж создан в системе, но ещё не прошёл проверки. Сформирован счет на оплату с реквизитами
  • Стартовый статус при инициации перевода
  • Ограничения: нельзя отправлять в банк до прохождения валидаций, платеж можно отменить

🟢 DRAFTED

  • Сформировано и подписано платежное поручение
  • Промежуточный статус перед дальнейшими проверками
  • Ограничения: платёж ещё не ушёл в банк, его можно отменить

🟡 VALIDATED

  • Все реквизиты и лимиты проверены, средства спиcаны со счета клиента
  • Промежуточный статус перед отправкой в банк
  • Ограничения: платёж ещё не ушёл в банк, его можно отменить

🟡 ON_HOLD

  • Платёж временно заблокирован, например, по подозрению клиента в мошенничестве или по другому решению банка
  • Платеж удерживается в статусе до выяснения обстоятельств
  • Ограничения: дальнейшая обработка невозможна, пока ON_HOLD не снят или платёж окончательно не отклонён банком

🔴 REJECTED

  • Платёж отклонён системой или банком до фактической отправки
  • Платеж может быть отклонен как в индивидуальном порядке, так и в случае блокировки клиента
  • Ограничения: возврат в работу невозможен, только повторное создание нового платежа. Платеж может быть заблокирован только до отправки в банковскую систему

🔵 SENT_TO_BANK

  • Платёж прошёл все проверки и отправлен в банк или платежную систему на исполнение
  • Финальная стадия со стороны платёжного сервиса клиента-отправителя
  • Ограничения: отмена уже невозможна, исход зависит от ответа банка. Если клиент был заблокирован после отправки платежа в банковскую систему, то платеж выполнится успешно

🟢 SUCCESS

  • Платёж успешно проведён банком и зачислен на счет клиента-получателя
  • Финальный положительный статус
  • Ограничения: возврата назад нет, платёж считается завершённым. Возврат прошедшего платежа возможен только по требованию суда

🔴 FAILED

  • Банк не смог провести платёж (например, счёт получателя закрыт, недостаточно средств у отправителя)
  • Финальный отрицательный статус. Может быть установлен как на начальной стадии обработки платежа, так и на финальной, после отрицательного ответа от банка клиента
  • Ограничения: возврат невозможен, можно только инициировать новый платёж

⚫ CANCELLED

  • Платёж отменён клиентом или системой до отправки в банк
  • Добровольная отмена клиентом, либо системная отмена
  • Ограничения: после отмены платёж не возобновляется, нужен новый

Платеж может быть внутрибанковским, это значит, что он проводится внутри системы банка. Межбанковский платеж требует передачи в расчётную систему. Для ясности у платежа указывается тип INTERNAL/EXTERNAL. В обоих случаях платеж проходит схожие стадии изменения статуса при обработке, однако их смысл может незначительно различаться в зависимости от типа платежа. Стоит отметить, что внутрибанковский платеж может быть заблокирован на любом этапе до своего завершения, а межбанковский - до отправки в расчетную систему.


Клиент может быть заблокирован по нескольким причинам. Платеж также может быть заблокирован по нескольким причинам. Все стандартные причины блокировок хранятся в отдельной общей таблице. Некоторые категории блокировок:

  1. FRAUD (Мошенничество)
  • Подозрение в мошеннической деятельности. Подозрительные действия, направленные на обман. Обычно блокировка временная до расследования.
  1. AML (Противодействие отмыванию денег)
  • Подозрительные операции, связанных с отмыванием денег. Это часть требований закона 115-ФЗ в РФ.
  1. COMPLIANCE (Соблюдение норм и правил)
  • Блокировка связана с соблюдением внутренних или внешних правил банка и регуляторов. Операции с запрещёнными контрагентами.
  1. TECHNICAL (Технические причины)
  • Платёж блокируется по техническим причинам, не связанным с мошенничеством или нарушением правил.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors