Skip to content

Commit

Permalink
Merge pull request #39 from analytics-ufcg/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
JoaquimCMH authored Jul 9, 2020
2 parents 4f36c59 + de90bf9 commit 75a2ec9
Show file tree
Hide file tree
Showing 26 changed files with 1,557 additions and 63 deletions.
Binary file modified .DS_Store
Binary file not shown.
Binary file modified dados/.DS_Store
Binary file not shown.
Binary file modified dados/MER Sagres-2017.pdf
Binary file not shown.
1,080 changes: 1,080 additions & 0 deletions dados/contratos_rescindidos_2018/contratos_tramita_tratado.csv

Large diffs are not rendered by default.

170 changes: 148 additions & 22 deletions docs/06-Descritivo-Fornecedores.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,16 @@ source(here::here("lib/utils-sagres.R"))
source(here::here("lib/get-dados.R"))
```

```{r, include=FALSE}
contratos_rescindidos_2018 <- read_delim(here::here("dados/contratos_rescindidos_2018/contratos_mutacoes_tramita_08_11_2018_corrigido.csv"), ";", escape_double = FALSE, col_types = cols(cnpj_fornecedor = col_character(),
```{r, include=FALSE, message=FALSE}
contratos_rescindidos_2018 <- read_delim(here::here("dados/contratos_rescindidos_2018/contratos_mutacoes_tramita_08_11_2018_corrigido-original.csv"), ";", escape_double = FALSE, col_types = cols(cnpj_fornecedor = col_character(),
cpf_fornecedor = col_character(),
data_ato_mutacao = col_character(),
data_mutacao = col_character(), numero_contrato = col_character()),
trim_ws = TRUE)
contratos_tratados <- read_csv(here::here("dados/contratos_rescindidos_2018/contratos_tramita_tratado.csv"))
contratos_tratados$cd_Ugestora <- as.character(contratos_tratados$cd_Ugestora)
```


Expand Down Expand Up @@ -98,6 +102,9 @@ participantes <- get_participantes()
# Dados de fornecedores eleitos em Licitações
fornecedores <- get_fornecedores()
# Dados do tipo de objeto a ser adquirido com a licitação
tipo_objeto_licitacao <- get_tipo_objeto()
```

```{r, include=FALSE}
Expand Down Expand Up @@ -532,20 +539,21 @@ kable(aplicado_ganho %>%
<br>




## Fornecedores com contratos interrompidos


```{r, include=FALSE}
contratos_rescindidos_2018$data_mutacao <- as.Date(contratos_rescindidos_2018$data_mutacao)
contratos_rescindidos_2018$ano_rescisao <- as.numeric(format(contratos_rescindidos_2018$data_mutacao, "%Y"))
contratos_interrompidos <- contratos_rescindidos_2018 %>%
filter(tipo_mutacao == "IMPEDIMENTO" | tipo_mutacao == "PARALISACAO" |
tipo_mutacao == "RESCISAO" | tipo_mutacao == "SUSPENSAO" | tipo_mutacao == "SUSTACAO") %>%
filter(tipo_mutacao == "IMPEDIMENTO" | tipo_mutacao == "RESCISAO" | tipo_mutacao == "SUSPENSAO" | tipo_mutacao == "SUSTACAO") %>%
select(-protocolo_contrato_tce, -justificativa_mutacao)
```


Entre 2014 e 2018, segundo o [TRAMITA](https://tramita.tce.pb.gov.br/), tivemos aproximadamente `r nrow(contratos_rescindidos_2018)` contratos administrativos cuja situação foi mutada. Dentre estes, `r nrow(contratos_interrompidos)` foram interrompidos devido a *Impedimento*, *Paralisação*, *Rescisão*, *Suspensão* ou *Sustação*. De modo que estão assim distribuídos:
Entre 2014 e 2018, segundo o [TRAMITA](https://tramita.tce.pb.gov.br/), tivemos aproximadamente `r nrow(contratos_rescindidos_2018)` contratos administrativos cuja situação foi mutada. Dentre estes, `r nrow(contratos_interrompidos)` foram interrompidos devido a *Impedimento*, *Rescisão*, *Suspensão* ou *Sustação*. De modo que estão assim distribuídos:

<br>

Expand All @@ -564,25 +572,143 @@ Destes, `r contratos_interrompidos %>% select(cnpj_fornecedor) %>% na.omit() %>%

<br>


```{r, include=FALSE}
contratos_tratados_info <- contratos_tratados %>%
left_join(contratos, by = c('cd_Ugestora' = 'cd_UGestora',
'numero_contrato' = 'nu_Contrato',
'nu_CPFCNPJ' = 'nu_CPFCNPJ'))
contratos_tratados_info <- contratos_tratados_info %>%
select(-c("ordemServico", "planilha", "foto", "dt_Recebimento",
"cd_SIAFI", "registroCGE", "dt_MesAno", "de_Obs"))
contratos_tratados_info <- contratos_tratados_info %>%
left_join(tipos_modalidade, by = "tp_Licitacao")
contratos_tratados_info <- contratos_tratados_info %>%
left_join(licitacoes, by = c('cd_Ugestora' = 'cd_UGestora',
'nu_Licitacao' = 'nu_Licitacao',
'tp_Licitacao' = 'tp_Licitacao'))
contratos_tratados_info <- contratos_tratados_info %>%
left_join(tipo_objeto_licitacao, by = "tp_Objeto")
```

Destes, apenas 294 contratos possuem, no SAGRES, dados de licitações associadas a si. Para esta parcela:

<br>


```{r}
contratos_tratados_info %>%
group_by(de_TipoLicitacao) %>%
dplyr::summarise(Ocorrencias = n()) %>%
ggplot(aes(x = reorder(de_TipoLicitacao, -Ocorrencias), y = Ocorrencias)) +
geom_bar(stat = "identity", fill = "turquoise4") +
labs(x = "", y = "Contagem",
title = "Modalidade da licitação proveniente", subtitle = "contratos rescindidos") +
theme(axis.text.x = element_blank()) +
coord_flip()
```

```{r, include=FALSE}
# Vou deixar isso aqui para quando tivermos mais dados sobre contratos rescindidos
# ggsave(here::here("01-ContratosRescindidos-Modalidades.png"), width = 10, height = 6)
# dev.off()
```


<br>

O *Pregão Presencial* é, conhecidamente, uma modalidade onde pode ocorrer conluio entre fornecedores, fornecedores e unidades gestoras, intimidação de participantes, e outras práticas ilegítimas. Esta pode ser uma das explicações de, à parte os contratos onde não temos dados, o maior número de contratos vetados é pertencente a categoria Pregão Presencial.

<br>

# get_ano_contrato <- function(numero_contrato) {
# library(plyr)
# result <- data.frame(
# ano_contrato = stri_sub(numero_contrato, -4))
# return(result$ano_contrato)
# }
#
# contratos_interrompidos <- contratos_interrompidos %>%
# mutate(ano_contrato = as.numeric(as.character(get_ano_contrato(numero_contrato))))
#
# verificacao <- contratos_interrompidos %>%
# left_join(contratos %>% select(cd_UGestora, dt_Ano, nu_Contrato, dt_Assinatura, nu_CPFCNPJ,
# nu_Licitacao, tp_Licitacao, vl_TotalContrato, de_Municipio),
# by = c("numero_contrato" = "nu_Contrato", "ano_contrato" = "dt_Ano"))
```{r}
contratos_tratados_info %>%
group_by(de_TipoObjeto) %>%
dplyr::summarise(Ocorrencias = n()) %>%
ggplot(aes(x = reorder(de_TipoObjeto, -Ocorrencias), y = Ocorrencias)) +
geom_bar(stat = "identity", fill = "turquoise4") +
labs(x = "", y = "Contagem",
title = "Tipo do Objeto", subtitle = "contratos rescindidos") +
theme(axis.text.x = element_blank()) +
coord_flip()
```

```{r, include=FALSE}
# ggsave(here::here("01-ContratosRescindidos-TipoObjeto.png"), width = 10, height = 6)
# dev.off()
```

<br>

Dada a complexidade, imaginamos que os contratos mais frequentemente rescindidos dados os motivos citados acima seriam os de obras. Entretanto vemos que, a partir dos dados disponíveis, a seara com maior número de cancelamentos é a de Compras e Serviços. Por fim, temos uma visão geral dos municípios com o maior número de rescisões.

<br>

```{r, include=FALSE}
sumario_rescisoes <- contratos_tratados_info %>%
select(cd_Ugestora)
sumario_rescisoes <- sumario_rescisoes %>%
mutate(de_Municipio = get_municipio(cd_Ugestora)) %>%
group_by(de_Municipio) %>%
dplyr::summarise(rescisoes = n()) %>%
na.omit()
```



```{r, include=FALSE}
# Criação de níveis através dos ranges de valor
sumario_rescisoes$resc_levels <- cut(sumario_rescisoes$rescisoes,
breaks = c(0, 10, 50, 100, 300),
labels = c('1 a 10', '11 a 50', '51 a 100', 'Acima de 50'),
include.lowest = TRUE, ordered_result = TRUE)
mapa_pb@data <- mapa_pb@data %>%
left_join(sumario_rescisoes, by = c('Nome_Munic' = 'de_Municipio'))
colors <- colorFactor('OrRd', mapa_pb@data$resc_levels)
# Para cada município cria uma string contendo <Nome, Volume de Rescisões>
labs_rescisoes <- lapply(seq(nrow(mapa_pb@data)), function(i) {
paste0('Município: ', mapa_pb@data[i, "Nome_Munic"], '</br>',
'Rescisões: ', mapa_pb@data[i, "rescisoes"])
})
```

```{r}
leaflet(data = mapa_pb) %>%
addProviderTiles(providers$Esri.WorldGrayCanvas) %>%
addPolygons(opacity = 0.5,
weight = 1,
fillColor = colors(mapa_pb@data$resc_levels),
color = 'black',
label = lapply(labs_rescisoes, htmltools::HTML),
fillOpacity = 1) %>%
addLegend(position = "bottomright",
pal = colors, values = mapa_pb@data$resc_levels,
title = "Nº de rescisões",
opacity = 1)
```


<br>

É importante ressaltar que nos municípios assinalados em cinza não necessariamente significam que não existem contratos rescindidos.













<!--
Expand All @@ -596,6 +722,6 @@ Destes, `r contratos_interrompidos %>% select(cnpj_fornecedor) %>% na.omit() %>%
Dados Extraídos do Sagres (até março de 2019).
Tabelas: Empenhos, Licitações, Contratos, Tipo da Modalidade da Licitação,
Fornecedores, Participantes.
Dados Externos: Mapa da Paraíba, Código dos Municípios Paraibanos (IBGE).
Dados Externos: Mapa da Paraíba, Código dos Municípios Paraibanos (IBGE), Rescisões Tramita.

--------
50 changes: 28 additions & 22 deletions docs/06-Descritivo-Fornecedores.html

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion feed-al/DAO.R
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ create <- function() {
system(paste0("psql -h ", host, " -U ", user, " -d ", db, " -f ", " /feed-al/scripts/create/create_municipio.sql"))
system(paste0("psql -h ", host, " -U ", user, " -d ", db, " -f ", " /feed-al/scripts/create/create_licitacao.sql"))
system(paste0("psql -h ", host, " -U ", user, " -d ", db, " -f ", " /feed-al/scripts/create/create_contrato.sql"))

system(paste0("psql -h ", host, " -U ", user, " -d ", db, " -f ", " /feed-al/scripts/create/create_participante.sql"))
}

#' @title Importa dados para as tabelas do Banco de dados
Expand Down
3 changes: 3 additions & 0 deletions feed-al/scripts/create/create_contrato.sql
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ CREATE TABLE IF NOT EXISTS "contrato" (
"foto" VARCHAR(150),
"planilha" VARCHAR(150),
"ordem_servico" VARCHAR(150),
"language" VARCHAR(10),
"de_ugestora" VARCHAR(100),
"no_fornecedor" VARCHAR(100),
PRIMARY KEY("id_contrato"),
CONSTRAINT contrato_key UNIQUE (cd_u_gestora, dt_ano, nu_licitacao, tp_licitacao, nu_contrato),
FOREIGN KEY("cd_municipio") REFERENCES municipio("cd_municipio") ON DELETE CASCADE ON UPDATE CASCADE,
Expand Down
2 changes: 2 additions & 0 deletions feed-al/scripts/create/create_licitacao.sql
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ CREATE TABLE IF NOT EXISTS "licitacao" (
"dt_mes_ano" VARCHAR(6),
"registro_cge" varchar(40),
"tp_regime_execucao" SMALLINT,
"de_ugestora" VARCHAR(100),
"de_tipo_licitacao" VARCHAR(55),
PRIMARY KEY("id_licitacao"),
CONSTRAINT licitacao_key UNIQUE (cd_u_gestora, dt_ano, nu_licitacao, tp_licitacao),
FOREIGN KEY("cd_municipio") REFERENCES municipio("cd_municipio") ON DELETE CASCADE ON UPDATE CASCADE
Expand Down
17 changes: 17 additions & 0 deletions feed-al/scripts/create/create_participante.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
DROP TABLE IF EXISTS participante;

CREATE TABLE IF NOT EXISTS "participante" (
"id_participante" VARCHAR(50),
"id_licitacao" VARCHAR(50),
"cd_u_gestora" INTEGER,
"dt_ano" SMALLINT,
"nu_licitacao" VARCHAR(10),
"tp_licitacao" SMALLINT,
"nu_cpfcnpj" VARCHAR(14),
"dt_mes_ano" VARCHAR(6),
"no_fornecedor" VARCHAR(100),
PRIMARY KEY("id_participante"),
CONSTRAINT participante_key UNIQUE (nu_licitacao, dt_ano, cd_u_gestora, tp_licitacao, nu_cpfcnpj),
FOREIGN KEY("id_licitacao") REFERENCES licitacao("id_licitacao") ON DELETE CASCADE ON UPDATE CASCADE

);
1 change: 1 addition & 0 deletions feed-al/scripts/drop/drop_tables.sql
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
DROP TABLE IF EXISTS "participante";
DROP TABLE IF EXISTS "contrato";
DROP TABLE IF EXISTS "licitacao";
DROP TABLE IF EXISTS "municipio";
1 change: 1 addition & 0 deletions feed-al/scripts/import/import_data.sql
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
\copy municipio FROM '/data/municipios.csv' WITH NULL AS 'NA' DELIMITER ',' CSV HEADER;
\copy licitacao FROM '/data/licitacoes.csv' WITH NULL AS 'NA' DELIMITER ',' CSV HEADER;
\copy contrato FROM '/data/contratos.csv' WITH NULL AS 'NA' DELIMITER ',' CSV HEADER;
\copy participante FROM '/data/participantes.csv' WITH NULL AS 'NA' DELIMITER ',' CSV HEADER;
8 changes: 2 additions & 6 deletions fetcher/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,10 @@ Abaixo está a listagem das tabelas adicionadas ([seguindo as convenções de no
| Contratos |x | x | x | x | contrato |
| Convenios | x | x | x | | |
| Empenhos | x | x | x | | |
| Fornecedores | x | x | x | | |
| Licitacao | x | x | x | x | licitacao |
| Pagamentos | x | x | x | | |
| Participantes | x | x | x | x | participante |
| RegimeExecucao | x | x | x | | |
| Tipo_Modalidade_Licitacao | x | x | x | | |
| Tipo_Objeto_Licitacao | x | x | x | | |






6 changes: 6 additions & 0 deletions lib/get-dados.R
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,12 @@ get_tipo_modalidade <- function() {
return(tipos_modalidade)
}

get_tipo_objeto <- function() {
tipo_objeto <- read_csv(here::here("fetcher/data/tipo_objeto_licitacao.csv"),
col_types = cols(tp_Licitacao = col_character()))
return(tipo_objeto)
}




Expand Down
30 changes: 26 additions & 4 deletions transformador/R/sagres.R
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,31 @@ generate_contrato_id <- function(contratos_df) {
dplyr::select(id_contrato, dplyr::everything())
}

#' @title Processa datagrame de contratos
#' @title Gera um identificador único para cada participante
#' @param participantes_df Dataframe contendo informações sobre os participantes
#' @return Dataframe contendo informações sobre os participantes e seus ids
#' @rdname generate_participante_id
#' @examples
#' participantes_dt <- generate_licitacao_id(licitacoes_df)
generate_participante_id <- function(participantes_df) {
participantes_df %<>% .generate_hash_id(c("nu_licitacao", "dt_ano",
"cd_u_gestora", "tp_licitacao", "nu_cpfcnpj"),
"id_participante") %>%
dplyr::select(id_participante, dplyr::everything())
}

#' @title Processa dataframe de contratos
#' @description Manipula tabela pra forma que será utilizada no banco
#' @param contratos_df Dataframe contendo informações dos contratos
#' @return Dataframe contendo informações dos contratos processados
process_contrato <- function(contratos_df) {
contratos_df %<>% .extract_cd_municipio("cd_u_gestora") %>%
dplyr::filter(cd_municipio != "612") %>% #registro preenchido errado
generate_contrato_id()
generate_contrato_id() %>%
dplyr::mutate(language = 'portuguese')
}

#' @title Processa datagrame de licitações
#' @title Processa dataframe de licitações
#' @description Manipula tabela pra forma que será utilizada no banco
#' @param licitacoes_df Dataframe contendo informações das licitações
#' @return Dataframe contendo informações das licitações processados
Expand All @@ -47,7 +61,15 @@ process_licitacao <- function(licitacoes_df) {
generate_licitacao_id()
}

#' @title Processa datagrame de municipios
#' @title Processa dataframe dos participantes
#' @description Manipula tabela que será utilizada no banco
#' @param participantes_df Dataframe contendo informações dos participantes
#' @return Dataframe contendo informações os participantes processados
process_participante <- function(participantes_df) {
participantes_df %<>% generate_participante_id()
}

#' @title Processa dataframe de municipios
#' @description Manipula tabela pra forma que será utilizada no banco
#' @param municipios_df Dataframe contendo informações dos municipios
#' @return Dataframe contendo informações dos municipios processados
Expand Down
19 changes: 19 additions & 0 deletions transformador/R/tradutor/interface.R
Original file line number Diff line number Diff line change
Expand Up @@ -153,3 +153,22 @@ get_codigo_municipio <- function() {
translate_codigo_municipio()
}

#' @title Obtem dados dos participantes de uma licitação
#' @return Dataframe contendo informações sobre os participantes
#' @rdname get_participantes
#' @examples
#' participantes_dt <- get_participantes()
get_participantes <- function() {
participantes_dt <- read_participantes() %>%
translate_participantes()
}

#' @title Obtem dados dos fornecedores
#' @return Dataframe contendo informações sobre os fornecedores
#' @rdname get_fornecedores
#' @examples
#' fornecedores_dt <- get_fornecedores()
get_fornecedores <- function() {
fornecedores_dt <- read_fornecedores() %>%
translate_fornecedores()
}
Loading

0 comments on commit 75a2ec9

Please sign in to comment.