Leasing

Estudo de caso de leasing e livro de receitas SQL

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:

Fase do Ciclo de Vida
Objetivos & Marcos
Casos de Uso / Receitas Cobertas

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_date

Eventos 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?