Renan Oliveira
← todos os sistemas

▲ Caso 03 · Automação de processo regulado

Onze documentos, duas distribuidoras, um comando

Um sistema solar pode estar inteiro no telhado e não gerar nada, porque entre o cliente e a energia sobra um dossiê que a distribuidora ainda não aprovou. Um anexo errado devolve o processo e custa semanas.

Período
abril a setembro de 2026
Meu papel
autor único, respondo pelo resultado
Linguagem
Python
Estado
usado na operação de abril a setembro de 2026

Como está construído

Entrada
Formulário web servido na própria máquina, que grava um JSON por cliente. O JSON é validado por jsonschema antes de qualquer etapa rodar.
Orquestração
Um orquestrador resolve a concessionária uma vez e dispara onze etapas em sequência, cada uma num módulo isolado com função de entrada própria.
Planilha oficial
LibreOffice em modo headless abre o arquivo da concessionária, preenche as células e força o recálculo. lxml opera o XML interno do .xlsx quando o preenchimento precisa ser cirúrgico.
Desenho técnico
reportlab gera as pranchas a partir dos dados do projeto: alocação dos módulos, diagrama unifilar, string box e quadro de corrente alternada.
Geolocalização
utm converte entre coordenadas geográficas e UTM, que é o sistema em que o mapa de localização precisa sair.
Fontes externas
PVGIS, a base europeia de irradiação, para a produção estimada no local. INMETRO para o certificado de cada inversor e módulo. pypdf para ler os pareceres que chegam em PDF.
Extração assistida
SDK da Anthropic para tirar dados estruturados de documento não estruturado, numa etapa opcional que roda antes do formulário.
Garantia
Quatro baselines congelados que comparam o artefato pronto, não o código que o gerou.

As decisões, e o que eu descartei em cada uma

Decisão 01

O sistema escolhe os documentos, e não a pessoa

Cada distribuidora pede um pacote diferente de documentos para ligar uma usina: a CEMIG pede um, a Equatorial Goiás pede outro. Quem opera só preenche os dados do cliente. O sistema identifica a distribuidora e monta sozinho o pacote que ela exige.

O que eu descartei: deixar a pessoa marcar, numa lista de onze documentos, quais entram no pedido. Para acertar, ela teria de lembrar a regra de cada distribuidora no meio de um trabalho repetitivo, que é justamente quando a gente esquece.

Decisão 02

Anexo errado se recusa, não se avisa depois

Quando o robô detecta que um anexo saiu errado, ele remove o apontamento e deixa o item como pendente, em vez de entregar o arquivo.

Por quê: anexo ausente aparece na lista de pendências e alguém junta antes de enviar. Anexo errado chega à concessionária, e volta semanas depois. Os dois custam diferente.

O robô também recusa assinalar uma alternativa de conexão que o próprio parecer da distribuidora declara inviável, e recusa gerar o termo sem o projeto original.

Decisão 03

Dado de parecer se lê do PDF, nunca se digita

Os números do estudo de inversão entram lidos do PDF do parecer emitido pela distribuidora.

O que eu descartei: um campo no formulário para o operador copiar o valor. Redigitar número de documento oficial é a origem mais barata de erro que existe, e o erro só aparece quando o processo volta.

Decisão 04

Ao acrescentar a segunda concessionária, a primeira sai byte a byte igual

Parametrizar um gerador que já funciona é onde se quebra o que estava certo. A trava foi congelar o resultado: quatro baselines comparam o artefato pronto, e não o código.

O memorial é conferido com o texto na ordem. O anexo da concessionária é conferido membro a membro de dentro do arquivo compactado, porque a soma de verificação do .xlsx muda sozinha: o formato grava a data e hora da compactação.

O que eu descartei: confiar em teste de unidade nas funções alteradas. Eles passam enquanto o documento entregue muda de lugar.

A atualização de um baseline é manual, de propósito: se fosse automática, registraria o defeito como se fosse o novo certo.

Decisão 05

Um documento declara qual código está vivo

O projeto tem 121 scripts. Mais de uma vez eu editei um arquivo, rodei o processo e a saída veio igual, porque o arquivo não estava no caminho de execução.

A correção foi escrever um documento que lista, etapa por etapa, qual arquivo é chamado e por qual função. A primeira linha dele manda lê-lo antes de tocar em qualquer coisa.

Por quê: perder tempo assim uma vez é distração. Duas vezes é sinal de que o projeto não estava dizendo a verdade sobre si mesmo.

Prancha de ligação das strings, com os módulos numerados, os conectores positivo e negativo e o cabeamento em salto conectando módulos alternados
Prancha de ligação das strings. Cada módulo numerado, cada conector identificado por polaridade e cor de cabo, e o cabeamento desenhado em salto, conectando módulos alternados para encurtar o retorno até a string box. A tabela ao lado fecha a identificação por inversor, entrada de MPPT e potência. Tudo sai dos dados do projeto: mudou a quantidade de módulos ou as entradas do inversor, muda o desenho.
Desenho da string box com proteções e ligação ao inversor
String box: fusíveis, proteção contra surto, seccionadora e a ligação das três entradas.
Desenho dos circuitos e do quadro de corrente alternada
Circuitos e quadro de corrente alternada.

Os desenhos saem dos dados daquele projeto: quantidade de módulos por água, número de entradas do inversor, proteção dimensionada. Muda o projeto, muda o desenho.

11tipos de anexo
121scripts no pipeline
4baselines congelados

Contagem feita no repositório em 22/09/2026, referente ao período de abril a setembro de 2026.