📝 Онбординг клиента (лендинг → кабинет)

Self-service поток по архитектуре Iorys (НЕ по модели Lumera). Клиент сам подаёт заявку, проходит KYC, оператор вручную активирует и формирует кабинет. Код: cabinet/app/main.py (/onboarding*), capital-kyc (SumSub), backoffice (/companies/{id}/activate). С 16.09.2026 регистрация - email-first (2 шага) + многоблочная анкета (9 блоков) по корпоративной анкете Stefa Pay (в main 5127b2b, задеплоено). Спека: 14 Iorys_Copy/00 Онбординг - путь регистрации/СПЕКА - многоблочная регистрация.md.

Сквозной поток

1. Лендинг → Онбординг (регистрация) или Логин (в кабинет)
2. EMAIL-FIRST: email + пароль → письмо со ссылкой → verify
                → создаются CabinetUser + Company(status=application) + Membership
3. МНОГОБЛОЧНАЯ АНКЕТА (9 блоков, черновик сохраняется после каждого шага)
4. SumSub: create_applicant → verification_url → клиент проходит KYC/KYB
   → Company.status=kyc_pending
5. Вебхук applicantReviewed (GREEN/RED) → capital-kyc → форвард в Ledger
6. Оператор в Ledger: GREEN → активирует; RED/on-hold → доп-запрос или отказ
7. Активация /companies/{id}/activate → status=active, оператор формирует кабинет
   (счета, карты, реквизиты)
8. Email «счёт активен» → клиент логинится → пользуется кабинетом

Шаг 1: email-first (2 шага вместо большой формы)

Клиент вводит только email + пароль (мин 8, ×2) → получает письмо со ссылкой verify → по ссылке email_verified=true и открывается анкета. Дубль email → 409 (включая гонку одновременных заявок - P2-1). Форма под CSRF + login-limiter, бренд Stefa Pay (Manrope, navy+gold, dropdown стран, responsive).

Шаг 2: многоблочная анкета - 9 блоков (Business)

Анкета по образцу Iorys (у Iorys 12 шагов - дубли схлопнуты), поля - по корпоративной анкете Stefa Pay. Прогресс «Шаг N из 9», черновик пишется в Company после каждого шага (onboarding_step), «Continue previous application» поднимает с места остановки.

# Блок Суть
B1 🚪 Account & credentials email + пароль + тип аккаунта (сделано email-first-шагом)
B2 🏢 Company profile название, юрисдикция, рег. номер, tax id, сайт, NACE
B3 📇 Registered address юр. адрес компании
B4 👤 Applicant заявитель: имя, телефон, DOB, tax country/id
B5 🧑‍💼 Directors / UBO развилка «вы директор/единственный владелец?» → карточки директоров и UBO → таблица CompanyPerson
B6 💰 Business information обороты in/out, число транзакций, страны операций, описание деятельности (AML-вход)
B7 💵 Tariff plan карточки TARIFF 1/2/3/Individual - инфо + предпочтение; фактический план назначает оператор
B8 📄 KYC-документы пакет KYB через ClientDocument (+ «Provide later»)
B9 🪪 SumSub WebSDK-верификация → финиш «заявка отправлена»

Модель: +37 полей на Company (анкетные) + новая таблица CompanyPerson (директора/акционеры/UBO) - миграция b1d4f7a9c2e6 (+ merge c3f8a1e6d4b2, head на проде). Private-сценарий (6 блоков) - каркас заложен, полная проработка отложена (основной клиент - B2B).

Шаг 3: KYC/KYB в SumSub

Клиент проходит верификацию в SumSub (уровни kyc-director-msb-ca-v1 / kyb-msb-ca-v1). Демо-прогон 16.09 дошёл до SumSub (applicant создан, kyc_pending). Живой онбординг вендора Iorys для референса: 15 Архитектура Capital/Iorys онбординг - оба сценария.pdf.

Шаг 4: вебхук вердикта

SumSub шлёт applicantReviewed на kyc.algorys.cc/webhooks/sumsub (HMAC). capital-kyc проверяет подпись, дедуплицирует, форвардит reviewAnswer (GREEN/ RED) в Ledger, где обновляется kyc_status компании. applicantPending/ applicantOnHold → PENDING/ON_HOLD.

Шаг 5: активация оператором

Шаг 6: клиент в кабинете

Email «счёт активен» → клиент логинится (email+пароль, опц. 2FA) → пользуется: платежи, бенефициары, FX, инвойсы, карты, документы, messaging, выписка. Неактивная компания в кабинет не пускает (403).

Статусы Company

onboardingapplication (заявка подана) → kyc_pending (email verified, KYC идёт) → active (оператор активировал). kyc_status: nonepending → GREEN/RED (из вебхука).

Известные баги (ветка feature/onboarding-fixes, в работе)

KYC-финал websdkLink (тупик) · i18n на Documents · Send money - статус pending · коднейм Capital в клиентском UI → Stefa Pay · Jurisdictions picker · пре-заполнение блока 6.