Forked from fernandobarbalho/gist:42606ed603a7f284aef8d117a536c41e
Created
January 16, 2025 22:44
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
####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