📊 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")

B) TXT Report (visualizationEnum = "TXT")

C) CSV (visualizationEnum = "CSV")


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

Quando geraArquivoTexto = true, retorna arquivoTxt (base64):


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

2. CSV retorna PDF

3. Frontend tenta chamar endpoint inexistente


✅ Soluções Necessárias

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

  1. Adicionar campos no DTO: java // BalanceteGeralDTO.java private Boolean somenteXml; private Boolean txtGeraXml;

  2. Adicionar campo no Response: java // RetornoRelatorioBalanceteGeral.java private String arquivoXml;

  3. Modificar lógica no Service: ```java 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