Portal E.Rastreio
- Capítulo 01 - Visão de Negócio
- Capítulo 02 - Módulos e Funcionalidades
- Capítulo 03 - Telas e Fluxos
- Capítulo 04 - Regras de Negócio
Capítulo 01 - Visão de Negócio
Visão Geral do Sistema E.Rastreio
Propósito de Negócio
O E.Rastreio Portal é um sistema de gestão operacional de frotas e rastreamento veicular, concebido para atender cooperativas e operadores de transporte, com integração nativa à plataforma COOCA+.
Seu objetivo central é consolidar, em uma única plataforma, a operação de frotas brasileiras — indo além do rastreamento GPS puro para oferecer uma camada de gestão que abrange controle operacional, conformidade trabalhista, gestão financeira e monitoramento de segurança. O sistema atua como a camada de inteligência e gestão sobre uma base de dados de posicionamento GPS, transformando dados brutos de telemetria em informação acionável para gestores e analistas.
Padrão Arquitetural
A aplicação adota o padrão de Monólito Modular Orientado a Domínios.
Nesse modelo, a aplicação é executada como uma única unidade implantável (monólito), porém sua lógica de negócio é segmentada em domínios autônomos e coesos. Cada domínio encapsula suas próprias responsabilidades — controllers, serviços, modelos e rotas — mantendo fronteiras bem definidas entre as áreas funcionais do sistema.
Essa abordagem combina a simplicidade operacional de um monólito (implantação e manutenção unificadas) com a organização e a manutenibilidade tipicamente associadas a arquiteturas modulares, facilitando a evolução independente de cada área de negócio.
Tecnologias Principais
O sistema é construído sobre uma base tecnológica moderna e consolidada no ecossistema PHP:
| Camada | Tecnologia |
|---|---|
| Linguagem | PHP 8.2+ (ambiente atual: 8.4) |
| Framework | Laravel 11 |
| Interface (UI) | Blade (com layout baseado em Metronic) |
| Autenticação | Sessão (guard web + laravel/ui) para usuários da interface; tokens Laravel Sanctum para clientes externos da API |
| Persistência | MySQL (arquitetura de banco de dados dual) |
| Ambiente | Docker / Laravel Sail |
A plataforma ainda se apoia em recursos complementares para geração de documentos (PDF e Excel), armazenamento de arquivos em nuvem compatível com S3 e execução de rotinas automatizadas agendadas, sustentando as necessidades operacionais do negócio.
Capítulo 02 - Módulos e Funcionalidades
Introdução
Este capítulo descreve os módulos do E.Rastreio Portal conforme eles se apresentam na interface do usuário, seguindo a organização do menu lateral (sidebar). Cada grupo de menu reúne funcionalidades relacionadas e é exibido de acordo com as permissões do usuário autenticado.
1. Painéis
Ponto de entrada do sistema após o login.
- Padrão: dashboard principal com indicadores consolidados da frota.
2. Produtividade
Gestão de desempenho de analistas e metas operacionais.
- Meu Dashboard: indicadores individuais de produtividade.
- Equipe: visão consolidada da equipe (requer permissão de gerenciamento).
- Config. SLA: definição de metas e parâmetros de acompanhamento (requer permissão específica de SLA).
3. Câmeras
Monitoramento por câmeras embarcadas, integrado à plataforma Jimi Cloud.
- Devices: listagem de dispositivos, com acesso a visualização ao vivo (individual e em grade), gravações e transmissão HLS.
- Comandos: envio de instruções remotas às câmeras.
- Downloads: solicitação e gestão de arquivos de vídeo, com armazenamento em nuvem.
4. Rastreamento
- Painel: status dos rastreadores (online/offline, última comunicação).
- Mapa em Tempo Real: posição atual dos veículos, com velocidade, ignição e localização.
- Replay de Rastreamento: reconstituição do trajeto percorrido em um período.
- Relatório de Rotas: consolidação de deslocamentos, com exportação em Excel e PDF.
- Telemetria: painel analítico de desempenho por veículo. A partir de filtros de veículo e período, apresenta métricas organizadas em cinco seções — Visão Geral, Tempo e Eficiência, Paradas, Segurança e Velocidade — com detalhe em modais e exportação em PDF. Consulte o Capítulo 03 para o detalhamento das telas.
- Score de Direção (requer permissão de telemetria): ranking de motoristas, score individual, perfis de pontuação e análise por IA (Gemini), com exportação em PDF.
- Premiação (requer permissão de telemetria — gerenciar): definição e acompanhamento de recompensas por desempenho.
- Espelhamentos: compartilhamento externo de mapas via link tokenizado (com senha opcional) e cercas geográficas (geofences) que disparam alertas por e-mail na entrada/saída de veículos.
5. Ponto (EPONTODIG)
Controle da jornada de trabalho dos motoristas, com foco em conformidade trabalhista.
- Painel: visão consolidada das jornadas.
- Automático: cálculo de jornada a partir dos dados de GPS (ignição, movimento, paradas), com reprocessamento de períodos.
- Manual: lançamento e ajuste manual de pontos.
As exportações legais (AFD, AEJ e espelho de ponto em PDF) e a análise de jornada estão disponíveis a partir dos relatórios do módulo.
6. Cooca+
Integração com a plataforma externa de compras.
- Portal de Compras: consulta de limite, reservas e títulos a pagar junto à API da CoocaMais. Quando o usuário possui mais de um grupo com matrícula Cooca+ cadastrada, os dados são exibidos em abas, uma por grupo. Os dados de reservas e títulos são carregados via AJAX sob demanda.
7. Gestão
Gestão financeira ligada à operação da frota e dos motoristas.
- Painel: visão consolidada de entradas e saídas.
- Receitas: lançamento e categorização de receitas.
- Despesas: lançamento e categorização de despesas.
- Transferências: movimentações entre contas/entidades.
- Acertos: fechamento e liquidação de valores por motorista.
8. Cadastros
Gestão das entidades operacionais fundamentais.
- Pessoas: cadastro de motoristas e pessoas (dados pessoais, CNH, vínculos).
- Veículos: cadastro completo, com integração à tabela FIPE, vínculo com rastreadores e histórico de motoristas. O acompanhamento de CRM do veículo é acessado a partir daqui.
- Rastreadores: cadastro dos dispositivos e vínculo com veículos.
Atenção: o cadastro do dispositivo rastreador fica aqui, enquanto o painel de acompanhamento dos rastreadores fica no menu Rastreamento.
9. Administrador
Exibido apenas para o administrador máximo (master admin)
Área de configuração global, controle de acesso e gestão de entidades administrativas.
- Grupos: organização hierárquica de motoristas e veículos, com dados de empregador e integração CoocaMais.
- Perfis de Acesso: definição de perfis de permissão reutilizáveis.
- Usuários: gestão de contas e vínculos com veículos, grupos e associações.
- Clientes de API: gerenciamento de acesso à API REST do portal para sistemas e empresas externas. Permite cadastrar clientes (com nome e CNPJ/CPF), definir quais veículos cada cliente pode consultar, e gerar ou revogar tokens de acesso individuais. O token gerado é exibido uma única vez no momento da geração e não pode ser recuperado posteriormente.
- Associação: entidades que agregam grupos, com credenciais de integração e regras de pernoite.
- Alertas Pernoite: monitoramento e tratamento de alertas de pernoite dos veículos.
- Alertas Sinal: monitoramento e resolução de alertas de perda de sinal.
- Auditoria: identificação e resolução de pendências operacionais e de cadastro.
- Permissões em Massa: atribuição de permissões a múltiplos usuários de uma só vez.
- Configurações: parâmetros globais do sistema.
10. Módulos em Preparação
Os módulos a seguir existem na estrutura do sistema, porém ainda não estão expostos no menu de navegação e, portanto, não são acessíveis pela interface no estado atual. Estão documentados aqui para registro e planejamento de evolução.
10.1. Zonas de Risco
Módulo destinado ao monitoramento de áreas de risco da operação.
- Painel de zonas de risco: visualização e acompanhamento das áreas mapeadas, com o objetivo de apoiar a gestão de segurança da frota.
- Situação atual: existe uma referência residual à rota do painel no gatilho do menu "Painéis", mas sem link visível na navegação. Aguarda desenvolvimento e exposição na interface.
10.2. Conjuntos
Módulo destinado ao agrupamento e organização de entidades operacionais.
- Gestão de conjuntos: estruturação de agrupamentos e associação a usuários, conforme as necessidades de gestão da operação.
- Situação atual: não possui entrada no menu de navegação. Aguarda desenvolvimento e exposição na interface.
Observações de Navegação
- Rastreamento é um menu combinado que agrega três domínios distintos (Rastreadores, Telemetria e Espelhamento).
- Grupos, Associação, Alertas e Auditoria, embora pertençam à área de administração no código, são acessados pelo menu Administrador na interface.
- Alguns nomes de negócio diferem da nomenclatura técnica interna do sistema.
- Zonas de Risco e Conjuntos ainda não estão disponíveis na navegação.
Capítulo 03 - Telas e Fluxos
Este capítulo descreve o que o usuário vê e como interage com o sistema, seguindo a ordem dos grupos do menu lateral. Para a lista de módulos e suas permissões, consulte o Capítulo 02. Para a base tecnológica e arquitetura, consulte o Capítulo 01.
3.1 Shell Visual da Aplicação
Toda página autenticada segue um layout fixo de três regiões:
- Aside esquerdo — menu de navegação colapsável; minimiza para ícones via botão de seta no topo.
- Header fixo (65 px) — toggle mobile do aside à esquerda; dropdown do usuário (Perfil / Logout) à direita. A área central do header não contém links de navegação.
- Área de conteúdo — ocupa o restante da tela; cada página injeta seu conteúdo dinamicamente.
A aplicação está configurada como PWA: possui manifest.json, service worker registrado e ícones de instalação — permitindo adicionar o portal à tela inicial de dispositivos móveis.
3.2 Fluxo de Autenticação
O usuário acessa /login — tela sem aside nem header autenticado. Após login bem-sucedido, é redirecionado para o dashboard principal. As demais telas (recuperação de senha, redefinição, confirmação) seguem o mesmo layout público.
3.3 Painéis
3.3.1 Dashboard Padrão
Primeira tela após o login. Apresenta uma visão executiva da frota em tempo real.
Filtro de usuário (visível apenas para administradores): seletor + botão "Aplicar" para visualizar os indicadores de outro usuário.
Quatro cards de KPI em linha:
| Card | Cor | Valor |
|---|---|---|
| Total de Veículos | Azul | Contagem |
| Patrimônio FIPE | Verde | R$ formatado |
| Veículos Parados | Ciano | Contagem |
| Em Movimento | Amarelo | Contagem |
Card: Eventos de Excesso de Velocidade nas últimas 24h.
Tabela: Últimas Posições — colunas: Veículo (placa), Data/Hora, Endereço, Velocidade (km/h).
3.4 Produtividade
3.4.1 Meu Dashboard
Dashboard pessoal do usuário logado. O widget de críticas é carregado via AJAX, sem bloquear o carregamento da página principal.
3.4.2 Equipe
Visão consolidada de produtividade dos membros da equipe gerenciada.
3.4.3 Dashboard Geral
Visão organizacional ampla. Não possui entrada no menu lateral — disponível apenas mediante acesso direto.
3.4.4 Configuração de SLA
CRUD padrão (ver convenção na seção 3.10) para definição de metas e parâmetros de SLA utilizados nos cálculos de produtividade.
3.5 Câmeras
3.5.1 Devices (listagem)
Ponto de entrada do módulo. A partir de cada linha da listagem, o usuário acessa todas as sub-telas da câmera. A ação "Atualizar Status" está disponível diretamente na listagem.
3.5.2 Visualização ao Vivo
- Live individual: player HLS integrado para visualização de câmera única.
- Grid de câmeras: múltiplas câmeras lado a lado. Streams são iniciados e encerrados individualmente pelos botões na grade.
3.5.3 Gravações
Filtro por câmera e período → listagem de clipes → player integrado com controle de reprodução. A mesma tela oferece a ação de solicitar download de trechos específicos.
3.5.4 Downloads
Gerenciamento centralizado de arquivos de vídeo solicitados. O usuário acompanha o status de cada pedido e realiza o download ou streaming quando pronto.
3.5.5 Comandos
Envio de instruções remotas às câmeras. O histórico é exibido em formato de bolhas de conversa, similar a um chat.
3.6 Rastreamento
3.6.1 Painel de Rastreadores
Lista/grade operacional com status de cada rastreador (online/offline, última comunicação). Os dados são atualizados periodicamente via AJAX, sem recarregar a página.
3.6.2 Mapa em Tempo Real
Tela dominada pelo mapa Google Maps. Posições são consumidas via AJAX: lista geral de veículos e posição individual por ID.
3.6.3 Replay de Rastreamento
O usuário seleciona veículo e intervalo de datas/horas; o sistema carrega o histórico via AJAX e reproduz o trajeto animado sobre o mapa.
3.6.4 Relatórios
| Tela | Exports |
|---|---|
| Relatório de Rotas | Excel, PDF |
| Utilização (Km e Horas) |
Ambas seguem o padrão: formulário de filtro (veículo + período) → botões de exportação.
3.6.5 Telemetria — Painel Analítico
Ao acessar, um loader overlay cobre a tela enquanto os dados são processados. A tela é organizada em seções nomeadas.
Filtros: seleção de veículo + data inicial + data final (com seletor de usuário para administradores). O painel não exibe dados sem veículo selecionado.
Seção 1 — Visão Geral:
| Card | Cor | Interação |
|---|---|---|
| KM Rodados (Período) | Azul | Clique → abre rota no Google Maps |
| KM Rodados (Hoje) | Verde | Clique → abre rota de hoje no Google Maps |
| Tempo Ocioso Total | Amarelo | Clique → modal com lista detalhada |
| Excessos de Velocidade | Vermelho | Clique → modal com ocorrências |
| Velocidade Média | Ciano | — |
| Velocidade Máxima | Escuro | — |
Botão "Ver Velocidades por Dia" → modal com tabela de velocidade média e máxima por dia do período.
Seção 2 — Métricas de Tempo e Eficiência (4 cards):
- Tempo de Condução
- Tempo Parado
- Eficiência Operacional (% tempo em movimento / tempo total)
- KM/Hora Útil
Seção 3 — Paradas (3 cards):
- Número de Paradas → clique abre modal com tabela (colunas: Início, Fim, Duração, Tipo). Os tipos de parada são: Curta (< 30 min), Longa (30 min – 3h), Pernoite (> 3h em período noturno ou cruzando meia-noite) e DSR (> 24h).
- Tempo Médio de Parada
- Distância Média Entre Paradas (km)
Seção 4 — Segurança (3 cards):
- Acelerações Bruscas → clique abre modal com tabela (data/hora, aceleração m/s², velocidade, localização)
- Freadas Bruscas → clique abre modal com mesmo padrão
- Horário de Maior Movimento → exibe a hora de pico; clique abre modal com gráfico de KM por hora do dia (0h–23h)
Seção 5 — Velocidade (3 cards):
- Tempo em Baixa Velocidade (< 30 km/h)
- Tempo em Velocidade Média (30–70 km/h)
- Tempo em Alta Velocidade (> 70 km/h)
Exportações em PDF (botões persistentes na tela): Relatório de Velocidades por Dia e Relatório de Excesso de Velocidade.
3.6.6 Score de Direção — Ranking
Dashboard de ranking de motoristas com pontuações. A partir de uma linha do ranking, o usuário navega para a tela de detalhe individual, que exibe análise de comportamento, análise via IA, integração com plataforma parceira de análise e exportação em PDF.
Sub-fluxo — Perfis de Score: CRUD para configurar os critérios de pontuação.
3.6.7 Premiação
CRUD de programas de premiação para motoristas com base no score de direção.
3.6.8 Espelhamentos
CRUD de mapas públicos compartilháveis. Ações disponíveis: criar, editar, excluir, ativar/desativar e regenerar senha de geofence. O link gerado abre a área pública descrita na seção 3.12.
3.7 Ponto (EPONTODIG)
3.7.1 Painel de Ponto
Dashboard com indicadores consolidados das jornadas de trabalho dos motoristas.
3.7.2 Ponto Automático
Tela mais interativa do módulo. Fluxo principal:
- Seleção do motorista e período.
- Acionamento do processamento ou reprocessamento de um dia específico.
- Polling periódico para exibir progresso do job em andamento.
- Após processamento, períodos calculados são exibidos para revisão.
- Cada período pode ser editado em modal inline ou excluído.
3.7.3 Ponto Manual
Formulário simples para lançamento de registro de ponto: motorista, data e hora. Registros existentes são listados na mesma tela e podem ser excluídos.
3.7.4 Relatório de Jornada
Acessada por rota direta (sem item no menu lateral). Oferece:
- Visualização do espelho de ponto.
- Downloads: AFD, AEJ e espelho em PDF.
- Análise de jornada.
- Modal de ajuda contextual disponível na página.
3.8 Cooca+
3.8.1 Portal de Compras
A tela exibe os dados do(s) cooperado(s) vinculados aos grupos do usuário. Quando o usuário possui múltiplos grupos com matrícula Cooca+ cadastrada, os resultados são organizados em abas (uma por grupo). Se nenhum grupo possuir matrícula configurada, um alerta de aviso é exibido.
Os dados das três visões são carregados sob demanda via AJAX:
- Painel principal: limite, saldo e dados gerais do cooperado.
- Reservas: listagem de reservas ativas.
- Títulos a Pagar: obrigações financeiras junto à CoocaMais.
3.9 Gestão
3.9.1 Painel Financeiro
Dashboard com visão consolidada do mês selecionado. Possui filtro de mês/ano no topo (padrão: mês atual).
Quatro cards de KPI:
| Card | Cor | Detalhe |
|---|---|---|
| Total Receitas | Verde | Subtítulo: contagem de fretes do mês |
| Total Despesas | Vermelho | Subtítulo: contagem de abastecimentos |
| Transferências | Ciano | Detalhado em Adiantamentos (−) e Devoluções (+) |
| Saldo | (variável) | Receitas − Despesas − Adiantamentos + Devoluções |
Ações rápidas no toolbar: botões "Nova Receita", "Nova Despesa", "Nova Transferência" — atalhos para criação direta sem passar pela listagem.
Últimas 5 entradas para cada tipo (Receitas, Despesas, Transferências) em tabelas abaixo dos cards.
Gráfico mensal: evolução comparativa de receitas vs. despesas dos últimos 6 meses.
3.9.2 Movimentações — Receitas, Despesas e Transferências
As três telas seguem o padrão CRUD (ver seção 3.10): listagem com botão "Cadastrar", formulário de criação e formulário de edição.
3.9.3 Acertos
Fluxo com etapa extra na criação: o usuário pode buscar itens pendentes via AJAX para compor o acerto antes de salvar. A tela de detalhe exibe o acerto completo após o registro.
3.10 Cadastros
Convenção CRUD
A maioria das telas de cadastro e configuração do sistema segue este padrão visual:
- Listagem: tabela com registros, botão "Cadastrar" no topo, ações por linha (Editar, Excluir). A exclusão abre modal de confirmação.
- Criação: formulário limpo.
- Edição: mesmo formulário, pré-preenchido.
3.10.1 Pessoas
Formulário com duas abas: Geral (dados pessoais/empresariais) e Adicional (informações complementares).
3.10.2 Veículos (tela mais rica do domínio)
A edição de um veículo é organizada em seis abas:
| Aba | Conteúdo |
|---|---|
| Geral | Dados de identificação e características do veículo |
| Parâmetros | Configurações operacionais (inclui limite de velocidade usado na Telemetria) |
| Rastreadores | Vinculação e remoção de rastreadores |
| Motoristas | Motorista atual + histórico de vínculos; ação "Encerrar vínculo atual" |
| Histórico (CRM) | Linha do tempo de notas e ocorrências |
| Pernoite | Configuração de alertas de pernoite |
O formulário também disponibiliza o botão Consultar FIPE, que preenche automaticamente o valor de mercado via integração externa.
3.10.3 Rastreadores
CRUD padrão de dispositivos de rastreamento com vínculo a veículos.
3.10.4 CRM do Veículo
Tela dedicada ao histórico operacional de um veículo, acessada por link contextual. Não aparece no menu lateral — é acessada por links dentro do cadastro do veículo. Possui:
- Filtros: origem, tipo de evento, data início e data fim.
- Resumo: indicadores consolidados do histórico.
- Linha do tempo: notas e ocorrências com opção de adicionar nova nota.
3.11 Administrador
Todas as telas desta seção seguem a convenção CRUD da seção 3.10. Os destaques de interação:
-
Usuários: além do CRUD, cada usuário possui duas sub-telas de configuração:
- Permissões de Módulos: matriz de módulos × níveis de acesso.
- Vínculos de Veículos e Grupos: define o escopo de dados visível para o usuário.
-
Permissões em Massa: não segue o padrão CRUD. Tela especial para aplicar permissões a múltiplos usuários de uma só vez.
-
Clientes de API: o fluxo de geração de token exibe o token uma única vez na tela — após fechar, não pode ser recuperado.
-
Alertas Sinal: a tela de detalhe permite marcar como resolvido e adicionar contatos responsáveis.
3.12 Área Pública — Espelhamento
Acessível sem autenticação via link tokenizado, esta tela usa um layout simplificado — sem menu de navegação, header autenticado ou footer. Exibe apenas o mapa ao vivo com os veículos do link compartilhado. Quando o token é inválido ou expirado, o sistema exibe uma tela de erro específica.
Capítulo 04 - Regras de Negócio
4.1 Visão Geral
Este capítulo documenta as decisões algorítmicas e regras de validação que governam o comportamento interno do sistema E.Rastreio Portal. As regras estão organizadas por domínio e foram extraídas diretamente do código-fonte (app/Domains/*/ e app/Models/).
4.2 Módulo: Jornada de Trabalho
4.2.1 Detecção de Movimento e Parada
O sistema determina se um veículo está em movimento ou parado com base em dados brutos de posição GPS (tabela tc_positions do Traccar). O serviço central é o VehicleMovementService, que implementa a seguinte lógica:
- Limiar de velocidade padrão: velocidade < 5 km/h classifica o veículo como parado. A velocidade é convertida de nós para km/h (fator: × 1.852).
- Parada mínima válida: um intervalo de parada só é reconhecido se tiver duração ≥ 5 minutos contínuos.
- Paradas dentro de raio geográfico (carga/descarga): quando configurado um raio (
radiusKm), mesmo que o veículo supere o limiar de velocidade, ele ainda é considerado "parado" enquanto permanece dentro da distância do ponto de referência. Isso modela cenários de carga e descarga. - Intervalo de posição inválido: posições com intervalo superior a 600 segundos entre si são descartadas e reiniciam o acumulador de parada.
Esses parâmetros (speed_threshold_kmh, min_stop_minutes, min_driving_seconds) podem ser sobrescritos por veículo por meio da tabela veiculo_parametros, permitindo calibração individual por frota.
4.2.2 Derivação dos Períodos de Direção (Ponto Automático)
Os períodos de direção são derivados como os gaps entre as paradas válidas, delimitados pela primeira e última posição GPS do dia. O algoritmo (PontoAutomaticoService::getDrivingPeriodsFromPositions) funciona da seguinte forma:
- Busca todas as posições do device no dia (00:00–23:59:59).
- Chama o
VehicleMovementServicepara obter os intervalos de parada. - A janela entre o fim de uma parada e o início da próxima é classificada como período de direção, desde que sua duração seja ≥
min_driving_seconds(padrão: 60 s). - Um período de direção final é adicionado se ainda houver tempo entre a última parada e a última posição do dia.
Se não houver posições para o dia, o registro de ponto é criado com todos os tempos zerados.
4.2.3 Classificação dos Tempos da Jornada
O DriverTimesheetService possui uma lógica alternativa (modo legado) para segmentação de posições brutas, com as seguintes constantes baseadas na Lei 13.103/2015 (Lei do Motorista):
| Parâmetro | Valor |
|---|---|
| Pausa mínima (intervalo) | 15 minutos (900 s) |
| Refeição mínima | 1 hora (3.600 s) |
| Descanso mínimo | 8 horas (28.800 s) |
| Tempo máximo de direção | 8 horas (28.800 s) |
| Limiar de velocidade (movimento) | > 1 km/h |
| Viagem mínima | 5 minutos / 500 m |
As paradas são classificadas hierarquicamente:
- Duração ≥ 28.800 s → Descanso
- Duração ≥ 3.600 s → Refeição/Almoço
- Duração ≥ 900 s → Pausa
- Abaixo disso → descartada
4.2.4 Cálculo do Tempo de Descanso (Ponto Automático)
No fluxo principal (automático), o tempo de descanso é calculado por subtração:
descanso = 24 horas − tempo_total_de_direção − 1 hora (almoço fixo)
O resultado nunca é negativo (max(0, descanso)). O almoço de 1 hora é tratado como fixo e não deduzido do cálculo de horas extras.
4.2.5 Cálculo de Horas Noturnas
Horas noturnas são contabilizadas para os períodos de direção que ocorram dentro das faixas:
- Madrugada: 00:00 – 05:00
- Noite: 22:00 – 23:59:59
O sistema calcula a interseção exata (em segundos) entre cada período de direção e as faixas noturnas.
4.2.6 Cálculo de Horas Extras
As regras seguem a legislação trabalhista brasileira para motoristas profissionais:
- Jornada regular: configurável por veículo (
horas_regulares); padrão = 8 horas. - Hora extra 50%: aplicável apenas em dias úteis. Todo tempo de direção que exceda a jornada regular é computado como extra 50%.
- Hora extra 100%: aplicável quando o dia for domingo ou feriado nacional. Nesse caso, todo tempo de direção acima da jornada regular é computado como extra 100%.
- Em dias úteis, não há extra 100% pelo simples fato de ultrapassar certo limite — todo o excesso é 50%.
- Se o veículo trabalhou menos que a jornada regular, os campos de hora extra são zerados.
4.2.7 Detecção de Feriados
O HolidayService consulta a BrasilAPI (brasilapi.com.br/api/feriados/v1/{ano}) para obter os feriados nacionais do ano em questão. O resultado é cacheado por 24 horas para evitar chamadas repetidas. Em caso de falha da API, o sistema usa um fallback com os 9 feriados nacionais fixos (ex.: Ano Novo, Tiradentes, Dia do Trabalho etc.).
4.2.8 Vínculo Motorista–Veículo por Data
A identidade do motorista em um registro de ponto é resolvida consultando a tabela veiculo_motorista_historico, que registra períodos de vigência do vínculo (data_inicio, data_fim). O sistema localiza o motorista cuja janela de vigência contém a data do ponto. Se houver vários vínculos, o mais recente é selecionado. O vínculo pode estar aberto (data_fim IS NULL), indicando que ainda está em vigor.
4.2.9 Vínculo Device–Veículo por Data
Para processamento retroativo ou por motorista, o sistema resolve qual rastreador (id_rastreador) estava associado ao veículo em cada data específica, consultando rastreador_historico com o filtro de período de vigência (is_principal = true).
4.2.10 Edição Manual de Registros de Ponto
Registros de ponto podem ser editados manualmente. As regras aplicadas no momento da edição são:
- Validação de formato: horário de início e fim devem estar no formato
H:i:s. - Período noturno: se o horário de fim for anterior ao de início, adiciona-se 1 dia ao fim (ex.: turno 23:00–02:00).
- Tipo de dia: o dia pode ser marcado como DSR ou Férias, zerando todos os períodos de direção e atribuindo 24 horas de descanso.
- Após qualquer edição, o sistema recalcula automaticamente todos os totais: tempo de direção, descanso, horas noturnas, horas extras 50% e 100%, com respeito ao flag
is_holidayque pode ser marcado manualmente para dias de feriado não reconhecido pela API. - O campo
notes.manually_edited = trueé gravado para rastreabilidade.
4.3 Módulo: Telemetria e Score de Condução
4.3.1 Detecção de CAN Bus
Antes de calcular qualquer score, o sistema detecta se o rastreador do veículo transmite dados de CAN Bus (barramento do veículo). Isso é feito amostrando até 50 posições recentes: se ao menos 10% possuírem os atributos rpm, throttle ou fuelConsumption, o veículo é marcado como tem_can = true. A presença de CAN desbloqueia indicadores adicionais de pontuação.
4.3.2 Resolução do Device para Telemetria
Para veículos com múltiplos rastreadores ativos, o sistema prioriza a seguinte hierarquia ao selecionar o device para telemetria:
- Rastreador marcado com
is_telemetria = true - Rastreador com
is_principal = true - Qualquer rastreador ativo
4.3.3 Cálculo de Métricas Brutas (por Posição)
O TelemetriaScoreService processa cada par de posições consecutivas e acumula métricas. As regras de filtragem são:
- Pares com intervalo ≤ 0 s ou > 600 s são descartados (interrupção de sinal).
- Motor ligado: definido como
velocidade ≥ 2 km/h(movimento estrito), OU para veículos com CAN:rpm > 0, OU sem CAN: flagignition = true. - Idle (motor ocioso): motor ligado, mas parado por mais de 120 segundos consecutivos. Paradas curtas (≤ 120 s, ex.: semáforo) não contam como idle — esse comportamento replica o cálculo do GOBRAX.
- Excesso de velocidade: posição com velocidade acima do
limite_velocidadeconfigurado no veículo (padrão: 90 km/h). - Aceleração/frenagem brusca: calculada pela variação de velocidade entre duas posições dividida pelo intervalo. Limiar: > 3,0 m/s² (positivo = aceleração, negativo = frenagem).
- Contagem de viagens: incrementada a cada transição
ignition: true → false.
4.3.4 Métricas CAN-Exclusivas
Quando tem_can = true, são calculadas métricas adicionais por faixa:
Faixas de RPM (modelo GOBRAX):
| Faixa | Limiar (configurável no ScoreProfile) |
Classificação |
|---|---|---|
| Início (ideal) | ≤ rpm_inicio_max (padrão: 1.300 RPM) |
Positivo |
| Final (bom) | 1.301 – rpm_final_max (padrão: 1.500 RPM) |
Positivo parcial |
| Amarelo | 1.501 – rpm_freio_motor_max (2.300), acelerando (throttle ≥ 5%) |
Negativo |
| Freio motor (positivo) | 1.501 – 2.300, pé fora (throttle < 5%) + combustível < 0,1 | Positivo (corte de injeção real) |
| Vermelho | > 2.300 RPM | Negativo forte |
Faixas de Pressão do Acelerador (throttle):
| Faixa | Limiar | Classificação |
|---|---|---|
| Ideal | ≤ throttle_ideal_max (padrão: 60%) |
Positivo |
| Atenção | 61% – throttle_atencao_max (padrão: 70%) |
Penalidade leve |
| Crítico | > 70% | Penalidade forte |
O sistema usa o pico (máximo entre as duas amostras do intervalo) para o throttle, a fim de capturar picos que caem nas bordas da amostragem.
Embalo (aproveitamento de inércia): veículo em movimento (velocidade ≥ 2 km/h), pé fora do acelerador (throttle < 5%) e combustível < 3 L/h e RPM > 300. Sinaliza aproveitamento da inércia do veículo.
Piloto automático (estimado): pé fora do pedal (throttle < 5%) + motor injetando (combustível ≥ 3 L/h) + velocidade ≥ 20 km/h. Proxy para uso de cruise control, que o rastreador não reporta diretamente.
4.3.5 Cálculo de Distância (km/dia)
Para veículos com CAN, o sistema prefere o odômetro do veículo (obdOdometer ou odometer, em metros) ao invés do cálculo GPS Haversine. Regras de sanidade aplicadas ao delta do odômetro:
- Delta > 2.000 km/dia → descartado (considerado dado inválido).
- Delta > 3× o km calculado por GPS (quando GPS > 5 km) → descartado (possível reset ou spike).
Para veículos sem CAN, ou quando o odômetro não passar na sanidade, o km é calculado pela fórmula Haversine entre posições consecutivas. Segmentos com velocidade implícita > 150 km/h são descartados como saltos de GPS.
4.3.6 Cálculo de km/L (Eficiência de Combustível)
A eficiência é calculada usando o campo fuelUsed (acumulado pelo CAN). O sistema captura o delta entre o primeiro e o último valor não-zero do dia. Valores acima de 1.000 L/dia são descartados como inválidos (unidade errada ou reset do dispositivo).
4.3.7 Normalização das Notas por Indicador (0–100)
Cada indicador é normalizado para uma nota de 0 a 100:
| Indicador | Fórmula resumida |
|---|---|
| Idle | 100 até ~3% de idle/ignição, caindo linearmente a 0 próximo de 40% |
| Excesso | 100 sem excesso; cada ponto percentual de tempo em excesso desconta 10 pts |
| Aceleração brusca | 100 − (eventos/100 km) × 5 |
| Freada brusca | 100 − (eventos/100 km) × 5 |
| RPM | Ponderado: RPM_início × 1,0 + RPM_final × 0,7 + Freio_motor × 1,0, dividido pelo tempo em movimento |
| Throttle | 100 − (crítico% × 300) − (atenção% × 100) |
| Embalo | Linear; 100 pts a partir de ~20% do tempo em movimento em embalo |
| Piloto automático | 0 abaixo de 50% do tempo em movimento, 100 pts a 85% (linear) |
| km/L | (km_L_real / meta_km_L) × 100, máximo 100 |
4.3.8 Score Final
O score final é a média ponderada das notas pelos pesos configurados no ScoreProfile do grupo do veículo. Quando não há CAN, apenas os indicadores GPS (idle, excesso, aceleração, freada) são usados; seus pesos são renormalizados para somar 100%, descartando os indicadores CAN.
O score do período (ex.: mensal) é calculado de forma agregada — somando os tempos/eventos e pontuando uma vez sobre os totais, não pela média das notas diárias. Isso replica o comportamento do GOBRAX e evita distorções em dias com poucos km.
4.3.9 Cálculo de Desperdício e Economia de Combustível
Baseados na meta de eficiência (meta_kmL) do ScoreProfile e no preço do diesel configurado:
desperdício_litros = max(0, litros_consumidos − (km_total / meta_kmL))
desperdício_R$ = desperdício_litros × preco_diesel
economia_litros = max(0, (km_total / meta_kmL) − litros_consumidos)
economia_R$ = economia_litros × preco_diesel
4.3.10 Premiação por Desempenho
O PremiacaoService calcula o valor de premiação de um motorista com o seguinte algoritmo:
- Gate de km mínimo: se o motorista rodou menos que
km_minimo_mes, recebe R$ 0,00. - Fator de nota: proporcional ao intervalo entre
nota_minimae 100. Abaixo da nota mínima, o valor base é zero. - Fator de km:
min(1,0, km_rodado / meta_km_mes). Penaliza quem não atingiu a meta de quilometragem. - Base = premiacao_max × fator_nota × fator_km
- Premiação extra (opcional):
- Ativada pelo flag
extra_ativo. - Calculada sobre os km acima de
extra_km_minimo:(km_elegível / extra_km_considerado) × extra_valor_por_km. - Se
extra_atrelar_nota = true, o valor extra é multiplicado pornota/100. - Se
extra_zerar_abaixo_range = truee a nota está abaixo do mínimo, o valor total (base + extra) é zerado.
- Ativada pelo flag
4.4 Módulo: Rastreadores e Monitoramento em Tempo Real
4.4.1 Classificação de Status do Veículo
O VehicleTrackingService classifica cada veículo em três estados, usando a última posição GPS recebida:
| Status | Condição |
|---|---|
| em_movimento | Velocidade > 5 km/h E última posição há ≤ 5 horas |
| parado | Velocidade ≤ 5 km/h E última posição há ≤ 5 horas |
| sem_sinal | Última posição há > 5 horas (independente da velocidade) |
4.4.2 Relatório Diário de Utilização
O VehicleUsageReportService produz um resumo diário com km rodado, segundos de direção e velocidade média. A lógica de cálculo de tempo de direção é idêntica à do Ponto Automático (getDrivingPeriodsFromPositions), garantindo que os valores sejam consistentes entre os dois módulos.
A velocidade média é calculada como km / (driving_seconds / 3600), sem contar os períodos de parada.
4.4.3 Conversão de Placa (Padrão Mercosul)
O modelo Veiculo implementa a conversão bidirecional entre o padrão antigo (ex.: ABC1234) e o Mercosul (ex.: ABC1D34), mapeando a 5ª posição: A=0, B=1, C=2, ..., J=9. As buscas por placa sempre consideram ambas as variantes para não perder registros.
4.5 Módulo: Acessos e Permissões
4.5.1 Hierarquia de Usuários
O sistema tem três perfis de acesso principais:
- Master Admin (
is_master_admin = true): acesso irrestrito a todos os módulos, veículos e grupos. As verificações de permissão retornamtrueimediatamente para esse perfil, sem consultar o banco. - Analista (
is_analista = true): usuário operacional, associado a um gestor (gestor_id). - Usuário padrão: acesso determinado pelas permissões de módulo vinculadas.
4.5.2 Controle de Acesso a Veículos
Um usuário não-admin enxerga apenas os veículos que pertençam a:
- Grupos aos quais ele está vinculado (
user_grupo), ou - Veículos diretamente vinculados a ele (
user_veiculo).
A union dos dois conjuntos (sem duplicatas) forma o escopo de visibilidade do usuário.
4.5.3 Permissões por Módulo e Ação
Permissões são armazenadas em JSON na tabela pivot user_module_permissions. Cada registro contém um mapa de {action_slug: true/false}. A verificação de permissão (hasPermission) exige que o módulo esteja ativo (is_active = true) e que a ação específica esteja marcada como true no JSON.
4.5.4 Operação em Massa de Permissões
O BulkPermissionService aplica permissões a múltiplos usuários (até 500 por operação, em lotes de 100). Regras de segurança:
- Master admins são ignorados automaticamente (nunca são alterados por operações em massa).
- Auto-revogação bloqueada: o sistema impede que um usuário revogue a própria permissão
admin.verde si mesmo. - A operação é não-destrutiva: ao revogar, se após a remoção de uma ação ainda houver outras
trueno JSON, o registro é atualizado; caso contrário, é deletado integralmente. - Toda a operação é executada dentro de uma transação de banco de dados.
As ações válidas são validadas contra o método actionsAvailable() do módulo. Slugs inválidos causam rejeição de toda a requisição.
4.5.5 Aplicação de Perfil de Acesso
Ao aplicar um AccessProfile a um usuário, o serviço AccessProfileApplicationService:
- Verifica se o usuário é Master Admin; se for, não faz nada (proteção de integridade).
- Propaga o flag
is_analistado perfil para o usuário. - Vincula os módulos do perfil ao usuário com as permissões definidas no perfil (via
attach).
4.6 Módulo: Produtividade e SLA de Analistas
4.6.1 Métricas de Output
O output de um analista é calculado contando os registros de veiculo_contato criados por ele no período, classificados por origem:
| Tipo | Critério |
|---|---|
| Sinal | Registro vinculado a um alerta_sinal_id |
| Pernoite | Registro vinculado a um alerta_pernoite_id |
| Auditoria (veículo) | Registro vinculado a auditoria_sistema_id |
| Auditorias extras | Auditorias de categoria grupo ou usuario resolvidas pelo analista no período |
| Notas | Contatos sem vínculo com nenhum alerta ou auditoria |
4.6.2 Apuração de SLA
O SLA é apurado por origem de alerta, usando as configurações da tabela sla_configs (resolvida via SlaConfig::resolver(origem, subtipo)):
- Alerta de Sinal: dois subtipos —
<24h(alerta recente) e>=24h(crítico). O SLA é medido em minutos entrecreated_ateresolvido_em. - Alerta de Pernoite: SLA único (
pernoite), medido entrecreated_ateresolvido_at. - Auditoria: SLA por
tipo_pendencia. O prazo começa nadata_execucaoda auditoria (início do dia).
Um atendimento é classificado como "no prazo" se o tempo de resolução (em minutos) for ≤ sla_minutos. A aderência (%) é no_prazo / (no_prazo + estourado) × 100.
4.6.3 Alertas Críticos em Tempo Real
O sistema identifica atendimentos com risco de estouro de SLA combinando a configuração sla_minutos com o campo warning_pct (percentual de decurso do prazo a partir do qual o alerta entra na lista crítica). Um alerta é considerado crítico quando:
pct_decorrida = (minutos_desde_abertura / sla_minutos) × 100 ≥ warning_pct
4.6.4 Score de Qualidade
O score de qualidade de um analista é composto por três fatores ponderados:
| Fator | Peso | Critério |
|---|---|---|
| Observações ricas | 60% | % de resoluções com descrição ≥ 30 caracteres |
| Taxa sem reabertura | 30% | 1 − (reaberturas / total de resoluções) |
| Taxa de resolução | 10% | % de eventos do tipo resolucao entre todos os eventos |
O score máximo é 100. Reabertura é contada quando uma auditoria que o analista havia resolvido voltou a aparecer como pendente para a mesma entidade + tipo.
4.7 Módulo: Cadastros
4.7.1 Auditoria Automática do Sistema
O SystemAuditService executa verificações diárias (runFullAudit) e registra pendências na tabela auditoria_sistema. As verificações são:
Grupos:
- Grupo sem
id_grupo_rastreadores(ID eRastreio não configurado). - Grupo sem
matricula_coocamais(Matrícula Cooca+ não configurada).
Usuários (excluindo Master Admins):
- Usuário sem nenhum grupo vinculado.
- Usuário sem grupo e sem veículo vinculado.
Veículos (apenas status "Ativo"):
- Veículo sem grupo vinculado (
id_gruponulo). - Veículo sem rastreador principal ativo (
is_principal = truena tabelarastreador_historico). - Veículo que passou pela Região Metropolitana de São Paulo nas últimas 24 horas sem motorista vinculado. A detecção é feita por busca textual no campo
addressdas posições Traccar, cobrindo 15 municípios da Grande SP.
Idempotência: antes de apagar os registros do dia atual e regerá-los, o serviço preserva quais itens já foram marcados como resolvido = true e reaplicará esse status após a nova execução, evitando perda de trabalho do analista.
4.7.2 Consulta de Valor FIPE
O FipeService consulta o valor de mercado de veículos (categoria: caminhão) na tabela FIPE via API oficial. O resultado é cacheado por 24 horas por código FIPE + ano. A resposta textual no formato "R$ 99.332,90" é convertida para float removendo símbolo, pontos de milhar e substituindo a vírgula decimal por ponto.
4.8 Módulo: Câmeras Embarcadas
4.8.1 Gestão de Gravações (Jimi IoT)
O RecordingService gerencia gravações de câmeras Jimi IoT. As regras de operação são:
- Todos os horários são enviados ao dispositivo em UTC, independente do fuso horário do servidor.
- Modo demo: se a variável
JIMI_DEMO_STREAM_URLestiver configurada, o sistema retorna dados fictícios sem enviar comandos reais ao dispositivo. Isso permite demonstrações sem hardware. - A listagem de gravações tolera variações no formato da resposta da API do dispositivo, buscando a lista nos campos
list,items,records,fileList,_listoudata.
4.9 Módulo: Alertas de Pernoite
4.9.1 Ciclo de Estados do Alerta de Pernoite
Um alerta de pernoite percorre os seguintes estados:
avaliar → aprovado
→ reprovado
→ sem_sinal (veículo sem sinal no momento do pernoite)
O estado inicial é avaliar. A transição para aprovado ou reprovado registra resolvido_por_user_id e resolvido_at. Alertas no estado avaliar ou sem_sinal são listados na fila de trabalho do analista e entram no cálculo de SLA.
4.10 Módulo: Alertas de Sinal
4.10.1 Ciclo de Estados do Alerta de Sinal
aberto → resolvido
Alertas no estado aberto entram na fila de trabalho. A resolução registra resolvido_por_user_id e resolvido_em. O campo horas_sem_sinal determina o subtipo de SLA aplicável: <24h ou >=24h.
4.11 Módulo: Financeiro
4.11.1 Tipos de Receita e Validação Condicional
As receitas possuem dois tipos com conjuntos de campos distintos:
| Tipo | Campos obrigatórios | Campos exclusivos |
|---|---|---|
frete |
origem, destino |
odometro_inicial, odometro_final, peso, tipo_carga |
outro |
descricao |
— |
A validação é aplicada condicionalmente com base no tipo. Para o tipo frete, os campos de origem e destino são obrigatórios, enquanto para outro a descricao passa a ser obrigatória. Campos que não se aplicam ao tipo selecionado são explicitamente zerados antes de persistir.
4.11.2 Resolução Automática do Motorista
Tanto nas receitas quanto nas despesas, o motorista responsável é determinado automaticamente a partir do veículo selecionado. O sistema consulta a relação motoristaAtual do veículo (via VeiculoMotoristaHistorico) e atribui o pessoa_id resultante. Se nenhum veículo for selecionado, motorista_id é nulo. O usuário não informa o motorista manualmente.
4.11.3 Tratamento de Máscara Monetária
Todos os campos de valor monetário chegam no formato de exibição brasileiro (ex.: R$ 1.234,56). O sistema remove o símbolo R$, pontos de milhar e espaços, depois converte a vírgula decimal em ponto antes de persistir como decimal: "R$ 1.234,56" → 1234.56.
4.11.4 Despesas de Abastecimento
Despesas categorizadas como "Abastecida" desbloqueiam campos extras: produto (tipo de combustível), odometro (leitura do hodômetro) e litros (volume abastecido, mínimo 0,01 L). Para qualquer outra categoria, esses três campos são zerados automaticamente antes de salvar, independente do que foi enviado no formulário.
4.11.5 Imutabilidade após Acerto
Receitas, despesas e transferências que já foram incluídas em um Acerto (acerto_id IS NOT NULL) tornam-se imutáveis. Qualquer tentativa de editar ou excluir esses registros é bloqueada antes de qualquer processamento de dados, com redirecionamento e mensagem de aviso. Esse é o mecanismo de integridade contábil do módulo.
4.11.6 Cálculo do Saldo do Acerto
O Acerto é a operação de fechamento financeiro de um motorista para um período. Ele agrega itens de três tabelas distintas e calcula o saldo pela seguinte fórmula:
saldo = total_receitas − total_despesas − total_adiantamentos + total_devolucoes
As transferências de adiantamento são tratadas como saída de caixa (equivalente a despesa), enquanto as devoluções são tratadas como entrada (equivalente a receita). Toda a criação do acerto ocorre dentro de uma transação de banco de dados, incluindo o vínculo dos itens (acerto_id) e o cálculo dos totais.
4.11.7 Vínculo de Transferências ao Motorista
As transferências são vinculadas a veículos, não diretamente a motoristas. Ao buscar as transferências elegíveis para um acerto, o sistema identifica todos os veículos que o motorista conduziu no período (via veiculo_motorista_historico) e então busca as transferências desses veículos que ainda não possuem acerto_id.
4.11.8 Exclusão de Acerto (Liberação dos Itens)
A exclusão de um acerto utiliza soft-delete, mas antes de deletar, todos os itens vinculados (receitas, despesas e transferências) têm seu acerto_id zerado, ficando disponíveis para um novo fechamento. Todo o processo ocorre dentro de uma transação.
4.11.9 Dashboard Financeiro
O dashboard agrega os dados do mês selecionado (padrão: mês atual). Para o gráfico dos últimos 6 meses, as devoluções são somadas às receitas e os adiantamentos são somados às despesas, tratando transferências como equivalentes de seus respectivos fluxos financeiros.
4.12 Módulo: Portal de Compras (Cooca+ / SigaMC)
4.12.1 Visão Geral
Este módulo é um painel de consulta a dois sistemas externos de cooperativa. Não há lógica de negócio local além de filtragem e orquestração de chamadas às APIs. Os dados exibidos são inteiramente provenientes das APIs de terceiros e não são persistidos no banco do portal.
4.12.2 Escopo de Consulta por Usuário
A consulta à Cooca+ é feita pelos grupos do usuário logado. O sistema filtra apenas os grupos que possuem o campo matricula_coocamais preenchido e realiza uma consulta por matrícula para cada um deles. Grupos sem matrícula configurada são silenciosamente ignorados.
Exceção Master Admin: quando o usuário é Master Admin, é possível selecionar qualquer usuário do sistema e visualizar os dados dos grupos desse usuário-alvo, não do admin logado.
4.12.3 Operações Disponíveis por API
| Operação | API | Parâmetro-chave | Finalidade |
|---|---|---|---|
| Limites do cooperado | Cooca+ | userId (código do cooperado) |
Consulta saldo e limites disponíveis |
| Reservas / Pedidos | Cooca+ | userId |
Lista pedidos em aberto (tipo 2, status 0) |
| Títulos a pagar | SigaMC | matricula |
Consulta financeiro do cooperado na SigaMC |
Ambas as APIs usam autenticação configurada via variáveis de ambiente (services.coocamais.* e services.sigamc.*). Falhas de comunicação são logadas e retornam um array com a chave error — o sistema não lança exceções para o usuário.
4.13 Módulo: Espelhamento (Compartilhamento Público de Frota)
4.13.1 Ciclo de Vida de um Espelhamento
Um espelhamento é um link público e temporário que expõe a posição em tempo real de um subconjunto de veículos sem exigir autenticação do visualizador. Seu ciclo de estados é:
Ativo (is_active=true + expires_at no futuro)
→ Expirado (is_active=true + expires_at no passado)
→ Desativado (is_active=false)
- A exclusão via interface é uma desativação lógica (
is_active = false), não uma deleção física. - Um espelhamento expirado não pode ser reativado diretamente; é necessário editar a data de validade antes de reativar.
- Cada acesso público incrementa o contador
access_counte atualizalast_accessed_at.
4.13.2 Geração e Segurança do Token
O token de acesso público é uma string aleatória de 48 caracteres (Str::random(48)), gerada no momento da criação. Não há rotação automática de token — ele é permanente para o ciclo de vida do espelhamento.
4.13.3 Resolução do Token
Em todos os endpoints públicos, o token é validado contra três condições simultâneas:
tokenexiste na tabela.is_active = true.expires_at > now().
Se qualquer condição falhar, a resposta é HTTP 410 (Gone) com mensagem de link inválido ou expirado.
4.13.4 Dados Expostos Publicamente
O endpoint público de veículos sanitiza os dados antes de retorná-los, expondo apenas: placa, marca, modelo, cor, ano, status de movimento, velocidade, latitude, longitude, nome do motorista, endereço e tecnologia do rastreador. Dados sensíveis de negócio (ID do rastreador, IMEI, ESN, linha telefônica, grupo, associação) são omitidos da resposta pública.
Veículos sem coordenadas GPS válidas são filtrados e não aparecem no mapa.
4.13.5 Funcionalidade de Geofence no Espelhamento
O criador do espelhamento pode habilitar geofences (áreas de alerta geográfico) para o link público. As regras são:
Autenticação de geofence:
- Protegida por uma senha numérica de 6 dígitos, gerada aleatoriamente e armazenada com hash bcrypt. A senha em texto plano também é persistida para exibição ao criador.
- A sessão de autenticação tem TTL de 30 minutos. Após esse prazo, o visitante precisa autenticar novamente para editar geofences.
- Visitantes não autenticados podem visualizar as geofences, mas o e-mail de notificação é mascarado (ex.:
j***@empresa.com.br).
Limites e validações:
- Máximo de 20 geofences ativas por espelhamento. Tentativas de criação além desse limite são rejeitadas com HTTP 422.
- Um geofence só pode ser criado para veículos que façam parte do mesmo espelhamento. Tentativas com veículos externos são rejeitadas.
- Ao editar um geofence, o estado
currently_insideé resetado parafalse, evitando estados inconsistentes após alteração de coordenadas ou raio.
Cálculo de contenção:
O sistema utiliza a fórmula Haversine (raio da Terra = 6.371.000 m) para calcular a distância entre a última posição do veículo e o centro da geofence. Um ponto é considerado "dentro" se a distância calculada for ≤ raio_metros configurado.
Resumo dos Domínios
| Domínio | Status de Implementação | Nível de Lógica Interna |
|---|---|---|
| Jornada de Trabalho | Implementado e maduro | Alto — cálculos legislativos complexos |
| Telemetria / Score | Implementado e maduro | Alto — engine de scoring configurável |
| Rastreadores | Implementado | Médio — detecção de movimento e status |
| Acessos | Implementado | Médio — permissões granulares |
| Produtividade / SLA | Implementado | Médio — KPIs e SLA de analistas |
| Cadastros / Auditoria | Implementado | Médio — auditoria automática diária |
| Financeiro | Implementado (sem service layer) | Médio — ciclo de acerto bem definido |
| Portal Cooca+ / SigaMC | Implementado (gateway puro) | Baixo — proxy de APIs externas, sem persistência |
| Espelhamento | Implementado | Médio — ciclo de vida de link, geofence com auth própria |
| Câmeras | Implementado | Baixo–Médio — orquestração de hardware Jimi IoT |