Manual do Ecossistema de Movimentação de Pessoal
Do Data Lake ao painel publicado: o que o sistema faz, como rodar, o que cada número significa, que norma o sustenta e o que fazer quando algo dá errado.
O que este ecossistema faz
Uma pergunta de política de pessoal, respondida com o dado que já existe.
O Governo federal movimenta servidores entre órgãos o tempo todo: cede, requisita, redistribui cargos, autoriza afastamentos. Cada um desses atos deixa rastro no SIAPE, mas o rastro é bruto — códigos, registros duplicados por matrícula, duas pontas do mesmo movimento em linhas diferentes. Responder “quantas pessoas o Ministério X cedeu e recebeu, e isso respeita a proporcionalidade do §7º do art. 93?” exigia dias de planilha.
Este ecossistema faz esse caminho todo dia, sozinho: lê o Data Lake, reconstrói cada movimentação, aplica as regras da norma e entrega nove painéis de página única que abrem no navegador, sem servidor e sem instalação para quem consulta.
O que é, e o que não é#
- É
- Um retrato do SIAPE numa competência, com as regras de negócio já aplicadas e as fontes declaradas em cada tela.
- Não é
- Um sistema transacional. Nada aqui altera o SIAPE — o fluxo é de leitura, só.
- É
- Uma ferramenta de acompanhamento: indica onde olhar, quantifica, compara com a norma.
- Não é
- A apuração oficial de nenhum indicador. Quando um decreto manda o MGI divulgar um número, o número oficial é o do MGI; aqui é acompanhamento com fonte declarada.
Como as peças se encaixam#
Todo número na tela tem de dizer de onde veio e de quando é. Por isso cada painel carrega a competência de referência no cabeçalho, e cada afirmação de conformidade é amarrada a essa competência — “na competência 06/2026, atende”, nunca “atende”.
Os números desta rodada
Quanto há de cada coisa, de quando é, e o que foi lido para dizer isso.
Este capítulo é gerado: as contagens abaixo saem dos arquivos da última rodada, no momento em que o manual é montado. Se um número aqui estiver velho, é porque o manual não foi refeito depois da rodada — não porque alguém esqueceu de editar o texto.
Volume de cada painel#
| Painel | Escala | Observação |
|---|---|---|
| Movimentações | 215.590 movimentações | 53.820 vigentes na competência |
| Proporcionalidade | 364 órgãos | placar de cede × recebe |
| Pessoal | 35.3 MB de painel | cubo agregado, sem nome nem CPF |
| Anistiados | 2.7 MB de painel | Lei 8.878/94 |
| Redistribuição | 12.8 MB de painel | art. 37 |
| LIP | 3.7 MB de painel | art. 91 |
| Radar do Exterior | 21.2 MB de painel | art. 96 — em revisão |
| Quinquênio | 20.0 MB de painel | art. 87 — em revisão |
| Limites de Reembolso | 0.5 MB de painel | SIAPE + SIOP |
Limites de reembolso — exercício 2026#
A execução orçamentária vem da extração manual do SIOP mais recente na pasta de dados: Extrator1788435198276.csv, de 03/09/2026 às 08:52. O painel usa só a mais recente por exercício — somar duas extrações do mesmo ano dobraria a despesa.
Planilhas internas da última rodada#
Ficam em PASTA_DADOS/planilhas_internas/ e não vão para a web — ver o capítulo das planilhas internas.
Cobertura das taxonomias da equipe#
Estes dois números dizem quanto do painel se apoia em classificação em dia. Rode Conferir taxonomias no assistente para a lista do que falta.
Arquitetura em alto nível
Quatro camadas, cada uma com uma responsabilidade só.
Consulta o Data Lake (Databricks) e grava parquet cru em PASTA_DADOS/raw.
Reconstrói as movimentações, aplica dimensões e taxonomias.
Demografia, tempo, remuneração, liderança, vagas.
CSV, JSON de agregados e o relatório de QA.
Cada gerador lê a saída e cospe um HTML autocontido.
Por que os painéis são HTML de arquivo único#
Cada painel embute os próprios dados e o próprio JavaScript. Não há servidor, banco, API nem build. As consequências práticas:
- Quem consulta só precisa de um navegador — abre até de um pen drive.
- Publicar é copiar arquivo. Não há infraestrutura para cair às 23h de uma sexta.
- Em compensação, os arquivos são grandes (o painel de Pessoal passa de 35 MB) e todo o dado embutido é legível por quem tiver o arquivo — ver o capítulo de privacidade.
O código, em pastas#
| Onde | O que mora ali |
|---|---|
pipeline/src/ | O pipeline: extração, transformações, esquema de saída, configuração. |
pipeline/src/transform/ | As regras de negócio. movimentacao.py reconstrói os movimentos; taxonomia.py lê a classificação de liderança; dimensoes.py junta as tabelas de apoio. |
pipeline/painel/ | Um gerador por painel (gerar_*.py), mais o visual e as utilidades compartilhadas em _comum.py. |
pipeline/reference/ | As tabelas que a equipe mantém — versionadas no projeto, porque são decisão nossa, não dado do Data Lake. |
manual/ | Este manual (HTML e .docx) e os geradores dele. |
O painel de Movimentações (gerar_painel.py) tem CSS próprio e não usa o BASE_CSS compartilhado. Toda correção de estilo compartilhado precisa ser aplicada nos dois lugares, senão ela vale em oito painéis e falha justamente no maior.
Pré-requisitos e instalação
O que precisa existir na máquina antes do primeiro comando.
- Python 3.11 ou mais novo
Confira com
python --version. O projeto roda no Anaconda ou no Python oficial — tanto faz, desde que seja o mesmo interpretador em todos os passos. - Acesso ao Data Lake
Credenciais do Databricks do MGI. Sem elas dá para gerar painéis a partir de uma extração que já esteja em
PASTA_DADOS, mas não para atualizar a base. - A pasta de dados
Um lugar fora do projeto para os dados sensíveis — tipicamente a pasta da equipe no OneDrive. Ver o capítulo seguinte.
- As bibliotecas
O assistente instala tudo sozinho. Manualmente:
pip install -r requirements.txt.
Ambiente virtual (opcional, recomendado)#
O assistente cria e usa um ambiente virtual se você quiser, pela aba Ambiente. Na mão:
cd C:\0_Desenvolvimento\Movimentacao_pessoal\pipeline python -m venv C:\projetos_ia\venv_ia C:\projetos_ia\venv_ia\Scripts\activate pip install -r requirements.txt
Não precisa. O ambiente virtual serve para isolar versões de biblioteca quando a mesma máquina roda vários projetos. Se esta máquina só roda este, o Python do sistema basta.
Configuração: o arquivo .env
Uma linha define onde os dados moram. É a configuração que mais importa.
Na raiz do projeto existe um arquivo .env. Ele não vai para o repositório e guarda o que é específico da máquina e da pessoa.
PASTA_DADOS=C:\Users\voce\OneDrive - Ministério...\Base de Dados\Movimentações DATABRICKS_SERVER_HOSTNAME=... DATABRICKS_HTTP_PATH=... DATABRICKS_TOKEN=...
| Variável | Para que serve | Se faltar |
|---|---|---|
PASTA_DADOS | Raiz dos dados: raw/, staging/ e output/ nascem dentro dela. | Cai para pipeline/data, dentro do projeto — evite: dado sensível acaba no repositório. |
DATABRICKS_* | Credenciais de leitura do Data Lake. | Não dá para extrair. Os painéis ainda geram, se já houver extração na pasta. |
Já aconteceu: ao mudar a pasta, o cache de vagas por órgão ficou para trás e o painel passou a mostrar vagas em branco sem avisar. Hoje esse cache é gravado também em pipeline/reference/ (é dado público) e a falta dele vira erro destacado no log. Ainda assim, depois de mudar a pasta, rode a conferência de chaves.
Onde ficam os dados
Fora do projeto, sempre. E por quê.
O repositório de código é versionado e circula; a base do SIAPE tem nome, CPF e remuneração de mais de um milhão de pessoas. As duas coisas não podem morar juntas.
| Pasta | Conteúdo | Versionado? |
|---|---|---|
PASTA_DADOS/raw/ | Parquet cru vindo do Data Lake (fato_servidor, dim_*, ficha financeira). | Não |
PASTA_DADOS/staging/ | Intermediários do pipeline. | Não |
PASTA_DADOS/output/ | Saídas: movimentacoes_painel.csv, saldo_orgaos.csv, agregados_painel.json, referencia.json e os relatórios de QA. | Não |
pipeline/reference/ | Tabelas mantidas pela equipe. Nenhum dado pessoal. | Sim |
pipeline/painel/*.html | Os painéis gerados. | Não (são grandes e refeitos a cada rodada) |
O arquivo de referência da competência#
output/referencia.json guarda a competência do último processamento. É a guarda contra um problema real que já ocorreu: o fatoServidor voltar uma competência antiga sem ninguém notar. Se a competência recuar, o painel avisa a defasagem em vez de exibir número velho como se fosse novo.
Como executar
Três caminhos, do mais guiado ao mais direto.
Caminho 1 — o aplicativo (recomendado)#
Dois cliques em Assistente CGMOP.vbs. Abre uma janela com as etapas marcáveis, log ao vivo, botão de cancelar e as abas de manutenção. É o caminho para quem não programa.
Caminho 2 — o menu de texto#
cd C:\0_Desenvolvimento\Movimentacao_pessoal\pipeline python assistente.py
A mesma coisa que a janela, em perguntas numeradas no terminal. Serve para máquina sem interface gráfica ou para quem prefere teclado.
Caminho 3 — um comando para tudo#
cd C:\0_Desenvolvimento\Movimentacao_pessoal\pipeline python atualizar_tudo.py # ETL → painéis → planilhas → publicação (pergunta antes do push) python atualizar_tudo.py --atualizar # antes, re-extrai do Data Lake (login Azure) python atualizar_tudo.py --sem-push # faz tudo, menos o git python atualizar_tudo.py --sem-planilhas # pula as planilhas internas (o passo mais lento) python atualizar_tudo.py --planilhas inconsistencias # exporta SÓ essa(s) python atualizar_tudo.py --planilhas-listar # mostra as chaves e sai python atualizar_tudo.py --sim # não pergunta: confirma o push
É o que os botões Atualizar tudo e Re-extrair do assistente chamam por baixo. Uma etapa que falha não derruba as seguintes — exceto o ETL, que é obrigatório: se ele falha, nada adiante faz sentido e nada é publicado. Ao final, grava um relatório Excel da rodada em pipeline/relatorios_execucao/, com a aba Números e a verificação “Balanço cede == recebe?”.
Caminho 4 — comando a comando#
Sempre de dentro de pipeline/:
python -m src.main # 1. reprocessa a base (5 etapas) python painel/gerar_painel.py # 2. painel de Movimentações (interno) python painel/gerar_painel_publico.py # versão aberta, sem proporcionalidade python painel/gerar_anistiados.py python painel/gerar_pessoal.py python painel/gerar_redistribuicao.py python painel/gerar_lip.py python painel/gerar_internacional.py python painel/gerar_capacitacao.py python painel/gerar_reembolso.py python painel/gerar_hub.py # 3. a home do ecossistema python -m src.exportar_planilhas_internas # planilhas internas (Excel, sem máscara) python ..\manual\gerar_manual_html.py # este manual, com os números da rodada python painel/publicar_cgmop.py # 4. copia para a pasta do site (NÃO faz git push)
É o único script do projeto que age só de ser chamado. Antes de rodar qualquer script à mão, abra-o e procure por argparse: os que têm são main.py, atualizar_tudo.py e conferir_taxonomias.py. Os geradores e o publicador não têm.
Os geradores leem a saída do pipeline. Rodar gerar_painel.py antes de src.main gera um painel com os dados da rodada anterior — sem erro nenhum na tela. O hub por último, porque ele lê os agregados e o estado de publicação de cada painel.
Quanto tempo leva#
| Etapa | Ordem de grandeza |
|---|---|
| Pipeline completo | 3 a 4 minutos |
| Painel de Movimentações | 1 a 2 minutos (39 MB de saída) |
| Painel de Pessoal | 2 a 3 minutos (cubo de ~560 mil combinações) |
| Demais painéis | segundos a 1 minuto cada |
| Publicação + push | 1 a 2 minutos, mais o tempo de propagação do site (~1 min) |
O assistente, aba por aba
A interface pensada para quem não abre um terminal.
O Assistente CGMOP reúne tudo o que se faz com o ecossistema: buscar os dados, reprocessar a base, gerar os painéis, publicar, cuidar de quem entra e do que fica no ar. Abre com dois cliques em Assistente CGMOP.vbs (na pasta pipeline/) ou pelo atalho da Área de Trabalho. Este capítulo percorre cada aba e cada botão.
O que está sempre na tela#
- À direita, o log
- Tudo o que roda escreve ali, linha a linha, na hora. É onde se lê por que uma etapa falhou. Limpar apaga a tela do log; não apaga nada no disco.
- No rodapé, ■ Cancelar
- Só acende enquanto algo está rodando. Encerra o processo em andamento (e tudo o que ele abriu) e pula as etapas que faltavam. Vale para uma extração longa, para a instalação de bibliotecas e até para um
git pushque você percebeu cedo demais. Fechar a janela no meio de uma execução também encerra o processo — nada fica rodando escondido. - Último relatório
- Abre o Excel da última rodada (
pipeline/relatorios_execucao/): o que rodou, quanto tempo levou, e os números com a verificação “cede == recebe”. - Aviso de bibliotecas
- Ao abrir, o assistente confere em segundo plano se todas as bibliotecas do
requirements.txtestão instaladas. Se falta alguma, um aviso no topo diz qual e aponta para a aba Ambiente. A janela não trava enquanto verifica. - Memória entre sessões
- Pasta de dados, ambiente virtual, dados locais e a duração de cada etapa ficam em
pipeline/.assistente_prefs.json. Na próxima abertura, tudo vem como você deixou.
0 · Início — onde se começa e onde se decide#
Três cartões. O que este assistente faz explica o ciclo em três passos (a base, os painéis, a publicação). Como está o projeto agora é um diagnóstico lido dos arquivos, não uma suposição: a pasta de dados em uso, a competência (e se a folha está alinhada com ela), quando a base foi gerada e o tamanho, quantas tabelas há em cache, quantos painéis foram gerados e quando, e quantos usuários o portão tem. 🔄 Verificar de novo relê tudo.
- ▶ Atualizar tudo (verde)
- O caminho recomendado. Reprocessa a base a partir do cache — sem baixar nada, sem pedir login —, gera os nove painéis e as planilhas internas, prepara a publicação e pergunta antes de mandar para o ar. Leva alguns minutos.
- ⟳ Re-extrair do Data Lake (âmbar)
- Igual ao anterior, mas antes baixa os dados do Data Lake de novo. Abre o navegador para o login do Azure e demora bem mais. Use quando o SIAPE publicar uma competência nova — não para refazer um painel.
- 📤 Só publicar (azul)
- Pula o processamento: copia os painéis já gerados para a pasta do site, injeta o login e oferece o envio. Para quando você só mexeu em usuários ou no que fica no ar.
- Criar atalho
- Cria DOIS atalhos com o ícone do projeto: um na sua Área de Trabalho (a real, onde quer que o Windows a tenha posto) e outro dentro da pasta
pipeline/, chamado “Abrir Assistente CGMOP”. O segundo existe porque oAssistente CGMOP.vbsaparece no Explorer com o ícone do Windows Script Host e não há como mudar isso — o Explorer usa o ícone do TIPO de arquivo (.vbs), que é do registro e vale para toda a máquina. Atalho, sim, aceita ícone próprio.
1 · Pipeline — as etapas, uma a uma#
Cada linha é um programa do pipeline, agrupado em Base (o ETL), Painéis (Movimentações interno e público, Anistiados, Pessoal, Redistribuição, Hub), Estudos (LIP, Afastamento Internacional, Licença Capacitação, Limites de Reembolso), Extras (planilhas internas, conferir chaves do reembolso, conferir taxonomias) e Publicação. Ao lado de cada uma, o ▶ roda só aquela etapa — é o botão de quem mudou um painel e não quer reprocessar tudo. O tempo à direita é o da última execução, como estimativa.
- Executar selecionadas
- Marque a caixa das etapas que quer e rode as várias de uma vez. Elas rodam SEMPRE na ordem da lista — não na ordem em que você marcou —, porque é a ordem em que dependem umas das outras (o ETL alimenta os painéis; o hub lê o estado de todos). O assistente mostra a lista e pede confirmação antes, e guarda a seleção para a próxima abertura. «Marcar todas» e «Limpar seleção» ao lado.
- Quais planilhas exportar
- Na linha das Planilhas internas há um painel recolhível com uma caixa por base (movimentações, proporcionalidade, anistiados, pessoal, redistribuição, reembolso, LIP, internacional, capacitação, pós-graduação). A rodada completa leva dezenas de minutos — quase tudo em Pessoal, que são três arquivos de mais de 100 MB —, então quem mexeu só numa base não precisa esperar o resto. Nenhuma marcada = saem todas, que é o comportamento de sempre. Pela linha de comando:
python -m src.exportar_planilhas_internas --bases anistiados,lip(e--listarmostra as disponíveis). - O ícone de status
- ○ aguardando · ◐ rodando · ✓ ok · ✕ falhou · – pulado. O ETL é obrigatório: se ele falha, as demais são puladas e nada é publicado — senão iria ao ar dado velho.
- De onde vêm os dados
- O caminho da
PASTA_DADOS(raw e output). Normalmente é a pasta do OneDrive do.env; o botão … escolhe outra. A caixa usar dados locais troca parapipeline/data, que é para teste — desmarcar volta ao.env.
Rodar o painel antes do ETL gera um painel com os dados da rodada anterior — sem erro nenhum na tela. O hub por último, porque lê os agregados e o estado de publicação. Na dúvida, Atualizar tudo, que já respeita a ordem.
2 · Usuários — quem entra nos painéis restritos#
A tabela mostra os usuários do portão (senha mascarada; mostrar senhas revela). Clicar numa linha carrega a pessoa nos campos de baixo para editar. O usuário é nome.sobrenome e a senha é a data de nascimento em ddmmaaaa — o login aceita com ou sem barras, e não distingue maiúsculas.
- + Incluir / Atualizar
- Põe na lista da tela: usuário novo entra, usuário que já existe tem a senha trocada. Senha que não pareça uma data (8 dígitos) pede confirmação. Nada vai ao disco ainda — o rodapé passa a dizer “alterações NÃO salvas”.
- ✕ Remover selecionado
- Tira da lista o usuário marcado. Recusa remover o último — ninguém conseguiria entrar.
- Limpar campos
- Esvazia os dois campos.
- 💾 Salvar lista
- Grava em
painel/.usuarios_portao.json(fora do repositório publicado), guardando a lista anterior num backup com data e hora ao lado. - 🔄 Recarregar
- Relê o arquivo e descarta o que não foi salvo.
- 📤 Salvar e publicar
- Salva, regenera o login de todas as páginas e publica — perguntando antes do envio. Sem publicar, a mudança não vale no site.
O login não impede quem souber o endereço de baixar o arquivo: existe para evitar acesso casual. A senha é a data de nascimento da própria pessoa, e quem baixar o HTML e insistir consegue descobri-la. É por isso que os painéis não carregam dado sensível individual — ver o capítulo de privacidade.
3 · O que fica no ar — publicar, anunciar ou esconder#
Para cada painel, três estados: no ar (publicado com link), em revisão (o cartão aparece no hub, sem link, e o arquivo não é copiado — serve para anunciar um estudo cujo número ainda está sendo conferido) e não aparece. Um resumo abaixo da lista diz quantos estão em cada estado. A escolha fica em painel/.no_ar.json e só vale no site depois de publicar.
- Salvar escolha
- Grava o arquivo; não publica.
- Marcar tudo como no ar
- Atalho para voltar todos ao estado publicado (ainda precisa salvar).
- Salvar e publicar agora
- Grava, gera o hub de novo e publica com esta escolha. Painéis fora do ar são removidos da pasta publicada — o que estava no ar sai do ar.
4 · Tabelas — as bases que a equipe mantém#
Tudo o que o sistema usa e não vem do Data Lake — taxonomias, portarias, a remessa de aposentadoria do INSS — está listado aqui, com o caminho, o tamanho, a data e quem lê cada arquivo. A lista vem de um registro único no código (src/referencias.py): base nova cadastrada lá aparece aqui sozinha. Os detalhes de cada base e das três ações estão no capítulo seguinte.
- Clicar no NOME da tabela
- Abre a pasta onde o arquivo está, no Explorer. É o caminho mais curto para a pergunta mais frequente desta aba: “onde isso fica?”.
- Abrir
- Abre no programa certo (Excel para planilha e CSV). Salvar já basta — o painel usa na próxima geração.
- Pasta
- Abre a pasta onde o arquivo está — o mesmo que clicar no nome.
- Substituir…
- Troca o arquivo inteiro por um que você recebeu. O anterior vai para um backup datado ao lado.
- Apontar…
- Faz o pipeline ler de outro lugar, sem mover nada. Um selo “repontado” passa a aparecer na linha.
- Soltar
- Só aparece numa base repontada: volta ao lugar padrão.
- Conferir chaves do reembolso
- Confere se todo órgão com teto tem cadastro, se a execução do SIOP foi 100% atribuída e se todo cedido tem titular. Quando falta, diz o arquivo e a linha.
- Conferir taxonomias
- Lista as funções e os órgãos que estão nos dados e ainda não foram classificados, com o volume de vínculos e os códigos prontos para colar.
- Apagar meses anteriores…
- No cartão das pastas, na linha das planilhas internas: varre da pasta da equipe tudo o que não é da referência atual dos dados. Diz antes quantos arquivos e quantos MB vão sair, e pede confirmação. Arquivo aberto no Excel é pulado, com aviso — feche e repita.
Conferir taxonomias. Rode antes de fechar qualquer número de liderança: o que falta na taxonomia não some do painel, aparece como “fora da taxonomia” — que é pior de explicar.
5 · Ambiente — Python e bibliotecas#
Um ambiente virtual isola as bibliotecas deste projeto das do resto do computador. Não é obrigatório: sem ele, tudo roda no Python do sistema.
- Caminho do ambiente + …
- A pasta do venv (editável; … escolhe).
- usar este ambiente virtual nas etapas
- É o que “ativa” o ambiente aqui: as etapas passam a rodar com o Python de dentro dessa pasta. Se ele ainda não existir, o assistente avisa e usa o do sistema. Não há
activatenem PATH para mexer. - Criar / instalar aqui
- Cria o venv na pasta (se não existir) e instala nele todas as bibliotecas do
requirements.txt, com o pip aparecendo no log. - Instalar bibliotecas
- Instala ou atualiza todas as bibliotecas no ambiente em uso.
- Instalar uma biblioteca específica
- Campo + Instalar (ou Enter): o mesmo que
pip install <nome>. Para quando o aviso do topo diz que falta só uma.
6 · Comandos — o PowerShell dentro do assistente#
De vez em quando aparece um comando para rodar à mão — --completar-cache para buscar uma tabela nova, --listar para ver as bases. Esta aba existe para você não precisar sair do assistente. E o ganho não é o console: é o console já pronto. Digite ou cole o comando, tecle Enter, e a saída aparece no mesmo log da direita, com o ■ Cancelar valendo.
- Campo de comando
- Enter executa. As setas ↑ e ↓ passeiam pelos comandos que você já usou (ficam guardados nas preferências); a setinha à direita abre a lista inteira.
- Comandos que você mais usa
- Botões para os cinco de sempre: completar cache, atualizar tudo, ver referências, listar as planilhas internas e conferir qual Python está em uso. Um clique põe o comando no campo e já roda.
- Abrir PowerShell aqui
- Abre uma janela separada, já na pasta do projeto e com o mesmo ambiente. Use quando o comando pergunta alguma coisa.
O comando já sai na pasta do projeto (sem isso, -m src.main daria “No module named src”), com o Python da aba Ambiente (sem isso, o venv marcado na tela não valeria para o que você digita) e com a PASTA_DADOS definida (sem isso, o script procuraria os dados onde não há). O rodapé do cartão mostra os três, para você conferir antes de rodar.
cd ... && na frente?Pode colar. O assistente tira o cd (ele já está na pasta certa) e avisa no log. E como o Windows PowerShell 5.1 não entende &&, ele troca por ; e diz que trocou — a diferença é que o ; roda o comando seguinte mesmo se o anterior falhar.
Ele mostra a saída, mas não consegue responder. Um comando que pergunta alguma coisa — o git push pedindo usuário e senha é o caso clássico — ficaria pendurado esperando uma resposta que nunca chega. Para esses, use Abrir PowerShell aqui.
É um terminal de verdade, com os seus poderes de usuário. O assistente só pergunta antes quando reconhece um comando que apaga ou reescreve coisas (Remove-Item, git reset --hard, git push --force…) — a conferida do que você colou continua sendo sua.
As tabelas que a equipe mantém
Onde a realidade entra no sistema sem passar por programação.
Boa parte do que o painel afirma não vem do Data Lake: vem de classificações que a CGMOP mantém e de arquivos que ela recebe. Portaria nova, ministério criado, agência que troca de pasta, função nova, remessa do INSS — nada disso é código, é cadastro. Todas estas bases estão na aba Tabelas do assistente, cada uma com três ações: Abrir, Substituir… e Apontar….
Desde 10/09/2026 a lista destas bases mora num único lugar, src/referencias.py — com o caminho padrão, quando se mexe em cada uma e quem a lê. O pipeline lê o caminho de lá; o assistente monta a aba de lá. Antes eram duas listas, e a segunda ficou para trás na primeira oportunidade: a remessa do INSS entrou no pipeline e o assistente nunca soube que ela existia. Quem for acrescentar uma base cadastra no registro e pronto — aparece na aba sem tocar na interface.
| Arquivo | O que define | Quando mexer |
|---|---|---|
limites_reembolso.csv | Teto de reembolso por órgão e por ano, com a portaria e o link. | Saiu portaria nova: copie o bloco do ano anterior, troque ano, valores, nome e link. |
reembolso_titulares_limite.csv | Quem é titular de limite. | Entrou órgão no anexo da portaria, ou a agência mudou de ministério supervisor. |
reembolso_orgaos_siape_siop.csv | De-para entre o órgão de destino e o titular do teto. | Apareceu cedido num órgão fora da lista. |
estatais_sest.csv | Natureza estatal: dependente ou não do Tesouro. | Empresa privatizada, criada, ou que mudou de dependência (fonte: listas da SEST/MGI). |
FUNÇÕES.xlsx | Nível de liderança de cada função — Alta × Baixa/Média. | Função nova, ou o painel acusando “Função fora da taxonomia” com volume. |
AGRUPAMENTO ÓRGÃOS - SETOR.xlsx | Setor, administração e poder de cada órgão. | Órgão criado ou renomeado na reforma administrativa. |
CONCEITOS SITUAÇÕES FUNCIONAIS.xlsx | O texto que explica cada situação do SIAPE nos painéis. | Conceito confuso, ou norma que mudou. |
CORTE 08-2020.xlsx | Ajuste de datas anterior ao corte de agosto/2020. | Praticamente nunca. |
municipios.csv | Nome e UF canônicos por código IBGE. | Praticamente nunca. |
reembolso_cct.csv | Reajuste por acordo coletivo (CCT) de cada empresa cedente, com a data-base. | Empresa cedente aparecendo sem índice na conferência de chaves. |
Anistiados_aposentados.xlsx | Retorno do SUIBE/INSS a uma relação de CPF do MGI: espécie, DIB, DDB e situação do benefício de cada anistiado. Alimenta o filtro, o gráfico e as colunas de aposentadoria do painel. | Chegou remessa nova do INSS: Substituir… na aba Tabelas. |
grupos_orgaos_reembolso.csv | Diz em qual dos três grupos cada órgão do painel de reembolso entra — serviços compartilhados, agências reguladoras ou demais —, o que dá a cor das barras e o filtro de grupo. | O Centro de Serviços Compartilhados passou a atender outra pasta, ou foi criada/extinta uma agência. |
A classificação não é deduzida do Anexo da portaria. O Anexo II é “agências reguladoras”, mas o Anexo I mistura as 13 pastas atendidas pelos serviços compartilhados com todo o resto — são recortes diferentes, que respondem a perguntas diferentes.
Por isso existe a tabela. Só os dois primeiros grupos precisam ser cadastrados: órgão que não estiver no arquivo cai em “demais”. Acrescentar uma pasta é acrescentar UMA linha (código SIAPE, sigla e grupo), não manter uma lista de 47. A semente veio da página de órgãos atendidos do gov.br (13 pastas) e das leis instituidoras das 11 agências reguladoras federais.
A extração do SIOP não é tabela — é arquivo que você baixa#
A execução orçamentária do painel de reembolso vem de uma extração manual do SIOP, salva com o nome que o próprio SIOP deu (Extrator<número>.csv). O lugar da equipe é PASTA_DADOS/ext_limites_reembolso/ — há um atalho para ela no cartão de pastas da aba Tabelas. A raiz da pasta de dados e a antiga subpasta siop/ continuam sendo lidas, para quem já guardou lá.
Por isso o painel usa só a mais recente de cada exercício para os números — somar duas do mesmo ano dobraria a despesa. As anteriores servem para desenhar a evolução dentro do ano. Se não houver extração nenhuma, o log avisa e o painel sai sem execução orçamentária (não quebra, mas mostra zero).
Substituir, apontar, soltar — e onde isso fica gravado#
- Substituir…
- É a operação do dia a dia (“chegou remessa nova”, “saiu portaria”). Você escolhe o arquivo; o atual é copiado para
nome_backup_AAAAMMDD_HHMM.extao lado e o novo entra no lugar. Formato diferente do atual pede confirmação. O backup acontece sempre, também pela linha de comando — a regra mora no registro, não no botão. - Apontar…
- O pipeline passa a ler de outro caminho, sem mover o arquivo. A escolha fica em
reference/.caminhos.json, e a linha da aba ganha o selo “repontado”. Soltar volta ao padrão e apaga a anotação. - A escada de decisão
- Para cada base, vale nesta ordem: a variável de ambiente
REF_<CHAVE>(para fixar numa máquina sem editar nada) → o.caminhos.json→ o caminho padrão emreference/. É a mesma escada daPASTA_DADOSe do repositório do site. - Conferir pelo terminal
python -m src.referenciaslista as bases, onde cada uma está, tamanho, data e de onde veio a decisão do caminho.
Por que o limite de reembolso é procurado em dois lugares#
O limites_reembolso.csv é lido primeiro da PASTA_DADOS e só depois de reference/. Assim a equipe cadastra a portaria nova junto com os dados, sem precisar mexer no repositório; a cópia versionada fica como semente e rede de segurança. O log diz sempre qual dos dois foi usado.
Em 04/09/2026 o exercício 2026 apareceu com 47 links diferentes para a mesma portaria, com o número final incrementando (…601, …602, …). É a marca do arrastar-célula do Excel: ao puxar a fórmula para baixo, ele incrementou o id da URL. Um ato do DOU tem um id — 46 daqueles endereços não existiam. Hoje o gerador avisa quando um exercício tem mais de um valor distinto em portaria ou link.
- Arrastar célula incrementa números dentro de texto, inclusive dentro de URLs.
- Ponto e vírgula dentro de um campo desloca todas as colunas da linha (já aconteceu no
reembolso_cct.csv). - Salvar como CSV mantendo o separador
;e a codificação UTF-8.
O pipeline, etapa por etapa
O que acontece entre o comando e o CSV.
Etapa 1 — Extração#
Consulta o Data Lake e grava parquet cru em raw/: o fato_servidor (o retrato de cada vínculo), as dimensões (órgão, situação, cargo, cor/raça, escolaridade, unidade organizacional…) e a ficha financeira da competência mais recente disponível.
É proposital. Se o Data Lake deixar de entregar uma coluna, o campo correspondente fica vazio com um aviso no log em vez de a rodada inteira quebrar. Em compensação, é preciso ler o log: uma coluna que sumiu em silêncio vira um painel com um filtro morto.
Etapa 2 — Montagem das movimentações#
É a etapa com mais regra de negócio, porque o SIAPE não tem uma tabela de movimentações. Cada movimento deixa duas marcas, em registros diferentes: a saída no órgão de origem e a entrada no de destino. O pipeline casa as duas por CPF e data.
- Deduplicação por matrícula: o mesmo servidor tem um registro por vínculo. Sem tratar, cada matrícula geraria uma linha do mesmo movimento. Mantém-se um por (CPF, origem, destino, data de ingresso), priorizando o ativo.
- Origem == destino sai fora: não é movimentação entre órgãos, é resíduo de reforma administrativa (o órgão trocou de código, não a pessoa de casa).
- GDF e DPU: movimentos internos ao Governo do DF saem; quem tem só uma ponta no GDF fica.
- Colapso de reforma: quando o órgão se transformou (MP → ME → MGI), a trilha vira uma cadeia de siglas em vez de várias movimentações falsas.
Etapa 3 — Dimensões e taxonomias#
Códigos viram nomes legíveis, e entram as classificações da equipe: setor e poder do órgão, natureza estatal pelas listas da SEST, conceitos das situações funcionais.
Etapa 4 — Enriquecimento#
Demografia, tempo de movimentação, remuneração da ficha financeira, nível de liderança e vagas por órgão. É aqui que se aplica a taxonomia de funções.
Etapa 5 — Exportação#
| Arquivo | O que é |
|---|---|
movimentacoes_painel.csv | A base — uma linha por movimentação, 70 colunas. |
saldo_orgaos.csv | Placar por órgão: cede, recebe, saldo, vagas aprovadas e ocupadas. |
agregados_painel.json | Contagens pré-calculadas que o painel usa sem varrer a base. |
referencia.json | A competência processada — guarda contra retrocesso de data. |
qa_inconsistencias_AAAAMMDD.xlsx | O que o pipeline achou estranho e não corrigiu sozinho. |
Conceitos que mudam o número
As definições que, se lidas errado, levam à conclusão errada.
Vigente ≠ ativo#
Vigente é o vínculo que ainda existe no SIAPE — inclui aposentados e pensionistas. Ativo é o vínculo em situação funcional ativa. A diferença é grande: dos 1,12 milhão de vínculos vigentes, cerca de 656 mil são ativos e 409 mil são aposentados. Usar um no lugar do outro erra por 40%.
Servidores ativos ≠ força de trabalho#
Servidor ativo é a situação do vínculo, e inclui quem está cedido para outro órgão. Força de trabalho conta só quem está em exercício no próprio órgão. O KPI de força de trabalho saiu da faixa principal do painel de Pessoal justamente porque, lado a lado com “servidores ativos”, confundia mais do que informava — mas segue como gráfico e como filtro.
Pessoas ≠ vínculos#
Um servidor pode ter matrícula em mais de um órgão. Contagens de pessoas deduplicam por CPF; gráficos por órgão contam vínculos, porque a pessoa aparece em cada órgão onde tem matrícula. São 1,12 milhão de vínculos para ~1,08 milhão de pessoas.
Origem e destino moram em linhas diferentes#
A situação funcional da origem e a do destino vêm de registros distintos do SIAPE. O pipeline preenche as duas pontas: movimento só-origem recebe no destino a mesma situação que descreve a cessão; movimento só-destino recebe na origem a situação-base do servidor. Nenhum preenchimento sobrescreve o que veio da própria ponta.
O passado não alimenta o presente#
Uma servidora originária da INFRAERO aparecia com cargo no painel. Investigando: o cargo vinha de uma matrícula excluída dela. O pipeline pegava o registro mais recente com valor, sem olhar se aquele vínculo ainda existia.
Hoje há duas listas: atributos do vínculo atual (cargo, função, nível da função, PGD, lotação, UPAG, município) só são herdados de matrícula vigente; atributos estáveis (nome, nascimento, sexo, cor) ainda podem vir de matrícula excluída — senão quem só tem vínculo encerrado ficaria sem nome no painel.
Competência de referência#
Todo painel é um retrato de uma competência, indicada no cabeçalho. Conclusões de conformidade são sempre amarradas a ela: “na competência 06/2026, os dois grupos atendem o mínimo”. Outra competência pode dar outro resultado, e a frase precisa deixar isso evidente.
Proporcionalidade do §7º do art. 93#
A ideia da norma: o órgão que recebe pessoas para compor sua força de trabalho deve, na mesma medida, liberar. O painel calcula por órgão o que cede (A), o que recebe (B) e o saldo (C = A − B), cruzando com vagas aprovadas (D) e ocupadas (E). Cada coluna derivada vem explicada na tela e no PDF — C/E, % Ocup./Aprov., % Lib. A/E, % Oriundos B/E e % Mov. Força de Trabalho.
Os painéis, um a um
O que cada tela responde, e o que ela não responde.
Todos compartilham a mesma gramática: filtros no topo, filtros aplicados no trilho lateral, gráficos clicáveis com multi-seleção, exportação em PDF e planilha.
Sempre que se filtra clicando num gráfico, é possível escolher mais de uma barra. O gráfico de uma dimensão aplica todos os filtros menos o dela mesma — por isso todas as barras continuam à vista e cada clique acrescenta, em vez de trocar.
Movimentações#
O painel central. Vigentes e histórico, quem cede e quem recebe, tipos de movimentação, setor e natureza estatal das duas pontas, tempo médio no destino, encerramentos e motivos de saída. Tem a relação nominal, com ficha individual, trajetória do servidor (todas as movimentações da mesma pessoa) e a aba de Proporcionalidade.
- Recortes: vigentes ou histórico completo, com período ajustável.
- Relatórios: executivo geral, ficha individual, trajetória e o de proporcionalidade — este último com a tabela larga, mas impresso em papel em pé.
- Versão pública: arquivo separado, sem a aba de proporcionalidade e sem os campos que não devem circular.
Pessoal#
Quadro agregado do Executivo federal — sem nome, CPF ou matrícula. É um cubo de ~560 mil combinações que responde a qualquer cruzamento das 16 dimensões.
A faixa etária é a idade, em anos completos, na data de processamento do pipeline — a que o src.main grava em referencia.json e o título do gráfico mostra. Vale para Pessoal, Anistiados e as planilhas internas dos dois (decisão de 10/09/2026). Até então era a competência do fato, que deixava a idade meses atrasada.
Ficam fora, de propósito, os lugares em que a idade é a idade num evento: movimentos encerrados (até a saída), redistribuição (na data da redistribuição) e afastamentos (no início do afastamento).
- Órgão de lotação e órgão de exercício são coisas diferentes: 96% coincidem, e os 4% restantes são quem está cedido ou requisitado.
- UF de exercício vem do município de exercício (código IBGE), com 99,6% de cobertura, e aparece como mapa de blocos. A antiga “UF da UPAG” saiu: a UPAG é unidade pagadora, não diz onde a pessoa trabalha.
- Natureza jurídica é a do órgão de lotação — está dito no rótulo.
- Fora do grupo “Composição do quadro”, cada barra, coluna ou fatia mostra também a remuneração média daquele grupo.
- Dois cartões de liderança: mulheres e homens por nível, e o acompanhamento do Decreto 11.443/2023. Cada um declara o próprio universo, porque contam populações diferentes — ver o capítulo da norma.
Anistiados#
Ficha funcional do público da Lei 8.878/94: de onde vieram, por onde passaram, onde estão hoje, remuneração e tempo de retorno. A situação atual está em três botões com o respectivo quantitativo, acima da primeira linha de filtros. Desde 09/09/2026 há também a aposentadoria pelo INSS — espécie, DIB e situação do benefício —, com filtro, gráfico e colunas próprias na relação nominal.
Espécie, DIB e situação do benefício vêm de reference/Anistiados_aposentados.xlsx, o retorno do SUIBE/INSS a uma relação de CPF enviada pelo MGI — isto é RGPS. A coluna Situação atual = Aposentado é outra coisa: sai da situação funcional do SIAPE (RPPS). Dá para estar ativo no SIAPE e ter benefício no INSS.
O filtro Benefício no INSS separa os dois lados — Com benefício e Sem benefício localizado —, que é a única forma de chegar a quem NÃO aparece na remessa: os filtros de espécie e de situação só listam valores existentes, e o vazio nunca vira opção.
Campo em branco quer dizer CPF não localizado na remessa, e não “não tem aposentadoria”. Quando a pessoa tem mais de um benefício, a tela mostra o vigente (na falta dele, o de DIB mais recente).
A faixa etária é a idade na data de processamento da base (está na legenda do gráfico), não na competência — foi essa diferença que fez o painel dizer 713 ativos com 75+ enquanto o PDI, contando em outra data, dizia 799.
Os gráficos de sexo, cor/raça e escolaridade reagem aos filtros, mas somem quando o recorte tem menos de 10 pessoas — abaixo disso, o gráfico apontaria o atributo de indivíduos. No lugar aparece o aviso, dizendo quantos sobraram.
Redistribuição#
Cargos redistribuídos entre órgãos (art. 37 da Lei 8.112/90): de onde para onde, saldo por órgão, série histórica, perfis e a matriz origem × destino — 12 maiores origens nas linhas contra 12 maiores destinos nas colunas, com a célula colorida pela intensidade e clicável para filtrar o par.
O destino é sempre conhecido; a origem é reconstruída casando saída e entrada por CPF e data. Quando esse par não existe, a origem fica “não informada” — a redistribuição continua contada no total, mas não entra nos gráficos de quem cedeu nem na matriz. O “i” ao lado da matriz traz o percentual do recorte.
LIP — Interesse Particular#
Licenças do art. 91 desde 2011: órgão, cargo, carreira, duração e situação de cada afastamento, com a lista nominal.
Radar do Exterior e Quinquênio#
Dois painéis de conformidade, não de contagem. O Radar cruza quem está fora do País (art. 96) com a folha e com a fila do que a lei manda conferir. O Quinquênio acompanha o teto de 90 dias por quinquênio (art. 87) e a carência de 2 anos antes da pós (art. 96-A).
A licença capacitação migrou de código com o Decreto 9.991/2019 — o código legado morre em 03/2023. Se um painel de afastamento mostrar uma série que cai a zero numa data redonda, desconfie de troca de código antes de desconfiar do dado.
A caixa azul que explica o painel é indispensável na primeira visita e estorvo na décima — ela empurra filtros e números para baixo da dobra. O × no canto dela deixa só uma faixa com o título; o + (ou um clique na faixa) traz de volta. A escolha fica guardada por painel no navegador: quem já leu não recolhe de novo a cada abertura. Vale em todos os painéis que têm essa caixa, e a impressão sai sempre completa.
Mara Legis — o acervo jurídico#
Acervo de inteligência jurídica sobre movimentação de servidores (legislação, pareceres e as respostas de sempre), montado no NotebookLM. Não é um painel: mora fora do domínio e abre noutra aba, sem passar pelo portão. Está no hub e na barra de navegação de todos os painéis — a ideia é que quem está lendo uma ficha e precisa da norma não tenha de procurar o link noutro lugar.
Limites de Reembolso#
Junta duas metades da mesma história: quanto cada órgão já gastou do teto da portaria conjunta MGI/MPO (execução do SIOP) e quem são os empregados de estatal cedidos por trás dessa despesa (SIAPE).
- Termômetro do teto: liquidado, empenhado a liquidar e saldo na escala do teto, com a marca de onde o calendário está — vê-se num golpe se o gasto está adiantado ou atrasado.
- IHE (Índice Histórico de Execução): média do percentual do teto usado por ano, com o ano em curso proporcional aos dias decorridos.
- Simulação de custo com parâmetros editáveis e um campo para projetar entradas além do efetivo — a projeção entra no total e fica registrada no relatório.
- Simulação de reajuste de convenção coletiva, com as duas bases explicadas.
- Três grupos de órgãos, pela cor da barra e por filtro próprio: serviços compartilhados (azul), agências reguladoras (verde) e demais órgãos (âmbar). A legenda abaixo do gráfico de gasto diz quanto do liquidado cabe a cada grupo.
São dois recortes que convivem no painel e respondem a perguntas diferentes. O Anexo é jurídico: I são órgãos e entidades exceto agências, II são as agências. O grupo é de gestão: separa as 13 pastas atendidas pelo Centro de Serviços Compartilhados — que estão espalhadas pelo Anexo I, junto de todo o resto — das agências e dos demais.
Quem decide é reference/grupos_orgaos_reembolso.csv, mantido pela equipe na aba Tabelas do assistente. Órgão fora do arquivo cai em “demais”.
Liderança e o Decreto 11.443/2023
Onde a classificação da casa encontra a norma — e onde elas divergem.
A taxonomia de liderança é nossa, não da norma#
A separação Alta × Baixa/Média vem da planilha FUNÇÕES.xlsx, mantida pela CGMOP. Onde a função tem equivalência ao DAS, a planilha conta DAS 4, 5, 6 e Natureza Especial como alta liderança, e DAS 1, 2 e 3 como baixa/média.
O que foi conferido contra a lei, e o que não#
| Situação | Vínculos com função | Lastro |
|---|---|---|
| Famílias FEX e CCX (escala CCE/FCE) e DAS | ~64 mil (24%) | Conferido. As 39 linhas batem 100% com o Anexo III da Lei 14.204/2021 (DAS 1=5, 2=7, 3=10, 4=13, 5=15, 6=17, NE=18). O código DAS do SIAPE (101.1 a 102.6) é a estrutura do próprio Grupo-DAS. |
| Famílias de escala própria (FG, FUC, CD, GF…) | ~165 mil (62%) | Julgamento da equipe. O código 0001, 0002… é numeração interna da entidade; não há norma geral contra a qual conferir. |
| Fora da taxonomia | ~36 mil (14%) | Não classificado. Aparece como tal na tela, em 40 famílias — a maior é a FGR, com 20,5 mil. |
Os estudos que analisam os dados do Observatório de Pessoal costumam usar um corte mais estreito: alta liderança só o equivalente a DAS 5 e 6. A diferença não é pequena — cerca de 63% do que o painel chama de alta liderança tem equivalência a DAS 4. Pelo outro corte o grupo cairia de ~21,7 mil para ~8,1 mil funções, e a proporção de mulheres nele iria de 38,6% para 36,9%. A conclusão não muda; o tamanho do grupo muda quase três vezes. Para adotar outro corte, basta editar a coluna de nível na planilha e gerar de novo.
O Decreto nº 11.443/2023#
Art. 3º — os órgãos devem preencher com pessoas negras, no mínimo, 30% dos CCE e FCE de níveis 1 a 12 (inciso I) e 30% dos de níveis 13 a 17 (inciso II).
§1º — prazo até 31/12/2025.
Art. 4º — a apuração é global por grupo de níveis, não órgão a órgão.
Art. 2º e 6º — pessoas negras são as autodeclaradas pretas e pardas, com registro no Sinc.
§4º — há também um mínimo de mulheres, a ser definido em ato conjunto MIR/MGI.
Art. 1º, par. único — não se aplica a cargos privativos de militares nem quando lei específica trate da escolha do ocupante.
Como o painel afere — e o que ele não alcança#
Entram os vínculos vigentes do SIAPE nas famílias FEX e CCX, com o nível nos dois últimos dígitos do código. A cor/raça está preenchida em 100% desses vínculos, e o denominador inclui os nomeados sem vínculo anterior.
Na competência de referência 06/2026, com o prazo do §1º já vencido, os dois grupos atendem. Mas o detalhe por nível mostra o que a apuração global esconde: o topo está abaixo da meta, e o cumprimento se apoia na base da pirâmide.
Não é a apuração oficial — essa cabe ao MGI divulgar (art. 9º). Não há como separar as exceções do art. 1º; a autodeclaração oficial fica no Sinc e aqui usa-se a cor do SIAPE; o resultado da comissão de heteroidentificação (art. 7º) não chega a esta base; e o painel exclui GDF/PMDF/CBMDF/PCDF e DPU. O mínimo de mulheres do §4º depende de ato conjunto ainda não editado — sem ele, não há parâmetro a conferir.
Dois cartões, dois universos#
O cartão de gênero conta todas as famílias de função (≈265,6 mil vínculos). O do decreto conta só CCE e FCE (≈53,3 mil) — cinco vezes menos, e um subconjunto do primeiro. Cada cartão declara o próprio universo na tela, porque comparar os percentuais como se fossem a mesma base leva à conclusão errada.
O grupo II do decreto (níveis 13 a 17) tem exatamente o mesmo total da “alta liderança” dentro do CCE/FCE. É consequência da régua da casa: DAS 4 ≡ nível 13. Ou seja, dentro do CCE/FCE os dois cortes são o mesmo conjunto; a diferença de tamanho vem das outras famílias.
Base legal
As normas que o ecossistema aplica, e onde cada uma aparece.
| Norma | Do que trata | Onde aparece |
|---|---|---|
| Lei nº 8.112/1990, art. 93 e §7º | Cessão e movimentação para composição da força de trabalho. | Painel de Movimentações · aba Proporcionalidade |
| Lei nº 8.112/1990, art. 37 | Redistribuição de cargos. | Painel de Redistribuição |
| Lei nº 8.112/1990, art. 91 | Licença para tratar de interesses particulares. | Painel LIP |
| Lei nº 8.112/1990, art. 87 e 96-A | Licença capacitação e carência antes da pós. | Painel Quinquênio |
| Lei nº 8.112/1990, art. 96 | Afastamento para o exterior. | Radar do Exterior |
| Lei nº 8.878/1994 | Anistia — readmissão de dispensados. | Painel de Anistiados |
| Decreto nº 10.835/2021, arts. 18, 19, 21, 25 e 26 | Reembolso de cessão de empregado de estatal; dispensa quando a estatal é dependente do Tesouro. | Limites de Reembolso |
| Portaria Conjunta MGI/MPO nº 61/2023 e alterações (92/2024, 37/2025, 98/2025) | Teto anual de reembolso por órgão. Anexo I = órgãos, exceto agências reguladoras; Anexo II = agências reguladoras. | Limites de Reembolso |
| Lei nº 14.204/2021, Anexo III, e Decreto nº 10.829/2021 | Equivalência entre CCE/FCE e DAS. | Taxonomia de liderança |
| Decreto nº 11.443/2023 | Mínimo de 30% de pessoas negras nos CCE e FCE. | Painel de Pessoal |
| Decreto nº 9.991/2019 | PNDP — desenvolvimento de pessoas; troca de códigos de capacitação. | Painel Quinquênio |
| LRF, art. 2º, III | Conceito de empresa estatal dependente. | Natureza estatal, nos painéis de origem/destino |
O Cade mudou de anexo: estava no Anexo II na portaria 61/2023 e passou ao Anexo I a partir da 37/2025. Ou seja, a classificação de anexo é por exercício e tem de ser lida da norma daquele ano — nunca de uma regra fixa. AGU e Banco Central sempre estiveram no Anexo I.
Privacidade e publicação
O que circula, com que proteção, e o que essa proteção não faz.
O que fica embutido em cada painel#
Painéis de arquivo único carregam o dado dentro do HTML. Esconder na interface não é o mesmo que não publicar: quem tem o arquivo pode ler o código-fonte. As decisões atuais:
| Painel | Dado individual embutido |
|---|---|
| Movimentações (interno) | Nome, CPF mascarado, matrícula mascarada, órgão, cargo, função. Desde 21/09/2026: sexo, cor/raça, escolaridade e deficiência (sim/não) por linha, para a demografia reagir aos filtros, com piso de 25 pessoas — abaixo disso os quatro gráficos voltam ao recorte inteiro. Saiu no mesmo dia a remuneração individual: o rendimento agora é só um agregado por recorte (média, quantos têm dado, quantos recebem). Idade exata, estado civil e tipo de deficiência nunca são embutidos. |
| Movimentações (público) | Desde 21/09/2026 o dado por linha é o MESMO do interno — a redução pública é da interface (sem proporcionalidade, sem a aba), não do payload. Decisão do usuário, com o custo registrado: o arquivo é baixável e o atributo fica ao lado do nome no código-fonte. |
| Pessoal | Nenhum. É um cubo agregado — sem nome, CPF ou matrícula. |
| Anistiados | Nome, matrícula mascarada, e — desde 03/09/2026 — sexo, cor/raça e escolaridade por linha, para que a demografia reaja aos filtros. Com piso de anonimato de 10 pessoas na tela. Desde 09/09/2026 também a espécie da aposentadoria do INSS: duas espécies (032 e 092, incapacidade permanente) indicam condição de saúde — o único dado dessa natureza em todo o ecossistema, e a razão de esta página não ir para a versão pública. |
| LIP e Redistribuição | Lista nominal, sem os atributos sensíveis segmentáveis. |
| Reembolso | Agregado por órgão e por empresa. |
O portão de acesso#
Os painéis publicados recebem uma tela de usuário e senha, com a senha verificada por PBKDF2-HMAC-SHA256 (250 mil iterações) no próprio navegador. Isso não é controle de acesso: o servidor entrega o arquivo inteiro a quem pedir a URL, e o conteúdo está dentro dele. Serve para evitar acesso casual, não determinado.
Acesso real exigiria autenticação no servidor — Azure Static Web Apps com Entra ID, ou Cloudflare Access. Enquanto isso não existe, trate a URL como o segredo.
O que fica no ar#
A aba O que fica no ar do assistente decide painel a painel. “Em revisão” mantém o cartão no hub, sem link, e remove o arquivo da pasta publicada — o link volta 404. Serve para anunciar que o estudo existe enquanto os números são conferidos.
Publicar#
python painel/publicar_cgmop.py # copia + injeta o portão cd C:\0_Apresentacoes\dadosrgb git add painel_CGMOP git commit -m "..." git push
A publicação troca a barra de navegação de cada painel. Já aconteceu de um item funcionar no arquivo gerado e sumir no publicado por causa dessa troca. Depois de publicar, abra o arquivo da pasta do site — e depois do push, o endereço no ar.
As planilhas internas
O material de trabalho: tudo, com nome e CPF, fora da web.
Os painéis mascaram e agregam. Internamente às vezes é preciso o dado completo — por pessoa, com nome, CPF e matrícula. A cada rodada o pipeline grava um arquivo por base em PASTA_DADOS/planilhas_internas/.
O nome traz o mês/ano de referência dos dados (<base>_interno_AAAAMM.xlsx) — a competência do retrato do SIAPE que o ETL gravou em output/referencia.json, e não o mês em que se rodou: uma planilha com o retrato de 06/2026 gerada em setembro se chama …_202606. Rodar de novo para a mesma referência sobrescreve. Sem referencia.json, cai no mês atual e o log avisa. Antes de 14/09/2026 era AAAAMMDD, e cada rodada criava um jogo novo de doze planilhas.
Também deixou de sair o .csv de apoio das bases grandes: as abas Dados, Dados (2)… já trazem todas as linhas, e o CSV de pessoal_ativos sozinho pesava 166 MB. Para varrer as planilhas de outras referências (inclusive os CSV antigos), use Apagar meses anteriores… na aba Tabelas do assistente.
Desde 14/09/2026 todas as planilhas nominais — movimentações, pessoal (os três arquivos), anistiados, redistribuição, LIP, internacional, capacitação e pós-graduação — trazem email_institucional e email_pessoal, vindos de bd_siape_bronze / siape-servidor-disponivel — camada e schema diferentes do resto do pipeline. A tabela é por competência de pagamento (a mesma matrícula aparece em vários meses), então vale sempre a linha mais recente.
A chave é órgão + matrícula concatenados, mas a largura de cada parte não está documentada — e errar o preenchimento com zeros não dá erro, dá zero casamento. Por isso o exportador mede: testa as formas plausíveis, usa a que casa mais e escreve no log qual escolheu e a taxa. Se um dia a taxa despencar, é ali que aparece.
O cadastro do e-mail pode estar no vínculo de origem (lotação) ou no de destino (exercício) — e a busca cobre os dois. Em movimentações, que tem dois órgãos e duas matrículas, entram as quatro combinações (destino+mat. destino, origem+mat. origem e as duas cruzadas); nas demais bases, o órgão do vínculo, depois o de origem e o requisitante. O que ainda ficar vazio tenta qualquer outro vínculo da mesma pessoa, pelo CPF, via fato_servidor. Cada etapa só preenche o que a anterior deixou em branco, e o log diz quanto cada uma trouxe.
As duas colunas ficam logo depois do nome, em todas as planilhas. E o formato da chave é medido numa amostra espalhada pela base inteira: até 15/09/2026 eram as primeiras 20 mil linhas, e em pessoal — 1,12 milhão de vínculos — o começo do arquivo podia ser um bloco sem e-mail nenhum; aí todos os formatos marcavam 0% e a coluna saía vazia na base inteira.
⚠ Se o log disser “… NÃO foi atualizado nesta rodada”, aquela base falhou e o arquivo que está na pasta é o da rodada anterior — o nome é por mês, então a falha não o substitui. O log diz a data dele. Rode de novo só aquela base.
É dado pessoal: vale a mesma regra do CPF completo — fica nesta pasta e não vai para painel nenhum. A tabela é OPCIONAL: sem ela as colunas saem vazias e o resto da rodada não muda. Para baixá-la sem re-extrair tudo: python -m src.main --completar-cache.
Quando um órgão troca de código (MP→ME→MGI), o SIAPE encerra o vínculo com ocorrência 02050 e abre outro com ingresso 01050 no código novo. Sem tratamento, quem está lá desde 2018 parece ter chegado em 2023, e a ocorrência de ingresso vira “Reforma Administrativa” — que não diz como a pessoa entrou no serviço público.
Desde 14/09/2026 as planilhas trazem três colunas a mais: trajetoria_reforma (“MP (2018) → ME (2019) → MGI (2023)”), ingresso_ocorrencia_real e ingresso_data_real. A regra da ocorrência: sem reforma, é a original; com reforma, é a do primeiro órgão da cadeia; e quando a cadeia não fecha, permanece “Reforma Administrativa” — que é a resposta honesta, não um dado faltando.
⚠ Isto vale só para as planilhas. Os painéis e a proporcionalidade continuam usando a reconstrução de transform/movimentacao.py, que não foi tocada — de propósito: mexer lá arriscaria o balanço (cede == recebe) e o gabarito. Como aqui não existe a âncora do órgão de origem que o painel usa, esta versão exige também que a exclusão e o ingresso seguinte estejam a no máximo 31 dias um do outro, para não encadear vínculos paralelos sem relação.
Máscara é coisa de painel, que é baixável. Estas planilhas nunca saem da pasta da equipe, e existem justamente para o trabalho que a tela não faz — então levam CPF completo, matrícula completa, idade exata, sexo, cor/raça, escolaridade, deficiência, remuneração e os códigos crus do SIAPE. Quem for mexer no exportador tem de se perguntar “falta algum campo?”, e não “posso mostrar isso?”.
Até 10/09/2026 não era bem assim: as planilhas de anistiados e de afastamentos saíam com o CPF mascarado, e todas eram recortadas pela lista de colunas pensada para a TELA — o que jogava fora os códigos do SIAPE, as datas de ocorrência e a idade exata. Além de esconder o que não precisava, o CPF mascarado é inútil para cruzar base: ele não é único, e cruzar por ele junta gente diferente.
Elas ficam na pasta da equipe e só. Nenhuma etapa de publicação as toca: publicar_cgmop.py copia apenas os HTML dos painéis e o manual. Tratar esses arquivos como qualquer outro anexo de e-mail é o jeito mais fácil de transformar um painel cuidadoso num incidente de privacidade.
O que é gerado#
| Arquivo | Conteúdo | Escala |
|---|---|---|
movimentacoes_interno_* | A base inteira das movimentações, 70 colunas, com CPF completo e matrículas. | ~215 mil linhas |
pessoal_ativos_interno_* | Quadro de pessoal nominal — ativos civis. Desde 10/09/2026, ~55 colunas do fato (estado civil, deficiência, país, classe/padrão, órgãos de vinculação e UPAG, datas e ocorrências de ingresso e inatividade, PGD, banco/agência) e a remuneração bruta. Desde 17/09/2026, mais 36 colunas vindas da base de MOVIMENTAÇÕES (de onde a pessoa veio, para onde está cedida). | ~656 mil |
pessoal_aposentados_interno_* | Idem, aposentados. | ~409 mil |
pessoal_demais_interno_* | Pensionistas, estagiários, militares, residentes, anistiados. | ~55 mil |
anistiados_interno_* | Ficha do público da Lei 8.878/94 com CPF completo, todas as colunas do fato e a aposentadoria pelo INSS: espécie, DIB, DDB, situação, quantos benefícios e os demais benefícios de quem tem mais de um. | ~16 mil |
redistribuicao_interno_* | Redistribuições nominais (art. 37), com CPF completo. | ~159 mil |
proporcionalidade_interno_* | Placar por órgão (§7º art. 93). | 364 órgãos |
lip_interno_* | Licenças de interesse particular, com CPF completo. | ~21 mil |
internacional_interno_* | Afastamento internacional: organização, missão e estudo. CPF completo. | — |
capacitacao_interno_* | Licença capacitação. CPF completo. | — |
pos_graduacao_interno_* | Afastamento para pós stricto sensu. | — |
reembolso_limites_interno_* | Tetos por órgão e exercício, com portaria e link. | 315 linhas |
referencias_interno_* | Todas as tabelas de referência num arquivo só — as que a equipe mantém à mão. Índice + uma aba por tabela. | 12 tabelas |
Cada arquivo tem três abas: Painel (KPIs e gráficos), Dados (a base com autofiltro e painel congelado) e Dicionário (o que é cada coluna). A de referências é a exceção: tem um Índice e uma aba por tabela.
O co_cargo_emprego do SIAPE se repete entre carreiras: o mesmo “001” é um cargo numa carreira e outro cargo em outra. A chave real é a junção — é o que o ETL chama de iden_cargo_emprego, o que a coluna codigo_cargo da planilha de movimentações traz, e como todos os painéis cruzam a dim_cargo.
Até 21/09/2026 a planilha de pessoal traduzia o cargo só pelo código, e trazia o homônimo de outra carreira: carreira certa, cargo errado (relatado pelo usuário). Corrigido. A planilha passou a trazer também cargo_cod_completo (carreira + cargo), ao lado do cargo_cod cru, para cruzar com as outras bases sem concatenar à mão.
Quem for escrever um de-para novo: carreira se identifica só pelo grupo — essa sempre esteve certa; cargo, não.
O fato_servidor tem o órgão de lotação e o requisitante, mas não tem a reconstrução de origem×destino — essa é trabalho do ETL e vive na base de movimentações. Desde 17/09/2026 a planilha de pessoal traz esse bloco no fim (prefixo mov_), nos dois papéis em que um vínculo pode aparecer:
· Como destino (mov_veio_de_*, mov_chegada_*): de que órgão a pessoa veio, com setor, poder e grupo econômico da origem, a data e a ocorrência de ingresso real, o tipo do movimento (cessão, requisição…), o tempo, se conta para a proporcionalidade, a unidade de exercício e o nível de liderança da taxonomia da CGMOP — que não existe no fato.
· Como origem (mov_cedido_*): para que órgão esta pessoa está cedida, desde quando, em que UF e município exerce.
Quem veio, voltou e veio de novo tem dois. A planilha mostra o vigente mais recente e diz quantos existem em mov_qtd_como_destino / mov_qtd_como_origem. Trazer todos multiplicaria as linhas, e o quadro nominal deixaria de ser nominal — uma pessoa apareceria duas vezes em qualquer contagem.
Ficam de fora, de propósito: nome, CPF, sexo, idade, cargo, carreira e função, que a planilha já traz do fato; e a remuneração, porque remuneracao_bruta (soma das rubricas da folha) e a remuneracao_total do CSV são contas diferentes — duas colunas parecidas com sentidos distintos convidam ao erro.
São as tabelas que não vêm do Data Lake — funções, agrupamento de órgãos, estatais da SEST, limites de reembolso, a remessa do INSS, municípios… — reunidas num arquivo só, para consulta. Metade do valor está no Índice: para cada tabela, o que ela é, onde o arquivo está de verdade (padrão, repontado ou por variável de ambiente), quando mexer, que parte do sistema a lê, quantas linhas tem e quando foi alterada pela última vez.
É uma cópia para consulta, não a fonte: para alterar, use a aba Tabelas do assistente (Abrir, Substituir…, Apontar…), que mexe no arquivo de verdade. Tabela ausente ou ilegível não derruba o arquivo — vira uma linha no Índice com o motivo.
Três decisões que valem conhecer#
- Pessoal vem separado
- Ativos, aposentados e demais em arquivos distintos. Não é capricho: 1,12 milhão de vínculos não cabe numa aba do Excel, que aceita 1.048.576 linhas.
- Base grande sai em streaming
- Acima de 250 mil linhas o arquivo é escrito sem manter as células na memória (a primeira tentativa consumiu 5 GB e não terminou) e vem com um CSV ao lado, que é o que serve para carregar o volume inteiro de uma vez. Nesse modo não há gráficos.
- GDF e DPU entram
- Os painéis excluem o Governo do DF (e forças) e a DPU; as planilhas internas trazem o quadro completo. Nas bases de movimentação o que os painéis tiram é só o que tem as duas pontas nesse conjunto — quem tem uma ponta federal sempre esteve lá.
O CPF completo#
O movimentacoes_painel.csv guarda CPF mascarado, de propósito: é ele que alimenta os painéis publicados. O CPF inteiro vai para uma tabela pequena em output/interno/movimentacoes_cpf.csv, gravada pelo pipeline, e a planilha interna junta as duas na hora de montar o arquivo.
Seria tentador casar CPF e movimento por matrícula no próprio exportador. Não: esse casamento já trocou a pessoa de lugar uma vez — 234 linhas exibiam remuneração e afastamento de outra pessoa. A associação sai do pipeline porque é lá que ela é construída e conferida contra o CPF.
Pela aba Pipeline do assistente, marcando só “Planilhas internas”. Na mão: python -m src.exportar_planilhas_internas, de dentro de pipeline/. A pasta abre pela aba Tabelas.
Riscos conhecidos
O que pode dar errado em silêncio — que é o pior jeito de dar errado.
| Risco | Como se manifesta | Guarda existente |
|---|---|---|
| Competência retroceder | O painel mostra dados de uma competência anterior como se fossem novos. | referencia.json + aviso de defasagem na tela. |
| Coluna sumir do Data Lake | Um filtro fica vazio, um campo em branco. | Merge campo a campo com WARNING no log — é preciso ler o log. |
| Taxonomia desatualizada | Função nova aparece como “fora da taxonomia”; órgão novo cai em “OUTRA”. | Aviso na geração + Conferir taxonomias no assistente. |
| Cache de vagas perdido | Vagas em branco no painel de proporcionalidade. | Cache duplicado em reference/ + erro destacado. |
| Tabela editada no Excel | Coluna deslocada por ; no texto; URL incrementada por arrastar-célula. | Guardas no leitor + aviso de valores distintos por exercício. |
| Base nova sem aparecer no assistente | A equipe não vê que existe um arquivo para manter, e ele envelhece. | As bases fora do Data Lake vivem num registro único (src/referencias.py) que alimenta o pipeline e a aba Tabelas — cadastrar lá basta. |
| Extração do SIOP antiga | Execução orçamentária congelada. | O painel usa só a extração mais recente por exercício e mostra a data. |
Checklist antes de publicar#
- A competência é a esperada?
Confira no cabeçalho de qualquer painel.
- O log tem WARNING?
Coluna ausente e taxonomia incompleta aparecem lá.
- Rodou as duas conferências?
Chaves do reembolso e taxonomias, na aba Tabelas.
- Os totais fecham?
Cede e recebe têm de bater; o teto do reembolso tem de bater com a soma dos anexos da portaria.
- Abriu um PDF e uma planilha?
São os dois caminhos que mais quebram em silêncio.
- Conferiu o arquivo publicado?
Não só o gerado — a publicação altera a página.
Solução de problemas
Sintoma, causa provável, o que fazer.
A faixa etária parece atrasada, ou a legenda mostra uma data antiga#
A idade dos painéis de Anistiados e Pessoal é contada na data de processamento gravada pelo ETL em referencia.json (processado_em). Se você gerou o painel sem rodar o ETL antes, a data é a da rodada anterior — e a legenda do gráfico de faixa etária mostra exatamente qual. Rode o Pipeline ETL (ou Atualizar tudo) e gere o painel de novo. Sem referencia.json nenhum, o gerador avisa no log e usa a data de hoje.
Cadastrei uma base nova e ela não aparece na aba Tabelas#
A aba lê o registro src/referencias.py, não a pasta reference/. Cadastre a base lá (chave, título, quando mexer, quem lê, caminho padrão) e faça o consumidor ler o caminho por referencias.caminho("chave"). Aí ela aparece com os botões Abrir, Substituir e Apontar, e passa a aceitar repontamento.
O painel abre com o JavaScript aparecendo como texto#
Acontece só no arquivo publicado. Causa: a injeção do portão de login entrou no meio de um bloco de script. Verifique se algum texto do gerador contém um </body> ou <script> literal dentro de uma string JavaScript.
O relatório em PDF sai em branco, ou com folhas vazias no fim#
Regra de impressão. O conteúdo tem de estar em #pdf-doc, que precisa ser filho direto do <body>, e os irmãos dele têm de sair com display:none — visibility:hidden esconde mas mantém o espaço, e é isso que produz dezenas de folhas em branco.
Aplique na tela as regras do @media print e meça: document.body.scrollHeight − #pdf-doc.scrollHeight tem de dar zero. Se der mais que zero, é exatamente esse tanto de papel em branco.
A planilha não abre, ou o Excel pede para reparar#
Foi um defeito real e antigo: o gerador de XLSX escrevia o diretório central do ZIP com 44 bytes em vez de 46 (faltavam os dois bytes de “atributos internos”), e toda planilha do ecossistema saía corrompida. Corrigido. Se voltar a acontecer, valide abrindo o arquivo com openpyxl — baixar sem erro não prova nada.
Só consigo selecionar uma barra do gráfico#
O gráfico de uma dimensão está aplicando o filtro dela mesma — aí sobra uma barra só e não há o que clicar. Ele precisa aplicar todos os filtros menos o próprio.
Um órgão aparece com execução zero sem explicação#
Falta de-para entre SIAPE e SIOP. Rode Conferir chaves do reembolso: ele aponta a linha exata que falta, com o volume de dinheiro e de gente em jogo.
“Função fora da taxonomia” com volume alto#
Famílias de função que não estão na FUNÇÕES.xlsx. Rode Conferir taxonomias; com --csv ele grava a lista pronta para preencher.
O painel some do ar (404)#
Provavelmente está marcado como em revisão na aba “O que fica no ar” — nesse estado o arquivo é removido da pasta publicada de propósito.
O PDF sai com as letras grossas, e não dá para selecionar o texto#
O destino da impressão era o “Microsoft Print to PDF”. Esse driver recebe a página já desenhada e grava cada letra como traçado vetorial preenchido: não há fonte embutida, o texto engrossa e não se seleciona nem se busca. Escolha o destino “Salvar como PDF” do próprio Chrome/Edge — sai com a fonte de verdade, mais leve e pesquisável.
O texto do relatório encosta (ou passa) da borda do papel#
Acontece quando a impressão é feita com Margens: Nenhuma. Nessa opção o Chrome ignora o @page{margin:12mm} do painel e imprime até o fio do papel — e a impressora ainda tem 1 a 2 mm de área não imprimível, que come as últimas letras. Use Margens: Padrão.
Desde 21/09/2026 o relatório tem uma folga interna de 4 mm (no CSS compartilhado, _comum.py), que vale mesmo com margem zero — então o conteúdo não encosta mais na borda em nenhuma configuração. Painéis gerados antes dessa data precisam ser regerados para receber a folga.
“SEM ACESSO À TABELA DO FATO” (INSUFFICIENT_PERMISSIONS)#
Desde 15/09/2026 o retrato do servidor vem de mgi-ouro.bd_siape_delta.fatoservidor. Se o seu usuário não tem leitura nessa tabela, o Data Lake responde User does not have SELECT on Table. Não é defeito do pipeline: a equipe do Data Lake precisa rodar GRANT SELECT ON TABLE `mgi-ouro`.`bd_siape_delta`.`fatoservidor` para o seu usuário (e USE SCHEMA no schema, se faltar).
Enquanto isso: re-extrair (--atualizar) para logo no começo, sem baixar nada e sem tocar no cache; Completar cache segue com o retrato que está em cache e completa o resto; e a rodada sem re-extrair funciona normalmente — com o aviso de “cache de outra origem” no topo do log, que só some depois da primeira extração bem-sucedida da tabela nova.
Glossário
O vocabulário mínimo para ler qualquer tela.
- Competência de referência
- O mês do retrato do SIAPE em que o painel se baseia.
- Vínculo
- Uma matrícula. Uma pessoa pode ter mais de um.
- Vigente
- Vínculo que ainda existe no SIAPE — inclui aposentado e pensionista.
- Ativo
- Vínculo em situação funcional ativa. Inclui quem está cedido.
- Força de trabalho
- Quem está em exercício no próprio órgão. Exclui cedidos.
- Órgão de lotação
- Onde está o vínculo.
- Órgão de exercício
- Onde a pessoa efetivamente trabalha. Difere da lotação em ~4% dos casos.
- UPAG
- Unidade pagadora. Diz quem paga, não onde a pessoa está.
- UORG
- Unidade organizacional — a caixinha do organograma.
- Proporcionalidade
- A regra do §7º do art. 93: quem recebe para compor força de trabalho deve liberar na mesma medida.
- Redistribuição
- Deslocamento do cargo efetivo, com o servidor, de um órgão para outro (art. 37).
- Cessão / requisição
- A pessoa vai trabalhar em outro órgão; o cargo permanece no de origem.
- Anexo I e II
- Da portaria de reembolso: Anexo I são órgãos e entidades exceto agências reguladoras; Anexo II são agências reguladoras.
- IHE
- Índice Histórico de Execução — média do percentual do teto usado por ano.
- CCE / FCE
- Cargo Comissionado Executivo e Função Comissionada Executiva, que substituíram DAS e FCPE.
- Alta liderança
- Classificação da CGMOP: onde há equivalência ao DAS, corresponde a DAS 4, 5, 6 e Natureza Especial.
- Sinc
- Sistema Integrado de Nomeações e Consultas, onde fica a autodeclaração de que trata o Decreto 11.443.
- Piso de anonimato
- Regra do painel: gráfico demográfico não é desenhado abaixo de 10 pessoas no recorte.
Como manter este manual
Ele é gerado por código, e é assim que não desatualiza sozinho.
Este documento é gerado. O conteúdo mora em manual/_conteudo1.py e manual/_conteudo2.py, em blocos declarativos — parágrafo, tabela, passo a passo, caixa de aviso. O layout mora em manual/_render.py.
cd C:\0_Desenvolvimento\Movimentacao_pessoal python manual\gerar_manual_html.py # este manual (HTML) python manual\gerar_manual.py # a versão .docx
Corrigir direto no arquivo gerado funciona até a próxima rodada, quando a correção some sem avisar. Editar o bloco no _conteudo*.py custa o mesmo e sobrevive.
O que precisa entrar aqui quando algo muda#
- Regra de negócio nova ou alterada → capítulo Conceitos que mudam o número.
- Norma nova → capítulo Base legal, e o painel onde ela aparece.
- Base de referência nova → cadastre em
src/referencias.py(é isso que a põe na aba Tabelas) e descreva-a no capítulo As tabelas que a equipe mantém. - Botão ou aba nova no assistente → capítulo O assistente, aba por aba, dizendo o que o botão faz e quando usar.
- Defeito que custou tempo para achar → capítulo Solução de problemas, com o sintoma primeiro. Quem procura socorro busca pelo sintoma, não pela causa.