BoletoNet / boleto2net

Nova versão do Boleto.Net
Apache License 2.0
162 stars 139 forks source link

Erro 8 (Nosso Número Inválido) na remessa do Sicoob gerada no Boleto2Net #229

Closed lfmartinelli closed 4 years ago

lfmartinelli commented 4 years ago

Não sei o que está errado. O boleto é gerado normalmente, o arquivo remessa também, a remessa passa sem erros na verificação de layout do site verificador do Sicoob. Mas no sistema de cobrança, volta com erro de inconsistência numero 8(Nosso número inválido). Enviei para o suporte do Sicoob e eles disseram que DV do Nosso Número estava como 7 e deveria ser 1. Passei a informar os DVs da agência e código do cedente e o DV do Nosso Número 103 passou a ser 1, mas o sistema do Sicoob continua a dar erro 8. Não sei s é erro na informação de DVs ou dados do cliente. Não sei mais o que fazer!

`#region Sicoob

        Boletos boletos = null;

        boletos = new Boletos();

        #region Cabeçalho

        boletos.Banco = Banco.Instancia(756);
        string digito_cedente = "1";
        codigo_cedente = "008850"
        if (codigo_cedente.Contains("-"))
        {
            codigo_cedente = cedente.Rows[0]["codigo_cedente"].ToString().Substring(0, cedente.Rows[0]["codigo_cedente"].ToString().IndexOf("-"));
            digito_cedente = cedente.Rows[0]["codigo_cedente"].ToString().Substring(cedente.Rows[0]["codigo_cedente"].ToString().IndexOf("-") + 1);
        }

        boletos.Banco.Cedente = new Cedente
        {
            CPFCNPJ = cnpj,
            Nome = razao_social,
            Observacoes = string.Empty,
            ContaBancaria = new ContaBancaria
            {
                Agencia = "3041",
                DigitoAgencia = '4',
                OperacaoConta = string.Empty,
                Conta = "00016466",
                DigitoConta = "6",
                CarteiraPadrao = 1,
                VariacaoCarteiraPadrao = "01",
                TipoCarteiraPadrao = TipoCarteira.CarteiraCobrancaSimples,
                TipoFormaCadastramento = TipoFormaCadastramento.ComRegistro,
                TipoImpressaoBoleto = TipoImpressaoBoleto.Empresa,
                TipoDocumento = TipoDocumento.Tradicional
            },
            Codigo = codigo_cedente,
            CodigoDV = digito_cedente,
            CodigoTransmissao = string.Empty,
            Endereco = new Boleto2Net.Endereco
            {
                LogradouroEndereco = endereco,
                LogradouroNumero = numero,
                LogradouroComplemento = complemento,
                Bairro = bairro,
                Cidade = cidade,
                UF = uf,
                CEP = cep
            }
        };
        boletos.Banco.FormataCedente();
        #endregion

        #region Títulos
        for (int parcela = 0; parcela < entradas.Rows.Count; ++parcela)
        {
            var boleto = new Boleto(boletos.Banco);
            boleto.Sacado = new Sacado
            {
                CPFCNPJ = venda["cpf_cliente"],
                Nome = venda["nome_cliente"],
                Observacoes = string.Empty,
                Endereco = new Boleto2Net.Endereco
                {
                    LogradouroEndereco = venda["endereco_cliente"],
                    LogradouroNumero = "",
                    LogradouroComplemento = "",
                    Bairro = venda["bairro_cliente"],
                    Cidade = venda["cidade_cliente"],
                    UF = venda["estado"],
                    CEP = venda["cep_cliente"]
                }
            };

            boleto.CodigoOcorrencia = "01"; //Registrar remessa
            boleto.DescricaoOcorrencia = "Remessa Registrar";

            boleto.NumeroDocumento = NumeroDocumento + "_" + (parcela +1).ToString() + "de" + entradas.Rows.Count.ToString();
            boleto.NumeroControleParticipante = codigo_cedente;

            boleto.NossoNumero = ultimo_nosso_numero; //O valor atual é "103"
            ultimo_nosso_numero = ultimo_nosso_numero + 1;

            boleto.DataEmissao = DateTime.Today;
            boleto.DataVencimento = DateTime.Parse(entradas.Rows[0]["data_vencimento"].ToString());
            boleto.ValorTitulo = decimal.Parse(entradas.Rows[0]["valor"].ToString());
            boleto.Aceite = "N";
            boleto.EspecieDocumento = TipoEspecieDocumento.DM;

            //boleto.DataDesconto = DateTime.Today;
            //boleto.ValorDesconto = 0;
            //if (this.Conta.PercentualMulta > 0)
            //{
            boleto.DataMulta = DateTime.Parse(entradas.Rows[0]["data_vencimento"].ToString()).AddDays(1);
            boleto.PercentualMulta = 2;
            boleto.ValorMulta = boleto.ValorTitulo * boleto.PercentualMulta / 100;

            boleto.MensagemInstrucoesCaixa = $"Cobrar Multa de 2% após o vencimento.";
            //}

            //if (this.Conta.PercentualMora > 0)
            //{
            boleto.DataJuros = DateTime.Parse(entradas.Rows[0]["data_vencimento"].ToString()).AddDays(1);
            boleto.PercentualJurosDia = decimal.Parse("0.93");
            boleto.ValorJurosDia = boleto.ValorTitulo * boleto.PercentualJurosDia / 100;

            string mora = $"Cobrar juros de 0.96% por dia de atraso";
            if (string.IsNullOrEmpty(boleto.MensagemInstrucoesCaixa))
                boleto.MensagemInstrucoesCaixa = instrucao;
            else
                boleto.MensagemInstrucoesCaixa += Environment.NewLine + "<br />Ref. " + emp["label_grupo"] + " " + unidade["quadra"] +  ", " + emp["label_unidade"] + " " + unidade["lote"] + ", boleto " + (parcela +1).ToString("D3") + " de " + entradas.Rows.Count.ToString("D3") + Environment.NewLine + "<br />" + instrucao;

            /*
            boleto.CodigoInstrucao1 = string.Empty;
            boleto.ComplementoInstrucao1 = string.Empty;

            boleto.CodigoInstrucao2 = string.Empty;
            boleto.ComplementoInstrucao2 = string.Empty;

            boleto.CodigoInstrucao3 = string.Empty;
            boleto.ComplementoInstrucao3 = string.Empty;                
            */

            boleto.CodigoProtesto = TipoCodigoProtesto.NaoProtestar;
            boleto.DiasProtesto = 0;

            boleto.CodigoBaixaDevolucao = TipoCodigoBaixaDevolucao.NaoBaixarNaoDevolver;
            boleto.DiasBaixaDevolucao = 0;

            boleto.ValidarDados();
            boletos.Add(boleto);
            #endregion

        }

        #region Gerar Remessa
        var stream = new MemoryStream();
        var remessa = new ArquivoRemessa(boletos.Banco, TipoArquivo.CNAB240, 10);
        remessa.GerarArquivoRemessa(boletos, stream);
        string decoded = Encoding.UTF8.GetString(stream.ToArray());

        if(!Directory.Exists(emp["path_arquivo"] + "remessas"))
        {
            Directory.CreateDirectory(emp["path_arquivo"] + "remessas");
        }

        string arquivo_remessa = emp["path_arquivo"] + @"remessas\" + emp["label_grupo"].Substring(0,1) + unidade["quadra"] + "_" + emp["label_unidade"].Substring(0,1) + unidade["lote"] + "_remessa.txt";

        File.WriteAllText(arquivo_remessa, decoded);

        string htmlBoletosGerados = "";

        //Gerar boletos - aqui eu gravo os arquivos um a um porque mando via e-mail.
        foreach (var boleto in boletos)
        {
            var boletoBancario = new BoletoBancario() { Boleto = boleto };
            htmlBoletosGerados = htmlBoletosGerados + "<div style=\"width:21cm; height:29.7cm\">" + boletoBancario.MontaHtmlEmbedded() + "</div>";
            //pnlImpressao.Controls.Add(boletoBancario);
            //     var pdf = boletoBancario.MontaBytesPDF(false);
            //     var pathPDF = GArquivos.CombinarDiretorio(PathRemessa, $"{boleto.NumeroControleParticipante}.pdf");
            //     File.WriteAllBytes(pathPDF, pdf);
        }
        #endregion

        htmlImpressao.Text = htmlBoletosGerados;`
lfmartinelli commented 4 years ago

@lfmartinelli Por que você faz isso: boleto.NossoNumero = "103";?

Na verdade esse valor eu busco no banco de dados. Eu só coloquei aí em hardcode para você poderem ver quais valores estou utilizando. Esse é o valor tirado da variável "ultimo_nosso_numero" no banco de dados.

marcosgerene commented 4 years ago

@lfmartinelli Apaguei o comentário sem querer, vou dar uma olhada no código aqui, eu uso Sicoob em produção já faz um tempo considerável e não tenho problemas

lfmartinelli commented 4 years ago

@lfmartinelli Apaguei o comentário sem querer, vou dar uma olhada no código aqui, eu uso Sicoob em produção já faz um tempo considerável e não tenho problemas

Sem problemas, você verá que várias informações estão diretas, pois troquei a variável pelo dado direto só para ficar mais fácil analisar o que vem do banco.

marcosgerene commented 4 years ago

@lfmartinelli

Na verdade esse valor eu busco no banco de dados. Eu só coloquei aí em hardcode para você poderem ver quais valores estou utilizando. Esse é o valor tirado da variável "ultimo_nosso_numero" no banco de dados. Sem problemas, você verá que várias informações estão diretas, pois troquei a variável pelo dado direto só para ficar mais fácil analisar o que vem do banco.

 Agencia = "3041-4",
