API v1

Relatórios

Android: ReportFragment · ReportTempFragment · ReportTempViewModel

Módulo de relatórios analíticos. Atualmente disponível o relatório de temperatura de sensores por veículo e período, com gráficos interativos (linha, barra, pizza), paginação e exportação em PDF/imagem.

Navegação Interna

O ReportFragment é a tela inicial do módulo — exibe botões de seleção de tipo de relatório. O único relatório disponível atualmente é o de temperatura, acessado via nav_report_temp:

binding.reportTemp.setOnClickListener {
    findNavController().navigate(R.id.nav_report_temp)
}
Módulo em expansão: ReportPositionFragment (relatório de posições) está criado mas ainda vazio. ReportViewModel também está em branco. O foco atual é o módulo de temperatura.

Relatório de Temperatura — ReportTempFragment

Permite selecionar veículo (spinner) e intervalo de datas (MaterialDatePicker) para carregar o histórico de temperaturas de até 3 sensores simultâneos.

Filtros

FiltroComponenteComportamento
VeículoSpinner com placasPopulado via ReportTempViewModel.fetchDataFromApi(). Mapa interno plateToIdMap converte placa → vehicle_id.
Intervalo de datasMaterialDatePicker.dateRangePicker()Seleciona start/end. As datas são convertidas de milissegundos para segundos (/ 1000) antes de enviar à API.

Gráficos (MPAndroidChart)

Três abas com gráficos alternados via TabLayout:

TabGráficoDados exibidos
0LineChartTemperatura dos 3 sensores ao longo do tempo + linhas de limite (superior vermelho tracejado, inferior azul tracejado)
1BarChart% de tempo DENTRO / FORA / SEM FAIXA da temperatura ideal
2PieChartDistribuição percentual de eficiência (dentro/fora/sem faixa)

Eficiência Térmica

Cada registro tem o campo eficiencia com os possíveis valores:

ValorSignificadoCor nos gráficos
"DENTRO"Temperatura dentro da faixa idealVerde rgb(126, 211, 33)
"FORA"Temperatura fora da faixa idealVermelho rgb(251, 76, 76)
outros / vazioSem faixa configuradaCinza rgb(170, 170, 170)

Paginação Infinita

A lista de registros de temperatura usa paginação local de 50 itens por página. Ao rolar até perto do fim do RecyclerView (dentro de 5 items do total), mais itens são carregados da lista em memória:

val pageSize = 50
// Carrega próximos 50 ao detectar scroll perto do fim
if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount - 5) {
    loadMoreData()
}

Exportação

Botão shareButton abre diálogo com duas opções:

OpçãoFormatoDetalhes
Compartilhar como PDFapplication/pdfGerado via iText PDF. Inclui: cabeçalho (placa, período), resumo de eficiência e tabela com até 100 registros. Salvo em Environment.DIRECTORY_DOCUMENTS.
Compartilhar como Imagemimage/jpegCaptura do gráfico ativo na tab atual. Salvo em Environment.DIRECTORY_PICTURES.
Compartilhamento via Intent.ACTION_SEND com FileProvider. O package_name.fileprovider deve estar declarado no AndroidManifest.xml.

Modelo de Dados (TemperatureData)

data class TemperatureData(
    val dataHora: String,          // "dd/MM/yyyy, HH:mm:ss"
    val temperatura1: Double?,     // Sensor 1 (°C) — pode ser null
    val temperatura2: Double?,     // Sensor 2
    val temperatura3: Double?,     // Sensor 3
    val faixa: String,             // "X° à Y°" | "< X°" | "> X°" | "Sem Faixa"
    val eficiencia: String,        // "DENTRO" | "FORA" | ""
    val numeroSM: String           // ID da viagem (SM) para agrupar limites
)

Permissões

CódigoAção
115Acesso ao módulo de Relatórios (controla botão na Home)

SharedPreferences relevantes

NomeChaveUso
selected_companycompany_idEmpresa ativa — passa como clientId às chamadas de API
user_iduser_idID do usuário autenticado
credentialstoken_credentialToken legado usado nas chamadas do ReportTempViewModel