BoletoNet / boletonet

Boleto.Net is a library developed for use in Brazil, given it has been programmed with Brazilian retail legislation and business rules for bank registered billing integration.
Apache License 2.0
482 stars 383 forks source link

Erro ao gerar remessa Banco do Brasil #489

Open Ilair opened 7 years ago

Ilair commented 7 years ago

Olá!

Estou tendo problema ao tentar gerar a remessa do Banco do Brasil, carteira 18, ocorre o seguinte erro ao tentar gerar: Erro durante a geração do DETALHE arquivo de REMESSA e numa segunda mensagem isso: Erro ao gerar DETALHE do arquivo CNAB400. Estou aprendendo a utilizar a biblioteca ainda, por esse motivo creio que esteja deixando alguma informação faltando, gostaria de saber se existe algum exemplo dessa implementação para que eu possa dar uma olhada, e quais as informações que são obrigatórias para gerar a remessa. Grato pela Atenção!

hericss commented 7 years ago

Ilair,

estou trabalhando na carteira 17-019 e também tive que fazer ajustes, o ideal é você apontar o projeto no Visual Studio e depurar, pois assim saberás que informação está faltando no momento da execução.

Ilair commented 7 years ago

Obrigado pelo retorno, vou ver isso aqui.

Ilair commented 7 years ago

Olá Hericss! Fiz conforme me sugeriste e ocorreu o seguinte erro ao tentar gerar a remessa: Conversão especificada não é válida. Ele ocorre em uma linha que faz a formatação da data, por acaso você passou por algo parecido? Grato pela Atenção!

hericss commented 7 years ago

Ilair,

segue abaixo o código alterado do método, informo que ainda não consegui clonar o código então preciso da avaliação a colaboração dos mais experientes