DigitoAgencia = digitoAgencia, //string.Empty,
Conta = "00016466-6",
DigitoConta = digito_conta,

A agencia e dígito você colocou aqui de forma incorreta, por favor verifique se foi só nesse mesmo caso que mandou ou se do banco vem assim.

Este é o resultado esperado:

 Agencia = "3041",
DigitoAgencia = "4",
Conta = "16466",
DigitoConta = "6",

Este campo "OperacaoConta" que você preencheu com um espaço, eu preencho em branco para Sicoob, teste com esse ajuste também.

lfmartinelli commented 4 years ago

@lfmartinelli

Na verdade esse valor eu busco no banco de dados. Eu só coloquei aí em hardcode para você poderem ver quais valores estou utilizando. Esse é o valor tirado da variável "ultimo_nosso_numero" no banco de dados. Sem problemas, você verá que várias informações estão diretas, pois troquei a variável pelo dado direto só para ficar mais fácil analisar o que vem do banco.

 Agencia = "3041-4",
DigitoAgencia = digitoAgencia, //string.Empty,
Conta = "00016466-6",
DigitoConta = digito_conta,

A agencia e dígito você colocou aqui de forma incorreta, por favor verifique se foi só nesse mesmo caso que mandou ou se do banco vem assim.

Este é o resultado esperado:

 Agencia = "3041",
DigitoAgencia = "4",
Conta = "16466",
DigitoConta = "6",

Este campo "OperacaoConta" que você preencheu com um espaço, eu preencho em branco para Sicoob, teste com esse ajuste também.

Na verdade, eu separo os dígitos quando configuro as propriedades do boleto.

Já a "OperacaoConta", passei para string.empty, mas o dígito verificador do código de barras do gerado como exemplo pelo Sicoob é 9 e o meu fica 8. Os valores no código de barras está igual e só o DV fica diferente: Gerado pelo Sicoob: http://www.gobyte.com.br/images/Anota%C3%A7%C3%A3o%202019-12-27%20162510.jpg Anotação 2019-12-27 162510

