From ad241eceb854eaa0e964115cc7eb7687afe2fde3 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Mon, 29 May 2023 16:07:52 -0300 Subject: [PATCH 01/28] initial commit --- dbt_project.yml | 7 +++ .../card_transactions.sql | 38 +++++++++++++ .../br_rj_riodejaneiro_onibus_tg/schema.yaml | 56 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 models/br_rj_riodejaneiro_onibus_tg/card_transactions.sql create mode 100644 models/br_rj_riodejaneiro_onibus_tg/schema.yaml diff --git a/dbt_project.yml b/dbt_project.yml index b580a034..d2f39c48 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -130,6 +130,10 @@ vars: rho_max_processing_interval: 7 rho_sppo_start_date: "2021-03-01" + + ### TG #### + tg_card_transactions_staging: "`rj-smtr-staging.br_rj_riodejaneiro_onibus_tg.card_transactions`" + models: +persist_docs: relation: true @@ -159,3 +163,6 @@ models: br_rj_riodejaneiro_rdo: +materialized: view +schema: br_rj_riodejaneiro_rdo + br_rj_riodejaneiro_onibus_tg: + +materialized: view + +schema: br_rj_riodejaneiro_onibus_tg diff --git a/models/br_rj_riodejaneiro_onibus_tg/card_transactions.sql b/models/br_rj_riodejaneiro_onibus_tg/card_transactions.sql new file mode 100644 index 00000000..9b70614e --- /dev/null +++ b/models/br_rj_riodejaneiro_onibus_tg/card_transactions.sql @@ -0,0 +1,38 @@ +{{ + config(alias='tg_card_transactions') +}} + +SELECT + SAFE_CAST(tipo_registro AS STRING) AS tipo_registro, + SAFE_CAST(versao_registro AS STRING) AS versao_registro, + SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS tsn_timestamp, + SAFE_CAST(aplicacao AS INT64) AS aplicacao, + SAFE_CAST(emissor_aplicacao AS INT64) AS emissor_aplicacao, + SAFE_CAST(tsn AS INT64) AS tsn, + SAFE_CAST(valor_tarifa/100 AS FLOAT64) AS valor_tarifa, + SAFE_CAST(valor_tarifa_anterior/100 AS FLOAT64) AS valor_tarifa_anterior, + SAFE_CAST(valor_debitado/100 AS FLOAT64) AS valor_debitado, + SAFE_CAST(status AS INT64) AS status, + SAFE_CAST(num_onibus AS STRING) AS id_veiculo, + SAFE_CAST(tipo_embarque AS INT64) AS tipo_embarque, + SAFE_CAST(SAFE_CAST(diferenca_valor_debitado AS INT64)/100 AS FLOAT64) AS diferenca_valor_debitado, + SAFE_CAST(SAFE_CAST(valor_promo_desconto AS INT64)/100 AS FLOAT64) AS valor_promo_desconto, + SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS valor_acumulado, + SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS INT64) AS tipo_debito, + SAFE_CAST(SAFE_CAST(mensagem_debito AS FLOAT64) AS INT64) AS mensagem_debito, + SAFE_CAST(origin_file AS STRING) AS origin_file, + SAFE_CAST(garagem AS STRING) AS garagem, + SAFE_CAST(file_date AS STRING) AS file_date, + SAFE_CAST(codigo_empresa AS INT64) AS codigo_empresa, + SAFE_CAST(uid AS STRING) AS uid, + SAFE_CAST(ano AS INT64) AS ano, + SAFE_CAST(mes AS INT64) AS mes, + SAFE_CAST(dia AS INT64) AS dia +FROM + {{var('tg_card_transactions_staging')}} +WHERE + ano = 2023 + AND mes = 4 + AND dia = 1 +LIMIT + 10 \ No newline at end of file diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml new file mode 100644 index 00000000..47a4bbc1 --- /dev/null +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -0,0 +1,56 @@ +version: 2 + +models: + - name: tg_card_transactions + description: "tg_card_transactions" + columns: + - name: tipo_registro + description: "Tipo de registro de acordo com a especificação TG/PRODATA (Valor Fixo: 002)" + - name: versao_registro + description: "Versão deste registro" + - name: tsn_timestamp + description: "Timestamp da transação em GMT-3" + - name: aplicacao + description: "Número do aplicação (Vide anexo 'Aplicações')" + - name: emissor_aplicacao + description: "emissor_aplicacao" + - name: tsn + description: "tsn" + - name: valor_tarifa + description: "valor_tarifa" + - name: valor_tarifa_anterior + description: "valor_tarifa_anterior" + - name: valor_debitado + description: "valor_debitado" + - name: status + description: "status" + - name: id_veiculo + description: "id_veiculo" + - name: tipo_embarque + description: "tipo_embarque" + - name: diferenca_valor_debitado + description: "diferenca_valor_debitado" + - name: valor_promo_desconto + description: "valor_promo_desconto" + - name: valor_acumulado + description: "valor_acumulado" + - name: tipo_debito + description: "tipo_debito" + - name: mensagem_debito + description: "mensagem_debito" + - name: origin_file + description: "origin_file" + - name: garagem + description: "garagem" + - name: file_date + description: "file_date" + - name: codigo_empresa + description: "codigo_empresa" + - name: uid + description: "uid" + - name: ano + description: "ano" + - name: mes + description: "mes" + - name: dia + description: "dia" \ No newline at end of file From ddf68cff10e5b46d6a172052101806cf1081d9f4 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Wed, 31 May 2023 02:39:11 -0300 Subject: [PATCH 02/28] update yaml and fix ontology --- dbt_project.yml | 2 +- .../br_rj_riodejaneiro_onibus_tg/schema.yaml | 58 +++++++++---------- ...sql => tg_microdados_transacao_cartao.sql} | 27 +++++---- 3 files changed, 42 insertions(+), 45 deletions(-) rename models/br_rj_riodejaneiro_onibus_tg/{card_transactions.sql => tg_microdados_transacao_cartao.sql} (76%) diff --git a/dbt_project.yml b/dbt_project.yml index d2f39c48..26ec4112 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -132,7 +132,7 @@ vars: ### TG #### - tg_card_transactions_staging: "`rj-smtr-staging.br_rj_riodejaneiro_onibus_tg.card_transactions`" + tg_microdados_transacao_cartao_staging: "`rj-smtr-staging.br_rj_riodejaneiro_onibus_tg.card_transactions`" models: +persist_docs: diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index 47a4bbc1..86e8e01e 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -1,56 +1,54 @@ version: 2 models: - - name: tg_card_transactions - description: "tg_card_transactions" + - name: tg_microdados_transacao_cartao + description: "Microdados das transações de cartão. Cada registro é uma transação." columns: - name: tipo_registro description: "Tipo de registro de acordo com a especificação TG/PRODATA (Valor Fixo: 002)" - name: versao_registro description: "Versão deste registro" - - name: tsn_timestamp + - name: timestamp_transacao description: "Timestamp da transação em GMT-3" - - name: aplicacao + - name: numero_aplicacao description: "Número do aplicação (Vide anexo 'Aplicações')" - - name: emissor_aplicacao - description: "emissor_aplicacao" - - name: tsn - description: "tsn" + - name: sequencial_transacao + description: "Número sequencial da transação no veículo naquele dia" - name: valor_tarifa - description: "valor_tarifa" + description: "Valor da tarifa configurado no equipamento (R$)" - name: valor_tarifa_anterior - description: "valor_tarifa_anterior" + description: "Valor da tarifa anterior da viagem anterior (R$)" - name: valor_debitado - description: "valor_debitado" + description: "Valor debitado na viagem atual (R$)" - name: status - description: "status" + description: "Estado da transação, indicando falha ou sucesso (0 - Sucesso, 1 - Falha, 2 - Cartão rejeitado)" - name: id_veiculo - description: "id_veiculo" + description: "Número do veículo configurado no equipamento (apenas número)" - name: tipo_embarque - description: "tipo_embarque" + description: "Tipo de embarque atual, indica se é integração ou não (0 - Embarque normal, 1 - Integração)" - name: diferenca_valor_debitado - description: "diferenca_valor_debitado" + description: "Diferença do valor debitado na transação (R$)" - name: valor_promo_desconto - description: "valor_promo_desconto" + description: "Valor promocional ou de desconto da tarifa (R$)" - name: valor_acumulado - description: "valor_acumulado" + description: "Soma do valor total pago em uma integração (R$)" - name: tipo_debito - description: "tipo_debito" + description: "Tipo de débito no cartão (0 - Full fare, 1 - Promotional Fare, 2 - Discount Applied, 3 - BU Fare, 4 - BU-MUN Fare, 5 - BUCS, 6 - Prouni)" - name: mensagem_debito - description: "mensagem_debito" - - name: origin_file - description: "origin_file" + description: "Mensagem de estado do débito no cartão (0 - Normal, 161 - Validation Without Finger, 190 - Passback BU, 191 - Limite por dia BU atingido, 192 - Créditos expirados para uso BU, 193 - BU desabilitado)" + - name: arquivo_origem + description: "Nome do arquivo txt de origem do registro: TG[Código da Empresa]_[id_veiculo]_[Número do Validador]_[Número de Controle Sequencial]_[Código da Empresa]_[Timestamp de geração do arquivo]_[Versão do Validador (Software) - XX.XX]" - name: garagem - description: "garagem" - - name: file_date - description: "file_date" + description: "Garagem onde o arquivo de origem foi descarregado" + - name: data_arquivo_origem + description: "Data de criação do arquivo binário de origem extraída do nome do arquivo" - name: codigo_empresa - description: "codigo_empresa" - - name: uid - description: "uid" + description: "Código da empresa que opera o veículo de origem da transação" + - name: id_cartao + description: "Número único criptografado do cartão RioCard" - name: ano - description: "ano" + description: "Ano da transação (partição)" - name: mes - description: "mes" + description: "Mês da transação (partição)" - name: dia - description: "dia" \ No newline at end of file + description: "Dia da transação (partição)" \ No newline at end of file diff --git a/models/br_rj_riodejaneiro_onibus_tg/card_transactions.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_microdados_transacao_cartao.sql similarity index 76% rename from models/br_rj_riodejaneiro_onibus_tg/card_transactions.sql rename to models/br_rj_riodejaneiro_onibus_tg/tg_microdados_transacao_cartao.sql index 9b70614e..fa598be3 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/card_transactions.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_microdados_transacao_cartao.sql @@ -1,35 +1,34 @@ {{ - config(alias='tg_card_transactions') + config(alias='microdados_transacao_cartao') }} SELECT SAFE_CAST(tipo_registro AS STRING) AS tipo_registro, SAFE_CAST(versao_registro AS STRING) AS versao_registro, - SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS tsn_timestamp, - SAFE_CAST(aplicacao AS INT64) AS aplicacao, - SAFE_CAST(emissor_aplicacao AS INT64) AS emissor_aplicacao, - SAFE_CAST(tsn AS INT64) AS tsn, - SAFE_CAST(valor_tarifa/100 AS FLOAT64) AS valor_tarifa, - SAFE_CAST(valor_tarifa_anterior/100 AS FLOAT64) AS valor_tarifa_anterior, - SAFE_CAST(valor_debitado/100 AS FLOAT64) AS valor_debitado, + SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS timestamp_transacao, + SAFE_CAST(aplicacao AS INT64) AS numero_aplicacao, + SAFE_CAST(tsn AS INT64) AS sequencial_transacao, SAFE_CAST(status AS INT64) AS status, SAFE_CAST(num_onibus AS STRING) AS id_veiculo, SAFE_CAST(tipo_embarque AS INT64) AS tipo_embarque, + SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS INT64) AS tipo_debito, + SAFE_CAST(SAFE_CAST(mensagem_debito AS FLOAT64) AS INT64) AS mensagem_debito, + SAFE_CAST(valor_tarifa/100 AS FLOAT64) AS valor_tarifa, + SAFE_CAST(valor_tarifa_anterior/100 AS FLOAT64) AS valor_tarifa_anterior, + SAFE_CAST(valor_debitado/100 AS FLOAT64) AS valor_debitado, SAFE_CAST(SAFE_CAST(diferenca_valor_debitado AS INT64)/100 AS FLOAT64) AS diferenca_valor_debitado, SAFE_CAST(SAFE_CAST(valor_promo_desconto AS INT64)/100 AS FLOAT64) AS valor_promo_desconto, SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS valor_acumulado, - SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS INT64) AS tipo_debito, - SAFE_CAST(SAFE_CAST(mensagem_debito AS FLOAT64) AS INT64) AS mensagem_debito, - SAFE_CAST(origin_file AS STRING) AS origin_file, + SAFE_CAST(origin_file AS STRING) AS arquivo_origem, SAFE_CAST(garagem AS STRING) AS garagem, - SAFE_CAST(file_date AS STRING) AS file_date, + SAFE_CAST(file_date AS STRING) AS data_arquivo_origem, SAFE_CAST(codigo_empresa AS INT64) AS codigo_empresa, - SAFE_CAST(uid AS STRING) AS uid, + SAFE_CAST(uid AS STRING) AS id_cartao, SAFE_CAST(ano AS INT64) AS ano, SAFE_CAST(mes AS INT64) AS mes, SAFE_CAST(dia AS INT64) AS dia FROM - {{var('tg_card_transactions_staging')}} + {{var('tg_microdados_transacao_cartao_staging')}} WHERE ano = 2023 AND mes = 4 From 1859f13e2296ae91293ac4ca7987bcf6d16b1f53 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Fri, 2 Jun 2023 01:26:32 -0300 Subject: [PATCH 03/28] apenas transacoes de sucesso + ajuste numero_aplicacao --- .../tg_microdados_transacao_cartao.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_microdados_transacao_cartao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_microdados_transacao_cartao.sql index fa598be3..1d022c31 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_microdados_transacao_cartao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_microdados_transacao_cartao.sql @@ -6,7 +6,7 @@ SELECT SAFE_CAST(tipo_registro AS STRING) AS tipo_registro, SAFE_CAST(versao_registro AS STRING) AS versao_registro, SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS timestamp_transacao, - SAFE_CAST(aplicacao AS INT64) AS numero_aplicacao, + SAFE_CAST(emissor_aplicacao || "_" || aplicacao AS STRING) AS numero_aplicacao, SAFE_CAST(tsn AS INT64) AS sequencial_transacao, SAFE_CAST(status AS INT64) AS status, SAFE_CAST(num_onibus AS STRING) AS id_veiculo, @@ -33,5 +33,6 @@ WHERE ano = 2023 AND mes = 4 AND dia = 1 + AND status = 0 -- Apenas transações com sucesso LIMIT 10 \ No newline at end of file From 68d4965235261620614e6395e52b5f280d72140d Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Fri, 16 Jun 2023 16:14:59 -0300 Subject: [PATCH 04/28] update tg_transacao --- ...icrodados_transacao_cartao.sql => tg_transacao.sql} | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) rename models/br_rj_riodejaneiro_onibus_tg/{tg_microdados_transacao_cartao.sql => tg_transacao.sql} (91%) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_microdados_transacao_cartao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql similarity index 91% rename from models/br_rj_riodejaneiro_onibus_tg/tg_microdados_transacao_cartao.sql rename to models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index 1d022c31..9a430203 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_microdados_transacao_cartao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -1,5 +1,5 @@ {{ - config(alias='microdados_transacao_cartao') + config(alias='transacao') }} SELECT @@ -30,9 +30,7 @@ SELECT FROM {{var('tg_microdados_transacao_cartao_staging')}} WHERE - ano = 2023 - AND mes = 4 + (ano = 2022 OR ano = 2023) -- Apenas dados de 2022 e 2023 + AND mes >= 1 AND dia = 1 - AND status = 0 -- Apenas transações com sucesso -LIMIT - 10 \ No newline at end of file + AND status = 0 -- Apenas transações com sucesso \ No newline at end of file From 363d0af6bf1a1c6f376172b1573ce82133928b2a Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Fri, 16 Jun 2023 16:19:06 -0300 Subject: [PATCH 05/28] update tg_transacao schema --- models/br_rj_riodejaneiro_onibus_tg/schema.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index 86e8e01e..9a83a363 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -1,7 +1,7 @@ version: 2 models: - - name: tg_microdados_transacao_cartao + - name: tg_transacao description: "Microdados das transações de cartão. Cada registro é uma transação." columns: - name: tipo_registro From 1c7355b125625f8ab97b01452730b61bce7114ff Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Fri, 16 Jun 2023 16:45:43 -0300 Subject: [PATCH 06/28] update tg_transacao --- models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index 9a430203..cc8ef305 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -16,7 +16,7 @@ SELECT SAFE_CAST(valor_tarifa/100 AS FLOAT64) AS valor_tarifa, SAFE_CAST(valor_tarifa_anterior/100 AS FLOAT64) AS valor_tarifa_anterior, SAFE_CAST(valor_debitado/100 AS FLOAT64) AS valor_debitado, - SAFE_CAST(SAFE_CAST(diferenca_valor_debitado AS INT64)/100 AS FLOAT64) AS diferenca_valor_debitado, + SAFE_CAST(COALESCE(SAFE_CAST(diferenca_valor_debitado AS INT64)/100, 0) AS FLOAT64) AS diferenca_valor_debitado, SAFE_CAST(SAFE_CAST(valor_promo_desconto AS INT64)/100 AS FLOAT64) AS valor_promo_desconto, SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS valor_acumulado, SAFE_CAST(origin_file AS STRING) AS arquivo_origem, @@ -30,7 +30,9 @@ SELECT FROM {{var('tg_microdados_transacao_cartao_staging')}} WHERE - (ano = 2022 OR ano = 2023) -- Apenas dados de 2022 e 2023 + (ano BETWEEN 2022 AND 2023) -- Apenas dados de 2022 e 2023 AND mes >= 1 - AND dia = 1 - AND status = 0 -- Apenas transações com sucesso \ No newline at end of file + AND dia >= 1 + AND status = 0 -- Apenas transações com sucesso + AND (emissor_aplicacao BETWEEN 1 AND 15) + AND (aplicacao BETWEEN 0 AND 1023) \ No newline at end of file From e5968ab53a9d6615a235ae64e3c857e768269e23 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Fri, 16 Jun 2023 17:28:51 -0300 Subject: [PATCH 07/28] change variable name --- dbt_project.yml | 2 +- models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dbt_project.yml b/dbt_project.yml index 26ec4112..53959d1f 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -132,7 +132,7 @@ vars: ### TG #### - tg_microdados_transacao_cartao_staging: "`rj-smtr-staging.br_rj_riodejaneiro_onibus_tg.card_transactions`" + tg_transacao_staging: "`rj-smtr-staging.br_rj_riodejaneiro_onibus_tg.card_transactions`" models: +persist_docs: diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index cc8ef305..b689db41 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -28,7 +28,7 @@ SELECT SAFE_CAST(mes AS INT64) AS mes, SAFE_CAST(dia AS INT64) AS dia FROM - {{var('tg_microdados_transacao_cartao_staging')}} + {{var('tg_transacao_staging')}} WHERE (ano BETWEEN 2022 AND 2023) -- Apenas dados de 2022 e 2023 AND mes >= 1 From 7adcdb0eef290e6e4c425dbfa4d902ce0783fe5b Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Tue, 20 Jun 2023 01:39:16 -0300 Subject: [PATCH 08/28] update dicionario --- dbt_project.yml | 1 + models/br_rj_riodejaneiro_onibus_tg/schema.yaml | 15 ++++++++++++++- .../tg_dicionario.sql | 12 ++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 models/br_rj_riodejaneiro_onibus_tg/tg_dicionario.sql diff --git a/dbt_project.yml b/dbt_project.yml index 53959d1f..644cf902 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -133,6 +133,7 @@ vars: ### TG #### tg_transacao_staging: "`rj-smtr-staging.br_rj_riodejaneiro_onibus_tg.card_transactions`" + tg_dicionario_staging: "`rj-smtr-staging.br_rj_riodejaneiro_onibus_tg.dicionario`" models: +persist_docs: diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index 9a83a363..fcb2fc21 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -51,4 +51,17 @@ models: - name: mes description: "Mês da transação (partição)" - name: dia - description: "Dia da transação (partição)" \ No newline at end of file + description: "Dia da transação (partição)" + - name: dicionario + description: "Dicionário de dados" + columns: + - name: chave + description: "Chave" + - name: cobertura_temporal + description: "Cobertura temporal" + - name: id_tabela + description: "Nome da tabela" + - name: nome_coluna + description: "Nome da coluna" + - name: valor + description: "Valor" \ No newline at end of file diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_dicionario.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_dicionario.sql new file mode 100644 index 00000000..87143371 --- /dev/null +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_dicionario.sql @@ -0,0 +1,12 @@ +{{ + config(alias='dicionario') +}} + +SELECT + SAFE_CAST(chave AS STRING) AS chave, + SAFE_CAST(cobertura_temporal AS STRING) AS cobertura_temporal, + SAFE_CAST(id_tabela AS STRING) AS id_tabela, + SAFE_CAST(nome_coluna AS STRING) AS nome_coluna, + SAFE_CAST(valor AS STRING) AS valor +FROM + {{var('tg_dicionario_staging')}} \ No newline at end of file From 1c1cf872fcbbdf12d477ecf735d87765bba062d0 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Tue, 20 Jun 2023 20:54:40 -0300 Subject: [PATCH 09/28] update tg_transacao to incremental --- .../tg_transacao.sql | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index b689db41..e58ce41d 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -1,5 +1,10 @@ {{ - config(alias='transacao') + config( + alias="transacao", + materialized="incremental", + partition_by={"field": "data", "data_type": "date", "granularity": "day"}, + incremental_strategy="insert_overwrite", + ) }} SELECT @@ -24,9 +29,7 @@ SELECT SAFE_CAST(file_date AS STRING) AS data_arquivo_origem, SAFE_CAST(codigo_empresa AS INT64) AS codigo_empresa, SAFE_CAST(uid AS STRING) AS id_cartao, - SAFE_CAST(ano AS INT64) AS ano, - SAFE_CAST(mes AS INT64) AS mes, - SAFE_CAST(dia AS INT64) AS dia + SAFE_CAST(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY) AS DATE) AS data FROM {{var('tg_transacao_staging')}} WHERE @@ -35,4 +38,25 @@ WHERE AND dia >= 1 AND status = 0 -- Apenas transações com sucesso AND (emissor_aplicacao BETWEEN 1 AND 15) - AND (aplicacao BETWEEN 0 AND 1023) \ No newline at end of file + AND (aplicacao BETWEEN 0 AND 1023) + AND dia <= EXTRACT(DAY FROM DATE("{{ var("date_range_end") }}")) + AND mes <= EXTRACT(MONTH FROM DATE("{{ var("date_range_end") }}")) + AND ano <= EXTRACT(YEAR FROM DATE("{{ var("date_range_end") }}")) + + {% if is_incremental() %} + + {% if var("date_range_start") == "None" %} + + {% set date_range_start = run_query("SELECT gr FROM (SELECT IF(MAX(data) > DATE('" ~ var("date_range_end") ~ "'), DATE('" ~ var("date_range_end") ~ "'), MAX(data)) AS gr FROM " ~ this ~ ")").columns[0].values()[0] %} + + {% else %} + + {% set date_range_start = var("date_range_start") %} + + {% endif %} + + AND dia >= EXTRACT(DAY FROM DATE("{{ date_range_start }}")) + AND mes >= EXTRACT(MONTH FROM DATE("{{ date_range_start }}")) + AND ano >= EXTRACT(YEAR FROM DATE("{{ date_range_start }}")) + + {% endif %} \ No newline at end of file From 9526e88be26a47495f6e28bdf253b55f722d6e33 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Tue, 20 Jun 2023 20:54:54 -0300 Subject: [PATCH 10/28] update schem --- .../br_rj_riodejaneiro_onibus_tg/schema.yaml | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index fcb2fc21..7a9b7916 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -11,7 +11,7 @@ models: - name: timestamp_transacao description: "Timestamp da transação em GMT-3" - name: numero_aplicacao - description: "Número do aplicação (Vide anexo 'Aplicações')" + description: "Número do aplicação" - name: sequencial_transacao description: "Número sequencial da transação no veículo naquele dia" - name: valor_tarifa @@ -21,11 +21,11 @@ models: - name: valor_debitado description: "Valor debitado na viagem atual (R$)" - name: status - description: "Estado da transação, indicando falha ou sucesso (0 - Sucesso, 1 - Falha, 2 - Cartão rejeitado)" + description: "Estado da transação, indicando falha ou sucesso" - name: id_veiculo description: "Número do veículo configurado no equipamento (apenas número)" - name: tipo_embarque - description: "Tipo de embarque atual, indica se é integração ou não (0 - Embarque normal, 1 - Integração)" + description: "Tipo de embarque atual, indica se é integração ou não" - name: diferenca_valor_debitado description: "Diferença do valor debitado na transação (R$)" - name: valor_promo_desconto @@ -33,9 +33,9 @@ models: - name: valor_acumulado description: "Soma do valor total pago em uma integração (R$)" - name: tipo_debito - description: "Tipo de débito no cartão (0 - Full fare, 1 - Promotional Fare, 2 - Discount Applied, 3 - BU Fare, 4 - BU-MUN Fare, 5 - BUCS, 6 - Prouni)" + description: "Tipo de débito no cartão" - name: mensagem_debito - description: "Mensagem de estado do débito no cartão (0 - Normal, 161 - Validation Without Finger, 190 - Passback BU, 191 - Limite por dia BU atingido, 192 - Créditos expirados para uso BU, 193 - BU desabilitado)" + description: "Mensagem de estado do débito no cartão" - name: arquivo_origem description: "Nome do arquivo txt de origem do registro: TG[Código da Empresa]_[id_veiculo]_[Número do Validador]_[Número de Controle Sequencial]_[Código da Empresa]_[Timestamp de geração do arquivo]_[Versão do Validador (Software) - XX.XX]" - name: garagem @@ -46,13 +46,9 @@ models: description: "Código da empresa que opera o veículo de origem da transação" - name: id_cartao description: "Número único criptografado do cartão RioCard" - - name: ano - description: "Ano da transação (partição)" - - name: mes - description: "Mês da transação (partição)" - - name: dia - description: "Dia da transação (partição)" - - name: dicionario + - name: data + description: "Data da transação (partição)" + - name: tg_dicionario description: "Dicionário de dados" columns: - name: chave From 09a143c835747de59d6cdfdceb38aad06ed99202 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Wed, 21 Jun 2023 14:14:15 -0300 Subject: [PATCH 11/28] update schema --- .../br_rj_riodejaneiro_onibus_tg/schema.yaml | 54 +++++++------------ 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index 7a9b7916..c90fa7e6 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -4,50 +4,36 @@ models: - name: tg_transacao description: "Microdados das transações de cartão. Cada registro é uma transação." columns: - - name: tipo_registro - description: "Tipo de registro de acordo com a especificação TG/PRODATA (Valor Fixo: 002)" - - name: versao_registro - description: "Versão deste registro" + - name: data + description: "Data da transação (partição)" + - name: id_empresa + description: "Código da empresa que opera o veículo de origem da transação" + - name: id_veiculo + description: "Número do veículo configurado no equipamento (apenas número)" + - name: id_cartao + description: "Número único criptografado do cartão RioCard" + - name: id_tipo_cartao + description: "Número do aplicação, indica qual o tipo do cartão (ex: gratuidade, vale transporte). Categorias podem ser encontradas na tabela dicionário." + - name: sequencial_transacao_veiculo + description: "Número sequencial da transação no veículo naquele dia" - name: timestamp_transacao description: "Timestamp da transação em GMT-3" - - name: numero_aplicacao - description: "Número do aplicação" - - name: sequencial_transacao - description: "Número sequencial da transação no veículo naquele dia" + - name: tipo_embarque + description: "Tipo de embarque atual, indica se é integração ou não" + - name: tipo_debito + description: "Tipo de débito no cartão, indica o tipo de tarifa executada (ex: cheia, com desconto). Categorias podem ser encontradas na tabela dicionário." + - name: mensagem_debito + description: "Mensagem de estado do débito no cartão. Categorias podem ser encontradas na tabela dicionário." - name: valor_tarifa description: "Valor da tarifa configurado no equipamento (R$)" - name: valor_tarifa_anterior description: "Valor da tarifa anterior da viagem anterior (R$)" - name: valor_debitado description: "Valor debitado na viagem atual (R$)" - - name: status - description: "Estado da transação, indicando falha ou sucesso" - - name: id_veiculo - description: "Número do veículo configurado no equipamento (apenas número)" - - name: tipo_embarque - description: "Tipo de embarque atual, indica se é integração ou não" - - name: diferenca_valor_debitado - description: "Diferença do valor debitado na transação (R$)" - name: valor_promo_desconto description: "Valor promocional ou de desconto da tarifa (R$)" - - name: valor_acumulado - description: "Soma do valor total pago em uma integração (R$)" - - name: tipo_debito - description: "Tipo de débito no cartão" - - name: mensagem_debito - description: "Mensagem de estado do débito no cartão" - - name: arquivo_origem - description: "Nome do arquivo txt de origem do registro: TG[Código da Empresa]_[id_veiculo]_[Número do Validador]_[Número de Controle Sequencial]_[Código da Empresa]_[Timestamp de geração do arquivo]_[Versão do Validador (Software) - XX.XX]" - - name: garagem - description: "Garagem onde o arquivo de origem foi descarregado" - - name: data_arquivo_origem - description: "Data de criação do arquivo binário de origem extraída do nome do arquivo" - - name: codigo_empresa - description: "Código da empresa que opera o veículo de origem da transação" - - name: id_cartao - description: "Número único criptografado do cartão RioCard" - - name: data - description: "Data da transação (partição)" + - name: valor_total_integracao + description: "Soma do valor total pago em uma integração (R$)" - name: tg_dicionario description: "Dicionário de dados" columns: From aa0893d2fafcfb9392234a692d9689d70748e41d Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Wed, 21 Jun 2023 14:14:39 -0300 Subject: [PATCH 12/28] update dicionario to table --- models/br_rj_riodejaneiro_onibus_tg/tg_dicionario.sql | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_dicionario.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_dicionario.sql index 87143371..83f4354b 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_dicionario.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_dicionario.sql @@ -1,5 +1,8 @@ {{ - config(alias='dicionario') + config( + alias="dicionario", + materialized="table", + ) }} SELECT From fec8ca605c80b60a8978b0b5055a1fd6d25c0b9f Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Wed, 21 Jun 2023 14:14:59 -0300 Subject: [PATCH 13/28] update transacao structure --- .../tg_transacao.sql | 27 +++++++------------ 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index e58ce41d..e6b6ed53 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -8,28 +8,21 @@ }} SELECT - SAFE_CAST(tipo_registro AS STRING) AS tipo_registro, - SAFE_CAST(versao_registro AS STRING) AS versao_registro, - SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS timestamp_transacao, - SAFE_CAST(emissor_aplicacao || "_" || aplicacao AS STRING) AS numero_aplicacao, - SAFE_CAST(tsn AS INT64) AS sequencial_transacao, - SAFE_CAST(status AS INT64) AS status, + SAFE_CAST(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY) AS DATE) AS data, + SAFE_CAST(codigo_empresa AS STRING) AS id_empresa, SAFE_CAST(num_onibus AS STRING) AS id_veiculo, - SAFE_CAST(tipo_embarque AS INT64) AS tipo_embarque, - SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS INT64) AS tipo_debito, - SAFE_CAST(SAFE_CAST(mensagem_debito AS FLOAT64) AS INT64) AS mensagem_debito, + SAFE_CAST(uid AS STRING) AS id_cartao, + SAFE_CAST(emissor_aplicacao || "_" || aplicacao AS STRING) AS id_tipo_cartao, + SAFE_CAST(tsn AS STRING) AS sequencial_transacao_veiculo, + SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS timestamp_transacao, + SAFE_CAST(tipo_embarque AS STRING) AS tipo_embarque, + SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS STRING) AS tipo_debito, + SAFE_CAST(SAFE_CAST(mensagem_debito AS FLOAT64) AS STRING) AS mensagem_debito, SAFE_CAST(valor_tarifa/100 AS FLOAT64) AS valor_tarifa, SAFE_CAST(valor_tarifa_anterior/100 AS FLOAT64) AS valor_tarifa_anterior, SAFE_CAST(valor_debitado/100 AS FLOAT64) AS valor_debitado, - SAFE_CAST(COALESCE(SAFE_CAST(diferenca_valor_debitado AS INT64)/100, 0) AS FLOAT64) AS diferenca_valor_debitado, SAFE_CAST(SAFE_CAST(valor_promo_desconto AS INT64)/100 AS FLOAT64) AS valor_promo_desconto, - SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS valor_acumulado, - SAFE_CAST(origin_file AS STRING) AS arquivo_origem, - SAFE_CAST(garagem AS STRING) AS garagem, - SAFE_CAST(file_date AS STRING) AS data_arquivo_origem, - SAFE_CAST(codigo_empresa AS INT64) AS codigo_empresa, - SAFE_CAST(uid AS STRING) AS id_cartao, - SAFE_CAST(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY) AS DATE) AS data + SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS valor_total_integracao FROM {{var('tg_transacao_staging')}} WHERE From 6b7921bbad25d5ad7177b7aa9b30a3cae42dc5fb Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Wed, 21 Jun 2023 21:16:29 -0300 Subject: [PATCH 14/28] update to sequencial_transacao_cartao --- models/br_rj_riodejaneiro_onibus_tg/schema.yaml | 4 ++-- models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index c90fa7e6..aa3bbebf 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -14,8 +14,8 @@ models: description: "Número único criptografado do cartão RioCard" - name: id_tipo_cartao description: "Número do aplicação, indica qual o tipo do cartão (ex: gratuidade, vale transporte). Categorias podem ser encontradas na tabela dicionário." - - name: sequencial_transacao_veiculo - description: "Número sequencial da transação no veículo naquele dia" + - name: sequencial_transacao_cartao + description: "Número sequencial histórico de transações do cartão" - name: timestamp_transacao description: "Timestamp da transação em GMT-3" - name: tipo_embarque diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index e6b6ed53..ad47ea06 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -13,7 +13,7 @@ SELECT SAFE_CAST(num_onibus AS STRING) AS id_veiculo, SAFE_CAST(uid AS STRING) AS id_cartao, SAFE_CAST(emissor_aplicacao || "_" || aplicacao AS STRING) AS id_tipo_cartao, - SAFE_CAST(tsn AS STRING) AS sequencial_transacao_veiculo, + SAFE_CAST(tsn AS STRING) AS sequencial_transacao_cartao, SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS timestamp_transacao, SAFE_CAST(tipo_embarque AS STRING) AS tipo_embarque, SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS STRING) AS tipo_debito, From e8a814c2d92a01d97f998aef7a75cab23888a9c7 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Thu, 22 Jun 2023 00:11:56 -0300 Subject: [PATCH 15/28] add package dbt-labs/dbt_utils --- packages.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 packages.yml diff --git a/packages.yml b/packages.yml new file mode 100644 index 00000000..83f1e8bb --- /dev/null +++ b/packages.yml @@ -0,0 +1,3 @@ +packages: + - package: dbt-labs/dbt_utils + version: 0.7.6 \ No newline at end of file From ea23296ea065fe0a533b67bc53fa7c3310fde486 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Thu, 22 Jun 2023 00:12:14 -0300 Subject: [PATCH 16/28] replace default get_where_subquery function --- macros/get_where_subquery.sql | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 macros/get_where_subquery.sql diff --git a/macros/get_where_subquery.sql b/macros/get_where_subquery.sql new file mode 100644 index 00000000..7af21924 --- /dev/null +++ b/macros/get_where_subquery.sql @@ -0,0 +1,53 @@ +{% macro get_where_subquery(relation) -%} + {# This macro returns a subquery that filters the relation based on the where clause #} + {# It also replaces the __day_month_year_partition__ and __date_partition__ macros #} + {# with the correct where clause #} + + {% set where = config.get('where', '') %} + + {# Partição por dia, mês e ano #} + + {% if "__day_month_year_partition__" in where %} + + {% if var("date_range_start") == "None" %} + + {% set date_range_start = run_query("SELECT gr FROM (SELECT IF(MAX(data) > DATE('" ~ var("date_range_end") ~ "'), DATE('" ~ var("date_range_end") ~ "'), MAX(data)) AS gr FROM " ~ this ~ ")").columns[0].values()[0] %} + + {% else %} + + {% set date_range_start = var("date_range_start") %} + + {% endif %} + + {% set where_cond = "dia <= EXTRACT(DAY FROM DATE('"~ var("date_range_end") ~"')) AND mes <= EXTRACT(MONTH FROM DATE('"~ var("date_range_end") ~"')) AND ano <= EXTRACT(YEAR FROM DATE('"~ var("date_range_end") ~"')) AND dia >= EXTRACT(DAY FROM DATE('"~ date_range_start ~"')) AND mes >= EXTRACT(MONTH FROM DATE('"~ date_range_start ~"')) AND ano >= EXTRACT(YEAR FROM DATE('"~ date_range_start ~"'))" %} + + {% set where = where | replace("__day_month_year_partition__", where_cond) %} + {% endif %} + + {# Partição por data #} + + {% if "__date_partition__" in where %} + + {% if var("date_range_start") == "None" %} + + {% set date_range_start = run_query("SELECT gr FROM (SELECT IF(MAX(data) > DATE('" ~ var("date_range_end") ~ "'), DATE('" ~ var("date_range_end") ~ "'), MAX(data)) AS gr FROM " ~ this ~ ")").columns[0].values()[0] %} + + {% else %} + + {% set date_range_start = var("date_range_start") %} + + {% endif %} + + {% set where_cond = "data BETWEEN DATE('"~ date_range_start ~"') AND DATE('"~ var("date_range_end") ~"')" %} + + {% set where = where | replace("__date_partition__", where_cond) %} + {% endif %} + {% if where %} + {%- set filtered -%} + (select * from {{ relation }} where {{ where }}) dbt_subquery + {%- endset -%} + {% do return(filtered) %} + {%- else -%} + {% do return(relation) %} + {%- endif -%} +{%- endmacro %} \ No newline at end of file From 0aeebfe5b1909b035d82e6f2dc43f0ca5436316f Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Thu, 22 Jun 2023 00:12:28 -0300 Subject: [PATCH 17/28] add tests to schema --- models/br_rj_riodejaneiro_onibus_tg/schema.yaml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index aa3bbebf..ef846ebb 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -20,6 +20,11 @@ models: description: "Timestamp da transação em GMT-3" - name: tipo_embarque description: "Tipo de embarque atual, indica se é integração ou não" + tests: + - accepted_values: + values: ['0', '1'] + config: + where: "__date_partition__" - name: tipo_debito description: "Tipo de débito no cartão, indica o tipo de tarifa executada (ex: cheia, com desconto). Categorias podem ser encontradas na tabela dicionário." - name: mensagem_debito @@ -33,7 +38,14 @@ models: - name: valor_promo_desconto description: "Valor promocional ou de desconto da tarifa (R$)" - name: valor_total_integracao - description: "Soma do valor total pago em uma integração (R$)" + description: "Soma do valor total pago em uma integração (R$)" + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - id_cartao + - timestamp_transacao + config: + where: "__date_partition__" - name: tg_dicionario description: "Dicionário de dados" columns: From 49ffa182725b9987a1d5b6fb4214a2d467cf90b1 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Thu, 22 Jun 2023 11:49:59 -0300 Subject: [PATCH 18/28] update schema --- models/br_rj_riodejaneiro_onibus_tg/schema.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index ef846ebb..0948d482 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -12,7 +12,7 @@ models: description: "Número do veículo configurado no equipamento (apenas número)" - name: id_cartao description: "Número único criptografado do cartão RioCard" - - name: id_tipo_cartao + - name: tipo_cartao description: "Número do aplicação, indica qual o tipo do cartão (ex: gratuidade, vale transporte). Categorias podem ser encontradas na tabela dicionário." - name: sequencial_transacao_cartao description: "Número sequencial histórico de transações do cartão" @@ -29,15 +29,15 @@ models: description: "Tipo de débito no cartão, indica o tipo de tarifa executada (ex: cheia, com desconto). Categorias podem ser encontradas na tabela dicionário." - name: mensagem_debito description: "Mensagem de estado do débito no cartão. Categorias podem ser encontradas na tabela dicionário." - - name: valor_tarifa + - name: tarifa description: "Valor da tarifa configurado no equipamento (R$)" - - name: valor_tarifa_anterior + - name: tarifa_anterior description: "Valor da tarifa anterior da viagem anterior (R$)" - - name: valor_debitado + - name: debito description: "Valor debitado na viagem atual (R$)" - - name: valor_promo_desconto + - name: desconto description: "Valor promocional ou de desconto da tarifa (R$)" - - name: valor_total_integracao + - name: total_integracao description: "Soma do valor total pago em uma integração (R$)" tests: - dbt_utils.unique_combination_of_columns: From 522f63787bf961eb0bb36c872ec10d70630a5395 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Thu, 22 Jun 2023 11:50:13 -0300 Subject: [PATCH 19/28] update tg_transacao columns names --- models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index ad47ea06..ce3e270e 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -12,17 +12,17 @@ SELECT SAFE_CAST(codigo_empresa AS STRING) AS id_empresa, SAFE_CAST(num_onibus AS STRING) AS id_veiculo, SAFE_CAST(uid AS STRING) AS id_cartao, - SAFE_CAST(emissor_aplicacao || "_" || aplicacao AS STRING) AS id_tipo_cartao, + SAFE_CAST(emissor_aplicacao || "_" || aplicacao AS STRING) AS tipo_cartao, SAFE_CAST(tsn AS STRING) AS sequencial_transacao_cartao, SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS timestamp_transacao, SAFE_CAST(tipo_embarque AS STRING) AS tipo_embarque, SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS STRING) AS tipo_debito, SAFE_CAST(SAFE_CAST(mensagem_debito AS FLOAT64) AS STRING) AS mensagem_debito, - SAFE_CAST(valor_tarifa/100 AS FLOAT64) AS valor_tarifa, - SAFE_CAST(valor_tarifa_anterior/100 AS FLOAT64) AS valor_tarifa_anterior, - SAFE_CAST(valor_debitado/100 AS FLOAT64) AS valor_debitado, - SAFE_CAST(SAFE_CAST(valor_promo_desconto AS INT64)/100 AS FLOAT64) AS valor_promo_desconto, - SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS valor_total_integracao + SAFE_CAST(valor_tarifa/100 AS FLOAT64) AS tarifa, + SAFE_CAST(valor_tarifa_anterior/100 AS FLOAT64) AS tarifa_anterior, + SAFE_CAST(valor_debitado/100 AS FLOAT64) AS debito, + SAFE_CAST(SAFE_CAST(valor_promo_desconto AS INT64)/100 AS FLOAT64) AS desconto, + SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS total_integracao FROM {{var('tg_transacao_staging')}} WHERE From 6dfe2a0491f27fdda185dfc61c0d6565bfd0b9ed Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Fri, 23 Jun 2023 06:51:48 -0300 Subject: [PATCH 20/28] update tg_transacao model to improve uniqueness --- .../tg_transacao.sql | 124 ++++++++++++------ 1 file changed, 87 insertions(+), 37 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index ce3e270e..4769199f 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -7,49 +7,99 @@ ) }} -SELECT - SAFE_CAST(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY) AS DATE) AS data, - SAFE_CAST(codigo_empresa AS STRING) AS id_empresa, - SAFE_CAST(num_onibus AS STRING) AS id_veiculo, - SAFE_CAST(uid AS STRING) AS id_cartao, - SAFE_CAST(emissor_aplicacao || "_" || aplicacao AS STRING) AS tipo_cartao, - SAFE_CAST(tsn AS STRING) AS sequencial_transacao_cartao, - SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS timestamp_transacao, - SAFE_CAST(tipo_embarque AS STRING) AS tipo_embarque, - SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS STRING) AS tipo_debito, - SAFE_CAST(SAFE_CAST(mensagem_debito AS FLOAT64) AS STRING) AS mensagem_debito, - SAFE_CAST(valor_tarifa/100 AS FLOAT64) AS tarifa, - SAFE_CAST(valor_tarifa_anterior/100 AS FLOAT64) AS tarifa_anterior, - SAFE_CAST(valor_debitado/100 AS FLOAT64) AS debito, - SAFE_CAST(SAFE_CAST(valor_promo_desconto AS INT64)/100 AS FLOAT64) AS desconto, - SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS total_integracao -FROM - {{var('tg_transacao_staging')}} -WHERE - (ano BETWEEN 2022 AND 2023) -- Apenas dados de 2022 e 2023 - AND mes >= 1 - AND dia >= 1 - AND status = 0 -- Apenas transações com sucesso - AND (emissor_aplicacao BETWEEN 1 AND 15) - AND (aplicacao BETWEEN 0 AND 1023) - AND dia <= EXTRACT(DAY FROM DATE("{{ var("date_range_end") }}")) - AND mes <= EXTRACT(MONTH FROM DATE("{{ var("date_range_end") }}")) - AND ano <= EXTRACT(YEAR FROM DATE("{{ var("date_range_end") }}")) - - {% if is_incremental() %} +WITH + tg_all_transactions AS ( + SELECT + * EXCEPT(secao_entrada, + secao_saida), + SAFE_CAST(secao_entrada AS STRING) AS secao_entrada, + SAFE_CAST(secao_saida AS STRING) AS secao_saida + FROM + `rj-smtr-staging.br_rj_riodejaneiro_onibus_tg.card_transactions` + WHERE + (ano BETWEEN 2022 AND 2023) -- Apenas dados de 2022 e 2023 + AND mes >= 1 + AND dia >= 1 + AND status = 0 -- Apenas transações com sucesso + AND (emissor_aplicacao BETWEEN 1 AND 15) + AND (aplicacao BETWEEN 0 AND 1023) + AND dia <= EXTRACT(DAY FROM DATE("{{ var("date_range_end") }}")) + AND mes <= EXTRACT(MONTH FROM DATE("{{ var("date_range_end") }}")) + AND ano <= EXTRACT(YEAR FROM DATE("{{ var("date_range_end") }}")) - {% if var("date_range_start") == "None" %} + {% if var("date_range_start") == "None" %} - {% set date_range_start = run_query("SELECT gr FROM (SELECT IF(MAX(data) > DATE('" ~ var("date_range_end") ~ "'), DATE('" ~ var("date_range_end") ~ "'), MAX(data)) AS gr FROM " ~ this ~ ")").columns[0].values()[0] %} + {% set date_range_start = run_query("SELECT gr FROM (SELECT IF(MAX(data) > DATE('" ~ var("date_range_end") ~ "'), DATE('" ~ var("date_range_end") ~ "'), MAX(data)) AS gr FROM " ~ this ~ ")").columns[0].values()[0] %} - {% else %} + {% else %} - {% set date_range_start = var("date_range_start") %} + {% set date_range_start = var("date_range_start") %} - {% endif %} + {% endif %} AND dia >= EXTRACT(DAY FROM DATE("{{ date_range_start }}")) AND mes >= EXTRACT(MONTH FROM DATE("{{ date_range_start }}")) AND ano >= EXTRACT(YEAR FROM DATE("{{ date_range_start }}")) - - {% endif %} \ No newline at end of file + ), + tg_rn_transactions AS ( + SELECT + *, + ROW_NUMBER() OVER (PARTITION BY tipo_registro, versao_registro, DATA, hora, numero_interno, aplicacao, emissor_aplicacao, tsn, valor_tarifa, valor_tarifa_anterior, valor_debitado, status, num_onibus, mot_tsp, mot_codigo_pro_data, mot_matricula, cob_tsp, cob_codigo_pro_data, cob_matricula, tipo_embarque, serial_number_sam_val, l_sequence_number, assinatura, diferenca_valor_debitado, secao_entrada, secao_saida, avl_status, provider_id, ext_use_ctr, ext_val_date, valor_promo_desconto, valor_acumulado, tipo_debito, mensagem_debito, tp_credit_purse_a, tp_credit_purse_b, csn_purse_a, csn_purse_b, origin_file, file_date, codigo_empresa, tsn_date, uid, ano, mes, dia ) AS rn + FROM + tg_all_transactions ), + tg_filtered_transactions AS ( + SELECT + SAFE_CAST(DATE_ADD(DATE '2002-12-31', INTERVAL DATA DAY) AS DATE) AS DATA, + SAFE_CAST(codigo_empresa AS STRING) AS id_empresa, + SAFE_CAST(num_onibus AS STRING) AS id_veiculo, + SAFE_CAST(uid AS STRING) AS id_cartao, + SAFE_CAST(emissor_aplicacao || "_" || aplicacao AS STRING) AS tipo_cartao, + SAFE_CAST(tsn AS STRING) AS sequencial_transacao_cartao, + SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL DATA DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS datetime, + SAFE_CAST(tipo_embarque AS STRING) AS tipo_embarque, + SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS STRING) AS tipo_debito, + SAFE_CAST(SAFE_CAST(mensagem_debito AS FLOAT64) AS STRING) AS mensagem_debito, + SAFE_CAST(valor_tarifa/100 AS FLOAT64) AS tarifa, + SAFE_CAST(valor_tarifa_anterior/100 AS FLOAT64) AS tarifa_anterior, + SAFE_CAST(valor_debitado/100 AS FLOAT64) AS debito, + SAFE_CAST(SAFE_CAST(valor_promo_desconto AS INT64)/100 AS FLOAT64) AS desconto, + SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS total_integracao, + SAFE_CAST(garagem AS STRING) AS garagem + FROM + tg_rn_transactions + WHERE + rn = 1 ) +-- TODO: Filtrar apenas registros que tenham divergência exclusivamente na coluna valor_debitado para realizar a soma +SELECT + DATA, + id_empresa, + id_veiculo, + id_cartao, + tipo_cartao, + sequencial_transacao_cartao, + datetime, + tipo_embarque, + tipo_debito, + mensagem_debito, + tarifa, + tarifa_anterior, + SUM(debito) AS debito, + desconto, + total_integracao +FROM + tg_filtered_transactions +GROUP BY + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 14, + 15 From 4e026477e2abc539a6cc35f036913323bf298b13 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Fri, 23 Jun 2023 06:52:05 -0300 Subject: [PATCH 21/28] update tests in tg --- .../br_rj_riodejaneiro_onibus_tg/schema.yaml | 56 +++++++++++++++++-- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index 0948d482..20db3a12 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -13,37 +13,81 @@ models: - name: id_cartao description: "Número único criptografado do cartão RioCard" - name: tipo_cartao - description: "Número do aplicação, indica qual o tipo do cartão (ex: gratuidade, vale transporte). Categorias podem ser encontradas na tabela dicionário." + description: "Emissor e número do aplicação, indica qual o tipo do cartão (ex: gratuidade, vale transporte). Categorias podem ser encontradas na tabela dicionário." + tests: + - accepted_values_dict: + ref_model: tg_dicionario + table_name: transacao + config: + where: "__date_partition__" - name: sequencial_transacao_cartao description: "Número sequencial histórico de transações do cartão" - - name: timestamp_transacao - description: "Timestamp da transação em GMT-3" + - name: datetime + description: "Datetime da transação em GMT-3" - name: tipo_embarque description: "Tipo de embarque atual, indica se é integração ou não" tests: - - accepted_values: - values: ['0', '1'] + - accepted_values_dict: + ref_model: tg_dicionario + table_name: transacao config: where: "__date_partition__" - name: tipo_debito description: "Tipo de débito no cartão, indica o tipo de tarifa executada (ex: cheia, com desconto). Categorias podem ser encontradas na tabela dicionário." + tests: + - accepted_values_dict: + ref_model: tg_dicionario + table_name: transacao + config: + where: "__date_partition__" - name: mensagem_debito description: "Mensagem de estado do débito no cartão. Categorias podem ser encontradas na tabela dicionário." + tests: + - accepted_values_dict: + ref_model: tg_dicionario + table_name: transacao + config: + where: "__date_partition__" - name: tarifa description: "Valor da tarifa configurado no equipamento (R$)" + tests: + - dbt_utils.accepted_range: + min_value: 4.05 + max_value: 17.00 + where: "__date_partition__" - name: tarifa_anterior description: "Valor da tarifa anterior da viagem anterior (R$)" + tests: + - dbt_utils.accepted_range: + min_value: 0 + max_value: 17.00 + where: "__date_partition__ AND tarifa_anterior IS NOT NULL" - name: debito description: "Valor debitado na viagem atual (R$)" + tests: + - dbt_utils.accepted_range: + min_value: 0 + max_value: 17.00 + where: "__date_partition__" - name: desconto description: "Valor promocional ou de desconto da tarifa (R$)" + tests: + - dbt_utils.accepted_range: + min_value: 0 + max_value: 17.00 + where: "__date_partition__ AND desconto IS NOT NULL" - name: total_integracao description: "Soma do valor total pago em uma integração (R$)" + tests: + - dbt_utils.accepted_range: + min_value: 0 + max_value: 17.00 + where: "__date_partition__ AND total_integracao IS NOT NULL" tests: - dbt_utils.unique_combination_of_columns: combination_of_columns: - id_cartao - - timestamp_transacao + - datetime config: where: "__date_partition__" - name: tg_dicionario From 5e37b2e0380e850657c07a86d95d03745a181d01 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Fri, 23 Jun 2023 06:52:31 -0300 Subject: [PATCH 22/28] new test test_accepted_values_dict --- macros/test_accepted_values_dict.sql | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 macros/test_accepted_values_dict.sql diff --git a/macros/test_accepted_values_dict.sql b/macros/test_accepted_values_dict.sql new file mode 100644 index 00000000..02979b72 --- /dev/null +++ b/macros/test_accepted_values_dict.sql @@ -0,0 +1,30 @@ +{% test accepted_values_dict(model, column_name, ref_model, table_name) %} + +WITH + values_dict AS ( + SELECT + chave + FROM + {{ ref(ref_model) }} + WHERE + id_tabela = "{{ table_name }}" + AND nome_coluna = "{{ column_name }}" ), + all_values AS ( + SELECT + {{ column_name }} AS value_field, + COUNT(*) AS n_records + FROM {{ model }} + GROUP BY + {{ column_name }} ) +SELECT + * +FROM + all_values +WHERE + value_field NOT IN ( + SELECT + * + FROM + values_dict ) + +{% endtest %} \ No newline at end of file From 051725fa3f11a63d63bb47a5b96be303aa592595 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Wed, 28 Jun 2023 05:44:10 -0300 Subject: [PATCH 23/28] update tests in schema --- models/br_rj_riodejaneiro_onibus_tg/schema.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index 20db3a12..2642c920 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -53,35 +53,35 @@ models: tests: - dbt_utils.accepted_range: min_value: 4.05 - max_value: 17.00 + max_value: 19.95 where: "__date_partition__" - name: tarifa_anterior description: "Valor da tarifa anterior da viagem anterior (R$)" tests: - dbt_utils.accepted_range: min_value: 0 - max_value: 17.00 + max_value: 19.95 where: "__date_partition__ AND tarifa_anterior IS NOT NULL" - name: debito description: "Valor debitado na viagem atual (R$)" tests: - dbt_utils.accepted_range: min_value: 0 - max_value: 17.00 + max_value: 19.95 where: "__date_partition__" - name: desconto description: "Valor promocional ou de desconto da tarifa (R$)" tests: - dbt_utils.accepted_range: min_value: 0 - max_value: 17.00 + max_value: 19.95 where: "__date_partition__ AND desconto IS NOT NULL" - name: total_integracao description: "Soma do valor total pago em uma integração (R$)" tests: - dbt_utils.accepted_range: min_value: 0 - max_value: 17.00 + max_value: 19.95 where: "__date_partition__ AND total_integracao IS NOT NULL" tests: - dbt_utils.unique_combination_of_columns: From e72f6d86e151f99188556968097aa08173a73612 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Wed, 28 Jun 2023 05:44:22 -0300 Subject: [PATCH 24/28] update tg_transacao --- .../tg_transacao.sql | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index 4769199f..591f676d 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -41,12 +41,20 @@ WITH AND mes >= EXTRACT(MONTH FROM DATE("{{ date_range_start }}")) AND ano >= EXTRACT(YEAR FROM DATE("{{ date_range_start }}")) ), - tg_rn_transactions AS ( + tg_rn_garagem_transactions AS ( SELECT *, - ROW_NUMBER() OVER (PARTITION BY tipo_registro, versao_registro, DATA, hora, numero_interno, aplicacao, emissor_aplicacao, tsn, valor_tarifa, valor_tarifa_anterior, valor_debitado, status, num_onibus, mot_tsp, mot_codigo_pro_data, mot_matricula, cob_tsp, cob_codigo_pro_data, cob_matricula, tipo_embarque, serial_number_sam_val, l_sequence_number, assinatura, diferenca_valor_debitado, secao_entrada, secao_saida, avl_status, provider_id, ext_use_ctr, ext_val_date, valor_promo_desconto, valor_acumulado, tipo_debito, mensagem_debito, tp_credit_purse_a, tp_credit_purse_b, csn_purse_a, csn_purse_b, origin_file, file_date, codigo_empresa, tsn_date, uid, ano, mes, dia ) AS rn + ROW_NUMBER() OVER (PARTITION BY tipo_registro, versao_registro, DATA, hora, numero_interno, aplicacao, emissor_aplicacao, tsn, valor_tarifa, valor_tarifa_anterior, valor_debitado, status, num_onibus, mot_tsp, mot_codigo_pro_data, mot_matricula, cob_tsp, cob_codigo_pro_data, cob_matricula, tipo_embarque, serial_number_sam_val, l_sequence_number, assinatura, diferenca_valor_debitado, secao_entrada, secao_saida, avl_status, provider_id, ext_use_ctr, ext_val_date, valor_promo_desconto, valor_acumulado, tipo_debito, mensagem_debito, tp_credit_purse_a, tp_credit_purse_b, csn_purse_a, csn_purse_b, origin_file, file_date, codigo_empresa, tsn_date, uid, ano, mes, dia ) AS rn_garagem FROM tg_all_transactions ), + tg_rn_debito_transactions AS ( + SELECT + *, + ROW_NUMBER() OVER (PARTITION BY tipo_registro, versao_registro, DATA, hora, numero_interno, aplicacao, emissor_aplicacao, tsn, valor_tarifa, valor_tarifa_anterior, status, num_onibus, mot_tsp, mot_codigo_pro_data, mot_matricula, cob_tsp, cob_codigo_pro_data, cob_matricula, tipo_embarque, serial_number_sam_val, l_sequence_number, assinatura, diferenca_valor_debitado, secao_entrada, secao_saida, avl_status, provider_id, ext_use_ctr, ext_val_date, valor_promo_desconto, valor_acumulado, tipo_debito, mensagem_debito, tp_credit_purse_a, tp_credit_purse_b, csn_purse_a, csn_purse_b, origin_file, file_date, codigo_empresa, tsn_date, uid, ano, mes, dia ) AS rn_debito + FROM + tg_rn_garagem_transactions + WHERE + rn_garagem = 1), tg_filtered_transactions AS ( SELECT SAFE_CAST(DATE_ADD(DATE '2002-12-31', INTERVAL DATA DAY) AS DATE) AS DATA, @@ -66,10 +74,9 @@ WITH SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS total_integracao, SAFE_CAST(garagem AS STRING) AS garagem FROM - tg_rn_transactions + tg_rn_debito_transactions WHERE - rn = 1 ) --- TODO: Filtrar apenas registros que tenham divergência exclusivamente na coluna valor_debitado para realizar a soma + rn_debito = 1 ) SELECT DATA, id_empresa, From f0f12667abaa633f5b00bc46fa219a7d0c521121 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Wed, 28 Jun 2023 18:14:34 -0300 Subject: [PATCH 25/28] fix datetime params --- models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index 591f676d..e68e0acc 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -63,7 +63,7 @@ WITH SAFE_CAST(uid AS STRING) AS id_cartao, SAFE_CAST(emissor_aplicacao || "_" || aplicacao AS STRING) AS tipo_cartao, SAFE_CAST(tsn AS STRING) AS sequencial_transacao_cartao, - SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL DATA DAY)), INTERVAL hora SECOND), "America/Sao_Paulo") AS DATETIME) AS datetime, + SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL DATA DAY)), INTERVAL hora SECOND)) AS DATETIME) AS datetime, SAFE_CAST(tipo_embarque AS STRING) AS tipo_embarque, SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS STRING) AS tipo_debito, SAFE_CAST(SAFE_CAST(mensagem_debito AS FLOAT64) AS STRING) AS mensagem_debito, From 732c7aeebe2733db70fe086873be06ecc29e07c6 Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Wed, 12 Jul 2023 17:31:14 -0300 Subject: [PATCH 26/28] =?UTF-8?q?tg=5Ftransacao=20-=20deduplica=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20garagem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tg_transacao.sql | 148 ++++++++---------- 1 file changed, 67 insertions(+), 81 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index e68e0acc..a8a29cde 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -8,54 +8,7 @@ }} WITH - tg_all_transactions AS ( - SELECT - * EXCEPT(secao_entrada, - secao_saida), - SAFE_CAST(secao_entrada AS STRING) AS secao_entrada, - SAFE_CAST(secao_saida AS STRING) AS secao_saida - FROM - `rj-smtr-staging.br_rj_riodejaneiro_onibus_tg.card_transactions` - WHERE - (ano BETWEEN 2022 AND 2023) -- Apenas dados de 2022 e 2023 - AND mes >= 1 - AND dia >= 1 - AND status = 0 -- Apenas transações com sucesso - AND (emissor_aplicacao BETWEEN 1 AND 15) - AND (aplicacao BETWEEN 0 AND 1023) - AND dia <= EXTRACT(DAY FROM DATE("{{ var("date_range_end") }}")) - AND mes <= EXTRACT(MONTH FROM DATE("{{ var("date_range_end") }}")) - AND ano <= EXTRACT(YEAR FROM DATE("{{ var("date_range_end") }}")) - - {% if var("date_range_start") == "None" %} - - {% set date_range_start = run_query("SELECT gr FROM (SELECT IF(MAX(data) > DATE('" ~ var("date_range_end") ~ "'), DATE('" ~ var("date_range_end") ~ "'), MAX(data)) AS gr FROM " ~ this ~ ")").columns[0].values()[0] %} - - {% else %} - - {% set date_range_start = var("date_range_start") %} - - {% endif %} - - AND dia >= EXTRACT(DAY FROM DATE("{{ date_range_start }}")) - AND mes >= EXTRACT(MONTH FROM DATE("{{ date_range_start }}")) - AND ano >= EXTRACT(YEAR FROM DATE("{{ date_range_start }}")) - ), - tg_rn_garagem_transactions AS ( - SELECT - *, - ROW_NUMBER() OVER (PARTITION BY tipo_registro, versao_registro, DATA, hora, numero_interno, aplicacao, emissor_aplicacao, tsn, valor_tarifa, valor_tarifa_anterior, valor_debitado, status, num_onibus, mot_tsp, mot_codigo_pro_data, mot_matricula, cob_tsp, cob_codigo_pro_data, cob_matricula, tipo_embarque, serial_number_sam_val, l_sequence_number, assinatura, diferenca_valor_debitado, secao_entrada, secao_saida, avl_status, provider_id, ext_use_ctr, ext_val_date, valor_promo_desconto, valor_acumulado, tipo_debito, mensagem_debito, tp_credit_purse_a, tp_credit_purse_b, csn_purse_a, csn_purse_b, origin_file, file_date, codigo_empresa, tsn_date, uid, ano, mes, dia ) AS rn_garagem - FROM - tg_all_transactions ), - tg_rn_debito_transactions AS ( - SELECT - *, - ROW_NUMBER() OVER (PARTITION BY tipo_registro, versao_registro, DATA, hora, numero_interno, aplicacao, emissor_aplicacao, tsn, valor_tarifa, valor_tarifa_anterior, status, num_onibus, mot_tsp, mot_codigo_pro_data, mot_matricula, cob_tsp, cob_codigo_pro_data, cob_matricula, tipo_embarque, serial_number_sam_val, l_sequence_number, assinatura, diferenca_valor_debitado, secao_entrada, secao_saida, avl_status, provider_id, ext_use_ctr, ext_val_date, valor_promo_desconto, valor_acumulado, tipo_debito, mensagem_debito, tp_credit_purse_a, tp_credit_purse_b, csn_purse_a, csn_purse_b, origin_file, file_date, codigo_empresa, tsn_date, uid, ano, mes, dia ) AS rn_debito - FROM - tg_rn_garagem_transactions - WHERE - rn_garagem = 1), - tg_filtered_transactions AS ( + tg AS ( SELECT SAFE_CAST(DATE_ADD(DATE '2002-12-31', INTERVAL DATA DAY) AS DATE) AS DATA, SAFE_CAST(codigo_empresa AS STRING) AS id_empresa, @@ -74,39 +27,72 @@ WITH SAFE_CAST(SAFE_CAST(valor_acumulado AS INT64)/100 AS FLOAT64) AS total_integracao, SAFE_CAST(garagem AS STRING) AS garagem FROM - tg_rn_debito_transactions + {{ var('tg_transacao_staging') }} WHERE - rn_debito = 1 ) + {% if var("date_range_start") == "None" %} + + {% set date_range_start = "2022-06-01" %} + + {% else %} + + {% set date_range_start = var("date_range_start") %} + + {% endif %} + + ano BETWEEN EXTRACT(YEAR FROM DATE("{{ date_range_start }}")) AND EXTRACT(YEAR FROM DATE("{{ var("date_range_end") }}")) + AND mes BETWEEN EXTRACT(MONTH FROM DATE("{{ date_range_start }}")) AND EXTRACT(MONTH FROM DATE("{{ var("date_range_end") }}")) + AND dia BETWEEN EXTRACT(DAY FROM DATE("{{ date_range_start }}")) AND EXTRACT(DAY FROM DATE("{{ var("date_range_end") }}")) + AND status = 0 -- Apenas transações com sucesso + AND (emissor_aplicacao BETWEEN 1 AND 15) -- Range de emissores de cartão válidos (fonte: RioCard) + AND (aplicacao BETWEEN 0 AND 1023) -- Range de aplicações válidas (fonte: RioCard) + + ), + tg_soma_debito AS ( + SELECT + data, + id_empresa, + id_veiculo, + id_cartao, + tipo_cartao, + sequencial_transacao_cartao, + datetime, + tipo_embarque, + tipo_debito, + mensagem_debito, + tarifa, + tarifa_anterior, + ROUND(SUM(debito), 2) AS debito, + desconto, + total_integracao, + garagem + FROM + tg + GROUP BY + data, + id_empresa, + id_veiculo, + id_cartao, + tipo_cartao, + sequencial_transacao_cartao, + datetime, + tipo_embarque, + tipo_debito, + mensagem_debito, + tarifa, + tarifa_anterior, + desconto, + total_integracao, + garagem), + tg_rn_garagem AS ( + SELECT + *, + ROW_NUMBER() OVER (PARTITION BY datetime, id_cartao ) AS rn_garagem + FROM + tg_soma_debito ) SELECT - DATA, - id_empresa, - id_veiculo, - id_cartao, - tipo_cartao, - sequencial_transacao_cartao, - datetime, - tipo_embarque, - tipo_debito, - mensagem_debito, - tarifa, - tarifa_anterior, - SUM(debito) AS debito, - desconto, - total_integracao + * EXCEPT(garagem, + rn_garagem) FROM - tg_filtered_transactions -GROUP BY - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 14, - 15 + tg_rn_garagem +WHERE + rn_garagem = 1 \ No newline at end of file From 7e0b0e3e653da49d3f1f766ca1991922a99f3beb Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Wed, 12 Jul 2023 18:13:24 -0300 Subject: [PATCH 27/28] altera filtro data --- .../tg_transacao.sql | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql index a8a29cde..96133db6 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql +++ b/models/br_rj_riodejaneiro_onibus_tg/tg_transacao.sql @@ -10,13 +10,13 @@ WITH tg AS ( SELECT - SAFE_CAST(DATE_ADD(DATE '2002-12-31', INTERVAL DATA DAY) AS DATE) AS DATA, + SAFE_CAST(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY) AS DATE) AS data, SAFE_CAST(codigo_empresa AS STRING) AS id_empresa, SAFE_CAST(num_onibus AS STRING) AS id_veiculo, SAFE_CAST(uid AS STRING) AS id_cartao, SAFE_CAST(emissor_aplicacao || "_" || aplicacao AS STRING) AS tipo_cartao, SAFE_CAST(tsn AS STRING) AS sequencial_transacao_cartao, - SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL DATA DAY)), INTERVAL hora SECOND)) AS DATETIME) AS datetime, + SAFE_CAST(DATETIME(TIMESTAMP_ADD(TIMESTAMP(DATE_ADD(DATE '2002-12-31', INTERVAL data DAY)), INTERVAL hora SECOND)) AS DATETIME) AS datetime, SAFE_CAST(tipo_embarque AS STRING) AS tipo_embarque, SAFE_CAST(SAFE_CAST(tipo_debito AS FLOAT64) AS STRING) AS tipo_debito, SAFE_CAST(SAFE_CAST(mensagem_debito AS FLOAT64) AS STRING) AS mensagem_debito, @@ -40,13 +40,19 @@ WITH {% endif %} ano BETWEEN EXTRACT(YEAR FROM DATE("{{ date_range_start }}")) AND EXTRACT(YEAR FROM DATE("{{ var("date_range_end") }}")) - AND mes BETWEEN EXTRACT(MONTH FROM DATE("{{ date_range_start }}")) AND EXTRACT(MONTH FROM DATE("{{ var("date_range_end") }}")) - AND dia BETWEEN EXTRACT(DAY FROM DATE("{{ date_range_start }}")) AND EXTRACT(DAY FROM DATE("{{ var("date_range_end") }}")) AND status = 0 -- Apenas transações com sucesso AND (emissor_aplicacao BETWEEN 1 AND 15) -- Range de emissores de cartão válidos (fonte: RioCard) AND (aplicacao BETWEEN 0 AND 1023) -- Range de aplicações válidas (fonte: RioCard) ), + tg_filtra_data AS ( + SELECT + * + FROM + tg + WHERE + data BETWEEN DATE("{{ date_range_start }}") AND DATE("{{ var("date_range_end") }}") + ), tg_soma_debito AS ( SELECT data, @@ -66,7 +72,7 @@ WITH total_integracao, garagem FROM - tg + tg_filtra_data GROUP BY data, id_empresa, From 31f6f12b173800cad76232f00529d9e545284baa Mon Sep 17 00:00:00 2001 From: eng-rodrigocunha Date: Thu, 13 Jul 2023 15:32:33 -0300 Subject: [PATCH 28/28] =?UTF-8?q?remo=C3=A7=C3=A3o=20de=20testes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- macros/get_where_subquery.sql | 53 ------------------ macros/test_accepted_values_dict.sql | 30 ---------- .../br_rj_riodejaneiro_onibus_tg/schema.yaml | 56 ------------------- packages.yml | 3 - 4 files changed, 142 deletions(-) delete mode 100644 macros/get_where_subquery.sql delete mode 100644 macros/test_accepted_values_dict.sql delete mode 100644 packages.yml diff --git a/macros/get_where_subquery.sql b/macros/get_where_subquery.sql deleted file mode 100644 index 7af21924..00000000 --- a/macros/get_where_subquery.sql +++ /dev/null @@ -1,53 +0,0 @@ -{% macro get_where_subquery(relation) -%} - {# This macro returns a subquery that filters the relation based on the where clause #} - {# It also replaces the __day_month_year_partition__ and __date_partition__ macros #} - {# with the correct where clause #} - - {% set where = config.get('where', '') %} - - {# Partição por dia, mês e ano #} - - {% if "__day_month_year_partition__" in where %} - - {% if var("date_range_start") == "None" %} - - {% set date_range_start = run_query("SELECT gr FROM (SELECT IF(MAX(data) > DATE('" ~ var("date_range_end") ~ "'), DATE('" ~ var("date_range_end") ~ "'), MAX(data)) AS gr FROM " ~ this ~ ")").columns[0].values()[0] %} - - {% else %} - - {% set date_range_start = var("date_range_start") %} - - {% endif %} - - {% set where_cond = "dia <= EXTRACT(DAY FROM DATE('"~ var("date_range_end") ~"')) AND mes <= EXTRACT(MONTH FROM DATE('"~ var("date_range_end") ~"')) AND ano <= EXTRACT(YEAR FROM DATE('"~ var("date_range_end") ~"')) AND dia >= EXTRACT(DAY FROM DATE('"~ date_range_start ~"')) AND mes >= EXTRACT(MONTH FROM DATE('"~ date_range_start ~"')) AND ano >= EXTRACT(YEAR FROM DATE('"~ date_range_start ~"'))" %} - - {% set where = where | replace("__day_month_year_partition__", where_cond) %} - {% endif %} - - {# Partição por data #} - - {% if "__date_partition__" in where %} - - {% if var("date_range_start") == "None" %} - - {% set date_range_start = run_query("SELECT gr FROM (SELECT IF(MAX(data) > DATE('" ~ var("date_range_end") ~ "'), DATE('" ~ var("date_range_end") ~ "'), MAX(data)) AS gr FROM " ~ this ~ ")").columns[0].values()[0] %} - - {% else %} - - {% set date_range_start = var("date_range_start") %} - - {% endif %} - - {% set where_cond = "data BETWEEN DATE('"~ date_range_start ~"') AND DATE('"~ var("date_range_end") ~"')" %} - - {% set where = where | replace("__date_partition__", where_cond) %} - {% endif %} - {% if where %} - {%- set filtered -%} - (select * from {{ relation }} where {{ where }}) dbt_subquery - {%- endset -%} - {% do return(filtered) %} - {%- else -%} - {% do return(relation) %} - {%- endif -%} -{%- endmacro %} \ No newline at end of file diff --git a/macros/test_accepted_values_dict.sql b/macros/test_accepted_values_dict.sql deleted file mode 100644 index 02979b72..00000000 --- a/macros/test_accepted_values_dict.sql +++ /dev/null @@ -1,30 +0,0 @@ -{% test accepted_values_dict(model, column_name, ref_model, table_name) %} - -WITH - values_dict AS ( - SELECT - chave - FROM - {{ ref(ref_model) }} - WHERE - id_tabela = "{{ table_name }}" - AND nome_coluna = "{{ column_name }}" ), - all_values AS ( - SELECT - {{ column_name }} AS value_field, - COUNT(*) AS n_records - FROM {{ model }} - GROUP BY - {{ column_name }} ) -SELECT - * -FROM - all_values -WHERE - value_field NOT IN ( - SELECT - * - FROM - values_dict ) - -{% endtest %} \ No newline at end of file diff --git a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml index 2642c920..588ee5c7 100644 --- a/models/br_rj_riodejaneiro_onibus_tg/schema.yaml +++ b/models/br_rj_riodejaneiro_onibus_tg/schema.yaml @@ -14,82 +14,26 @@ models: description: "Número único criptografado do cartão RioCard" - name: tipo_cartao description: "Emissor e número do aplicação, indica qual o tipo do cartão (ex: gratuidade, vale transporte). Categorias podem ser encontradas na tabela dicionário." - tests: - - accepted_values_dict: - ref_model: tg_dicionario - table_name: transacao - config: - where: "__date_partition__" - name: sequencial_transacao_cartao description: "Número sequencial histórico de transações do cartão" - name: datetime description: "Datetime da transação em GMT-3" - name: tipo_embarque description: "Tipo de embarque atual, indica se é integração ou não" - tests: - - accepted_values_dict: - ref_model: tg_dicionario - table_name: transacao - config: - where: "__date_partition__" - name: tipo_debito description: "Tipo de débito no cartão, indica o tipo de tarifa executada (ex: cheia, com desconto). Categorias podem ser encontradas na tabela dicionário." - tests: - - accepted_values_dict: - ref_model: tg_dicionario - table_name: transacao - config: - where: "__date_partition__" - name: mensagem_debito description: "Mensagem de estado do débito no cartão. Categorias podem ser encontradas na tabela dicionário." - tests: - - accepted_values_dict: - ref_model: tg_dicionario - table_name: transacao - config: - where: "__date_partition__" - name: tarifa description: "Valor da tarifa configurado no equipamento (R$)" - tests: - - dbt_utils.accepted_range: - min_value: 4.05 - max_value: 19.95 - where: "__date_partition__" - name: tarifa_anterior description: "Valor da tarifa anterior da viagem anterior (R$)" - tests: - - dbt_utils.accepted_range: - min_value: 0 - max_value: 19.95 - where: "__date_partition__ AND tarifa_anterior IS NOT NULL" - name: debito description: "Valor debitado na viagem atual (R$)" - tests: - - dbt_utils.accepted_range: - min_value: 0 - max_value: 19.95 - where: "__date_partition__" - name: desconto description: "Valor promocional ou de desconto da tarifa (R$)" - tests: - - dbt_utils.accepted_range: - min_value: 0 - max_value: 19.95 - where: "__date_partition__ AND desconto IS NOT NULL" - name: total_integracao description: "Soma do valor total pago em uma integração (R$)" - tests: - - dbt_utils.accepted_range: - min_value: 0 - max_value: 19.95 - where: "__date_partition__ AND total_integracao IS NOT NULL" - tests: - - dbt_utils.unique_combination_of_columns: - combination_of_columns: - - id_cartao - - datetime - config: - where: "__date_partition__" - name: tg_dicionario description: "Dicionário de dados" columns: diff --git a/packages.yml b/packages.yml deleted file mode 100644 index 83f1e8bb..00000000 --- a/packages.yml +++ /dev/null @@ -1,3 +0,0 @@ -packages: - - package: dbt-labs/dbt_utils - version: 0.7.6 \ No newline at end of file