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-2deve ser tratada como1.1para ordenação - Exemplo 2: Conta
1.1.1.1.-4deve ser tratada como1.1.1.1para 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()egetTempPlanoProjectionConsolidado() - 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
- Procedure:
cTPBalMensalL()emProceduresServiceImpl.java(linha 1149) - Query Principal:
TempPlanoRepository.getTempPlanoProjection()- Tabela:CT_PlanoLEFT JOINCT_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)
- 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 emProcedureBalanceteMensalServiceImpl.java) - Não há reordenação customizada no Java
Valores e Saldos
- Saldo Final: Vem de
tempPlanos.get(i).getSaldofinal()(linha 151) - Origem: Campo
saldoacumuladoda tabelaCT_Plano_Saldo - Cálculo: O saldo é calculado no banco de dados através de agregações na query
- Problema Potencial: Se
saldoacumuladoestiver 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
- Procedure:
ctPBalDiarioRelatorio()emProceduresServiceImpl.java(linha 120) - 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)
- 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
- 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()egetCtVLancamentosDocumentoProjection() - 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
- Procedure:
ctPLancamento()emProceduresServiceImpl.java(linha 626) - 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)
- Processamento:
- Dados são inseridos em tabela temporária
CT_ListaLancto_TMP- 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êsmovcred: Movimentação crédito do mêssaldoacumulado: 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ábeisCT_Plano_Saldo: Saldos iniciaisCT_Plano: Plano de contas- Campos:
totdeb: Total débito do períodototcred: Total crédito do períodosaldoinicial: Saldo inicial do períodosdmedio: 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çamentoDebCre: Indicador de débito/créditoContaId: Código da contaContraPartida: 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
-
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) -
Ou processar no Java: - Remover o dígito verificador antes de ordenar - Usar
Comparatorcustomizado para ordenação numérica natural - Exemplo:Collections.sort(contas, new ContaContabilComparator()) -
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
-
Verificar se
saldoacumuladoestá sendo calculado corretamente: - Revisar a query emTempPlanoRepository.getTempPlanoProjection()- Verificar se oLEFT JOINestá correto - Verificar se há registros emCT_Plano_Saldopara o período -
Verificar filtro de valores zerados: - Confirmar se o parâmetro
valoresZeradosestá sendo passado corretamente - Verificar se contas com saldo 0 devem aparecer ou não -
Adicionar logs de debug: - Logar os valores de
saldoFinalantes da formatação - Verificar se os valores estão chegando do banco -
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
-
ecosif-reports/src/main/java/io/ecosif/reports/repository/TempPlanoRepository.java- Modificar queriesgetTempPlanoProjection()egetTempPlanoProjectionConsolidado()- Adicionar ordenação numérica natural -
ecosif-reports/src/main/java/io/ecosif/reports/repository/CtBalDiarioTmpRepository.java- Modificar queryfindByUsuarioIdOrderByCdcontabil()- Adicionar ordenação numérica natural -
ecosif-reports/src/main/java/io/ecosif/reports/utils/FormatacaoValores.java(ou criar nova classe) - Adicionar método para remover dígito verificador - AdicionarComparatorpara ordenação numérica natural de contas
Para Correção dos Valores
-
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 -
ecosif-reports/src/main/java/io/ecosif/reports/repository/TempPlanoRepository.java- Revisar query de agregação de saldos - VerificarLEFT JOINcomCT_Plano_Saldo
Conclusão
Os problemas identificados são:
-
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. -
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
- Correção 1 (Campo
saldoAtualnão setado) - CRÍTICA - Resolve o problema principal - Correção 2 (Tratamento de NULL) - CRÍTICA - Evita erros
- Correção 4 (Ordenação) - IMPORTANTE - Corrige ordem das contas
- Correção 3 (COALESCE SQL) - MELHORIA - Simplifica código
- Correção 5 (Revisar filtro) - REVISÃO - Confirmar requisitos
- Correção 6 (Logs) - DIAGNÓSTICO - Ajuda em problemas futuros
- Correção 7 (Validação) - MELHORIA - Boa prática
Testes Recomendados
Após aplicar as correções, testar:
-
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) -
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
-
Teste de NULL: - Gerar relatório para período sem movimentação - Verificar se não há erros e valores aparecem como 0.00
-
Teste de Contas Agrupadoras: - 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: __