para avaliar e implementar na dll. ` public string GerarDetalheRemessaCNAB400(Boleto boleto, int numeroRegistro, TipoArquivo tipoArquivo) { try { base.GerarDetalheRemessa(boleto, numeroRegistro, tipoArquivo); // TRegistroEDI reg = new TRegistroEDI(); reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0001, 001, 0, "7", '0')); //001-001

region Regra Tipo de Inscrição Cedente

            string vCpfCnpjEmi = "00";
            if (boleto.Cedente.CPFCNPJ.Length.Equals(11)) vCpfCnpjEmi = "01"; //Cpf é sempre 11;
            else if (boleto.Cedente.CPFCNPJ.Length.Equals(14)) vCpfCnpjEmi = "02"; //Cnpj é sempre 14;
            #endregion
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0002, 002, 0, vCpfCnpjEmi, '0'));                               //002-003
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0004, 014, 0, boleto.Cedente.CPFCNPJ, '0'));                    //004-017
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0018, 004, 0, boleto.Cedente.ContaBancaria.Agencia, '0'));      //018-021
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0022, 001, 0, boleto.Cedente.ContaBancaria.DigitoAgencia, ' '));//022-022
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0023, 008, 0, boleto.Cedente.ContaBancaria.Conta, '0'));        //023-030
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0031, 001, 0, boleto.Cedente.ContaBancaria.DigitoConta, ' '));  //031-031
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0032, 007, 0, boleto.Cedente.Convenio, ' '));                   //032-038
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0039, 025, 0, boleto.NumeroDocumento, ' '));                    //039-063
            #region Regra carteira 17-019                
            // hericss-001
            //reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0064, 017, 0, boleto.NossoNumero, '0'));                        //064-080
            string vNossoNumero = boleto.NossoNumero;
            string vCarteira = boleto.Cedente.Carteira;
            if (boleto.Carteira.Equals("17-019"))
            {
                vNossoNumero = vNossoNumero.Substring(3);
                vCarteira = vCarteira.Substring(0, 2);
            }
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0064, 017, 0, vNossoNumero, '0'));                              //064-080
            #endregion
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0081, 002, 0, "00", '0'));                                      //081-082
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0083, 002, 0, "00", '0'));                                      //083-084
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0085, 003, 0, string.Empty, ' '));                              //085-087
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0088, 001, 0, string.Empty, ' '));                              //088-088
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0089, 003, 0, string.Empty, ' '));                              //089-091
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0092, 003, 0, boleto.VariacaoCarteira, '0'));                   //092-094
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0095, 001, 0, "0", '0'));                                       //095-095
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0096, 006, 0, "0", '0'));                                       //096-101
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0102, 005, 0, string.Empty, ' '));                              //102-106
            // hericss-001
            //reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0107, 002, 0, boleto.Cedente.Carteira, '0'));                   //107-108
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0107, 002, 0, vCarteira, '0'));                                 //107-108
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0109, 002, 0, ObterCodigoDaOcorrencia(boleto), ' '));           //109-110
            // hericss-001
            //reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0111, 010, 0, boleto.NumeroDocumento, '0'));                    //111-120
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliDireita______, 0111, 010, 0, boleto.NumeroDocumento, '0'));                    //111-120
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediDataDDMMAA___________, 0121, 006, 0, boleto.DataVencimento, ' '));                     //121-126
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0127, 013, 2, boleto.ValorBoleto, '0'));                        //127-139
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0140, 003, 0, "001", '0'));                                     //140-142   
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0143, 004, 0, "0000", '0'));                                    //143-146
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0147, 001, 0, string.Empty, ' '));                              //147-147 
            string especie = boleto.Especie;
            if (boleto.EspecieDocumento.Sigla == "DM") // Conforme nota 7 explicativa do banco
                especie = "01";

            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0148, 002, 0, especie, '0'));                                   //148-149

            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0150, 001, 0, boleto.Aceite, ' '));                             //150-150
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediDataDDMMAA___________, 0151, 006, 0, boleto.DataProcessamento, ' '));                  //151-156
            //
            #region Instruções
            string vInstrucao1 = "0";
            string vInstrucao2 = "0";
            //string vInstrucao3 = "0";
            switch (boleto.Instrucoes.Count)
            {
                case 1:
                    vInstrucao1 = boleto.Instrucoes[0].Codigo.ToString();
                    vInstrucao2 = "0";
                    //vInstrucao3 = "0";
                    break;
                case 2:
                    vInstrucao1 = boleto.Instrucoes[0].Codigo.ToString();
                    vInstrucao2 = boleto.Instrucoes[1].Codigo.ToString();
                    //vInstrucao3 = "0";
                    break;
                case 3:
                    vInstrucao1 = boleto.Instrucoes[0].Codigo.ToString();
                    vInstrucao2 = boleto.Instrucoes[1].Codigo.ToString();
                    //vInstrucao3 = boleto.Instrucoes[2].Codigo.ToString();
                    break;
            }
            #endregion
            //
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0157, 002, 0, vInstrucao1, '0'));                               //157-158
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0159, 002, 0, vInstrucao2, '0'));                               //159-160
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0161, 013, 2, boleto.JurosMora, '0'));                          //161-173

            #region Instruções Conforme Código de Ocorrência...
            if (boleto.Remessa.CodigoOcorrencia.Equals("35") || boleto.Remessa.CodigoOcorrencia.Equals("36"))   //“35” – Cobrar Multa – ou “36” - Dispensar Multa 
            {
                #region Código de Multa e Valor/Percentual Multa
                string vCodigoMulta = "9"; //“9” = Dispensar Multa
                Decimal vMulta = 0;

                if (boleto.ValorMulta > 0)
                {
                    vCodigoMulta = "1";    //“1” = Valor
                    vMulta = boleto.ValorMulta;
                }
                else if (boleto.PercMulta > 0)
                {
                    vCodigoMulta = "2";   //“2” = Percentual
                    vMulta = boleto.PercMulta;
                }
                #endregion

                #region DataVencimento
                string vDataVencimento = "000000";
                if (!boleto.DataVencimento.Equals(DateTime.MinValue))
                    vDataVencimento = boleto.DataVencimento.ToString("ddMMyy");
                #endregion

                reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0174, 001, 0, vCodigoMulta, '0'));                          //174 a 174      Código da Multa 1=Valor 
                //hericss-001                    
                // aqui está passando a data como string, conforme acima, vou trocar para data de vencimento que funcionou mais acima
                //reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediDataDDMMAA___________, 0175, 006, 0, vDataVencimento, ' '));                       //175 a 180      Data de inicio para Cobrança da Multa 
                reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediDataDDMMAA___________, 0175, 006, 0, boleto.DataVencimento, ' '));                       //175 a 180      Data de inicio para Cobrança da Multa 
                reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0180, 013, 2, vMulta, '0'));                                //181 a 192      Valor de Multa 
            }
            else
            {
                #region DataDesconto
                string vDataDesconto = "000000";
                if (!boleto.DataDesconto.Equals(DateTime.MinValue))
                    vDataDesconto = boleto.DataDesconto.ToString("ddMMyy");
                #endregion
                reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0174, 006, 0, vDataDesconto, '0'));                             //174-179                
                reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0180, 013, 2, boleto.ValorDesconto, '0'));                      //180-192                
                reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0193, 013, 2, boleto.IOF, '0'));                                //193-205
            }
            #endregion
            //

            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0206, 013, 2, boleto.Abatimento, '0'));                         //206-218
            #region Regra Tipo de Inscrição Sacado
            string vCpfCnpjSac = "00";
            if (boleto.Sacado.CPFCNPJ.Length.Equals(11)) vCpfCnpjSac = "01"; //Cpf é sempre 11;
            else if (boleto.Sacado.CPFCNPJ.Length.Equals(14)) vCpfCnpjSac = "02"; //Cnpj é sempre 14;
            #endregion
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0219, 002, 0, vCpfCnpjSac, '0'));                               //219-220
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0221, 014, 0, boleto.Sacado.CPFCNPJ, '0'));                     //221-234
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0235, 037, 0, boleto.Sacado.Nome.ToUpper(), ' '));              //235-271
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0272, 003, 0, string.Empty, ' '));                              //272-274

            var enderecoSacadoComNumero = boleto.Sacado.Endereco.End;
            if (!string.IsNullOrEmpty(boleto.Sacado.Endereco.Numero))
            {
                enderecoSacadoComNumero += " " + boleto.Sacado.Endereco.Numero;
            }
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0275, 040, 0, enderecoSacadoComNumero.ToUpper(), ' '));         //275-314
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0315, 012, 0, boleto.Sacado.Endereco.Bairro.ToUpper(), ' '));   //315-326
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0327, 008, 0, boleto.Sacado.Endereco.CEP, '0'));                //327-334
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0335, 015, 0, boleto.Sacado.Endereco.Cidade.ToUpper(), ' '));   //335-349
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0350, 002, 0, boleto.Sacado.Endereco.UF.ToUpper(), ' '));       //350-351
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0352, 040, 0, string.Empty, ' '));                              //352-391
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0392, 002, 0, string.Empty, ' '));                              //392-393
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediAlphaAliEsquerda_____, 0394, 001, 0, string.Empty, ' '));                              //394-394                
            reg.CamposEDI.Add(new TCampoRegistroEDI(TTiposDadoEDI.ediNumericoSemSeparador_, 0395, 006, 0, numeroRegistro, '0'));                            //395-400
            //
            reg.CodificarLinha();
            //
            string _detalhe = Utils.SubstituiCaracteresEspeciais(reg.LinhaRegistro);
            //
            return _detalhe;
        }
        catch (Exception ex)
        {
            throw new Exception("Erro ao gerar DETALHE do arquivo CNAB400.", ex);
        }
    }`
