Pular para conteúdo

Análise de Problemas nos Relatórios - Balancete Mensal, Balancete Diário e Listagem de Lançamentos

Data da Análise

2025-01-15

Problemas Identificados

Problema 1: Ordenação de Contas Contábeis

Descrição

As contas contábeis devem ser ordenadas considerando apenas os dígitos antes do hífen ("-"), que representa o dígito verificador. A ordenação deve seguir uma lógica numérica natural, não alfabética.

Exemplos do Problema

  • Exemplo 1: Conta 1.1-2 deve ser tratada como 1.1 para ordenação
  • Exemplo 2: Conta 1.1.1.1.-4 deve ser tratada como 1.1.1.1 para ordenação

Ordenação Esperada

1
1.1
...
1.9
1.10
1.10.1
1.11
1.11.1
1.11.9
1.11.10

Problema 2: Valores Não Aparecem no Balancete Mensal

Descrição

O balancete mensal está apresentando problemas onde os valores não estão sendo exibidos corretamente.


Análise por Relatório

1. Balancete Mensal (ProcedureBalanceteMensalServiceImpl)

Ordenação Atual

  • Localização: ecosif-reports/src/main/java/io/ecosif/reports/repository/TempPlanoRepository.java
  • Query: getTempPlanoProjection() e getTempPlanoProjectionConsolidado()
  • Ordenação: ORDER BY CdContabil (linhas 27 e 39)

Problema Identificado: - A ordenação é feita diretamente no campo CdContabil do banco de dados - Não há processamento para remover o dígito verificador (parte após "-") antes da ordenação - A ordenação SQL padrão é alfabética, não numérica natural - Exemplo: 1.10 vem antes de 1.2 na ordenação alfabética (incorreto)

Origem dos Dados

  1. Procedure: cTPBalMensalL() em ProceduresServiceImpl.java (linha 1149)
  2. Query Principal: TempPlanoRepository.getTempPlanoProjection()
  3. Tabela: CT_Plano LEFT JOIN CT_Plano_Saldo
  4. Campos de valores:
    • MovDeb as TotDeb (movimentação débito)
    • movcred as TotCred (movimentação crédito)
    • saldoacumulado as Saldofinal (saldo final acumulado)
  5. Processamento:
  6. Os dados são retornados já ordenados pelo banco (ORDER BY CdContabil)
  7. O código Java processa os dados na ordem recebida (linhas 149-247 em ProcedureBalanceteMensalServiceImpl.java)
  8. Não há reordenação customizada no Java

Valores e Saldos

  • Saldo Final: Vem de tempPlanos.get(i).getSaldofinal() (linha 151)
  • Origem: Campo saldoacumulado da tabela CT_Plano_Saldo
  • Cálculo: O saldo é calculado no banco de dados através de agregações na query
  • Problema Potencial: Se saldoacumulado estiver NULL ou 0, o valor não aparece no relatório

Código Relevante

// ProcedureBalanceteMensalServiceImpl.java - linha 122
List<TempPlano> tempPlanos = procedures.cTPBalMensalL(...);

// Processamento sequencial na ordem recebida (linha 149)
for(int i = 0; i < tempPlanos.size(); i++){
    Double saldoFinal = tempPlanos.get(i).getSaldofinal();
    // ... processamento sem reordenação
}

2. Balancete Diário (ProcedureBalanceteDiarioServiceImpl)

Ordenação Atual

  • Localização: ecosif-reports/src/main/java/io/ecosif/reports/repository/CtBalDiarioTmpRepository.java
  • Query: findByUsuarioIdOrderByCdcontabil() (linha 50)
  • Ordenação: ORDER BY CDCONTABIL

Problema Identificado: - Mesmo problema do balancete mensal: ordenação alfabética, não numérica natural - Não há remoção do dígito verificador antes da ordenação

