/signup — Criar conta da empresa

Página pública, sem login. Um formulário só, em cartão sobre o gradiente da marca. Cria a organização e o usuário administrador na mesma submissão — dispara o flx-onboarding inteiro.

Campos

CampoComportamento
Nome da empresaObrigatório. Enquanto o slug não for editado à mão, cada tecla aqui sugere um slug.
Identificador (slug)Sugerido automaticamente; ao editar, para de ser sugerido (slugEditado). Força minúsculas na digitação. Ajuda visível: “letras minúsculas, números e _ (2–31 caracteres, começa com letra)“.
Nome do administradorObrigatório.
E-mailtype=email. Vira o login e entra no ent-user-directory.
Senha + Confirmar senhaLado a lado no desktop, empilhados no mobile.

A sugestão de slug (suggestSlug) tira acento por normalização NFD, baixa para minúsculas, troca tudo que não é alfanumérico por _, remove o que vier antes da primeira letra e o _ final, e corta em 31. Pedras Preciosas Ltdapedras_preciosas_ltda.

Fluxo de sucesso

Submissão → botão vira “Criando conta…” com spinner e aria-busy → resposta 201 → o formulário é substituído por um cartão de boas-vindas com o nome da empresa → redirect automático para /login em 3,5s, com botão “Ir para o login” para quem não quiser esperar.

Não há login automático: a pessoa entra pela tela-login com o e-mail e a senha que acabou de definir.

Estado real

A tela funciona e é agradável — mobile-first, rolagem contida no container, spinner e estados de erro corretos. Três problemas, todos na costura com o backend:

1. Regra de senha divergente [P]

O formulário valida mínimo 6 caracteres; a API exige mínimo 8 (SignupIn.admin_password, min_length=8). Senha de 6 ou 7 passa na validação local, vai para a rede e volta como erro de validação da API — que o formulário exibe como mensagem genérica.

A pessoa preenche tudo, clica, e leva um erro que a própria tela disse estar OK. É a correção mais barata desta fatia: alinhar o 6 do validar() com o 8 da API.

2. Sem sinal de progresso [M]

O spinner cobre uma operação que cria dois bancos e roda 70 migrations. Não há barra, etapa nem estimativa — só “Criando conta…“. Se o provisionamento demorar, a tela parece travada.

3. Beco sem saída no erro [P]

Se o provisionamento falhar no meio, a API responde 500 e a segunda tentativa com o mesmo slug devolve 409 “slug já utilizado”, porque a organização já foi criada. A tela mostra a mensagem crua e a pessoa não tem ação possível. Detalhe em flx-onboarding.

O que a tela não faz (e o produto precisa)

  • Não verifica o e-mail. Endpoint público que cria bancos, sem confirmação e sem limite por IP, é vetor de abuso.
  • Não checa o slug enquanto se digita. A colisão só aparece depois de submeter.
  • Não entrega o ent-sync-token. Quem se cadastra aqui sai com uma organização que não tem como ser integrada — o token só é impresso pelo CLI (python -m src.provision).

Lacunas

Rastreadas na fase-1-onboarding.