Ir para o conteúdo

Runbook — Ajuste Diário GFBR

Sintomas

  • ❌ "Débito ≠ Crédito no grupo" (validação falha)
  • ❌ "Conta inválida no plano GFBR"
  • ❌ "Grupo não detectado" (formatação Excel inconsistente)
  • ❌ "Centro de custo inválido" ou não mapeado
  • ❌ Arquivo saída não gerado ou vazio
  • ❌ "Hash validação mismatch" (auditoria falha)

Checagens rápidas

# 1. Logs auditoria
tail -50 /var/log/central-utils/ajuste_gfbr.log | grep -i "error\|balance\|hash"

# 2. Input Excel
ls -lh /data/ajustes-contabeis/uploads/ | tail -3
file /data/ajustes-contabeis/uploads/*.xlsx

# 3. Validar planilha integridade
python3 << 'EOF'
from openpyxl import load_workbook
wb = load_workbook('/data/ajustes-contabeis/uploads/ajustes.xlsx')
print(f"Sheets: {wb.sheetnames}")
for sheet in wb.sheetnames:
    ws = wb[sheet]
    print(f"{sheet}: rows={ws.max_row}, cols={ws.max_column}")
EOF

# 4. Output gerado?
ls -lh /data/ajustes-contabeis/outputs/ | tail -3

# 5. Audit log
tail -20 /var/log/central-utils/audit_gfbr.log

# 6. BD auditoria
psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c "SELECT * FROM auditoria_gfbr ORDER BY timestamp DESC LIMIT 5"

Causas comuns

  1. Débito ≠ Crédito no grupo: Lançamento desbalanceado
  2. Solução: Revisar totalizadores, adicionar contrapartida, validar valores

  3. Conta inválida GFBR: Código fora do plano de contas

  4. Solução: Consultar cardápio GFBR, usar mapeamento correto, validar tabela contas

  5. Grupo não detectado: Formatação Excel não segue padrão (linha título, valores, vazio)

  6. Solução: Estruturar Excel exatamente conforme template, respeitar borders

  7. Centro de custo inválido: Código não existe em tabela centros

  8. Solução: Validar depto/centro de custo, usar cardápio oficial

  9. Hash mismatch (auditoria): Arquivo TXT saída foi modificado

  10. Solução: Regenerar, validar NOT alterado após geração, conferir assinatura

  11. Memory leak: Arquivo Excel muito grande (>100k linhas, >50 MB)

  12. Solução: Split em múltiplos arquivos, aumentar heap Java/Python

Passo a passo para resolver

Cenário 1: Débito ≠ Crédito em grupo

# 1. Debugar lógica detecção de grupos
python3 << 'EOF'
from openpyxl import load_workbook
wb = load_workbook('/data/ajustes-contabeis/uploads/ajustes.xlsx')
ws = wb.active

grupos = []
grupo_atual = None
total_debito = 0
total_credito = 0

for row in ws.iter_rows(min_row=1, max_row=ws.max_row, values_only=True):
    if row[0] and isinstance(row[0], str) and row[0].isupper():  # Título grupo
        if grupo_atual:
            print(f"Grupo '{grupo_atual}': D={total_debito}, C={total_credito}, OK={total_debito==total_credito}")
        grupo_atual = row[0]
        total_debito = 0
        total_credito = 0
    elif row[0] is None:  # Fim grupo
        if grupo_atual:
            print(f"Grupo '{grupo_atual}': D={total_debito}, C={total_credito}, OK={total_debito==total_credito}")
        grupo_atual = None
    else:  # Lançamento
        if row[3]:  # Coluna Débito
            total_debito += float(row[3])
        if row[4]:  # Coluna Crédito
            total_credito += float(row[4])
EOF

# 2. Se desbalanceado, revisar valores Excel
# Abrir no Excel e validar =SUM(D:D) vs =SUM(E:E)

# 3. Adicionar contrapartida se necessário
# Exemplo: se débito > crédito, adicionar crédito em conta complementar

# 4. Resubmeter
curl -X POST http://localhost:8001/api/ajuste-diario-gfbr/gerar \
  -H "Content-Type: application/json" \
  -d '{
    "arquivo_excel": "ajustes.xlsx",
    "data_ajuste": "2025-02-28",
    "empresa": "00123456",
    "validar_completo": true
  }'

Cenário 2: Conta inválida GFBR

# 1. Consultar plano de contas GFBR
psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c "SELECT codigo, descricao FROM plano_gfbr ORDER BY codigo" | head -20

# 2. Verificar código usado Excel vs. válido
# Exemplo: usou "11.2.1.01" mas válido é "11.2.1.1" (sem leading 0)

# 3. Buscar conta similar
psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c "SELECT * FROM plano_gfbr WHERE descricao LIKE '%palavra_chave%'"

# 4. Corrigir Excel com código válido

# 5. Resubmeter

Cenário 3: Grupo não detectado (estrutura Excel)

# 1. Validar estrutura do Excel
# Padrão esperado:
# Linha 1: "AJUSTES FEVEREIRO 2025"
# Linha 2: em branco
# Linha 3: "Grupo 1"
# Linhas 4-10: Lançamentos
# Linha 11: em branco  (separa grupos)
# Linha 12: "Grupo 2"
# ...

# 2. Restruturar se necessário
# Abrir Excel, remover formatação extra, respeitar borders, testar

# 3. Validar pattern no código
grep -n "def.*detectar.*grupo\|PATTERN.*GROUP" /api/ajuste_diario_gfbr_core.py

# 4. Se padrão diferente da documentação, editar regex/parsing

# 5. Resubmeter

Cenário 4: Hash mismatch (auditoria)

# 1. Verificar arquivo TXT gerado
cat /data/ajustes-contabeis/outputs/AJUSTES_20250228_GFBR.txt

# 2. Calcular hash
sha256sum /data/ajustes-contabeis/outputs/AJUSTES_20250228_GFBR.txt

# 3. Comparar com hash na auditoria BD
psql -h $DB_HOST -U $DB_USER -d $DB_NAME << 'EOF'
SELECT arquivo_hash, arquivo_path FROM auditoria_gfbr 
WHERE timestamp > NOW() - INTERVAL 1 hour 
ORDER BY timestamp DESC LIMIT 1;
EOF

# 4. Se mismatch:
# - Arquivo foi alterado (detectado) → Rejeitado para auditoria
# - Regenerar com flag bypass (se autorizado)
# - Ou reimportar com dry-run

# 5. Resubmeter com novas credenciais auditoria
curl -X POST http://localhost:8001/api/ajuste-diario-gfbr/gerar \
  -H "Content-Type: application/json" \
  -H "X-Audit-User: contador@empresa.com" \
  -d '{
    "arquivo_excel": "ajustes.xlsx",
    "data_ajuste": "2025-02-28",
    "force_recalc_hash": true
  }'

Cenário 5: Validação grupo formato inconsistente

# 1. Usar modo DRY_RUN para validação apenas
curl -X POST http://localhost:8001/api/ajuste-diario-gfbr/validar \
  -H "Content-Type: application/json" \
  -d '{
    "arquivo_excel": "ajustes.xlsx"
  }'

# 2. Resposta indicará erros específicos de validação

# 3. Corrigir conforme feedback

# 4. Resubmeter para gerar

Reprocesso/recuperação

Verificar se período já processado (audit log).

# 1. Verificar se já processado
psql -h $DB_HOST -U $DB_USER -d $DB_NAME << 'EOF'
SELECT * FROM auditoria_gfbr 
WHERE data_ajuste = '2025-02-28' 
  AND empresa = '00123456'
  AND status='sucesso'
EOF

# 2. Se sim, revisar output anterior
ls -la /data/ajustes-contabeis/outputs/AJUSTES_20250228_GFBR*

# 3. Se precisa re-generate, deletar arquivo antigo
rm /data/ajustes-contabeis/outputs/AJUSTES_20250228_GFBR.txt

# 4. Limpar log auditoria se necessário (apenas se autorizado)
# psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c "DELETE FROM auditoria_gfbr WHERE created_at > NOW() - INTERVAL 1 hour"

# 5. Resubmeter
curl -X POST http://localhost:8001/api/ajuste-diario-gfbr/gerar \
  -H "Content-Type: application/json" \
  -d '{
    "arquivo_excel": "ajustes_new.xlsx",
    "data_ajuste": "2025-02-28",
    "empresa": "00123456"
  }'

# 6. Aguardar processamento (10-30 seg)

# 7. Validar arquivo gerado
ls -lh /data/ajustes-contabeis/outputs/AJUSTES_20250228_GFBR.txt
wc -l /data/ajustes-contabeis/outputs/AJUSTES_20250228_GFBR.txt

Rollback

Suporte via banco de dados apenas (NOT revertível sistema contábil).

# 1. Se arquivo gerado ANTES de importar sistema contábil (SAP/ERP):
rm -f /data/ajustes-contabeis/outputs/AJUSTES_20250228_GFBR.txt

# 2. Limpar audit log (requer permissão DBA)
psql -h $DB_HOST -U $DB_USER -d $DB_NAME -U dba_user << 'EOF'
DELETE FROM auditoria_gfbr 
WHERE created_at > NOW() - INTERVAL 1 hour 
  AND status='sucesso'
EOF

# 3. Se JÁ importado em SAP/ERP:
# DEVE fazer estorno contábil manual (processo controlador)
# - Criar novo ajuste com valores inversos
# - Registrar motivo em comentário
# - Não deletar original

# 4. Contatar Squad Controladoria para estorno

Contatos

  • Owner: Squad Controladoria
  • Slack: #squad-controladoria
  • Contador responsável: [nome/email do controller]
  • DBA BD: [nome/email DBA]
  • SAP/ERP Admin: [nome/email]
  • On-call: Verificar PagerDuty (Controladoria SRE)
  • Escalação: JIRA central-utils, tag: ajuste-gfbr, criticidade: HIGH

Última atualização: Fevereiro 2026 | Versão runbook: 1.0
⚠️ AVISO CRÍTICO: Dados contábeis sensíveis (LGPD compliance requerida)
IMPORTANTE: Todas modificações devem ser auditadas - NUNCA deletar arquivos sem aprovação controller