diff --git a/src/com/rjconsultores/ventaboletos/Main.java b/src/com/rjconsultores/ventaboletos/Main.java index 0c0b3e0c8..a1be56ef0 100644 --- a/src/com/rjconsultores/ventaboletos/Main.java +++ b/src/com/rjconsultores/ventaboletos/Main.java @@ -5,64 +5,57 @@ import java.math.BigDecimal; import java.util.Date; import com.rjconsultores.ventaboletos.blocos.RodapeRemessaPadrao; -import com.rjconsultores.ventaboletos.blocos.santander.ArquivoRemessaSantander; -import com.rjconsultores.ventaboletos.blocos.santander.CabecalhoRemessaSantander; -import com.rjconsultores.ventaboletos.blocos.santander.DetalheObrigatorioSantander; +import com.rjconsultores.ventaboletos.blocos.mercantil.ArquivoRemessaMercantil; +import com.rjconsultores.ventaboletos.blocos.mercantil.CabecalhoRemessaMercantil; +import com.rjconsultores.ventaboletos.blocos.mercantil.DetalheObrigatorioMercantil; import com.rjconsultores.ventaboletos.enuns.BancoLayout; -import com.rjconsultores.ventaboletos.enuns.TipoInscricaoPagador; +import com.rjconsultores.ventaboletos.layouts.MercantilFlatFile; import com.rjconsultores.ventaboletos.layouts.RemessaInterface; -import com.rjconsultores.ventaboletos.layouts.SantanderFlatFile; public class Main { public static void main(String[] args) { - ArquivoRemessaItem arquivoRemessaItem = new ArquivoRemessaSantander(); + ArquivoRemessaItem arquivoRemessaItem = new ArquivoRemessaMercantil(); - CabecalhoRemessaSantander cabecalhoRemessa = new CabecalhoRemessaSantander(); - - //cabecalhoRemessa.setCodigoBanco("123"); + CabecalhoRemessaMercantil cabecalhoRemessa = new CabecalhoRemessaMercantil(); + cabecalhoRemessa.setCodigoEmpresa("123456"); - //cabecalhoRemessa.setCodigoServico("1222"); - //cabecalhoRemessa.setLiteralRemessa("REMESSA"); + cabecalhoRemessa.setAgenciaOrigem("0555"); cabecalhoRemessa.setDataGravacao(new Date()); - //cabecalhoRemessa.setLiteralServico("COBRANCA"); + cabecalhoRemessa.setCnpj(new Long("1452265658222")); cabecalhoRemessa.setNumeroSequencialRemessa(1); cabecalhoRemessa.setNumeroSequencialRegistro(9); - cabecalhoRemessa.setCodigoTransmissao(1234567890); cabecalhoRemessa.setNomeEmpresa("RJ Consultores"); arquivoRemessaItem.setCabecalhoRemessa(cabecalhoRemessa); - DetalheObrigatorioSantander tituloSantander = new DetalheObrigatorioSantander(); + DetalheObrigatorioMercantil titulo = new DetalheObrigatorioMercantil(); - tituloSantander.setValor(new BigDecimal("4567.88")); - tituloSantander.setVencimento(new Date()); - tituloSantander.setTipoInscricao(TipoInscricaoPagador.getInstanceByName("cpf")); - tituloSantander.setNumeroInscricao(new Long(1452265658)); - tituloSantander.setCepSacado("32015"); - tituloSantander.setComplementoCepSacado("490"); - tituloSantander.setNumeroDoDocumento("555666777"); - tituloSantander.setAgencia("0555"); - tituloSantander.setEmissao( new Date() ); - //tituloSantander.setOrigemDoPagamento(999); - + titulo.setValorTitulo(new BigDecimal("4567.88")); + titulo.setVencimento(new Date()); + titulo.setCnpj(new Long("1452265658222")); + titulo.setCepPrefixo("32015"); + titulo.setCepSufixo("490"); + titulo.setNumeroDoDocumento("555666777"); + titulo.setAgenciaOrigem("0555"); + titulo.setEmissao( new Date() ); try { - arquivoRemessaItem.addTitulo(tituloSantander.clone()); - arquivoRemessaItem.addTitulo(tituloSantander.clone()); - arquivoRemessaItem.addTitulo(tituloSantander.clone()); - arquivoRemessaItem.addTitulo(tituloSantander.clone()); - arquivoRemessaItem.addTitulo(tituloSantander.clone()); - arquivoRemessaItem.addTitulo(tituloSantander.clone()); - arquivoRemessaItem.addTitulo(tituloSantander.clone()); + arquivoRemessaItem.addTitulo(titulo.clone()); + arquivoRemessaItem.addTitulo(titulo.clone()); + arquivoRemessaItem.addTitulo(titulo.clone()); + arquivoRemessaItem.addTitulo(titulo.clone()); + arquivoRemessaItem.addTitulo(titulo.clone()); + arquivoRemessaItem.addTitulo(titulo.clone()); + arquivoRemessaItem.addTitulo(titulo.clone()); } catch (CloneNotSupportedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } - RemessaInterface remessaInterface = new SantanderFlatFile(); + RemessaInterface remessaInterface = new MercantilFlatFile(); RodapeRemessaPadrao rodapeRemessa = new RodapeRemessaPadrao(); rodapeRemessa.setNumeroSequencialRegistro(9999); @@ -71,7 +64,7 @@ public class Main { File arquivoRemessaFisico = new File("C:\\Fabio\\fabio.txt"); - ArquivoRemessa arquivoRemessa = new ArquivoRemessa(BancoLayout.SANTANDER_400_Envio); + ArquivoRemessa arquivoRemessa = new ArquivoRemessa(BancoLayout.MERCANTIL_400_Envio); try { arquivoRemessa.addItem(arquivoRemessaItem.clone()); diff --git a/src/com/rjconsultores/ventaboletos/blocos/mercantil/ArquivoRemessaMercantil.java b/src/com/rjconsultores/ventaboletos/blocos/mercantil/ArquivoRemessaMercantil.java new file mode 100644 index 000000000..9d33a0902 --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/mercantil/ArquivoRemessaMercantil.java @@ -0,0 +1,43 @@ +package com.rjconsultores.ventaboletos.blocos.mercantil; + +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 ArquivoRemessaMercantil extends ArquivoRemessaItem { + + @Override + public void setCabecalhoRemessa(CabecalhoRemessa cabecalhoRemessa) { + + if(cabecalhoRemessa instanceof CabecalhoRemessaMercantil){ + super.setCabecalhoRemessa(cabecalhoRemessa); + }else{ + throw new ClassCastException("Somente cabecalho tipo: " + CabecalhoRemessaMercantil.class.getName()); + } + } + + @Override + public void addTitulo(DetalheObrigatorio titulo){ + if(this.titulos == null){ + this.titulos = new ArrayList(); + } + + if(titulo instanceof DetalheObrigatorioMercantil){ + titulo.setNumeroSequencialRegistro(titulos.size() + 2); + this.titulos.add(titulo); + }else{ + throw new ClassCastException("Somente cabecalho tipo: " + DetalheObrigatorioMercantil.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/mercantil/CabecalhoRemessaMercantil.java b/src/com/rjconsultores/ventaboletos/blocos/mercantil/CabecalhoRemessaMercantil.java new file mode 100644 index 000000000..3a6f55345 --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/mercantil/CabecalhoRemessaMercantil.java @@ -0,0 +1,73 @@ +package com.rjconsultores.ventaboletos.blocos.mercantil; + +import java.util.Date; + +import com.rjconsultores.ventaboletos.blocos.CabecalhoRemessa; + +public class CabecalhoRemessaMercantil implements CabecalhoRemessa { + + private String agenciaOrigem; + private Long cnpj; + private String codigoEmpresa; + private String nomeEmpresa; + private Date dataGravacao; + private Integer numeroSequencialRemessa; + private Integer numeroSequencialRegistro; + + 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 Long getCnpj() { + return cnpj; + } + + public void setCnpj(Long cnpj) { + this.cnpj = cnpj; + } + + public String getAgenciaOrigem() { + return agenciaOrigem; + } + + public void setAgenciaOrigem(String agenciaOrigem) { + this.agenciaOrigem = agenciaOrigem; + } + +} diff --git a/src/com/rjconsultores/ventaboletos/blocos/mercantil/DetalheObrigatorioMercantil.java b/src/com/rjconsultores/ventaboletos/blocos/mercantil/DetalheObrigatorioMercantil.java new file mode 100644 index 000000000..1118e7a57 --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/blocos/mercantil/DetalheObrigatorioMercantil.java @@ -0,0 +1,391 @@ +package com.rjconsultores.ventaboletos.blocos.mercantil; + +import java.math.BigDecimal; +import java.util.Date; + +import com.rjconsultores.ventaboletos.blocos.DadosBoleto; +import com.rjconsultores.ventaboletos.blocos.DetalheObrigatorio; +import com.rjconsultores.ventaboletos.enuns.TipoInscricaoPagador; + +public class DetalheObrigatorioMercantil implements DetalheObrigatorio, Cloneable { + + private Integer idBoletoFechamento; + private String agenciaOrigem; + private String numeroControleDoParticipante; + private String nossoNumero; + private String digitoVerificador; + private Long cnpj; + private Integer QtdPagamento = 0; + private Integer codigoDeOcorrencia = 0; + private Date dataOcorrencia; + private String numeroDoDocumento; + private Date vencimento; + private BigDecimal ValorTitulo; + private String especieDeTitulo; + private Date emissao; + private String instrucao1; + private String instrucao2; + private BigDecimal valorAtraso = BigDecimal.ZERO; + private Date dataLimiteDesconto; + private BigDecimal valorDesconto = BigDecimal.ZERO; + private BigDecimal valorIOF = BigDecimal.ZERO; + private BigDecimal valorAbatimentoConcedido = BigDecimal.ZERO; + private TipoInscricaoPagador tipoInscricaoPagador; + private Long numeroInscricaoPagador; + private String nomePagador; + private String enderecoCompletoPagador; + private String bairro; + private String cidade; + private String estado; + private String mensagem1; + private String cepPrefixo; + private String cepSufixo; + private String sacadorAvalistaMensagem2; + private Integer numeroSequencialRegistro; + private Integer multaPercentual; + private Integer numeroContrato; + private Integer seuNumero; + + + /* + + MultaPercentual" + MultaData" + " + IdentificacaoTitulo" + AgenciaOrigem" + DigitoVerificador" + + CNPJ" + QuantidadeMoeda" + CodigoOperacao" + CodigoMovimentacao" + SeuNumero" + DataVencimento" + + CodigoBanco" + Agencia" + Aceite" + JurosDeMora" + DataLimiteDesconto" + DescontoConcedido" + IOF_Devido" + AbatimentoConcedido" + TipoInscricaoSacado" + NumeroInscricaoSacado" + NomeSacado" + EnderecoSacado" + BairroSacado" + CepSacado" + ComplementoCepSacado" + Cidade" + Estado" + SacadorAvalista" + + CodigoMoeda" +*/ + + private DadosBoleto dadosBoleto; + + @Override + public void setIdBoletoFechamento(Integer id) { + this.idBoletoFechamento = id; + } + + @Override + public Integer getIdBoletoFechamento(){ + return this.idBoletoFechamento; + } + + public DetalheObrigatorio clone() throws CloneNotSupportedException { + return (DetalheObrigatorio) super.clone(); + } + + public String getAgenciaOrigem() { + return agenciaOrigem; + } + + public void setAgenciaOrigem(String agenciaOrigem) { + this.agenciaOrigem = agenciaOrigem; + } + + public String getNumeroControleDoParticipante() { + return numeroControleDoParticipante; + } + + public void setNumeroControleDoParticipante(String numeroControleDoParticipante) { + this.numeroControleDoParticipante = numeroControleDoParticipante; + } + + public String getNossoNumero() { + return nossoNumero; + } + + public void setNossoNumero(String nossoNumero) { + this.nossoNumero = nossoNumero; + } + + public String getDigitoVerificador() { + return digitoVerificador; + } + + public void setDigitoVerificador(String digitoVerificador) { + this.digitoVerificador = digitoVerificador; + } + + public Integer getQtdPagamento() { + return QtdPagamento; + } + + public void setQtdPagamento(Integer qtdPagamento) { + QtdPagamento = qtdPagamento; + } + + public Integer getCodigoDeOcorrencia() { + return codigoDeOcorrencia; + } + + public void setCodigoDeOcorrencia(Integer codigoDeOcorrencia) { + this.codigoDeOcorrencia = codigoDeOcorrencia; + } + + public Date getDataOcorrencia() { + return dataOcorrencia; + } + + public void setDataOcorrencia(Date dataOcorrencia) { + this.dataOcorrencia = dataOcorrencia; + } + + public String getNumeroDoDocumento() { + return numeroDoDocumento; + } + + public void setNumeroDoDocumento(String numeroDoDocumento) { + this.numeroDoDocumento = numeroDoDocumento; + } + + public Date getVencimento() { + return vencimento; + } + + public void setVencimento(Date vencimento) { + this.vencimento = vencimento; + } + + public BigDecimal getValorTitulo() { + return ValorTitulo; + } + + public void setValorTitulo(BigDecimal valorTitulo) { + ValorTitulo = valorTitulo; + } + + public String getEspecieDeTitulo() { + return especieDeTitulo; + } + + public void setEspecieDeTitulo(String especieDeTitulo) { + this.especieDeTitulo = especieDeTitulo; + } + + public Date getEmissao() { + return emissao; + } + + public void setEmissao(Date emissao) { + this.emissao = emissao; + } + + 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 getValorAtraso() { + return valorAtraso; + } + + public void setValorAtraso(BigDecimal valorAtraso) { + this.valorAtraso = valorAtraso; + } + + 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 Long getNumeroInscricaoPagador() { + return numeroInscricaoPagador; + } + + public void setNumeroInscricaoPagador(Long numeroInscricaoPagador) { + this.numeroInscricaoPagador = numeroInscricaoPagador; + } + + public String getNomePagador() { + return nomePagador; + } + + public void setNomePagador(String nomePagador) { + this.nomePagador = nomePagador; + } + + public String getEnderecoCompletoPagador() { + return enderecoCompletoPagador; + } + + public void setEnderecoCompletoPagador(String enderecoCompletoPagador) { + this.enderecoCompletoPagador = enderecoCompletoPagador; + } + + public String getMensagem1() { + return mensagem1; + } + + public void setMensagem1(String mensagem1) { + this.mensagem1 = mensagem1; + } + + public String getSacadorAvalistaMensagem2() { + return sacadorAvalistaMensagem2; + } + + public void setSacadorAvalistaMensagem2(String sacadorAvalistaMensagem2) { + this.sacadorAvalistaMensagem2 = sacadorAvalistaMensagem2; + } + + public Integer getNumeroSequencialRegistro() { + return numeroSequencialRegistro; + } + + public void setNumeroSequencialRegistro(Integer numeroSequencialRegistro) { + this.numeroSequencialRegistro = numeroSequencialRegistro; + } + + public DadosBoleto getDadosBoleto() { + return dadosBoleto; + } + + public void setDadosBoleto(DadosBoleto dadosBoleto) { + this.dadosBoleto = dadosBoleto; + } + + public Integer getMultaPercentual() { + return multaPercentual; + } + + public void setMultaPercentual(Integer multaPercentual) { + this.multaPercentual = multaPercentual; + } + + public String getCepPrefixo() { + return cepPrefixo; + } + + public void setCepPrefixo(String cepPrefixo) { + this.cepPrefixo = cepPrefixo; + } + + public String getCepSufixo() { + return cepSufixo; + } + + public void setCepSufixo(String cepSufixo) { + this.cepSufixo = cepSufixo; + } + + public Long getCnpj() { + return cnpj; + } + + public void setCnpj(Long cnpj) { + this.cnpj = cnpj; + } + + public Integer getNumeroContrato() { + return numeroContrato; + } + + public void setNumeroContrato(Integer numeroContrato) { + this.numeroContrato = numeroContrato; + } + + public Integer getSeuNumero() { + return seuNumero; + } + + public void setSeuNumero(Integer seuNumero) { + this.seuNumero = seuNumero; + } + + public String getBairro() { + return bairro; + } + + public void setBairro(String bairro) { + this.bairro = bairro; + } + + 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; + } +} diff --git a/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java b/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java index f0088f18b..a9bd57000 100644 --- a/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java +++ b/src/com/rjconsultores/ventaboletos/enuns/BancoLayout.java @@ -5,6 +5,7 @@ public enum BancoLayout { ITAU_400_Envio("341", false, "/layouts/LayoutItauCNAB400Envio.txg.xml"), BB_240_Envio("001", false, "/layouts/LayoutBBCNAB240Envio.txg.xml"), SANTANDER_400_Envio("033", false, "/layouts/LayoutSantanderCNAB400Envio.txg.xml"), + MERCANTIL_400_Envio("389", false, "/layouts/LayoutMercantilCNAB400Envio.txg.xml"), SANTANDER_400_Retorno("033", true, "/layouts/LayoutSantanderCNAB400Retorno.txg.xml"), BRADESCO_400_Retorno("237", true, "/layouts/LayoutBradescoCNAB400Retorno.txg.xml"), ITAU_400_Retorno("341", true, ""), @@ -14,13 +15,11 @@ public enum BancoLayout { this.codBanco = codBanco; this.retorno = retorno; this.path = path; - this.valido = true; } private String codBanco; private boolean retorno; private String path; - private boolean valido = true; public String getCodBanco() { return codBanco; @@ -37,14 +36,6 @@ public enum BancoLayout { public String getTemp() { return path.substring(path.lastIndexOf("/")); } - - public boolean isValido() { - return valido; - } - - public void setValido(boolean valido) { - this.valido = valido; - } public static BancoLayout getInstanceByCodBanco(String codBanco){ diff --git a/src/com/rjconsultores/ventaboletos/enuns/OcorrenciaMercantil.java b/src/com/rjconsultores/ventaboletos/enuns/OcorrenciaMercantil.java new file mode 100644 index 000000000..775863b8b --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/enuns/OcorrenciaMercantil.java @@ -0,0 +1,42 @@ +package com.rjconsultores.ventaboletos.enuns; + +public enum OcorrenciaMercantil { + + EntNor("01","REMESSA – ENTRADA NORMAL"), + PedCli("02","BAIXA – PEDIDO DO CLIENTE"), + ConAba("04","ALTERAÇÃO – CONCESSÃO DE ABATIMENTO"), + CanAba("05","ALTERAÇÃO – CANCELAMENTO DE ABATIMENTO"), + ProVen("06","ALTERAÇÃO – PRORROGAÇÃO DE VENCIMENTO"), + ConDes("07","CONCEDER DESCONTO DE R$"), + ProAvi("09","PROTESTAR SEM MAIS AVISO CONSULTA"); + + private OcorrenciaMercantil(String id, String label){ + this.id = id; + this.label = label; + } + + private String id; + private String label; + + public String getId() { + return id; + } + + public String getLabel() { + return label; + } + + public static OcorrenciaMercantil getInstance(String id){ + + for(OcorrenciaMercantil o : OcorrenciaMercantil.values()){ + + if(o.getId().equals(id)){ + return o; + + } + } + + return null; + + } +} diff --git a/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java b/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java index ad5417cbe..632bb5a9d 100644 --- a/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java +++ b/src/com/rjconsultores/ventaboletos/layouts/CNABFactory.java @@ -12,6 +12,8 @@ public class CNABFactory { return new BradescoFlatFile(); case SANTANDER_400_Envio: return new SantanderFlatFile(); + case MERCANTIL_400_Envio: + return new MercantilFlatFile(); case ITAU_400_Envio: return new ItauFlatFile(); case BB_240_Envio: @@ -20,7 +22,6 @@ public class CNABFactory { break; } - return null; } @@ -35,7 +36,6 @@ public class CNABFactory { break; } - return null; } } diff --git a/src/com/rjconsultores/ventaboletos/layouts/MercantilFlatFile.java b/src/com/rjconsultores/ventaboletos/layouts/MercantilFlatFile.java new file mode 100644 index 000000000..8e893a7b7 --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/layouts/MercantilFlatFile.java @@ -0,0 +1,131 @@ +package com.rjconsultores.ventaboletos.layouts; + +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.mercantil.CabecalhoRemessaMercantil; +import com.rjconsultores.ventaboletos.blocos.mercantil.DetalheObrigatorioMercantil; +import com.rjconsultores.ventaboletos.enuns.BancoLayout; +import com.rjconsultores.ventaboletos.utils.FormataUtil; + +public class MercantilFlatFile extends AbstractFlatFile implements RemessaInterface { + + public MercantilFlatFile() { + super(BancoLayout.MERCANTIL_400_Envio); + } + + @Override + protected void createHeader(CabecalhoRemessa cabecalhoRemessaParam) { + + Record header = getFlatFile().createRecord("Header"); + + CabecalhoRemessaMercantil cabecalhoRemessa = (CabecalhoRemessaMercantil) cabecalhoRemessaParam; + + header.setValue("AgenciaOrigem", FormataUtil.formatarValorPorTamanho(cabecalhoRemessa.getAgenciaOrigem(), 4)); + header.setValue("Cliente", FormataUtil.formatarValorPorTamanho(cabecalhoRemessa.getCnpj().toString(), 15)); + header.setValue("NomeDaEmpresa", FormataUtil.formatarValorPorTamanho(cabecalhoRemessa.getNomeEmpresa(), 30)); + header.setValue("DataGravacaoArquivo", FormataUtil.formataDataToString(cabecalhoRemessa.getDataGravacao(), "000000", "ddMMyy")); + header.setValue("NumeroSequencialRegistro", FormataUtil.formatarValorPorTamanho(cabecalhoRemessa.getNumeroSequencialRegistro().toString(), 5)); + header.setValue("NumeroSequencialRemessa", FormataUtil.formatarValorPorTamanho(cabecalhoRemessa.getNumeroSequencialRemessa().toString(), 6)); + + getFlatFile().addRecord(header); + } + + @Override + protected void createTransacaoTitulos(DetalheObrigatorio tituloParam) { + + Record transacaoTitulos = getFlatFile().createRecord("TransacaoTitulo"); + + DetalheObrigatorioMercantil titulo = (DetalheObrigatorioMercantil) tituloParam; + + transacaoTitulos.setValue("AgenciaOrigem", FormataUtil.formatarValorPorTamanho(titulo.getAgenciaOrigem(), 5)); + transacaoTitulos.setValue("MultaPercentual", FormataUtil.formatarValorPorTamanho(titulo.getMultaPercentual(), 2)); + transacaoTitulos.setValue("CNPJ", FormataUtil.formatarValorPorTamanho(titulo.getCnpj().toString(), 15)); + transacaoTitulos.setValue("NumeroContrato", FormataUtil.formatarValorPorTamanho(titulo.getNumeroContrato(), 9)); + transacaoTitulos.setValue("NumeroControleDoParticipante", FormataUtil.formatarValorPorTamanho(titulo.getNumeroControleDoParticipante(), 25)); + transacaoTitulos.setValue("Filler1", FormataUtil.formatarValorPorTamanho("0", 8)); + transacaoTitulos.setValue("NossoNumero", FormataUtil.formatarValorPorTamanho(titulo.getNossoNumero(), 10)); + transacaoTitulos.setValue("DigitoVerificador", FormataUtil.formatarValorPorTamanho(titulo.getDigitoVerificador(), 1)); + transacaoTitulos.setValue("SeuNumero", FormataUtil.formatarValorPorTamanho(titulo.getSeuNumero(), 10)); + transacaoTitulos.setValue("DadosIgnorados2", FormataUtil.formatarValorPorTamanho("", 25)); + transacaoTitulos.setValue("QtdPagamento", FormataUtil.formatarValorPorTamanho(titulo.getQtdPagamento(), 25)); + //transacaoTitulos.setValue("CodigoDeOcorrencia", FormataUtil.formatarValorPorTamanho(titulo.getCodigoDeOcorrencia().toString(), 2)); + transacaoTitulos.setValue("NumeroDoDocumento", FormataUtil.formatarValorPorTamanho(titulo.getNumeroDoDocumento(), 10)); + transacaoTitulos.setValue("Vencimento", FormataUtil.formataDataToString(titulo.getVencimento(), "000000", "ddMMyy")); + transacaoTitulos.setValue("ValorTitulo", titulo.getValorTitulo()); + //transacaoTitulos.setValue("BancoCobranca", FormataUtil.formatarValorPorTamanho("0", 3)); + //transacaoTitulos.setValue("AgenciaAgencia", FormataUtil.formatarValorPorTamanho("0", 5)); + transacaoTitulos.setValue("EspecieDeTitulo", FormataUtil.formatarValorPorTamanho(titulo.getEspecieDeTitulo(), 2)); + //transacaoTitulos.setValue("Identificação", FormataUtil.formatarValorPorTamanho("N", 1)); + transacaoTitulos.setValue("Emissao", FormataUtil.formataDataToString(titulo.getEmissao(), "000000", "ddMMyy")); + transacaoTitulos.setValue("Instrucao1", FormataUtil.formatarValorPorTamanho(titulo.getInstrucao1(), 2)); + transacaoTitulos.setValue("Instrucao2", FormataUtil.formatarValorPorTamanho(titulo.getInstrucao2(), 2)); + transacaoTitulos.setValue("ValorAtraso", titulo.getValorAtraso()); + transacaoTitulos.setValue("DataLimiteDesconto", FormataUtil.formataData(titulo.getDataLimiteDesconto())); + transacaoTitulos.setValue("ValorDesconto", titulo.getValorDesconto()); + transacaoTitulos.setValue("ValorIOF", titulo.getValorIOF()); + transacaoTitulos.setValue("ValorAbatimentoConcedido", titulo.getValorAbatimentoConcedido()); + transacaoTitulos.setValue("NomePagador", FormataUtil.formatarValorPorTamanho(titulo.getNomePagador(), 40)); + transacaoTitulos.setValue("EnderecoCompletoPagador", FormataUtil.formatarValorPorTamanho(titulo.getEnderecoCompletoPagador(), 40)); + transacaoTitulos.setValue("Mensagem1", FormataUtil.formatarValorPorTamanho(titulo.getMensagem1(), 12)); + transacaoTitulos.setValue("CEPPrefixo", FormataUtil.formatarValorPorTamanho(titulo.getCepPrefixo(), 5)); + transacaoTitulos.setValue("CEPSufixo", FormataUtil.formatarValorPorTamanho(titulo.getCepSufixo(), 3)); + transacaoTitulos.setValue("BairroSacado", FormataUtil.formatarValorPorTamanho(titulo.getBairro(), 12)); + transacaoTitulos.setValue("Cidade", FormataUtil.formatarValorPorTamanho(titulo.getCidade(), 15)); + transacaoTitulos.setValue("Estado", FormataUtil.formatarValorPorTamanho(titulo.getEstado(), 2)); + transacaoTitulos.setValue("Sacador_Avalista_Mensagem2", FormataUtil.formatarValorPorTamanho(titulo.getSacadorAvalistaMensagem2(), 60)); + transacaoTitulos.setValue("NumeroSequencialRegistro", FormataUtil.formatarValorPorTamanho(titulo.getNumeroSequencialRegistro().toString(), 6)); + + DadosBoleto dadosBoleto = titulo.getDadosBoleto(); + + try{ + if(dadosBoleto != null){ + transacaoTitulos.addInnerRecord(createDadosBoletos(dadosBoleto)); + } + }catch(UnsupportedOperationException e){ } + + getFlatFile().addRecord(transacaoTitulos); + } + + @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..."); + } + + @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."); + } +} diff --git a/src/com/rjconsultores/ventaboletos/utils/FormataUtil.java b/src/com/rjconsultores/ventaboletos/utils/FormataUtil.java index 651565f37..f25a155a4 100644 --- a/src/com/rjconsultores/ventaboletos/utils/FormataUtil.java +++ b/src/com/rjconsultores/ventaboletos/utils/FormataUtil.java @@ -16,6 +16,13 @@ public class FormataUtil { return value; } + public static String formatarValorPorTamanho(Integer valor, int tamanho) { + + String value = valor == null ? "" : valor.toString(); + + return formatarValorPorTamanho(value, tamanho) ; + } + public static String formatarValorPorTamanhoZeroEsquerda(String value, int tamanho) { value = value == null ? "" : value; diff --git a/src/com/rjconsultores/ventaboletos/utils/NossoNumeroUtils.java b/src/com/rjconsultores/ventaboletos/utils/NossoNumeroUtils.java index 0cf4f05cf..a473393ba 100644 --- a/src/com/rjconsultores/ventaboletos/utils/NossoNumeroUtils.java +++ b/src/com/rjconsultores/ventaboletos/utils/NossoNumeroUtils.java @@ -30,11 +30,14 @@ public class NossoNumeroUtils { return StringUtils.right("00000000" + nossoNumero, 8) + dacItau(codAgencia, numConta, numCarteira, nossoNumero); } - public static String calcularNossoNumeroSantander(BigInteger nossoNumero){ return StringUtils.right("0000000" + nossoNumero, 7)+dacSantander( nossoNumero.toString() ); } + public static String calcularNossoNumeroMercantil(Integer agencia, BigInteger nossoNumero){ + return StringUtils.right("0000000000" + nossoNumero, 10)+dacMercantil( agencia, nossoNumero ); + } + /** * Devolve o nosso numero do BB com o DV calculado (Tamanho 20)... * @param convenioBanco @@ -105,6 +108,31 @@ public class NossoNumeroUtils { } + public static String dacMercantil(Integer agencia, BigInteger nossoNumero){ + + 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 base = agenciaformatada + nNumero; + + int soma = 0; + + for (int i = 0; i < base.length(); i++) { + String d = base.charAt(i)+""; + soma = Integer.valueOf(d) * multiplicadores[i]; + } + + int mod = soma % 11; + + if( mod == 0 || mod == 1 ) { + return "0"; + } + + return String.valueOf(11 - mod); + } + /** * Calcula do DV para o Itau * @param codAgencia @@ -185,7 +213,6 @@ public class NossoNumeroUtils { return mod + ""; } - public static String dacSantander(String nossoNumero){ int multiplicador = 2; @@ -216,7 +243,6 @@ public class NossoNumeroUtils { return String.valueOf(11 - mod); } - /** * Calcula do DV para o Itau (Numero Documento) * @param codAgencia @@ -255,8 +281,6 @@ public class NossoNumeroUtils { dac = 10 - (dac % 10); - - return dac + ""; } @@ -270,6 +294,10 @@ public class NossoNumeroUtils { return Boolean.TRUE; } + if(BancoLayout.MERCANTIL_400_Envio.equals(bancoLayout) && nossoNumero.length() == 12 ){ + return Boolean.TRUE; + } + if(BancoLayout.SANTANDER_400_Envio.equals(bancoLayout) && nossoNumero.length() == 9 ){ return Boolean.TRUE; } @@ -281,10 +309,9 @@ public class NossoNumeroUtils { return Boolean.FALSE; } - public static void main(String[] args) { - System.out.println( calcularNossoNumeroSantander( new BigInteger("2457800") )); + System.out.println( calcularNossoNumeroMercantil( 89, new BigInteger("0032861174") )); } } diff --git a/src/layouts/LayoutMercantilCNAB400Envio.txg.xml b/src/layouts/LayoutMercantilCNAB400Envio.txg.xml new file mode 100644 index 000000000..28df03ca7 --- /dev/null +++ b/src/layouts/LayoutMercantilCNAB400Envio.txg.xml @@ -0,0 +1,114 @@ + + + + + + Arquivo-Remessa_SantanderCNAB400 + Version 2,0, Published: outubro/2009 + + 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 + 1 = Registro de Movimento + 2 = Mensagem Variável por Título (Opcional) + 4 = Mensagem Variável por Título (Opcional) + 5 = Mensagem Variável por Título (Opcional) + 6 = Mensagem Variável por Título (Opcional) + 7 = Mensagem Variável por Título (Opcional) + 9 = Trailler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file