Leasing
Estudo de caso de leasing e livro de receitas SQL
Ative o DataHub antes de utilizar os dados para construir análises abrangentes. Se ainda não o possui, entre em contato conosco para obter detalhes de ativação - [email protected]
Empresas de leasing (particularmente bancos e fornecedores de leasing de frotas) mantêm a propriedade do veículo ou equipamento enquanto o cliente apenas aluga seu uso, portanto elas absorvem o risco relacionado ao ativo durante todo o contrato.
Para proteger o valor residual, fazer cumprir limites contratuais (quilometragem, geografia, manutenção) e simplificar obrigações de serviço completo, elas contam com a Navixy. Dados GPS em tempo real, diagnósticos baseados em sensores e análises comportamentais permitem verificar as condições de uso, automatizar o agendamento de serviços, detectar problemas mecânicos precocemente, calcular penalidades ou taxas por excesso de quilometragem e, quando necessário, imobilizar ou recuperar o ativo — tudo isso protege o investimento, reduz o custo operacional e aumenta a transparência para o cliente ao longo de todo o ciclo do contrato de leasing.
O Navixy DataHub ajudará a organizar qualquer tipo de análise em cada etapa do contrato de leasing. Um contrato de leasing passa por várias fases previsíveis: Integração & Configuração do Ativo → Fase Operacional → Supervisão de Risco & Conformidade
As receitas SQL a seguir no seu livro monitoram coletivamente cada marco crítico ao longo desse ciclo de vida:
Integração & Configuração do Ativo
• Registrar o veículo, ativar seguro e credenciais do condutor. • Importar ativos no portal do cliente com visibilidade correta.
Alertas de Vencimento de Registro/Seguro – datas base capturadas. Vencimento da Carteira de Habilitação – valida motoristas antes da liberação.
Planejamento de Manutenção Preventiva
• Estabelecer cronogramas de serviço recorrentes, baseados em quilometragem e tempo. • Garantir trocas sazonais de pneus.
Inspeções de Rotina por Intervalo – tarefas guiadas por calendário. Serviço por Limite de Quilometragem – regras de revisão menor/maior dirigidas por km. Monitoramento de Horas do Motor – serviço baseado em horas para máquinas.
Limites de Uso Vinculados ao Contrato
• Aplicar concessões de quilometragem e limites financeiros. • Detectar uso excessivo cedo para evitar surpresas no término do contrato.
Limite de Quilometragem & Penalidades – fiscalização de quilômetros por ano / total do contrato.
Comportamento em Tempo Real do Motorista & do Ativo
• Proteger o valor do ativo; orientar motoristas. • Identificar uso indevido que anula a cobertura de “serviço completo”.
Frenagens Bruscas. Acelerações Bruscas. Curvas/Aproximações Abruptas.
Supervisão de Risco & Conformidade
• Manter ativos dentro de limites geográficos e contratuais. • Reter o direito de desativar ou recuperar.
Saída de Geofence (Fronteira do País) – alerta instantâneo em violação de território. Detecção de Ignição & Ócio – rastreamento de desperdício de combustível / uso indevido.
Alertas de Vencimento de Registro / Seguro
Os bancos devem acompanhar os próximos vencimentos de registro e seguro porque são responsáveis pelas inspeções técnicas, registro e seguro. Alertas oportunos evitam multas e tempo de inatividade do veículo.
SELECT v.vehicle_id, v.vehicle_label, v.registration_number, v.free_insurance_valid_till_date, v.liability_insurance_valid_tillFROM raw_business_data.vehicles vWHERE v.free_insurance_valid_till_date BETWEEN CURRENT_DATE AND CURRENT_DATE + (30 * INTERVAL '1 day') OR v.liability_insurance_valid_till BETWEEN CURRENT_DATE1 AND CURRENT_DATE + (30 * INTERVAL '1 day');Vencimento da Carteira de Habilitação
Embora nem sempre seja obrigatório, oferecer alertas proativos de vencimento da carteira é um serviço de valor agregado. Avisos antecipados permitem que os clientes renovem as habilitações antes do vencimento. Observe que você
SELECT e.employee_id,
e.first_name || ' ' || e.last_name AS driver_name,
e.driver_license_number,
e.driver_license_valid_till
FROM raw_business_data.employees e
WHERE e.driver_license_valid_till BETWEEN CURRENT_DATE AND CURRENT_DATE + (30 * INTERVAL '1 day');Saída de Geofence (Fronteira do País)
Contratos podem restringir o movimento do veículo a um território específico (por exemplo, Sérvia). Sair dessa zona deve alertar o banco instantaneamente para que possa agir (por exemplo, contatar o cliente, imobilizar o ativo).
Esta consulta SQL foi projetada para monitorar e identificar quando um dispositivo sai de uma zona geográfica predefinida rotulada "Tallaght Depot Geofences." O processo começa coletando e ordenando os pontos geográficos que definem a fronteira da zona. Para garantir que a fronteira forme um polígono válido, o primeiro ponto é anexado ao final da lista, fechando efetivamente a forma. Esse conjunto fechado de pontos é então usado para criar um polígono que representa a zona geográfica, que é convertido em um objeto geography para análise espacial.
A consulta então recupera dados de rastreamento do dispositivo dentro de um intervalo de tempo especificado, convertendo valores brutos de latitude e longitude em pontos geográficos. Calcula se cada ponto do dispositivo está dentro ou fora da zona predefinida usando a função ST_Contains, que verifica a contenção espacial. O parâmetro calculado pos indica 'inside' se o ponto estiver dentro da zona e 'outside' caso contrário. Finalmente, a consulta filtra esses resultados para detectar transições onde um dispositivo passa de dentro da zona para fora, usando uma função de janela para comparar a posição atual com a anterior. Essa lógica ajuda a monitorar movimentos de dispositivos e detectar eventos de saída de áreas geográficas específicas. Certifique-se de adicionar o valor correto para o parâmetro: z.zone_label = 'your_zone_label'.
WITH zone AS (
SELECT z.zone_id,
ST_MakePolygon(ST_MakeLine(ARRAY_AGG(ST_MakePoint(g.longitude, g.latitude) ORDER BY g.number)))::geography AS geog
FROM raw_business_data.zones z
JOIN raw_business_data.geofence_points g ON g.zone_id = z.zone_id
WHERE z.zone_label = 'your_zone_label'
GROUP BY z.zone_id
),
pts AS (
SELECT device_id,
device_time,
ST_SetSRID(ST_MakePoint(longitude/1e7::numeric, latitude/1e7::numeric), 4326)::geography AS geog
FROM raw_telematics_data.tracking_data_core
WHERE device_time BETWEEN '2025-07-27 00:00:00' AND '2025-07-28 23:59:59'
),
states AS (
SELECT p.*,
CASE WHEN ST_Contains(z.geog::geometry, p.geog::geometry) THEN 'inside' ELSE 'outside' END AS pos
FROM pts p CROSS JOIN zone z
),
filtered_states AS (
SELECT
device_id,
device_time,
pos,
LAG(pos) OVER (PARTITION BY device_id ORDER BY device_time) AS prev_pos
FROM states
)
SELECT device_id, device_time, pos
FROM filtered_states
WHERE prev_pos = 'inside' AND pos = 'outside';
Inspeções de Rotina por Intervalo de Tempo
Algumas tarefas de manutenção se repetem em cronogramas fixos. O sistema deve sinalizar veículos cuja próxima inspeção/verificação esteja prevista dentro de um intervalo definido.
SELECT vehicle_id, description, start_date, date_repeat_interval, start_date + date_repeat_interval * floor(EXTRACT(EPOCH FROM (CURRENT_DATE - start_date)) / EXTRACT(EPOCH FROM date_repeat_interval)) AS last_due, start_date + date_repeat_interval * (floor(EXTRACT(EPOCH FROM (CURRENT_DATE - start_date)) / EXTRACT(EPOCH FROM date_repeat_interval)) + 1) AS next_dueFROM raw_business_data.vehicle_service_tasksWHERE date_repeat_interval IS NOT NULL AND start_date + date_repeat_interval * (floor(EXTRACT(EPOCH FROM (CURRENT_DATE - start_date)) / EXTRACT(EPOCH FROM date_repeat_interval)) + 1) BETWEEN CURRENT_DATE AND CURRENT_DATE + (30 * INTERVAL '1 day');Serviço por Limite de Quilometragem (Menor/Maior)
Serviços menores e maiores são acionados pela quilometragem desde o último evento de serviço. Quando os quilômetros acumulados excedem o limite, o serviço apropriado deve ser agendado.
Observe o o campo vst.description deve conter comentários / descrições relevantes para usá‑lo nos filtros no código SQL abaixo.
SELECT
v.vehicle_id,
v.vehicle_label,
km.km_since_service,
vst.mileage_limit
FROM
raw_business_data.vehicles v
JOIN LATERAL (
SELECT MAX(vst.completion_date) AS last_service_date
FROM raw_business_data.vehicle_service_tasks vst
WHERE vst.vehicle_id = v.vehicle_id
AND (vst.description ILIKE '%minor%' OR vst.description ILIKE '%major%')
AND vst.completion_date IS NOT NULL
) ls ON TRUE
JOIN raw_business_data.objects o ON o.object_id = v.vehicle_id
JOIN LATERAL (
SELECT SUM(t.track_distance_meters) / 1000.0 AS km_since_service
FROM business_data.tracks t
WHERE t.device_id = o.device_id
AND t.track_start_time > ls.last_service_date
) km ON TRUE
JOIN raw_business_data.vehicle_service_tasks vst
ON vst.vehicle_id = v.vehicle_id
AND vst.completion_date = ls.last_service_date
AND (vst.description ILIKE '%minor%' OR vst.description ILIKE '%major%')
Limite de Quilometragem & Penalidades
Contratos de leasing frequentemente limitam a quilometragem (por exemplo, 25.000 km/ano). Se o limite for excedido, cláusulas de penalidade se aplicam. O sistema deve comparar a quilometragem real durante o período do contrato com o limite acordado e calcular as taxas.
WITH driven AS (
SELECT
o.object_id,
DATE_TRUNC('year', t.track_start_time) AS year,
SUM(t.track_distance_meters) / 1000.0 AS km_year
FROM
business_data.tracks t
JOIN raw_business_data.objects o ON o.device_id = t.device_id
WHERE
t.track_start_time >= '2023-01-01'::date
AND t.track_start_time < '2024-01-01'::date
GROUP BY
o.object_id, DATE_TRUNC('year', t.track_start_time)
),
limits AS (
SELECT
object_id,
10000 AS km_limit,
0.5 AS penalty_rate
FROM
raw_business_data.objects
)
SELECT
d.object_id,
d.year,
d.km_year,
l.km_limit,
GREATEST(d.km_year - l.km_limit, 0) AS km_over,
GREATEST(d.km_year - l.km_limit, 0) * l.penalty_rate AS penalty_amount
FROM
driven d
JOIN limits l ON d.object_id = l.object_id;Monitoramento de Horas do Motor
Para máquinas e equipamentos agrícolas, as horas de operação — não a quilometragem — guiam a manutenção e a cobrança. Dados de horas do motor (por exemplo, do CAN-Bus) devem ser monitorados e resumidos.
WITH last_service AS (
SELECT
vst.vehicle_id,
MAX(vst.completion_date) AS last_service_date,
MAX(vst.completion_engine_hours) AS last_service_engine_hours
FROM
raw_business_data.vehicle_service_tasks vst
GROUP BY
vst.vehicle_id
),
engine_hours_since_service AS (
SELECT
v.vehicle_id,
SUM(t.track_duration_seconds) / 3600.0 AS engine_hours_since_service
FROM
raw_business_data.vehicles v
JOIN raw_business_data.objects o ON o.object_id = v.object_id
JOIN business_data.tracks t ON t.device_id = o.device_id
JOIN last_service ls ON ls.vehicle_id = v.vehicle_id
WHERE
t.track_start_time > ls.last_service_date
GROUP BY
v.vehicle_id
)
SELECT
v.vehicle_id,
v.vehicle_label,
ls.last_service_engine_hours,
ehs.engine_hours_since_service,
(COALESCE(ehs.engine_hours_since_service,0) + COALESCE(ls.last_service_engine_hours,0)) AS current_engine_hours,
vst.engine_hours_limit
FROM
raw_business_data.vehicles v
JOIN last_service ls ON ls.vehicle_id = v.vehicle_id
LEFT JOIN engine_hours_since_service ehs ON ehs.vehicle_id = v.vehicle_id
JOIN raw_business_data.vehicle_service_tasks vst
ON vst.vehicle_id = v.vehicle_id
AND vst.completion_date = ls.last_service_dateEventos de Frenagem Brusca
O comportamento de condução afeta o desgaste e a conformidade contratual. Detectar frenagens bruscas ajuda o banco a atribuir desgaste prematuro de freios/pneus ao uso indevido pelo motorista e, se necessário, repassar custos.
A consulta SQL abaixo primeiro calcula a velocidade em quilômetros por hora e a diferença de tempo entre pontos de dados consecutivos para cada dispositivo. Usando essa informação, ela calcula a taxa de desaceleração em quilômetros por hora por segundo. Finalmente, filtra e retorna registros onde a taxa de desaceleração é de 20 km/h por segundo ou mais, indicando eventos de desaceleração significativos.
WITH spd AS (
SELECT
device_id,
device_time,
speed/100.0 AS kmh,
LAG(speed/100.0) OVER (PARTITION BY device_id ORDER BY device_time) AS prev_kmh,
EXTRACT(EPOCH FROM (device_time - LAG(device_time) OVER (PARTITION BY device_id ORDER BY device_time))) AS dt_sec
FROM
raw_telematics_data.tracking_data_core
WHERE
device_time BETWEEN '2025-07-24 00:00:00' AND '2025-07-24 23:59:59'
),
decels AS (
SELECT
device_id,
device_time,
(prev_kmh - kmh) / NULLIF(dt_sec, 0) AS decel_kmh_per_sec
FROM
spd
WHERE
prev_kmh IS NOT NULL
)
SELECT *
FROM decels
WHERE decel_kmh_per_sec >= 20;Eventos de Aceleração Brusca
Acelerações agressivas aumentam o desgaste em pneus, transmissões, trens de transmissão e suportes do motor. Identificar esses eventos apoia o treinamento e a possível recuperação de custos.
A consulta SQL abaixo foi projetada para identificar eventos significativos de aceleração a partir de um conjunto de dados de rastreamento. Primeiro ela calcula a velocidade em quilômetros por hora e a diferença de tempo entre pontos de dados consecutivos para cada dispositivo. Usando essa informação, calcula a taxa de aceleração em quilômetros por hora por segundo. Finalmente, filtra e retorna registros onde a taxa de aceleração atende ou excede um limite especificado, indicando eventos de aceleração significativos.
WITH spd AS (
SELECT
device_id,
device_time,
speed/100.0 AS kmh,
LAG(speed/100.0) OVER (PARTITION BY device_id ORDER BY device_time) AS prev_kmh,
EXTRACT(EPOCH FROM (device_time - LAG(device_time) OVER (PARTITION BY device_id ORDER BY device_time))) AS dt_sec
FROM
raw_telematics_data.tracking_data_core
WHERE
device_time BETWEEN '2025-07-28 00:00:00' AND '2025-07-28 23:59:59'
)
SELECT
device_id,
device_time,
(kmh - prev_kmh) / NULLIF(dt_sec, 0) AS accel_kmh_per_sec
FROM
spd
WHERE
prev_kmh IS NOT NULL
AND (kmh - prev_kmh) / NULLIF(dt_sec, 0) >= 20;Curvas / Contornos Súbitos
Curvas acentuadas combinadas com alterações abruptas de velocidade indicam condução de risco. Rastrear esse comportamento ajuda a detectar uso indevido do veículo.
Esta consulta SQL foi projetada para identificar mudanças significativas de direção e velocidade a partir de dados de rastreamento em um período de tempo especificado. Primeiro converte valores brutos de latitude e longitude em graus decimais e calcula a velocidade em quilômetros por hora. Usando a função LAG, recupera dados de localização e velocidade anteriores para cada dispositivo, permitindo o cálculo das variações ao longo do tempo. A consulta então calcula a mudança de rumo em graus usando funções trigonométricas para determinar o azimute entre pontos consecutivos. Também computa a variação de velocidade entre esses pontos. Finalmente, a consulta filtra os resultados para incluir apenas aqueles registros em que a variação absoluta de rumo é de 10 graus ou mais e a variação absoluta de velocidade é de 5 km/h ou mais, identificando manobras ou eventos significativos nos dados de rastreamento.
WITH pts AS (
SELECT
device_id,
device_time,
latitude/1e7::numeric AS lat,
longitude/1e7::numeric AS lon,
LAG(latitude/1e7::numeric) OVER (PARTITION BY device_id ORDER BY device_time) AS prev_lat,
LAG(longitude/1e7::numeric) OVER (PARTITION BY device_id ORDER BY device_time) AS prev_lon,
speed/100.0 AS kmh,
LAG(speed/100.0) OVER (PARTITION BY device_id ORDER BY device_time) AS prev_kmh
FROM
raw_telematics_data.tracking_data_core
WHERE
device_time BETWEEN '2025-07-28 00:00:00' AND '2025-07-28 23:59:59'
),
bearing AS (
SELECT *,
atan2(
sin(radians(lon-prev_lon))*cos(radians(lat)),
cos(radians(prev_lat))*sin(radians(lat)) -
sin(radians(prev_lat))*cos(radians(lat))*cos(radians(lon-prev_lon))
) * 180/pi() AS heading_change,
(kmh - prev_kmh) AS delta_speed
FROM pts
)
SELECT *
FROM bearing
WHERE abs(heading_change) >= 10
AND abs(delta_speed) >= 5;
Detecção de Ignição & Ócio
Medir tempo de ócio (ignição ligada, baixa/nenhuma velocidade) ajuda a reduzir desperdício de combustível e identificar uso indevido. Períodos longos de marcha lenta devem ser reportados e gerenciados.
WITH ign AS ( SELECT device_id, device_time, value::int AS ign_on FROM raw_telematics_data.states WHERE state_name = 'ignition' AND device_time BETWEEN :from_ts AND :to_ts),spd AS ( SELECT device_id, device_time, speed/100.0 AS kmh FROM raw_telematics_data.tracking_data_core WHERE device_time BETWEEN :from_ts AND :to_ts),merged AS ( SELECT i.device_id, i.device_time, i.ign_on, s.kmh, LEAD(i.device_time) OVER (PARTITION BY i.device_id ORDER BY i.device_time) AS next_time FROM ign i LEFT JOIN spd s USING (device_id, device_time))SELECT device_id, device_time AS idle_start, next_time AS idle_end, EXTRACT(EPOCH FROM (next_time - device_time))/60 AS idle_minutesFROM mergedWHERE ign_on = 1 AND kmh < :idle_speed AND next_time - device_time >= INTERVAL ':idle_min minutes';Atualizado
Isto foi útil?