Origem dos Dados

  1. Procedure: ctPBalDiarioRelatorio() em ProceduresServiceImpl.java (linha 120)
  2. Query Final: CtBalDiarioTmpRepository.findByUsuarioIdOrderByCdcontabil()
  3. Tabela: CT_BalDiario_TMP
  4. Campos de valores:
    • totdeb as Totdeb (total débito)
    • totcred as Totcred (total crédito)
    • saldoinicial as Saldoinicial (saldo inicial)
    • sdmedio as Sdmedio (saldo médio)
  5. Processamento:
  6. Dados são inseridos em tabelas temporárias através de procedures SQL
  7. A ordenação final é feita na query de seleção (linha 327 em ProceduresServiceImpl.java)

Valores e Saldos

  • Saldo Inicial: ctBaldiarioTmp.getSaldoinicial() (linha 357)
  • Total Débito: ctBaldiarioTmp.getTotdeb()
  • Total Crédito: ctBaldiarioTmp.getTotcred()
  • Saldo Final: Calculado a partir dos totais
  • Origem: Tabelas temporárias populadas por procedures SQL complexas que agregam dados de CT_Lancamento, CT_Plano_Saldo, etc.

Código Relevante

// ProceduresServiceImpl.java - linha 327
List<BaldiarioProjection> baldiarioProjections = 
    ctBalDiarioTmpRepository.findByUsuarioIdOrderByCdcontabil(usuario);

// ProcedureBalanceteDiarioServiceImpl.java - linha 203
String cdContabilParaMascara = ctBaldiarioTmp.getCdcontabil();
// Processamento da máscara e dígito verificador (linhas 204-212)

Observação: O código processa o dígito verificador para exibição (linha 211), mas não para ordenação.


3. Listagem de Lançamentos (ProcedureLancamentosServiceImpl)

Ordenação Atual

  • Localização: ecosif-reports/src/main/java/io/ecosif/reports/repository/CtListalanctoTmpRepository.java
  • Query: getCtVLancamentosProjection() e getCtVLancamentosDocumentoProjection()
  • Ordenação: ORDER BY CT_V_Lancamentos.Empresa, CT_V_Lancamentos.Filial, CT_V_Lancamentos.Ano, CT_V_Lancamentos.Mes, CT_V_Lancamentos.DiaReferencia, CT_V_Lancamentos.Lote, CT_V_Lancamentos.Documento, CT_V_Lancamentos.Lancamento (linhas 110 e 149)

Problema Identificado: - A ordenação é por empresa, filial, data, lote, documento e lançamento - Não há ordenação por conta contábil na listagem de lançamentos - Se houver necessidade de ordenar por conta, o mesmo problema de ordenação alfabética vs numérica se aplicaria

Origem dos Dados

  1. Procedure: ctPLancamento() em ProceduresServiceImpl.java (linha 626)
  2. Query: CtListalanctoTmpRepository.getCtVLancamentosProjection()
  3. Tabela: CT_V_Lancamentos (view)
  4. Campos principais:
    • ContaId (código da conta)
    • ContraPartida (conta contrapartida)
    • Valor (valor do lançamento)
    • DebCre (débito/crédito)
  5. Processamento:
  6. Dados são inseridos em tabela temporária CT_ListaLancto_TMP
  7. A ordenação é feita na query SQL final

Valores e Lançamentos

  • Valor: Vem diretamente da view CT_V_Lancamentos
  • Origem: Tabela CT_Lancamento (lançamentos contábeis)
  • Processamento: Os valores são formatados para exibição, mas não há agregação ou cálculo adicional

Código Relevante

// ProcedureLancamentosServiceImpl.java - linha 86
List<CtVLancamentosProjection> ctVLancamentosProjections = 
    procedures.ctPLancamento(...);

// Processamento sequencial (linha 96)
for(int i = 0; i < ctVLancamentosProjections.size(); i++){
    // ... processamento sem ordenação por conta
}

Resumo dos Problemas

Problema 1: Ordenação Incorreta

Relatório Ordenação Atual Problema Impacto
Balancete Mensal ORDER BY CdContabil (alfabética) Não remove "-" antes de ordenar; ordenação alfabética Contas aparecem fora de ordem (ex: 1.10 antes de 1.2)
Balancete Diário ORDER BY CDCONTABIL (alfabética) Não remove "-" antes de ordenar; ordenação alfabética Contas aparecem fora de ordem
Listagem de Lançamentos Ordenação por data/lote/documento Não ordena por conta contábil Se necessário ordenar por conta, teria o mesmo problema

Problema 2: Valores Não Aparecem no Balancete Mensal

Análise Detalhada

Causa Raiz 1: Campo saldoAtual Não É Setado em Alguns Casos

Localização: ProcedureBalanceteMensalServiceImpl.java, linhas 226-238

Problema Identificado:

// Linha 226-238
}else{
    CtBalMensalLinha ctBalMensalLinha = new CtBalMensalLinha();
    ctBalMensalLinha.setConta(tempPlanos.get(i).getCdcontabil());
    ctBalMensalLinha.setDescricao(...);
    ctBalMensalLinha.setNivel(tempPlanos.get(i).getNivel().intValue());
    ctBalMensalLinha.setCdReduzido(tempPlanos.get(i).getCdreduzido());

    Double tempSaldoFinal = (tempPlanos.get(i).getSaldofinal() == null) ? 0.0 : tempPlanos.get(i).getSaldofinal();
    //ctBalMensalLinha.setSaldoAtual(new BigDecimal(tempSaldoFinal));  // <-- COMENTADO!
    linhas.add(ctBalMensalLinha);
}

Impacto: - Quando a condição do else é verdadeira (contas com filhos ou em níveis intermediários), o campo saldoAtual não é setado - O campo saldoAtual permanece null no objeto CtBalMensalLinha - No template JasperReports, se o campo for null, pode não ser exibido ou aparecer vazio

Condição do else: - Executado quando: tempPlanos.get(i).getNrFilhos() != 0 OU nivelTrab != tempPlanos.get(i).getNivel() OU tempPlanos.get(i).getNivel() == nivelMaximo - Isso afeta principalmente contas agrupadoras (com filhos) e contas em níveis intermediários

Causa Raiz 2: LEFT JOIN Retorna NULL Quando Não Há Registro

Localização: TempPlanoRepository.java, linhas 21-27

Query SQL:

SELECT CT_Plano.Conta_ID as contaId, CdContabil, CdReduzido, Descricao, IndNatureza, NrFilhos, Nivel,
       MovDeb as TotDeb, movcred as TotCred, saldoacumulado as Saldofinal
FROM CT_Plano 
LEFT JOIN CT_Plano_Saldo ON ct_plano.conta_id = ct_plano_saldo.conta_id
    AND CT_Plano_Saldo.Ano = :ano AND CT_Plano_Saldo.Mes = :mes
    AND CT_Plano_Saldo.empresa = :pEmpresa AND CT_Plano_Saldo.filial = :pFilial
WHERE Tipo= :pTipo AND CdContabil >= :pContaIni AND CdContabil <= :pContaFin
    AND Nivel <= :pNivel AND (EAGLUTINANTE <> '2' OR EAGLUTINANTE IS NULL) 
ORDER BY CdContabil

Problema: - Se não houver registro em CT_Plano_Saldo para o período especificado, saldoacumulado será NULL - O campo Saldofinal na projeção será NULL - O código trata NULL como 0.0 (linha 151 e 236), mas: - Na linha 222, se saldoFinal for NULL, a formatação retorna "0.00" - Na linha 237, o saldo não é setado (código comentado)

Cenários onde isso ocorre: 1. Conta não teve movimentação no período 2. Conta foi criada após o período 3. Erro na geração dos saldos mensais (CT_Plano_Saldo não foi populado)

Causa Raiz 3: Filtro de Valores Zerados Remove Contas

Localização: ProceduresServiceImpl.java, linhas 1177-1180

Código:

if(pValZerado == 0){
    tempPlanoRepository.deleteBySaldoFinalAndNrfilhos(usuario);
    tempPlanoRepository.deleteBalMensal(usuario);
}

Problema: - Se valoresZerados = false (passado como pValZerado = 0), contas com saldo 0 são removidas da tabela temporária - Query deleteBySaldoFinalAndNrfilhos: Remove contas folha (nrfilhos = 0) com saldo 0 e sem movimentação - Query deleteBalMensal: Remove contas agrupadoras (nrfilhos <> 0) com saldo 0, exceto se tiverem filhos com saldo diferente de 0

Impacto: - Contas que deveriam aparecer com valor 0.00 são completamente removidas do relatório - Se o usuário espera ver todas as contas (mesmo com saldo 0), elas não aparecerão

Causa Raiz 4: Tratamento Inconsistente de NULL

Localização: ProcedureBalanceteMensalServiceImpl.java, múltiplas linhas

Análise: 1. Linha 151: Double saldoFinal = tempPlanos.get(i).getSaldofinal(); - Pode ser NULL 2. Linha 207: if(saldoFinal != null){ valores[j] += saldoFinal; } - Trata NULL corretamente 3. Linha 212: somaTotal += saldoFinal; - PROBLEMA: Se saldoFinal for NULL, causa NullPointerException ou comportamento inesperado 4. Linha 222: FormatacaoValores.formataValoresNumericosBalancete(saldoFinal, ...) - A função trata NULL retornando "0.00" 5. Linha 236: Double tempSaldoFinal = (tempPlanos.get(i).getSaldofinal() == null) ? 0.0 : tempPlanos.get(i).getSaldofinal(); - Trata NULL, mas não usa o valor

Problema Específico na Linha 212:

somaTotal += saldoFinal;  // Se saldoFinal for NULL, isso pode causar erro ou comportamento inesperado

Causa Raiz 5: Formatação Retorna "0.00" Mas Campo Não É Setado

Localização: FormatacaoValores.java, linhas 86-88

Código:

if(total == null || total == 0.0){
    return "0.00";
}

Problema: - A função retorna "0.00" quando o valor é NULL ou 0 - Mas na linha 237 de ProcedureBalanceteMensalServiceImpl, o campo saldoAtual não é setado - Mesmo que a formatação funcione corretamente, o valor não chega ao objeto que será serializado para o relatório

Causa Raiz 6: Query Não Usa COALESCE ou IFNULL

Localização: TempPlanoRepository.java, linha 22

Problema: - A query não usa COALESCE(saldoacumulado, 0.0) ou IFNULL(saldoacumulado, 0.0) - Quando o LEFT JOIN não encontra registro, saldoacumulado vem como NULL do banco - Isso força o tratamento de NULL no Java, que está inconsistente

Resumo das Causas
# Causa Localização Impacto Severidade
1 Campo saldoAtual não setado no else Linha 237 Valores não aparecem para contas agrupadoras ALTA
2 LEFT JOIN retorna NULL Query SQL Valores NULL chegam ao Java MÉDIA
3 Filtro remove contas zeradas Linha 1178 Contas desaparecem do relatório MÉDIA
4 Tratamento inconsistente de NULL Linha 212 Possível erro ou comportamento inesperado ALTA
5 Formatação OK mas campo não setado Linha 237 Valor formatado não chega ao relatório ALTA
6 Query não trata NULL Query SQL NULL chega ao Java BAIXA

Origem dos Valores e Saldos

Balancete Mensal

  • Tabela Principal: CT_Plano (plano de contas)
  • Tabela de Saldos: CT_Plano_Saldo (saldos mensais por conta)
  • Campos:
  • MovDeb: Movimentação débito do mês
  • movcred: Movimentação crédito do mês
  • saldoacumulado: Saldo final acumulado
  • Cálculo: Feito no banco de dados através de agregações na query

Balancete Diário

  • Tabelas Temporárias: CT_BalDiario_TMP (populada por procedures)
  • Origem dos Dados:
  • CT_Lancamento: Lançamentos contábeis
  • CT_Plano_Saldo: Saldos iniciais
  • CT_Plano: Plano de contas
  • Campos:
  • totdeb: Total débito do período
  • totcred: Total crédito do período
  • saldoinicial: Saldo inicial do período
  • sdmedio: Saldo médio (se calculado)
  • Cálculo: Feito por procedures SQL complexas que agregam dados de múltiplas tabelas

Listagem de Lançamentos

  • View: CT_V_Lancamentos (view de lançamentos)
  • Tabela Base: CT_Lancamento
  • Campos:
  • Valor: Valor do lançamento
  • DebCre: Indicador de débito/crédito
  • ContaId: Código da conta
  • ContraPartida: Conta contrapartida
  • Cálculo: Valores vêm diretamente dos lançamentos, sem agregação

Recomendações para Correção

1. Ordenação de Contas

Solução Proposta

  1. Criar função SQL para ordenação numérica natural:
  2. Remover o dígito verificador (parte após "-")
  3. Converter para ordenação numérica natural
  4. Exemplo: ORDER BY CAST(REPLACE(SUBSTRING_INDEX(CdContabil, '-', 1), '.', '') AS UNSIGNED)

  5. Ou processar no Java:

  6. Remover o dígito verificador antes de ordenar
  7. Usar Comparator customizado para ordenação numérica natural
  8. Exemplo: Collections.sort(contas, new ContaContabilComparator())

  9. Função auxiliar para remover dígito verificador:

    private String removeDigitoVerificador(String conta) {
        if (conta == null) return conta;
        int index = conta.indexOf('-');
        return (index > 0) ? conta.substring(0, index) : conta;
    }
    

2. Valores Não Aparecem

Solução Proposta

  1. Verificar se saldoacumulado está sendo calculado corretamente:
  2. Revisar a query em TempPlanoRepository.getTempPlanoProjection()
  3. Verificar se o LEFT JOIN está correto
  4. Verificar se há registros em CT_Plano_Saldo para o período

  5. Verificar filtro de valores zerados:

  6. Confirmar se o parâmetro valoresZerados está sendo passado corretamente
  7. Verificar se contas com saldo 0 devem aparecer ou não

  8. Adicionar logs de debug:

  9. Logar os valores de saldoFinal antes da formatação
  10. Verificar se os valores estão chegando do banco

  11. Verificar formatação:

  12. Revisar FormatacaoValores.formataValoresNumericosBalancete()
  13. Verificar se valores NULL ou 0 estão sendo tratados corretamente

Arquivos a Modificar

Para Correção da Ordenação

  1. ecosif-reports/src/main/java/io/ecosif/reports/repository/TempPlanoRepository.java
  2. Modificar queries getTempPlanoProjection() e getTempPlanoProjectionConsolidado()
  3. Adicionar ordenação numérica natural

  4. ecosif-reports/src/main/java/io/ecosif/reports/repository/CtBalDiarioTmpRepository.java

  5. Modificar query findByUsuarioIdOrderByCdcontabil()
  6. Adicionar ordenação numérica natural

  7. ecosif-reports/src/main/java/io/ecosif/reports/utils/FormatacaoValores.java (ou criar nova classe)

  8. Adicionar método para remover dígito verificador
  9. Adicionar Comparator para ordenação numérica natural de contas

Para Correção dos Valores

  1. ecosif-reports/src/main/java/io/ecosif/reports/service/impl/ProcedureBalanceteMensalServiceImpl.java
  2. Adicionar logs de debug
  3. Verificar tratamento de valores NULL
  4. Verificar formatação de valores

  5. ecosif-reports/src/main/java/io/ecosif/reports/repository/TempPlanoRepository.java

  6. Revisar query de agregação de saldos
  7. Verificar LEFT JOIN com CT_Plano_Saldo

Conclusão

Os problemas identificados são:

  1. Ordenação incorreta: Todos os relatórios usam ordenação alfabética simples (ORDER BY CdContabil), que não funciona corretamente para códigos numéricos com pontos e dígitos verificadores. A solução requer ordenação numérica natural após remover o dígito verificador.

  2. Valores não aparecem: O problema pode estar relacionado a:

  3. Valores NULL não sendo tratados corretamente
  4. Filtro de valores zerados removendo contas que deveriam aparecer
  5. Problema na agregação SQL dos saldos
  6. Problema na formatação dos valores

A correção requer modificações tanto nas queries SQL quanto no código Java de processamento.


Lista de Correções para Aprovação e Execução

Correção 1: Corrigir Campo saldoAtual Não Setado no Balancete Mensal

Prioridade: 🔴 ALTA
Arquivo: ecosif-reports/src/main/java/io/ecosif/reports/service/impl/ProcedureBalanceteMensalServiceImpl.java
Linha: 237

Problema: O campo saldoAtual não é setado quando a condição do else é verdadeira, causando valores vazios no relatório.

Correção:

// ANTES (linha 236-238):
Double tempSaldoFinal = (tempPlanos.get(i).getSaldofinal() == null) ? 0.0 : tempPlanos.get(i).getSaldofinal();
//ctBalMensalLinha.setSaldoAtual(new BigDecimal(tempSaldoFinal));
linhas.add(ctBalMensalLinha);

// DEPOIS:
Double tempSaldoFinal = (tempPlanos.get(i).getSaldofinal() == null) ? 0.0 : tempPlanos.get(i).getSaldofinal();
ctBalMensalLinha.setSaldoAtual(FormatacaoValores.formataValoresNumericosBalancete(tempSaldoFinal, tempPlanos.get(i).getIndNatureza(), fatorDivisao.intValue()));
linhas.add(ctBalMensalLinha);

Aplicar também em: Linha 855 (segunda ocorrência do mesmo problema)

Impacto: Valores passarão a aparecer corretamente para contas agrupadoras e níveis intermediários.


Correção 2: Corrigir Tratamento de NULL na Soma Total

Prioridade: 🔴 ALTA
Arquivo: ecosif-reports/src/main/java/io/ecosif/reports/service/impl/ProcedureBalanceteMensalServiceImpl.java
Linha: 212

Problema: A soma total pode falhar se saldoFinal for NULL.

Correção:

// ANTES (linha 212):
somaTotal += saldoFinal;

// DEPOIS:
if(saldoFinal != null){
    somaTotal += saldoFinal;
}

Aplicar também em: Verificar outras ocorrências de soma com saldoFinal que podem ser NULL

Impacto: Evita erros de NullPointerException e comportamento inesperado.


Correção 3: Adicionar COALESCE na Query SQL para Tratar NULL

Prioridade: 🟡 MÉDIA
Arquivo: ecosif-reports/src/main/java/io/ecosif/reports/repository/TempPlanoRepository.java
Linhas: 21-27 e 33-39

Problema: A query não trata NULL do LEFT JOIN, forçando tratamento no Java.

Correção:

-- ANTES (linha 22):
" MovDeb as TotDeb, movcred as TotCred, saldoacumulado as Saldofinal"

-- DEPOIS:
" COALESCE(MovDeb, 0.0) as TotDeb, COALESCE(movcred, 0.0) as TotCred, COALESCE(saldoacumulado, 0.0) as Saldofinal"

Aplicar em: - getTempPlanoProjection() (linha 22) - getTempPlanoProjectionConsolidado() (linha 34)

Impacto: Valores NULL são tratados no banco, simplificando o código Java e garantindo consistência.


Correção 4: Implementar Ordenação Numérica Natural para Contas Contábeis

Prioridade: 🔴 ALTA
Arquivos: - ecosif-reports/src/main/java/io/ecosif/reports/repository/TempPlanoRepository.java - ecosif-reports/src/main/java/io/ecosif/reports/repository/CtBalDiarioTmpRepository.java - ecosif-reports/src/main/java/io/ecosif/reports/utils/FormatacaoValores.java (novo método)

Problema: Ordenação alfabética causa contas fora de ordem (ex: 1.10 antes de 1.2).

Correção:

4.1. Criar método auxiliar em FormatacaoValores.java:

/**
 * Remove o dígito verificador de uma conta contábil (parte após "-")
 * @param conta Código da conta contábil (ex: "1.1.1-2")
 * @return Código sem dígito verificador (ex: "1.1.1")
 */
public static String removeDigitoVerificador(String conta) {
    if (conta == null || conta.isEmpty()) {
        return conta;
    }
    int index = conta.indexOf('-');
    return (index > 0) ? conta.substring(0, index).trim() : conta.trim();
}

/**
 * Compara duas contas contábeis para ordenação numérica natural
 * Remove dígito verificador e compara numericamente
 */
public static int compareContaContabil(String conta1, String conta2) {
    String c1 = removeDigitoVerificador(conta1);
    String c2 = removeDigitoVerificador(conta2);

    // Remove pontos e converte para comparação numérica
    String[] parts1 = c1.split("\\.");
    String[] parts2 = c2.split("\\.");

    int maxLength = Math.max(parts1.length, parts2.length);
    for (int i = 0; i < maxLength; i++) {
        int num1 = (i < parts1.length) ? Integer.parseInt(parts1[i]) : 0;
        int num2 = (i < parts2.length) ? Integer.parseInt(parts2[i]) : 0;

        if (num1 != num2) {
            return Integer.compare(num1, num2);
        }
    }
    return 0;
}

4.2. Modificar query em TempPlanoRepository.java:

-- ANTES (linha 27):
" ORDER BY CdContabil"

-- DEPOIS (usar ordenação numérica natural):
-- Opção 1: Se o banco suportar, usar função SQL
-- Opção 2: Ordenar no Java após buscar os dados

4.3. Ordenar no Java após buscar dados:

// Em ProcedureBalanceteMensalServiceImpl.java, após linha 123:
List<TempPlano> tempPlanos = procedures.cTPBalMensalL(...);

// Adicionar ordenação customizada
tempPlanos.sort((p1, p2) -> FormatacaoValores.compareContaContabil(
    p1.getCdcontabil(), 
    p2.getCdcontabil()
));

4.4. Aplicar mesma correção em CtBalDiarioTmpRepository.java: - Modificar findByUsuarioIdOrderByCdcontabil() para ordenar no Java - Ou criar função SQL para ordenação numérica natural

Impacto: Contas aparecerão na ordem correta (1, 1.1, 1.2, 1.9, 1.10, 1.11, etc.).


Correção 5: Revisar Filtro de Valores Zerados

Prioridade: 🟡 MÉDIA
Arquivo: ecosif-reports/src/main/java/io/ecosif/reports/procedures/impl/ProceduresServiceImpl.java
Linha: 1177-1180

Problema: Filtro pode estar removendo contas que deveriam aparecer.

Correção:

// Verificar se a lógica está correta
// Se valoresZerados = false, contas com saldo 0 são removidas
// Confirmar se este é o comportamento esperado

// Se necessário, adicionar log para debug:
if(pValZerado == 0){
    logger.debug("Removendo contas com saldo zerado. Total antes: {}", tempPlanoRepository.count());
    tempPlanoRepository.deleteBySaldoFinalAndNrfilhos(usuario);
    tempPlanoRepository.deleteBalMensal(usuario);
    logger.debug("Total depois: {}", tempPlanoRepository.count());
}

Ação: Revisar requisitos de negócio para confirmar se contas zeradas devem aparecer ou não.

Impacto: Garante que o comportamento do filtro está alinhado com os requisitos.


Correção 6: Adicionar Logs de Debug para Diagnóstico

Prioridade: 🟢 BAIXA (mas útil para diagnóstico)
Arquivo: ecosif-reports/src/main/java/io/ecosif/reports/service/impl/ProcedureBalanceteMensalServiceImpl.java

Correção: Adicionar logs estratégicos para diagnóstico:

// Após linha 123:
logger.debug("Total de contas retornadas: {}", tempPlanos.size());
logger.debug("Primeiras 5 contas: {}", tempPlanos.stream()
    .limit(5)
    .map(tp -> String.format("%s (saldo: %s)", tp.getCdcontabil(), tp.getSaldofinal()))
    .collect(Collectors.joining(", ")));

// Após linha 151:
if(saldoFinal == null){
    logger.warn("Saldo NULL para conta {} - {}", 
        tempPlanos.get(i).getCdcontabil(), 
        tempPlanos.get(i).getDescricao());
}

// Após linha 222:
logger.debug("Conta {} - Saldo formatado: {}", 
    tempPlanos.get(i).getCdcontabil(), 
    ctBalMensalLinha.getSaldoAtual());

Impacto: Facilita diagnóstico de problemas futuros.


Correção 7: Validar Dados de Entrada

Prioridade: 🟡 MÉDIA
Arquivo: ecosif-reports/src/main/java/io/ecosif/reports/service/impl/ProcedureBalanceteMensalServiceImpl.java
Linha: 122

Correção: Adicionar validação antes de processar:

// Após linha 123:
if(tempPlanos == null || tempPlanos.isEmpty()){
    logger.warn("Nenhuma conta retornada para empresa {} filial {} período {}/{}", 
        empresa, filial, pAno, pMes);
    // Retornar lista vazia ou lançar exceção apropriada
}

Impacto: Melhora tratamento de erros e diagnóstico.


Resumo das Correções

# Correção Prioridade Arquivo(s) Esforço
1 Corrigir campo saldoAtual não setado 🔴 ALTA ProcedureBalanceteMensalServiceImpl.java Baixo
2 Corrigir tratamento de NULL na soma 🔴 ALTA ProcedureBalanceteMensalServiceImpl.java Baixo
3 Adicionar COALESCE na query SQL 🟡 MÉDIA TempPlanoRepository.java Baixo
4 Ordenação numérica natural 🔴 ALTA Múltiplos arquivos Médio
5 Revisar filtro valores zerados 🟡 MÉDIA ProceduresServiceImpl.java Baixo
6 Adicionar logs de debug 🟢 BAIXA ProcedureBalanceteMensalServiceImpl.java Baixo
7 Validar dados de entrada 🟡 MÉDIA ProcedureBalanceteMensalServiceImpl.java Baixo

Total de Correções: 7
Prioridade Alta: 3
Prioridade Média: 3
Prioridade Baixa: 1


Ordem Recomendada de Execução

  1. Correção 1 (Campo saldoAtual não setado) - CRÍTICA - Resolve o problema principal
  2. Correção 2 (Tratamento de NULL) - CRÍTICA - Evita erros
  3. Correção 4 (Ordenação) - IMPORTANTE - Corrige ordem das contas
  4. Correção 3 (COALESCE SQL) - MELHORIA - Simplifica código
  5. Correção 5 (Revisar filtro) - REVISÃO - Confirmar requisitos
  6. Correção 6 (Logs) - DIAGNÓSTICO - Ajuda em problemas futuros
  7. Correção 7 (Validação) - MELHORIA - Boa prática

Testes Recomendados

Após aplicar as correções, testar:

  1. Teste de Valores:
  2. Gerar balancete mensal com contas que têm saldo
  3. Verificar se todos os valores aparecem corretamente
  4. Verificar se contas com saldo 0 aparecem (se valoresZerados = true)

  5. Teste de Ordenação:

  6. Gerar relatório com contas: 1, 1.1, 1.2, 1.9, 1.10, 1.11
  7. Verificar se aparecem na ordem correta

  8. Teste de NULL:

  9. Gerar relatório para período sem movimentação
  10. Verificar se não há erros e valores aparecem como 0.00

  11. Teste de Contas Agrupadoras:

  12. Verificar se contas com filhos (nrfilhos > 0) mostram valores corretamente

Aprovação

  • [ ] Correção 1 aprovada
  • [ ] Correção 2 aprovada
  • [ ] Correção 3 aprovada
  • [ ] Correção 4 aprovada
  • [ ] Correção 5 aprovada
  • [ ] Correção 6 aprovada
  • [ ] Correção 7 aprovada

Data de Aprovação: __
Aprovado por: __