Implementação do banco SAFRA feat bug#AL-3376

master
fabio.fbarreto 2023-12-26 09:20:28 -03:00
parent 30b65b7754
commit 087bfe0ce1
16 changed files with 972 additions and 38 deletions

View File

@ -5,7 +5,7 @@
<groupId>br.com.rjconsultores</groupId>
<artifactId>GeneradorBoletosCNAB</artifactId>
<version>1.4.1</version>
<version>1.5.0</version>
<name>GeneradorBoletosCNAB</name>
<distributionManagement>
@ -57,8 +57,8 @@
<dependency>
<groupId>br.com.rjconsultores</groupId>
<artifactId>jrimum-texgit</artifactId>
<version>1.0.0</version>
<artifactId>jrimum-bopepo</artifactId>
<version>1.1.0</version>
<exclusions>
<exclusion>
<groupId>sun-jaxb-rj</groupId>

View File

@ -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;
}

View File

@ -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;

View File

@ -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<DetalheObrigatorio>();
}
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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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<MotivoOcorrenciaBradesco> 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<MotivoOcorrenciaBradesco> getMotivoOcorrencias() {
return motivoOcorrencias;
}
public void addMotivoOcorrencia(MotivoOcorrenciaBradesco motivoOcorrencias) {
if(this.motivoOcorrencias == null){
this.motivoOcorrencias = new ArrayList<MotivoOcorrenciaBradesco>();
}
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<MotivoOcorrenciaBradesco> 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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<String> getSuportados(){
List<String> 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;
}
}

View File

