Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP][sppo] licenciamento #71

Closed
wants to merge 19 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions dbt_project.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ vars:
sppo_terminais: "rj-smtr.br_rj_riodejaneiro_transporte.terminais_onibus_coordenadas" # aux_registros_parada
sppo_registros_staging: "rj-smtr-staging.br_rj_riodejaneiro_onibus_gps_staging.registros"
sppo_realocacao_staging: "rj-smtr-staging.br_rj_riodejaneiro_onibus_gps_staging.realocacao"
sppo_licenciamento_staging: "rj-smtr-staging.veiculo_staging.sppo_licenciamento"
sppo_infracao_staging: "rj-smtr-staging.operacao_staging.sppo_infracao"

# Parametros de intersecção do ônibus com rota
## Tamanho do buffer da rota
Expand Down Expand Up @@ -148,3 +150,9 @@ models:
dashboard_subsidio_sppo:
+materialized: view
+schema: dashboard_subsidio_sppo
veiculo:
+materialized: view
+schema: veiculo
operacao:
+materialized: view
+schema: operacao
13 changes: 13 additions & 0 deletions models/dashboard_subsidio_sppo/subsidio_classificacao.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
SELECT
id_classificacao,
CASE
WHEN id_classificacao = 1 THEN "Veículo não licenciado"
WHEN id_classificacao = 2 THEN "Veículo sem ar condicionado"
WHEN id_classificacao = 3 THEN "Veículo com ar condicionado e autuado por inoperância"
WHEN id_classificacao = 4 THEN "Veículo sem irregularidade identificada"
ELSE
"Motivo não identificado"
END
AS descricao
FROM
UNNEST(GENERATE_ARRAY(1, 4, 1)) AS id_classificacao
28 changes: 28 additions & 0 deletions models/dashboard_subsidio_sppo/subsidio_valor_multa_dia.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{{
config(
alias='valor_multa_dia'
)
}}

WITH
classificacao AS (
SELECT
data,
faixa_km
FROM
`rj-smtr.projeto_subsidio_sppo.subsidio_data_versao_efetiva`
CROSS JOIN
UNNEST([STRUCT(0 AS start,
40 AS finish), STRUCT(40 AS start,
60 AS finish)]) AS faixa_km )
SELECT
*,
CASE
WHEN faixa_km.start = 0 AND faixa_km.finish = 40 THEN 1126.55 -- ART. 5º-A, II - DEC RIO N. 51.889/2022 ALTERADO PELO DEC RIO N. 51940/2023
WHEN faixa_km.start = 40 AND faixa_km.finish = 60 THEN 563.28 -- ART. 5º-A, I - DEC RIO N. 51.889/2022 ALTERADO PELO DEC RIO N. 51940/2023
ELSE
0
END
AS valor_multa
FROM
classificacao
26 changes: 26 additions & 0 deletions models/dashboard_subsidio_sppo/subsidio_valor_subsidio_dia.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{{
config(
alias='valor_subsidio_dia'
)
}}

WITH
classificacao AS (
SELECT
data,
id_classificacao
FROM
`rj-smtr.projeto_subsidio_sppo.subsidio_data_versao_efetiva`
CROSS JOIN
UNNEST(GENERATE_ARRAY(1, 4, 1)) AS id_classificacao )
SELECT
*,
CASE
WHEN id_classificacao = 1 THEN 0
WHEN id_classificacao = 2 THEN 1.97
WHEN id_classificacao = 3 THEN 0
WHEN id_classificacao = 4 THEN 2.81
ELSE 0
END AS valor_subsidio_por_km
FROM
classificacao
51 changes: 27 additions & 24 deletions models/dashboard_subsidio_sppo/sumario_subsidio_dia.sql
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ config(
)
}}

-- Calcula percentual de KM executado de todos os serviços para cada dia,
-- Calcula percentual de km executado de todos os serviços para cada dia,
-- desde o início do subsídio (jun/22) até a data máxima da última quinzena apurada.