Gerado pelo Boleto2Net: http://www.gobyte.com.br/images/boleto_barra.jpg boleto_barra

marcosgerene commented 4 years ago

@lfmartinelli

Eu uso o boleto2net para Sicoob em produção, fiz um teste aqui com o validador deles e deu certo, acredito que seja alguma informação incorreta sendo passada para seu boleto que está interferindo no DV.

Se quiser, me manda os dados da conta (convenio, titular, etc) que gero uma remessa de testes aqui amanhã cedo e te mando para você comparar.

lfmartinelli commented 4 years ago

Olá Marcos,

Seguem os dados para teste:

Código Cedente: 008850-1 ( esse é o que o manual chama de "Número do Cliente"?) Nosso Número: 103 Carteira: 1 Agencia: 3041-4 Conta: 16466-6 Espécie: 109 Numero convênio: 1

Razão Social: LOTEAMENTO SAO JOSE - CASTILHO SPE LTDA CNPJ: 20.908.163/0001-84

Não sei se o cliente pode ter me dado algum dado errado sem saber.

Muito obrigado pela ajuda!

Fernando

marcosgerene commented 4 years ago

O cadastro:

image

O boleto (pdf):

[20908163000184_103] LOTEAMENTO SAO JOSE - CASTILHO SPE LTDA.pdf

A remessa:

75600000         220908163000184                    0304110000000164666 LOTEAMENTO SAO JOSE - CASTILHOSICOOB                                  12812201910495900000108100000                                                                     
75600011R01  040 2020908163000184                    0304110000000164666 LOTEAMENTO SAO JOSE - CASTILHO                                                                                000000012812201900000000                                 
7560001300001P 010304110000000164666 000000103101014     10 22TESTE          2801202000000000000100000000 02N28122019129012020000000000000003000000000000000000000000000000000000000000000000000000103                      3000   090000000000 
7560001300002Q 012020908163000184LOTEAMENTO SAO JOSE - CASTILHO SPE LTDA AVENIDA MAJOR NOVAES 309 SALA: 04;      CENTRO         14870080JABOTICABAL    SP0000000000000000                                        000                            
7560001300003R 01000000000000000000000000000000000000000000000000129012020000000000000100                                                                                                              0000000000000000 000000000000  0         
75600015         00000500000100000000000001000000000000000000000000000000000000000000000000000000000000000000000000                                                                                                                             
75699999         000001000007000000                                                                                                                                                                                                             
marcosgerene commented 4 years ago

Dados informados para o validador:

image

Validador Sicoob (sucesso):

image

Acredito que tenha alguma informação errada no que você está passando, o boleto2net me parece ok.

Essas duas informações me parecem estranhas:

Espécie: 109 Numero convênio: 1

[]'s

lfmartinelli commented 4 years ago

Dados informados para o validador:

image

Validador Sicoob (sucesso):

image

Acredito que tenha alguma informação errada no que você está passando, o boleto2net me parece ok.

Essas duas informações me parecem estranhas:

Espécie: 109 Numero convênio: 1

[]'s

Pode ser sim. O que você me recomendaria para essas 2 informações?

marcosgerene commented 4 years ago

@lfmartinelli

Da uma olhada no arquivo que te mandei e tenta manter igual, usa o CompareIt para ir comparando

lfmartinelli commented 4 years ago

@lfmartinelli

Da uma olhada no arquivo que te mandei e tenta manter igual, usa o CompareIt para ir comparando

Obrigado Marcos. Fiz o que você falou e o banco retornou dizendo que o verificador está certo. Agora só estou aguardando a empresa pagar o boleto teste para homologação. Valeu mesmo pela força!

lfmartinelli commented 4 years ago

Obrigado para o Marcos e para comunidade pela ajuda e pela ferramenta.