Integração de Segurança e Rastreamento (App Mobile)
Pilar: 02 — Funcionalidades Core / App Mobile
Status: 🟢 Implementado
Última Revisão Técnica: 2026-08-03
Módulos Conectados:gatein-server(app/api/mobile/activities.py,app/models.py),gatein-app(src/screens/SafetyIntegration,src/screens/Security)
1. Visão Geral e Arquitetura do Módulo
O módulo de Integração de Segurança e Rastreamento assegura a conformidade de motoristas com os treinamentos, regras de pátio e protocolos de segurança exigidos por cada Terminal ou Transportadora. Além disso, provê mecanismos de rastreamento de localização durante viagens ativas, alertas de pânico/emergência e monitoramento de saída inesperada de cercas virtuais (geofences).
1.1 Diagrama de Sequência e Liberação de Pendência
sequenceDiagram
autonumber
actor M as Motorista / App Mobile
participant S as Gatein Server (FastAPI)
participant DB as PostgreSQL
participant SEC as Sistema Externo de Segurança / WebView
M->>S: GET /mobile/activities
S->>DB: Consulta SafetyIntegrations (company_id, user_tax_id)
alt Sem integração válida ou expirada (expires_at < now())
S-->>M: Retorna is_safety_integration_pending = True
M->>M: Exibe aviso de pendência no card + Bloqueia Check-in
M->>SEC: Abre Tela SafetyIntegration (Vídeo / Quiz de Segurança)
SEC->>S: POST /mobile/safety/complete (Token de Conclusão)
S->>DB: Insere/Atualiza registro em safety_integrations (Validade: 30 dias)
S-->>M: Liberação efetuada! is_safety_integration_pending = False
else Integração Válida
S-->>M: Retorna is_safety_integration_pending = False (Check-in Liberado)
end
2. Estruturas de Dados e Schemas Explícitos
2.1 Modelo Relacional no Banco de Dados (safety_integrations)
| Coluna | Tipo SQL | Constraints | Descrição / Regra |
|---|---|---|---|
id | UUID | PRIMARY KEY, Default gen_random_uuid() | Identificador único interno |
company_id | UUID | FOREIGN KEY (companies.id), NOT NULL | Empresa detentora da exigência de segurança |
user_tax_id | VARCHAR(14) | NOT NULL, INDEX | CPF do motorista validado |
status | VARCHAR(32) | NOT NULL, Default 'COMPLETED' | Estado da integração (COMPLETED, EXPIRED, REVOKED) |
completed_at | TIMESTAMPTZ | NOT NULL, Default now() | Timestamp em que o motorista concluiu a integração |
expires_at | TIMESTAMPTZ | NOT NULL | Timestamp em que o certificado/integração expira |
certificate_url | VARCHAR(512) | NULLABLE | URL do comprovante em PDF gerado (opcional) |
2.2 Schemas de Resposta da API Mobile (SafetyIntegrationResponseSchema)
{
"success": true,
"data": {
"company_id": "p4k2n8m9",
"company_name": "Terminal Marítimo de Santos",
"is_pending": false,
"completed_at": "2026-07-15T14:30:00Z",
"expires_at": "2026-08-14T14:30:00Z",
"days_remaining": 11,
"integration_url": "https://seguranca.terminal.com.br/treinamento?cpf=12345678901"
}
}
3. Regras de Negócio Explícitas (RN-SEC-XXX)
RN-SEC-001: Trava de Check-in por Pendência de Segurança
user_tax_id == CPF_Motorista AND company_id == ID_Empresa AND expires_at > now()
Enquanto is_safety_integration_pending == True, o botão de check-in permanece desabilitado no app mobile e o servidor rejeitará qualquer submissão REST com HTTP 403 (SAFETY_INTEGRATION_REQUIRED).
RN-SEC-002: Renovação e Período de Validade
A validade padrão de uma integração de segurança é configurável por empresa (padrão: 30 dias corridos a partir da data de conclusão completed_at). Quando faltarem 5 dias para a expiração, o app exibirá um alerta preventivo convidando o motorista a renovar a integração antes da chegada ao pátio.
RN-SEC-003: Rastreamento de Localização Exclusivo em Viagens Ativas
O envio de coordenadas GPS em segundo plano (telemetria de rastreamento) só é ativado se o motorista possuir uma viagem (Trip) ou agendamento (Appointment) com o status IN_PROGRESS ou ON_GOING.
- Assim que a operação transiciona para
COMPLETEDouCANCELLED, o serviço de localização em segundo plano do React Native (BackgroundGeolocation) é imediatamente suspenso.
RN-SEC-004: Alerta Manual de Emergência / Pânico
Dentro do módulo de Segurança, o motorista possui um botão de "Alerta de Emergência". Ao ser acionado:
- O app captura instantaneamente a posição GPS exata, nível de bateria e velocidade do veículo.
- Dispara
POST /mobile/security/panic-alert. - O servidor notifica o painel Web do Terminal em tempo real via WebSocket e envia e-mail/SMS para a equipe de segurança da empresa.
RN-SEC-005: Política de Retenção e Privacidade de Dados de Localização
Em conformidade com a LGPD e regras de privacidade, dados de telemetria e localização de viagens finalizadas possuem um período máximo de retenção de 90 dias no PostgreSQL, sendo expurgados por rotinas automáticas do APScheduler.
4. Detalhamento de Endpoints
4.1 GET /mobile/safety-integration/{company_id}
Consulta o status da integração de segurança do motorista autenticado para determinada empresa.
4.2 POST /mobile/safety-integration/complete
Registra a conclusão de um treinamento de segurança e emite a validade.
4.3 POST /mobile/security/panic-alert
Dispara um sinal auditável de emergência com coordenadas GPS para a equipe de pátio do terminal.
5. Regras de Segurança e Tratamento de Erros
| Código HTTP | Código Interno | Causa Raiz | Ação no App Mobile |
|---|---|---|---|
403 Forbidden | SAFETY_INTEGRATION_REQUIRED | Tentativa de check-in com integração pendente | Redirecionar para tela de treinamento |
400 Bad Request | EXPIRED_INTEGRATION_TOKEN | Token de conclusão de treinamento inválido | Solicitar refazer o treinamento |
404 Not Found | COMPANY_SAFETY_NOT_CONFIGURED | Empresa não possui integração de segurança configurada | Liberar fluxo padrão sem restrição |