diff --git a/src/com/rjconsultores/ventaboletos/blocos/caixa/ArquivoRemessaCaixa.java b/src/com/rjconsultores/ventaboletos/blocos/caixa/ArquivoRemessaCaixa.java new file mode 100644 index 000000000..94d57659b --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/caixa/ArquivoRemessaCaixa.java @@ -0,0 +1,45 @@ +package com.rjconsultores.ventaboletos.blocos.caixa; + +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 ArquivoRemessaCaixa extends ArquivoRemessaItem { + + @Override + public void setCabecalhoRemessa(CabecalhoRemessa cabecalhoRemessa) { + + if(cabecalhoRemessa instanceof CabecalhoRemessaCaixa){ + super.setCabecalhoRemessa(cabecalhoRemessa); + }else{ + throw new ClassCastException("Somente cabecalho tipo: " + CabecalhoRemessaCaixa.class.getName()); + } + } + + @Override + public void addTitulo(DetalheObrigatorio titulo){ + if(this.titulos == null){ + this.titulos = new ArrayList(); + } + + if(titulo instanceof DetalheObrigatorioCaixa){ + + titulo.setNumeroSequencialRegistro(titulos.size() + 2); + + this.titulos.add(titulo); + }else{ + throw new ClassCastException("Somente cabecalho tipo: " + DetalheObrigatorioCaixa.class.getName()); + } + } + + @Override + public RodapeRemessa getRodapeRemessa() { + this.rodapeRemessa = this.rodapeRemessa == null ? new RodapeRemessaPadrao() : this.rodapeRemessa; + rodapeRemessa.setNumeroSequencialRegistro(titulos.size() + 2); + return rodapeRemessa; + } +} diff --git a/src/com/rjconsultores/ventaboletos/blocos/caixa/CabecalhoRemessaCaixa.java b/src/com/rjconsultores/ventaboletos/blocos/caixa/CabecalhoRemessaCaixa.java new file mode 100644 index 000000000..2553fa412 --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/caixa/CabecalhoRemessaCaixa.java @@ -0,0 +1,73 @@ +package com.rjconsultores.ventaboletos.blocos.caixa; + +import java.util.Date; + +import com.rjconsultores.ventaboletos.blocos.CabecalhoRemessa; + +public class CabecalhoRemessaCaixa implements CabecalhoRemessa { + + private String codigoEmpresa; + private String agenciaBeneficiario; + private String nomeEmpresa; + private Date dataGravacao; + private Integer numeroSequencialRemessa; + private Integer numeroSequencialRegistro; + private String versaoLayout; + + public String getCodigoEmpresa() { + return codigoEmpresa; + } + + public void setCodigoEmpresa(String codigoEmpresa) { + this.codigoEmpresa = codigoEmpresa; + } + + 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; + } + + public String getAgenciaBeneficiario() { + return agenciaBeneficiario; + } + + public void setAgenciaBeneficiario(String agenciaBeneficiario) { + this.agenciaBeneficiario = agenciaBeneficiario; + } + + public String getVersaoLayout() { + return versaoLayout; + } + + public void setVersaoLayout(String versaoLayout) { + this.versaoLayout = versaoLayout; + } + +} diff --git a/src/com/rjconsultores/ventaboletos/blocos/caixa/DetalheObrigatorioCaixa.java b/src/com/rjconsultores/ventaboletos/blocos/caixa/DetalheObrigatorioCaixa.java new file mode 100644 index 000000000..0cacb118d --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/caixa/DetalheObrigatorioCaixa.java @@ -0,0 +1,194 @@ +package com.rjconsultores.ventaboletos.blocos.caixa; + +import java.math.BigDecimal; +import java.util.Date; + +import com.rjconsultores.ventaboletos.blocos.DetalheObrigatorio; +import com.rjconsultores.ventaboletos.enuns.TipoInscricaoPagador; + +public class DetalheObrigatorioCaixa implements DetalheObrigatorio, Cloneable { + + private Integer idBoletoFechamento; + private TipoInscricaoPagador tipoInscricaoPagador; + private String numeroInscricao; + private String nossoNumero; + private String numeroDoDocumento; + private Date vencimento; + private BigDecimal valor; + private String especieDeTitulo; + private Date emissao; + private BigDecimal valorAtraso = BigDecimal.ZERO; + private BigDecimal valorMulta = BigDecimal.ZERO; + private Date dataLimiteDesconto; + private BigDecimal valorDesconto = BigDecimal.ZERO; + private BigDecimal valorIOF = BigDecimal.ZERO; + private BigDecimal valorAbatimentoConcedido = BigDecimal.ZERO; + private String nomeSacado; + private String enderecoSacado; + private String bairroSacado; + private String cepSacado; + private String cidade; + private String estado; + private String sacadorAvalista; + private Integer numeroSequencialRegistro; + private String numeroInscricaoSacado; + + + @Override + public void setIdBoletoFechamento(Integer id) { + this.idBoletoFechamento = id; + + } + @Override + public Integer getIdBoletoFechamento(){ + return this.idBoletoFechamento; + } + + @Override + public DetalheObrigatorio clone() throws CloneNotSupportedException { + return (DetalheObrigatorio) super.clone(); + } + + public String getNumeroInscricao() { + return numeroInscricao; + } + + public void setNumeroInscricao(String numeroInscricao) { + this.numeroInscricao = numeroInscricao; + } + 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 String getNumeroDoDocumento() { + return numeroDoDocumento; + } + public void setNumeroDoDocumento(String numeroDoDocumento) { + this.numeroDoDocumento = numeroDoDocumento; + } + public String getEspecieDeTitulo() { + return especieDeTitulo; + } + public void setEspecieDeTitulo(String especieDeTitulo) { + this.especieDeTitulo = especieDeTitulo; + } + public BigDecimal getValor() { + return valor; + } + public void setValor(BigDecimal valor) { + this.valor = valor; + } + public Date getEmissao() { + return emissao; + } + public void setEmissao(Date emissao) { + this.emissao = emissao; + } + public BigDecimal getValorAtraso() { + return valorAtraso; + } + public void setValorAtraso(BigDecimal valorAtraso) { + this.valorAtraso = valorAtraso; + } + public BigDecimal getValorMulta() { + return valorMulta; + } + public void setValorMulta(BigDecimal valorMulta) { + this.valorMulta = valorMulta; + } + 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 getNomeSacado() { + return nomeSacado; + } + public void setNomeSacado(String nomeSacado) { + this.nomeSacado = nomeSacado; + } + public String getEnderecoSacado() { + return enderecoSacado; + } + public void setEnderecoSacado(String enderecoSacado) { + this.enderecoSacado = enderecoSacado; + } + public String getBairroSacado() { + return bairroSacado; + } + public void setBairroSacado(String bairroSacado) { + this.bairroSacado = bairroSacado; + } + public String getCepSacado() { + return cepSacado; + } + public void setCepSacado(String cepSacado) { + this.cepSacado = cepSacado; + } + public String getCidade() { + return cidade; + } + public void setCidade(String cidade) { + this.cidade = cidade; + } + public String getEstado() { + return estado; + } + public void setEstado(String estado) { + this.estado = estado; + } + public String getSacadorAvalista() { + return sacadorAvalista; + } + public void setSacadorAvalista(String sacadorAvalista) { + this.sacadorAvalista = sacadorAvalista; + } + public String getNumeroInscricaoSacado() { + return numeroInscricaoSacado; + } + public void setNumeroInscricaoSacado(String numeroInscricaoSacado) { + this.numeroInscricaoSacado = numeroInscricaoSacado; + } + public Integer getNumeroSequencialRegistro() { + return numeroSequencialRegistro; + } + public void setNumeroSequencialRegistro(Integer numeroSequencialRegistro) { + this.numeroSequencialRegistro = numeroSequencialRegistro; + } + + + +} diff --git a/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java b/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java index 89369be95..64e132e59 100644 --- a/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java +++ b/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java @@ -10,7 +10,8 @@ public enum BancoLayout { 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, ""); + BB_240_Retorno("001", true, ""), + CAIXA_400_Envio("104", false, "/layouts/LayoutCaixaCNAB400Envio.txg.xml"); private BancoLayout(String codBanco, boolean retorno, String path) { this.codBanco = codBanco; diff --git a/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java b/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java index 1d4b27ee9..2a87faa13 100644 --- a/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java +++ b/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java @@ -4,7 +4,6 @@ import com.rjconsultores.ventaboletos.enuns.BancoLayout; public class CNABFactory { - public static RemessaInterface createRemessa(BancoLayout bancoLayout){ switch (bancoLayout) { @@ -12,6 +11,8 @@ public class CNABFactory { return new BradescoFlatFile(); case SANTANDER_400_Envio: return new SantanderFlatFile(); + case CAIXA_400_Envio: + return new CaixaFlatFile(); case MERCANTIL_400_Envio: return new MercantilFlatFile(); case ITAU_400_Envio: diff --git a/src/com/rjconsultores/ventaboletos/layouts/CaixaFlatFile.java b/src/com/rjconsultores/ventaboletos/layouts/CaixaFlatFile.java new file mode 100644 index 000000000..48079d0a9 --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/layouts/CaixaFlatFile.java @@ -0,0 +1,126 @@ +package com.rjconsultores.ventaboletos.layouts; + +import java.math.BigDecimal; +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.caixa.CabecalhoRemessaCaixa; +import com.rjconsultores.ventaboletos.blocos.caixa.DetalheObrigatorioCaixa; +import com.rjconsultores.ventaboletos.enuns.BancoLayout; +import com.rjconsultores.ventaboletos.utils.FormataUtil; + +public class CaixaFlatFile extends AbstractFlatFile implements RemessaInterface { + + private static BigDecimal valorTotal = BigDecimal.ZERO; + private static Integer quantidadeRegistro = 0; + + public CaixaFlatFile() { + super(BancoLayout.CAIXA_400_Envio); + valorTotal = BigDecimal.ZERO; + quantidadeRegistro = 0; + } + + @Override + protected void createHeader(CabecalhoRemessa cabecalhoRemessaParam) { + + Record header = getFlatFile().createRecord("Header"); + + CabecalhoRemessaCaixa cabecalhoRemessa = (CabecalhoRemessaCaixa) cabecalhoRemessaParam; + + header.setValue("AgenciaBeneficiario", FormataUtil.formatarValorPorTamanho(cabecalhoRemessa.getAgenciaBeneficiario(), 4)); + header.setValue("NomeEmpresa", FormataUtil.formatarValorPorTamanho(cabecalhoRemessa.getNomeEmpresa(), 30)); + header.setValue("Beneficiario", FormataUtil.formatarValorPorTamanho(cabecalhoRemessa.getCodigoEmpresa(), 7)); + header.setValue("versaoLayout", FormataUtil.formatarValorPorTamanho(cabecalhoRemessa.getVersaoLayout(), 3)); + header.setValue("DataGravacao", FormataUtil.formataDataToString(cabecalhoRemessa.getDataGravacao(), "000000", "ddMMyy")); + header.setValue("NumeroSequencialRemessa", FormataUtil.formatarValorPorTamanho(cabecalhoRemessa.getNumeroSequencialRemessa().toString(), 7)); + + quantidadeRegistro = quantidadeRegistro + 1; + + getFlatFile().addRecord(header); + } + + @Override + protected void createTransacaoTitulos(DetalheObrigatorio tituloParam) { + + Record transacaoTitulos = getFlatFile().createRecord("TransacaoTitulo"); + + DetalheObrigatorioCaixa titulo = (DetalheObrigatorioCaixa) tituloParam; + + transacaoTitulos.setValue("NumeroInscricao", FormataUtil.formatarValorPorTamanho(titulo.getNumeroInscricao().toString(), 14)); + transacaoTitulos.setValue("NossoNumero", FormataUtil.formatarValorPorTamanho(titulo.getNossoNumero(), 8)); + transacaoTitulos.setValue("DataJuros", FormataUtil.formataDataToString(titulo.getVencimento(), "000000", "ddMMyy")); + transacaoTitulos.setValue("NumeroDoDocumento", FormataUtil.formatarValorPorTamanho(titulo.getNumeroDoDocumento(), 10)); + transacaoTitulos.setValue("Vencimento", FormataUtil.formataDataToString(titulo.getVencimento(), "000000", "ddMMyy")); + transacaoTitulos.setValue("ValorTitulo", titulo.getValor()); + transacaoTitulos.setValue("DataEmissao", FormataUtil.formataDataToString(titulo.getEmissao(), "000000", "ddMMyy")); + transacaoTitulos.setValue("ValorJuros", titulo.getValorAtraso()); + transacaoTitulos.setValue("DataDesconto", FormataUtil.formataDataToString(titulo.getDataLimiteDesconto(), "000000", "ddMMyy")); + transacaoTitulos.setValue("ValorDesconto", titulo.getValorDesconto()); + transacaoTitulos.setValue("ValorIOF", titulo.getValorIOF()); + transacaoTitulos.setValue("ValorAbatimento", titulo.getValorAbatimentoConcedido()); + transacaoTitulos.setValue("AgenciaCobradora", FormataUtil.formatarValorPorTamanho("", 6)); + transacaoTitulos.setValue("TipoSacado", FormataUtil.formatarValorPorTamanho(titulo.getTipoInscricaoPagador().toString(), 2)); + transacaoTitulos.setValue("DocumentoSacado", FormataUtil.formatarValorPorTamanho(titulo.getNumeroInscricaoSacado().toString(), 14)); + transacaoTitulos.setValue("NomeSacado", FormataUtil.formatarValorPorTamanho(titulo.getNomeSacado(), 40)); + transacaoTitulos.setValue("EnderecoSacado", FormataUtil.formatarValorPorTamanho(titulo.getEnderecoSacado(), 40)); + transacaoTitulos.setValue("BairroSacado", FormataUtil.formatarValorPorTamanho(titulo.getBairroSacado(), 12)); + transacaoTitulos.setValue("CepSacado", FormataUtil.formatarValorPorTamanho(titulo.getCepSacado().toString(), 8)); + transacaoTitulos.setValue("CidadeSacado", FormataUtil.formatarValorPorTamanho(titulo.getCidade(), 15)); + transacaoTitulos.setValue("EstadoSacado", FormataUtil.formatarValorPorTamanho(titulo.getEstado(), 2)); + transacaoTitulos.setValue("DataMulta", FormataUtil.formataDataToString(titulo.getVencimento(), "000000", "ddMMyy")); + transacaoTitulos.setValue("ValorMulta", titulo.getValorMulta()); + transacaoTitulos.setValue("SacadorAvalista", FormataUtil.formatarValorPorTamanho(titulo.getSacadorAvalista(), 30)); + transacaoTitulos.setValue("NumeroSequencialRegistro", FormataUtil.formatarValorPorTamanho(titulo.getNumeroSequencialRegistro().toString(), 6)); + + valorTotal = valorTotal.add(titulo.getValor()); + quantidadeRegistro = quantidadeRegistro + 1; + + getFlatFile().addRecord(transacaoTitulos); + } + + @Override + protected void createTrailler(RodapeRemessa trailler){ + + Record trailer = getFlatFile().createRecord("Trailler"); + + trailer.setValue("NumeroSequencialRegistro", FormataUtil.formatarValorPorTamanho(trailler.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 0c2d7998f..2d4599938 100644 --- a/src/com/rjconsultores/ventaboletos/utils/NossoNumeroUtils.java +++ b/src/com/rjconsultores/ventaboletos/utils/NossoNumeroUtils.java @@ -339,6 +339,10 @@ public class NossoNumeroUtils { return Boolean.TRUE; } + if(BancoLayout.CAIXA_400_Envio.equals(bancoLayout) && ( nossoNumero.length() == 10 && nossoNumero.startsWith("3"))){ + return Boolean.TRUE; + } + return Boolean.FALSE; } diff --git a/src/layouts/LayoutCaixaCNAB400Envio.txg.xml b/src/layouts/LayoutCaixaCNAB400Envio.txg.xml new file mode 100644 index 000000000..9260e7e3a --- /dev/null +++ b/src/layouts/LayoutCaixaCNAB400Envio.txg.xml @@ -0,0 +1,104 @@ + + + + + Arquivo-Remessa_CaixaCNAB400 + Version 67.126 v021micro, Published: 02/04/2021 + + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file