From 087bfe0ce1842f5d2a731a02169dcc13cdb7de8d Mon Sep 17 00:00:00 2001 From: "fabio.fbarreto" Date: Tue, 26 Dec 2023 09:20:28 -0300 Subject: [PATCH] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20do=20banco=20SAFRA=20?= =?UTF-8?q?feat=20bug#AL-3376?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +- ...lheObrigatorioDadosTitulosBancoBrasil.java | 8 +- .../bancobrasil/RodapeRemessaBancoBrasil.java | 2 +- .../blocos/safra/ArquivoRemessaSafra.java | 42 +++ .../blocos/safra/CabecalhoRemessaSafra.java | 74 ++++ .../blocos/safra/DetalheObrigatorioSafra.java | 319 ++++++++++++++++++ .../blocos/safra/DetalheRetornoSafra.java | 104 ++++++ .../blocos/safra/RodapeRemessaSafra.java | 47 +++ .../sicoob/DetalheObrigatorioSicoob.java | 10 +- .../enuns/{AceiteBB.java => Aceite.java} | 4 +- .../ventaboletos/enuns/BancoLayout.java | 75 +++- .../layouts/AbstractFlatFile.java | 5 + .../ventaboletos/layouts/CNABFactory.java | 2 + .../ventaboletos/layouts/SafraFlatFile.java | 131 +++++++ .../ventaboletos/utils/NossoNumeroUtils.java | 72 +++- src/layouts/LayoutSafraCNAB400Envio.txg.xml | 109 ++++++ 16 files changed, 972 insertions(+), 38 deletions(-) create mode 100644 src/com/rjconsultores/ventaboletos/blocos/safra/ArquivoRemessaSafra.java create mode 100644 src/com/rjconsultores/ventaboletos/blocos/safra/CabecalhoRemessaSafra.java create mode 100644 src/com/rjconsultores/ventaboletos/blocos/safra/DetalheObrigatorioSafra.java create mode 100644 src/com/rjconsultores/ventaboletos/blocos/safra/DetalheRetornoSafra.java create mode 100644 src/com/rjconsultores/ventaboletos/blocos/safra/RodapeRemessaSafra.java rename src/com/rjconsultores/ventaboletos/enuns/{AceiteBB.java => Aceite.java} (71%) create mode 100644 src/com/rjconsultores/ventaboletos/layouts/SafraFlatFile.java create mode 100644 src/layouts/LayoutSafraCNAB400Envio.txg.xml diff --git a/pom.xml b/pom.xml index c9b0a909e..d9af0688a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ br.com.rjconsultores GeneradorBoletosCNAB - 1.4.1 + 1.5.0 GeneradorBoletosCNAB @@ -57,8 +57,8 @@ br.com.rjconsultores - jrimum-texgit - 1.0.0 + jrimum-bopepo + 1.1.0 sun-jaxb-rj diff --git a/src/com/rjconsultores/ventaboletos/blocos/bancobrasil/DetalheObrigatorioDadosTitulosBancoBrasil.java b/src/com/rjconsultores/ventaboletos/blocos/bancobrasil/DetalheObrigatorioDadosTitulosBancoBrasil.java index 63a061408..f03434bfc 100644 --- a/src/com/rjconsultores/ventaboletos/blocos/bancobrasil/DetalheObrigatorioDadosTitulosBancoBrasil.java +++ b/src/com/rjconsultores/ventaboletos/blocos/bancobrasil/DetalheObrigatorioDadosTitulosBancoBrasil.java @@ -4,7 +4,7 @@ import java.math.BigDecimal; import java.util.Date; import com.rjconsultores.ventaboletos.blocos.DetalheObrigatorio; -import com.rjconsultores.ventaboletos.enuns.AceiteBB; +import com.rjconsultores.ventaboletos.enuns.Aceite; public class DetalheObrigatorioDadosTitulosBancoBrasil implements DetalheObrigatorio, Cloneable { @@ -26,7 +26,7 @@ public class DetalheObrigatorioDadosTitulosBancoBrasil implements DetalheObrigat private BigDecimal valor; private String agenciaCobradora; private String digAgenciaCobradora; - private AceiteBB aceite; + private Aceite aceite; private Date emissao; private Integer codMora; private Date dataMora; @@ -195,11 +195,11 @@ public class DetalheObrigatorioDadosTitulosBancoBrasil implements DetalheObrigat this.digAgenciaCobradora = digAgenciaCobradora; } - public AceiteBB getAceite() { + public Aceite getAceite() { return aceite; } - public void setAceite(AceiteBB aceite) { + public void setAceite(Aceite aceite) { this.aceite = aceite; } diff --git a/src/com/rjconsultores/ventaboletos/blocos/bancobrasil/RodapeRemessaBancoBrasil.java b/src/com/rjconsultores/ventaboletos/blocos/bancobrasil/RodapeRemessaBancoBrasil.java index 4270a6d85..59f36852f 100644 --- a/src/com/rjconsultores/ventaboletos/blocos/bancobrasil/RodapeRemessaBancoBrasil.java +++ b/src/com/rjconsultores/ventaboletos/blocos/bancobrasil/RodapeRemessaBancoBrasil.java @@ -3,7 +3,7 @@ package com.rjconsultores.ventaboletos.blocos.bancobrasil; import com.rjconsultores.ventaboletos.blocos.RodapeRemessa; import com.rjconsultores.ventaboletos.blocos.RodapeRemessaPadrao; -public class RodapeRemessaBancoBrasil extends RodapeRemessaPadrao implements RodapeRemessa { +public class RodapeRemessaBancoBrasil extends RodapeRemessaPadrao { private Integer loteServico; private Integer qtdLotes; diff --git a/src/com/rjconsultores/ventaboletos/blocos/safra/ArquivoRemessaSafra.java b/src/com/rjconsultores/ventaboletos/blocos/safra/ArquivoRemessaSafra.java new file mode 100644 index 000000000..73837a2d0 --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/safra/ArquivoRemessaSafra.java @@ -0,0 +1,42 @@ +package com.rjconsultores.ventaboletos.blocos.safra; + +import java.util.ArrayList; + +import com.rjconsultores.ventaboletos.ArquivoRemessaItem; +import com.rjconsultores.ventaboletos.blocos.CabecalhoRemessa; +import com.rjconsultores.ventaboletos.blocos.DetalheObrigatorio; +import com.rjconsultores.ventaboletos.blocos.RodapeRemessa; +import com.rjconsultores.ventaboletos.blocos.RodapeRemessaPadrao; + +public class ArquivoRemessaSafra extends ArquivoRemessaItem { + + @Override + public void setCabecalhoRemessa(CabecalhoRemessa cabecalhoRemessa) { + + if(cabecalhoRemessa instanceof CabecalhoRemessaSafra){ + super.setCabecalhoRemessa(cabecalhoRemessa); + }else{ + throw new ClassCastException("Somente cabecalho tipo: " + CabecalhoRemessaSafra.class.getName()); + } + } + + @Override + public void addTitulo(DetalheObrigatorio titulo){ + if(this.titulos == null){ + this.titulos = new ArrayList(); + } + + if(titulo instanceof DetalheObrigatorioSafra){ + titulo.setNumeroSequencialRegistro(titulos.size() + 2); + this.titulos.add(titulo); + }else{ + throw new ClassCastException("Somente cabecalho tipo: " + DetalheObrigatorioSafra.class.getName()); + } + } + + @Override + public RodapeRemessa getRodapeRemessa() { + this.rodapeRemessa = this.rodapeRemessa == null ? new RodapeRemessaSafra() : this.rodapeRemessa; + return rodapeRemessa; + } +} diff --git a/src/com/rjconsultores/ventaboletos/blocos/safra/CabecalhoRemessaSafra.java b/src/com/rjconsultores/ventaboletos/blocos/safra/CabecalhoRemessaSafra.java new file mode 100644 index 000000000..9b1fa183c --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/safra/CabecalhoRemessaSafra.java @@ -0,0 +1,74 @@ +package com.rjconsultores.ventaboletos.blocos.safra; + +import java.util.Date; + +import com.rjconsultores.ventaboletos.blocos.CabecalhoRemessa; + +public class CabecalhoRemessaSafra implements CabecalhoRemessa { + + private String numAgencia; + private String numContaCorrente; + private String digContaCorrente; + private String nomeEmpresa; + private Date dataGravacao; + private Integer numeroSequencialRemessa; + private Integer numeroSequencialRegistro; + + public String getNumAgencia() { + return numAgencia; + } + + public void setNumAgencia(String numAgencia) { + this.numAgencia = numAgencia; + } + + public String getNumContaCorrente() { + return numContaCorrente; + } + + public void setNumContaCorrente(String numContaCorrente) { + this.numContaCorrente = numContaCorrente; + } + + public String getDigContaCorrente() { + return digContaCorrente; + } + + public void setDigContaCorrente(String digContaCorrente) { + this.digContaCorrente = digContaCorrente; + } + + public String getNomeEmpresa() { + return nomeEmpresa; + } + + public void setNomeEmpresa(String nomeEmpresa) { + this.nomeEmpresa = nomeEmpresa; + } + + public Date getDataGravacao() { + return dataGravacao; + } + + public void setDataGravacao(Date dataGravacao) { + this.dataGravacao = dataGravacao; + } + + public Integer getNumeroSequencialRemessa() { + return numeroSequencialRemessa; + } + + public void setNumeroSequencialRemessa(Integer numeroSequencialRemessa) { + this.numeroSequencialRemessa = numeroSequencialRemessa; + } + + public Integer getNumeroSequencialRegistro() { + return numeroSequencialRegistro; + } + + public void setNumeroSequencialRegistro(Integer numeroSequencialRegistro) { + this.numeroSequencialRegistro = numeroSequencialRegistro; + } + + +} diff --git a/src/com/rjconsultores/ventaboletos/blocos/safra/DetalheObrigatorioSafra.java b/src/com/rjconsultores/ventaboletos/blocos/safra/DetalheObrigatorioSafra.java new file mode 100644 index 000000000..630bf455d --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/safra/DetalheObrigatorioSafra.java @@ -0,0 +1,319 @@ +package com.rjconsultores.ventaboletos.blocos.safra; + +import java.math.BigDecimal; +import java.util.Date; + +import com.rjconsultores.ventaboletos.blocos.DetalheObrigatorio; +import com.rjconsultores.ventaboletos.enuns.Aceite; +import com.rjconsultores.ventaboletos.enuns.TipoInscricaoPagador; + +public class DetalheObrigatorioSafra implements DetalheObrigatorio{ + + private Integer idBoletoFechamento; + private Integer cpfCnpj; + private String numCpfCnpj; + private String numAgencia; + private String numContaCorrente; + private String digContaCorrente; + private String nossoNumero; + private Date vencimento; + private BigDecimal valor; + private String agenciaCobradora; + private String especieDeTitulo; + private Aceite aceite; + private Date dataEmissao; + private String instrucao1; + private String instrucao2; + private BigDecimal jurosDeMora; + private Date dataMulta; + private BigDecimal percMulta; + private Date dataLimiteDesconto; + private BigDecimal valorDesconto = BigDecimal.ZERO; + private BigDecimal valorIOF = BigDecimal.ZERO; + private BigDecimal valorAbatimentoConcedido = BigDecimal.ZERO; + private TipoInscricaoPagador tipoInscricaoPagador; + private String numeroInscricaoPagador; + private String nomePagador; + private String enderecoPagador; + private String bairroPagador; + private String mensagem1; + private String cepPagador; + private String cidadePagador; + private String estadoPagador; + private String sacadorAvalista; + private Integer numeroSequencialRemessa; + private Integer numeroSequencialRegistro; + + public Integer getIdBoletoFechamento() { + return idBoletoFechamento; + } + + public void setIdBoletoFechamento(Integer idBoletoFechamento) { + this.idBoletoFechamento = idBoletoFechamento; + } + + public Integer getCpfCnpj() { + return cpfCnpj; + } + + public void setCpfCnpj(Integer cpfCnpj) { + this.cpfCnpj = cpfCnpj; + } + + public String getNumCpfCnpj() { + return numCpfCnpj; + } + + public void setNumCpfCnpj(String numCpfCnpj) { + this.numCpfCnpj = numCpfCnpj; + } + + public String getNumAgencia() { + return numAgencia; + } + + public void setNumAgencia(String numAgencia) { + this.numAgencia = numAgencia; + } + + public String getNumContaCorrente() { + return numContaCorrente; + } + + public void setNumContaCorrente(String numContaCorrente) { + this.numContaCorrente = numContaCorrente; + } + + public String getDigContaCorrente() { + return digContaCorrente; + } + + public void setDigContaCorrente(String digContaCorrente) { + this.digContaCorrente = digContaCorrente; + } + + public String getNossoNumero() { + return nossoNumero; + } + + public void setNossoNumero(String nossoNumero) { + this.nossoNumero = nossoNumero; + } + + public Date getVencimento() { + return vencimento; + } + + public void setVencimento(Date vencimento) { + this.vencimento = vencimento; + } + + public BigDecimal getValor() { + return valor; + } + + public void setValor(BigDecimal valor) { + this.valor = valor; + } + + public String getAgenciaCobradora() { + return agenciaCobradora; + } + + public void setAgenciaCobradora(String agenciaCobradora) { + this.agenciaCobradora = agenciaCobradora; + } + + public String getEspecieDeTitulo() { + return especieDeTitulo; + } + + public void setEspecieDeTitulo(String especieDeTitulo) { + this.especieDeTitulo = especieDeTitulo; + } + + public Aceite getAceite() { + return aceite; + } + + public void setAceite(Aceite aceite) { + this.aceite = aceite; + } + + public Date getDataEmissao() { + return dataEmissao; + } + + public void setDataEmissao(Date dataEmissao) { + this.dataEmissao = dataEmissao; + } + + public String getInstrucao1() { + return instrucao1; + } + + public void setInstrucao1(String instrucao1) { + this.instrucao1 = instrucao1; + } + + public String getInstrucao2() { + return instrucao2; + } + + public void setInstrucao2(String instrucao2) { + this.instrucao2 = instrucao2; + } + + public BigDecimal getJurosDeMora() { + return jurosDeMora; + } + + public void setJurosDeMora(BigDecimal jurosDeMora) { + this.jurosDeMora = jurosDeMora; + } + + public Date getDataMulta() { + return dataMulta; + } + + public void setDataMulta(Date dataMulta) { + this.dataMulta = dataMulta; + } + + public BigDecimal getPercMulta() { + return percMulta; + } + + public void setPercMulta(BigDecimal percMulta) { + this.percMulta = percMulta; + } + + public Date getDataLimiteDesconto() { + return dataLimiteDesconto; + } + + public void setDataLimiteDesconto(Date dataLimiteDesconto) { + this.dataLimiteDesconto = dataLimiteDesconto; + } + + public BigDecimal getValorDesconto() { + return valorDesconto; + } + + public void setValorDesconto(BigDecimal valorDesconto) { + this.valorDesconto = valorDesconto; + } + + public BigDecimal getValorIOF() { + return valorIOF; + } + + public void setValorIOF(BigDecimal valorIOF) { + this.valorIOF = valorIOF; + } + + public BigDecimal getValorAbatimentoConcedido() { + return valorAbatimentoConcedido; + } + + public void setValorAbatimentoConcedido(BigDecimal valorAbatimentoConcedido) { + this.valorAbatimentoConcedido = valorAbatimentoConcedido; + } + + public TipoInscricaoPagador getTipoInscricaoPagador() { + return tipoInscricaoPagador; + } + + public void setTipoInscricaoPagador(TipoInscricaoPagador tipoInscricaoPagador) { + this.tipoInscricaoPagador = tipoInscricaoPagador; + } + + public String getNumeroInscricaoPagador() { + return numeroInscricaoPagador; + } + + public void setNumeroInscricaoPagador(String numeroInscricaoPagador) { + this.numeroInscricaoPagador = numeroInscricaoPagador; + } + + public String getNomePagador() { + return nomePagador; + } + + public void setNomePagador(String nomePagador) { + this.nomePagador = nomePagador; + } + + public String getEnderecoPagador() { + return enderecoPagador; + } + + public void setEnderecoPagador(String enderecoPagador) { + this.enderecoPagador = enderecoPagador; + } + + public String getBairroPagador() { + return bairroPagador; + } + + public void setBairroPagador(String bairroPagador) { + this.bairroPagador = bairroPagador; + } + + public String getMensagem1() { + return mensagem1; + } + + public void setMensagem1(String mensagem1) { + this.mensagem1 = mensagem1; + } + + public String getCepPagador() { + return cepPagador; + } + + public void setCepPagador(String cepPagador) { + this.cepPagador = cepPagador; + } + + public String getCidadePagador() { + return cidadePagador; + } + + public void setCidadePagador(String cidadePagador) { + this.cidadePagador = cidadePagador; + } + + public String getEstadoPagador() { + return estadoPagador; + } + + public void setEstadoPagador(String estadoPagador) { + this.estadoPagador = estadoPagador; + } + + public String getSacadorAvalista() { + return sacadorAvalista; + } + + public void setSacadorAvalista(String sacadorAvalista) { + this.sacadorAvalista = sacadorAvalista; + } + + public Integer getNumeroSequencialRemessa() { + return numeroSequencialRemessa; + } + + public void setNumeroSequencialRemessa(Integer numeroSequencialRemessa) { + this.numeroSequencialRemessa = numeroSequencialRemessa; + } + + public Integer getNumeroSequencialRegistro() { + return numeroSequencialRegistro; + } + + public void setNumeroSequencialRegistro(Integer numeroSequencialRegistro) { + this.numeroSequencialRegistro = numeroSequencialRegistro; + } + +} diff --git a/src/com/rjconsultores/ventaboletos/blocos/safra/DetalheRetornoSafra.java b/src/com/rjconsultores/ventaboletos/blocos/safra/DetalheRetornoSafra.java new file mode 100644 index 000000000..901ffe15c --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/safra/DetalheRetornoSafra.java @@ -0,0 +1,104 @@ +package com.rjconsultores.ventaboletos.blocos.safra; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import com.rjconsultores.ventaboletos.blocos.DetalheRetorno; +import com.rjconsultores.ventaboletos.enuns.MotivoOcorrenciaBradesco; +import com.rjconsultores.ventaboletos.enuns.OcorrenciaBradesco; + +public class DetalheRetornoSafra implements DetalheRetorno, Cloneable{ + + private String numeroControleDoParticipante; + private OcorrenciaBradesco ocorrencia; + private List motivoOcorrencias; + private Integer idBoletoFechamento; + private String nossoNumero; + private String codigoOcorrencia; + private String dataBaixa; + private BigDecimal valorJuros; + private Integer numeroSequencialRegistro; + + public String getNumeroControleDoParticipante() { + return numeroControleDoParticipante; + } + + public void setNumeroControleDoParticipante(String numeroControleDoParticipante) { + this.numeroControleDoParticipante = numeroControleDoParticipante; + } + + public OcorrenciaBradesco getOcorrencia() { + return ocorrencia; + } + + public void setOcorrencia(OcorrenciaBradesco ocorrencia) { + this.ocorrencia = ocorrencia; + } + + public List getMotivoOcorrencias() { + return motivoOcorrencias; + } + + public void addMotivoOcorrencia(MotivoOcorrenciaBradesco motivoOcorrencias) { + + if(this.motivoOcorrencias == null){ + this.motivoOcorrencias = new ArrayList(); + } + + this.motivoOcorrencias.add(motivoOcorrencias); + } + + public Integer getIdBoletoFechamento() { + return idBoletoFechamento; + } + + public void setIdBoletoFechamento(Integer idBoletoFechamento) { + this.idBoletoFechamento = idBoletoFechamento; + } + + public String getNossoNumero() { + return nossoNumero; + } + + public void setNossoNumero(String nossoNumero) { + this.nossoNumero = nossoNumero; + } + + public Integer getNumeroSequencialRegistro() { + return numeroSequencialRegistro; + } + + public void setNumeroSequencialRegistro(Integer numeroSequencialRegistro) { + this.numeroSequencialRegistro = numeroSequencialRegistro; + } + + public void setMotivoOcorrencias(List motivoOcorrencias) { + this.motivoOcorrencias = motivoOcorrencias; + } + + public String getCodigoOcorrencia() { + return codigoOcorrencia; + } + + public void setCodigoOcorrencia(String codigoOcorrencia) { + this.codigoOcorrencia = codigoOcorrencia; + } + + public BigDecimal getValorJuros() { + return valorJuros; + } + + public void setValorJuros(BigDecimal valorJuros) { + this.valorJuros = valorJuros; + } + + public String getDataBaixa() { + return dataBaixa; + } + + public void setDataBaixa(String dataBaixa) { + this.dataBaixa = dataBaixa; + } + +} diff --git a/src/com/rjconsultores/ventaboletos/blocos/safra/RodapeRemessaSafra.java b/src/com/rjconsultores/ventaboletos/blocos/safra/RodapeRemessaSafra.java new file mode 100644 index 000000000..bef1af4f2 --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/safra/RodapeRemessaSafra.java @@ -0,0 +1,47 @@ +package com.rjconsultores.ventaboletos.blocos.safra; + +import java.math.BigDecimal; + +import com.rjconsultores.ventaboletos.blocos.RodapeRemessaPadrao; + +public class RodapeRemessaSafra extends RodapeRemessaPadrao { + + private Integer qtdTitulos; + private BigDecimal valorTotalTitulos; + private Integer numeroSequencialRemessa; + private Integer numeroSequencialRegistro; + + public Integer getQtdTitulos() { + return qtdTitulos; + } + + public void setQtdTitulos(Integer qtdTitulos) { + this.qtdTitulos = qtdTitulos; + } + + public BigDecimal getValorTotalTitulos() { + return valorTotalTitulos; + } + + public void setValorTotalTitulos(BigDecimal valorTotalTitulos) { + this.valorTotalTitulos = valorTotalTitulos; + } + + public Integer getNumeroSequencialRemessa() { + return numeroSequencialRemessa; + } + + public void setNumeroSequencialRemessa(Integer numeroSequencialRemessa) { + this.numeroSequencialRemessa = numeroSequencialRemessa; + } + + @Override + public Integer getNumeroSequencialRegistro() { + return numeroSequencialRegistro; + } + + @Override + public void setNumeroSequencialRegistro(Integer numeroSequencialRegistro) { + this.numeroSequencialRegistro = numeroSequencialRegistro; + } +} diff --git a/src/com/rjconsultores/ventaboletos/blocos/sicoob/DetalheObrigatorioSicoob.java b/src/com/rjconsultores/ventaboletos/blocos/sicoob/DetalheObrigatorioSicoob.java index 2d032dc0d..f1b93d5df 100644 --- a/src/com/rjconsultores/ventaboletos/blocos/sicoob/DetalheObrigatorioSicoob.java +++ b/src/com/rjconsultores/ventaboletos/blocos/sicoob/DetalheObrigatorioSicoob.java @@ -4,9 +4,9 @@ import java.math.BigDecimal; import java.util.Date; import com.rjconsultores.ventaboletos.blocos.DetalheObrigatorio; -import com.rjconsultores.ventaboletos.enuns.AceiteBB; +import com.rjconsultores.ventaboletos.enuns.Aceite; -public class DetalheObrigatorioSicoob implements DetalheObrigatorio, Cloneable { +public class DetalheObrigatorioSicoob implements DetalheObrigatorio { private Integer loteServico; private Integer numSeqRegistro; @@ -26,7 +26,7 @@ public class DetalheObrigatorioSicoob implements DetalheObrigatorio, Cloneable { private BigDecimal valor; private String agenciaCobradora; private String digAgenciaCobradora; - private AceiteBB aceite; + private Aceite aceite; private Date emissao; private Integer codMora; private Date dataMora; @@ -191,11 +191,11 @@ public class DetalheObrigatorioSicoob implements DetalheObrigatorio, Cloneable { this.digAgenciaCobradora = digAgenciaCobradora; } - public AceiteBB getAceite() { + public Aceite getAceite() { return aceite; } - public void setAceite(AceiteBB aceite) { + public void setAceite(Aceite aceite) { this.aceite = aceite; } diff --git a/src/com/rjconsultores/ventaboletos/enuns/AceiteBB.java b/src/com/rjconsultores/ventaboletos/enuns/Aceite.java similarity index 71% rename from src/com/rjconsultores/ventaboletos/enuns/AceiteBB.java rename to src/com/rjconsultores/ventaboletos/enuns/Aceite.java index c215f3ce4..ba8c49505 100644 --- a/src/com/rjconsultores/ventaboletos/enuns/AceiteBB.java +++ b/src/com/rjconsultores/ventaboletos/enuns/Aceite.java @@ -1,11 +1,11 @@ package com.rjconsultores.ventaboletos.enuns; -public enum AceiteBB { +public enum Aceite { ACEITE("A"), NAO_ACEITE("N"); - private AceiteBB(String value){ + private Aceite(String value){ this.value = value; } diff --git a/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java b/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java index 64e132e59..72981944a 100644 --- a/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java +++ b/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java @@ -1,27 +1,48 @@ package com.rjconsultores.ventaboletos.enuns; +import java.util.ArrayList; +import java.util.List; + public enum BancoLayout { - BRADESCO_400_Envio("237", false, "/layouts/LayoutBradescoCNAB400Envio.txg.xml"), - ITAU_400_Envio("341", false, "/layouts/LayoutItauCNAB400Envio.txg.xml"), - BB_240_Envio("001", false, "/layouts/LayoutBBCNAB240Envio.txg.xml"), - SICOOB_240_Envio("756", false, "/layouts/LayoutSicoobCNAB240Envio.txg.xml"), - SANTANDER_400_Envio("033", false, "/layouts/LayoutSantanderCNAB400Envio.txg.xml"), - MERCANTIL_400_Envio("389", false, "/layouts/LayoutMercantilCNAB400Envio.txg.xml"), + BB_240_Envio("001", "Banco do Brasil", false, "/layouts/LayoutBBCNAB240Envio.txg.xml", true), + BRADESCO_400_Envio("237", "Bradesco", false, "/layouts/LayoutBradescoCNAB400Envio.txg.xml", true), + CAIXA_400_Envio("104", "Caixa Econômica Federal", false, "/layouts/LayoutCaixaCNAB400Envio.txg.xml", true), + ITAU_400_Envio("341", "Itaú", false, "/layouts/LayoutItauCNAB400Envio.txg.xml", true), + MERCANTIL_400_Envio("389", "Mercantil", false, "/layouts/LayoutMercantilCNAB400Envio.txg.xml", true), + SANTANDER_400_Envio("033", "Santander", false, "/layouts/LayoutSantanderCNAB400Envio.txg.xml", true), + SAFRA_400_Envio("422", "Safra", false, "/layouts/LayoutSafraCNAB400Envio.txg.xml", true), + SICOOB_240_Envio("756", "Sicoob", false, "/layouts/LayoutSicoobCNAB240Envio.txg.xml", true), + + SANTANDER_400_Retorno("033", true, "/layouts/LayoutSantanderCNAB400Retorno.txg.xml"), BRADESCO_400_Retorno("237", true, "/layouts/LayoutBradescoCNAB400Retorno.txg.xml"), ITAU_400_Retorno("341", true, ""), - BB_240_Retorno("001", true, ""), - CAIXA_400_Envio("104", false, "/layouts/LayoutCaixaCNAB400Envio.txg.xml"); + BB_240_Retorno("001", true, ""), + SAFRA_400_Retorno("422", true, "/layouts/LayoutSafraCNAB400Retorno.txg.xml") + + ; private BancoLayout(String codBanco, boolean retorno, String path) { this.codBanco = codBanco; this.retorno = retorno; + this.descricao = ""; this.path = path; + this.suportado = false; + } + + private BancoLayout(String codBanco, String descricao, boolean retorno, String path, boolean suportado) { + this.codBanco = codBanco; + this.retorno = retorno; + this.descricao = descricao; + this.path = path; + this.suportado = suportado; } private String codBanco; private boolean retorno; private String path; + private String descricao; + private boolean suportado; public String getCodBanco() { return codBanco; @@ -39,6 +60,14 @@ public enum BancoLayout { return path.substring(path.lastIndexOf("/")); } + public String getDescricao() { + return descricao; + } + + public boolean isSuportado() { + return suportado; + } + public static BancoLayout getInstanceByCodBanco(String codBanco){ for(BancoLayout o : BancoLayout.values()){ @@ -50,4 +79,34 @@ public enum BancoLayout { return null; } + + public static List getSuportados(){ + List bancosSuportados = new ArrayList<>(); + + for(BancoLayout o : BancoLayout.values()){ + if(o.isSuportado()){ + bancosSuportados.add(o.getDescricao()); + } + } + + return bancosSuportados; + } + + public static String getCodigo(String descricao){ + for(BancoLayout banco :BancoLayout.values()){ + if(banco.descricao.equals(descricao)){ + return banco.codBanco; + } + } + return null; + } + + public static String getDescricao(String codigo){ + for(BancoLayout banco :BancoLayout.values()){ + if(banco.codBanco.equals(codigo)){ + return banco.descricao; + } + } + return null; + } } diff --git a/src/com/rjconsultores/ventaboletos/layouts/AbstractFlatFile.java b/src/com/rjconsultores/ventaboletos/layouts/AbstractFlatFile.java index 009c3ddd1..f617aef2b 100644 --- a/src/com/rjconsultores/ventaboletos/layouts/AbstractFlatFile.java +++ b/src/com/rjconsultores/ventaboletos/layouts/AbstractFlatFile.java @@ -43,6 +43,11 @@ import com.rjconsultores.ventaboletos.enuns.BancoLayout; */ public abstract class AbstractFlatFile{ + protected static final String DATA = "ddMMyy"; + protected static final String TAMANHO_DATA = "000000"; + protected static final String SEQUENCIAL_REMESSA = "NumeroSequencialRemessa"; + protected static final String SEQUENCIAL_REGISTRO = "NumeroSequencialRegistro"; + protected static final String SOMENTE_CLASSE_DE_RETORNO = "Somente classe de Retorno."; //protected static Logger log = LoggerFactory.getLogger(AbstractFlatFile.class); /** diff --git a/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java b/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java index 2a87faa13..32fe9f4b3 100644 --- a/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java +++ b/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java @@ -21,6 +21,8 @@ public class CNABFactory { return new BancoBrasilFlatFile(); case SICOOB_240_Envio: return new SicoobFlatFile(); + case SAFRA_400_Envio: + return new SafraFlatFile(); default: break; } diff --git a/src/com/rjconsultores/ventaboletos/layouts/SafraFlatFile.java b/src/com/rjconsultores/ventaboletos/layouts/SafraFlatFile.java new file mode 100644 index 000000000..ca93d06d2 --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/layouts/SafraFlatFile.java @@ -0,0 +1,131 @@ +package com.rjconsultores.ventaboletos.layouts; + +import static com.rjconsultores.ventaboletos.utils.FormataUtil.formataDataToString; +import static com.rjconsultores.ventaboletos.utils.FormataUtil.formatarValorPorTamanho; +import static com.rjconsultores.ventaboletos.utils.FormataUtil.formatarValorPorTamanhoZeroEsquerda; + +import java.util.Collection; +import java.util.List; + +import org.jrimum.texgit.Record; + +import com.rjconsultores.ventaboletos.blocos.CabecalhoRemessa; +import com.rjconsultores.ventaboletos.blocos.CabecalhoRetorno; +import com.rjconsultores.ventaboletos.blocos.DadosBoleto; +import com.rjconsultores.ventaboletos.blocos.DetalheObrigatorio; +import com.rjconsultores.ventaboletos.blocos.DetalheRetorno; +import com.rjconsultores.ventaboletos.blocos.RateioDeCredito; +import com.rjconsultores.ventaboletos.blocos.RodapeRemessa; +import com.rjconsultores.ventaboletos.blocos.RodapeRetorno; +import com.rjconsultores.ventaboletos.blocos.safra.CabecalhoRemessaSafra; +import com.rjconsultores.ventaboletos.blocos.safra.DetalheObrigatorioSafra; +import com.rjconsultores.ventaboletos.blocos.safra.RodapeRemessaSafra; +import com.rjconsultores.ventaboletos.enuns.BancoLayout; + +public class SafraFlatFile extends AbstractFlatFile implements RemessaInterface { + + public SafraFlatFile() { + super(BancoLayout.SAFRA_400_Envio); + } + + @Override + protected void createHeader(CabecalhoRemessa cabecalhoRemessaParam) { + + Record header = getFlatFile().createRecord("Header"); + + CabecalhoRemessaSafra cabecalhoRemessa = (CabecalhoRemessaSafra) cabecalhoRemessaParam; + + header.setValue("NumAgencia", formatarValorPorTamanho(cabecalhoRemessa.getNumAgencia(), 5)); + header.setValue("NumContaCorrente", formatarValorPorTamanho(cabecalhoRemessa.getNumContaCorrente(), 8)); + header.setValue("DigContaCorrente", formatarValorPorTamanho(cabecalhoRemessa.getDigContaCorrente(), 1)); + header.setValue("NomeEmpresa", formatarValorPorTamanho(cabecalhoRemessa.getNomeEmpresa(), 30)); + header.setValue("DataGravacao", formataDataToString(cabecalhoRemessa.getDataGravacao(), TAMANHO_DATA, DATA)); + header.setValue(SEQUENCIAL_REMESSA, formatarValorPorTamanho(cabecalhoRemessa.getNumeroSequencialRemessa().toString(), 3)); + header.setValue(SEQUENCIAL_REGISTRO, formatarValorPorTamanho(cabecalhoRemessa.getNumeroSequencialRegistro().toString(), 6)); + + getFlatFile().addRecord(header); + } + + @Override + protected void createTransacaoTitulos(DetalheObrigatorio tituloParam) { + + Record detalhe = getFlatFile().createRecord("TransacaoTitulo"); + + DetalheObrigatorioSafra titulo = (DetalheObrigatorioSafra) tituloParam; + + detalhe.setValue("CpfCnpj", formatarValorPorTamanho(titulo.getCpfCnpj().toString(), 2)); + detalhe.setValue("NumCpfCnpj", formatarValorPorTamanho(titulo.getNumCpfCnpj(), 14)); + detalhe.setValue("NumAgencia", formatarValorPorTamanho(titulo.getNumAgencia(), 5)); + detalhe.setValue("NumContaCorrente", formatarValorPorTamanho(titulo.getNumContaCorrente(), 8)); + detalhe.setValue("DigContaCorrente", formatarValorPorTamanho(titulo.getDigContaCorrente(), 1)); + detalhe.setValue("NossoNumero", formatarValorPorTamanho(titulo.getNossoNumero(), 9)); + detalhe.setValue("IdentificacaoTitulo", formatarValorPorTamanho(titulo.getIdBoletoFechamento(), 10)); + detalhe.setValue("Vencimento", formataDataToString(titulo.getVencimento(), TAMANHO_DATA, DATA)); + detalhe.setValue("Valor", titulo.getValor()); + detalhe.setValue("NumAgenciaCobranca", formatarValorPorTamanho(titulo.getNumAgencia(), 5)); + detalhe.setValue("EspecieDeTitulo", formatarValorPorTamanho(titulo.getEspecieDeTitulo(), 2)); + detalhe.setValue("Aceite", titulo.getAceite().getValue()); + detalhe.setValue("Emissao", formataDataToString(titulo.getDataEmissao(), TAMANHO_DATA, DATA)); + detalhe.setValue("Instrucao1", formatarValorPorTamanho(titulo.getInstrucao1(), 2)); + detalhe.setValue("Instrucao2", formatarValorPorTamanho(titulo.getInstrucao2(), 2)); + detalhe.setValue("JurosDeMora", titulo.getJurosDeMora()); + detalhe.setValue("DataMulta", formataDataToString(titulo.getDataMulta(), TAMANHO_DATA, DATA)); + detalhe.setValue("PercentualMulta", titulo.getPercMulta() ); + detalhe.setValue("DataLimiteDesconto", formataDataToString(titulo.getDataLimiteDesconto(), TAMANHO_DATA, DATA)); + detalhe.setValue("ValorDesconto", titulo.getValorDesconto()); + detalhe.setValue("ValorIOF", titulo.getValorIOF()); + detalhe.setValue("ValorAbatimentoConcedido", titulo.getValorAbatimentoConcedido()); + detalhe.setValue("TipoInscricaoPagador", formatarValorPorTamanho(titulo.getTipoInscricaoPagador().toString(), 2)); + detalhe.setValue("NumeroInscricaoPagador", formatarValorPorTamanho(titulo.getNumeroInscricaoPagador(), 14)); + detalhe.setValue("NomePagador", formatarValorPorTamanho(titulo.getNomePagador(), 40)); + detalhe.setValue("EnderecoPagador", formatarValorPorTamanho(titulo.getEnderecoPagador(), 30)); + detalhe.setValue("BairroPagador", formatarValorPorTamanho(titulo.getBairroPagador(), 10)); + detalhe.setValue("CepPagador", formatarValorPorTamanho(titulo.getCepPagador(), 8)); + detalhe.setValue("CidadePagador", formatarValorPorTamanho(titulo.getCidadePagador(), 15)); + detalhe.setValue("EstadoPagador", formatarValorPorTamanho(titulo.getEstadoPagador(), 2)); + detalhe.setValue("SacadorAvalista", formatarValorPorTamanho(titulo.getSacadorAvalista(), 30)); + detalhe.setValue(SEQUENCIAL_REMESSA, formatarValorPorTamanho(titulo.getNumeroSequencialRemessa().toString(), 3)); + detalhe.setValue(SEQUENCIAL_REGISTRO, formatarValorPorTamanho(titulo.getNumeroSequencialRegistro().toString(), 6)); + + getFlatFile().addRecord(detalhe); + } + + @Override + protected void createTrailler(RodapeRemessa trailler){ + + Record trailer = getFlatFile().createRecord("Trailler"); + RodapeRemessaSafra rodape = (RodapeRemessaSafra) trailler; + + trailer.setValue("QtdTitulos", formatarValorPorTamanho(rodape.getQtdTitulos().toString(), 8)); + trailer.setValue("ValorTotal", formatarValorPorTamanhoZeroEsquerda(rodape.getValorTotalTitulos().toString().replace(".", ""), 15)); + trailer.setValue(SEQUENCIAL_REMESSA, formatarValorPorTamanho(rodape.getNumeroSequencialRemessa().toString(), 3)); + trailer.setValue(SEQUENCIAL_REGISTRO, formatarValorPorTamanho(rodape.getNumeroSequencialRegistro().toString(), 6)); + + getFlatFile().addRecord(trailer); + } + + @Override + protected CabecalhoRetorno readHeader(Record header) { + throw new UnsupportedOperationException(SOMENTE_CLASSE_DE_RETORNO); + } + + @Override + protected List readTransacaoTitulos(Collection registrosDeTransacoes) { + throw new UnsupportedOperationException(SOMENTE_CLASSE_DE_RETORNO); + } + + @Override + protected RodapeRetorno readTrailler(Record trailler) { + throw new UnsupportedOperationException(SOMENTE_CLASSE_DE_RETORNO); + } + + @Override + protected Record createDadosBoletos(DadosBoleto boleto) { + throw new UnsupportedOperationException("Não necessário..."); + } + + @Override + protected Record createRateioDeCredito(RateioDeCredito rateioDeCredito) { + throw new UnsupportedOperationException("Não necessário..."); + } +} diff --git a/src/com/rjconsultores/ventaboletos/utils/NossoNumeroUtils.java b/src/com/rjconsultores/ventaboletos/utils/NossoNumeroUtils.java index d11ea3c70..76c0cbfec 100644 --- a/src/com/rjconsultores/ventaboletos/utils/NossoNumeroUtils.java +++ b/src/com/rjconsultores/ventaboletos/utils/NossoNumeroUtils.java @@ -7,6 +7,12 @@ import org.apache.commons.lang.StringUtils; import com.rjconsultores.ventaboletos.enuns.BancoLayout; public class NossoNumeroUtils { + + private static final String ZERO_7 = "0000000"; + private static final String ZERO_8 = "00000000"; + private static final String ZERO_9 = "000000000"; + private static final String ZERO_10 = "0000000000"; + private static final String ZERO_11 = "00000000000"; /** * Devolve o nosso numero do Bradesco com o DV calculado (Tamanho 12)... @@ -15,7 +21,7 @@ public class NossoNumeroUtils { * @return */ public static String calcularNossonumeroBradesco(Integer numCarteira, BigInteger nossoNumero){ - return StringUtils.right("00000000000" + nossoNumero, 11) + dacBradesco(numCarteira, nossoNumero); + return StringUtils.right(ZERO_11 + nossoNumero, 11) + dacBradesco(numCarteira, nossoNumero); } /** @@ -27,19 +33,23 @@ public class NossoNumeroUtils { * @return */ public static String calcularNossoNumeroItau(Integer codAgencia, Integer numConta, Integer numCarteira, BigInteger nossoNumero){ - return StringUtils.right("00000000" + nossoNumero, 8) + dacItau(codAgencia, numConta, numCarteira, nossoNumero); + return StringUtils.right(ZERO_8 + nossoNumero, 8) + dacItau(codAgencia, numConta, numCarteira, nossoNumero); } public static String calcularNossoNumeroSantander(BigInteger nossoNumero){ - return StringUtils.right("0000000" + nossoNumero, 7)+dacSantander( nossoNumero.toString() ); + return StringUtils.right(ZERO_7 + nossoNumero, 7)+dacSantander( nossoNumero.toString() ); } public static String calcularNossoNumeroSicoob(Integer numCooperativa, Integer codCliente, BigInteger nossoNumero){ - return StringUtils.right("0000000" + nossoNumero, 7)+dacSicoob(numCooperativa, codCliente, nossoNumero.toString() ); + return StringUtils.right(ZERO_7 + nossoNumero, 7)+dacSicoob(numCooperativa, codCliente, nossoNumero.toString() ); } public static String calcularNossoNumeroMercantil(Integer agencia, BigInteger nossoNumero){ - return StringUtils.right("0000000000" + nossoNumero, 10)+dacMercantil( agencia, nossoNumero ); + return StringUtils.right(ZERO_10 + nossoNumero, 10)+dacMercantil( agencia, nossoNumero ); + } + + public static String calcularNossoNumeroSafra(BigInteger nossoNumero){ + return StringUtils.right(ZERO_9 + nossoNumero, 9)+dacSafra( nossoNumero ); } /** @@ -67,8 +77,8 @@ public class NossoNumeroUtils { dvControll = Boolean.FALSE; } - String nC = StringUtils.right("0000000" + convenioBanco, controllConvenioNossoNumero); - String nN = StringUtils.right("0000000000" + nossoNumero, controllNossoNumero); + String nC = StringUtils.right(ZERO_7 + convenioBanco, controllConvenioNossoNumero); + String nN = StringUtils.right(ZERO_10 + nossoNumero, controllNossoNumero); String base = nC + nN; @@ -87,7 +97,7 @@ public class NossoNumeroUtils { int multiplicandos[] = new int[13]; String carteira = StringUtils.right("00" + numCarteira, 2); - String nNumero = StringUtils.right("00000000000" + nossoNumero, 11); + String nNumero = StringUtils.right(ZERO_11 + nossoNumero, 11); String base = carteira + nNumero; @@ -114,8 +124,8 @@ public class NossoNumeroUtils { int multiplicandos[] = new int[21]; String cooperativa = StringUtils.right("0000" + numCooperativa, 4); - String cliente = StringUtils.right("0000000000" + codCliente, 10); - String nNumero = StringUtils.right("0000000" + nossoNumero, 7); + String cliente = StringUtils.right(ZERO_10 + codCliente, 10); + String nNumero = StringUtils.right(ZERO_7 + nossoNumero, 7); String base = cooperativa + cliente + nNumero; @@ -144,7 +154,7 @@ public class NossoNumeroUtils { int multiplicadores[] = {7,6,5,4,3,2,9,8,7,6,5,4,3,2}; String agenciaformatada = StringUtils.right("0000" + agencia, 4); - String nNumero = StringUtils.right("00000000000" + nossoNumero, 10); + String nNumero = StringUtils.right(ZERO_11 + nossoNumero, 10); String base = agenciaformatada + nNumero; @@ -164,6 +174,34 @@ public class NossoNumeroUtils { return String.valueOf(11 - mod); } + public static String dacSafra(BigInteger nossoNumero){ + + int[] multiplicadores = {2,1,2,1,2,1,2,1,2}; + int[] multiplicandos = new int[20]; + + String base = StringUtils.right(ZERO_9 + nossoNumero, 9); + + for (int i = 0; i < 9; i++) { + String d = base.charAt(i) + ""; + multiplicandos[i] = Integer.valueOf(d) * multiplicadores[i]; + } + + int dac = 0; + + for(Integer v : multiplicandos){ + + if(v < 10){ + dac += v; + }else{ + dac += 1 + (v - 10); + } + } + + dac = 10 - (dac % 10); + + return dac == 10 ? "0" : dac+""; + } + /** * Calcula do DV para o Itau * @param codAgencia @@ -175,13 +213,13 @@ public class NossoNumeroUtils { public static String dacItau(Integer codAgencia, Integer numConta, Integer numCarteira, BigInteger nossoNumero){ - int multiplicadores[] = {1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2}; + int multiplicadores[] = {2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1}; int multiplicandos[] = new int[20]; String agencia = StringUtils.right("0000" + codAgencia, 4); String conta = StringUtils.right("00000" + numConta, 5); String carteira = StringUtils.right("000" + numCarteira, 3); - String nNumero = StringUtils.right("00000000" + nossoNumero, 8); + String nNumero = StringUtils.right(ZERO_8 + nossoNumero, 8); String base = agencia + conta + carteira + nNumero; @@ -286,7 +324,7 @@ public class NossoNumeroUtils { int multiplicadores[] = {1,2,1,2,1,2,1,2,1,2}; int multiplicandos[] = new int[10]; - String doc = StringUtils.right("0000000000" + numeroDoc, 10); + String doc = StringUtils.right(ZERO_10 + numeroDoc, 10); String base = doc; @@ -331,6 +369,10 @@ public class NossoNumeroUtils { return Boolean.TRUE; } + if(BancoLayout.SAFRA_400_Envio.equals(bancoLayout) && nossoNumero.length() == 11 ){ + return Boolean.TRUE; + } + if(BancoLayout.BB_240_Envio.equals(bancoLayout) && (nossoNumero.length() == 13 || nossoNumero.length() == 17)){ return Boolean.TRUE; } @@ -348,7 +390,7 @@ public class NossoNumeroUtils { public static void main(String[] args) { - System.out.println( calcularNossoNumeroItau( 98, 92192, 109, new BigInteger("98712345") )); + System.out.println( calcularNossoNumeroSafra( new BigInteger("422979999") )); } } diff --git a/src/layouts/LayoutSafraCNAB400Envio.txg.xml b/src/layouts/LayoutSafraCNAB400Envio.txg.xml new file mode 100644 index 000000000..b85f31a17 --- /dev/null +++ b/src/layouts/LayoutSafraCNAB400Envio.txg.xml @@ -0,0 +1,109 @@ + + + + Arquivo-Remessa_SafraCNAB400 + Published: 2023/12/15 + + Layout para Cobrança. + + Arquivo texto - padrão CNAB + Meio de Registro Transmissão de Dados + Descrição de Registro - Tamanho 400 Bytes + Organização Sequencial + + ARQUIVO FORMATO CNAB REMESSA, REGISTROS: + + 0 - Header Label + 1 - Cobrança - Transação + 9 - Trailler (Papel de finalizador de lote) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file