@ -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);
/**

View File

@ -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;
}

View File

@ -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<DetalheRetorno> readTransacaoTitulos(Collection<Record> 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...");
}
}

View File

@ -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") ));
}
}

View File

@ -0,0 +1,109 @@
<txg:Texgit xmlns:txg="http://jrimum.org/texgit"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jrimum.org/texgit http://jrimum.org/texgit/chrome/site/TexgitSchema.xsd"
version="1.0-academic">
<FlatFile>
<layout>
<name>Arquivo-Remessa_SafraCNAB400</name>
<version>Published: 2023/12/15</version>
<description>
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)
</description>
</layout>
<GroupOfRecords>
<Record name="Header" description="Protocolo de comunicação" repeatable="true">
<GroupOfFields>
<IdType name="IDReg" length="1" value="0" position="1" />
<Field name="IdentificacaoRemessa" length="1" value="1" />
<Field name="LiteralRemessa" length="7" value="REMESSA" />
<Field name="CodigoDeServico" length="2" value="01" />
<Field name="LiteralServico" length="8" value="COBRANCA" />
<Field name="Filler1" length="6" />
<Field name="NumAgencia" length="5" type="INTEGER" padding="ZERO_LEFT"/>
<Field name="NumContaCorrente" length="8" type="INTEGER" padding="ZERO_LEFT"/>
<Field name="DigContaCorrente" length="1" type="INTEGER" padding="ZERO_LEFT"/>
<Field name="Filler2" length="7" />
<Field name="NomeEmpresa" length="30" />
<Field name="CodigoCompensacao" length="3" value="422" />
<Field name="NomeBanco" length="11" value="SAFRA" />
<Field name="Filler3" length="4" />
<Field name="DataGravacao" length="6" type="CHARACTER"/>
<Field name="Filler4" length="291" />
<Field name="NumeroSequencialRemessa" length="3" type="INTEGER" padding="ZERO_LEFT" />
<Field name="NumeroSequencialRegistro" length="6" type="INTEGER" padding="ZERO_LEFT" />
</GroupOfFields>
</Record>
<Record name="TransacaoTitulo" repeatable="true">
<GroupOfFields>
<IdType name="IDReg" value="1" length="1" position="1" />
<Field name="CpfCnpj" type="INTEGER" length="2" padding="ZERO_LEFT"/>
<Field name="NumCpfCnpj" type="CHARACTER" length="14" />
<Field name="NumAgencia" type="INTEGER" length="5" padding="ZERO_LEFT"/>
<Field name="NumContaCorrente" type="INTEGER" length="8" padding="ZERO_LEFT"/>
<Field name="DigContaCorrente" type="INTEGER" length="1" padding="ZERO_LEFT"/>
<Field name="Filler1" length="6" />
<Field name="UsoEmpresa" type="CHARACTER" length="25" />
<Field name="NossoNumero" length="9" />
<Field name="Filler2" length="30" />
<Field name="CodigoIof" value="0" length="1"/>
<Field name="TipoMoeda" value="00" length="2"/>
<Field name="Filler3" length="1" />
<Field name="DiasProtesto" value="00" length="2" />
<Field name="TipoCarteira" value="1" length="1"/>
<Field name="TipoOcorrencia" value="01" length="2"/>
<Field name="IdentificacaoTitulo" type="CHARACTER" length="10" />
<Field name="Vencimento" length="6" type="CHARACTER" />
<Field name="Valor" type="BIGDECIMAL" length="13" value="0" format="DECIMAL_DD" padding="ZERO_LEFT" />
<Field name="BancoCobranca" value="422" length="3" />
<Field name="NumAgenciaCobranca" type="INTEGER" length="5" padding="ZERO_LEFT"/>
<Field name="EspecieTitulo" value="01" length="2"/>
<Field name="Aceite" length="1" />
<Field name="Emissao" length="6" type="CHARACTER"/>
<Field name="Instrucao1" length="2"/>
<Field name="Instrucao2" length="2"/>
<Field name="ValorAtraso" type="BIGDECIMAL" length="13" value="0" format="DECIMAL_DD" padding="ZERO_LEFT" />
<Field name="DataLimiteDesconto" length="6" type="DATE" format="DATE_DDMMYY" padding="ZERO_LEFT" />
<Field name="ValorDesconto" type="BIGDECIMAL" length="13" value="0" format="DECIMAL_DD" padding="ZERO_LEFT" />
<Field name="ValorIOF" type="BIGDECIMAL" length="13" value="0" format="DECIMAL_DD" padding="ZERO_LEFT" />
<Field name="ValorAbatimentoConcedido" type="BIGDECIMAL" length="13" value="0" format="DECIMAL_DD" padding="ZERO_LEFT" />
<Field name="TipoInscricaoPagador" length="2" type="INTEGER" />
<Field name="NumeroInscricaoPagador" length="14" type="INTEGER" />
<Field name="NomePagador" length="40" type="CHARACTER" />
<Field name="EnderecoPagador" length="40" type="CHARACTER" />
<Field name="BairroPagador" length="10" type="CHARACTER" />
<Field name="Filler4" length="2" />
<Field name="CepPagador" length="8" type="CHARACTER" />
<Field name="CidadePagador" length="15" type="CHARACTER" />
<Field name="EstadoPagador" length="2" type="CHARACTER" />
<Field name="SacadorAvalista" length="30" type="CHARACTER" />
<Field name="Filler5" length="7" />
<Field name="BancoEmitente" value="422" length="3" />
<Field name="NumeroSequencialRemessa" length="3" type="INTEGER" padding="ZERO_LEFT" />
<Field name="NumeroSequencialRegistro" length="6" type="INTEGER" padding="ZERO_LEFT" />
</GroupOfFields>
</Record>
<Record name="Trailler" repeatable="true">
<GroupOfFields>
<IdType name="IDReg" value="9" length="1" position="1" />
<Field name="Filler" length="367" />
<Field name="QtdTitulos" length="8" type="INTEGER" padding="ZERO_LEFT" />
<Field name="ValorTotal" type="BIGDECIMAL" length="15" value="0" format="DECIMAL_DD" padding="ZERO_LEFT" />
<Field name="NumeroSequencialRemessa" length="3" type="INTEGER" padding="ZERO_LEFT" />
<Field name="NumeroSequencialRegistro" length="6" type="INTEGER" padding="ZERO_LEFT" />
</GroupOfFields>
</Record>
</GroupOfRecords>
</FlatFile>
</txg:Texgit>