Login
Android: LoginFragment · CodeConfirmationFragment · NewLoginViewModel
Ponto de entrada do app. Suporta autenticação por senha com JWT, biometria, OTP via SMS e seleção de empresa com propagação de permissões.
Fluxo de Autenticação
1
POST /v1/auth/login
Body: { "username": ..., "password": ... }. Retorna jwt_token, user_id, dados de empresas e permissões.
2
Seleção de empresa
Se o usuário tem acesso a múltiplas empresas, um diálogo de seleção é exibido. O company_id selecionado é persistido em SharedPreferences("selected_company").
3
Resolução de permissões
O LoginViewModel chama configPermsTree() e analyzePermissionIds() para resolver as permissões do usuário para a empresa selecionada. O resultado é salvo em SharedPreferences("DATA"), chave "perms_user".
4
Navegação
Redireciona para HomeFragment via NavController (nav_home).
Funcionalidades
| Feature | Detalhe |
|---|---|
| Autenticação por senha | POST /v1/auth/login → JWT + dados de empresas |
| Login biométrico | Lê JWT salvo em SharedPreferences("jwt_tokens"). Se expirado, redireciona para login por senha. |
| OTP via SMS | Fragment CodeConfirmationFragment — confirma código enviado ao celular cadastrado. |
| Seleção de empresa | company_id persistido após login. Usado em todas as chamadas subsequentes. |
| Lembrar senha | Salva credenciais em SharedPreferences("loginPrefs") com flag saveLogin. |
| Prominent Disclosure | Diálogo obrigatório Google Play antes de solicitar permissão de localização. |
Papéis de Usuário e Permissões
| Papel | Flag JSON | Permissões resultantes |
|---|---|---|
| master | "master": true | Todas as permissões da empresa via analyzeAllPermissions() |
| motorista | "motorista": true | Permissões fixas: ["1", "8", "93", "94"] |
| responsavel / padrão | "responsavel": true | União de permissões diretas do usuário + permissões do setor via analyzePermissionIds() |
Resolução de Permissões (detalhes)
// Para usuário master: todas as permissões
val perms = analyzeAllPermissions(config)
// Para motorista: conjunto fixo
val perms = setOf("1", "8", "93", "94")
// Para usuário padrão: usuário + setor combinados
val userPerms = getUserPermissions(companyInfo) // array "perm" no JSON
val sectorPerms = getSectorPermissions(sectors, sectorId)
val combined = combinePermissions(userPerms, sectorPerms)
val perms = analyzePermissionIds(config, categories, combined)
combinePermissions: se userPerms está vazio, usa só as do setor; se sectorPerms está vazio, usa só as do usuário; caso contrário faz a união dos dois conjuntos.
Persistência após Login
| SharedPreferences | Chave | Conteúdo |
|---|---|---|
jwt_tokens | jwt_token | Bearer JWT para chamadas v1 |
DATA | perms_user | JSON array de IDs de permissão |
DATA | nome, cpf, company_names, user_perms_json, sectors | Dados do usuário e empresas para o ConfigurationFragment |
selected_company | company_id | Empresa ativa — usada como filtro em todos os módulos |
user_id | user_id, user_role | Identificação e papel do usuário |
master | master | Boolean — acesso total |
driver | driver | Boolean — restringe navegação ao módulo motorista |
Endpoints
POST
/v1/auth/login
Autenticação principal. Body:
{ "username": "...", "password": "..." }. Retorna JWT, dados de empresas e estrutura de permissões.
POST
/v1/auth/generate_access_token
Geração de token de acesso após validação OTP.
POST
/v1/auth/refresh
Renovação do JWT expirado. Chamado automaticamente quando o biométrico detecta token expirado.