Commit 88cfae93 authored by Miguel Guerrero's avatar Miguel Guerrero

refatora funções de validação e normalização, melhora mensagens de erro e...

refatora funções de validação e normalização, melhora mensagens de erro e adiciona verificações de integridade
parent 2fad05c8
...@@ -4,12 +4,17 @@ library(stringr) ...@@ -4,12 +4,17 @@ library(stringr)
library(purrr) library(purrr)
library(arrow) library(arrow)
# funcao para obter linhas com mudancas de codigo em cada revisao NCM
filtra_mudancas <- function(x, padrao) { filtra_mudancas <- function(x, padrao) {
x |> x |>
select(matches(padrao)) |> select(matches(padrao)) |>
filter( filter(
# seleciona as linhas que tem algum valor diferente de NA, excluindo
# a primeira coluna da comparacao
if_any(-1, ~ !is.na(.)) if_any(-1, ~ !is.na(.))
) |> ) |>
# cria uma coluna preenchida com o primeiro valor nao NA da
# direita para a esquerda
mutate(!!padrao := do.call(coalesce, rev(as.list(across(-1))))) |> mutate(!!padrao := do.call(coalesce, rev(as.list(across(-1))))) |>
select( select(
ncm_original = 1, ncm_original = 1,
...@@ -18,6 +23,25 @@ filtra_mudancas <- function(x, padrao) { ...@@ -18,6 +23,25 @@ filtra_mudancas <- function(x, padrao) {
distinct() distinct()
} }
amostra_valores <- function(x, n = 5) {
x <- unique(x)
x <- x[!is.na(x)]
if (length(x) == 0) {
return("sem amostra")
}
paste(head(sort(x), n), collapse = ", ")
}
sinaliza_validacao <- function(...) {
warning(sprintf(...), call. = FALSE)
}
interrompe_execucao <- function(...) {
stop(sprintf(...), call. = FALSE)
}
normaliza_ncm <- function(x, validar = FALSE, contexto = "NCM") { normaliza_ncm <- function(x, validar = FALSE, contexto = "NCM") {
x <- as.character(x) x <- as.character(x)
x <- str_trim(x) x <- str_trim(x)
...@@ -28,14 +52,11 @@ normaliza_ncm <- function(x, validar = FALSE, contexto = "NCM") { ...@@ -28,14 +52,11 @@ normaliza_ncm <- function(x, validar = FALSE, contexto = "NCM") {
invalidos <- unique(invalidos) invalidos <- unique(invalidos)
if (length(invalidos) > 0) { if (length(invalidos) > 0) {
stop( sinaliza_validacao(
sprintf( "Foram encontrados %s NCM(s) com formato invalido em %s. Amostra: %s",
"%s contem %s NCM(s) com formato invalido. Amostra: %s", length(invalidos),
contexto, contexto,
length(invalidos), amostra_valores(invalidos)
paste(head(sort(invalidos), 5), collapse = ", ")
),
call. = FALSE
) )
} }
} }
...@@ -43,30 +64,32 @@ normaliza_ncm <- function(x, validar = FALSE, contexto = "NCM") { ...@@ -43,30 +64,32 @@ normaliza_ncm <- function(x, validar = FALSE, contexto = "NCM") {
x x
} }
# carrega caminhos para dados
general_dir <- Sys.getenv("general") general_dir <- Sys.getenv("general")
if (!nzchar(general_dir)) { if (!nzchar(general_dir)) {
stop("Variavel de ambiente general vazia.", call. = FALSE) interrompe_execucao("A variavel de ambiente general esta vazia.")
} }
if (!dir.exists(general_dir)) { if (!dir.exists(general_dir)) {
stop( interrompe_execucao(
sprintf("Diretorio general nao existe: %s", general_dir), "O diretorio indicado pela variavel general nao existe: %s",
call. = FALSE general_dir
) )
} }
path_tec <- Sys.getenv("tec") path_tec <- Sys.getenv("tec")
if (!nzchar(path_tec)) { if (!nzchar(path_tec)) {
stop("Variavel de ambiente tec vazia.", call. = FALSE) interrompe_execucao("A variavel de ambiente tec esta vazia.")
} }
if (!file.exists(path_tec)) { if (!file.exists(path_tec)) {
stop( interrompe_execucao(
sprintf("Arquivo TEC nao encontrado: %s", path_tec), "O arquivo TEC indicado pela variavel tec nao foi encontrado: %s",
call. = FALSE path_tec
) )
} }
# caminho correlacao normal
path_ncm <- file.path( path_ncm <- file.path(
general_dir, general_dir,
"Bases", "Bases",
...@@ -76,6 +99,7 @@ path_ncm <- file.path( ...@@ -76,6 +99,7 @@ path_ncm <- file.path(
"correlacao_completa_ncm.xlsx" "correlacao_completa_ncm.xlsx"
) )
# caminho correlacao expandida
path_ncm_detalhada <- file.path( path_ncm_detalhada <- file.path(
general_dir, general_dir,
"Bases", "Bases",
...@@ -85,6 +109,8 @@ path_ncm_detalhada <- file.path( ...@@ -85,6 +109,8 @@ path_ncm_detalhada <- file.path(
"correlacao_completa_ncm_detalhada.xlsx" "correlacao_completa_ncm_detalhada.xlsx"
) )
# Na pasta dados_gerados, "snapshot" identifica a ultima versao gerada
# e salva para servir de referencia nas comparacoes com os arquivos atuais.
path_ncms_originais_snapshot <- "dados_gerados/ncms_originais.rds" path_ncms_originais_snapshot <- "dados_gerados/ncms_originais.rds"
path_dataset_ncm_snapshot <- "dados_gerados/dataset_ncm.parquet" path_dataset_ncm_snapshot <- "dados_gerados/dataset_ncm.parquet"
...@@ -98,21 +124,18 @@ arquivos_necessarios <- c( ...@@ -98,21 +124,18 @@ arquivos_necessarios <- c(
arquivos_faltantes <- arquivos_necessarios[!file.exists(arquivos_necessarios)] arquivos_faltantes <- arquivos_necessarios[!file.exists(arquivos_necessarios)]
if (length(arquivos_faltantes) > 0) { if (length(arquivos_faltantes) > 0) {
stop( interrompe_execucao(
sprintf( "Os seguintes arquivos obrigatorios nao foram encontrados: %s",
"Arquivos obrigatorios ausentes: %s", paste(
paste( sprintf("%s=%s", names(arquivos_faltantes), arquivos_faltantes),
sprintf("%s=%s", names(arquivos_faltantes), arquivos_faltantes), collapse = "; "
collapse = "; " )
)
),
call. = FALSE
) )
} }
message("Ambiente ok.") message("Ambiente configurado e caminhos obrigatorios validados.")
message("Arquivos obrigatorios encontrados.")
# leitura dos arquivos obrigatorios
correlacao_ncm_detalhada <- read_xlsx(path_ncm_detalhada, guess_max = 1e6) correlacao_ncm_detalhada <- read_xlsx(path_ncm_detalhada, guess_max = 1e6)
correlacao_completa_ncm_raw <- read_xlsx(path_ncm, guess_max = 1e6) correlacao_completa_ncm_raw <- read_xlsx(path_ncm, guess_max = 1e6)
tec <- read_xlsx(path_tec, guess_max = 1e6) tec <- read_xlsx(path_tec, guess_max = 1e6)
...@@ -121,15 +144,15 @@ dataset_ncm_snapshot <- read_parquet(path_dataset_ncm_snapshot) ...@@ -121,15 +144,15 @@ dataset_ncm_snapshot <- read_parquet(path_dataset_ncm_snapshot)
message("Dados carregados.") message("Dados carregados.")
# cria lista de nomes para usar como input em filtra_mudancas
revisoes_ncm <- names(correlacao_ncm_detalhada) |> revisoes_ncm <- names(correlacao_ncm_detalhada) |>
str_extract("NCM_\\d{4}") |> str_extract("NCM_\\d{4}") |>
discard(is.na) |> discard(is.na) |>
unique() unique()
if (length(revisoes_ncm) == 0) { if (length(revisoes_ncm) == 0) {
stop( interrompe_execucao(
"Nenhuma coluna NCM_#### encontrada na correlacao detalhada.", "Nenhuma coluna no formato NCM_#### foi encontrada na correlacao detalhada."
call. = FALSE
) )
} }
...@@ -138,81 +161,84 @@ indice_ultima_revisao <- which.max(anos_revisoes) ...@@ -138,81 +161,84 @@ indice_ultima_revisao <- which.max(anos_revisoes)
coluna_ultima_revisao <- revisoes_ncm[[indice_ultima_revisao]] coluna_ultima_revisao <- revisoes_ncm[[indice_ultima_revisao]]
nome_ultima_revisao <- str_replace(coluna_ultima_revisao, "_", " ") nome_ultima_revisao <- str_replace(coluna_ultima_revisao, "_", " ")
# obtem lista vigente com os NCMs originais das revisoes
ncms_originais <- revisoes_ncm |> ncms_originais <- revisoes_ncm |>
map(~ filtra_mudancas(correlacao_ncm_detalhada, padrao = .x)) map(~ filtra_mudancas(correlacao_ncm_detalhada, padrao = .x))
names(ncms_originais) <- str_replace(revisoes_ncm, "_", " ") names(ncms_originais) <- str_replace(revisoes_ncm, "_", " ")
if (!nome_ultima_revisao %in% names(ncms_originais)) { if (!nome_ultima_revisao %in% names(ncms_originais)) {
stop( interrompe_execucao(
sprintf( "A revisao mais recente %s nao foi gerada a partir da correlacao detalhada.",
"Revisao mais recente %s nao foi gerada na correlacao detalhada.", nome_ultima_revisao
nome_ultima_revisao
),
call. = FALSE
) )
} }
if (!is.list(ncms_originais_snapshot) || is.null(names(ncms_originais_snapshot))) { if (
stop( !is.list(ncms_originais_snapshot) || is.null(names(ncms_originais_snapshot))
"Snapshot anterior de ncms_originais invalido.", ) {
call. = FALSE interrompe_execucao(
"O arquivo snapshot de ncms_originais esta invalido ou sem nomes de revisao."
) )
} }
if (indice_ultima_revisao > length(ncms_originais_snapshot)) { if (indice_ultima_revisao > length(ncms_originais_snapshot)) {
stop( interrompe_execucao(
sprintf( "O snapshot de ncms_originais nao possui o indice %s correspondente a %s.",
"Snapshot anterior nao possui o indice %s para %s.", indice_ultima_revisao,
indice_ultima_revisao, nome_ultima_revisao
nome_ultima_revisao
),
call. = FALSE
) )
} }
if (!nome_ultima_revisao %in% names(ncms_originais_snapshot)) { if (!nome_ultima_revisao %in% names(ncms_originais_snapshot)) {
stop( interrompe_execucao(
sprintf( "O snapshot de ncms_originais nao possui a revisao %s.",
"Snapshot anterior nao possui a revisao %s.", nome_ultima_revisao
nome_ultima_revisao
),
call. = FALSE
) )
} }
if (!identical(names(ncms_originais_snapshot)[[indice_ultima_revisao]], nome_ultima_revisao)) { if (
stop( !identical(
sprintf( names(ncms_originais_snapshot)[[indice_ultima_revisao]],
"Snapshot anterior tem %s no indice %s; esperado %s.", nome_ultima_revisao
names(ncms_originais_snapshot)[[indice_ultima_revisao]], )
indice_ultima_revisao, ) {
nome_ultima_revisao interrompe_execucao(
paste(
"O snapshot de ncms_originais tem %s no indice %s,",
"mas o esperado para a revisao atual era %s."
), ),
call. = FALSE names(ncms_originais_snapshot)[[indice_ultima_revisao]],
indice_ultima_revisao,
nome_ultima_revisao
) )
} }
# separa a revisao mais recente do arquivo atual e do snapshot correspondente
ultima_revisao_atual <- ncms_originais[[nome_ultima_revisao]] ultima_revisao_atual <- ncms_originais[[nome_ultima_revisao]]
ultima_revisao_anterior <- ncms_originais_snapshot[[nome_ultima_revisao]] ultima_revisao_snapshot <- ncms_originais_snapshot[[nome_ultima_revisao]]
if (!all(c("ncm_original", coluna_ultima_revisao) %in% names(ultima_revisao_atual))) { if (
stop( !all(
sprintf( c("ncm_original", coluna_ultima_revisao) %in% names(ultima_revisao_atual)
"Revisao atual %s nao contem as colunas esperadas.", )
nome_ultima_revisao ) {
), interrompe_execucao(
call. = FALSE "A revisao atual %s nao contem as colunas esperadas ncm_original e %s.",
nome_ultima_revisao,
coluna_ultima_revisao
) )
} }
if (!all(c("ncm_original", coluna_ultima_revisao) %in% names(ultima_revisao_anterior))) { if (
stop( !all(
sprintf( c("ncm_original", coluna_ultima_revisao) %in% names(ultima_revisao_snapshot)
"Snapshot anterior de %s nao contem as colunas esperadas.", )
nome_ultima_revisao ) {
), interrompe_execucao(
call. = FALSE "O snapshot de %s nao contem as colunas esperadas ncm_original e %s.",
nome_ultima_revisao,
coluna_ultima_revisao
) )
} }
...@@ -221,116 +247,140 @@ ultima_revisao_atual <- ultima_revisao_atual |> ...@@ -221,116 +247,140 @@ ultima_revisao_atual <- ultima_revisao_atual |>
ncm_original = normaliza_ncm( ncm_original = normaliza_ncm(
ncm_original, ncm_original,
validar = TRUE, validar = TRUE,
contexto = sprintf("%s ncm_original atual", nome_ultima_revisao) contexto = sprintf(
"%s na coluna ncm_original do arquivo atual",
nome_ultima_revisao
)
), ),
!!coluna_ultima_revisao := normaliza_ncm( !!coluna_ultima_revisao := normaliza_ncm(
.data[[coluna_ultima_revisao]], .data[[coluna_ultima_revisao]],
validar = TRUE, validar = TRUE,
contexto = sprintf("%s atual", nome_ultima_revisao) contexto = sprintf(
"%s na coluna %s do arquivo atual",
nome_ultima_revisao,
coluna_ultima_revisao
)
) )
) )
ultima_revisao_anterior <- ultima_revisao_anterior |> ultima_revisao_snapshot <- ultima_revisao_snapshot |>
mutate( mutate(
ncm_original = normaliza_ncm( ncm_original = normaliza_ncm(
ncm_original, ncm_original,
validar = TRUE, validar = TRUE,
contexto = sprintf("%s ncm_original anterior", nome_ultima_revisao) contexto = sprintf(
"%s na coluna ncm_original do snapshot",
nome_ultima_revisao
)
), ),
!!coluna_ultima_revisao := normaliza_ncm( !!coluna_ultima_revisao := normaliza_ncm(
.data[[coluna_ultima_revisao]], .data[[coluna_ultima_revisao]],
validar = TRUE, validar = TRUE,
contexto = sprintf("%s anterior", nome_ultima_revisao) contexto = sprintf(
"%s na coluna %s do snapshot",
nome_ultima_revisao,
coluna_ultima_revisao
)
) )
) )
message(sprintf("Revisao mais recente identificada: %s.", nome_ultima_revisao)) message(sprintf("Revisao mais recente identificada: %s.", nome_ultima_revisao))
# compara coluna ncm original de agora com anterior # compara a coluna ncm_original do arquivo atual com a do snapshot
# indica que codigos que não estavam na revisão original apareceram agora. Isso é # indica codigos que nao estavam na revisao original e passaram a aparecer agora.
# importante pois alguns códigos podem ter sido alterados agora ou podem ter sido esquecidos e não inseridos anteriorermente # Isso e importante porque alguns codigos podem ter sido alterados agora ou podem
# ter sido esquecidos na geracao anterior.
ncm_original_so_atual <- setdiff( ncm_original_so_atual <- setdiff(
unique(ultima_revisao_atual$ncm_original), unique(ultima_revisao_atual$ncm_original),
unique(ultima_revisao_anterior$ncm_original) unique(ultima_revisao_snapshot$ncm_original)
) )
if (length(ncm_original_so_atual) > 0) { if (length(ncm_original_so_atual) > 0) {
stop( sinaliza_validacao(
sprintf( paste(
"Diferenca em ncm_original para %s: %s codigo(s) so no atual. Amostra: %s", "A coluna ncm_original da revisao atual %s contem %s codigo(s)",
nome_ultima_revisao, "que nao aparecem no snapshot. Amostra: %s"
length(ncm_original_so_atual),
paste(head(sort(ncm_original_so_atual), 5), collapse = ", ")
), ),
call. = FALSE nome_ultima_revisao,
length(ncm_original_so_atual),
amostra_valores(ncm_original_so_atual)
) )
} }
ncm_original_so_anterior <- setdiff( ncm_original_so_snapshot <- setdiff(
unique(ultima_revisao_anterior$ncm_original), unique(ultima_revisao_snapshot$ncm_original),
unique(ultima_revisao_atual$ncm_original) unique(ultima_revisao_atual$ncm_original)
) )
if (length(ncm_original_so_anterior) > 0) { if (length(ncm_original_so_snapshot) > 0) {
warning( sinaliza_validacao(
sprintf( paste(
"Diferenca em ncm_original para %s: %s codigo(s) so no anterior. Amostra: %s", "A coluna ncm_original do snapshot de %s contem %s codigo(s)",
nome_ultima_revisao, "que nao aparecem no arquivo atual. Amostra: %s"
length(ncm_original_so_anterior),
paste(head(sort(ncm_original_so_anterior), 5), collapse = ", ")
), ),
call. = FALSE nome_ultima_revisao,
length(ncm_original_so_snapshot),
amostra_valores(ncm_original_so_snapshot)
) )
} }
# compara coluna de mudanças dentro da revisão. Indica códigos que # compara a coluna de mudancas dentro da revisao. Indica codigos que
# apareceram agora em relação ao ultimo arquivo. Aqui vale a pena conferir se # apareceram agora em relacao ao snapshot. Aqui vale a pena conferir se
# todos os códigos que aparececem foram de fato criados. Vale a pena conferir se todos os # todos os codigos que aparecem foram de fato criados. Tambem vale conferir se
# códigos criados (olhar nas resoluções) aparecem dentros os códigos seguintes. # todos os codigos criados (olhar nas resolucoes) aparecem nos codigos seguintes.
codigos_revisao_so_atual <- setdiff( codigos_revisao_so_atual <- setdiff(
unique(ultima_revisao_atual[[coluna_ultima_revisao]]), unique(ultima_revisao_atual[[coluna_ultima_revisao]]),
unique(ultima_revisao_anterior[[coluna_ultima_revisao]]) unique(ultima_revisao_snapshot[[coluna_ultima_revisao]])
) )
if (length(codigos_revisao_so_atual) > 0) { if (length(codigos_revisao_so_atual) > 0) {
stop( sinaliza_validacao(
sprintf( paste(
"Diferenca em %s: %s codigo(s) so no atual. Amostra: %s", "A coluna %s da revisao atual contem %s codigo(s)",
nome_ultima_revisao, "que nao aparecem no snapshot. Amostra: %s"
length(codigos_revisao_so_atual),
paste(head(sort(codigos_revisao_so_atual), 5), collapse = ", ")
), ),
call. = FALSE coluna_ultima_revisao,
length(codigos_revisao_so_atual),
amostra_valores(codigos_revisao_so_atual)
) )
} }
codigos_revisao_so_anterior <- setdiff( # mostra códigos que saíram do arquivo atual em relação ao snapshot.
unique(ultima_revisao_anterior[[coluna_ultima_revisao]]), codigos_revisao_so_snapshot <- setdiff(
unique(ultima_revisao_snapshot[[coluna_ultima_revisao]]),
unique(ultima_revisao_atual[[coluna_ultima_revisao]]) unique(ultima_revisao_atual[[coluna_ultima_revisao]])
) )
if (length(codigos_revisao_so_anterior) > 0) { if (length(codigos_revisao_so_snapshot) > 0) {
stop( sinaliza_validacao(
sprintf( paste(
"Diferenca em %s: %s codigo(s) so no anterior. Amostra: %s", "A coluna %s do snapshot contem %s codigo(s)",
nome_ultima_revisao, "que nao aparecem na revisao atual. Amostra: %s"
length(codigos_revisao_so_anterior),
paste(head(sort(codigos_revisao_so_anterior), 5), collapse = ", ")
), ),
call. = FALSE coluna_ultima_revisao,
length(codigos_revisao_so_snapshot),
amostra_valores(codigos_revisao_so_snapshot)
) )
} }
message(sprintf("Comparacao com snapshot de %s ok.", nome_ultima_revisao)) message(
sprintf(
"Comparacao da revisao %s com o snapshot de ncms_originais concluida.",
nome_ultima_revisao
)
)
# compara codigos NCM da tabela de correlacao NCM atual
# e verifica se todos estao presentes na TEC vigente.
correlacao_completa_ncm <- correlacao_completa_ncm_raw |> correlacao_completa_ncm <- correlacao_completa_ncm_raw |>
rename_with(~ str_to_upper(.x)) rename_with(~ str_to_upper(.x)) |>
tidyr::drop_na()
linhas_duplicadas <- nrow(correlacao_completa_ncm) - linhas_duplicadas <- nrow(correlacao_completa_ncm) -
nrow(distinct(correlacao_completa_ncm)) nrow(distinct(correlacao_completa_ncm))
if (linhas_duplicadas > 0) { if (linhas_duplicadas > 0) {
stop( sinaliza_validacao(
sprintf( paste(
"Dataset NCM atual contem %s linha(s) duplicada(s).", "O dataset NCM atual contem %s linha(s) duplicada(s);",
linhas_duplicadas "elas serao removidas com distinct()."
), ),
call. = FALSE linhas_duplicadas
) )
} }
...@@ -341,19 +391,15 @@ colunas_ncm_dataset <- names(correlacao_completa_ncm) |> ...@@ -341,19 +391,15 @@ colunas_ncm_dataset <- names(correlacao_completa_ncm) |>
str_subset("^NCM_\\d{4}$") str_subset("^NCM_\\d{4}$")
if (length(colunas_ncm_dataset) == 0) { if (length(colunas_ncm_dataset) == 0) {
stop( interrompe_execucao(
"Dataset NCM atual nao contem colunas NCM_####.", "O dataset NCM atual nao contem colunas no formato NCM_####."
call. = FALSE
) )
} }
if (!coluna_ultima_revisao %in% colunas_ncm_dataset) { if (!coluna_ultima_revisao %in% colunas_ncm_dataset) {
stop( interrompe_execucao(
sprintf( "O dataset NCM atual nao contem a coluna %s correspondente a ultima revisao.",
"Dataset NCM atual nao contem a coluna %s.", coluna_ultima_revisao
coluna_ultima_revisao
),
call. = FALSE
) )
} }
...@@ -362,15 +408,14 @@ colunas_com_na <- colunas_ncm_dataset[ ...@@ -362,15 +408,14 @@ colunas_com_na <- colunas_ncm_dataset[
] ]
if (length(colunas_com_na) > 0) { if (length(colunas_com_na) > 0) {
linhas_com_na <- sum(rowSums(is.na(correlacao_completa_ncm[colunas_ncm_dataset])) > 0) linhas_com_na <- sum(
rowSums(is.na(correlacao_completa_ncm[colunas_ncm_dataset])) > 0
)
stop( sinaliza_validacao(
sprintf( "O dataset NCM atual contem NA em %s linha(s). Colunas afetadas: %s",
"Dataset NCM atual contem NA em %s linha(s). Colunas: %s", linhas_com_na,
linhas_com_na, amostra_valores(colunas_com_na)
paste(head(colunas_com_na, 5), collapse = ", ")
),
call. = FALSE
) )
} }
...@@ -380,22 +425,22 @@ correlacao_ncm_atual <- correlacao_completa_ncm |> ...@@ -380,22 +425,22 @@ correlacao_ncm_atual <- correlacao_completa_ncm |>
ncm = normaliza_ncm( ncm = normaliza_ncm(
ncm, ncm,
validar = TRUE, validar = TRUE,
contexto = sprintf("Dataset NCM atual %s", nome_ultima_revisao) contexto = sprintf("dataset NCM atual para %s", nome_ultima_revisao)
) )
) )
message("Dataset NCM atual ok.") message("Leitura do dataset NCM atual concluida.")
if (!"ncm" %in% names(tec)) { if (!"ncm" %in% names(tec)) {
stop("TEC nao contem a coluna ncm.", call. = FALSE) interrompe_execucao("O arquivo TEC nao contem a coluna ncm.")
} }
if (!"descricao_tec" %in% names(tec)) { if (!"descricao_tec" %in% names(tec)) {
stop("TEC nao contem a coluna descricao_tec.", call. = FALSE) interrompe_execucao("O arquivo TEC nao contem a coluna descricao_tec.")
} }
if (anyNA(tec$ncm)) { if (anyNA(tec$ncm)) {
stop("TEC contem NA na coluna ncm.", call. = FALSE) sinaliza_validacao("O arquivo TEC contem NA na coluna ncm.")
} }
tec <- tec |> tec <- tec |>
...@@ -403,7 +448,7 @@ tec <- tec |> ...@@ -403,7 +448,7 @@ tec <- tec |>
ncm = normaliza_ncm( ncm = normaliza_ncm(
ncm, ncm,
validar = TRUE, validar = TRUE,
contexto = "TEC" contexto = "arquivo TEC"
) )
) )
...@@ -411,17 +456,17 @@ duplicados_tec <- tec$ncm[duplicated(tec$ncm)] |> ...@@ -411,17 +456,17 @@ duplicados_tec <- tec$ncm[duplicated(tec$ncm)] |>
unique() unique()
if (length(duplicados_tec) > 0) { if (length(duplicados_tec) > 0) {
stop( sinaliza_validacao(
sprintf( "O arquivo TEC contem %s NCM(s) duplicado(s). Amostra: %s",
"TEC contem %s NCM(s) duplicado(s). Amostra: %s", length(duplicados_tec),
length(duplicados_tec), amostra_valores(duplicados_tec)
paste(head(sort(duplicados_tec), 5), collapse = ", ")
),
call. = FALSE
) )
} }
faltantes_snapshot_tec <- ultima_revisao_anterior |> # observa mudancas nos codigos NCM do snapshot da revisao
# e verifica se alguma NCM nao esta mais na TEC vigente.
# Se um codigo aparecer, esse codigo deve ter sido alterado. Conferir.
faltantes_snapshot_tec <- ultima_revisao_snapshot |>
transmute( transmute(
ncm = .data[[coluna_ultima_revisao]] ncm = .data[[coluna_ultima_revisao]]
) |> ) |>
...@@ -435,14 +480,11 @@ faltantes_snapshot_tec <- ultima_revisao_anterior |> ...@@ -435,14 +480,11 @@ faltantes_snapshot_tec <- ultima_revisao_anterior |>
pull(ncm) pull(ncm)
if (length(faltantes_snapshot_tec) > 0) { if (length(faltantes_snapshot_tec) > 0) {
stop( sinaliza_validacao(
sprintf( "A TEC vigente nao cobre %s NCM(s) presentes no snapshot de %s. Amostra: %s",
"TEC vigente nao cobre %s NCM(s) do snapshot anterior em %s. Amostra: %s", length(faltantes_snapshot_tec),
length(faltantes_snapshot_tec), nome_ultima_revisao,
nome_ultima_revisao, amostra_valores(faltantes_snapshot_tec)
paste(head(sort(faltantes_snapshot_tec), 5), collapse = ", ")
),
call. = FALSE
) )
} }
...@@ -458,100 +500,116 @@ faltantes_atual_tec <- correlacao_ncm_atual |> ...@@ -458,100 +500,116 @@ faltantes_atual_tec <- correlacao_ncm_atual |>
pull(ncm) pull(ncm)
if (length(faltantes_atual_tec) > 0) { if (length(faltantes_atual_tec) > 0) {
stop( sinaliza_validacao(
sprintf( "A TEC vigente nao cobre %s NCM(s) presentes no dataset atual de %s. Amostra: %s",
"TEC vigente nao cobre %s NCM(s) do dataset atual em %s. Amostra: %s", length(faltantes_atual_tec),
length(faltantes_atual_tec), nome_ultima_revisao,
nome_ultima_revisao, amostra_valores(faltantes_atual_tec)
paste(head(sort(faltantes_atual_tec), 5), collapse = ", ")
),
call. = FALSE
) )
} }
message("Validacao contra TEC ok.") message("Comparacao com a TEC concluida.")
if (!coluna_ultima_revisao %in% names(dataset_ncm_snapshot)) { if (!coluna_ultima_revisao %in% names(dataset_ncm_snapshot)) {
stop( interrompe_execucao(
sprintf( "O snapshot de dataset_ncm nao contem a coluna %s correspondente a ultima revisao.",
"Snapshot dataset_ncm.parquet nao contem a coluna %s.", coluna_ultima_revisao
coluna_ultima_revisao
),
call. = FALSE
) )
} }
correlacao_ncm_anterior <- dataset_ncm_snapshot |> correlacao_ncm_snapshot <- dataset_ncm_snapshot |>
rename(ncm = all_of(coluna_ultima_revisao)) |> rename(ncm = all_of(coluna_ultima_revisao)) |>
mutate( mutate(
ncm = normaliza_ncm( ncm = normaliza_ncm(
ncm, ncm,
validar = TRUE, validar = TRUE,
contexto = sprintf("Snapshot dataset_ncm %s", nome_ultima_revisao) contexto = sprintf("snapshot de dataset_ncm para %s", nome_ultima_revisao)
) )
) )
codigos_entraram_dataset <- setdiff( # compara codigos que entraram e sairam no dataset atual com o snapshot.
# Os resultados devem bater com as mudancas observadas na ultima revisao.
# codigos correlacao ncm que entraram
codigos_entraram_dataset_snapshot <- setdiff(
unique(correlacao_ncm_atual$ncm), unique(correlacao_ncm_atual$ncm),
unique(correlacao_ncm_anterior$ncm) unique(correlacao_ncm_snapshot$ncm)
) )
codigos_sairam_dataset <- setdiff( # codigos correlacao ncm que sairam
unique(correlacao_ncm_anterior$ncm), codigos_sairam_dataset_snapshot <- setdiff(
unique(correlacao_ncm_snapshot$ncm),
unique(correlacao_ncm_atual$ncm) unique(correlacao_ncm_atual$ncm)
) )
codigos_entraram_revisao <- setdiff( # ncms originais - codigos que entraram
codigos_entraram_revisao_snapshot <- setdiff(
unique(ultima_revisao_atual[[coluna_ultima_revisao]]), unique(ultima_revisao_atual[[coluna_ultima_revisao]]),
unique(ultima_revisao_anterior[[coluna_ultima_revisao]]) unique(ultima_revisao_snapshot[[coluna_ultima_revisao]])
) )
codigos_sairam_revisao <- setdiff( # ncms originais - codigos que sairam
unique(ultima_revisao_anterior[[coluna_ultima_revisao]]), codigos_sairam_revisao_snapshot <- setdiff(
unique(ultima_revisao_snapshot[[coluna_ultima_revisao]]),
unique(ultima_revisao_atual[[coluna_ultima_revisao]]) unique(ultima_revisao_atual[[coluna_ultima_revisao]])
) )
entradas_so_dataset <- setdiff(codigos_entraram_dataset, codigos_entraram_revisao) entradas_so_dataset_atual <- setdiff(
entradas_so_revisao <- setdiff(codigos_entraram_revisao, codigos_entraram_dataset) codigos_entraram_dataset_snapshot,
codigos_entraram_revisao_snapshot
if (length(entradas_so_dataset) > 0 || length(entradas_so_revisao) > 0) { )
stop( entradas_so_revisao_atual <- setdiff(
sprintf( codigos_entraram_revisao_snapshot,
paste( codigos_entraram_dataset_snapshot
"Entradas de codigos divergem em %s.", )
"So no dataset: %s codigo(s). Amostra: %s.",
"So na revisao: %s codigo(s). Amostra: %s" if (
), length(entradas_so_dataset_atual) > 0 || length(entradas_so_revisao_atual) > 0
nome_ultima_revisao, ) {
length(entradas_so_dataset), sinaliza_validacao(
paste(head(sort(entradas_so_dataset), 5), collapse = ", "), paste(
length(entradas_so_revisao), "As entradas de codigos divergem entre o dataset atual e a revisao",
paste(head(sort(entradas_so_revisao), 5), collapse = ", ") "comparada com o snapshot de %s.",
"Somente no dataset atual: %s codigo(s). Amostra: %s.",
"Somente na revisao atual: %s codigo(s). Amostra: %s."
), ),
call. = FALSE nome_ultima_revisao,
) length(entradas_so_dataset_atual),
} amostra_valores(entradas_so_dataset_atual),
length(entradas_so_revisao_atual),
saidas_so_dataset <- setdiff(codigos_sairam_dataset, codigos_sairam_revisao) amostra_valores(entradas_so_revisao_atual)
saidas_so_revisao <- setdiff(codigos_sairam_revisao, codigos_sairam_dataset) )
}
if (length(saidas_so_dataset) > 0 || length(saidas_so_revisao) > 0) {
stop( saidas_so_dataset_atual <- setdiff(
sprintf( # codigos que sairam da correlacao ncm completa snapshot
paste( codigos_sairam_dataset_snapshot,
"Saidas de codigos divergem em %s.", # codigos que sairam da correlacao ncm detalhada snapshot
"So no dataset: %s codigo(s). Amostra: %s.", codigos_sairam_revisao_snapshot
"So na revisao: %s codigo(s). Amostra: %s" )
), saidas_so_revisao_atual <- setdiff(
nome_ultima_revisao, codigos_sairam_revisao_snapshot,
length(saidas_so_dataset), codigos_sairam_dataset_snapshot
paste(head(sort(saidas_so_dataset), 5), collapse = ", "), )
length(saidas_so_revisao),
paste(head(sort(saidas_so_revisao), 5), collapse = ", ") if (
length(saidas_so_dataset_atual) > 0 || length(saidas_so_revisao_atual) > 0
) {
sinaliza_validacao(
paste(
"Análise apenas para fins de controle. É normal ter alguma divergência.",
"As saidas de codigos divergem entre o dataset correlacao ncm e a correlacao ncm detalhada",
"de %s.",
"Saídas presentes em correlacao ncm completa e ausentes em ncm completa detalhada: %s codigo(s). Amostra: %s.",
"Saídas presentes em correlacao ncm detalhada e ausentes em correlacao ncm completa: %s codigo(s). Amostra: %s."
), ),
call. = FALSE nome_ultima_revisao,
length(saidas_so_dataset_atual),
amostra_valores(saidas_so_dataset_atual),
length(saidas_so_revisao_atual),
amostra_valores(saidas_so_revisao_atual)
) )
} }
message("Comparacao com dataset_ncm anterior ok.") message("Comparacao com o snapshot de dataset_ncm concluida.")
message("Validacao concluida.") message("Validacao concluida.")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment