BoletoNet / boleto2net

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

Erro ao gerar Arquivo Remessa na linha remessa.GerarArquivoRemessa(boletos, stream); #315

Open jcmprogramador opened 3 years ago

jcmprogramador commented 3 years ago
           MySqlDataReader QRY;
            // Cria o boleto, e passa os parâmetros usuais
            BoletoBancario boleto;
            Boletos boletos = new Boletos();
            IBanco banco;
            banco = Banco.Instancia((Bancos)beneficiario.Banco);

            banco.Cedente = new Cedente
            {
                Nome = beneficiario.Nome,
                CPFCNPJ = beneficiario.CNPJ,
                Codigo = beneficiario.CodigoBeneficiario.ToString(),
                CodigoTransmissao = string.Empty,
                CodigoDV = string.Empty,
                MostrarCNPJnoBoleto = true,
                ContaBancaria = new ContaBancaria
                {
                    Agencia = beneficiario.Agencia.ToString(),
                    DigitoAgencia = beneficiario.DigitoAgencia.ToString(),
                    CarteiraPadrao = beneficiario.Carteira.ToString().PadLeft(2, '0'),
                    Conta = beneficiario.Conta.ToString(),
                    DigitoConta = beneficiario.DigitoConta.ToString(),
                    TipoCarteiraPadrao = beneficiario.TipoCarteira,
                    TipoDistribuicao = beneficiario.TipoDistribuicao,
                    TipoDocumento = beneficiario.TipoDocumento,
                    TipoFormaCadastramento = beneficiario.TipoFormaCadastramento,
                    TipoImpressaoBoleto = beneficiario.TipoImpressao,
                    LocalPagamento = beneficiario.LocalPagamento,
                    VariacaoCarteiraPadrao = beneficiario.VariacaoCarteira == 0 ? "" : beneficiario.VariacaoCarteira.ToString()
                },
                Endereco = new Endereco
                {
                    LogradouroEndereco = beneficiario.Endereco.Logradouro,
                    LogradouroNumero = beneficiario.Endereco.Numero,
                    Bairro = beneficiario.Endereco.Bairro,
                    CEP = beneficiario.Endereco.CEP.Replace("'-", ""),
                    Cidade = beneficiario.Endereco.Cidade,
                    UF = beneficiario.Endereco.UF,
                    LogradouroComplemento = beneficiario.Endereco.Complemento
                },
            };
            banco.FormataCedente();

                while (QRY.Read())
                {
                    boleto = new BoletoBancario();
                    Boleto b = new Boleto(banco);
                    b.Sacado = new Sacado()
                    {
                        Nome = clsfuncoes.CheckDBNull<string>(QRY["titular"]),
                        CPFCNPJ = clsfuncoes.CheckDBNull<string>(QRY["cpf"]),
                        Endereco = new Endereco()
                        {
                            LogradouroEndereco = clsfuncoes.CheckDBNull<string>(QRY["endereco"]),
                            LogradouroNumero = clsfuncoes.CheckDBNull<string>(QRY["numero"]),
                            Bairro = clsfuncoes.CheckDBNull<string>(QRY["bairro"]),
                            CEP = clsfuncoes.CheckDBNull<string>(QRY["cep"]),
                            Cidade = clsfuncoes.CheckDBNull<string>(QRY["cidade"]),
                            UF = clsfuncoes.CheckDBNull<string>(QRY["estado"]),
                            LogradouroComplemento = string.Empty
                        },
                    };
                    b.CodigoOcorrencia = "01";
                    b.DataEmissao = DateTime.Now;
                    b.DataProcessamento = clsfuncoes.CheckDBNull<DateTime>(QRY["data"]);
                    b.DataVencimento = clsfuncoes.CheckDBNull<DateTime>(QRY["vencimento"]);
                    b.ValorTitulo = Convert.ToDecimal(clsfuncoes.CheckDBNull<string>(QRY["valordocumento"]));
                    b.NossoNumero = nossonumero;
                    b.NumeroDocumento = clsfuncoes.CheckDBNull<string>(QRY["seunumero"]);
                    b.EspecieDocumento = (TipoEspecieDocumento)beneficiario.TipoEspecieDocumento;
                    b.Aceite = "N";
                    b.CodigoInstrucao1 = beneficiario.codigodecurso == 0 ? "" : beneficiario.codigodecurso.ToString();
                    b.CodigoInstrucao2 = beneficiario.codigodecurso == 0 ? "" : (Convert.ToInt16(beneficiario.Decurso) + Convert.ToInt16(beneficiario.DiasDecurso)).ToString();
                    b.DataMulta = (DateTime)(beneficiario.Multa == 0 ? ((DateTime?)null) : DateTime.Parse(clsfuncoes.CheckDBNull<string>(QRY["vencimento"])));
                    b.PercentualMulta = beneficiario.Multa == 0 ? 0 : (decimal)beneficiario.Multa;
                    b.ValorMulta = beneficiario.Multa == 0 ? 0 : (decimal)(Convert.ToDouble(clsfuncoes.CheckDBNull<string>(QRY["valordocumento"])) * ((double)beneficiario.Multa / 100));
                    b.DataJuros = (DateTime)(beneficiario.Mora == 0 ? ((DateTime?)null) : DateTime.Parse(clsfuncoes.CheckDBNull<string>(QRY["vencimento"])));
                    b.PercentualJurosDia = beneficiario.Mora == 0 ? 0 : (decimal)Convert.ToDouble(beneficiario.Mora / 30);
                    b.ValorJurosDia = (decimal)(Convert.ToDouble(clsfuncoes.CheckDBNull<string>(QRY["valordocumento"])) * (Convert.ToDouble(beneficiario.Mora / 30) / 100));

                    // Mensagem - Instruções do Caixa
                    StringBuilder msgCaixa = new StringBuilder();
                    if (b.ValorMulta > 0)
                    {
                        linha1 = ($"Cobrar multa de {b.ValorMulta.ToString("R$ ##,##0.00")} após o vencimento." + Environment.NewLine);
                        msgCaixa.AppendLine(linha1);
                    }
                    if (b.ValorJurosDia > 0)
                    {
                        linha2 = ($"Cobrar juros de {b.ValorJurosDia.ToString("R$ ##,##0.00")} por dia de atraso." + Environment.NewLine);
                        msgCaixa.AppendLine(linha2);
                    }
                    if (Convert.ToInt16(beneficiario.Decurso) > 0)
                    {
                        linha3 = ($"NÃO RECEBER APÓS " + b.DataVencimento.AddDays(Convert.ToInt16(beneficiario.Decurso)).ToShortDateString()) + Environment.NewLine;
                        msgCaixa.AppendLine(linha3);
                    }
                    linha4 = beneficiario.Instrucao;
                    msgCaixa.AppendLine(linha4);
                    b.MensagemInstrucoesCaixa = msgCaixa.ToString();
                    boleto.Boleto = b;
                    b.ValidarDados();
                    boletos.Add(b);
                }
            }
            #endregion

            if (boletos.Count > 0)
            {
                var stream = new MemoryStream();
                var remessa = new ArquivoRemessa(boletos.Banco, (TipoArquivo)beneficiario.TipoArquivo, codigoremessa);

               //NA LINHA ABAIXO ACONTECE O ERRO : NÃO FOI POSSÍVEL GERAR O ARQUIVO RETORNO...
                remessa.GerarArquivoRemessa(boletos, stream);
                //////////////////////////////////////////////////////////////////

                File.WriteAllBytes(nomeArquivoREM, stream.ToArray());
                stream.Close();
            }
            conexao.Close();
jcmprogramador commented 3 years ago

Alguém pode me ajudar?

rafd75 commented 3 years ago

@jcmprogramador --- eu uso o Boleto2Net aqui... e para gerar um arquivo Remessa, instancio a biblioteca, carrego os boletos, e gero o REM.... Como eu trabalho com FoxPro, uso a classe PROXY para fazer isso (não consigo de outra forma, pelas limitações do Foxpro). >> https://github.com/BoletoNet/boleto2net/blob/master/Boleto2.Net/Boleto2NetProxy.cs E tudo funciona normalmente.

No seu caso, se você está recebendo um erro "não foi possível gerar o arquivo retorno..." - coloque um breakpoint logo nessa linha e verifique exatamente onde é que o método está abortando a execução... nesse ponto, você irá identificar o motivo que está causando o problema.

lucasfvaz commented 2 years ago

@jcmprogramador --- eu uso o Boleto2Net aqui... e para gerar um arquivo Remessa, instancio a biblioteca, carrego os boletos, e gero o REM.... Como eu trabalho com FoxPro, uso a classe PROXY para fazer isso (não consigo de outra forma, pelas limitações do Foxpro). >> https://github.com/BoletoNet/boleto2net/blob/master/Boleto2.Net/Boleto2NetProxy.cs E tudo funciona normalmente.

No seu caso, se você está recebendo um erro "não foi possível gerar o arquivo retorno..." - coloque um breakpoint logo nessa linha e verifique exatamente onde é que o método está abortando a execução... nesse ponto, você irá identificar o motivo que está causando o problema.

Olá rafd75, estou tendo uma falha ao gerar o arquivo remessa, quando eu tento passar as instruções para ele como em b.MensagemInstrucoesCaixa = msgCaixa.ToString(); porém está gerando uma InnerExeption indicando tamanho inválido. Porém já fiz diversos testes com strings de tamanhos variados e não consegui resolver. Pode me ajudar, por favor?

rafd75 commented 2 years ago

@jcmprogramador bom dia!

Qual banco/carteira?

No debug, ele não mostra a pilha de execução para ver onde está disparando a exception? Qual o conteúdo de msgCaixa.ToString() ?