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