-- 1. Soma viagens realizadas de diferentes sentidos do mesmo serviço.
-- A KM planejada é por serviço e nao sentido, portanto a distancia_total_planejada
-- A km planejada é por serviço e nao sentido, portanto a distancia_total_planejada
-- da sumario_periodo já é a total do serviço para ambos os sentidos e por isso nao somamos.
WITH
sumario AS (
Expand All @@ -20,42 +20,45 @@ WITH
ROUND(SUM(viagens_planejadas), 3) AS viagens_planejadas,
ROUND(SUM(viagens_subsidio), 3) AS viagens_subsidio,
MAX(distancia_total_planejada) AS distancia_total_planejada,
ROUND(SUM(distancia_total_subsidio), 3) AS distancia_total_subsidio,
-- Distância percorrida por veículo não licenciado não é considerada
ROUND(SUM (CASE
WHEN id_classificacao != 1 THEN distancia_total_subsidio
ELSE 0
END), 3) AS distancia_total_subsidio,
ROUND(SUM(valor_total_aferido), 2) AS valor_total_aferido
FROM
{{ ref("sumario_subsidio_dia_periodo") }}
{{ ref("sumario_subsidio_km_dia") }}
GROUP BY
1,
2,
3,
4 ),
-- 2. Recupera o valor do KM para cada data planejada e calcula o percentual de KM executado.
-- No caso de serviços sem planejamento para o dia, o percentual padrao é nulo.
valor AS (
-- 2. Calcula o % de cumprimento do km planejado
perc_subsidio AS (
SELECT
s.*,
v.valor_subsidio_por_km,
ROUND(distancia_total_subsidio * v.valor_subsidio_por_km, 2) AS valor_total_aferido,
*,
IF
(distancia_total_planejada = 0, NULL, ROUND(100*distancia_total_subsidio/distancia_total_planejada, 2)) AS perc_distancia_total_subsidio
FROM
sumario s
LEFT JOIN (
SELECT
*
FROM
{{ ref("subsidio_data_versao_efetiva") }}
WHERE
data BETWEEN "2022-06-01" AND DATE("{{ var("end_date") }}")) AS v
ON
v.data = s.data )
-- 3. Define o valor total a ser pago com base no cumprimento do KM planejado - mínimo de 80%.
sumario )
-- 3. Define o valor total a ser pago com base no cumprimento do km planejado - mínimo de 80%
-- Abaixo de 60% ainda há aplicação de dedução
SELECT
*,
p.*,
CASE
WHEN (perc_distancia_total_subsidio < {{ var("perc_distancia_total_subsidio") }}) OR (perc_distancia_total_subsidio IS NULL) THEN 0
WHEN ((perc_distancia_total_subsidio IS NULL) OR (perc_distancia_total_subsidio >= {{ var("perc_distancia_total_subsidio_min_penalidade") }} AND perc_distancia_total_subsidio < {{ var("perc_distancia_total_subsidio_min") }})) THEN 0
WHEN perc_distancia_total_subsidio < {{ var("perc_distancia_total_subsidio_min_penalidade") }} THEN -v.valor_multa
ELSE
valor_total_aferido
END
AS valor_total_subsidio
FROM
valor
perc_subsidio AS p
LEFT JOIN
{{ ref("subsidio_valor_multa_dia") }} AS v
ON
v.data = p.data AND
p.perc_distancia_total_subsidio >= v.faixa_km.start AND
p.perc_distancia_total_subsidio < v.faixa_km.finish
ORDER BY
data
18 changes: 12 additions & 6 deletions models/dashboard_subsidio_sppo/sumario_subsidio_dia_periodo.sql
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,31 @@ config(
alias='sumario_periodo'
)
}}

