Pular para conteúdo

📊 Análise Completa do Endpoint /reports/cosifGeneralBalance

🎯 Endpoint

URL: POST /reports/cosifGeneralBalance
Serviço: ecosif-reports
Controller: ReportsController.getReportCosifGeneralBalance()


📥 Estrutura de Entrada (Request)

DTO Principal: BalanceteGeralRequestDTO

{
  "balanceteGeralDTO": {
    "dataReferencia": "2025-12-31T00:00:00.000Z",
    "paginaInicial": "1",
    "nivelMaximo": "9",
    "fundosEncerrados": false,
    "alertaSaldosInvertidos": false,
    "geraArquivoTexto": false,  // ⚠️ CHAVE PRINCIPAL
    "contasFantasmas": false,
    "valoresZerados": false,
    "empresa": "000000001",
    "filial": "000000001",
    "filialFim": "000000001",
    "usuario": "nome_usuario"
  },
  "printDTO": {
    "orientationEnum": "LANDSCAPE",
    "visualizationEnum": "PDF"  // Valores: "PDF", "TXT", "CSV"
  }
}

⚠️ Campos Faltantes no DTO

O DTO NÃO possui os campos: - somenteXml (Boolean) - txtGeraXml (Boolean)

Esses campos são enviados pelo frontend mas não são processados pelo backend.


📤 Estrutura de Saída (Response)

DTO de Resposta: RetornoRelatorioBalanceteGeral

{
  "status": 200,
  "mensagem": "",
  "elemento": {
    "relatorio": "base64_string...",  // Quando geraArquivoTexto = false
    "arquivoTxt": "base64_string..."   // Quando geraArquivoTexto = true
  }
}

Campos de retorno: - relatorio (String, base64): Relatório formatado (PDF/TXT/CSV) - arquivoTxt (String, base64): Arquivo TXT específico (formato COSIF)


🔀 Lógica de Decisão de Saída

O endpoint usa a seguinte lógica:

if (geraArquivoTexto == true) {
    // Retorna arquivoTxt (formato específico COSIF)
    result.setArquivoTxt(txtCosif4010Txt(dado.getArquivo()));
} else {
    // Retorna relatorio (formato report)
    switch (visualizationEnum) {
        case "PDF": result.setRelatorio(pdfCosif4010(dado)); break;
        case "TXT": result.setRelatorio(txtCosif4010(dado)); break;
        case "CSV": result.setRelatorio(pdfCosif4010(dado)); break; // ⚠️ Retorna PDF mesmo
    }
}

📋 Opções de Saída Possíveis

1️⃣ Relatório Formatado (Report) - geraArquivoTexto = false

Quando geraArquivoTexto = false, retorna relatorio (base64) no formato especificado:

A) PDF (visualizationEnum = "PDF")

  • Método: pdfCosif4010()
  • Template: /templates/cos4010-4016_A4_Landscape.jrxml
  • Formato: PDF em base64
  • Conteúdo: Relatório formatado com cabeçalho, ativos, passivos, totais
  • Uso: Visualização/impressão

B) TXT Report (visualizationEnum = "TXT")

  • Método: txtCosif4010()
  • Template: /templates/cos4010-4016_A4_Landscape.jrxml (mesmo do PDF)
  • Formato: TXT em base64 (exportado via JRTextExporter)
  • Conteúdo: Mesmo conteúdo do PDF, mas em formato texto
  • Uso: Visualização em texto

C) CSV (visualizationEnum = "CSV")

  • Método: pdfCosif4010() ⚠️ BUG: Retorna PDF mesmo quando CSV é solicitado
  • Formato: PDF em base64 (incorreto)
  • Uso: Não funciona corretamente

2️⃣ Arquivo TXT Específico - geraArquivoTexto = true

