diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/Banco.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/Banco.java index 7269e32f7..d628bac87 100755 --- a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/Banco.java +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/Banco.java @@ -65,5 +65,7 @@ public interface Banco extends Serializable { GeradorDeDigito getGeradorDeDigito(); String getNossoNumeroECodigoDocumento(Boleto boleto); + + String getNossoNumeroComDigitoVerificador(Beneficiario beneficiario); } diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BMG.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BMG.java index 3e5c093cd..0b523e93c 100644 --- a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BMG.java +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BMG.java @@ -58,11 +58,7 @@ public String getCodigoBeneficiarioFormatado(Beneficiario beneficiario) { @Override public String getNossoNumeroFormatado(Beneficiario beneficiario) { - String nossoNumero = beneficiario.getNossoNumero(); - if (beneficiario.getDigitoNossoNumero() != null) { - return leftPadWithZeros(nossoNumero+beneficiario.getDigitoNossoNumero(), 10); - } - return leftPadWithZeros(nossoNumero+getGeradorDeDigito().calculaDVNossoNumero(nossoNumero), 10); + return leftPadWithZeros(beneficiario.getNossoNumero(), 10); } @Override @@ -99,4 +95,17 @@ public GeradorDeDigitoSantander getGeradorDeDigito() { public String getNumeroConvenioFormatado(Beneficiario beneficiario) { return leftPadWithZeros(beneficiario.getNumeroConvenio(), 7); } -} \ No newline at end of file + + /** + * Método para cálculo do dígito verificador do campo Nosso Número. + * + * @param beneficiario + * @return String + */ + @Override + public String getNossoNumeroComDigitoVerificador(Beneficiario beneficiario) { + + return beneficiario.getNossoNumero(); + + } +} diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BancoAgiplan.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BancoAgiplan.java new file mode 100644 index 000000000..f29712308 --- /dev/null +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BancoAgiplan.java @@ -0,0 +1,76 @@ +package br.com.caelum.stella.boleto.bancos; + +import static br.com.caelum.stella.boleto.utils.StellaStringUtils.leftPadWithZeros; + +import java.net.URL; + +import br.com.caelum.stella.boleto.Beneficiario; +import br.com.caelum.stella.boleto.Boleto; +import br.com.caelum.stella.boleto.bancos.gerador.GeradorDeDigitoBancoAgiplan; + +public class BancoAgiplan extends AbstractBanco { + + + private static final long serialVersionUID = 1L; + private static final String NUMERO_BANCO_AGIPLAN = "121"; + private static final String DIGITO_NUMERO_BANCO_AGIPLAN = "1"; + private static final String COD_CEDENTE = "000000000001"; + private static final String LAYOUT = "4"; + private GeradorDeDigitoBancoAgiplan gdivBancoAgiplan = new GeradorDeDigitoBancoAgiplan(); + + @Override + public String getNumeroFormatado() { + return NUMERO_BANCO_AGIPLAN; + } + + @Override + public URL getImage() { + String pathDoArquivo = "/br/com/caelum/stella/boleto/img/%s.png"; + String imagem = String.format(pathDoArquivo, NUMERO_BANCO_AGIPLAN); + return getClass().getResource(imagem); + } + + @Override + public String geraCodigoDeBarrasPara(Boleto boleto) { + Beneficiario beneficiario = boleto.getBeneficiario(); + StringBuilder campoLivre = new StringBuilder(""); + campoLivre.append(COD_CEDENTE); + campoLivre.append(boleto.getBanco().getNossoNumeroFormatado(beneficiario)); + campoLivre.append(boleto.getBanco().getCarteiraFormatado(beneficiario)); + campoLivre.append(LAYOUT); + return new CodigoDeBarrasBuilder(boleto).comCampoLivre(campoLivre); + } + + @Override + public String getCodigoBeneficiarioFormatado(Beneficiario beneficiario) { + return leftPadWithZeros(beneficiario.getCodigoBeneficiario(), 7); + } + + @Override + public String getCarteiraFormatado(Beneficiario beneficiario) { + return leftPadWithZeros(beneficiario.getCarteira(), 2); + } + + @Override + public String getNossoNumeroFormatado(Beneficiario beneficiario) { + return leftPadWithZeros(beneficiario.getNossoNumero(), 10); + } + + @Override + public String getNumeroFormatadoComDigito() { + StringBuilder builder = new StringBuilder(); + builder.append(NUMERO_BANCO_AGIPLAN).append("-"); + return builder.append(DIGITO_NUMERO_BANCO_AGIPLAN).toString(); + } + + @Override + public String getNossoNumeroComDigitoVerificador(Beneficiario beneficiario) { + return getGeradorDeDigito().calculaDVNossoNumero(getCarteiraFormatado(beneficiario)+beneficiario.getNossoNumero()); + } + + @Override + public GeradorDeDigitoBancoAgiplan getGeradorDeDigito() { + return gdivBancoAgiplan; + } + +} diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BancoDoBrasil.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BancoDoBrasil.java index 7c45e756d..1e6c277af 100755 --- a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BancoDoBrasil.java +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/BancoDoBrasil.java @@ -117,5 +117,19 @@ public String getNossoNumeroECodigoDocumento(Boleto boleto) { return getNossoNumeroParaCarteiras17e18(beneficiario); } } + + + /** + * Método para cálculo do dígito verificador do campo Nosso Número. + * + * @param beneficiario + * @return String + */ + @Override + public String getNossoNumeroComDigitoVerificador(Beneficiario beneficiario) { + + return beneficiario.getNossoNumero(); + + } } diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Bancos.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Bancos.java index eb687b568..a026d0f6f 100644 --- a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Bancos.java +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Bancos.java @@ -53,6 +53,12 @@ public Banco getBanco() { public Banco getBanco() { return new BMG(); } + }, + BANCO_AGIPLAN("121", "Banco Agiplan"){ + @Override + public Banco getBanco() { + return new BancoAgiplan(); + } }; private final String numeroDoBanco; diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Bradesco.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Bradesco.java index f5c5d9832..5112c1553 100755 --- a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Bradesco.java +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Bradesco.java @@ -1,9 +1,12 @@ package br.com.caelum.stella.boleto.bancos; +import static br.com.caelum.stella.boleto.utils.StellaStringUtils.leftPadWithZeros; + +import java.math.BigDecimal; + import br.com.caelum.stella.boleto.Banco; import br.com.caelum.stella.boleto.Beneficiario; import br.com.caelum.stella.boleto.Boleto; -import static br.com.caelum.stella.boleto.utils.StellaStringUtils.leftPadWithZeros; /** * Gera dados de um boleto relativos ao Banco Bradesco. @@ -83,4 +86,73 @@ private String getDigitoNossoNumero(Beneficiario beneficiario) { ? "-" + beneficiario.getDigitoNossoNumero() : ""; } + /** + * Método para cálculo do dígito verificador do campo Nosso Número + * + * @param beneficiario + * @return String + */ + @Override + public String getNossoNumeroComDigitoVerificador(Beneficiario beneficiario) { + + String carteiraFormatada = leftPadWithZeros(beneficiario.getCarteira(), 3); + + String numeroDocumentoFormatada = leftPadWithZeros(beneficiario.getNossoNumero(), 11); + + String campo = carteiraFormatada + numeroDocumentoFormatada; + + String bytResult = "0"; + + Integer intSoma = 0; + + Integer bytMultiplicador = 2; + + Integer bytTamanho = campo.length(); + + Integer bytCont = 0; + + Integer bytResultado = 0; + + while (bytCont < bytTamanho - 1) { + + if (bytMultiplicador < 7) { + + bytResultado = new BigDecimal(campo.substring(bytTamanho - (bytCont + 1), bytTamanho - bytCont)).multiply(new BigDecimal(bytMultiplicador)).intValue(); + + bytMultiplicador += 1; + + } else { + + bytResultado = new BigDecimal(campo.substring(bytTamanho - (bytCont + 1), bytTamanho - bytCont)).multiply(new BigDecimal(bytMultiplicador)).intValue(); + + bytMultiplicador = 2; + + } + + intSoma += bytResultado; + + bytCont += 1; + } + + bytResultado = intSoma % 11; + + if (bytResultado != 0) { + + bytResultado = 11 - bytResultado; + + if (bytResultado == 10) { + + bytResult = "P"; + + } else { + + bytResult = String.valueOf(bytResultado); + + } + } + + return numeroDocumentoFormatada + bytResult; + + } + } \ No newline at end of file diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Caixa.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Caixa.java index 5aecf2b6d..f6dd2e06f 100755 --- a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Caixa.java +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Caixa.java @@ -100,4 +100,17 @@ public String getNossoNumeroECodigoDocumento(Boleto boleto) { } return builder.toString(); } + + /** + * Método para cálculo do dígito verificador do campo Nosso Número. + * + * @param beneficiario + * @return String + */ + @Override + public String getNossoNumeroComDigitoVerificador(Beneficiario beneficiario) { + + return beneficiario.getNossoNumero(); + + } } diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/HSBC.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/HSBC.java index bfef3da77..6ee59a5ea 100755 --- a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/HSBC.java +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/HSBC.java @@ -36,19 +36,19 @@ public String geraCodigoDeBarrasPara(Boleto boleto) { } public String getDataFormatoJuliano(Calendar vencimento, int tipo) { - String result; - Calendar dataLimite = Calendar.getInstance(); - dataLimite.set(Calendar.DAY_OF_MONTH, 1); - dataLimite.set(Calendar.MONTH, 7 - 1); - dataLimite.set(Calendar.YEAR, 1997); - if (vencimento.before(dataLimite)) { - result = "0000"; - } else { - int diaDoAno = vencimento.get(Calendar.DAY_OF_YEAR); - int digitoDoAno = vencimento.get(Calendar.YEAR) % 10; - result = String.format("%03d%d", diaDoAno, digitoDoAno); - } - return result; + //String result; + //Calendar dataLimite = Calendar.getInstance(); + //dataLimite.set(Calendar.DAY_OF_MONTH, 1); + //dataLimite.set(Calendar.MONTH, 7 - 1); + //dataLimite.set(Calendar.YEAR, 1997); + //if (vencimento.before(dataLimite)) { + // result = "0000"; + //} else { + // int diaDoAno = vencimento.get(Calendar.DAY_OF_YEAR); + // int digitoDoAno = vencimento.get(Calendar.YEAR) % 10; + // result = String.format("%03d%d", diaDoAno, digitoDoAno); + //} + return "0000"; } @Override @@ -115,4 +115,17 @@ private DigitoPara getModuloNossoNumero(String nossoNumero) { .mod(11); } -} \ No newline at end of file + + /** + * Método para cálculo do dígito verificador do campo Nosso Número. + * + * @param beneficiario + * @return String + */ + @Override + public String getNossoNumeroComDigitoVerificador(Beneficiario beneficiario) { + + return beneficiario.getNossoNumero(); + + } +} diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Itau.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Itau.java index 4d7ce3190..633e565e0 100755 --- a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Itau.java +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Itau.java @@ -81,4 +81,17 @@ public String getAgenciaECodigoBeneficiario(Beneficiario beneficiario) { return builder.toString(); } + + /** + * Método para cálculo do dígito verificador do campo Nosso Número. + * + * @param beneficiario + * @return String + */ + @Override + public String getNossoNumeroComDigitoVerificador(Beneficiario beneficiario) { + + return beneficiario.getNossoNumero(); + + } } diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Santander.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Santander.java index 9fda5c2aa..9ee9b0613 100755 --- a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Santander.java +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/Santander.java @@ -95,4 +95,18 @@ public GeradorDeDigitoSantander getGeradorDeDigito() { public String getNumeroConvenioFormatado(Beneficiario beneficiario) { return leftPadWithZeros(beneficiario.getNumeroConvenio(), 7); } + + /** + * Método para cálculo do dígito verificador do campo Nosso Número. + * + * @param beneficiario + * @return String + */ + @Override + public String getNossoNumeroComDigitoVerificador(Beneficiario beneficiario) { + + return beneficiario.getNossoNumero(); + + } + } \ No newline at end of file diff --git a/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/gerador/GeradorDeDigitoBancoAgiplan.java b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/gerador/GeradorDeDigitoBancoAgiplan.java new file mode 100644 index 000000000..666ce5885 --- /dev/null +++ b/stella-boleto/src/main/java/br/com/caelum/stella/boleto/bancos/gerador/GeradorDeDigitoBancoAgiplan.java @@ -0,0 +1,64 @@ +package br.com.caelum.stella.boleto.bancos.gerador; + +import br.com.caelum.stella.DigitoPara; +import static br.com.caelum.stella.boleto.utils.StellaStringUtils.leftPadWithZeros; + +public class GeradorDeDigitoBancoAgiplan extends GeradorDeDigitoPadrao { + + private static final long serialVersionUID = 1L; + + @Override + public int geraDigitoBloco1(String bloco) { + return calculaDVBloco(bloco); + } + + @Override + public int geraDigitoBloco2(String bloco) { + return calculaDVBloco(bloco); + } + + @Override + public int geraDigitoBloco3(String bloco) { + return calculaDVBloco(bloco); + } + + public int calculaDVBloco(String bloco) { + int soma = 0; + for (int i = bloco.length() - 1, multiplicador = 2; i >= 0; i--, multiplicador--) { + if (multiplicador == 0) { + multiplicador = 2; + } + int parcial = Integer.parseInt(String.valueOf(bloco.charAt(i))) * multiplicador; + + if (parcial > 9) { + parcial = parcial - 9; + } + + soma += parcial; + } + + int resto = soma % 10; + if (resto == 0) { + return 0; + } else { + return 10 - resto; + } + } + + public String calculaDVNossoNumero(String nossoNumero) { + if (nossoNumero == null || nossoNumero.length() > 12) { + throw new IllegalArgumentException("Nosso Número inválido: " + nossoNumero); + } + DigitoPara digitoPara = new DigitoPara(leftPadWithZeros(nossoNumero, 12)); + int digito = Integer.parseInt(digitoPara.comMultiplicadoresDeAte(2,7) + .mod(11) + .calcula()); + + if (digito > 1) { + digito = 11-digito; + } + + return String.valueOf(digito); + } + +} diff --git a/stella-boleto/src/main/resources/br/com/caelum/stella/boleto/img/121.png b/stella-boleto/src/main/resources/br/com/caelum/stella/boleto/img/121.png new file mode 100644 index 000000000..62bfc8dda Binary files /dev/null and b/stella-boleto/src/main/resources/br/com/caelum/stella/boleto/img/121.png differ diff --git a/stella-boleto/src/test/java/br/com/caelum/stella/boleto/bancos/BancoAgiplanTest.java b/stella-boleto/src/test/java/br/com/caelum/stella/boleto/bancos/BancoAgiplanTest.java new file mode 100644 index 000000000..49035f8a3 --- /dev/null +++ b/stella-boleto/src/test/java/br/com/caelum/stella/boleto/bancos/BancoAgiplanTest.java @@ -0,0 +1,66 @@ +package br.com.caelum.stella.boleto.bancos; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Before; +import org.junit.Test; + +import br.com.caelum.stella.boleto.Beneficiario; +import br.com.caelum.stella.boleto.Boleto; +import br.com.caelum.stella.boleto.Datas; +import br.com.caelum.stella.boleto.Pagador; + +public class BancoAgiplanTest { + + private Boleto boleto; + private BancoAgiplan banco = new BancoAgiplan(); + private Beneficiario beneficiario; + private Datas datas; + private Pagador pagador; + + @Before + public void setUp() { + this.datas = Datas.novasDatas().comDocumento(20, 03, 2014) + .comProcessamento(20, 03, 2014).comVencimento(10, 04, 2014); + + this.beneficiario = Beneficiario.novoBeneficiario().comNomeBeneficiario("BANCO DO TESTE.") + .comAgencia("1").comCarteira("11").comCodigoBeneficiario("1") + .comNossoNumero("0000097019").comDigitoNossoNumero("6") + .comDocumento("10004513000000").comNumeroConvenio("1"); + + this.pagador = Pagador.novoPagador().comNome("HOMEM DO TESTE") + .comDocumento("01891300000"); + + this.boleto = Boleto.novoBoleto().comDatas(datas).comBeneficiario(beneficiario) + .comBanco(banco).comPagador(pagador).comValorBoleto(5472.9400) + .comNumeroDoDocumento("1102497019").comEspecieDocumento("DS") + .comAceite(false).comCodigoEspecieMoeda(9) + .comInstrucoes("TESTE"); + this.boleto = this.boleto.comBanco(this.banco); + } + + + @Test + public void testLinhaDigitavelDoBancoAgiplanBoletoRegistrado() { + GeradorDeLinhaDigitavel gerador = new GeradorDeLinhaDigitavel(); + String codigoDeBarras = boleto.getBanco().geraCodigoDeBarrasPara(this.boleto); + String linha = "12190.00005 00000.010009 00970.191144 7 60290000547294"; + assertEquals(linha, gerador.geraLinhaDigitavelPara(codigoDeBarras,this.banco)); + } + + @Test + public void testLinhaDigitavelDoBancoAgiplanBoletoNaoRegistrado() { + this.boleto.comRegistrado(false); + GeradorDeLinhaDigitavel gerador = new GeradorDeLinhaDigitavel(); + String codigoDeBarras = boleto.getBanco().geraCodigoDeBarrasPara(this.boleto); + String linha = "12190.00005 00000.010009 00970.191144 5 00000000000000"; + assertEquals(linha, gerador.geraLinhaDigitavelPara(codigoDeBarras,this.banco)); + } + + + @Test + public void testGetImage() { + assertNotNull(this.banco.getImage()); + } +}