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

Problema ao gerar boleto banco do brasil. #288

Open GabrielDevLoper opened 1 year ago

GabrielDevLoper commented 1 year ago

está apresentando o seguinte erro ao gerar boleto.

br.com.caelum.stella.boleto.exception.GeracaoBoletoException: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean: linhaDigitavel.

SERVICE:

public Boleto imprimirBoleto(Long id){
        try {
            Datas datas = Datas.novasDatas()
                    .comVencimento(2, 5, 2006);

            Endereco enderecoBeneficiario = Endereco.novoEndereco()
                    .comLogradouro("Av das Empresas, 123")
                    .comBairro("Bairro Grande")
                    .comCep("01234-555")
                    .comCidade("São Paulo")
                    .comUf("SP");

            //Quem emite o boleto
            Beneficiario beneficiario = Beneficiario.novoBeneficiario()
                    .comNomeBeneficiario("Fulano de Tal")
                    .comAgencia("1824").comDigitoAgencia("4")
                    .comCodigoBeneficiario("76000")
                    .comDigitoCodigoBeneficiario("5")
                    .comNumeroConvenio("1207113")
                    .comCarteira("18")
                    .comEndereco(enderecoBeneficiario)
                    .comNossoNumero("005000")
                    .comDigitoNossoNumero("347-1");

            Endereco enderecoPagador = Endereco.novoEndereco()
                    .comLogradouro("Av dos testes, 111 apto 333")
                    .comBairro("Bairro Teste")
                    .comCep("01234-111")
                    .comCidade("São Paulo")
                    .comUf("SP");

            Pagador pagador = Pagador.novoPagador()
                    .comNome("Fulano da Silva")
                    .comDocumento("277.654.118-02")
                    .comEndereco(enderecoPagador);

            Banco banco = new BancoDoBrasil();

            Boleto boleto = Boleto.novoBoleto()
                    .comBanco(banco)
                    .comDatas(datas)
                    .comBeneficiario(beneficiario)
                    .comPagador(pagador)
                    .comValorBoleto("200.00")
                    .comNumeroDoDocumento("5900010")
                    .comInstrucoes("instrução 1", "instrução 2", "instrução 3", "instrução 4", "instrução 5")
                    .comLocaisDePagamento("local 1", "local 2");

            return boleto;
        }catch (GeracaoBoletoException exception){
            throw new GeracaoBoletoException(exception);
        }
    }

CONTROLLER:

@GetMapping("/boleto/{id}")
    public ResponseEntity<byte[]> downloadBoleto(@PathVariable Long id) {
        Boleto boleto = guiaService.imprimirBoleto(id);

        GeradorDeBoleto gerador = new GeradorDeBoleto(boleto);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        gerador.geraPDF(baos);

        byte[] contents = baos.toByteArray();

        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=boleto.pdf");

        return ResponseEntity
                .ok()
                .headers(headers)
                .body(contents);
    }
gilbertoca commented 10 months ago

@GabrielDevLoper Já estou a um bom tempo sem manter código que usa essa biblioteca, mas entendo que cada banco monta sua linha digitável a partir do método Banco.geraCodigoDeBarrasPara(), nisso creio que não pode faltar nenhum argumento e o Nosso Número precisar ter exatamente o tamanho optado pelo beneficiário:

        //Quem emite o boleto
        Beneficiario beneficiario = Beneficiario.novoBeneficiario()
                .comNomeBeneficiario(titular.getNome())
                .comAgencia(conta.getAgencia().toString()).comDigitoAgencia(conta.getAgenciaDigito())
                //CNPJ 00000000000000
                .comDocumento(titular.getCnpj())
                .comCodigoBeneficiario(conta.getConta().toString())
                .comDigitoCodigoBeneficiario(conta.getContaDigito())
                .comNumeroConvenio(conta.getNumeroConvenio())
                .comCarteira(conta.getNumeroCarteira())
                .comEndereco(enderecoBeneficiario)
                //.comModalidade('C') padrão
                //Nosso Número de 17 posições
                .comNossoNumero(nossoNumero);
joaovagmacker commented 7 months ago

Estou com o mesmo problema. Alguém encontrou a solução ?