Programação Por Equipe DevBras

Capa do artigo: Audesp sem rejeição: gerar, validar e conferir o arquivo antes de transmitir

Audesp sem rejeição: gerar, validar e conferir o arquivo antes de transmitir

O tribunal lê o arquivo, não a sua tela. Gere a partir dos lançamentos, valide contra o leiaute, concilie os totais e guarde protocolo e versão de cada envio.

Último dia do prazo, 16h. A equipe de sistemas da prefeitura fictícia de Vila Serena gera o arquivo de prestação de contas, transmite e recebe rejeição. Um código de despesa não existe na tabela do tribunal, três registros têm data fora do período e o total enviado não bate com o balancete. Na tela do sistema interno estava tudo certo, com nomes de rubrica que a equipe entende e somas corretas.

A resposta curta: para o Audesp, o TCE-SP lê o arquivo no leiaute que ele publicou, não a sua tela. O arquivo precisa sair dos mesmos lançamentos que a tela mostra, passar por validação estrutural e de regra antes da transmissão e ter os totais conciliados com os relatórios internos. Cada envio fica guardado com protocolo, versão do leiaute e hash.

Por que o arquivo e a tela divergem

A tela do sistema é feita para a equipe: rubrica com nome amigável, agrupamentos internos, filtros que escondem o que não interessa. O arquivo para o tribunal segue outra lógica: códigos de tabelas oficiais, campos obrigatórios que a tela nem mostra, formato de data e valor exatos. Quando os dois são produzidos por caminhos diferentes, divergem.

A divergência mais perigosa nasce da digitação paralela. Perto do prazo, alguém exporta uma planilha, corrige à mão o que o validador recusou e gera o arquivo dali. O envio passa, mas agora o que o tribunal recebeu não é o que está no banco. No próximo período, ou numa auditoria, ninguém consegue explicar a diferença.

E há a versão do leiaute. O tribunal publica manuais e esquemas por fase e exercício, e eles mudam. Código que funcionava no ano anterior pode gerar arquivo rejeitado no atual. Há dois posts vizinhos sobre isso: o manual da fase é o contrato do arquivo e anote a data da versão que você implementou. Aqui o foco é o processo de geração e conferência.

Como gerar e conferir o arquivo, passo a passo

  1. Registre a versão do leiaute que o gerador implementa, com a data do manual baixado da página de documentação do Audesp.
  2. Gere a partir dos lançamentos já gravados, por uma consulta ou view única, nunca de planilha intermediária.
  3. Mapeie códigos internos para códigos oficiais numa tabela de correspondência, e falhe se algum lançamento não tiver correspondência.
  4. Valide a estrutura contra o esquema publicado, quando a fase fornecer um.
  5. Valide as regras que o esquema não pega: período, obrigatórios com conteúdo, somas.
  6. Concilie os totais do arquivo com o relatório que o setor contábil assina.
  7. Transmita e guarde arquivo, hash, protocolo, data, versão do leiaute e quem enviou.

Uma fonte só para tela e arquivo

Em Vila Serena, a tela de despesas e o gerador passaram a ler da mesma view. A tela mostra o nome da rubrica; o gerador usa o código oficial da tabela de correspondência. Os nomes de tabela e coluna abaixo são do sistema fictício.

CREATE VIEW vw_despesa_prestacao AS
SELECT l.id               AS lancamento_id,
       l.data_lancamento,
       l.valor_centavos,
       r.nome             AS rubrica_nome,
       c.codigo_oficial   AS rubrica_codigo
  FROM lancamentos l
  JOIN rubricas r          ON r.id = l.rubrica_id
  LEFT JOIN correspondencia_codigo c ON c.rubrica_id = r.id
 WHERE l.situacao = 'confirmado';

O LEFT JOIN é proposital: lançamento sem correspondência aparece com rubrica_codigo nulo, e o gerador pode recusar antes de montar o arquivo, em vez de inventar um código. Valores em centavos inteiros evitam a soma que fecha na tela e não fecha no arquivo por arredondamento, como em dinheiro em centavos.

Validação estrutural com o esquema

