fixes bug#AL-4854

Correção do Digito verficador itau
master
Gleison da Cruz 2024-08-30 10:20:08 -03:00
parent e73e3ff118
commit a882c3e947
6 changed files with 166 additions and 93 deletions

View File

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>br.com.rjconsultores</groupId> <groupId>br.com.rjconsultores</groupId>
<artifactId>ModelWeb</artifactId> <artifactId>ModelWeb</artifactId>
<version>1.102.0</version> <version>1.102.1</version>
<distributionManagement> <distributionManagement>
<repository> <repository>

View File

@ -8,5 +8,6 @@ public interface FechamentoParamgeralDAO extends GenericDAO<FechamentoParamgeral
public List<FechamentoParamgeral> buscaParametrosPorEmpresas(List<Integer> empresasId); public List<FechamentoParamgeral> buscaParametrosPorEmpresas(List<Integer> empresasId);
public List<FechamentoParamgeral> buscaParametrosPorEmpresa(Integer empresasId); public List<FechamentoParamgeral> buscaParametrosPorEmpresa(Integer empresasId);
public FechamentoParamgeral buscaParametrosPorEmpresasBanco(Integer empresaId, String boletoBancoCod);
} }

View File

@ -12,6 +12,7 @@ import org.springframework.stereotype.Repository;
import com.rjconsultores.ventaboletos.dao.FechamentoParamgeralDAO; import com.rjconsultores.ventaboletos.dao.FechamentoParamgeralDAO;
import com.rjconsultores.ventaboletos.entidad.FechamentoParamgeral; import com.rjconsultores.ventaboletos.entidad.FechamentoParamgeral;
import com.rjconsultores.ventaboletos.entidad.FechamentoParamptovta;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
@Repository("fechamentoParamgeralDAO") @Repository("fechamentoParamgeralDAO")
@ -60,4 +61,15 @@ public class FechamentoParamgeralHibernateDAO extends GenericHibernateDAO<Fecham
actualizacion(entity); actualizacion(entity);
} }
@Override
public FechamentoParamgeral buscaParametrosPorEmpresasBanco(Integer empresaId, String boletoBancoCod) {
Criteria query = getSession().createCriteria(getPersistentClass());
query.createAlias("empresa", "emp");
query.add(Restrictions.eq("emp.empresaId", empresaId));
query.add(Restrictions.eq("boletoBancoCod", boletoBancoCod));
query.add(Restrictions.eq(ACTIVO, Boolean.TRUE));
return (FechamentoParamgeral) query.uniqueResult();
}
} }

View File

@ -9,5 +9,5 @@ public interface FechamentoParamgeralService extends GenericService<FechamentoPa
public List<FechamentoParamgeral> buscaParametrosPorEmpresas(List<Integer> empresasId); public List<FechamentoParamgeral> buscaParametrosPorEmpresas(List<Integer> empresasId);
public List<FechamentoParamgeral> buscaParametrosPorEmpresa(Integer empresasId); public List<FechamentoParamgeral> buscaParametrosPorEmpresa(Integer empresasId);
public FechamentoParamgeral suscribirOrActualizacion(FechamentoParamgeral fechamentoParamgeral); public FechamentoParamgeral suscribirOrActualizacion(FechamentoParamgeral fechamentoParamgeral);
public FechamentoParamgeral buscaParametrosPorEmpresasBanco(Integer empresasId, String boletoBancoCod);
} }

View File

@ -69,4 +69,14 @@ public class FechamentoParamgeralServiceImpl implements FechamentoParamgeralServ
} }
return null; return null;
} }
@Override
public FechamentoParamgeral buscaParametrosPorEmpresasBanco(Integer empresaId, String boletoBancoCod) {
return fechamentoParamgeralDAO.buscaParametrosPorEmpresasBanco(empresaId, boletoBancoCod);
}
} }

View File

