# Onboarding Nextcode: correcoes + unificacao + deploy (24/07)

> Executar com TDD. Commits locais por peca. Deploy so apos validacao HML.
> Base: branch `deepaudit/paridade-legadopix-2026-07-23` (tem o onboarding mais novo).

## Decisoes do dono (24/07, fechadas)
1. **Unificar**: a tela principal "Onboarding" do coreadmin passa a listar TAMBEM as
   jornadas Nextcode (Modelo B: nextcode_proposals), junto do fluxo proprio (Modelo A).
2. **PJ**: mantem o disparo da Nextcode no passo SMS; o KYC apenas ACOMPANHA (mostra
   status/link, sem reoferecer "iniciar"); remove o duplo completeStep('kyc').
3. **Corrige + sobe IB e merchant nos 2 ambientes** (rebuild com VITE_APP_ENV=production).

## Diagnostico confirmado ao vivo (HML)
- Repeticao Nextcode: bug real de frontend IB. PF `PendingView.vue` re-mostra "Abrir
  jornada" mesmo com journeyStatus=finished; PJ dispara no SMS e reaparece no KYC +
  duplo completeStep. Arquivos: `core/apps/banking/src/views/onboarding/{EmailView,PendingView}.vue`,
  `.../views/business-onboarding/{Step4SmsView,Step8KycView}.vue`.
- "PF nao replica": NAO e pipeline quebrado. A jornada PF aparece completa em "Revisao
  Nextcode" (confirmado: proposta cf5a0cb3, PF finished, KYC approved, com dossie). Ela
  NAO aparece na tela "Onboarding"/"Revisoes KYC" porque essas leem so o Modelo A
  (`admin/onboarding_controller.ex:31-67`). Decisao do dono: unificar.
- Dossie PDF: existe para jornadas com webhook; fragil quando finaliza por polling
  (`sync_status`/`sync_pending_proposals` em `proposals.ex:398-450` nao busca PDF nem
  enfileira PdfFetcher; sem cron de fallback).

## Pecas (TDD cada uma)

### A. IB frontend — repeticao Nextcode (core/apps/banking)
- PF `PendingView.vue`: quando `journeyStatus in (in-progress, finished)`, NAO oferecer
  "Abrir jornada" de novo; mostrar estado ("em analise"/"verificacao enviada"). O
  `v-if="journeyLink"` (linha ~176) passa a gatear tambem no status.
- PF `EmailView.vue`: garantir que so redireciona a Nextcode uma vez (idempotente).
- PJ `Step4SmsView.vue`: dispara no SMS (mantido).
- PJ `Step8KycView.vue`: KYC so ACOMPANHA (mostra status/link), sem reoferecer iniciar
  quando ja in-progress/finished; remove o duplo completeStep (startKyc + confirmJourney).
- Testes: `PendingView.journey.test.ts` (cenario de volta finished), Step8KycView.test.ts.
- vue-tsc 0 + vitest verde.

### B. Backend — robustez do dossie (core/backend)
- `sync_status`/`sync_pending_proposals` (`proposals.ex`): ao promover proposta para
  "finished", enfileirar `PdfFetcher` (ou buscar o PDF) se `final_document` nil.
- Cron de fallback: agendar o `PdfFetcher.perform` batch (sobre `get_proposals_pending_pdf`)
  no crontab (`config/runtime.exs`), respeitando o padrao dos demais workers.
- TDD: teste que uma proposta promovida a finished por polling ganha o PdfFetcher
  enfileirado; teste do batch cron. `mix test` verde.

### C. Unificar onboarding no coreadmin + correlacionar endereco (core/backend + core/apps/admin)
- Backend `admin/onboarding_controller.ex` (index): alem de OnboardingApp (PF) +
  BusinessOnboarding (PJ), incluir as nextcode_proposals (Modelo B) na lista, com um
  `source` distinto (ex.: "nextcode_pf"/"nextcode_pj") e os campos que a tela usa
  (nome, email, doc, tipo, status, data, id) + um link para a revisao Nextcode.
  NAO quebrar o contrato atual (Modelo A continua). TDD do controller.
- **Correlacao de endereco (novo requisito do dono 24/07)**: a jornada PF coleta
  endereco/ocupacao/dados pessoais nos primeiros passos e grava em
  `onboarding_applications` (Modelo A) ANTES de ir a Nextcode (CONFIRMADO ao vivo:
  CPF 32189410835 tem app com CEP/rua/cidade/UF/ocupacao). O painel Nextcode
  (Modelo B) nao mostra isso. Fix: ao servir a proposta Nextcode (index e detalhe
  `kyc_controller.ex`), correlacionar por CPF (normalizado) / email com o
  `onboarding_application` e anexar o bloco de endereco + dados iniciais ("dados do
  cadastro do IB"). Se nao houver app correlato, campo vazio (fail-soft). TDD.
- Frontend `core/apps/admin`: OnboardingQueueView renderiza as linhas Nextcode com
  badge de origem + "Revisar"; NextcodeReviewDetailView mostra o novo bloco de
  endereco/dados do cadastro. vitest verde.

### D. Branding: logo NOVO na jornada Nextcode (core/backend)
- CONFIRMADO: `kyc_provider_configs` (provider nextcode) tem `client_logo` VAZIO →
  a Nextcode usa o logo da jornada-base (antigo). O JSON externo mostrou o
  `clientLogoUrl` antigo.
- Fix: default de codigo em `proposals.ex` `to_nextcode_config`/`put_logo` — quando
  `settings["client_logo"]` for nil, usar o logo NOVO da Monetarie bundlado no
  backend (`priv/nextcode/client_logo.png`, copiado de
  `core/apps/*/src/assets/logo-monetarie-*.png`), lido e convertido a base64. Vale
  nos dois ambientes sem config manual. TDD: config com settings vazio agora carrega
  o clientLogo novo.

### D. Rebuild + deploy
- Rebuild core-banking-ui + core-merchant-ui (+ core-admin-ui se C mexer nele) com
  `--build-arg VITE_APP_ENV=production`; env de runtime CORE_API_UPSTREAM ja no task def.
- Deploy HML primeiro, validar VIVO (regra #11): criar jornada PF, ver sem repeticao;
  conferir a jornada aparecendo na tela Onboarding unificada + dossie. Depois PRD
  (digest match ou rebuild-per-env com production).

## Guardas
- NEXTCODE_ENABLED segue OFF (decisao do dono; gatilho publico). Nao ligar sem OK.
- Nao mexer em credencial/webhook config (dominio do dono).
- Deploy customer-facing: HML valida antes de PRD.
