R/fetcher_mandatos_senado.R

Defines functions fetch_mandatos_senado

Documented in fetch_mandatos_senado

#' @title Extrai informações sobre o mandato de um senador
#' @description Recebe o id de um senador e retorna um dataframe contendo informações do mandato, como legislatura,
#' data de inicio, data de fim, situacao, código e descrição da causa do fim do exercício.
#' @param id_deputado id do deputado
#' @return Dataframe contendo informações de legislatura,
#' data de inicio, data de fim, situacao, código e descrição da causa do fim do exercício.
#' @examples
#' fetch_mandatos_senado(5322)
fetch_mandatos_senado <- function(id_senador) {
  library(fuzzyjoin)
  
  url <-
    paste0("https://legis.senado.leg.br/dadosabertos/senador/",
           id_senador,
           "/mandatos")
  
  mandatos <- tryCatch({
      mandatos <- RCurl::getURL(url) %>%
      xml2::read_xml() %>%
      xml2::xml_find_all(".//Mandato") %>%
      purrr::map_df(function(x) {
        mandato <- tribble(
          ~ id_legislatura,
          ~ data_inicio_mandato,
          ~ data_fim_mandato,
          extract_text_from_node(x, "./PrimeiraLegislaturaDoMandato/NumeroLegislatura"),
          extract_text_from_node(x, "./PrimeiraLegislaturaDoMandato/DataInicio"),
          extract_text_from_node(x, "./PrimeiraLegislaturaDoMandato/DataFim"),
          extract_text_from_node(x, "./SegundaLegislaturaDoMandato/NumeroLegislatura"),
          extract_text_from_node(x, "./SegundaLegislaturaDoMandato/DataInicio"),
          extract_text_from_node(x, "./SegundaLegislaturaDoMandato/DataFim")
        ) %>%
          mutate(
            situacao =
              extract_text_from_node(x, "./DescricaoParticipacao"),
            data_inicio_mandato = as.Date(data_inicio_mandato),
            data_fim_mandato = as.Date(data_fim_mandato)
          )
        
        exercicios <- xml2::xml_find_all(x, ".//Exercicio") %>%
          purrr::map_df(function(y) {
            tribble(
              ~ data_inicio,
              ~ data_fim,
              ~ cod_causa_fim_exercicio,
              ~ desc_causa_fim_exercicio,
              extract_text_from_node(y, "./DataInicio") %>% as.Date(),
              extract_text_from_node(y, "./DataFim") %>% as.Date(),
              extract_text_from_node(y, "./SiglaCausaAfastamento"),
              extract_text_from_node(y, "./DescricaoCausaAfastamento")
            )
          }) 
        
          mandatos <- fuzzyjoin::fuzzy_full_join(
            exercicios,
            mandato,
            by = c("data_inicio" = "data_inicio_mandato",
                 "data_inicio" = "data_fim_mandato"),
            match_fun = list(`>=`, `<=`)
        ) %>% 
          arrange(data_inicio, id_legislatura) %>% 
          mutate(
            data_inicio = 
              if_else(is.na(data_inicio), 
                      data_inicio_mandato %>% as.Date(),
                      data_inicio),
            data_fim = if_else(!is.na(lead(data_fim_mandato)) & is.na(data_fim), data_fim_mandato, data_fim))
      }) 
      
      mandatos <- mandatos %>% 
        dplyr::mutate(
          id_parlamentar = as.integer(id_senador),
          casa = "senado",
          cod_causa_fim_exercicio = 
            if_else(is.na(desc_causa_fim_exercicio), 
                    as.integer(NA), 
                    as.integer(cod_causa_fim_exercicio))
          ) 
      
      mandatos <- mandatos %>%
        dplyr::select(
          id_parlamentar,
          casa,
          id_legislatura,
          data_inicio,
          data_fim,
          situacao,
          cod_causa_fim_exercicio,
          desc_causa_fim_exercicio
        )
    
  }, error = function(e) {
    data <- tribble(
      ~ id_parlamentar,
      ~ casa,
      ~ id_legislatura,
      ~ data_inicio,
      ~ data_fim,
      ~ situacao, 
      ~ cod_causa_fim_exercicio,
      ~ desc_causa_fim_exercicio
    )
    return(data)
  })
  
  return(mandatos)
}
parlametria/perfil-parlamentarR documentation built on Feb. 9, 2022, 2:08 a.m.