/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
| Campo | Comportamento |
|---|---|
| Nome da empresa | Obrigató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 administrador | Obrigatório. |
type=email. Vira o login e entra no ent-user-directory. | |
| Senha + Confirmar senha | Lado 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 Ltda → pedras_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.