BoletoNet / BoletoNetCore

Versão do BoletoNet para .NET Core
MIT License
186 stars 118 forks source link

NotImplementedException ao Tentar gerar Html do Boleto #55

Closed julioverissimo88 closed 4 years ago

julioverissimo88 commented 4 years ago

Estou recebendo uma exception de não implementado quando tento usar o método de gerar o HTML

byte[] result = boleto.ImprimirHtml();

Alguem tem algum exemplo válido para geração do PDF ou do HTML?

carloscds commented 4 years ago

@julioverissimo88 Nesta versao do BoletoNet a impressao ficou externa ao componente, então vc precisa pegar o HTML e usar outro componente, por exemplo: https://www.nuget.org/packages/HtmlToPDFCore/

julioverissimo88 commented 4 years ago

@carloscds A respeito da geração ser interna OK. Porem ao usar a função de geração do HTML não deveria ter recebido os bytes do HTML?

carloscds commented 4 years ago

@julioverissimo88 A funcao recebe o texto do HTML.

julioverissimo88 commented 4 years ago

@carloscds acho que me expressei de forma incorreta. Baseado nas Classes de teste (https://github.com/BoletoNet/BoletoNetCore/blob/master/BoletoNetCore.Testes/BancoSicoobCarteira1_01Tests.cs ) estou tentando gerar um boleto. E não consegui até o momento. Preenchendo todos os campos conforme o exemplo das classes de teste e usando a função

byte[] result = boleto.ImprimirHtml();

recebo uma exception de NotImplementedException

Estou usando a lib BoletoNetCore v3.0.1.39 baixada via NUGET

tentei também usar a função de gerar remessa (Essa não gerou erro porem também não vi o arquivo de remessa ser gerado)

julioverissimo88 commented 4 years ago

Minha api é .net core 3.1

carloscds commented 4 years ago

@julioverissimo88 Sugiro vc baixar o codigo daqui inicialmente e fazer o teste. Acredito que o nuget nao esta atualizado.

julioverissimo88 commented 4 years ago

@carloscds baixei o repositório https://github.com/BoletoNet/BoletoNetCore/tree/master

Vinculei o Projeto na minha solução e usei a partir do código e ocorre o mesmo caso de erro.

percebi só agora pelo projeto que de fato em BoletoHelper a função ImprimirHtml que é um método de extensão do tipo Boleto realmente não está implementada.

public static byte[] ImprimirHtml(this Boleto boleto)
{
         throw new NotImplementedException();
 }

O projeto não possui a geração do HTML ou PDF implementada? Se não é possível obter nenhum dos dois através desse método a partir de qual método posso conseguir isso?

carloscds commented 4 years ago

@julioverissimo88 Eu realmente nao sei cmo ficou a implementacao nesta versao do projeto. Precisa pegar o codigo que esta no boletonet e modificar para o Core.

olavorn commented 4 years ago

@julioverissimo88 vou verificar aqui, daqui a pouco te mando um feedback.

olavorn commented 4 years ago

@julioverissimo88 vou postar um exemplo aqui de como devolver um boleto a partir de um ID interno hipotético.

        public IActionResult BoletoById(long id)
        {
            var doc = context.Documento.Include(q => q.IdBoletoAtualNavigation)
                .Include(q=>q.IdClienteFornecedorNavigation).Include(q => q.IdPoliticaCobrancaNavigation)
                .Include(qd => qd.IdMeioPagamentoNavigation)
                .Include(q => q.IdContratoNavigation)
                .Include(q => q.Boleto)
                .FirstOrDefault(q => q.Id == id );
            BoletoNetCore.Boleto boleto = null;
            string errorMsg = "";
            var bmContext = new BoletoManager(membership, context);

            var boletos = doc.Boleto.Where(q => !q.IsDeleted && !string.IsNullOrEmpty(q.NossoNumero) && !q.IsBaixado.GetValueOrDefault());
            var docCount = boletos.Count();

            if (docCount == 0)
            {
                return Ok("<h1>Boleto não Encontrado. Caso seja um boleto registrado, verifique se a remessa foi registrada e sensibilizada.</h1>");
            }

            if (doc.IdBoletoAtualNavigation == null)
            {
                //modelo de transição: Boletos não registrados que não usam IdBoletoAtual - Excluir no futuro
                if (docCount == 1)
                {
                    //apenas um boleto. Perfeito! Atualiza e finaliza
                    doc.IdBoletoAtualNavigation = doc.Boleto.Where(q => !q.IsDeleted).FirstOrDefault();
                }
                if (docCount > 1)
                {
                    //regra de transição,
                    doc.IdBoletoAtualNavigation = boletos.OrderByDescending(q => q.DatRegistro).ThenByDescending(q => q.NumRemessa).FirstOrDefault();
                }
            }
            var bb = doc.IdBoletoAtualNavigation;

            if (bb.IsDeleted)
                return Content("<h1>O Boleto foi excluído</h1>", new MediaTypeHeaderValue("text/html"));

            if (bb.IsRegistrado == false && string.IsNullOrWhiteSpace(bb.NumRegistro))
                return Content("<h1>O Boleto é de carteira registrada e ainda não foi processado; Favor aguardar o registro para possibilitar a sua emissão</h1>", new MediaTypeHeaderValue("text/html"));

            doc.IdBoletoAtual = doc.IdBoletoAtualNavigation.Id;
            context.SaveChanges();
            boleto = bmContext.BuildBoletoBancario(doc, bb, ref errorMsg, doc.IdContratoNavigation, doc.IdMeioPagamentoNavigation);

            return Content(new BoletoBancario()
            {
                Boleto = boleto,
                Banco = boleto.Banco,
            }.MontaHtmlEmbedded(false), new MediaTypeHeaderValue("text/html"));
        }

No caso, o método pra montar o boleto é o MontaHtmlEmbedded

julioverissimo88 commented 4 years ago

@olavorn Muito Obrigado você me deu a direção correta com esse método consigo gerar o HTML do boleto O Código de barras ficou pequeno e mal posicionado porem o boleto foi gerado.

Outra dúvida é qual a função válida para gerar o arquivo de remessas? E assim de memória sabe como resolver o problema da formatação do HTML do boleto?

olavorn commented 4 years ago

Na pasta BoletoNetCore/BoletoImpressao/Parts tem as partes HTML do boleto. Fique a vontade para formatar o HTML da forma como vc achar melhor. Contudo, nesse caso, você terá que buildar uma versão customizada da versão padrão da biblioteca.

olavorn commented 4 years ago

Também verifique se o CSS está sendo carregado com a resposta: https://github.com/BoletoNet/BoletoNetCore/blob/master/BoletoNetCore/BoletoImpressao/BoletoNetPDF.css

julioverissimo88 commented 4 years ago

@olavorn Muito Obrigado pelo seu suporte você foi certeiro em todas as suas observações como ultimo ponto. Percebi agora que o motivo pelo qual meu boleto deve estar errado deve ser por falta de preenchimento de alguma informação . Notei que minha linha digitável do boleto está vazia tem um exemplo de preenchimento do Objeto da Classe Boleto para um boleto completo? só para critério de comparação?

olavorn commented 4 years ago

Acho que isso é +/- o que é necessário pra criar um Boleto usando a classe BoletoProxy

            BoletoNetCoreProxy proxy = new BoletoNetCoreProxy();
            mensagemErro = mensagemErro ?? "";

            ClienteFornecedor cf = item.IdClienteFornecedorNavigation;

            var tipoCarteira = (int)TipoCarteira.CarteiraCobrancaSimples;
            var tipoFormaCadastramento = (int) (boleto.IsRegistrado ? TipoFormaCadastramento.ComRegistro : TipoFormaCadastramento.SemRegistro);

            proxy.SetupCobranca(cpfCnpj, meioPagto.Nome, meioPagto.Endereco, meioPagto.NumeroEndereco, "", contrato.Bairro, contrato.Municipio, contrato.Uf, contrato.Cep, "", meioPagto.CodBanco.Value, meioPagto.Agencia, meioPagto.DigitoAgencia, null,
                                    meioPagto.Conta, meioPagto.DigitoConta, meioPagto.CodCedente.Split("-")[0], (meioPagto.CodCedente.Split("-").Count() > 1 ? meioPagto.CodCedente.Split("-")[1] : ""), null,
                                    meioPagto.Carteira.Split("-")[0], (meioPagto.Carteira.Split("-").Count() > 1 ? meioPagto.Carteira.Split("-")[1] : null),
                                    tipoCarteira, tipoFormaCadastramento, (int)TipoImpressaoBoleto.Empresa, (int)TipoDocumento.Tradicional, ref mensagemErro);

            proxy.NovoBoleto(ref mensagemErro);
            proxy.DefinirPagador((cf.NumDocumento).GetNumbers().FormatCpfOrCnpj(), cf.Nome, cf.Endereco ?? "", cf.NumeroEndereco, cf.Complemento, cf.Bairro ?? "", cf.Cidade ?? "", cf.Estado , cf.Cep ?? "00000-000", "", ref mensagemErro);
            var politica = item.IdPoliticaCobrancaNavigation;
            proxy.DefinirBoleto(meioPagto.EspecieDocumento, boleto.NumDocumento.ToString(), boleto.NossoNumero, boleto.DatCriacao.Value, boleto.DatCriacao.Value, boleto.DatVencimento, boleto.Valor, boleto.NumRegistro, politica.Aceite, ref mensagemErro);

            if (politica.ValorMulta > 0 || politica.PercMulta > 0)
            {
                proxy.DefinirMulta(boleto.DatVencimento, politica.ValorMulta ?? 0m, politica.PercMulta ?? 0m / 100m, ref mensagemErro);
                //instrucaoMulta = item.IdPoliticaCobrancaNavigation.ValorMulta != null ? string.Format("Multa de R$ {0}", item.IdPoliticaCobrancaNavigation.ValorMulta) : string.Format("Multa de {0}%", item.IdPoliticaCobrancaNavigation.PercMulta);
            }

            if (politica.PercJurosMes > 0)
            {
                proxy.DefinirJuros(boleto.DatVencimento, 0, meioPagto.PercJurosMes ?? 0m / 100m, ref mensagemErro);
                //instrucaoJuros = string.Format("Juros de {0}% a.m.", item.IdPoliticaCobrancaNavigation.PercJurosMes);
            }

            if (politica.DiasDesconto > 0)
            {
                proxy.DefinirDesconto(boleto.DatVencimento.AddDays(-politica.DiasDesconto.Value), politica.ValorDesconto ?? 0m + (politica.PercDesconto ?? 0m * boleto.Valor / 100m), ref mensagemErro);
                //instrucaoJuros = string.Format("Juros de {0}% a.m.", item.IdPoliticaCobrancaNavigation.PercJurosMes);
            }

            proxy.FecharBoleto(ref mensagemErro);
            //controle de boletobancario (viewModel
            //Boleto2Net.BoletoBancario boletoBancario = new Boleto2Net.BoletoBancario();
            //boletoBancario.Banco = Boleto2Net.Banco.Instancia( Convert.ToInt16(meioPagto.CodBanco) );
            //boletoBancario.Boleto = b;
            return proxy.boleto;