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

06 admin kyc

AdminKycEndpoint — KYC верификация для операторов.

Роли

_requireRoles проверяет JOIN admin_user_rolesadmin_roles:

Проверка Допустимые роли
_requireAdmin (базовая, без ролей) любая admin-запись в admin_user_roles
_requireRoles(['operator', 'superadmin']) operator, superadmin
_requireRoles(['superadmin', 'operator']) superadmin, operator (эквивалентно)

getQueue и getDetail используют только _requireAdmin — доступны любому admin.

Методы

Метод Роль Результат
getQueue() любой admin Список KYC в статусе pending_operator_review с масками профиля и presigned URL документов
getDetail(userId) любой admin Полная KYC карточка: статусы, presigned URLs (front/back/selfie), маски профиля
revealOcrResult(kycId, reason) operator, superadmin Расшифрованный KycOcrResult + audit ocr_revealed
approve(userId) superadmin, operator KycService.operatorApprove + audit kyc_approve
reject(userId, reason) superadmin, operator KycService.operatorReject(reason) + audit kyc_reject
finalize(userId) superadmin, operator KycService.finalizeVerification + audit kyc_finalize
setKycTier(userId, tier) superadmin, operator Ручная установка tier + accountTierOverriddenByAdmin=true + audit kyc_set_tier

finalize() — пошагово

Делегирует в KycService.finalizeVerification, который выполняет транзакцию:

  1. KycVerification.status'fully_verified', фиксирует operatorReviewedAt.
  2. User.status'active'.
  3. UserProfile.isLockedtrue, lockedAt = now; audit profile_locked.
  4. Если !accountTierOverriddenByAdmin: UserProfile.accountTier'STANDARD'.

После транзакции (fire-and-forget, не ломает finalize при ошибке):

  1. Push-уведомление пользователю: шаблон kycFullyVerified, локаль по languageCode (TH→th, RU/KZ/BY/UA→ru, иначе en), канал security.

После finalizeTODO(IPPS): PM-endpoint /accounts/external/ipps для внешнего банковского кошелька ещё не реализован. Внутренний tbAccountId уже существует (создан в confirmKycData), баланс работает.

revealOcrResult

  • reason ≥ 10 символов обязателен (ArgumentError иначе).
  • Расшифровывает kyc_verification.ocrResult через PiiDecryptionService.decryptOcrForAdmin.
  • Пишет audit ocr_revealed с полями kycId, reason, traceId.

setKycTier

Допустимые значения tier: BASIC, STANDARD, PREMIUM, VIP.

После ручной установки устанавливается флаг accountTierOverriddenByAdmin=true — автологика KYC (finalizeVerification, operatorApprove) не будет перезаписывать tier.

getQueue — формат ответа

{ userId, kycId, status, submittedAt, fullName (masked), phone (masked), frontUrl, selfieUrl }

Загружает все профили одним запросом (IN-set), а не N запросами. frontUrl и selfieUrl — presigned S3 через StorageService.getDownloadUrl.

Важно

  • approve и finalize — разные шаги. approve = operatorApprove (промежуточный статус), finalize = полная активация пользователя.
  • Audit всегда содержит adminId (добавляется в JSON merge внутри _audit).
  • Ошибка записи в audit_log логируется как warning, не прерывает выполнение метода.