hericss commented 7 years ago

segue arquivo, retire o '.txt' do final.

Banco_Brasil.cs.txt

Ilair commented 7 years ago

Muito Obrigado Heric!

Coloquei o código que você alterou e funcionou perfeitamente pra mim agora.

hericss commented 7 years ago

Oba, feliz por ter ajudado!

Seria interessante agora, analisarem para implementar na dll, pois ainda não consegui clonar o projeto para contribuir.

Ilair commented 7 years ago

Olá Heric! Alguma vez aconteceu isso pra você ao gerar a remessa de algum banco? Pelo que vi a biblioteca está retornando uma linha a mais ao gerar a remessa. remessaSicredi.txt

Grato pela Atenção!

hericss commented 7 years ago

Ilair,

gerei para os bancos Itaú e Brasil sem este erro, mas verifique a atualização recente que foi justamente para o Sicredi.

Ilair commented 7 years ago

Ok Vou verificar. Obrigado pelo retorno!

2017-05-30 15:38 GMT-03:00 Heric Souza notifications@github.com:

Ilair,

gerei para os bancos Itaú e Brasil sem este erro, mas verifique a atualização recente que foi justamente para o Sicredi.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/BoletoNet/boletonet/issues/489#issuecomment-304969534, or mute the thread https://github.com/notifications/unsubscribe-auth/AMhwGaePqNrLzByOHewtfjddVdxyMOCpks5r_GI2gaJpZM4NX_xz .

-- ATT

Ilair dos Santos Auxiliar Técnico em Construção Civil(Desenhista) Técnico em Contabilidade Técnico em Informática Bacharel em Sistemas de Informação Cel: (55) 9 9973 - 2948 msn: ilairsantos@hotmail.com Skype: ilair.santos Twitter: @ilairsantos

dyegonog commented 6 years ago

Uma dúvida: o codigo no repositório coincide com a dll baixada pelo nuget ? porque eu também estava com um erro ao gerar a remessa, no segmento P. Clonei o projeto, fiz referencia a ele o erro não ocorreu. gerou a remessa certinho. Porém não quero deixar o projeto todo do boletonet junto ao meu. Alguém com alguma situação parecida ? Caso alguma correção foi feita, pf atualizar a dll