Se a documentação da fase traz esquema XSD para arquivos XML, use-o antes de qualquer envio. Pela linha de comando, com xmllint (pacote libxml2):

xmllint --noout --schema esquema-da-fase.xsd prestacao-2026-09.xml

Sem erros, ele informa que o arquivo valida. Com erros, lista linha e elemento. Isso pega campo obrigatório ausente, tipo errado e elemento fora de ordem, mas não pega regra de negócio.

Validação de regra e conciliação

O script abaixo, em Python com lxml, valida contra o esquema e depois confere período e total. Os nomes de elemento são ilustrativos; use os do leiaute oficial da sua fase.

from datetime import date
from lxml import etree

esquema = etree.XMLSchema(etree.parse("esquema-da-fase.xsd"))
doc = etree.parse("prestacao-2026-09.xml")

if not esquema.validate(doc):
    for erro in esquema.error_log:
        print(f"linha {erro.line}: {erro.message}")
    raise SystemExit(1)

inicio, fim = date(2026, 9, 1), date(2026, 9, 30)
total_centavos = 0
problemas = []

for item in doc.iter("Despesa"):
    d = date.fromisoformat(item.findtext("Data"))
    if not (inicio <= d <= fim):
        problemas.append(f"Despesa {item.findtext('Id')} com data {d} fora do período")
    total_centavos += round(float(item.findtext("Valor")) * 100)

total_balancete = 184_532_917  # centavos, do relatório assinado pela contabilidade
if total_centavos != total_balancete:
    problemas.append(f"Total do arquivo {total_centavos} difere do balancete {total_balancete}")

for p in problemas:
    print(p)
raise SystemExit(1 if problemas else 0)

O valor do balancete vem do relatório que o responsável contábil confere, não do próprio arquivo. Conciliar o arquivo com ele mesmo não prova nada. Rodar esse script em toda geração transforma a rejeição das 16h do último dia numa lista de pendências na semana anterior.

Guardar o que foi enviado

Depois da transmissão, guarde o arquivo exato, o hash dele, o protocolo devolvido, data e hora, a versão do leiaute e o usuário que enviou. O hash prova que o arquivo guardado é o enviado:

sha256sum prestacao-2026-09.xml > prestacao-2026-09.xml.sha256

Reenvio e retificação seguem as regras da fase, que dizem quando um novo arquivo substitui o anterior e o que precisa acompanhar. Não apague o envio anterior do seu arquivo histórico: ele é a prova do que foi entregue naquela data.

Por fim, o responsável pela prestação de contas é o gestor e a equipe contábil designada, não o programador sozinho. O sistema gera e confere; quem assina valida o conteúdo. Este guia trata do processo técnico e não substitui as orientações do tribunal nem do profissional contábil responsável.

Erros comuns

  • Gerar o arquivo de uma planilha corrigida à mão. O envio passa, mas o tribunal recebe dados que não estão no banco.
  • Usar nome de rubrica no lugar do código oficial. Rejeição imediata ou, pior, código parecido aceito com significado errado.
  • Preencher código ausente com um valor "genérico". O arquivo valida e a classificação da despesa fica errada.
  • Validar só a estrutura. Data fora do período e total que não fecha passam pelo esquema.
  • Manter o gerador do exercício anterior sem conferir o manual novo. Mudança de leiaute vira rejeição perto do prazo.
  • Não guardar protocolo e arquivo enviado. Na auditoria, ninguém prova o que foi entregue.

Checklist

  • A versão e a data do leiaute implementado estão registradas.
  • Tela e gerador leem da mesma consulta ou view.
  • Todo código interno tem correspondência oficial, ou a geração falha.
  • O arquivo é validado contra o esquema publicado, quando houver.
  • Período, obrigatórios e totais são conferidos por script.
  • O total do arquivo é conciliado com o relatório da contabilidade.
  • Cada envio guarda arquivo, hash, protocolo, versão do leiaute e quem enviou.

Pegue o último arquivo enviado e escolha um lançamento qualquer da tela do sistema: você consegue achá-lo no arquivo, com o mesmo valor e o código oficial certo?

Avalie este artigo

Referência: https://www.tce.sp.gov.br/audesp/documentacao