@ -5,6 +5,7 @@ import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.SQLException; import java.sql.SQLException;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
@ -20,23 +21,30 @@ import com.rjconsultores.ventaboletos.blocos.safra.DetalheRetornoSafra;
import com.rjconsultores.ventaboletos.dao.RemessaCNABBancosDAO; import com.rjconsultores.ventaboletos.dao.RemessaCNABBancosDAO;
import com.rjconsultores.ventaboletos.entidad.Empresa; import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.FechamentoBoleto; import com.rjconsultores.ventaboletos.entidad.FechamentoBoleto;
import com.rjconsultores.ventaboletos.entidad.FechamentoParamgeral;
import com.rjconsultores.ventaboletos.enuns.BancoLayout; import com.rjconsultores.ventaboletos.enuns.BancoLayout;
import com.rjconsultores.ventaboletos.service.FechamentoParamgeralService;
import com.rjconsultores.ventaboletos.service.ImportacaoRetornoBancarioService; import com.rjconsultores.ventaboletos.service.ImportacaoRetornoBancarioService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.utils.NossoNumeroUtils;
@Service("importacaoRetornoBancarioService") @Service("importacaoRetornoBancarioService")
public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBancarioService { public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBancarioService {
private static final String LIQUIDACAO_NORMAL = "06"; private static final String LIQUIDACAO_NORMAL = "06";
private static final String LIQUIDACAO_EM_CARTORIO = "08"; private static final String LIQUIDACAO_EM_CARTORIO = "08";
@Autowired @Autowired
private RemessaCNABBancosDAO remessaCNABBancosDAO; private RemessaCNABBancosDAO remessaCNABBancosDAO;
@Autowired
private FechamentoParamgeralService fechamentoParamgeralService;
private static final Logger log = LogManager.getLogger(ImportacaoRetornoBancarioServiceImpl.class); private static final Logger log = LogManager.getLogger(ImportacaoRetornoBancarioServiceImpl.class);
@Override @Override
public String lerArquivo(ByteArrayInputStream bais, Empresa empresa){ public String lerArquivo(ByteArrayInputStream bais, Empresa empresa) {
StringBuilder resultado = new StringBuilder(); StringBuilder resultado = new StringBuilder();
StringBuilder detalhado = new StringBuilder(); StringBuilder detalhado = new StringBuilder();
@ -48,12 +56,12 @@ public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBa
BancoLayout banco = BancoLayout.getInstanceByCodBanco(remessaCNABBancosDAO.findBanco(empresa)); BancoLayout banco = BancoLayout.getInstanceByCodBanco(remessaCNABBancosDAO.findBanco(empresa));
ArquivoRetornoItem retornoBancario = processaRetornoBancario(bais, banco); ArquivoRetornoItem retornoBancario = processaRetornoBancario(bais, banco);
if( retornoBancario == null ) { if (retornoBancario == null) {
resultado.append("O banco cadastrado para a empresa não tem Implementação de retorno bancário"); resultado.append("O banco cadastrado para a empresa não tem Implementação de retorno bancário");
return resultado.toString(); return resultado.toString();
} }
if(!banco.getCodBanco().equals(retornoBancario.getCabecalhoRetorno().getCodigoBanco())) { if (!banco.getCodBanco().equals(retornoBancario.getCabecalhoRetorno().getCodigoBanco())) {
resultado.append("O banco cadastrado para a empresa não é o mesmo do arquivo selecionado"); resultado.append("O banco cadastrado para a empresa não é o mesmo do arquivo selecionado");
return resultado.toString(); return resultado.toString();
} }
@ -62,20 +70,22 @@ public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBa
Integer usuarioId = UsuarioLogado.getUsuarioLogado().getUsuarioId(); Integer usuarioId = UsuarioLogado.getUsuarioLogado().getUsuarioId();
try { try {
if( !detalhe.getCodigoOcorrencia().equals(LIQUIDACAO_NORMAL) if (!detalhe.getCodigoOcorrencia().equals(LIQUIDACAO_NORMAL)
&& !detalhe.getCodigoOcorrencia().equals(LIQUIDACAO_EM_CARTORIO) ) { && !detalhe.getCodigoOcorrencia().equals(LIQUIDACAO_EM_CARTORIO)) {
erros++; erros++;
detalhado.append("Registro sem ocorrencia de quitação: ").append(detalhe.getNossoNumero()).append(".\n"); detalhado.append("Registro sem ocorrencia de quitação: ").append(detalhe.getNossoNumero())
}else .append(".\n");
if( salvarRetornoBancario( detalhe, empresa.getEmpresaId(), usuarioId )) { } else
atualizados++; atualizados++;
if (salvarRetornoBancario(detalhe, empresa.getEmpresaId(), usuarioId)) {
detalhado.append("Quitado:").append(detalhe.getNossoNumero()).append(".\n"); detalhado.append("Quitado:").append(detalhe.getNossoNumero()).append(".\n");
}else { } else {
erros++; erros++;
detalhado.append("Nao Quitado: ").append(detalhe.getNossoNumero()).append(".\n"); detalhado.append("Nao Quitado: ").append(detalhe.getNossoNumero()).append(".\n");
} }
} catch (SQLException se) { } catch (SQLException se) {
detalhado.append("Ocorreu um erro no banco de dados: ").append(detalhe.getNossoNumero()).append(".\n"); detalhado.append("Ocorreu um erro no banco de dados: ").append(detalhe.getNossoNumero())
.append(".\n");
log.error(se); log.error(se);
erros++; erros++;
} catch (RuntimeException re) { } catch (RuntimeException re) {
@ -86,9 +96,9 @@ public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBa
} }
resultado.append("Arquivo Processado "); resultado.append("Arquivo Processado ");
if(erros > 0) { if (erros > 0) {
resultado.append("com ressalvas.\n"); resultado.append("com ressalvas.\n");
}else { } else {
resultado.append("com sucesso. \n"); resultado.append("com sucesso. \n");
} }
resultado.append("Quitados ").append(atualizados).append(".\n"); resultado.append("Quitados ").append(atualizados).append(".\n");
@ -101,7 +111,7 @@ public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBa
log.error(ioe); log.error(ioe);
return resultado.toString(); return resultado.toString();
} catch (RuntimeException re) { } catch (RuntimeException re) {
resultado.append( re.getMessage() ); resultado.append(re.getMessage());
log.error(re); log.error(re);
return resultado.toString(); return resultado.toString();
} catch (Exception e) { } catch (Exception e) {
@ -111,18 +121,20 @@ public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBa
} }
} }
private ArquivoRetornoItem processaRetornoBancario(ByteArrayInputStream bais, BancoLayout banco) throws IOException{ private ArquivoRetornoItem processaRetornoBancario(ByteArrayInputStream bais, BancoLayout banco)
throws IOException {
if(BancoLayout.ITAU_400_Envio.equals(banco)){ if (BancoLayout.ITAU_400_Envio.equals(banco)) {
return geraRetornoBancarioItau(bais, banco); return geraRetornoBancarioItau(bais, banco);
}else if(BancoLayout.SAFRA_400_Envio.equals(banco)){ } else if (BancoLayout.SAFRA_400_Envio.equals(banco)) {
return geraRetornoBancarioSafra(bais); return geraRetornoBancarioSafra(bais);
}else { } else {
return null; return null;
} }
} }
private ArquivoRetornoItem geraRetornoBancarioItau(ByteArrayInputStream bais, BancoLayout banco) throws IOException { private ArquivoRetornoItem geraRetornoBancarioItau(ByteArrayInputStream bais, BancoLayout banco)
throws IOException {
String linha = null; String linha = null;
ArquivoRetornoItem arquivo = new ArquivoRetornoItem(); ArquivoRetornoItem arquivo = new ArquivoRetornoItem();
CabecalhoRetorno cabecalho = new CabecalhoRetorno(); CabecalhoRetorno cabecalho = new CabecalhoRetorno();
@ -131,22 +143,22 @@ public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBa
while ((linha = leitor.readLine()) != null) { while ((linha = leitor.readLine()) != null) {
if( linha.startsWith("0")) { //cabecalho if (linha.startsWith("0")) { // cabecalho
cabecalho.setCodigoBanco(linha.substring(76, 79)); cabecalho.setCodigoBanco(linha.substring(76, 79));
continue; continue;
} }
if(linha.startsWith("1")) { //detalhe if (linha.startsWith("1")) { // detalhe
DetalheRetornoItau detalhe = new DetalheRetornoItau(); DetalheRetornoItau detalhe = new DetalheRetornoItau();
detalhe.setCodigoOcorrencia(linha.substring(108, 110)); detalhe.setCodigoOcorrencia(linha.substring(108, 110));
detalhe.setValorJuros( new BigDecimal(linha.substring(266, 279)).divide(new BigDecimal(100)) ); detalhe.setValorJuros(new BigDecimal(linha.substring(266, 279)).divide(new BigDecimal(100)));
detalhe.setNossoNumero(linha.substring(85, 93)+"-"+linha.substring(93, 94)); detalhe.setNossoNumero(linha.substring(85, 93) + "-" + linha.substring(93, 94));
detalhe.setDataBaixa(linha.substring(110, 116)); detalhe.setDataBaixa(linha.substring(110, 116));
arquivo.addTitulo(detalhe); arquivo.addTitulo(detalhe);
continue; continue;
} }
if(linha.startsWith("9")) { //rodape if (linha.startsWith("9")) { // rodape
} }
} }
@ -158,7 +170,7 @@ public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBa
return arquivo; return arquivo;
} }
private ArquivoRetornoItem geraRetornoBancarioSafra(ByteArrayInputStream bais) throws IOException { private ArquivoRetornoItem geraRetornoBancarioSafra(ByteArrayInputStream bais) throws IOException {
String linha = null; String linha = null;
ArquivoRetornoItem arquivo = new ArquivoRetornoItem(); ArquivoRetornoItem arquivo = new ArquivoRetornoItem();
CabecalhoRetorno cabecalho = new CabecalhoRetorno(); CabecalhoRetorno cabecalho = new CabecalhoRetorno();
@ -167,23 +179,23 @@ public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBa
while ((linha = leitor.readLine()) != null) { while ((linha = leitor.readLine()) != null) {
if( linha.startsWith("0")) { //cabecalho if (linha.startsWith("0")) { // cabecalho
cabecalho.setCodigoBanco(linha.substring(76, 79)); cabecalho.setCodigoBanco(linha.substring(76, 79));
continue; continue;
} }
if(linha.startsWith("1")) { //detalhe if (linha.startsWith("1")) { // detalhe
DetalheRetornoSafra detalhe = new DetalheRetornoSafra(); DetalheRetornoSafra detalhe = new DetalheRetornoSafra();
detalhe.setIdBoletoFechamento(Integer.valueOf(linha.substring(116, 126))); detalhe.setIdBoletoFechamento(Integer.valueOf(linha.substring(116, 126)));
detalhe.setCodigoOcorrencia(linha.substring(108, 110)); detalhe.setCodigoOcorrencia(linha.substring(108, 110));
detalhe.setValorJuros( new BigDecimal(linha.substring(267, 279)).divide(new BigDecimal(100)) ); detalhe.setValorJuros(new BigDecimal(linha.substring(267, 279)).divide(new BigDecimal(100)));
detalhe.setNossoNumero(linha.substring(61, 70)+"-"+linha.substring(70, 71)); detalhe.setNossoNumero(linha.substring(61, 70) + "-" + linha.substring(70, 71));
detalhe.setDataBaixa(linha.substring(295, 301)); detalhe.setDataBaixa(linha.substring(295, 301));
arquivo.addTitulo(detalhe); arquivo.addTitulo(detalhe);
continue; continue;
} }
if(linha.startsWith("9")) { //rodape if (linha.startsWith("9")) { // rodape
} }
} }
@ -196,44 +208,82 @@ public class ImportacaoRetornoBancarioServiceImpl implements ImportacaoRetornoBa
} }
@Override @Override
public boolean salvarRetornoBancario(DetalheRetorno detalhe, Integer empresaId, Integer usuarioId) throws SQLException { public boolean salvarRetornoBancario(DetalheRetorno detalhe, Integer empresaId, Integer usuarioId)
throws SQLException {
if(detalhe instanceof DetalheRetornoSafra ) { if (detalhe instanceof DetalheRetornoSafra) {
return salvarRetornoBancario(detalhe, usuarioId); return salvarRetornoBancario(detalhe, usuarioId);
} }
FechamentoBoleto boleto = remessaCNABBancosDAO.obtenerFechamentoBoletoPorNossoNumero( detalhe.getNossoNumero(), empresaId ); FechamentoBoleto boleto = remessaCNABBancosDAO.obtenerFechamentoBoletoPorNossoNumero(detalhe.getNossoNumero(),
empresaId);
if(boleto == null) { if (boleto == null) {
throw new RuntimeException("Fechamento não encontrado para a empresa com o nosso numero: "+detalhe.getNossoNumero()); if (detalhe instanceof DetalheRetornoItau) {
return validaDacItau(detalhe, empresaId, usuarioId);
} else {
throw new RuntimeException(
"Fechamento não encontrado para a empresa com o nosso numero: " + detalhe.getNossoNumero());
}
} }
if( boleto.getIndBoletoQuitado() !=null && boleto.getIndBoletoQuitado()) { if (boleto.getIndBoletoQuitado() != null && boleto.getIndBoletoQuitado()) {
throw new RuntimeException("Boleto já quitado para a empresa com o nosso numero: "+detalhe.getNossoNumero()); throw new RuntimeException(
"Boleto já quitado para a empresa com o nosso numero: " + detalhe.getNossoNumero());
} }
return remessaCNABBancosDAO.quitarFechamentoBoleto( boleto.getFechamentoboletoId(), usuarioId, detalhe ); return remessaCNABBancosDAO.quitarFechamentoBoleto(boleto.getFechamentoboletoId(), usuarioId, detalhe);
} }
@Override @Override
public boolean salvarRetornoBancario(DetalheRetorno detalhe, Integer usuarioId) throws SQLException { public boolean salvarRetornoBancario(DetalheRetorno detalhe, Integer usuarioId) throws SQLException {
FechamentoBoleto boleto = remessaCNABBancosDAO.obtenerFechamentoBoletoPorId( detalhe.getIdBoletoFechamento() ); FechamentoBoleto boleto = remessaCNABBancosDAO.obtenerFechamentoBoletoPorId(detalhe.getIdBoletoFechamento());
if(boleto == null) { if (boleto == null) {
throw new RuntimeException("Fechamento não encontrado com o ID: "+detalhe.getIdBoletoFechamento()); throw new RuntimeException("Fechamento não encontrado com o ID: " + detalhe.getIdBoletoFechamento());
} }
if(boleto.getNossonumero() !=null && !boleto.getNossonumero().equals(detalhe.getNossoNumero())) { if (boleto.getNossonumero() != null && !boleto.getNossonumero().equals(detalhe.getNossoNumero())) {
throw new RuntimeException("Fechamento encontrado o nosso numero inconsistente: "+detalhe.getNossoNumero()); throw new RuntimeException(
"Fechamento encontrado o nosso numero inconsistente: " + detalhe.getNossoNumero());
} }
if( boleto.getIndBoletoQuitado() !=null && boleto.getIndBoletoQuitado()) { if (boleto.getIndBoletoQuitado() != null && boleto.getIndBoletoQuitado()) {
throw new RuntimeException("Boleto já quitado para a empresa com o nosso numero: "+detalhe.getNossoNumero()); throw new RuntimeException(
"Boleto já quitado para a empresa com o nosso numero: " + detalhe.getNossoNumero());
} }
return remessaCNABBancosDAO.quitarFechamentoBoleto( detalhe, usuarioId ); return remessaCNABBancosDAO.quitarFechamentoBoleto(detalhe, usuarioId);
} }
public boolean validaDacItau(DetalheRetorno detalhe, Integer empresaId, Integer usuarioId) throws SQLException {
FechamentoParamgeral dadosContaItau = fechamentoParamgeralService.buscaParametrosPorEmpresasBanco(empresaId, "341");
BigInteger nossoNumero = new BigInteger(detalhe.getNossoNumero().substring(0, 7));
if (dadosContaItau != null) {
String dacItau = NossoNumeroUtils.dacItau(
Integer.valueOf(dadosContaItau.getBoletoBancoAgencia()),
Integer.valueOf(dadosContaItau.getBoletoBancoConta()),
Integer.valueOf(dadosContaItau.getBoletoBancoCarteira()),
nossoNumero);
detalhe.setNossoNumero(detalhe.getNossoNumero().substring(0, 7) + "-" + dacItau);
FechamentoBoleto boleto = remessaCNABBancosDAO.obtenerFechamentoBoletoPorNossoNumero(detalhe.getNossoNumero(),
empresaId);
if (boleto == null) {
throw new RuntimeException("Fechamento não encontrado para a empresa com o nosso numero: " + detalhe.getNossoNumero());
}
if (boleto.getIndBoletoQuitado() != null && boleto.getIndBoletoQuitado()) {
throw new RuntimeException(
"Boleto já quitado para a empresa com o nosso numero: " + detalhe.getNossoNumero());
}
return remessaCNABBancosDAO.quitarFechamentoBoleto(boleto.getFechamentoboletoId(), usuarioId, detalhe);
}else
throw new RuntimeException("Dados da conta não encontrados : " + detalhe.getIdBoletoFechamento());
}
} }