T-Образование
Представим, что ты системный аналитик на проекте в Т-Банк.
В вашем продукте реализован сервис по отправке платежей юридическим лицам.
Но периодически возникают ситуации, когда платежи надо приостановить, потому что клиент ненадежен (есть подозрение на мошенничество и нужно время разобраться), либо клиент предоставил не те реквизиты для перечисления средств (нужны дополнительные проверки).
Ты должен предложить структуру базы данных и реализовать сервис по блокировке платежей.
- нужна возможность заблокировать платежи конкретного клиента
- нужна возможность разблокировать платежи клиента
- нужна возможность отложить блокировки мошенников от блокировки добропорядочных клиентов
- Подготовить спецификацию (желательно в формате 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. В обоих случаях платеж проходит схожие стадии изменения статуса при обработке, однако их смысл может незначительно различаться в зависимости от типа платежа. Стоит отметить, что внутрибанковский платеж может быть заблокирован на любом этапе до своего завершения, а межбанковский - до отправки в расчетную систему.
Клиент может быть заблокирован по нескольким причинам. Платеж также может быть заблокирован по нескольким причинам. Все стандартные причины блокировок хранятся в отдельной общей таблице. Некоторые категории блокировок:
- FRAUD (Мошенничество)
- Подозрение в мошеннической деятельности. Подозрительные действия, направленные на обман. Обычно блокировка временная до расследования.
- AML (Противодействие отмыванию денег)
- Подозрительные операции, связанных с отмыванием денег. Это часть требований закона 115-ФЗ в РФ.
- COMPLIANCE (Соблюдение норм и правил)
- Блокировка связана с соблюдением внутренних или внешних правил банка и регуляторов. Операции с запрещёнными контрагентами.
- TECHNICAL (Технические причины)
- Платёж блокируется по техническим причинам, не связанным с мошенничеством или нарушением правил.