-- 1. Sumariza viagens aferidas
WITH
viagem AS (
SELECT
data,
trip_id,
id_classificacao,
COUNT(id_viagem) AS viagens_realizadas
FROM
{{ ref("viagem_completa") }}
`rj-smtr-dev.projeto_subsidio_sppo.viagem_completa_subsidio` -- TODO: ref to prod {{ ref("viagem_completa") }}
WHERE
data BETWEEN "2022-06-01" AND DATE("{{ var("end_date") }}")
-- TODO: def criterio data
data BETWEEN "2023-01-16" AND "2023-01-31"
GROUP BY
1,
2 ),
2,
3 ),
-- 2. Junta informações de viagens planejadas às realizadas
planejado AS (
SELECT
DISTINCT p.*,
IFNULL(v.viagens_realizadas, 0) AS viagens_realizadas,
IFNULL(v.viagens_realizadas, 0) AS viagens_subsidio,
id_classificacao,
FROM (
SELECT
consorcio,
Expand All @@ -43,9 +48,10 @@ WITH
MAX(distancia_total_planejada) AS distancia_total_planejada,
NULL AS viagens_planejadas
FROM
{{ ref("viagem_planejada") }}
`rj-smtr`.`projeto_subsidio_sppo`.`viagem_planejada` -- TODO: ref to prod {{ ref("viagem_planejada") }}
WHERE
data BETWEEN "2022-06-01" AND DATE("{{ var("end_date") }}")
-- TODO: def criterio data
data BETWEEN "2023-01-16" AND "2023-01-31"
GROUP BY
1,
2,
Expand All @@ -61,7 +67,7 @@ WITH
ON
v.trip_id = p.trip_id
AND v.data = p.data )
-- 4. Adiciona informações de distância total
-- 3. Adiciona informações de distância total
SELECT
* EXCEPT(distancia_planejada,
distancia_total_planejada),
Expand Down
50 changes: 50 additions & 0 deletions models/dashboard_subsidio_sppo/sumario_subsidio_km_dia.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{{
config(
alias='sumario_km_dia'
)
}}

-- Calcula percentual de km executado de todos os serviços para cada dia,
-- desde o início do subsídio (jun/22) até a data máxima da última quinzena apurada.

-- 1. Soma viagens realizadas de diferentes sentidos do mesmo serviço por id_classificacao
-- A km planejada é por serviço e nao sentido, portanto a distancia_total_planejada
-- da sumario_periodo já é a total do serviço para ambos os sentidos e por isso nao somamos.
WITH
sumario AS (
SELECT
consorcio,
data,
tipo_dia,
servico,
id_classificacao,
ROUND(SUM(viagens_planejadas), 3) AS viagens_planejadas,
ROUND(SUM(viagens_subsidio), 3) AS viagens_subsidio,
MAX(distancia_total_planejada) AS distancia_total_planejada,
ROUND(SUM(distancia_total_subsidio), 3) AS distancia_total_subsidio,
FROM
{{ ref("sumario_subsidio_dia_periodo") }}
GROUP BY
1,
2,
3,
4,
5 )
-- 2. Recupera o valor do km para cada data planejada
SELECT
s.*,
v.valor_subsidio_por_km,
ROUND(distancia_total_subsidio * v.valor_subsidio_por_km, 2) AS valor_total_aferido
FROM
sumario s
LEFT JOIN (
SELECT
*
FROM
{{ ref("subsidio_valor_subsidio_dia") }}
WHERE
-- TODO: def criterio data
data BETWEEN "2023-01-16" AND "2023-01-31") AS v
ON
v.data = s.data AND
v.id_classificacao = s.id_classificacao
8 changes: 5 additions & 3 deletions models/dashboard_subsidio_sppo/viagens_realizadas.sql
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
SELECT
*
* EXCEPT(id_classificacao)
FROM
{{ ref("viagem_completa") }}
--`rj-smtr.projeto_subsidio_sppo.viagem_completa` -- {{ ref("viagem_completa") }}
`rj-smtr-dev.projeto_subsidio_sppo.viagem_completa_subsidio` -- {{ ref("viagem_completa") }}
WHERE
data BETWEEN "2022-06-01" AND DATE("{{ var("end_date") }}")
data BETWEEN "2022-06-01" AND DATE("{{ var("end_date") }}")
AND id_classificacao != 1
16 changes: 16 additions & 0 deletions models/operacao/sppo_infracao.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
-- TODO: configurar materializacao da tabela
SELECT
data,
timestamp_captura,
SAFE_CAST(placa AS STRING) placa,
SAFE_CAST(id_auto_infracao AS STRING) id_auto_infracao,
SAFE_CAST(JSON_VALUE(content,'$.permissao') AS STRING) permissao,
SAFE_CAST(JSON_VALUE(content,'$.modo') AS STRING) modo,
PARSE_DATE("%d/%m/%Y", SAFE_CAST(JSON_VALUE(content,'$.data_infracao') AS STRING)) data_infracao,
SAFE_CAST(JSON_VALUE(content,'$.valor') AS FLOAT64) valor,
SAFE_CAST(JSON_VALUE(content,'$.id_infracao') AS STRING) id_infracao,
SAFE_CAST(JSON_VALUE(content,'$.infracao') AS STRING) infracao,
SAFE_CAST(JSON_VALUE(content,'$.status') AS STRING) status,
PARSE_DATE("%d/%m/%Y", SAFE_CAST(JSON_VALUE(content,'$.data_pagamento') AS STRING)) data_pagamento
FROM
{{ var('sppo_infracao_staging') }} as t
Loading