---
title: "Consultando processos no SEI"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Consultando processos no SEI}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", eval = FALSE)
```

O `rsei` conversa com os Web Services SOAP do SEI (Sistema Eletrônico de
Informações) e devolve os resultados como `tibble`.

> **Acesso restrito por IP.** Os Web Services do SEI só respondem a requisições
> vindas de IPs/servidores previamente autorizados no cadastro do serviço. Os
> exemplos abaixo só retornam dados quando executados a partir de um host
> autorizado. Por isso, os blocos de código desta vignette não são executados.

## Configuração

Toda função aceita um objeto `config` criado por `sei_config()`. Os valores
podem vir de argumentos, de `options(rsei.*)` ou de variáveis de ambiente
(`RSEI_*`). A `IdentificacaoServico` é a chave de acesso do serviço.

```{r}
library(rsei)

# O pacote serve a qualquer instalação do SEI: informe `sei_url` com o
# endpoint do Web Service do seu servidor.
cfg <- sei_config(
  sei_url               = "https://sei.exemplo.gov.br/sei/ws/SeiWS.php",
  sigla_sistema         = "MEU_SISTEMA",
  identificacao_servico = Sys.getenv("RSEI_IDENTIFICACAO_SERVICO")
)

# Alternativa: fixar como padrão da sessão (dispensa passar `config`)
sei_set_default_config(
  sei_url               = "https://sei.exemplo.gov.br/sei/ws/SeiWS.php",
  sigla_sistema         = "MEU_SISTEMA",
  identificacao_servico = Sys.getenv("RSEI_IDENTIFICACAO_SERVICO")
)
```

## Consultar um processo

`consultar_procedimento()` retorna um `tibble` de uma linha. Campos escalares e
estruturas 1:1 (tipo de processo, andamentos) viram colunas; coleções
(assuntos, interessados, unidades onde o processo está aberto) ficam como
*colunas-lista* de tibbles.

```{r}
proc <- consultar_procedimento("0000000000.000001/2020-11", config = cfg)

proc$Especificacao
proc$NivelAcessoGlobal            # recodificado: "público"/"restrito"/"sigiloso"
proc$TipoProcedimento_Nome
proc$UltimoAndamento_DataHora

# colunas-lista
proc$Assuntos[[1]]
proc$Interessados[[1]]
proc$UnidadesProcedimentoAberto[[1]]
```

Para obter o XML bruto (sem parse), use `raw = TRUE`:

```{r}
doc <- consultar_procedimento("0000000000.000001/2020-11", config = cfg, raw = TRUE)
```

## Consultar vários processos

`consultar_procedimentos()` (plural) consulta um vetor de protocolos e empilha
tudo num único `tibble`, com uma coluna `protocolo` e uma coluna `erro` (`NA`
quando deu certo). Um protocolo inválido não interrompe o lote:

```{r}
protocolos <- c("0000000000.000001/2020-11", "0000000000.000003/2020-33")
processos  <- consultar_procedimentos(protocolos, config = cfg)

processos[, c("protocolo", "Especificacao", "NivelAcessoGlobal", "erro")]

# processos que falharam
subset(processos, !is.na(erro), c("protocolo", "erro"))
```

## Documentos e publicações

```{r}
doc <- consultar_documento("0000001", config = cfg)
doc$Serie_Nome
doc$Assinaturas[[1]]

pub <- consultar_publicacao(id_documento = "20000002", config = cfg)
```

## Listagens

As funções `listar_*` devolvem um `tibble` com uma linha por item.

```{r}
unidades <- listar_unidades(cfg)        # todas as unidades acessíveis ao serviço
series   <- listar_series(cfg)
tipos    <- listar_tipos_procedimento(cfg)
estados  <- listar_estados(cfg)
```

## Tratamento de erros

Falhas de SOAP (`SOAP Fault`) viram erros de R com a mensagem do servidor:

```{r}
tryCatch(
  consultar_bloco("999999", config = cfg),
  error = function(e) conditionMessage(e)
)
#> "SOAP Fault em 'consultarBloco' [SOAP-ENV:Client]: Unidade ... não tem acesso ..."
```

## Operações de escrita

`gerar_procedimento()`, `incluir_documento()`, `enviar_processo()`,
`lancar_andamento()` e correlatas **alteram dados** no SEI. Valide-as em
ambiente de homologação/treino antes de usar em produção.

```{r}
novo <- gerar_procedimento(
  Procedimento(
    IdTipoProcedimento = "100000368",
    Especificacao      = "Processo de teste",
    Assuntos           = list(Assunto(CodigoEstruturado = "00.01.01"))
  ),
  config = cfg
)
novo$ProcedimentoFormatado
```
