Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jrhumberto/e107790ba030f7d9e0dd274ea490c5be to your computer and use it in GitHub Desktop.
Save jrhumberto/e107790ba030f7d9e0dd274ea490c5be to your computer and use it in GitHub Desktop.
Função para consumo de web-service de despesa do governo do estado de São Paulo
####Aqui a função
processa_ws_sp_chamada<- function(ano,
codOrgao = "Detalhado", #Consolidado/Detalhado/<Código>
CodFonte = "Detalhado", #Consolidado/Detalhado/<Código>
CodFuncao="Detalhado", #Consolidado/Detalhado/<Código>
CodGrupo="Todos", #Todos/<Código>
CodModalidade = "Todos")#Todos/<Código>
{
# Carregar o pacote necessário
library(httr)
library(xml2)
library(tidyverse)
# URL do web service
url <- "https://webservices.fazenda.sp.gov.br/WSTransparencia/TransparenciaServico.asmx"
# Credenciais do usuário
usuario <- "usuario" # Substitua pelo nome do usuário real
senha <- "senha" # Substitua pela senha real
# Corpo da requisição SOAP, incluindo o cabeçalho de autenticação
soap_body <- sprintf('
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AutenticacaoHeader xmlns="http://fazenda.sp.gov.br/wstransparencia">
<Usuario>%s</Usuario>
<Senha>%s</Senha>
</AutenticacaoHeader>
</soap:Header>
<soap:Body>
<ConsultarDespesas xmlns="http://fazenda.sp.gov.br/wstransparencia">
<ano>%s</ano>
<codigoOrgao>%s</codigoOrgao>
<codigoFonteRecursos>%s</codigoFonteRecursos>
<codigoFuncao>%s</codigoFuncao>
<codigoGrupo>%s</codigoGrupo>
<codigoModalidade>%s</codigoModalidade>
<flagEmpenhado>0</flagEmpenhado>
<flagLiquidado>0</flagLiquidado>
<flagPago>1</flagPago>
</ConsultarDespesas>
</soap:Body>
</soap:Envelope>', usuario, senha, ano,codOrgao, CodFonte, CodFuncao,CodGrupo, CodModalidade)
# Cabeçalhos HTTP necessários
headers <- c(
"Content-Type" = "text/xml; charset=utf-8", #utf-8
"SOAPAction" = "http://fazenda.sp.gov.br/wstransparencia/ConsultarDespesas"
)
# Fazer a requisição POST
response <- POST(
url,
body = soap_body,
encode = "raw", # O corpo da mensagem não deve ser reformatado
add_headers(headers),
verbose()
)
# Verificar o status da requisição
if (status_code(response) == 200) {
# Extrair o conteúdo da resposta
xml_response <- content(response, as = "text", encoding = "UTF-8") #UTF-8
} else {
cat("Erro ao acessar o serviço: ", status_code(xml_response), "\n")
}
# Parsear o XML
xml_parsed <- read_xml(xml_response, encoding = "UTF-8")
# # Substitua "d1" pelo namespace real encontrado no arquivo
ns <- c(d1 = "http://fazenda.sp.gov.br/wstransparencia")
# Extraia os nós <ItemDespesa> dentro do namespace
itens_despesa <- xml_find_all(xml_parsed, ".//d1:ItemDespesa")
# Extraia os dados relevantes e crie um dataframe
dados <- tibble(
CodigoNomeOrgao = xml_text(xml_find_first(itens_despesa, ".//d1:CodigoNomeOrgao")),
CodigoNomeFonteRecursos = xml_text(xml_find_first(itens_despesa, ".//d1:CodigoNomeFonteRecursos")),
CodigoNomeTipoLicitacao = xml_text(xml_find_first(itens_despesa, ".//d1:CodigoNomeTipoLicitacao")),
CodigoNomeFuncao = xml_text(xml_find_first(itens_despesa, ".//d1:CodigoNomeFuncao")),
NaturezaDespesaNomeItem = xml_text(xml_find_first(itens_despesa, ".//d1:NaturezaDespesaNomeItem")),
ValorEmpenhado = xml_text(xml_find_first(itens_despesa, ".//d1:ValorEmpenhado")),
ValorLiquidado = xml_text(xml_find_first(itens_despesa, ".//d1:ValorLiquidado")),
ValorPago = xml_text(xml_find_first(itens_despesa, ".//d1:ValorPago")),
ValorPagoAnosAnteriores = xml_text(xml_find_first(itens_despesa, ".//d1:ValorPagoAnosAnteriores"))
)
# Limpeza dos valores numéricos
dados <-
dados %>%
mutate(
ValorEmpenhado = as.numeric(str_remove_all(ValorEmpenhado,"[.]") %>% str_replace_all("[,]",".")),
ValorLiquidado = as.numeric(str_remove_all(ValorLiquidado,"[.]") %>% str_replace_all("[,]",".")),
ValorPago = as.numeric(str_remove_all(ValorPago,"[.]") %>% str_replace_all("[,]",".")),
ValorPagoAnosAnteriores = as.numeric(str_remove_all(ValorPagoAnosAnteriores,"[.]") %>% str_replace_all("[,]","."))
)
dados <-
dados %>%
filter(NaturezaDespesaNomeItem!="TOTAL") %>%
mutate(ano = ano) %>%
select(ano, CodigoNomeOrgao:ValorPagoAnosAnteriores)
dados
}
###Aqui um exemplo de consumo atômnico da função
dados_2010<- processa_ws_sp_chamada(ano=2010,
CodGrupo = 31,
codOrgao = "Consolidado",
CodFonte = "Consolidado")
###Aqui um exemplo de consumo vetorial da função. No caso o vetor é de anos
dados_2010_2020<-
map_dfr(2010:2020,function(a_ano){
processa_ws_sp_chamada(a_ano,
CodGrupo = 31,
codOrgao = "Consolidado",
CodFonte = "Consolidado" )
})
###Aqui um exemplo de geração de gráfico com o dado anterior
library(colorspace)
dados_grafico<-
dados_2010_2020 %>%
filter(NaturezaDespesaNomeItem != "TOTAL") %>%
summarise(total_funcao = sum(ValorPago+ValorPagoAnosAnteriores),
.by = c(CodigoNomeFuncao)) %>%
mutate(CodigoNomeFuncao = reorder(CodigoNomeFuncao, total_funcao))
dados_grafico %>%
mutate(total_funcao = total_funcao/10^9) %>%
ggplot(aes(y=CodigoNomeFuncao, x= total_funcao)) +
geom_col(aes(fill= total_funcao), show.legend = FALSE) +
geom_text(aes(label = round(total_funcao,1)), color = "white",hjust = -0.1,size=3) +
scale_fill_continuous_sequential(palette = "Heat 2") +
scale_x_continuous(expand = expansion(mult = c(0, 0.1))) +
theme_light() +
theme(
panel.background = element_rect(fill= "black"),
panel.grid = element_blank(),
axis.text.x = element_blank()
) +
labs(
title = "Despesas de pessoal acumuladas por função em SP",
subtitle = "Período de 2010 a 2020. Valores em R$ bi",
x= "",
y="",
caption = "Fonte: Portal da transparência de São Paulo. Elaboração: Fernando Barbalho"
)
ggsave(filename = "despesa_pessoal_sp_2010_2020.png", width = 10, height = 6, dpi=300)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment