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

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

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() - Tabela: CT_Plano LEFT JOIN CT_Plano_Saldo - Campos de valores:
    • MovDeb as TotDeb (movimentação débito)
    • movcred as TotCred (movimentação crédito)
    • saldoacumulado as Saldofinal (saldo final acumulado)
  3. Processamento: - Os dados são retornados já ordenados pelo banco (ORDER BY CdContabil) - O código Java processa os dados na ordem recebida (linhas 149-247 em ProcedureBalanceteMensalServiceImpl.java) - Não há reordenação customizada no Java

Valores e Saldos

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

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() - Tabela: CT_BalDiario_TMP - 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)
  3. Processamento: - Dados são inseridos em tabelas temporárias através de procedures SQL - A ordenação final é feita na query de seleção (linha 327 em ProceduresServiceImpl.java)

Valores e Saldos

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

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() - Tabela: CT_V_Lancamentos (view) - Campos principais:
    • ContaId (código da conta)
    • ContraPartida (conta contrapartida)
    • Valor (valor do lançamento)
    • DebCre (débito/crédito)
  3. Processamento: - Dados são inseridos em tabela temporária CT_ListaLancto_TMP - A ordenação é feita na query SQL final

Valores e Lançamentos

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

Balancete Diário

Listagem de Lançamentos


Recomendações para Correção

1. Ordenação de Contas

Solução Proposta

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

  2. Ou processar no Java: - Remover o dígito verificador antes de ordenar - Usar Comparator customizado para ordenação numérica natural - Exemplo: Collections.sort(contas, new ContaContabilComparator())

  3. Função auxiliar para remover dígito verificador: java 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: - Revisar a query em TempPlanoRepository.getTempPlanoProjection() - Verificar se o LEFT JOIN está correto - Verificar se há registros em CT_Plano_Saldo para o período

  2. Verificar filtro de valores zerados: - Confirmar se o parâmetro valoresZerados está sendo passado corretamente - Verificar se contas com saldo 0 devem aparecer ou não

  3. Adicionar logs de debug: - Logar os valores de saldoFinal antes da formatação - Verificar se os valores estão chegando do banco

  4. Verificar formatação: - Revisar FormatacaoValores.formataValoresNumericosBalancete() - 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 - Modificar queries getTempPlanoProjection() e getTempPlanoProjectionConsolidado() - Adicionar ordenação numérica natural

  2. ecosif-reports/src/main/java/io/ecosif/reports/repository/CtBalDiarioTmpRepository.java - Modificar query findByUsuarioIdOrderByCdcontabil() - Adicionar ordenação numérica natural

  3. ecosif-reports/src/main/java/io/ecosif/reports/utils/FormatacaoValores.java (ou criar nova classe) - Adicionar método para remover dígito verificador - 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 - Adicionar logs de debug - Verificar tratamento de valores NULL - Verificar formatação de valores

  2. ecosif-reports/src/main/java/io/ecosif/reports/repository/TempPlanoRepository.java - Revisar query de agregação de saldos - 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: - Valores NULL não sendo tratados corretamente - Filtro de valores zerados removendo contas que deveriam aparecer - Problema na agregação SQL dos saldos - 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: - Gerar balancete mensal com contas que têm saldo - Verificar se todos os valores aparecem corretamente - Verificar se contas com saldo 0 aparecem (se valoresZerados = true)

  2. Teste de Ordenação: - Gerar relatório com contas: 1, 1.1, 1.2, 1.9, 1.10, 1.11 - Verificar se aparecem na ordem correta

  3. Teste de NULL: - Gerar relatório para período sem movimentação - Verificar se não há erros e valores aparecem como 0.00

  4. Teste de Contas Agrupadoras: - Verificar se contas com filhos (nrfilhos > 0) mostram valores corretamente


Aprovação

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