caelum / caelum-stella

O Caelum Stella visa suprir as necessidades do dia a dia do desenvolvedor brasileiro
http://stella.caelum.com.br
663 stars 340 forks source link

Boleto Caixa - Geração para carteira 1 parece estar incompleta #195

Open gabrielhof opened 8 years ago

gabrielhof commented 8 years ago

Estou tentando gerar um boleto da caixa com a carteira 1, mas está resultando no seguinte erro:

br.com.caelum.stella.boleto.exception.CriacaoBoletoException: Erro na geração do código de barras. Número de digitos diferente de 44. Verifique se todos os dados foram preenchidos corretamente.
        at br.com.caelum.stella.boleto.bancos.CodigoDeBarrasBuilder.validaTamahoDoCodigoDeBarrasCompletoGerado(CodigoDeBarrasBuilder.java:54)
        at br.com.caelum.stella.boleto.bancos.CodigoDeBarrasBuilder.comCampoLivre(CodigoDeBarrasBuilder.java:45)
        at br.com.caelum.stella.boleto.bancos.Caixa.geraCodigoDeBarrasPara(Caixa.java:52)
        at br.com.caelum.stella.boleto.Boleto.getCodigoDeBarras(Boleto.java:499)
        at br.com.caelum.stella.boleto.Boleto.getLinhaDigitavel(Boleto.java:507)

Olhando o código, me parece que o suporte à carteira 1 não está completo.

Na verdade, o que parece é que a regra implementada para a carteira 24 vale para todas as carteiras, de acordo com o documento da Caixa.

Alguém mais está tendo esse problema ou pode confirmar isso?

kevinnascimento commented 8 years ago

Estou tento o mesmo problema. Você conseguiu resolver @gabrielhof ?

gabrielhof commented 8 years ago

Eu implementei uma solução @kevinnascimento, mas ainda não tive retorno da homologação do banco.

Basicamente, o que eu fiz foi estender a classe Caixa e sobrescrever o método geraCodigoDeBarrasPara(Boleto boleto), implementando a regra que acredito ser a correta:

package br.com.caelum.stella.boleto.bancos;

import static br.com.caelum.stella.boleto.utils.StellaStringUtils.leftPadWithZeros;

import br.com.caelum.stella.boleto.Beneficiario;
import br.com.caelum.stella.boleto.Boleto;

public class CaixaCarteira1E2Impl extends br.com.caelum.stella.boleto.bancos.Caixa {

    private static final long serialVersionUID = 3148542686671820352L;

    @Override
    public String geraCodigoDeBarrasPara(Boleto boleto) {
        Beneficiario beneficiario = boleto.getBeneficiario();
        String carteira = beneficiario.getCarteira();

        if (!carteira.matches("^[1,2].{0,1}")) {
            throw new IllegalArgumentException("A carteira digitada não é suportada: " + carteira);
        }

        StringBuilder campoLivre = new StringBuilder();

        String nossoNumeroCompleto = getNossoNumeroFormatado(beneficiario);
        campoLivre.append(leftPadWithZeros(beneficiario.getCodigoBeneficiario(), 6));
        campoLivre.append(beneficiario.getDigitoCodigoBeneficiario());
        campoLivre.append(nossoNumeroCompleto.substring(2, 5));
        campoLivre.append(nossoNumeroCompleto.substring(0, 1));
        campoLivre.append(nossoNumeroCompleto.substring(5, 8));
        campoLivre.append(nossoNumeroCompleto.substring(1, 2));
        campoLivre.append(nossoNumeroCompleto.substring(8));
        campoLivre.append(geradorDeDigito.geraDigitoMod11AceitandoRestoZero(campoLivre.toString()));

        return new CodigoDeBarrasBuilder(boleto).comCampoLivre(campoLivre);
    }

}

É importante notar que eu criei o package br.com.caelum.stella.boleto.bancos dentro do meu projeto para criar essa nova classe. Fiz isso porque precisava utilizar a classe CodigoDeBarrasBuilder e, por algum motivo que desconheço, essa classe é package protected.

Sim, a solução não é nada bonita, é só como um quebra-galho. Assim que tiver resposta da homologação do banco, vou implementar uma solução mais elegante e subir um Pull Request.

kevinnascimento commented 8 years ago

Obrigado @gabrielhof. Vou fazer o mesmo.

Caso tenha resposta da caixa, por favor, me avise?

Dede já agradeço.

raphaelLacerda commented 7 years ago

@gabrielhof obteve resposta da Caixa se o código acima funciona?

gabrielhof commented 7 years ago

Sim, obtive resposta da Caixa. O boleto não foi homologado, mas não tive acesso ao resultado da homologação para saber qual o problema :(

edenir-anschau commented 7 years ago

Olá @kevinnascimento, @gabrielhof @raphaelLacerda, vcs tem alguma novidade sobre o cenário acima? Consegui uma pré-homologação utilizando a regra da carteira 2 para gerar o boleto com a carteira 1. Pelo o que eu vi, não muda nada se for um ou 2 na regra de geração do código de barras, ambos são para o nosso número com 17 posições.

A implementação atual para carteira 1 é para nosso número com 18 posições que são "válidos" para códigos de convênio entre 000001 e 060000, e que precisam registrar títulos com nosso número de 18 posições iniciados em ‘9’.