Quando geraArquivoTexto = true, retorna arquivoTxt (base64):

  • Método: txtCosif4010Txt()
  • Template: /templates/cos4010-4016_txt.jrxml
  • Formato: TXT em base64
  • Conteúdo: Arquivo formatado no padrão COSIF específico:
    #A14010[CNPJ][8 espaços][MES][ANO]D[35 espaços]
    00[CODIGO_CONTA_7DIG][5 espaços][VALOR_18D][VALOR_18D][VALOR_18D]
    ...
    @1[000001][63 espaços]
    
  • Estrutura:
  • Linha 1: Cabeçalho (#A1 ou #C1 + código 4010/4016 + CNPJ + data)
  • Linhas intermediárias: Dados das contas (ativo e passivo)
  • Última linha: Rodapé (@1 + contador de linhas)
  • Uso: Envio para sistemas externos, importação

3️⃣ XML - ⚠️ NÃO IMPLEMENTADO

O backend NÃO gera XML atualmente, mesmo quando o frontend envia somenteXml ou txtGeraXml.

Serviço disponível mas não usado: - Report4010Service.generateXmlFromTxt(String txtContent) existe - Converte TXT (formato específico) para XML - Não é chamado em nenhum lugar do código

Estrutura XML que seria gerada:

<Relatorio4010>
  <conta codigoConta="1234567890" saldo="1000000"/>
  <conta codigoConta="9876543210" saldo="-500000"/>
  ...
</Relatorio4010>


🔧 Como Passar Parâmetros para Cada Tipo de Saída

Para gerar PDF Report:

{
  "balanceteGeralDTO": {
    "geraArquivoTexto": false,
    ...
  },
  "printDTO": {
    "visualizationEnum": "PDF"
  }
}

Para gerar TXT Report:

{
  "balanceteGeralDTO": {
    "geraArquivoTexto": false,
    ...
  },
  "printDTO": {
    "visualizationEnum": "TXT"
  }
}

Para gerar Arquivo TXT Específico:

{
  "balanceteGeralDTO": {
    "geraArquivoTexto": true,
    ...
  }
}
Nota: Quando geraArquivoTexto = true, o visualizationEnum é ignorado.

Para gerar XML (atualmente não funciona):

{
  "balanceteGeralDTO": {
    "geraArquivoTexto": true,
    "somenteXml": true,  // ⚠️ Campo não existe no DTO
    "txtGeraXml": false
  }
}
Problema: Os campos somenteXml e txtGeraXml não existem no BalanceteGeralDTO, então não são processados.


🐛 Problemas Identificados

1. XML não é gerado

  • Frontend envia somenteXml e txtGeraXml, mas o DTO não tem esses campos
  • Report4010Service.generateXmlFromTxt() existe mas não é usado
  • Não há campo no response para retornar XML

2. CSV retorna PDF

  • Quando visualizationEnum = "CSV", o código chama pdfCosif4010() em vez de um método CSV

3. Frontend tenta chamar endpoint inexistente

  • Quando XML está habilitado, frontend tenta chamar /api/compliance/run/download
  • Esse endpoint não existe no ecosif-compliance

✅ Soluções Necessárias

Opção A: Implementar XML no ecosif-reports (Recomendado)

  1. Adicionar campos no DTO:

    // BalanceteGeralDTO.java
    private Boolean somenteXml;
    private Boolean txtGeraXml;
    

  2. Adicionar campo no Response:

    // RetornoRelatorioBalanceteGeral.java
    private String arquivoXml;
    

  3. Modificar lógica no Service:

    if (geraArquivoTexto) {
        String txtBase64 = txtCosif4010Txt(dado.getArquivo());
        result.setArquivoTxt(txtBase64);
    
        if (somenteXml || txtGeraXml) {
            // Decodificar base64, converter para XML
            String txtContent = new String(Base64.getDecoder().decode(txtBase64));
            String xmlContent = report4010Service.generateXmlFromTxt(txtContent);
            result.setArquivoXml(Base64.getEncoder().encodeToString(xmlContent.getBytes()));
        }
    }
    

Opção B: Criar endpoint no ecosif-compliance

Criar /api/compliance/run/download que: - Recebe os mesmos parâmetros de /api/compliance/run - Gera o XML diretamente - Retorna Blob com XML


📝 Resumo das Opções de Saída

geraArquivoTexto visualizationEnum Saída Campo Retornado
false PDF PDF formatado (report) relatorio
false TXT TXT formatado (report) relatorio
false CSV PDF formatado (report) ⚠️ relatorio
true qualquer TXT específico COSIF arquivoTxt
true + XML* qualquer XML ⚠️ NÃO IMPLEMENTADO -

*XML requer implementação adicional


Última atualização: 2026-01-28