示例#1
0
        /// <summary>
        /// Registro Detalhe Tipo 5 – Multa - Opcional - Remessa
        /// </summary>
        /// <returns></returns>
        private string EscreverDetalheTipo5(DetalheRemessaCnab400 infoDetalhe, int numeroRegistro)
        {
            var detalhe = new string(' ', 400);

            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "5");
                detalhe = detalhe.PreencherValorNaLinha(2, 3, "99");

                /* '1' = Valor | '2' = Percentual | '9' = Dispensar Cobrança de Multa */
                detalhe = detalhe.PreencherValorNaLinha(4, 4, "2");
                detalhe = detalhe.PreencherValorNaLinha(5, 10, infoDetalhe.DataVencimento.AddDays(1).ToString("ddMMyy"));
                detalhe = detalhe.PreencherValorNaLinha(11, 22,
                                                        infoDetalhe.PercentualMulta.ToString().Replace(".", "").Replace(",", "").PadLeft(12, '0'));
                detalhe = detalhe.PreencherValorNaLinha(23, 394, string.Empty.PadRight(372, ' '));
                detalhe = detalhe.PreencherValorNaLinha(395, 400,
                                                        numeroRegistro.ToString(CultureInfo.InvariantCulture).PadLeft(6, '0'));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(
                          string.Format("<BoletoBr>{0}Falha na geração do Detalhe Tipo 5 do arquivo de REMESSA.",
                                        Environment.NewLine), e);
            }
        }
        public string EscreverRegistroMensagem(DetalheRemessaCnab400 infoDetalhe, int sequenciaDetalhe)
        {
            var registroMensagem = new string(' ', 400);

            try
            {
                string nossoNumeroSequencial =
                    infoDetalhe.NossoNumeroFormatado.Replace(".", "").Replace("/", "").Replace("-", "").Substring(3, 8);

                registroMensagem = registroMensagem.PreencherValorNaLinha(1, 1, "2");
                registroMensagem = registroMensagem.PreencherValorNaLinha(2, 12, string.Empty.PadLeft(11, ' '));
                registroMensagem = registroMensagem.PreencherValorNaLinha(13, 21, nossoNumeroSequencial);
                registroMensagem = registroMensagem.PreencherValorNaLinha(22, 101, infoDetalhe.MensagemLinha1.PadRight(80, ' '));
                registroMensagem = registroMensagem.PreencherValorNaLinha(102, 181, infoDetalhe.MensagemLinha2.PadRight(80, ' '));
                registroMensagem = registroMensagem.PreencherValorNaLinha(182, 261, infoDetalhe.MensagemLinha3.PadRight(80, ' '));
                registroMensagem = registroMensagem.PreencherValorNaLinha(262, 341, infoDetalhe.MensagemLinha4.PadRight(80, ' '));
                registroMensagem = registroMensagem.PreencherValorNaLinha(342, 351, infoDetalhe.NumeroDocumento.PadRight(10, ' '));
                registroMensagem = registroMensagem.PreencherValorNaLinha(352, 394, string.Empty.PadRight(43, ' '));
                registroMensagem = registroMensagem.PreencherValorNaLinha(395, 400, sequenciaDetalhe.ToString().PadLeft(6, '0'));

                return(registroMensagem);
            }
            catch (Exception e)
            {
                throw new Exception(
                          string.Format("<BoletoBr>{0}Falha na geração do REGISTRO DE MENSAGENS do arquivo de REMESSA.",
                                        Environment.NewLine), e);
            }
        }
        public void GerarHeaderArquivoRemessaBradescoCnab400()
        {
            var banco = Fabricas.BancoFactory.ObterBanco("237", "2");
            var contaBancariaCedente = new ContaBancaria("0534", "7", "2801", "0");
            var cedente = new Cedente("4879962", 0, "99.999.999/9999-99", "Razão Social X", contaBancariaCedente, null);

            var sacado = new Sacado("Sacado Fulano de Tal", "999.999.999-99", new Endereco()
            {
                TipoLogradouro = "R",
                Logradouro     = "1",
                Bairro         = "Bairro X",
                Cidade         = "Cidade X",
                SiglaUf        = "XX",
                Cep            = "12345-000",
                Complemento    = "Comp X",
                Numero         = "9"
            });

            var carteira = new CarteiraCobranca {
                Codigo = "02", BancoEmiteBoleto = false
            };

            var boleto = new Boleto(carteira, cedente, sacado, null)
            {
                NumeroDocumento            = "55617",
                ValorBoleto                = Convert.ToDecimal(501.81),
                IdentificadorInternoBoleto = "55617",
                DataVencimento             = new DateTime(2016, 11, 25),
                Moeda       = "9",
                BancoBoleto = banco
            };

            banco.FormatarBoleto(boleto);

            var remessa = new RemessaCnab400
            {
                Header           = new HeaderRemessaCnab400(boleto, 1, 1),
                RegistrosDetalhe = new List <DetalheRemessaCnab400>(),
                Trailer          = new TrailerRemessaCnab400(boleto.ValorBoleto, 1)
            };

            var escritor = EscritorArquivoRemessaFactory.ObterEscritorRemessa(remessa);
            var detalhe  = new DetalheRemessaCnab400(boleto, 2);

            remessa.RegistrosDetalhe.Add(detalhe);

            var fabricaRemessa = new RemessaFactory();
            var remessaPronta  = fabricaRemessa.GerarRemessa(remessa.Header, new List <Boleto>()
            {
                boleto
            },
                                                             remessa.RegistrosDetalhe, remessa.Trailer);
            var linhasEscrever = escritor.EscreverTexto(remessaPronta);

            const string header =
                "01REMESSA01COBRANCA       00000000000004879962HOT BEACH SUITES OLIMPIA - EMP237BRADESCO       251116        MX0000002                                                                                                                                                                                                                                                                                     000001";

            Assert.AreEqual(header, remessaPronta.Header);
        }
示例#4
0
        public List <string> PreparaLinhaMensagemVariavel(DetalheRemessaCnab400 info)
        {
            string complementoRegistro =
                info.ContaCorrente.Remove(0, info.ContaCorrente.Length - 1) +
                info.DvContaCorrente;

            var lista = new List <string>();
            int cont  = 3;

            if (info.Instrucoes.Count > 0)
            {
                info.Instrucoes.RemoveAt(0);
                foreach (var instrucaoAtual in info.Instrucoes)
                {
                    // Primeira Mensagem (Mensagem 1) Variável que irá constar na linha 2 do detalhe atual
                    var msgVariavel = new string(' ', 400);
                    try
                    {
                        msgVariavel = msgVariavel.PreencherValorNaLinha(1, 1, cont.ToString());
                        msgVariavel = msgVariavel.PreencherValorNaLinha(2, 17, string.Empty.PadRight(16, ' ')); // Uso do Banco
                        //msgVariavel = msgVariavel.PreencherValorNaLinha(18, 21, string.Empty.PadRight(4, ' ')); // Código da Agência
                        //msgVariavel = msgVariavel.PreencherValorNaLinha(22, 29, string.Empty.PadRight(8, ' ')); // Conta Movimento
                        //msgVariavel = msgVariavel.PreencherValorNaLinha(30, 37, string.Empty.PadRight(8, ' ')); // Conta Cobrança
                        msgVariavel = msgVariavel.PreencherValorNaLinha(18, 37, info.CodigoDeTransmissao.PadLeft(20, '0'));
                        msgVariavel = msgVariavel.PreencherValorNaLinha(38, 47, string.Empty.PadRight(10, ' ')); // Uso do Banco
                        msgVariavel = msgVariavel.PreencherValorNaLinha(48, 49, "01");
                        msgVariavel = msgVariavel.PreencherValorNaLinha(50, 99, instrucaoAtual != null
                            ? instrucaoAtual.TextoInstrucao.PadRight(50, ' ')
                            : string.Empty.PadRight(50, ' '));
                        msgVariavel = msgVariavel.PreencherValorNaLinha(100, 382, string.Empty.PadRight(283, ' '));
                        // Uso do Banco
                        msgVariavel = msgVariavel.PreencherValorNaLinha(383, 383, "i".ToUpper());
                        msgVariavel = msgVariavel.PreencherValorNaLinha(384, 385, complementoRegistro);
                        msgVariavel = msgVariavel.PreencherValorNaLinha(386, 394, string.Empty.PadLeft(9, ' '));
                        _numeroSequencialDeRegistro += 1;
                        _numeroAtualDeRegistro       = _numeroSequencialDeRegistro;
                        msgVariavel = msgVariavel.PreencherValorNaLinha(395, 400, _numeroSequencialDeRegistro.ToString().PadLeft(6, '0'));
                        lista.Add(msgVariavel);
                        cont++;
                    }

                    catch (Exception e)
                    {
                        throw new Exception(
                                  string.Format(
                                      "<BoletoBr>{0}Falha na geração das MENSAGENS PARA O BOLETO no arquivo de REMESSA.",
                                      Environment.NewLine), e);
                    }
                }
            }

            return(lista);
        }
示例#5
0
        /// <summary>
        /// Método que escreve a mensagem variável com código de registro 2 (Recibo Sacado)
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        private string EscreverMensagemVariavelReciboSacado(DetalheRemessaCnab400 info)
        {
            string complementoRegistro =
                info.ContaCorrente.Remove(0, info.ContaCorrente.Length - 1) +
                info.DvContaCorrente;

            // A primeira instrução é a instrução do sacado conforme layout do SANTANDER
            var primeiraInstrucao = info.Instrucoes.FirstOrDefault();

            var msgVariavel = new string(' ', 400);

            try
            {
                msgVariavel = msgVariavel.PreencherValorNaLinha(1, 1, "2");
                msgVariavel = msgVariavel.PreencherValorNaLinha(2, 17, string.Empty.PadRight(16, ' ')); // Uso do Banco
                //msgVariavel = msgVariavel.PreencherValorNaLinha(18, 21, string.Empty.PadRight(4, ' ')); // Código da Agência
                //msgVariavel = msgVariavel.PreencherValorNaLinha(22, 29, string.Empty.PadRight(8, ' ')); // Conta Movimento
                //msgVariavel = msgVariavel.PreencherValorNaLinha(30, 37, string.Empty.PadRight(8, ' ')); // Conta Cobrança
                msgVariavel = msgVariavel.PreencherValorNaLinha(18, 37, info.CodigoDeTransmissao.PadLeft(20, '0'));
                msgVariavel = msgVariavel.PreencherValorNaLinha(38, 47, string.Empty.PadRight(10, ' ')); // Uso do Banco
                msgVariavel = msgVariavel.PreencherValorNaLinha(48, 49, "01");
                msgVariavel = msgVariavel.PreencherValorNaLinha(50, 99, primeiraInstrucao != null
                    ? primeiraInstrucao.TextoInstrucao.PadRight(50, ' ')
                    : string.Empty.PadRight(50, ' '));
                msgVariavel = msgVariavel.PreencherValorNaLinha(100, 382, string.Empty.PadRight(283, ' '));
                // Uso do Banco
                msgVariavel = msgVariavel.PreencherValorNaLinha(383, 383, "i".ToUpper());
                msgVariavel = msgVariavel.PreencherValorNaLinha(384, 385, complementoRegistro);
                msgVariavel = msgVariavel.PreencherValorNaLinha(386, 394, string.Empty.PadLeft(9, ' '));
                _numeroSequencialDeRegistro += 1;
                _numeroAtualDeRegistro       = _numeroSequencialDeRegistro;
                msgVariavel = msgVariavel.PreencherValorNaLinha(395, 400, _numeroSequencialDeRegistro.ToString().PadLeft(6, '0'));
            }
            catch (Exception e)
            {
                throw new Exception(
                          string.Format(
                              "<BoletoBr>{0}Falha na geração das MENSAGENS PARA O BOLETO no arquivo de REMESSA.",
                              Environment.NewLine), e);
            }

            return(msgVariavel);
        }
        /// <summary>
        /// Método que escreve a mensagem variável com código de registro 3 (Ficha de Compensação)
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        private string EscreverMensagemVariavelFichaCompensacao(DetalheRemessaCnab400 info, ref int numeroRegistro)
        {
            var    listaLinhas   = PreparaLinhaMensagemVariavel(info, ref numeroRegistro);
            string registroAtual = string.Empty;

            if (listaLinhas != null)
            {
                foreach (var linha in listaLinhas)
                {
                    if (listaLinhas.Last() == linha)
                    {
                        registroAtual += linha;
                    }
                    else
                    {
                        registroAtual += linha + Environment.NewLine;
                    }
                }
            }

            return(registroAtual);
        }
        public string EscreverRegistroMulta(DetalheRemessaCnab400 infoDetalhe, int sequencial)
        {
            var registroMulta = new string(' ', 400);

            try
            {
                registroMulta = registroMulta.PreencherValorNaLinha(1, 1, "2");
                registroMulta = registroMulta.PreencherValorNaLinha(2, 2, "2");                                                         //CODIGO DA MULTA 2 - %
                registroMulta = registroMulta.PreencherValorNaLinha(3, 10, infoDetalhe.DataVencimento.AddDays(1).ToString("ddMMyyyy")); //DATA DA MULTA

                var valorMulta = string.Empty;

                if (infoDetalhe.PercentualMulta.ToString().Contains('.') &&
                    infoDetalhe.PercentualMulta.ToString().Contains(','))
                {
                    valorMulta = infoDetalhe.PercentualMulta.ToString().Replace(".", "").Replace(",", "");
                }
                if (infoDetalhe.PercentualMulta.ToString().Contains('.'))
                {
                    valorMulta = infoDetalhe.PercentualMulta.ToString().Replace(".", "");
                }
                if (infoDetalhe.PercentualMulta.ToString().Contains(','))
                {
                    valorMulta = infoDetalhe.PercentualMulta.ToString().Replace(",", "");
                }

                registroMulta = registroMulta.PreencherValorNaLinha(11, 23, valorMulta.PadLeft(13, '0')); //VALOR/PERCENTUAL A SER APLICADO

                registroMulta = registroMulta.PreencherValorNaLinha(24, 394, string.Empty.PadRight(371, ' '));
                registroMulta = registroMulta.PreencherValorNaLinha(395, 400, sequencial.ToString().PadLeft(6, '0'));

                return(registroMulta);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do REGISTRO MULTA do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
示例#8
0
        public void TestGerarHeaderArquivoRemessaBRBCnab400()
        {
            var dadosRemessa = new Remessa(Remessa.EnumTipoAmbiemte.Homologacao, EnumCodigoOcorrenciaRemessa.Registro,
                                           "");
            var banco = Fabricas.BancoFactory.ObterBanco("070");
            var contaBancariaCedente = new ContaBancaria("201", "", "29088", "1");
            var cedente = new Cedente("99999", 0, "99.999.999/9999-99", "Razão Social X", contaBancariaCedente, null);
            var sacado  = new Sacado("Sacado Fulano de Tal", "99.999.999/9999-99", new Endereco()
            {
                TipoLogradouro = "R",
                Logradouro     = "1",
                Bairro         = "Bairro X",
                Cidade         = "Cidade X",
                SiglaUf        = "XX",
                Cep            = "12345-000",
                Complemento    = "Comp X",
                Numero         = "9"
            });

            var carteira = new CarteiraCobranca {
                Codigo = "1", Tipo = "1"
            };

            var boleto = new Boleto(carteira, cedente, sacado, dadosRemessa)
            {
                NumeroDocumento            = "279141",
                ValorBoleto                = Convert.ToDecimal(222.75),
                IdentificadorInternoBoleto = "279141",
                DataVencimento             = new DateTime(2015, 03, 16),
                Especie = banco.ObtemEspecieDocumento(EnumEspecieDocumento.Diversos),
                CodigoOcorrenciaRemessa = new CodigoOcorrencia(01),
                BancoBoleto             = banco,
                TipoCobrancaJuro        = TipoCobrancaJuro.JurosDiario
            };

            banco.FormatarBoleto(boleto);

            var remessa = new RemessaCnab400();

            remessa.Header = new HeaderRemessaCnab400(boleto, 1, 1, DateTime.Now);
            var detalheIndividual = new DetalheRemessaCnab400(boleto, 1);

            remessa.RegistrosDetalhe = new List <DetalheRemessaCnab400>
            {
                detalheIndividual
            };
            var escritor = new EscritorRemessaCnab400BRB(remessa);

            var linhasEscrever = escritor.EscreverTexto(remessa);
            var path           = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            var data           = String.Format("{0}_{1}", DateTime.Now.ToString("ddMMyyyy"), DateTime.Now.ToString("HHmmss"));

            var nomeArquivo = string.Format("{0}{1}{2}{3}", banco.CodigoBanco, @"_REMESSA_", data, ".txt");
            var arquivo     = new System.IO.StreamWriter(path + @"\" + nomeArquivo, true);

            foreach (var linha in linhasEscrever)
            {
                arquivo.WriteLine(linha);
            }
            arquivo.Close();
        }
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int sequenciaDetalhe)
        {
            string nomeSacado = string.Empty;

            if (String.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado.PadRight(30, ' ');
            }
            else if (infoDetalhe.NomePagador.Length > 30)
            {
                nomeSacado = infoDetalhe.NomePagador.Substring(0, 30).ToUpper();
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.PadRight(30, ' ').ToUpper();
            }

            string enderecoSacado = string.Empty;

            if (String.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.EnderecoPagador.Length > 40)
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Substring(0, 40).ToUpper();
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.PadRight(40, ' ').ToUpper();
            }

            string cidadeSacado = string.Empty;

            if (String.IsNullOrEmpty(infoDetalhe.CidadePagador))
            {
                cidadeSacado.PadRight(15, ' ');
            }
            else if (infoDetalhe.CidadePagador.Length > 15)
            {
                cidadeSacado = infoDetalhe.CidadePagador.Substring(0, 15).ToUpper();
            }
            else
            {
                cidadeSacado = infoDetalhe.CidadePagador.PadRight(15, ' ').ToUpper();
            }

            /*
             * Não usado nos segmentos atuais. 25/05/2018
             * string bairroSacado = string.Empty;
             * if (String.IsNullOrEmpty(infoDetalhe.BairroPagador))
             *     bairroSacado.PadRight(12, ' ');
             * else if (infoDetalhe.BairroPagador.Length > 12)
             *     bairroSacado = infoDetalhe.BairroPagador.Substring(0, 12).ToUpper();
             * else
             *     bairroSacado = infoDetalhe.BairroPagador.PadRight(12, ' ').ToUpper();
             */
            var detalhe = new string(' ', 400);

            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1"); // Identificação do Registro Transação
                detalhe = detalhe.PreencherValorNaLinha(2, 17, string.Empty.PadLeft(16, ' '));
                detalhe = detalhe.PreencherValorNaLinha(18, 21, infoDetalhe.Agencia.PadLeft(4, '0'));
                detalhe = detalhe.PreencherValorNaLinha(22, 29, infoDetalhe.CodigoCedente.PadLeft(8, '0'));
                detalhe = detalhe.PreencherValorNaLinha(30, 30, (infoDetalhe.DVCedente.Length > 1 ? infoDetalhe.DVCedente.Substring(0, 1) : infoDetalhe.DVCedente).PadLeft(1, '0'));
                detalhe = detalhe.PreencherValorNaLinha(31, 37, string.Empty.PadLeft(7, ' '));
                detalhe = detalhe.PreencherValorNaLinha(38, 62, infoDetalhe.NumeroDocumento.PadLeft(25, '0'));
                detalhe = detalhe.PreencherValorNaLinha(63, 72, infoDetalhe.NossoNumeroFormatado.Replace(",", "").Replace("-", "").Replace(".", "").PadLeft(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(73, 104, (infoDetalhe.MensagemLinha1 != null ? infoDetalhe.MensagemLinha1.Length <= 32 ? infoDetalhe.MensagemLinha1.PadLeft(32, ' '): infoDetalhe.MensagemLinha1.Substring(0, 32): "").PadLeft(32, ' '));
                detalhe = detalhe.PreencherValorNaLinha(105, 107, string.Empty.PadLeft(3, ' '));
                detalhe = detalhe.PreencherValorNaLinha(108, 108, infoDetalhe.CarteiraCobranca.PadLeft(1, ' '));

                /*
                 * CÓDIGO DE OCORRÊNCIA
                 * - Campo obrigatório.
                 * - Conteúdo:
                 * 01 – Remessa
                 * 02 – Pedido baixa
                 * 04 – Concessão de abatimento
                 * 05 – Cancelamento de abatimento
                 * 06 – Alteração de vencimento
                 * 07 – Alteração de uso empresa
                 * 08 – Alteração do Seu Número
                 * 09 – Protestar imediatamente
                 * 10 – Sustação de protesto
                 * 11 – Não cobrar juros de mora
                 * 12 - Reembolso e transferência Desconto e Vendor
                 * 13 – Reembolso e devolução Desconto e Vendor
                 * 14 – Dados do sacador
                 * 16 – Alteração do número de dias para protesto
                 * 17 – Protestar imediatamente para fins de falência
                 * 18 – Alteração do nome do Pagador
                 * 19 – Alteração do endereço do Pagador
                 * 20 – Alteração da cidade do Pagador
                 * 21 – Alteração do CEP do Pagador (mudança de portadora)
                 * 68 – Acerto dos dados do rateio de crédito Vide item 2.6.1
                 * 69 – Cancelamento dos dados do rateio Vide item 2.6.1
                 */
                detalhe = detalhe.PreencherValorNaLinha(109, 110, "01");

                /*
                 *  SEU NÚMERO
                 *  - Campo alfanumérico obrigatório.
                 *  - Seu Número com até 13 dígitos:
                 *  Informe VIDE038050 nas posições 111-120;
                 *  Informe o seu número com até 13 dígitos nas posições 038-050.
                 *  O seu número informado será impresso no bloqueto e informado no arquivo retorno.
                 */
                detalhe = detalhe.PreencherValorNaLinha(111, 120, "VIDE038050");
                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));
                detalhe = detalhe.PreencherValorNaLinha(127, 139, infoDetalhe.ValorBoleto.ToStringParaVoloresDecimais().PadLeft(13, '0'));
                // Valor Nominal do Título
                detalhe = detalhe.PreencherValorNaLinha(140, 142, "041");
                detalhe = detalhe.PreencherValorNaLinha(143, 147, string.Empty.PadLeft(5, '0'));


                /*
                 * TIPO DE DOCUMENTO
                 * - Campo numérico obrigatório.
                 * - Para todos os documentos será considerado Duplicata Mercantil.
                 * - Carteiras N, R, S e X: deixe o campo em branco.
                 * - Conteúdo:
                 * todo:04 – Cobrança Direta:
                 * O Banco imprime o bloqueto e envia para a Agência do Beneficiário, para que seja
                 * encaminhado ao Pagador.
                 * Para Tipo de Carteira D (posição 108), o bloqueto terá formato carnê.
                 * todo:06 – Cobrança Escritural:
                 * O Banco emite o bloqueto e envia ao Pagador pelo Correio.
                 * todo:08 – Cobrança Credenciada Banrisul – CCB:
                 * O Banco não emite o bloqueto. O bloqueto é impresso e expedido pelo Beneficiário. Vide
                 * item 5 (Notas). O Banco poderá fornecer formulários pré-impressos.
                 * todo:09 – Títulos de Terceiros:
                 * O Banco emite o bloqueto e envia ao Pagador pelo Correio.
                 * Obrigatório o preenchimento das posições 073-104 com o CNPJ/CPF e o NOME DO
                 * SACADOR e a inclusão do registro tipo 1 – Dados do Sacador no arquivo remessa.
                 */
                var TipoDocumento = "08";
                if (infoDetalhe.BancoEmiteBoleto)
                {
                    TipoDocumento = "06";
                }
                detalhe = detalhe.PreencherValorNaLinha(148, 149, TipoDocumento.PadLeft(2, '0'));
                if (String.IsNullOrEmpty(infoDetalhe.Aceite))
                {
                    detalhe = detalhe.PreencherValorNaLinha(150, 150, "N");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(150, 150, infoDetalhe.Aceite.Equals("A") ? "A" : "N");
                }
                // Identificação de Título Aceitou ou Não Aceito
                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));
                // Data da Emissão do Título

                #region INSTRUÇÕES REMESSA

                /*
                 * CÓDIGO DA 1ª INSTRUÇÃO
                 * - Campo numérico opcional.
                 * - Conteúdo:
                 * 09 – Protestar caso impago NN dias após o vencimento (posições 370-371 = NN).
                 * O número de dias para protesto deverá ser igual ou maior do que 03.
                 * 15 – Devolver se impago após NN dias do vencimento (posições 370-371 = NN).
                 * Obs.: Para o número de dias igual a 00 será impresso no bloqueto: “NÃO RECEBER APÓS
                 * O VENCIMENTO”.
                 * 18 – Após NN dias do vencimento, cobrar xx,x% de multa.
                 * 20 – Após NN dias do vencimento, cobrar xx,x% de multa ao mês ou fração.
                 * 23 – Não protestar.
                 * Notas:
                 * 1 – Códigos 09 ou 15:
                 * Obrigatório o preenchimento do campo Número de dias para protesto nas posições 370-
                 * 371.
                 * 2 – Códigos 18 e 20:
                 * Informe a taxa nas posições 322-324, com apenas uma casa decimal.
                 * Informe o número de dias nas posições 325-326. Se for igual a 00, considera-se “Após o
                 * vencimento”.
                 * 3 – Carteiras N, R, S e X:
                 * Não sendo autorizado a informar a taxa, este campo deve estar em branco.
                 * Se autorizado, informe a taxa nas posições 322-326, com 3 casas decimais.
                 */


                var codigoInstrucao = infoDetalhe.NroDiasParaProtesto > 0 ? "09" :
                                      infoDetalhe.PrazoBaixaDevolucao > 0 ? "15" :
                                      "23";
                var Instrucao = infoDetalhe.NroDiasParaProtesto > 0 ? infoDetalhe.NroDiasParaProtesto :
                                infoDetalhe.PrazoBaixaDevolucao > 0 ? infoDetalhe.PrazoBaixaDevolucao : 0;
                detalhe = detalhe.PreencherValorNaLinha(157, 158, codigoInstrucao.PadLeft(2, '0'));
                detalhe = detalhe.PreencherValorNaLinha(159, 160, string.Empty.PadLeft(2, ' '));
                #endregion
                #region VALOR JUROS

                var carteiras = new List <string>()
                {
                    "N", "R", "S", "X"
                };
                if (infoDetalhe.ValorMoraDia > 0 && !carteiras.Contains(infoDetalhe.CarteiraCobranca.ToUpper()))
                {
                    detalhe = detalhe.PreencherValorNaLinha(161, 161, "1");
                    detalhe = detalhe.PreencherValorNaLinha(162, 173, infoDetalhe.ValorMoraDia.ToStringParaVoloresDecimais().PadLeft(12, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(161, 173, string.Empty.PadLeft(13, ' '));
                }
                #endregion

                if (infoDetalhe.DataLimiteConcessaoDesconto > DateTime.MinValue && infoDetalhe.ValorDesconto > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy"));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, string.Empty.PadLeft(6, '0'));
                }
                detalhe = detalhe.PreencherValorNaLinha(180, 192, infoDetalhe.ValorDesconto.ToStringParaVoloresDecimais().PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(193, 205, infoDetalhe.ValorIof.ToStringParaVoloresDecimais().PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(206, 218, infoDetalhe.ValorAbatimento.ToStringParaVoloresDecimais().PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(219, 220, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11 ? "01": "02");
                detalhe = detalhe.PreencherValorNaLinha(221, 234, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 269, nomeSacado.PadRight(35, ' '));
                detalhe = detalhe.PreencherValorNaLinha(270, 274, string.Empty.PadRight(5, ' '));
                detalhe = detalhe.PreencherValorNaLinha(275, 314, enderecoSacado.PadRight(40, ' '));
                detalhe = detalhe.PreencherValorNaLinha(315, 321, string.Empty.PadRight(7, ' '));

                if (infoDetalhe.PercentualMulta > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(322, 324, infoDetalhe.PercentualMulta.ToStringParaVoloresDecimais(1).PadLeft(3, '0'));
                    detalhe = detalhe.PreencherValorNaLinha(325, 326, "01"); //caso informado percentual de multa será aplicado no primeiro dia de inadimplência
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(322, 326, string.Empty.PadLeft(5, '0'));
                }
                var Cep = infoDetalhe.CepPagador;
                if (Cep.Contains("."))
                {
                    Cep = Cep.Replace(".", "");
                }
                if (Cep.Contains("-"))
                {
                    Cep = Cep.Replace("-", "");
                }
                if (Cep.Trim().Length != 8)
                {
                    throw new Exception("Cep invalido");
                }
                detalhe = detalhe.PreencherValorNaLinha(327, 334, Cep.Trim());

                detalhe = detalhe.PreencherValorNaLinha(335, 349, cidadeSacado.PadRight(15, ' '));
                detalhe = detalhe.PreencherValorNaLinha(350, 351, infoDetalhe.UfPagador.PadRight(2, ' '));
                detalhe = detalhe.PreencherValorNaLinha(352, 355, string.Empty.PadLeft(4, '0'));                                                                    //TAXA AO DIA PARA PAGAMENTO ANTECIPADO
                detalhe = detalhe.PreencherValorNaLinha(356, 357, string.Empty.PadLeft(2, ' '));
                detalhe = detalhe.PreencherValorNaLinha(358, 369, string.Empty.PadLeft(12, carteiras.Contains(infoDetalhe.CarteiraCobranca.ToUpper()) ? ' ': '0')); //VALOR PARA CÁLCULO DO DESCONTO
                detalhe = detalhe.PreencherValorNaLinha(370, 371, infoDetalhe.NroDiasParaProtesto.ToString().PadLeft(2, '0'));
                detalhe = detalhe.PreencherValorNaLinha(372, 394, string.Empty.PadLeft(23, ' '));
                // Nro Sequencial do Registro no Arquivo
                detalhe = detalhe.PreencherValorNaLinha(395, 400, sequenciaDetalhe.ToString().PadLeft(6, '0'));
                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
        public void TestGerarDetalheArquivoRemessaBancoBrasilCnab400()
        {
            var remessa = new Remessa(Remessa.EnumTipoAmbiemte.Homologacao, EnumCodigoOcorrenciaRemessa.Registro, "2");

            var banco = Fabricas.BancoFactory.ObterBanco("001", "9");

            var contaBancariaCedente = new ContaBancaria("2374", "4", "0165199", "4");

            var cedente = new Cedente("9999999", "000123", 0, "99.999.999/9999-99", "Razão Social X", contaBancariaCedente, null);

            var sacado = new Sacado("Sacado Fulano de Tal", "999.999.999-99", new Endereco()
            {
                TipoLogradouro = "R",
                Logradouro     = "1",
                Bairro         = "Bairro X",
                Cidade         = "Cidade X",
                SiglaUf        = "XX",
                Cep            = "12345-000",
                Complemento    = "Comp X",
                Numero         = "9"
            });

            var carteira = new CarteiraCobranca {
                Codigo = "16"
            };

            var boleto = new Boleto(carteira, cedente, sacado, remessa)
            {
                NumeroDocumento            = "1",
                ValorBoleto                = Convert.ToDecimal(221.40),
                IdentificadorInternoBoleto = "1",
                DataVencimento             = new DateTime(2014, 07, 10),
                Especie                 = banco.ObtemEspecieDocumento(EnumEspecieDocumento.DuplicataMercantil),
                TipoModalidade          = "21",
                CodigoOcorrenciaRemessa = new CodigoOcorrencia(01),
                BancoBoleto             = banco
            };

            banco.FormatarBoleto(boleto);

            var remessaEscrever = new RemessaCnab400();

            remessaEscrever.Header = new HeaderRemessaCnab400(boleto, 1, 1, DateTime.Now);
            var detalheIndividual = new DetalheRemessaCnab400(boleto, 1);

            remessaEscrever.RegistrosDetalhe = new List <DetalheRemessaCnab400>
            {
                detalheIndividual
            };
            var escritor = new EscritorRemessaCnab400BancoDoBrasil(remessaEscrever);

            var linhasEscrever = escritor.EscreverTexto(remessaEscrever);

            //const int numeroRegistro = 1;

            //var escritor = new EscritorRemessaCnab400BancoDoBrasil();

            //var linhasEscrever = escritor.EscreverDetalhe(boleto, numeroRegistro);

            //var path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            //var data = DateTime.Now.ToString("ddMMyyyy");

            //var nomeArquivo = string.Format("{0}{1}{2}{3}{4}{5}{6}", banco.CodigoBanco, "-", banco.NomeBanco, "_", data, @"_REGISTRO_DETALHE", ".txt");

            //var arquivo = new System.IO.StreamWriter(path + @"\" + nomeArquivo, true);
            //arquivo.WriteLine(linhasEscrever);

            //arquivo.Close();
        }
示例#11
0
        public void TestGeracaoArquivoRemessa()
        {
            var dadosRemessa = new Remessa(Remessa.EnumTipoAmbiemte.Homologacao, EnumCodigoOcorrenciaRemessa.Registro,
                                           "2");

            var banco = Fabricas.BancoFactory.ObterBanco("237", "2");

            var contaBancariaCedente = new ContaBancaria("1234", "8", "12345", "6");

            var cedente = new Cedente("99999", "1", 0, "99.999.999/9999-99", "Razao Social X", contaBancariaCedente,
                                      null);

            var sacado = new Sacado("Sacado Fulano de Tal", "99.999.999/9999-99", new Endereco()
            {
                TipoLogradouro = "R",
                Logradouro     = "1",
                Bairro         = "Bairro X",
                Cidade         = "Cidade X",
                SiglaUf        = "XX",
                Cep            = "12345-000",
                Complemento    = "Comp X",
                Numero         = "9"
            });

            var carteira = new CarteiraCobranca {
                Codigo = "06"
            };
            var boleto = new Boleto(carteira, cedente, sacado, dadosRemessa)
            {
                NumeroDocumento            = "3242",
                ValorBoleto                = Convert.ToDecimal(275),
                IdentificadorInternoBoleto = "3242",
                DataVencimento             = new DateTime(2014, 08, 04),
                Especie     = banco.ObtemEspecieDocumento(EnumEspecieDocumento.DuplicataMercantil),
                BancoBoleto = banco
            };

            banco.FormatarBoleto(boleto);

            var remessa = new RemessaCnab400();

            remessa.Header = new HeaderRemessaCnab400(boleto, 1, 1);

            var detalheIndividual = new DetalheRemessaCnab400(boleto, 1);

            remessa.RegistrosDetalhe = new List <DetalheRemessaCnab400>
            {
                detalheIndividual
            };

            remessa.Trailer = new TrailerRemessaCnab400(1, 1);

            var escritor = new EscritorRemessaCnab400Bradesco(remessa);

            var linhasEscrever = escritor.EscreverTexto(remessa);

            var path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            var data = String.Format("{0}_{1}", DateTime.Now.ToString("ddMMyyyy"), DateTime.Now.ToString("HHmmss"));

            var nomeArquivo = string.Format("{0}{1}{2}{3}", banco.CodigoBanco, @"_REMESSA_", data, ".txt");

            StringBuilder sb = new StringBuilder();

            foreach (var linha in linhasEscrever)
            {
                sb.AppendLine(linha);
            }

            Assert.AreEqual(linhasEscrever[0], "01REMESSA01COBRANCA       00000000000000099999RAZAO SOCIAL X                237BRADESCO       300517        MX0000001                                                                                                                                                                                                                                                                                     000001");
            Assert.AreEqual(linhasEscrever[1], "1000000000000000000000060123400123456DOC06/00000003242-7      0000    00000003242700000000002S           2  01000000324204081400000000275000000000001N300517000000000000000000000000000000000000000000000000000000000000000299999999999999SACADO FULANO DE TAL                    1,9,COMP X                                          12345000                                                            000002");
            Assert.AreEqual(linhasEscrever[2], "9                                                                                                                                                                                                                                                                                                                                                                                                         000003");
        }
示例#12
0
        public string EscreverMensagem(DetalheRemessaCnab400 infoDetalhe, int sequenciaRegistro)
        {
            if (infoDetalhe == null)
            {
                throw new Exception("Os dados não foram informados na geração do DETALHE MENSAGEM.");
            }

            var tipo2 = new string(' ', 400);

            try
            {
                var mensagem1 = "";
                var mensagem2 = "";
                var mensagem3 = "";
                var mensagem4 = "";

                foreach (var item in infoDetalhe.Instrucoes)
                {
                    if (mensagem1 == "")
                    {
                        mensagem1 = item.TextoInstrucao;
                        if (mensagem1.Length > 69)
                        {
                            mensagem1 = mensagem1.ExtrairValorDaLinha(1, 69);
                        }
                    }
                    else if (mensagem2 == "")
                    {
                        mensagem2 = item.TextoInstrucao;
                        if (mensagem2.Length > 69)
                        {
                            mensagem2 = mensagem2.ExtrairValorDaLinha(1, 69);
                        }
                    }
                    else if (mensagem3 == "")
                    {
                        mensagem3 = item.TextoInstrucao;
                        if (mensagem3.Length > 69)
                        {
                            mensagem3 = mensagem3.ExtrairValorDaLinha(1, 69);
                        }
                    }
                    else if (mensagem4 == "")
                    {
                        mensagem4 = item.TextoInstrucao;
                        if (mensagem4.Length > 69)
                        {
                            mensagem4 = mensagem4.ExtrairValorDaLinha(1, 69);
                        }
                    }
                }

                tipo2 = tipo2.PreencherValorNaLinha(1, 1, "2");
                tipo2 = tipo2.PreencherValorNaLinha(2, 2, "0");
                tipo2 = tipo2.PreencherValorNaLinha(3, 71, mensagem1.PadRight(69, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(72, 140, mensagem2.PadRight(69, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(141, 209, mensagem3.PadRight(69, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(210, 278, mensagem4.PadRight(69, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(279, 394, string.Empty.PadRight(116, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(395, 400, sequenciaRegistro.ToString().PadLeft(6, '0'));

                return(tipo2);
            }
            catch (Exception e)
            {
                throw new Exception(
                          string.Format("<BoletoBr>{0}Falha na geração do Registro Tipo 2 do arquivo de REMESSA.",
                                        Environment.NewLine), e);
            }
        }
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int sequenciaRegistro, int sequenciaNumeroRemessa)
        {
            if (infoDetalhe == null)
            {
                throw new Exception("Não há boleto para geração do DETALHE");
            }

            #region Dados Sacado

            string enderecoSacado = string.Empty;
            string bairroSacado   = string.Empty;
            string cidadeSacado   = string.Empty;
            string nomeSacado     = string.Empty;

            if (string.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.EnderecoPagador.Length > 40)
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Substring(0, 40).ToUpper();
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.PadRight(40, ' ').ToUpper();
            }

            if (string.IsNullOrEmpty(infoDetalhe.BairroPagador))
            {
                bairroSacado = bairroSacado.PadRight(10, ' ');
            }
            else if (infoDetalhe.BairroPagador.Length > 10)
            {
                bairroSacado = infoDetalhe.BairroPagador.Substring(0, 10);
            }
            else
            {
                bairroSacado = infoDetalhe.BairroPagador.PadRight(10, ' ');
            }

            if (string.IsNullOrEmpty(infoDetalhe.CidadePagador))
            {
                cidadeSacado = cidadeSacado.PadRight(15, ' ');
            }
            else if (infoDetalhe.CidadePagador.Length > 15)
            {
                cidadeSacado = infoDetalhe.CidadePagador.Substring(0, 15);
            }
            else
            {
                cidadeSacado = infoDetalhe.CidadePagador.PadRight(15, ' ');
            }

            if (string.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.NomePagador.Length > 40)
            {
                nomeSacado = infoDetalhe.NomePagador.Substring(0, 40).ToUpper();
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.PadRight(40, ' ').ToUpper();
            }

            #endregion

            var detalhe = new string(' ', 400);
            try
            {
                var primeiraInstrucao = infoDetalhe.Instrucoes.FirstOrDefault();
                var segundaInstrucao  = infoDetalhe.Instrucoes.LastOrDefault();

                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1");

                if (infoDetalhe.InscricaoCedente.ToString().Replace(".", "").Replace("-", "").Length == 11)
                {
                    detalhe = detalhe.PreencherValorNaLinha(2, 3, "01");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(2, 3, "02");
                }

                detalhe = detalhe.PreencherValorNaLinha(4, 17,
                                                        infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").PadRight(14, ' '));

                var identificadorCedente = "";
                identificadorCedente += infoDetalhe.Agencia.PadRight(5, '0');
                identificadorCedente += infoDetalhe.ContaCorrente.PadLeft(8, '0');
                identificadorCedente += infoDetalhe.DvContaCorrente;
                detalhe = detalhe.PreencherValorNaLinha(18, 31, identificadorCedente);

                detalhe = detalhe.PreencherValorNaLinha(32, 37, string.Empty.PadLeft(6, ' '));
                detalhe = detalhe.PreencherValorNaLinha(38, 62, string.Empty.PadLeft(25, ' '));

                detalhe = detalhe.PreencherValorNaLinha(63, 71, infoDetalhe.NossoNumeroFormatado);
                detalhe = detalhe.PreencherValorNaLinha(72, 101, string.Empty.PadLeft(30, ' '));

                /*
                 * 0 = Isento
                 * 1 = 2%
                 * 2 = 4%
                 */
                detalhe = detalhe.PreencherValorNaLinha(102, 102, "0");

                /*00 = Real*/
                detalhe = detalhe.PreencherValorNaLinha(103, 104, "00");
                detalhe = detalhe.PreencherValorNaLinha(105, 105, string.Empty.PadLeft(1, ' '));

                if (infoDetalhe.NroDiasParaProtesto > 0 && segundaInstrucao?.Codigo == 10)
                {
                    detalhe = detalhe.PreencherValorNaLinha(106, 107, infoDetalhe.NroDiasParaProtesto.BoletoBrToStringSafe().PadLeft(2, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(106, 107, "00");
                }

                detalhe = detalhe.PreencherValorNaLinha(108, 108, infoDetalhe.CarteiraCobranca);

                detalhe = detalhe.PreencherValorNaLinha(109, 110,
                                                        infoDetalhe.CodigoOcorrencia.Codigo.BoletoBrToStringSafe().PadLeft(2, '0'));

                detalhe = detalhe.PreencherValorNaLinha(111, 120, infoDetalhe.NossoNumero.PadRight(10, ' '));

                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));

                #region VALOR BOLETO

                detalhe = detalhe.PreencherValorNaLinha(127, 139,
                                                        infoDetalhe.ValorBoleto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(13, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(140, 142, "422");
                detalhe = detalhe.PreencherValorNaLinha(143, 147, infoDetalhe.Agencia.PadRight(5, '0'));

                detalhe = detalhe.PreencherValorNaLinha(148, 149,
                                                        infoDetalhe.Especie.Sigla.Equals("DM") ? "01" : infoDetalhe.Especie.Codigo.ToString());

                detalhe = detalhe.PreencherValorNaLinha(150, 150, infoDetalhe.Aceite.Equals("A") ? "A" : "N");

                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));

                #region INSTRUÇÕES REMESSA

                if (primeiraInstrucao != null && primeiraInstrucao.Codigo > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, primeiraInstrucao.Codigo.BoletoBrToStringSafe().PadLeft(2, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, "00");
                }


                #endregion

                #region VALOR JUROS

                var jurosBoleto = string.Empty;

                if (infoDetalhe.ValorMoraDia > 0)
                {
                    var valorCobrarJuroDia = infoDetalhe.ValorBoleto * ((infoDetalhe.ValorMoraDia / 30) / 100);
                    infoDetalhe.ValorCobradoDiaAtraso = Math.Round(valorCobrarJuroDia, 2);
                }

                detalhe = detalhe.PreencherValorNaLinha(159, 160, infoDetalhe.ValorCobradoDiaAtraso > 0 ? "01" : "00");

                jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.BoletoBrToStringSafe().Replace(".", "").Replace(",", "");
                detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));

                #endregion

                #region VALOR DESCONTO / DATA LIMITE DESCONTO

                if (infoDetalhe.DataLimiteConcessaoDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179,
                                                            infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy"));
                }

                detalhe = detalhe.PreencherValorNaLinha(180, 192,
                                                        infoDetalhe.ValorDesconto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(13, '0'));

                #endregion

                #region VALOR IOF

                string iofBoleto;

                if (infoDetalhe.ValorIof.ToString().Contains('.') && infoDetalhe.ValorIof.ToString().Contains(','))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(".", "").Replace(",", "");
                    detalhe   = detalhe.PreencherValorNaLinha(193, 205, iofBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorIof.ToString().Contains('.'))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(".", "");
                    detalhe   = detalhe.PreencherValorNaLinha(193, 205, iofBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorIof.ToString().Contains(','))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(",", "");
                    detalhe   = detalhe.PreencherValorNaLinha(193, 205, iofBoleto.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(193, 205, infoDetalhe.ValorIof.ToString().PadLeft(13, '0'));

                #endregion

                #region PERCENTUAL MULTA

                // Percentual de multa
                if (infoDetalhe.PercentualMulta > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(206, 211,
                                                            infoDetalhe.DataVencimento.AddDays(1).ToString("ddMMyy"));

                    var multaBoleto = string.Empty;

                    multaBoleto = infoDetalhe.PercentualMulta.BoletoBrToStringSafe().Replace(".", "").Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(212, 215, multaBoleto.PadLeft(4, '0'));

                    //Informar instrução de Multa
                    if (infoDetalhe.PercentualMulta > 0)
                    {
                        if (primeiraInstrucao == null || primeiraInstrucao.Codigo == 0)
                        {
                            detalhe = detalhe.PreencherValorNaLinha(157, 158, "16"); //Instrução de Multa
                        }
                        else if (segundaInstrucao == null || segundaInstrucao.Codigo == 0)
                        {
                            detalhe = detalhe.PreencherValorNaLinha(159, 160, "16"); //Instrução de Multa
                        }
                    }

                    detalhe = detalhe.PreencherValorNaLinha(216, 218, "000");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(206, 218, string.Empty.PadLeft(13, '0'));
                }

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(219, 220,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11
                        ? "01"
                        : "02"); // Identificação do tipo de inscrição/sacado
                detalhe = detalhe.PreencherValorNaLinha(221, 234,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 274, nomeSacado);
                detalhe = detalhe.PreencherValorNaLinha(275, 314, enderecoSacado);
                detalhe = detalhe.PreencherValorNaLinha(315, 324, bairroSacado);

                detalhe = detalhe.PreencherValorNaLinha(325, 326, string.Empty.PadLeft(2, ' '));

                var cep = infoDetalhe.CepPagador;

                if (cep.Contains(".") && cep.Contains("-"))
                {
                    cep = cep.Replace(".", "").Replace("-", "");
                }
                if (cep.Contains("."))
                {
                    cep = cep.Replace(".", "");
                }
                if (cep.Contains("-"))
                {
                    cep = cep.Replace("-", "");
                }
                detalhe = detalhe.PreencherValorNaLinha(327, 334, cep.PadLeft(8, ' ')); // Cep do Sacado
                detalhe = detalhe.PreencherValorNaLinha(335, 349, cidadeSacado);
                detalhe = detalhe.PreencherValorNaLinha(350, 351,
                                                        infoDetalhe.UfPagador.Length > 2
                        ? infoDetalhe.UfPagador.Substring(0, 2)
                        : infoDetalhe.UfPagador.PadRight(2, ' '));

                #region Sacador Avalista / Mensagem

                // Caso não tenha sacador/avalista informar mensagem no campo
                if (infoDetalhe.NomeAvalistaOuMensagem2.BoletoBrToStringSafe().Trim().Length > 0)
                {
                    // Mensagem
                    if (primeiraInstrucao != null &&
                        primeiraInstrucao.Codigo.BoletoBrToStringSafe().BoletoBrToInt() == 0)
                    {
                        var instrucao1 = primeiraInstrucao.TextoInstrucao;
                        if (instrucao1.BoletoBrToStringSafe().Trim().Length > 30)
                        {
                            instrucao1 = instrucao1.ExtrairValorDaLinha(1, 30);
                        }

                        detalhe = detalhe.PreencherValorNaLinha(352, 381, instrucao1.PadRight(30, ' '));
                    }
                    else if (segundaInstrucao != null &&
                             segundaInstrucao.Codigo.BoletoBrToStringSafe().BoletoBrToInt() == 0)
                    {
                        var instrucao2 = segundaInstrucao.TextoInstrucao;
                        if (instrucao2.BoletoBrToStringSafe().Trim().Length > 30)
                        {
                            instrucao2 = instrucao2.ExtrairValorDaLinha(1, 30);
                        }

                        detalhe = detalhe.PreencherValorNaLinha(352, 381, instrucao2.PadRight(30, ' '));
                    }
                }
                else
                {
                    // Nome do Sacador ou Avalista
                    detalhe = detalhe.PreencherValorNaLinha(352, 381, string.Empty.PadLeft(30, ' '));/* SE HOUVER MENSAGENS ESPECÍFICAS, TÍTULO A TÍTULO, UTILIZAR CAMPO "SACADOR / AVALISTA" COMO MENSAGEM (SOMENTE AS 28 PRIMEIRAS POSIÇÕES). CASO DESEJE */
                }

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(382, 388, string.Empty.PadRight(7, ' '));

                detalhe = detalhe.PreencherValorNaLinha(389, 391, "422");

                detalhe = detalhe.PreencherValorNaLinha(392, 394,
                                                        sequenciaNumeroRemessa.BoletoBrToStringSafe().PadLeft(3, '0'));
                detalhe = detalhe.PreencherValorNaLinha(395, 400,
                                                        sequenciaRegistro.BoletoBrToStringSafe().PadLeft(6, '0'));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int numeroRegistro)
        {
            int identificadorMulta = 0;

            if (infoDetalhe.PercentualMulta > 0)
            {
                identificadorMulta = 4;
            }

            /* Códigos de Carteira
             * 1 - Eletrônica com registro
             * 3 - Caucionada eletrônica
             * 4 - Cobrança sem registro
             * 5 - Rápida com registro
             * 6 - Caucionada rápida
             * 7 - Descontada eletrônica
             */

            var codigoCarteira = string.Empty;

            if (infoDetalhe.CarteiraCobranca == "101")
            {
                if (infoDetalhe.BancoEmiteBoleto)
                {
                    codigoCarteira = "1";
                }
                else
                {
                    codigoCarteira = "5";
                }
            }
            if (infoDetalhe.CarteiraCobranca == "102")
            {
                codigoCarteira = "4";
            }

            string enderecoSacado = string.Empty;
            string bairroSacado   = string.Empty;
            string cidadeSacado   = string.Empty;

            string nomeSacado = string.Empty;

            if (String.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado = enderecoSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.EnderecoPagador.Length > 40)
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Substring(0, 40).ToUpper();
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.PadRight(40, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.BairroPagador))
            {
                bairroSacado = bairroSacado.PadRight(12, ' ');
            }
            else if (infoDetalhe.BairroPagador.Length > 12)
            {
                bairroSacado = infoDetalhe.BairroPagador.Substring(0, 12).ToUpper();
            }
            else
            {
                bairroSacado = infoDetalhe.BairroPagador.PadRight(12, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.CidadePagador))
            {
                cidadeSacado = cidadeSacado.PadRight(15, ' ');
            }
            else if (infoDetalhe.CidadePagador.Length > 15)
            {
                cidadeSacado = infoDetalhe.CidadePagador.Substring(0, 15).ToUpper();
            }
            else
            {
                cidadeSacado = infoDetalhe.CidadePagador.PadRight(15, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado = nomeSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.NomePagador.Length > 40)
            {
                nomeSacado = infoDetalhe.NomePagador.Substring(0, 40).ToUpper();
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.PadRight(40, ' ').ToUpper();
            }

            string complementoRegistro =
                infoDetalhe.ContaCorrente.Substring(infoDetalhe.ContaCorrente.Length - 1, 1) +
                infoDetalhe.DvContaCorrente;

            var detalhe = new string(' ', 400);

            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1");

                // 01 - CPF / 02 - CNPJ
                detalhe = detalhe.PreencherValorNaLinha(2, 3, infoDetalhe.InscricaoCedente.Length == 11 ? "01" : "02");
                detalhe = detalhe.PreencherValorNaLinha(4, 17, infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(18, 37, infoDetalhe.CodigoDeTransmissao.PadLeft(20, '0')); //Versão 2.0 do layout

                const string doc       = "DOC";
                var          seuNumero = doc + infoDetalhe.NossoNumeroFormatado.PadRight(25 - doc.Length, ' ');

                detalhe = detalhe.PreencherValorNaLinha(38, 62, seuNumero);

                // NossoNumero com DV, pegar os 8 primeiros dígitos, da direita para esquerda (para CNAB 400)
                detalhe = detalhe.PreencherValorNaLinha(63, 70, infoDetalhe.NossoNumeroFormatado.Replace("-", "").Substring(5, 8));

                if (infoDetalhe.DataLimiteConcessaoDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(71, 76, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(71, 76, infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy"));
                }

                detalhe = detalhe.PreencherValorNaLinha(77, 77, string.Empty.PadLeft(1, ' '));
                detalhe = detalhe.PreencherValorNaLinha(78, 78, identificadorMulta.ToString());

                if (String.IsNullOrEmpty(infoDetalhe.PercentualMulta.ToString()))
                {
                    detalhe = detalhe.PreencherValorNaLinha(79, 82, string.Empty.PadLeft(4, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(79, 82, infoDetalhe.PercentualMulta.ToString("f").Replace(",", "").PadLeft(4, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(83, 84, "00");
                detalhe = detalhe.PreencherValorNaLinha(85, 97, string.Empty.PadLeft(13, '0')); /*Vl do título em outra unidade (consultar banco)*/
                detalhe = detalhe.PreencherValorNaLinha(98, 101, string.Empty.PadLeft(4, ' '));

                detalhe = detalhe.PreencherValorNaLinha(102, 107, infoDetalhe.DataMulta.ToString("ddMMyy"));


                detalhe = detalhe.PreencherValorNaLinha(108, 108, codigoCarteira);
                detalhe = detalhe.PreencherValorNaLinha(109, 110, "01"); /* Código da Ocorrência*/
                detalhe = detalhe.PreencherValorNaLinha(111, 120, infoDetalhe.NumeroDocumento.PadRight(10, ' '));
                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));

                #region VALOR TOTAL

                detalhe = detalhe.PreencherValorNaLinha(127, 139, infoDetalhe.ValorBoleto.ToString("f").Replace(",", "").PadLeft(13, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(140, 142, "033");

                if (codigoCarteira == "5")
                {
                    detalhe = detalhe.PreencherValorNaLinha(143, 147, infoDetalhe.Agencia.PadLeft(5, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(143, 147, string.Empty.PadLeft(5, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(148, 149, infoDetalhe.Especie.Sigla.Equals("DM") ? "01" : infoDetalhe.Especie.Codigo.ToString().PadLeft(2, '0'));
                detalhe = detalhe.PreencherValorNaLinha(150, 150, "N");
                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));

                #region INSTRUÇÕES REMESSA

                var primeiraInstrucao = infoDetalhe.Instrucao1;
                var segundaInstrucao  = infoDetalhe.Instrucao2;

                if (primeiraInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, primeiraInstrucao);
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, "00");
                }

                if (segundaInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, segundaInstrucao);
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, "00");
                }

                #endregion

                #region JUROS

                var jurosPorDia = string.Empty;

                if (infoDetalhe.ValorMoraDia > 0)
                {
                    var valorCobrarJuroDia = infoDetalhe.ValorBoleto * ((infoDetalhe.ValorMoraDia / 30) / 100);
                    infoDetalhe.ValorMoraDia = Math.Round(valorCobrarJuroDia, 2);
                }

                if (infoDetalhe.ValorMoraDia.ToString().Contains('.') &&
                    infoDetalhe.ValorMoraDia.ToString().Contains(','))
                {
                    jurosPorDia = infoDetalhe.ValorMoraDia.ToString().Replace(".", "").Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosPorDia.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorMoraDia.ToString().Contains('.'))
                {
                    jurosPorDia = infoDetalhe.ValorMoraDia.ToString().Replace(".", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosPorDia.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorMoraDia.ToString().Contains(','))
                {
                    jurosPorDia = infoDetalhe.ValorMoraDia.ToString().Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosPorDia.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(161, 173, infoDetalhe.ValorMoraDia.ToString("f").Replace(",", "").PadLeft(13, '0'));

                #endregion

                #region DESCONTO

                if (infoDetalhe.DataDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, infoDetalhe.DataDesconto.ToString("ddMMyy"));
                }

                detalhe = detalhe.PreencherValorNaLinha(180, 192, infoDetalhe.ValorDesconto.ToString("f").Replace(",", "").PadLeft(13, '0'));

                #endregion

                #region IOF

                detalhe = detalhe.PreencherValorNaLinha(193, 205, infoDetalhe.ValorIof.ToString("f").Replace(",", "").PadLeft(13, '0'));

                #endregion

                #region ABATIMENTO

                detalhe = detalhe.PreencherValorNaLinha(206, 218, infoDetalhe.ValorAbatimento.ToString("f").Replace(",", "").PadLeft(13, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(219, 220, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11 ? "01" : "02");
                detalhe = detalhe.PreencherValorNaLinha(221, 234, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 274, nomeSacado);
                detalhe = detalhe.PreencherValorNaLinha(275, 314, enderecoSacado);
                detalhe = detalhe.PreencherValorNaLinha(315, 326, bairroSacado);

                #region CEP

                var Cep = infoDetalhe.CepPagador;

                if (Cep.Contains(".") && Cep.Contains("-"))
                {
                    Cep = Cep.Replace(".", "").Replace("-", "");
                }
                if (Cep.Contains("."))
                {
                    Cep = Cep.Replace(".", "");
                }
                if (Cep.Contains("-"))
                {
                    Cep = Cep.Replace("-", "");
                }

                if (Cep.Length > 8)
                {
                    throw new Exception("Cep inválido." + Cep);
                }

                detalhe = detalhe.PreencherValorNaLinha(327, 334, Cep.PadLeft(8, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(335, 349, cidadeSacado);
                detalhe = detalhe.PreencherValorNaLinha(350, 351, infoDetalhe.UfPagador.PadRight(2, ' '));

                if (String.IsNullOrEmpty(infoDetalhe.NomeAvalistaOuMensagem2))
                {
                    detalhe = detalhe.PreencherValorNaLinha(352, 381, string.Empty.PadRight(30, ' '));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(352, 381, infoDetalhe.NomeAvalistaOuMensagem2.PadRight(30, ' '));
                }

                detalhe = detalhe.PreencherValorNaLinha(382, 382, " ");
                detalhe = detalhe.PreencherValorNaLinha(383, 383, "i".ToUpper()); // Identificador do Complemento
                detalhe = detalhe.PreencherValorNaLinha(384, 385, complementoRegistro);
                detalhe = detalhe.PreencherValorNaLinha(386, 391, string.Empty.PadLeft(6, ' '));
                detalhe = detalhe.PreencherValorNaLinha(392, 393, infoDetalhe.NroDiasParaProtesto.ToString().PadLeft(2, '0'));
                detalhe = detalhe.PreencherValorNaLinha(394, 394, " ");

                detalhe = detalhe.PreencherValorNaLinha(395, 400, numeroRegistro.ToString().PadLeft(6, '0'));

                return(detalhe);
            }
            catch (ArgumentException e)
            {
                throw new ArgumentException(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                          Environment.NewLine), e);
            }
        }
示例#15
0
        public static string GerarArquivoRemessa(CarteiraBoleto carteiraBoleto, SacadoBoleto sacado, decimal valor,
                                                 DateTime dataVencimento, string numeroDocumento)
        {
            try
            {
                var listaBoletoBrRemessa           = new List <Boleto>();
                var sequenciaRemessaCarteiraBoleto = 1;

                try
                {
                    // Transforma boletos e adiciona lançamentos na lista
                    listaBoletoBrRemessa.Add(TransformaDeFormatoBoletoParaFormatoBoletoBr(carteiraBoleto, sacado,
                                                                                          valor, dataVencimento, numeroDocumento));
                }
                catch (Exception ex)
                {
                    throw ex;
                }

                #region Validações (Banco e Carteira)

                /* Garantir que todos os boletos pertencem a mesmo banco e carteira de boleto */
                var bancosEncontrados = listaBoletoBrRemessa.GroupBy(gb => gb.BancoBoleto.CodigoBanco);
                if (bancosEncontrados.Count() > 1)
                {
                    throw new Exception(
                              "Há mais de 1 banco associado aos boletos que foram informados para geração de remessa.");
                }

                var carteirasCobrancaEncontradas = listaBoletoBrRemessa.GroupBy(gb => gb.CarteiraCobranca.Codigo);
                if (carteirasCobrancaEncontradas.Count() > 1)
                {
                    throw new Exception(
                              "Há mais de 1 tipo de carteira de cobrança associado aos boletos que foram informados para geração de remessa.");
                }

                if (listaBoletoBrRemessa.Any(qry => qry.DataVencimento.Date < DateTime.Now.Date))
                {
                    throw new Exception(
                              "Há boletos com data de vencimento menor que a data atual. Impossível continuar.");
                }

                #endregion

                var carteiraCobrancaPadrao = listaBoletoBrRemessa.First().CarteiraCobranca;
                var boletoPadrao           = listaBoletoBrRemessa.First();

                var fabricaRemessa = new RemessaFactory();

                #region #Criação do Diretório e Arquivo.REM

                var    data         = $"{DateTime.Now.ToString("ddMMyy")}";
                var    dataBradesco = $"{DateTime.Now.ToString("ddMM")}";
                string nomeArquivo  = null;

                // Se for BRADESCO formata nome do arquivo para CBDDMM??.REM
                if (boletoPadrao.BancoBoleto.CodigoBanco == "237")
                {
                    nomeArquivo = $"{"CB"}{dataBradesco}{"TS"}{".REM"}";
                }
                else
                {
                    /*
                     * C -> Cobrança
                     * Data da geração em formato DDMMAA
                     * G -> Geral
                     */
                    nomeArquivo = $"{"C"}{data}{"G"}{".REM"}";
                }

                var dir = Directory.CreateDirectory(Path.Combine(
                                                        AppDomain.CurrentDomain.BaseDirectory,
                                                        boletoPadrao.BancoBoleto.CodigoBanco));

                var caminho = dir.FullName + "\\" + nomeArquivo;

                #endregion

                #region #Informações Essenciais

                /* Usado no Header do Arquivo
                 * Cada arquivo enviado a CAIXA deverá conter um número único.
                 */
                // TODO: Criar tabela para controlar quantidade de arquivos remessa enviados ao banco.
                const int sequencialArquivo = 1;

                /* Usado no Header de Lote
                 * Para cada remessa enviada deverá ser acrescido em 1, se a remessa for recusada a numeração não poderá ser aproveitada.
                 */
                // TODO: Criar tabela para controlar quantidade de arquivos remessa gerados.
                int sequencialRemessa = sequenciaRemessaCarteiraBoleto;

                /* Usado no Trailer de Lote
                 * Conta a quantidade de itens na lista multiplica por 2 ( cada boleto terá um detalhe segmento P e um detalhe segmento Q ) e adiciona + 2 (Header do Lote e Trailer do Lote)
                 */
                // TODO: Atualmente só considera 1 lote de informações no arquivo.
                var qtdRegistrosNoLote = (listaBoletoBrRemessa.Count * 2) + 2;

                /* Usado no Trailer do Arquivo */
                // TODO: Atualmente só gera 1 lote de informações no arquivo.
                const int qtdLotesArquivo = 1;

                // Conta a quantidade de itens na lista  multiplica por 2 ( cada boleto terá um detalhe segmento P e um detalhe segmento Q ) e adiciona + 4 (Header do Arquivo, Header do Lote, Trailer do Lote e Trailer do Arquivo)
                var qtdRegistrosNoArquivoCnab240 = (listaBoletoBrRemessa.Count * 2) + 4;

                // Conta a quantidade de itens na lista e adiciona + 2 (Header do Arquivo + Trailer do Arquivo)
                var qtdRegistrosNoArquivoCnab400 = listaBoletoBrRemessa.Count();
                qtdRegistrosNoArquivoCnab400 += 2;

                // Pega número de linhas de instruções de cada boleto
                // No caso do Bradesco desconsiderar a qtd de instruções
                // Itau desconsiderar
                // HSBC desconsiderar
                var qtdRegInstrucoes = 0;
                if (boletoPadrao.BancoBoleto.CodigoBanco != "237" &&
                    boletoPadrao.BancoBoleto.CodigoBanco != "341" &&
                    boletoPadrao.BancoBoleto.CodigoBanco != "399")
                {
                    qtdRegInstrucoes += listaBoletoBrRemessa.Sum(boleto => boleto.InstrucoesDoBoleto.Count);
                }

                Boleto primeiroBoletoDaLista = listaBoletoBrRemessa.First();

                #endregion

                #region CNAB240

                // Gera Remessa Cnab240
                if (carteiraCobrancaPadrao.Tipo == "CNAB240")
                {
                    var remessa = new RemessaCnab240
                    {
                        Header = new HeaderRemessaCnab240(primeiroBoletoDaLista, sequencialRemessa)
                    };

                    var loteRemessa = new LoteRemessaCnab240
                    {
                        HeaderLote  = new HeaderLoteRemessaCnab240(primeiroBoletoDaLista, sequencialRemessa),
                        TrailerLote = new TrailerLoteRemessaCnab240(qtdRegistrosNoLote)
                    };

                    remessa.Trailer = new TrailerRemessaCnab240(qtdLotesArquivo, qtdRegistrosNoArquivoCnab240);

                    var escritor = EscritorArquivoRemessaFactory.ObterEscritorRemessa(remessa);

                    var remessaPronta = fabricaRemessa.GerarRemessa(remessa.Header, loteRemessa.HeaderLote,
                                                                    listaBoletoBrRemessa, loteRemessa.TrailerLote, remessa.Trailer);

                    var linhasEscrever = escritor.EscreverTexto(remessaPronta);

                    // Escreve em UTF-8
                    File.WriteAllLines(caminho, linhasEscrever.ToArray(), Encoding.GetEncoding(1252));
                }

                #endregion

                #region CNAB400

                // Gera Remessa Cnab400
                if (carteiraCobrancaPadrao.Tipo == "CNAB400")
                {
                    var remessa = new RemessaCnab400
                    {
                        Header           = new HeaderRemessaCnab400(primeiroBoletoDaLista, sequencialRemessa, 1),
                        RegistrosDetalhe = new List <DetalheRemessaCnab400>(),
                        Trailer          = new TrailerRemessaCnab400(listaBoletoBrRemessa.Sum(s => s.ValorBoleto),
                                                                     qtdRegistrosNoArquivoCnab400 + qtdRegInstrucoes)
                    };

                    var escritor = EscritorArquivoRemessaFactory.ObterEscritorRemessa(remessa);

                    var sequencial = 2;
                    DetalheRemessaCnab400 detalhe;

                    foreach (var boletoRemessa400 in listaBoletoBrRemessa)
                    {
                        detalhe = new DetalheRemessaCnab400(boletoRemessa400, sequencial);
                        remessa.RegistrosDetalhe.Add(detalhe);
                        sequencial++;
                    }

                    var remessaPronta = fabricaRemessa.GerarRemessa(remessa.Header, listaBoletoBrRemessa,
                                                                    remessa.RegistrosDetalhe, remessa.Trailer);
                    var linhasEscrever         = escritor.EscreverTexto(remessaPronta);
                    var linhasTratadasEscrever = new List <string>();
                    foreach (var linha in linhasEscrever)
                    {
                        /*/
                         * -> Codificação ASCII 8-bit (Estendido)
                         * Encoding.GetEncoding(437)
                         *
                         * -> Codificação ASCII 7-bit
                         * Encoding.GetEncoding(1252)
                         *
                         * /*/

                        if (boletoPadrao.BancoBoleto.CodigoBanco == "756")
                        {
                            var bytes           = System.Text.Encoding.Default.GetBytes(linha);
                            var linhaConvertida = System.Text.Encoding.Default.GetString(bytes);

                            var linhaTratada = linhaConvertida;

                            linhasTratadasEscrever.Add(linhaTratada);
                        }
                        else
                        {
                            var bytes           = System.Text.Encoding.GetEncoding("iso-8859-8").GetBytes(linha);
                            var linhaConvertida = System.Text.Encoding.UTF8.GetString(bytes);

                            var linhaTratada = linhaConvertida;

                            linhasTratadasEscrever.Add(linhaTratada);
                        }
                    }

                    if (boletoPadrao.BancoBoleto.CodigoBanco == "756")
                    {
                        File.WriteAllLines(caminho, linhasTratadasEscrever, Encoding.Default);
                    }
                    else
                    {
                        File.WriteAllLines(caminho, linhasTratadasEscrever);
                    }
                }

                #endregion

                return(caminho);
            }
            catch (Exception)
            {
                throw;
            }
        }
示例#16
0
        public void TestGerarHeaderArquivoRemessaDaycovalCnab400()
        {
            var dadosRemessa = new Remessa(Remessa.EnumTipoAmbiemte.Homologacao, EnumCodigoOcorrenciaRemessa.Registro,
                                           "2");

            var banco = Fabricas.BancoFactory.ObterBanco("707", "2");
            var contaBancariaCedente = new ContaBancaria("1001", "1", "2002", "1");
            var cedente = new Cedente("", "190658906300", 0, "99.999.999/9999-99", "Razao Social X",
                                      contaBancariaCedente,
                                      null);

            var sacado = new Sacado("Sacado Fulano de Tal", "99.999.999/9999-99", new Endereco()
            {
                TipoLogradouro = "R",
                Logradouro     = "1",
                Bairro         = "Bairro X",
                Cidade         = "Cidade X",
                SiglaUf        = "XX",
                Cep            = "12345-000",
                Complemento    = "Comp X",
                Numero         = "9"
            });

            var carteira = new CarteiraCobranca {
                Codigo = "3"
            };
            var boleto = new Boleto(carteira, cedente, sacado, dadosRemessa)
            {
                NumeroDocumento            = "1001",
                ValorBoleto                = Convert.ToDecimal(255),
                IdentificadorInternoBoleto = "1001",
                DataVencimento             = new DateTime(2017, 10, 20),
                Especie                 = banco.ObtemEspecieDocumento(EnumEspecieDocumento.DuplicataMercantil),
                BancoBoleto             = banco,
                CodigoOcorrenciaRemessa = new CodigoOcorrencia(01)
            };

            banco.FormatarBoleto(boleto);

            var remessa = new RemessaCnab400();

            remessa.Header = new HeaderRemessaCnab400(boleto, 1, 1);
            var detalheIndividual = new DetalheRemessaCnab400(boleto, 1);

            remessa.RegistrosDetalhe = new List <DetalheRemessaCnab400>
            {
                detalheIndividual
            };

            remessa.Trailer = new TrailerRemessaCnab400(1, 1);

            var escritor       = new EscritorRemessaCnab400Daycoval(remessa);
            var linhasEscrever = escritor.EscreverTexto(remessa);
            var path           = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            var data           = String.Format("{0}_{1}", DateTime.Now.ToString("ddMMyyyy"), DateTime.Now.ToString("HHmmss"));
            var nomeArquivo    = string.Format("{0}{1}{2}{3}", banco.CodigoBanco, @"_REMESSA_", data, ".txt");

            StringBuilder sb = new StringBuilder();

            foreach (var linha in linhasEscrever)
            {
                sb.AppendLine(linha);
            }

            Assert.AreEqual(linhasEscrever[0],
                            "01REMESSA01COBRANÇA       190658906300        Razao Social X                707BANCO DAYCOVAL 201017                                                                                                                                                                                                                                                                                                      000001");
        }
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int sequenciaRegistro)
        {
            if (infoDetalhe == null)
            {
                throw new Exception("Não há boleto para geração do DETALHE");
            }

            #region Dados Sacado

            string enderecoSacado = string.Empty;
            string bairroSacado   = string.Empty;
            string cidadeSacado   = string.Empty;
            string nomeSacado     = string.Empty;

            if (string.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.EnderecoPagador.Length > 40)
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Substring(0, 40).ToUpper();
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.PadRight(40, ' ').ToUpper();
            }

            if (string.IsNullOrEmpty(infoDetalhe.BairroPagador))
            {
                bairroSacado = bairroSacado.PadRight(12, ' ');
            }
            else if (infoDetalhe.BairroPagador.Length > 12)
            {
                bairroSacado = infoDetalhe.BairroPagador.Substring(0, 12);
            }
            else
            {
                bairroSacado = infoDetalhe.BairroPagador.PadRight(12, ' ');
            }

            if (string.IsNullOrEmpty(infoDetalhe.CidadePagador))
            {
                cidadeSacado = cidadeSacado.PadRight(15, ' ');
            }
            else if (infoDetalhe.CidadePagador.Length > 15)
            {
                cidadeSacado = infoDetalhe.CidadePagador.Substring(0, 15);
            }
            else
            {
                cidadeSacado = infoDetalhe.CidadePagador.PadRight(15, ' ');
            }

            if (string.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.NomePagador.Length > 40)
            {
                nomeSacado = infoDetalhe.NomePagador.Substring(0, 40).ToUpper();
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.PadRight(40, ' ').ToUpper();
            }

            #endregion

            var detalhe = new string(' ', 400);
            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1");

                detalhe = detalhe.PreencherValorNaLinha(2, 3, infoDetalhe.InscricaoCedente.BoletoBrToStringSafe().Replace(".", "").Replace("-", "").Length == 11 ? "01" : "02");

                detalhe = detalhe.PreencherValorNaLinha(4, 17,
                                                        infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").PadRight(14, ' '));


                var identificadorCedente = $"{infoDetalhe.ContaCorrente}{infoDetalhe.DvContaCorrente}";
                if (identificadorCedente.Length > 11)
                {
                    identificadorCedente = identificadorCedente.ExtrairValorDaLinha(1, 9);
                }
                else
                {
                    identificadorCedente = identificadorCedente.PadLeft(11, '0');
                }

                detalhe = detalhe.PreencherValorNaLinha(18, 28, identificadorCedente);

                detalhe = detalhe.PreencherValorNaLinha(29, 37, string.Empty.PadLeft(9, ' '));
                detalhe = detalhe.PreencherValorNaLinha(38, 62, string.Empty.PadLeft(25, ' '));

                detalhe = detalhe.PreencherValorNaLinha(63, 72, infoDetalhe.NossoNumeroFormatado.BoletoBrToStringSafe().Replace(".", "").Replace("-", "").PadLeft(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(73, 73, "1"); /*0 - R$ | 1 - %*/
                #region PERCENTUAL MULTA

                // Percentual de multa
                if (infoDetalhe.PercentualMulta > 0)
                {
                    var multaBoleto = infoDetalhe.PercentualMulta.BoletoBrToStringSafe().Replace(".", "").Replace(",", "");
                    detalhe = detalhe.PreencherValorNaLinha(74, 82, multaBoleto.PadLeft(9, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(74, 82, string.Empty.PadLeft(9, '0'));
                }

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(83, 88, string.Empty.PadLeft(6, '0'));
                detalhe = detalhe.PreencherValorNaLinha(89, 90, string.Empty.PadLeft(2, '0'));
                detalhe = detalhe.PreencherValorNaLinha(91, 92, string.Empty.PadLeft(2, '0'));

                detalhe = detalhe.PreencherValorNaLinha(93, 93, infoDetalhe.InscricaoPagador.BoletoBrToStringSafe().Replace(".", "").Replace("-", "").Length == 11 ? "1" : "2");
                detalhe = detalhe.PreencherValorNaLinha(94, 107, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));

                detalhe = detalhe.PreencherValorNaLinha(108, 108, infoDetalhe.CarteiraCobranca == "11" ? "1" : "3");/*1 - simples | 3- Caucionada*/
                detalhe = detalhe.PreencherValorNaLinha(109, 110, infoDetalhe.CodigoOcorrencia.Codigo.BoletoBrToStringSafe().PadLeft(2, '0'));

                detalhe = detalhe.PreencherValorNaLinha(111, 120, infoDetalhe.NumeroDocumento.BoletoBrToStringSafe().PadRight(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));


                detalhe = detalhe.PreencherValorNaLinha(127, 129, string.Empty.PadLeft(3, '0'));
                detalhe = detalhe.PreencherValorNaLinha(130, 139, infoDetalhe.ValorBoleto.ToStringParaVoloresDecimais().PadLeft(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(140, 142, "021");

                detalhe = detalhe.PreencherValorNaLinha(143, 147, infoDetalhe.BancoEmiteBoleto ? string.Empty.PadLeft(5, '0') : "00501"); /*00501 - envio pelo cliente | 00000 - envio pelo banco*/
                detalhe = detalhe.PreencherValorNaLinha(148, 149, "01");                                                                  /*01 - Duplicata- impressa pelo cliente - Embora setado essa opção, em caso de divergência prevalece as posições 01 a 20 que informam os dados do contrato do cliente*/

                detalhe = detalhe.PreencherValorNaLinha(150, 150, infoDetalhe.Aceite != "N" && infoDetalhe.Aceite != "A" ? "N" : infoDetalhe.Aceite);

                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));

                detalhe = detalhe.PreencherValorNaLinha(157, 158, infoDetalhe.NroDiasParaProtesto > 0 ? "P6" : "P7");
                detalhe = detalhe.PreencherValorNaLinha(159, 160, infoDetalhe.NroDiasParaProtesto > 0 ? infoDetalhe.NroDiasParaProtesto.BoletoBrToStringSafe().PadLeft(2, '0') : "00");
                detalhe = detalhe.PreencherValorNaLinha(161, 161, "0");
                detalhe = detalhe.PreencherValorNaLinha(162, 173, infoDetalhe.ValorMoraDia.ToStringParaVoloresDecimais().PadLeft(12, '0'));

                var dataLimiteDesconto = infoDetalhe.DataLimiteConcessaoDesconto == DateTime.MinValue ? "000000": infoDetalhe
                                         .DataLimiteConcessaoDesconto.ToString("ddMMyy");

                detalhe = detalhe.PreencherValorNaLinha(174, 179, dataLimiteDesconto);
                detalhe = detalhe.PreencherValorNaLinha(180, 192, infoDetalhe.ValorDesconto.ToStringParaVoloresDecimais().PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(193, 205, infoDetalhe.ValorIof.ToStringParaVoloresDecimais().PadLeft(13, '0')); /*!---!*/
                detalhe = detalhe.PreencherValorNaLinha(206, 218, infoDetalhe.ValorAbatimento.ToStringParaVoloresDecimais().PadLeft(13, '0'));


                detalhe = detalhe.PreencherValorNaLinha(219, 220, infoDetalhe.InscricaoPagador.BoletoBrToStringSafe().Replace(".", "").Replace("-", "").Length == 11 ? "01" : "02");
                detalhe = detalhe.PreencherValorNaLinha(221, 234, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 274, nomeSacado);
                detalhe = detalhe.PreencherValorNaLinha(275, 314, enderecoSacado);
                detalhe = detalhe.PreencherValorNaLinha(315, 326, bairroSacado);
                detalhe = detalhe.PreencherValorNaLinha(327, 334, infoDetalhe.CepPagador.PadRight(8, ' '));
                detalhe = detalhe.PreencherValorNaLinha(335, 349, cidadeSacado);
                detalhe = detalhe.PreencherValorNaLinha(350, 351, infoDetalhe.UfPagador.PadRight(2, ' '));

                var instrucao = "";
                foreach (var inst in infoDetalhe.Instrucoes)
                {
                    if (instrucao == "")
                    {
                        instrucao = inst.TextoInstrucao;
                    }
                    else
                    {
                        instrucao += $@" {inst.TextoInstrucao}";
                    }
                }
                if (instrucao.Length > 40)
                {
                    instrucao = instrucao.Substring(0, 40);
                }

                detalhe = detalhe.PreencherValorNaLinha(352, 391, instrucao.PadRight(40, ' '));
                detalhe = detalhe.PreencherValorNaLinha(392, 393, "00");
                detalhe = detalhe.PreencherValorNaLinha(394, 394, "0");
                detalhe = detalhe.PreencherValorNaLinha(395, 400, sequenciaRegistro.BoletoBrToStringSafe().PadLeft(6, '0'));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
示例#18
0
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int sequenciaDetalhe)
        {
            if (String.IsNullOrEmpty(infoDetalhe.BairroPagador))
            {
                throw new Exception("Não foi informado o bairro do pagador " + infoDetalhe.NomePagador + "(" +
                                    infoDetalhe.InscricaoPagador + ")");
            }

            if (String.IsNullOrEmpty(infoDetalhe.CepPagador) || infoDetalhe.CepPagador.Length < 8)
            {
                throw new Exception("CEP Inválido! Verifique o CEP do pagador " + infoDetalhe.NomePagador + "(" +
                                    infoDetalhe.InscricaoPagador + ")");
            }

            #region Variáveis

            string enderecoSacado = string.Empty;
            string bairroSacado   = string.Empty;
            string cidadeSacado   = string.Empty;

            string nomeSacado = string.Empty;

            #endregion

            if (String.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado.PadRight(37, ' ');
            }
            else if (infoDetalhe.EnderecoPagador.Length > 37)
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Substring(0, 37).ToUpper();
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.PadRight(37, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.BairroPagador))
            {
                bairroSacado.PadRight(15, ' ');
            }
            else if (infoDetalhe.BairroPagador.Length > 15)
            {
                bairroSacado = infoDetalhe.BairroPagador.Substring(0, 15).ToUpper();
            }
            else
            {
                bairroSacado = infoDetalhe.BairroPagador.PadRight(15, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.CidadePagador))
            {
                cidadeSacado.PadRight(15, ' ');
            }
            else if (infoDetalhe.CidadePagador.Length > 15)
            {
                cidadeSacado = infoDetalhe.CidadePagador.Substring(0, 15).ToUpper();
            }
            else
            {
                cidadeSacado = infoDetalhe.CidadePagador.PadRight(15, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado.PadRight(30, ' ');
            }
            else if (infoDetalhe.NomePagador.Length > 30)
            {
                nomeSacado = infoDetalhe.NomePagador.Substring(0, 30).ToUpper();
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.PadRight(30, ' ').ToUpper();
            }

            var detalhe = new string(' ', 400);
            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1");
                detalhe = detalhe.PreencherValorNaLinha(2, 3,
                                                        infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11
                        ? "01"
                        : "02");
                detalhe = detalhe.PreencherValorNaLinha(4, 17,
                                                        infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", ""));

                detalhe = detalhe.PreencherValorNaLinha(18, 21, infoDetalhe.Agencia.PadLeft(4, '0'));
                detalhe = detalhe.PreencherValorNaLinha(22, 22, infoDetalhe.DvAgencia.PadRight(1, '0'));
                detalhe = detalhe.PreencherValorNaLinha(23, 30, infoDetalhe.ContaCorrente.PadLeft(8, '0'));
                detalhe = detalhe.PreencherValorNaLinha(31, 31, infoDetalhe.DvContaCorrente.PadRight(1, '0'));
                detalhe = detalhe.PreencherValorNaLinha(32, 37, string.Empty.PadRight(6, '0'));

                detalhe = detalhe.PreencherValorNaLinha(38, 62, string.Empty.PadRight(25, ' '));

                detalhe = detalhe.PreencherValorNaLinha(63, 74, infoDetalhe.NossoNumeroFormatado.Replace("-", "").PadLeft(12, '0'));
                detalhe = detalhe.PreencherValorNaLinha(75, 76, "01");
                detalhe = detalhe.PreencherValorNaLinha(77, 78, "00");
                detalhe = detalhe.PreencherValorNaLinha(79, 81, string.Empty.PadRight(3, ' '));
                detalhe = detalhe.PreencherValorNaLinha(82, 82, string.Empty.PadRight(1, ' '));
                detalhe = detalhe.PreencherValorNaLinha(83, 85, string.Empty.PadRight(3, ' '));
                detalhe = detalhe.PreencherValorNaLinha(86, 88, "000");
                detalhe = detalhe.PreencherValorNaLinha(89, 89, "0");

                /* CARTEIRA 01 */
                detalhe = detalhe.PreencherValorNaLinha(90, 94, string.Empty.PadRight(5, '0'));
                detalhe = detalhe.PreencherValorNaLinha(95, 95, "0");

                detalhe = detalhe.PreencherValorNaLinha(96, 101, string.Empty.PadRight(6, '0'));
                detalhe = detalhe.PreencherValorNaLinha(102, 105, string.Empty.PadRight(4, ' '));

                if (infoDetalhe.BancoEmiteBoleto)
                {
                    detalhe = detalhe.PreencherValorNaLinha(106, 106, "1");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(106, 106, "2");
                }

                var carteira = infoDetalhe.CarteiraCobranca.Replace("/", "").Replace("-", "");
                if (carteira.Length >= 3)
                {
                    carteira = carteira.ExtrairValorDaLinha(2, 3);
                }
                detalhe = detalhe.PreencherValorNaLinha(107, 108, carteira.PadLeft(2, '0'));

                detalhe = detalhe.PreencherValorNaLinha(109, 110,
                                                        infoDetalhe.CodigoOcorrencia.Codigo.ToString().PadLeft(2, '0'));

                detalhe = detalhe.PreencherValorNaLinha(111, 120, infoDetalhe.NumeroDocumento.PadRight(10, ' '));
                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));
                detalhe = detalhe.PreencherValorNaLinha(127, 139,
                                                        infoDetalhe.ValorBoleto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(140, 142, "756");

                detalhe = detalhe.PreencherValorNaLinha(143, 146, infoDetalhe.Agencia.PadLeft(4, '0'));
                detalhe = detalhe.PreencherValorNaLinha(147, 147, infoDetalhe.DvAgencia.PadRight(1, '0'));

                detalhe = detalhe.PreencherValorNaLinha(148, 149,
                                                        infoDetalhe.Especie.Sigla.Equals("DM") ? "01" : infoDetalhe.Especie.Codigo.ToString());

                if (infoDetalhe.Aceite == "S")
                {
                    detalhe = detalhe.PreencherValorNaLinha(150, 150, "1");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(150, 150, "0");
                }

                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));

                #region INSTRUÇÕES REMESSA

                var primeiraInstrucao = infoDetalhe.Instrucoes.FirstOrDefault();
                var segundaInstrucao  = infoDetalhe.Instrucoes.LastOrDefault();

                if (primeiraInstrucao != null && primeiraInstrucao.Codigo.BoletoBrToStringSafe().Length == 2)
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, primeiraInstrucao.Codigo.ToString());
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, "00"); //IMPRIME MENSAGEM DO TRAILER
                }
                if (segundaInstrucao != null && segundaInstrucao.Codigo.BoletoBrToStringSafe().Length == 2)
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, segundaInstrucao.Codigo.ToString());
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, "00"); //IMPRIME MENSAGEM DO TRAILER
                }
                #endregion

                //SICOOB TRABALHA COM 4 CASAS DECIMAIS - Marcos Eduardo - 21/09/2017
                detalhe = detalhe.PreencherValorNaLinha(161, 166,
                                                        infoDetalhe.ValorMoraDia.ToString("F4").Replace(",", "").PadLeft(6, '0'));

                //SICOOB TRABALHA COM 4 CASAS DECIMAIS - Marcos Eduardo - 21/09/2017
                detalhe = detalhe.PreencherValorNaLinha(167, 172,
                                                        infoDetalhe.PercentualMulta.ToString("F4").Replace(",", "").PadLeft(6, '0'));

                if (infoDetalhe.BancoEmiteBoleto)
                {
                    detalhe = detalhe.PreencherValorNaLinha(173, 173, "1");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(173, 173, "2");
                }

                if (infoDetalhe.DataLimiteConcessaoDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy"));
                }

                detalhe = detalhe.PreencherValorNaLinha(180, 192,
                                                        infoDetalhe.ValorDesconto.ToString().Replace(",", "").PadLeft(13, '0'));

                if (infoDetalhe.Moeda == "9" || infoDetalhe.Moeda == "09" || infoDetalhe.Moeda == "R$" ||
                    infoDetalhe.Moeda == "REAL")
                {
                    detalhe = detalhe.PreencherValorNaLinha(193, 193, "9");
                }

                detalhe = detalhe.PreencherValorNaLinha(194, 205,
                                                        infoDetalhe.ValorIof.ToString().Replace(",", "").PadLeft(12, '0'));

                /* ABATIMENTO (NÃO ENVIAR 0,00 NEM VALOR TOTAL) */
                //if (infoDetalhe.ValorAbatimento == 0)
                //    infoDetalhe.ValorAbatimento = Math.Round(infoDetalhe.ValorBoleto * (90M / 100M), 2);

                detalhe = detalhe.PreencherValorNaLinha(206, 218,
                                                        infoDetalhe.ValorAbatimento.ToString().Replace(",", "").Replace(".", "").PadLeft(13, '0'));

                detalhe = detalhe.PreencherValorNaLinha(219, 220,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11
                        ? "01"
                        : "02");
                detalhe = detalhe.PreencherValorNaLinha(221, 234,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 274, nomeSacado.PadRight(40, ' '));

                detalhe = detalhe.PreencherValorNaLinha(275, 311, enderecoSacado.PadRight(37, ' '));
                detalhe = detalhe.PreencherValorNaLinha(312, 326, bairroSacado.PadRight(15, ' '));

                var Cep = infoDetalhe.CepPagador;

                if (Cep.Contains("."))
                {
                    Cep = Cep.Replace(".", "");
                }
                if (Cep.Contains("-"))
                {
                    Cep = Cep.Replace("-", "");
                }

                detalhe = detalhe.PreencherValorNaLinha(327, 334, Cep);
                detalhe = detalhe.PreencherValorNaLinha(335, 349, cidadeSacado.PadRight(15, ' '));
                detalhe = detalhe.PreencherValorNaLinha(350, 351, infoDetalhe.UfPagador.PadRight(2, ' '));

                if (infoDetalhe.NomeAvalistaOuMensagem2.BoletoBrToStringSafe().Trim().Length > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(352, 391, infoDetalhe.NomeAvalistaOuMensagem2.BoletoBrToStringSafe().PadRight(40, ' '));
                }
                else
                {
                    if (primeiraInstrucao != null && primeiraInstrucao.Codigo == 0)
                    {
                        var instrucao = primeiraInstrucao.TextoInstrucao.BoletoBrToStringSafe();
                        if (instrucao.Trim().Length > 40)
                        {
                            instrucao = instrucao.ExtrairValorDaLinha(1, 40);
                        }

                        detalhe = detalhe.PreencherValorNaLinha(352, 391, instrucao.PadRight(40, ' '));
                    }
                    else if (segundaInstrucao != null && segundaInstrucao.Codigo == 0)
                    {
                        var instrucao = segundaInstrucao.TextoInstrucao.BoletoBrToStringSafe();
                        if (instrucao.Trim().Length > 40)
                        {
                            instrucao = instrucao.ExtrairValorDaLinha(1, 40);
                        }

                        detalhe = detalhe.PreencherValorNaLinha(352, 391, instrucao.PadRight(40, ' '));
                    }
                }

                detalhe = detalhe.PreencherValorNaLinha(392, 393, "00");

                detalhe = detalhe.PreencherValorNaLinha(394, 394, string.Empty.PadRight(1, ' '));
                detalhe = detalhe.PreencherValorNaLinha(395, 400, sequenciaDetalhe.ToString().PadLeft(6, '0'));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
示例#19
0
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int sequenciaRegistro,
                                      int sequenciaNumeroRemessa)
        {
            if (infoDetalhe == null)
            {
                throw new Exception("Não há boleto para geração do DETALHE");
            }

            #region Dados Sacado

            string enderecoSacado = string.Empty;
            string bairroSacado   = string.Empty;
            string cidadeSacado   = string.Empty;
            string nomeSacado     = string.Empty;

            if (string.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.EnderecoPagador.Length > 40)
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Substring(0, 40).ToUpper();
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.PadRight(40, ' ').ToUpper();
            }

            if (string.IsNullOrEmpty(infoDetalhe.BairroPagador))
            {
                bairroSacado = bairroSacado.PadRight(12, ' ');
            }
            else if (infoDetalhe.BairroPagador.Length > 12)
            {
                bairroSacado = infoDetalhe.BairroPagador.Substring(0, 12);
            }
            else
            {
                bairroSacado = infoDetalhe.BairroPagador.PadRight(12, ' ');
            }

            if (string.IsNullOrEmpty(infoDetalhe.CidadePagador))
            {
                cidadeSacado = cidadeSacado.PadRight(15, ' ');
            }
            else if (infoDetalhe.CidadePagador.Length > 15)
            {
                cidadeSacado = infoDetalhe.CidadePagador.Substring(0, 15);
            }
            else
            {
                cidadeSacado = infoDetalhe.CidadePagador.PadRight(15, ' ');
            }

            if (string.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado.PadRight(30, ' ');
            }
            else if (infoDetalhe.NomePagador.Length > 30)
            {
                nomeSacado = infoDetalhe.NomePagador.Substring(0, 30).ToUpper();
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.PadRight(30, ' ').ToUpper();
            }

            #endregion

            var detalhe = new string(' ', 400);
            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1");

                if (infoDetalhe.InscricaoCedente.ToString().Replace(".", "").Replace("-", "").Length == 11)
                {
                    detalhe = detalhe.PreencherValorNaLinha(2, 3, "01");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(2, 3, "02");
                }

                detalhe = detalhe.PreencherValorNaLinha(4, 17,
                                                        infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").PadRight(14, ' '));

                detalhe = detalhe.PreencherValorNaLinha(18, 37, infoDetalhe.Convenio.PadRight(20, ' '));
                detalhe = detalhe.PreencherValorNaLinha(38, 62, infoDetalhe.NumeroDocumento.PadLeft(25, ' '));
                detalhe = detalhe.PreencherValorNaLinha(63, 70, string.Empty.PadLeft(8, '0'));

                detalhe = detalhe.PreencherValorNaLinha(84, 107, string.Empty.PadLeft(24, ' '));

                /*
                 * 3 Cobrança com determinação do cobrador pos. 140-142.
                 * 4 N/Número do Banco Cobrador deve vir nas posições 71 a 83.
                 * Nesta Carteira, o Cliente envia o Título para Nosso Banco, já
                 * com o Nosso Número do Correspondente e o seu DV, calculado.
                 * O Campo deve ocupar 13 posições, com zeros à esquerda.
                 */
                if (infoDetalhe.CarteiraCobranca == "3")
                {
                    /* NOSSONUMERO */
                    detalhe = detalhe.PreencherValorNaLinha(71, 83, string.Empty.PadLeft(13, ' '));
                    detalhe = detalhe.PreencherValorNaLinha(108, 108, infoDetalhe.CarteiraCobranca);
                }
                else if (infoDetalhe.CarteiraCobranca == "4")
                {
                    /* NOSSONUMERO */
                    detalhe = detalhe.PreencherValorNaLinha(71, 83, infoDetalhe.NossoNumeroFormatado.PadLeft(13, '0'));
                    detalhe = detalhe.PreencherValorNaLinha(108, 108, infoDetalhe.CarteiraCobranca);
                }
                else
                {
                    throw new Exception("Carteira inválida. Informe carteira 3 ou 4.");
                }

                detalhe = detalhe.PreencherValorNaLinha(109, 110,
                                                        infoDetalhe.CodigoOcorrencia.Codigo.BoletoBrToStringSafe().PadLeft(2, '0'));
                detalhe = detalhe.PreencherValorNaLinha(111, 120, infoDetalhe.NossoNumero.PadRight(10, ' '));

                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));

                #region VALOR BOLETO

                detalhe = detalhe.PreencherValorNaLinha(127, 139,
                                                        infoDetalhe.ValorBoleto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(13, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(140, 142, "707");
                detalhe = detalhe.PreencherValorNaLinha(143, 146, string.Empty.PadLeft(4, '0'));
                detalhe = detalhe.PreencherValorNaLinha(147, 147, string.Empty.PadLeft(1, '0'));
                detalhe = detalhe.PreencherValorNaLinha(148, 149,
                                                        infoDetalhe.Especie.Sigla.Equals("DM") ? "01" : infoDetalhe.Especie.Codigo.ToString());
                detalhe = detalhe.PreencherValorNaLinha(150, 150, infoDetalhe.Aceite.Equals("A") ? "A" : "N");
                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));
                detalhe = detalhe.PreencherValorNaLinha(157, 158, "00");
                detalhe = detalhe.PreencherValorNaLinha(159, 160, "00");

                #region VALOR JUROS

                var jurosBoleto = string.Empty;

                if (infoDetalhe.ValorMoraDia > 0)
                {
                    var valorCobrarJuroDia = infoDetalhe.ValorBoleto * ((infoDetalhe.ValorMoraDia / 30) / 100);
                    infoDetalhe.ValorCobradoDiaAtraso = Math.Round(valorCobrarJuroDia, 2);
                }

                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains('.') &&
                    infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains(','))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(".", "").Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains('.'))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(".", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains(','))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));

                #endregion

                #region VALOR DESCONTO / DATA LIMITE DESCONTO

                if (infoDetalhe.DataLimiteConcessaoDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179,
                                                            infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy"));
                }

                detalhe = detalhe.PreencherValorNaLinha(180, 192,
                                                        infoDetalhe.ValorDesconto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(13, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(193, 218, string.Empty.PadLeft(26, '0'));

                detalhe = detalhe.PreencherValorNaLinha(219, 220,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11
                        ? "01"
                        : "02"); // Identificação do tipo de inscrição/sacado
                detalhe = detalhe.PreencherValorNaLinha(221, 234,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 264, nomeSacado);
                detalhe = detalhe.PreencherValorNaLinha(265, 274, string.Empty.PadLeft(10, ' '));
                detalhe = detalhe.PreencherValorNaLinha(275, 314, enderecoSacado);
                detalhe = detalhe.PreencherValorNaLinha(315, 326, bairroSacado);

                var cep = infoDetalhe.CepPagador;

                if (cep.Contains(".") && cep.Contains("-"))
                {
                    cep = cep.Replace(".", "").Replace("-", "");
                }
                if (cep.Contains("."))
                {
                    cep = cep.Replace(".", "");
                }
                if (cep.Contains("-"))
                {
                    cep = cep.Replace("-", "");
                }
                detalhe = detalhe.PreencherValorNaLinha(327, 334, cep.PadLeft(8, ' ')); // Cep do Sacado
                detalhe = detalhe.PreencherValorNaLinha(335, 349, cidadeSacado);
                detalhe = detalhe.PreencherValorNaLinha(350, 351,
                                                        infoDetalhe.UfPagador.Length > 2
                        ? infoDetalhe.UfPagador.Substring(0, 2)
                        : infoDetalhe.UfPagador.PadRight(2, ' '));

                #region Sacador Avalista

                var nomeEmpresa = string.Empty;
                if (infoDetalhe.RazaoContaCorrente.Length > 30)
                {
                    nomeEmpresa = infoDetalhe.RazaoContaCorrente.Substring(0, 30);
                }
                else
                {
                    nomeEmpresa = infoDetalhe.RazaoContaCorrente.PadRight(30, ' ');
                }

                // Nome do Sacador ou Avalista
                detalhe = detalhe.PreencherValorNaLinha(352, 381, nomeEmpresa);

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(382, 385, string.Empty.PadRight(4, ' '));
                detalhe = detalhe.PreencherValorNaLinha(386, 391, string.Empty.PadRight(6, ' '));
                detalhe = detalhe.PreencherValorNaLinha(392, 393, string.Empty.PadRight(2, '0'));
                detalhe = detalhe.PreencherValorNaLinha(394, 394, "0");
                detalhe = detalhe.PreencherValorNaLinha(395, 400,
                                                        sequenciaRegistro.BoletoBrToStringSafe().PadLeft(6, '0'));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
        public string EscreverMensagemTipo2(DetalheRemessaCnab400 infoDetalhe, int sequenciaRegistro)
        {
            if (infoDetalhe == null)
            {
                throw new Exception("Os dados não foram informados na geração do DETALHE.");
            }

            var tipo2 = new string(' ', 400);

            try
            {
                var mensagem1 = "";
                var mensagem2 = "";
                var mensagem3 = "";
                var mensagem4 = "";

                foreach (var item in infoDetalhe.Instrucoes)
                {
                    if (mensagem1 == "")
                    {
                        mensagem1 = item.TextoInstrucao;
                        if (mensagem1.Length > 80)
                        {
                            mensagem1 = mensagem1.ExtrairValorDaLinha(1, 80);
                        }
                    }
                    else if (mensagem2 == "")
                    {
                        mensagem2 = item.TextoInstrucao;
                        if (mensagem2.Length > 80)
                        {
                            mensagem2 = mensagem2.ExtrairValorDaLinha(1, 80);
                        }
                    }
                    else if (mensagem3 == "")
                    {
                        mensagem3 = item.TextoInstrucao;
                        if (mensagem3.Length > 80)
                        {
                            mensagem3 = mensagem3.ExtrairValorDaLinha(1, 80);
                        }
                    }
                    else if (mensagem4 == "")
                    {
                        mensagem4 = item.TextoInstrucao;
                        if (mensagem4.Length > 80)
                        {
                            mensagem4 = mensagem4.ExtrairValorDaLinha(1, 80);
                        }
                    }
                }

                tipo2 = tipo2.PreencherValorNaLinha(1, 1, "2");
                tipo2 = tipo2.PreencherValorNaLinha(2, 81, mensagem1.PadRight(80, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(82, 161, mensagem2.PadRight(80, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(162, 241, mensagem3.PadRight(80, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(242, 321, mensagem4.PadRight(80, ' '));

                /*Nota 2.: Implementamos o Leiaute Registro Tipo 2, para permitir aos clientes beneficiários
                 * conceder mais dois (2) novos descontos podendo ser informados nas posições 322 à 359. A
                 * concessão do desconto disponível no Leiaute Registro Transação Tipo 1, permanece
                 * inalterada. -- Campos numéricos. Se não houver desconto informar zeros*/

                if (infoDetalhe.DataLimiteConcessaoDesconto2 == DateTime.MinValue)
                {
                    tipo2 = tipo2.PreencherValorNaLinha(322, 327, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    tipo2 = tipo2.PreencherValorNaLinha(322, 327, infoDetalhe.DataLimiteConcessaoDesconto2.ToString("ddMMyy"));
                }

                tipo2 = tipo2.PreencherValorNaLinha(328, 340, infoDetalhe.ValorDesconto2.ToStringParaValoresDecimais().PadLeft(13, '0'));

                if (infoDetalhe.DataLimiteConcessaoDesconto3 == DateTime.MinValue)
                {
                    tipo2 = tipo2.PreencherValorNaLinha(341, 346, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    tipo2 = tipo2.PreencherValorNaLinha(341, 346, infoDetalhe.DataLimiteConcessaoDesconto3.ToString("ddMMyy"));
                }

                tipo2 = tipo2.PreencherValorNaLinha(347, 359, infoDetalhe.ValorDesconto3.ToStringParaValoresDecimais().PadLeft(13, '0'));

                tipo2 = tipo2.PreencherValorNaLinha(360, 366, string.Empty.PadRight(7, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(367, 369, infoDetalhe.CarteiraCobranca.PadLeft(3, '0'));
                tipo2 = tipo2.PreencherValorNaLinha(370, 374, infoDetalhe.Agencia.PadLeft(5, '0'));
                tipo2 = tipo2.PreencherValorNaLinha(375, 381, infoDetalhe.ContaCorrente.PadLeft(7, '0'));
                tipo2 = tipo2.PreencherValorNaLinha(382, 382, infoDetalhe.DvContaCorrente.PadLeft(1, '0'));
                tipo2 = tipo2.PreencherValorNaLinha(383, 393, infoDetalhe.NossoNumero.PadLeft(11, '0'));
                tipo2 = tipo2.PreencherValorNaLinha(394, 394, infoDetalhe.DvNossoNumero);
                tipo2 = tipo2.PreencherValorNaLinha(395, 400, sequenciaRegistro.ToString().PadLeft(6, '0'));

                return(tipo2);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do Registro Tipo 2 do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int sequenciaDetalhe)
        {
            if (String.IsNullOrEmpty(infoDetalhe.BairroPagador))
            {
                throw new Exception("Não foi informado o bairro do pagador " + infoDetalhe.NomePagador + "(" +
                                    infoDetalhe.InscricaoPagador + ")");
            }

            if (String.IsNullOrEmpty(infoDetalhe.CepPagador) || infoDetalhe.CepPagador.Length < 8)
            {
                throw new Exception("CEP inválido! Verifique o CEP do pagador " + infoDetalhe.NomePagador + "(" +
                                    infoDetalhe.InscricaoPagador + ")");
            }

            if (String.IsNullOrEmpty(infoDetalhe.NumeroDocumento))
            {
                throw new Exception("Informe um número de documento!");
            }

            if ((infoDetalhe.DataVencimento - infoDetalhe.DataEmissao).Days < 1)
            {
                throw new Exception("A data de vencimento deve ser no minimo um dia MAIOR que a data de emissão.");
            }

            if (infoDetalhe.Especie == null)
            {
                throw new Exception("Espécie do documento não informada! São aceitas:{A,B,C,D,E,F,H,I,J,O,K}");
            }

            if (!infoDetalhe.Especie.Sigla.Equals("A") && //A - Duplicata Mercantil por Indicação
                !infoDetalhe.Especie.Sigla.Equals("B") && //B - Duplicata Rural;
                !infoDetalhe.Especie.Sigla.Equals("C") && //C - Nota Promissória;
                !infoDetalhe.Especie.Sigla.Equals("D") && //D - Nota Promissória Rural;
                !infoDetalhe.Especie.Sigla.Equals("E") && //E - Nota de Seguros;
                !infoDetalhe.Especie.Sigla.Equals("F") && //G – Recibo;
                !infoDetalhe.Especie.Sigla.Equals("H") && //H - Letra de Câmbio;
                !infoDetalhe.Especie.Sigla.Equals("I") && //I - Nota de Débito;
                !infoDetalhe.Especie.Sigla.Equals("J") && //J - Duplicata de Serviço por Indicação;
                !infoDetalhe.Especie.Sigla.Equals("O") && //O – Boleto Proposta
                !infoDetalhe.Especie.Sigla.Equals("K")    //K – Outros.
                )
            {
                throw new Exception("Informe o código da espécie documento! São aceitas:{A,B,C,D,E,F,H,I,J,O,K}");
            }

            #region Variáveis
            var detalhe = new string(' ', 400);
            try
            {
                var objBanco = BancoFactory.ObterBanco(infoDetalhe.CodigoBanco);

                string nossoNumeroSequencial =
                    infoDetalhe.NossoNumeroFormatado.Replace(".", "").Replace("/", "").Replace("-", "");

                #endregion

                infoDetalhe.Instrucao1 = infoDetalhe.Instrucao1 == null ? "01" : infoDetalhe.Instrucao1;
                #region Instrução1

                /* Este campo só permite usar os seguintes códigos:
                 *  01 - Cadastro de Títulos
                 *  02 - Pedido de Baixa
                 *  04 - Concessão de Abatimento
                 *  05 - Cancelamento de Abatimento
                 *  06 - Alteração de Vencimento
                 *  09 - Pedido de Protesto
                 *  18 - Sustar protesto e baixar título
                 *  19 - Sustar protesto e manter em carteira
                 *  31 - Alteração de outros dados
                 *  45 - Incluir negativação
                 *  75 - Excluir negativação e manter na carteira
                 *  76 - Excluir negativação e baixar títulos
                 */
                #endregion

                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1"); // Identificação do Registro Transação
                detalhe = detalhe.PreencherValorNaLinha(2, 2, "A"); // Tipo de Inscrição da Empresa
                detalhe = detalhe.PreencherValorNaLinha(3, 3, "A");
                detalhe = detalhe.PreencherValorNaLinha(4, 4, "A"); /*Tipo Impressao A - Normal B - Carnê */
                detalhe = detalhe.PreencherValorNaLinha(5, 16, string.Empty.PadLeft(12, ' '));
                detalhe = detalhe.PreencherValorNaLinha(17, 17, "A");
                detalhe = detalhe.PreencherValorNaLinha(18, 18, "A"); /* TipoDesconto A - Valor monetário B - Percentual */
                detalhe = detalhe.PreencherValorNaLinha(19, 19, "A"); /* TipoJuros A - Valor monetário B - Percentual */
                detalhe = detalhe.PreencherValorNaLinha(20, 47, string.Empty.PadLeft(28, ' '));
                detalhe = detalhe.PreencherValorNaLinha(48, 56, nossoNumeroSequencial);
                detalhe = detalhe.PreencherValorNaLinha(57, 62, string.Empty.PadLeft(6, ' '));
                detalhe = detalhe.PreencherValorNaLinha(63, 70, DateTime.Now.ToString("yyyyMMdd").Replace("/", ""));
                detalhe = detalhe.PreencherValorNaLinha(71, 71, " ");
                detalhe = detalhe.PreencherValorNaLinha(72, 72, "N");
                detalhe = detalhe.PreencherValorNaLinha(73, 73, " ");
                detalhe = detalhe.PreencherValorNaLinha(74, 74, "B");
                detalhe = detalhe.PreencherValorNaLinha(75, 76, "00"); /*parcela carne*/
                detalhe = detalhe.PreencherValorNaLinha(77, 78, "00"); /*total parcela carne*/
                detalhe = detalhe.PreencherValorNaLinha(79, 82, string.Empty.PadLeft(4, ' '));
                detalhe = detalhe.PreencherValorNaLinha(83, 92, infoDetalhe.ValorDescontoDia.ToStringParaValoresDecimais().PadLeft(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(93, 96, infoDetalhe.PercentualMulta.ToStringParaValoresDecimais().PadLeft(4, '0'));
                detalhe = detalhe.PreencherValorNaLinha(97, 108, string.Empty.PadLeft(12, ' '));
                detalhe = detalhe.PreencherValorNaLinha(109, 110, infoDetalhe.Instrucao1.PadLeft(2, '0'));
                detalhe = detalhe.PreencherValorNaLinha(111, 120, infoDetalhe.NumeroDocumento.PadRight(10, ' '));
                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy").Replace("/", ""));/*A data de vencimento deve ser sete dias MAIOR que a data de emissão (campos 151-156). Formato: DDMMAA*/
                detalhe = detalhe.PreencherValorNaLinha(127, 139, infoDetalhe.ValorBoleto.ToStringParaValoresDecimais().PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(149, 149, infoDetalhe.Especie.Sigla.BoletoBrToStringSafe());
                detalhe = detalhe.PreencherValorNaLinha(150, 150, infoDetalhe.Aceite);
                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy").Replace("/", ""));

                if (infoDetalhe.NroDiasParaProtesto > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, "06"); /*00 - Não protestar automaticamente 06 - Protestar automaticamente*/
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, infoDetalhe.NroDiasParaProtesto.ToString().PadLeft(2, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, "00"); /*00 - Não protestar automaticamente 06 - Protestar automaticamente*/
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, "00"); /*00 - Não protestar automaticamente 06 - Protestar automaticamente*/
                }

                detalhe = detalhe.PreencherValorNaLinha(161, 173, infoDetalhe.ValorJuros.ToStringParaValoresDecimais().PadLeft(13, '0'));

                if (infoDetalhe.DataLimiteConcessaoDesconto > DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy").Replace("/", ""));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, "000000");
                }

                detalhe = detalhe.PreencherValorNaLinha(180, 192, infoDetalhe.ValorDesconto.ToStringParaValoresDecimais().PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(193, 194, "00");
                detalhe = detalhe.PreencherValorNaLinha(195, 196, "00");
                detalhe = detalhe.PreencherValorNaLinha(197, 205, string.Empty.PadLeft(9, '0'));
                detalhe = detalhe.PreencherValorNaLinha(206, 218, infoDetalhe.ValorAbatimento.ToStringParaValoresDecimais().PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(219, 219, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11 ? "1" : "2");
                detalhe = detalhe.PreencherValorNaLinha(220, 220, "0");
                detalhe = detalhe.PreencherValorNaLinha(221, 234, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 274, infoDetalhe.NomePagador.PadLeft(40, ' '));

                string endereco = infoDetalhe.EnderecoPagador.Replace(".", "").Replace("/", "").Replace(",", "").Replace("-", "");
                if (endereco.Length > 40)
                {
                    endereco = endereco.Substring(0, 40);
                }

                detalhe = detalhe.PreencherValorNaLinha(275, 314, endereco.PadRight(40, ' '));
                detalhe = detalhe.PreencherValorNaLinha(315, 319, string.Empty.PadLeft(5, '0'));
                detalhe = detalhe.PreencherValorNaLinha(320, 325, string.Empty.PadLeft(6, '0'));
                detalhe = detalhe.PreencherValorNaLinha(326, 326, " ");
                detalhe = detalhe.PreencherValorNaLinha(327, 334, infoDetalhe.CepPagador.Replace(".", "").Replace("/", "").Replace("-", ""));
                detalhe = detalhe.PreencherValorNaLinha(335, 339, string.Empty.PadLeft(5, '0'));
                detalhe = detalhe.PreencherValorNaLinha(340, 353, string.Empty.PadLeft(14, ' '));
                detalhe = detalhe.PreencherValorNaLinha(354, 394, string.Empty.PadLeft(41, ' '));
                detalhe = detalhe.PreencherValorNaLinha(395, 400, sequenciaDetalhe.ToString().PadLeft(6, '0'));

                //switch (infoDetalhe.Instrucao1)
                //{
                //    case "31":
                //        infoDetalhe.Variacao
                //        detalhe = detalhe.PreencherValorNaLinha(71, 71, infoDetalhe.TipoRegistro);
                //        break;
                //    default:
                //        detalhe = detalhe.PreencherValorNaLinha(71, 71, " ");
                //        break;
                //}

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
示例#22
0
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int numeroRegistro)
        {
            if (infoDetalhe == null)
            {
                throw new Exception("Não há boleto para geração do DETALHE");
            }

            if (numeroRegistro == 0)
            {
                throw new Exception("Sequencial do registro não foi informado na geração do DETALHE.");
            }

            #region Variáveis

            var enderecoSacado = string.Empty;
            enderecoSacado += infoDetalhe.EnderecoPagador.ToUpper();

            if (enderecoSacado.Length > 40)
            {
                enderecoSacado = enderecoSacado.ExtrairValorDaLinha(1, 40);
            }
            //throw new Exception("Endereço do sacado excedeu o limite permitido.");

            #endregion

            var detalhe = new string(' ', 400);
            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "7");
                detalhe = detalhe.PreencherValorNaLinha(2, 3,
                                                        infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11
                        ? "01"
                        : "02");
                detalhe = detalhe.PreencherValorNaLinha(4, 17,
                                                        infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(18, 21, infoDetalhe.Agencia.PadLeft(4, '0'));
                detalhe = detalhe.PreencherValorNaLinha(22, 22, infoDetalhe.DvAgencia);
                detalhe = detalhe.PreencherValorNaLinha(23, 30, infoDetalhe.ContaCorrente.PadLeft(8, '0'));
                detalhe = detalhe.PreencherValorNaLinha(31, 31, infoDetalhe.DvContaCorrente);
                detalhe = detalhe.PreencherValorNaLinha(32, 38, infoDetalhe.Convenio.PadLeft(7, '0'));

                const string doc       = "DOC";
                var          seuNumero = doc + infoDetalhe.NossoNumeroFormatado.PadRight(25 - doc.Length, ' ');

                detalhe = detalhe.PreencherValorNaLinha(39, 63, seuNumero);

                if (infoDetalhe.CarteiraCobranca == "11" || infoDetalhe.CarteiraCobranca == "31" ||
                    infoDetalhe.CarteiraCobranca == "51")
                {
                    detalhe = detalhe.PreencherValorNaLinha(64, 80, string.Empty.PadRight(17, '0'));
                }
                else if (infoDetalhe.CarteiraCobranca == "12" || infoDetalhe.CarteiraCobranca == "15" ||
                         infoDetalhe.CarteiraCobranca == "17")
                {
                    detalhe = detalhe.PreencherValorNaLinha(64, 80,
                                                            infoDetalhe.Convenio.PadLeft(7, '0') + infoDetalhe.NossoNumero.PadLeft(10, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(64, 80, infoDetalhe.NossoNumeroFormatado);
                }

                detalhe = detalhe.PreencherValorNaLinha(81, 82, "00");
                detalhe = detalhe.PreencherValorNaLinha(83, 84, "00");
                detalhe = detalhe.PreencherValorNaLinha(85, 87, string.Empty.PadRight(3, ' '));
                detalhe = detalhe.PreencherValorNaLinha(88, 88, " ");
                // Indicador de Observações/Mensagem posição 352-391
                detalhe = detalhe.PreencherValorNaLinha(89, 91, string.Empty.PadRight(3, ' '));

                detalhe = detalhe.PreencherValorNaLinha(92, 94,
                                                        infoDetalhe.Variacao.BoletoBrToStringSafe().PadLeft(3, '0')); /* VARIAÇÃO DA CARTEIRA */

                detalhe = detalhe.PreencherValorNaLinha(95, 95, "0");
                detalhe = detalhe.PreencherValorNaLinha(96, 101, "000000");

                if (infoDetalhe.CarteiraCobranca == "11" || infoDetalhe.CarteiraCobranca == "17")
                {
                    switch (infoDetalhe.Variacao)
                    {
                    case "DESCONTADA":
                        detalhe = detalhe.PreencherValorNaLinha(102, 106, "04DSC");
                        break;

                    case "BBVENDOR":
                        detalhe = detalhe.PreencherValorNaLinha(102, 106, "08VDR");
                        break;

                    case "VINCULADA":
                        detalhe = detalhe.PreencherValorNaLinha(102, 106, "02VIN");
                        break;

                    case "SIMPLES":
                        detalhe = detalhe.PreencherValorNaLinha(102, 106, string.Empty.PadRight(5, ' '));
                        break;

                    default:
                        detalhe = detalhe.PreencherValorNaLinha(102, 106, string.Empty.PadRight(5, ' '));
                        break;
                    }
                }

                if (infoDetalhe.CarteiraCobranca == "12" || infoDetalhe.CarteiraCobranca == "31" ||
                    infoDetalhe.CarteiraCobranca == "51")
                {
                    detalhe = detalhe.PreencherValorNaLinha(102, 106, string.Empty.PadRight(5, ' '));
                }

                detalhe = detalhe.PreencherValorNaLinha(107, 108, infoDetalhe.CarteiraCobranca.PadLeft(2, '0'));

                var codigoOcorrencia = string.Empty;
                codigoOcorrencia = infoDetalhe.CodigoOcorrencia != null
                    ? infoDetalhe.CodigoOcorrencia.Codigo.BoletoBrToStringSafe().PadLeft(2, '0')
                    : "00";

                detalhe = detalhe.PreencherValorNaLinha(109, 110,
                                                        codigoOcorrencia.ToString(CultureInfo.InvariantCulture));

                detalhe = detalhe.PreencherValorNaLinha(111, 120, infoDetalhe.NossoNumero.PadLeft(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));

                #region VALOR BOLETO

                string valorBoleto;

                if (infoDetalhe.ValorBoleto.ToString("f").Contains('.') &&
                    infoDetalhe.ValorBoleto.ToString("f").Contains(','))
                {
                    valorBoleto = infoDetalhe.ValorBoleto.ToString("f").Replace(".", "").Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(127, 139, valorBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorBoleto.ToString("f").Contains('.'))
                {
                    valorBoleto = infoDetalhe.ValorBoleto.ToString("f").Replace(".", "");
                    detalhe     = detalhe.PreencherValorNaLinha(127, 139, valorBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorBoleto.ToString("f").Contains(','))
                {
                    valorBoleto = infoDetalhe.ValorBoleto.ToString("f").Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(127, 139, valorBoleto.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(127, 139,
                                                        infoDetalhe.ValorBoleto.ToString("f").Replace(",", "").PadLeft(13, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(140, 142, "001");
                detalhe = detalhe.PreencherValorNaLinha(143, 146, "0000");
                detalhe = detalhe.PreencherValorNaLinha(147, 147, " ");
                detalhe = detalhe.PreencherValorNaLinha(148, 149,
                                                        infoDetalhe.Especie.Sigla.Equals("DM")
                        ? "01"
                        : infoDetalhe.Especie.Codigo.ToString(CultureInfo.InvariantCulture));
                detalhe = detalhe.PreencherValorNaLinha(150, 150, infoDetalhe.Aceite.Equals("A") ? "A" : "N");
                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));

                #region INSTRUÇÕES REMESSA

                if (infoDetalhe.Instrucoes.Count > 2)
                {
                    throw new Exception(string.Format("<BoletoBr>{0}" +
                                                      "Não são aceitas mais que 2 instruções padronizadas para remessa de boletos no Banco do Brasil.",
                                                      Environment.NewLine));
                }

                var primeiraInstrucao = infoDetalhe.Instrucao1;
                var segundaInstrucao  = infoDetalhe.Instrucao2;

                if (primeiraInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, primeiraInstrucao.ToString());
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, "00");
                }
                if (segundaInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, segundaInstrucao.ToString());
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, "00");
                }

                #endregion

                #region JUROS DE MORA POR DIA DE ATRASO

                var jurosPorDia = string.Empty;

                //161 a 173 9(011)v99 Juros de Mora por Dia de Atraso 10
                /* Banco do Brasil não passa % para juros e sim o valor calculado a ser cobrado por dia */
                if (infoDetalhe.ValorMoraDia > 0)
                {
                    var valorCobrarJuroDia = infoDetalhe.ValorBoleto * ((infoDetalhe.ValorMoraDia / 30) / 100);
                    infoDetalhe.ValorMoraDia = Math.Round(valorCobrarJuroDia, 2);
                }

                if (infoDetalhe.ValorMoraDia.ToString().Contains('.') &&
                    infoDetalhe.ValorMoraDia.ToString().Contains(','))
                {
                    jurosPorDia = infoDetalhe.ValorMoraDia.ToString().Replace(".", "").Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosPorDia.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorMoraDia.ToString().Contains('.'))
                {
                    jurosPorDia = infoDetalhe.ValorMoraDia.ToString().Replace(".", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosPorDia.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorMoraDia.ToString().Contains(','))
                {
                    jurosPorDia = infoDetalhe.ValorMoraDia.ToString().Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosPorDia.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(161, 173, jurosPorDia.ToString().PadLeft(13, '0'));

                #endregion

                if (infoDetalhe.DataLimiteConcessaoDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, "000000");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179,
                                                            infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy"));
                }

                #region DESCONTO

                string descontoBoleto;

                if (infoDetalhe.ValorDesconto.ToString().Contains('.') &&
                    infoDetalhe.ValorDesconto.ToString().Contains(','))
                {
                    descontoBoleto = infoDetalhe.ValorDesconto.ToString().Replace(".", "").Replace(",", "");
                    detalhe        = detalhe.PreencherValorNaLinha(180, 192, descontoBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorDesconto.ToString().Contains('.'))
                {
                    descontoBoleto = infoDetalhe.ValorDesconto.ToString().Replace(".", "");
                    detalhe        = detalhe.PreencherValorNaLinha(180, 192, descontoBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorDesconto.ToString().Contains(','))
                {
                    descontoBoleto = infoDetalhe.ValorDesconto.ToString().Replace(",", "");
                    detalhe        = detalhe.PreencherValorNaLinha(180, 192, descontoBoleto.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(180, 192, infoDetalhe.ValorDesconto.ToString().PadLeft(13, '0'));

                #endregion

                #region IOF

                string iofBoleto;

                if (infoDetalhe.ValorIof.ToString().Contains('.') && infoDetalhe.ValorIof.ToString().Contains(','))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(".", "").Replace(",", "");
                    detalhe   = detalhe.PreencherValorNaLinha(193, 205, iofBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorIof.ToString().Contains('.'))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(".", "");
                    detalhe   = detalhe.PreencherValorNaLinha(193, 205, iofBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorIof.ToString().Contains(','))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(",", "");
                    detalhe   = detalhe.PreencherValorNaLinha(193, 205, iofBoleto.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(193, 205,
                                                        infoDetalhe.ValorIof.ToString().Replace(",", "").PadLeft(13, '0'));

                #endregion

                #region ABATIMENTO

                string abatimentoBoleto;

                if (infoDetalhe.ValorAbatimento.ToString().Contains('.') &&
                    infoDetalhe.ValorAbatimento.ToString().Contains(','))
                {
                    abatimentoBoleto = infoDetalhe.ValorAbatimento.ToString().Replace(".", "").Replace(",", "");
                    detalhe          = detalhe.PreencherValorNaLinha(206, 218, abatimentoBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorAbatimento.ToString().Contains('.'))
                {
                    abatimentoBoleto = infoDetalhe.ValorAbatimento.ToString().Replace(".", "");
                    detalhe          = detalhe.PreencherValorNaLinha(206, 218, abatimentoBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorAbatimento.ToString().Contains(','))
                {
                    abatimentoBoleto = infoDetalhe.ValorAbatimento.ToString().Replace(",", "");
                    detalhe          = detalhe.PreencherValorNaLinha(206, 218, abatimentoBoleto.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(206, 218,
                                                        infoDetalhe.ValorAbatimento.ToString().Replace(",", "").PadLeft(13, '0'));

                #endregion

                var nomePagador = string.Empty;
                nomePagador = infoDetalhe.NomePagador.Length > 37
                    ? infoDetalhe.NomePagador.ExtrairValorDaLinha(1, 37)
                    : infoDetalhe.NomePagador;

                detalhe = detalhe.PreencherValorNaLinha(219, 220,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11
                        ? "01"
                        : "02");
                detalhe = detalhe.PreencherValorNaLinha(221, 234,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 271, nomePagador.ToUpper().PadRight(37, ' '));
                detalhe = detalhe.PreencherValorNaLinha(272, 274, string.Empty.PadRight(3, ' '));
                detalhe = detalhe.PreencherValorNaLinha(275, 314, enderecoSacado.PadRight(40, ' '));

                var bairroSacado = string.Empty;
                if (String.IsNullOrEmpty(infoDetalhe.BairroPagador))
                {
                    bairroSacado = bairroSacado.PadRight(12, ' ');
                }
                else
                {
                    bairroSacado = infoDetalhe.BairroPagador.Length > 12
                        ? infoDetalhe.BairroPagador.ExtrairValorDaLinha(1, 12)
                        : infoDetalhe.BairroPagador.PadRight(12, ' ');
                }
                detalhe = detalhe.PreencherValorNaLinha(315, 326, bairroSacado.ToUpper());

                var cep = infoDetalhe.CepPagador;

                if (cep.Contains(".") && cep.Contains("-"))
                {
                    cep = cep.Replace(".", "").Replace("-", "");
                }
                if (cep.Contains("."))
                {
                    cep = cep.Replace(".", "");
                }
                if (cep.Contains("-"))
                {
                    cep = cep.Replace("-", "");
                }

                detalhe = detalhe.PreencherValorNaLinha(327, 334, cep.PadLeft(8, ' ')); // Cep do Sacado

                var cidadeSacado = string.Empty;
                if (String.IsNullOrEmpty(infoDetalhe.CidadePagador))
                {
                    cidadeSacado = cidadeSacado.PadRight(15, ' ');
                }
                else
                {
                    cidadeSacado = infoDetalhe.CidadePagador.Length > 15
                        ? infoDetalhe.CidadePagador.ExtrairValorDaLinha(1, 15).ToUpper()
                        : infoDetalhe.CidadePagador.PadRight(15, ' ').ToUpper();
                }

                detalhe = detalhe.PreencherValorNaLinha(335, 349, cidadeSacado.ToUpper());
                detalhe = detalhe.PreencherValorNaLinha(350, 351, infoDetalhe.UfPagador.ToUpper().PadRight(2, ' '));

                var obs = string.Empty;
                if (infoDetalhe.Instrucoes != null)
                {
                    foreach (var instrucao in infoDetalhe.Instrucoes)
                    {
                        if (obs.Length > 0)
                        {
                            obs += " ";
                        }
                        obs += instrucao.TextoInstrucao;
                    }
                }
                if (obs.Length > 40)
                {
                    obs = obs.ExtrairValorDaLinha(1, 40);
                }
                detalhe = detalhe.PreencherValorNaLinha(352, 391, obs.PadRight(40, ' '));

                /* Refere-se a protesto */
                var quantidadeDiaProtesto = string.Empty.PadRight(2, ' ');
                if (infoDetalhe.NroDiasParaProtesto > 0)
                {
                    quantidadeDiaProtesto =
                        infoDetalhe.NroDiasParaProtesto.ToString(CultureInfo.InvariantCulture).PadLeft(2, '0');
                }
                detalhe = detalhe.PreencherValorNaLinha(392, 393, quantidadeDiaProtesto);

                detalhe = detalhe.PreencherValorNaLinha(394, 394, " ");
                detalhe = detalhe.PreencherValorNaLinha(395, 400,
                                                        numeroRegistro.ToString(CultureInfo.InvariantCulture).PadLeft(6, '0'));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(
                          string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                        Environment.NewLine), e);
            }
        }
示例#23
0
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int sequenciaRegistro)
        {
            if (infoDetalhe == null)
            {
                throw new Exception("Não há boleto para geração do DETALHE");
            }

            string enderecoSacado = string.Empty;

            string nomeSacado = string.Empty;

            if (String.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.EnderecoPagador.Length > 40)
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Substring(0, 40).ToUpper();
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.PadRight(40, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.NomePagador.Length > 40)
            {
                nomeSacado = infoDetalhe.NomePagador.Substring(0, 40).ToUpper();
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.PadRight(40, ' ').ToUpper();
            }

            var detalhe = new string(' ', 400);

            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1");

                // Débito Autómático em C/C
                detalhe = detalhe.PreencherValorNaLinha(2, 6, string.Empty.PadLeft(5, '0'));
                detalhe = detalhe.PreencherValorNaLinha(7, 7, "0");
                detalhe = detalhe.PreencherValorNaLinha(8, 12, string.Empty.PadLeft(5, '0'));
                detalhe = detalhe.PreencherValorNaLinha(13, 19, string.Empty.PadLeft(7, '0'));
                detalhe = detalhe.PreencherValorNaLinha(20, 20, "0");

                #region POSIÇÃO: 21-37 - IDENTIFICAÇÃO DA EMPRESA CEDENTE NO BANCO

                //021 a 037 - Identificação da Empresa Cedente no Banco
                //Deverá ser preenchido (esquerda para direita), da seguinte maneira:

                var identificadorCedente = "";
                //21 a 21 - Zero
                identificadorCedente = "0";

                //22 a 24 - código da carteira
                identificadorCedente += infoDetalhe.CarteiraCobranca.PadLeft(3, '0');

                //25 a 29 - código da Agência Cedente, sem o dígito
                identificadorCedente += infoDetalhe.Agencia.PadLeft(5, '0');

                //30 a 36 - Conta Corrente
                identificadorCedente += infoDetalhe.ContaCorrente.PadLeft(7, '0');

                //37 a 37 - dígito da Conta
                identificadorCedente += infoDetalhe.DvContaCorrente.PadLeft(1, '0');

                detalhe = detalhe.PreencherValorNaLinha(21, 37, identificadorCedente);

                #endregion

                const string doc       = "DOC";
                var          seuNumero = doc + infoDetalhe.NossoNumeroFormatado.PadRight(25 - doc.Length, ' ');

                detalhe = detalhe.PreencherValorNaLinha(38, 62, seuNumero);
                detalhe = detalhe.PreencherValorNaLinha(63, 65, "000");

                #region PERCENTUAL MULTA

                if (infoDetalhe.PercentualMulta.BoletoBrToStringSafe().BoletoBrToDecimal() > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(66, 66, "2"); // 2 - Com cobrança de multa
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(66, 66, "0"); // 0 - Sem cobrança de multa
                }
                // Percentual de multa

                /*
                 * 067 a 070 – Percentual de 1 Multa por Atraso
                 * Se campo 66 a 66 = 0, preencher com zeros.
                 * Se campo 66 a 66 = 2, preencher com percentual da multa com 2 decimais.
                 */
                var multaBoleto = string.Empty;

                multaBoleto = infoDetalhe.PercentualMulta.ToString("##.00").Replace(".", "").Replace(",", "");
                detalhe     = detalhe.PreencherValorNaLinha(67, 70, multaBoleto.PadLeft(4, '0'));
                #endregion

                detalhe = detalhe.PreencherValorNaLinha(71, 81, infoDetalhe.NossoNumero.PadLeft(11, '0'));
                detalhe = detalhe.PreencherValorNaLinha(82, 82, infoDetalhe.DvNossoNumero);

                #region VALOR DESCONTO POR DIA

                detalhe = detalhe.PreencherValorNaLinha(83, 92, infoDetalhe.ValorDescontoDia.ToStringParaVoloresDecimais().PadLeft(10, '0'));

                #endregion

                //posição 93: preencher com a condição para emissão do boleto.
                //Caso a impressão seja via banco, preencher com o número 1.
                //Caso a impressão seja via empresa, preencher com o número 2;
                if (infoDetalhe.BancoEmiteBoleto)
                {
                    detalhe = detalhe.PreencherValorNaLinha(93, 93, "1");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(93, 93, "2");
                }

                detalhe = detalhe.PreencherValorNaLinha(94, 94, "S");
                detalhe = detalhe.PreencherValorNaLinha(95, 104, string.Empty.PadLeft(10, ' '));
                detalhe = detalhe.PreencherValorNaLinha(105, 105, " ");
                detalhe = detalhe.PreencherValorNaLinha(106, 106, "2");
                detalhe = detalhe.PreencherValorNaLinha(107, 108, string.Empty.PadLeft(2, ' '));

                detalhe = detalhe.PreencherValorNaLinha(109, 110,
                                                        infoDetalhe.CodigoOcorrencia.Codigo.BoletoBrToStringSafe().PadLeft(2, '0'));

                detalhe = detalhe.PreencherValorNaLinha(111, 120, infoDetalhe.NumeroDocumento.PadLeft(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));

                #region VALOR BOLETO

                detalhe = detalhe.PreencherValorNaLinha(127, 139,
                                                        infoDetalhe.ValorBoleto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(13, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(140, 142, string.Empty.PadLeft(3, '0'));
                detalhe = detalhe.PreencherValorNaLinha(143, 147, string.Empty.PadLeft(5, '0'));

                detalhe = detalhe.PreencherValorNaLinha(148, 149,
                                                        infoDetalhe.Especie.Sigla.Equals("DM")
                        ? "01"
                        : infoDetalhe.Especie.Codigo.ToString());
                detalhe = detalhe.PreencherValorNaLinha(150, 150, infoDetalhe.Aceite.Equals("A") ? "A" : "N");
                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));

                #region INSTRUÇÕES REMESSA

                var primeiraInstrucao = infoDetalhe.Instrucao1;
                var segundaInstrucao  = infoDetalhe.Instrucao2;

                if (primeiraInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, primeiraInstrucao);
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, "00");
                }
                if (segundaInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, segundaInstrucao);
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, "00");
                }

                #endregion

                #region VALOR JUROS

                // Valor de Mora Por Dia de Atraso
                /* Bradesco não passa % para juros e sim o valor calculado a ser cobrado por dia */


                if (infoDetalhe.ValorMoraDia > 0)
                {
                    var valorCobrarJuroDia = infoDetalhe.ValorBoleto * ((infoDetalhe.ValorMoraDia / 30) / 100);
                    infoDetalhe.ValorCobradoDiaAtraso = Math.Round(valorCobrarJuroDia, 2);
                }

                detalhe = detalhe.PreencherValorNaLinha(161, 173, infoDetalhe.ValorCobradoDiaAtraso.ToStringParaVoloresDecimais().PadLeft(13, '0'));

                #endregion

                if (infoDetalhe.DataLimiteConcessaoDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179,
                                                            infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy"));
                }
                // Data Limite para Concesão de Desconto

                #region VALOR DESCONTO

                detalhe = detalhe.PreencherValorNaLinha(180, 192, infoDetalhe.ValorDesconto.ToStringParaVoloresDecimais().PadLeft(13, '0'));

                #endregion

                #region VALOR IOF

                detalhe = detalhe.PreencherValorNaLinha(193, 205, infoDetalhe.ValorIof.ToStringParaVoloresDecimais().PadLeft(13, '0'));
                // Valor do I.O.F. recolhido p/ notas seguro

                #endregion

                #region VALOR ABATIMENTO

                detalhe = detalhe.PreencherValorNaLinha(206, 218, infoDetalhe.ValorAbatimento.ToStringParaVoloresDecimais().PadLeft(13, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(219, 220,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11
                        ? "01"
                        : "02"); // Identificação do tipo de inscrição/sacado
                detalhe = detalhe.PreencherValorNaLinha(221, 234,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 274, nomeSacado);
                detalhe = detalhe.PreencherValorNaLinha(275, 314, enderecoSacado);

                #region 1ª Mensagem

                /* POSIÇÃO: 315 a 326 - 1ª Mensagem
                 * Campo livre para uso da empresa.
                 * A mensagem enviada nesse campo será impressa somente no boleto enão será confirmada no arquivo retorno.
                 */
                var mensagem1 = "";
                //if (infoDetalhe.Instrucoes != null && infoDetalhe.Instrucoes.Count > 0)
                //    mensagem1 = infoDetalhe.Instrucoes[0].TextoInstrucao;
                //if (mensagem1.Trim().Length > 12)
                //    mensagem1 = mensagem1.ExtrairValorDaLinha(1, 12);

                detalhe = detalhe.PreencherValorNaLinha(315, 326, mensagem1.PadRight(12, ' ')); // 1ª Mensagem

                #endregion

                var cep = infoDetalhe.CepPagador;

                if (cep.Contains(".") && cep.Contains("-"))
                {
                    cep = cep.Replace(".", "").Replace("-", "");
                }
                if (cep.Contains("."))
                {
                    cep = cep.Replace(".", "");
                }
                if (cep.Contains("-"))
                {
                    cep = cep.Replace("-", "");
                }

                detalhe = detalhe.PreencherValorNaLinha(327, 334, cep.PadLeft(8, ' ')); // Cep do Sacado

                #region 2ª Mensagem / Sacador Avalista

                /* Sacador / Avalista ou 2ª Mensagem
                 * CNPJ/CPF do Sacador Avalista ( o critério para preenchimento, deve ser o mesmo tanto para o
                 * CNPJ como para o CPF ou seja, iniciando da direita para a esquerda:
                 * - 2 posições para o controle;
                 * - 4 posições para filial; e
                 * - 9 posições para o CNPJ/CPF.
                 * Obs.: No caso de CPF, o campo filial deverá ser preenchido com zeros.
                 * COMPOSIÇÃO DAS POSIÇÕES 335-394
                 * 15 Numéricos
                 * 02 Brancos
                 * 43 Alfanumérico
                 */

                string str = string.Empty;

                if (infoDetalhe.NomeAvalistaOuMensagem2.BoletoBrToStringSafe().Trim().Length > 0)
                {
                    str = infoDetalhe.NomeAvalistaOuMensagem2;
                    if (str.BoletoBrToStringSafe().Trim().Length > 60)
                    {
                        str = str.ExtrairValorDaLinha(1, 60);
                    }

                    detalhe = detalhe.PreencherValorNaLinha(335, 394, str.PadLeft(60, ' '));
                }
                //else
                //{
                //    if (infoDetalhe.Instrucoes != null && infoDetalhe.Instrucoes.Count > 1)
                //    {
                //        var mensagem2 = "";
                //        mensagem2 = infoDetalhe.Instrucoes[1].TextoInstrucao;

                //        if (mensagem2.Trim().Length > 60)
                //            mensagem2 = mensagem2.ExtrairValorDaLinha(1, 60);

                //        detalhe = detalhe.PreencherValorNaLinha(335, 394, mensagem2.PadRight(60, ' '));
                //    }
                //}

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(395, 400, sequenciaRegistro.BoletoBrToStringSafe().PadLeft(6, '0'));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int sequenciaDetalhe)
        {
            if (String.IsNullOrEmpty(infoDetalhe.BairroPagador))
            {
                throw new Exception("Não foi informado o bairro do pagador " + infoDetalhe.NomePagador + "(" +
                                    infoDetalhe.InscricaoPagador + ")");
            }

            if (String.IsNullOrEmpty(infoDetalhe.CepPagador) || infoDetalhe.CepPagador.Length < 8)
            {
                throw new Exception("CEP Inválido! Verifique o CEP do pagador " + infoDetalhe.NomePagador + "(" +
                                    infoDetalhe.InscricaoPagador + ")");
            }

            // Na geração do detalhe na remessa não está sendo tratado os casos de cancelamento das instruções nas posições 34-37

            var objBanco = BancoFactory.ObterBanco(infoDetalhe.CodigoBanco);

            //string nossoNumeroCarteira =
            //    infoDetalhe.NossoNumeroFormatado.Replace(".", "").Replace("/", "").Replace("-", "").Substring(0, 3);
            string nossoNumeroSequencial =
                infoDetalhe.NossoNumeroFormatado.Replace(".", "").Replace("/", "").Replace("-", "").Substring(3, 8);
            //string nossoNumeroDigito =
            //    infoDetalhe.NossoNumeroFormatado.Replace(".", "").Replace("/", "").Replace("-", "").Substring(11, 1);

            string carteiraCob    = infoDetalhe.CarteiraCobranca.PadLeft(3, ' ');
            string enderecoSacado = string.Empty;
            string bairroSacado   = string.Empty;
            string cidadeSacado   = string.Empty;

            string nomeSacado = string.Empty;

            if (String.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.EnderecoPagador.Length > 40)
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Substring(0, 40).ToUpper();
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.PadRight(40, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.BairroPagador))
            {
                bairroSacado.PadRight(12, ' ');
            }
            else if (infoDetalhe.BairroPagador.Length > 12)
            {
                bairroSacado = infoDetalhe.BairroPagador.Substring(0, 12).ToUpper();
            }
            else
            {
                bairroSacado = infoDetalhe.BairroPagador.PadRight(12, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.CidadePagador))
            {
                cidadeSacado.PadRight(15, ' ');
            }
            else if (infoDetalhe.CidadePagador.Length > 15)
            {
                cidadeSacado = infoDetalhe.CidadePagador.Substring(0, 15).ToUpper();
            }
            else
            {
                cidadeSacado = infoDetalhe.CidadePagador.PadRight(15, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado.PadRight(30, ' ');
            }
            else if (infoDetalhe.NomePagador.Length > 30)
            {
                nomeSacado = infoDetalhe.NomePagador.Substring(0, 30).ToUpper();
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.PadRight(30, ' ').ToUpper();
            }

            var detalhe = new string(' ', 400);

            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1"); // Identificação do Registro Transação
                detalhe = detalhe.PreencherValorNaLinha(2, 3,
                                                        infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11
                        ? "01"
                        : "02"); // Tipo de Inscrição da Empresa
                detalhe = detalhe.PreencherValorNaLinha(4, 17,
                                                        infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", ""));
                // Nro de Inscrição da Empresa (CPF/CNPJ)
                detalhe = detalhe.PreencherValorNaLinha(18, 21, infoDetalhe.Agencia.PadLeft(4, '0'));
                // Agência Mantenedora da Conta
                detalhe = detalhe.PreencherValorNaLinha(22, 23, string.Empty.PadRight(2, '0'));
                // Complemento de Registro
                detalhe = detalhe.PreencherValorNaLinha(24, 28, infoDetalhe.ContaCorrente.PadLeft(5, '0'));
                // Nro da Conta Corrente da Empresa
                detalhe = detalhe.PreencherValorNaLinha(29, 29, infoDetalhe.DvContaCorrente);
                // Dígito de Auto Conferência Ag/Conta Empresa
                detalhe = detalhe.PreencherValorNaLinha(30, 33, string.Empty.PadRight(4, ' '));
                // Complemento de Registro

                if (infoDetalhe.CodigoOcorrencia.Codigo != 35 && infoDetalhe.CodigoOcorrencia.Codigo != 38)
                {
                    detalhe = detalhe.PreencherValorNaLinha(34, 37, "0000"); // Cód. Instrução/Alegação a ser cancelada
                }
                const string doc       = "DOC";
                var          seuNumero = doc + infoDetalhe.NossoNumeroFormatado.PadRight(25 - doc.Length, ' ');

                detalhe = detalhe.PreencherValorNaLinha(38, 62, seuNumero); // Identificação do Título na Empresa
                detalhe = detalhe.PreencherValorNaLinha(63, 70, nossoNumeroSequencial);
                // Identificação do Título no Banco

                // Se Moeda = REAL, preenche com zeros
                if (infoDetalhe.Moeda == "9" || infoDetalhe.Moeda == "09" || infoDetalhe.Moeda == "R$" ||
                    infoDetalhe.Moeda == "REAL")
                {
                    detalhe = detalhe.PreencherValorNaLinha(71, 83, string.Empty.PadLeft(13, '0'));
                }
                // Quantidade de Moeda Variável
                // Caso contrário, preenche com a quantidade
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(71, 83,
                                                            infoDetalhe.QuantidadeMoeda.ToString("F5").Replace(".", "").Replace(",", "").PadLeft(13, '0'));
                }
                // Quantidade de Moeda Variável
                detalhe = detalhe.PreencherValorNaLinha(84, 86, infoDetalhe.CarteiraCobranca.PadLeft(3, '0'));
                // Número da Carteira no Banco
                detalhe = detalhe.PreencherValorNaLinha(87, 107, string.Empty.PadRight(21, ' '));
                // Identificação da Operação no Banco
                /* Código da Carteira */
                // Modalidade de Carteira D - Direta
                if (carteiraCob == "108" || carteiraCob == "109" || carteiraCob == "110" || carteiraCob == "111")
                {
                    detalhe = detalhe.PreencherValorNaLinha(108, 108, "I");
                }
                // Modalidade de Carteira S - Sem Registro
                if (carteiraCob == "103" || carteiraCob == "173" || carteiraCob == "196" || carteiraCob == "198")
                {
                    detalhe = detalhe.PreencherValorNaLinha(108, 108, "I");
                }
                // Modalidade de Carteira E - Escritural
                if (carteiraCob == "104" || carteiraCob == "112" || carteiraCob == "138")
                {
                    detalhe = detalhe.PreencherValorNaLinha(108, 108, "I");
                }
                if (carteiraCob == "147")
                {
                    detalhe = detalhe.PreencherValorNaLinha(108, 108, "E");
                }
                detalhe = detalhe.PreencherValorNaLinha(109, 110,
                                                        infoDetalhe.CodigoOcorrencia.Codigo.ToString().PadLeft(2, '0')); // Identificação da Ocorrência

                detalhe = detalhe.PreencherValorNaLinha(111, 120,
                                                        infoDetalhe.NumeroDocumento.Replace("-", "").PadLeft(10, '0'));

                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));
                // Data de Vencimento do Título
                detalhe = detalhe.PreencherValorNaLinha(127, 139,
                                                        infoDetalhe.ValorBoleto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(13, '0'));
                // Valor Nominal do Título
                detalhe = detalhe.PreencherValorNaLinha(140, 142, "341"); // Nro do Banco na Câmara de Compensação
                detalhe = detalhe.PreencherValorNaLinha(143, 147, string.Empty.PadLeft(5, '0'));
                // Agência onde o título será cobrado
                // Espécie do documento padronizado para DM - Duplicata Mercantil
                detalhe = detalhe.PreencherValorNaLinha(148, 149,
                                                        infoDetalhe.Especie.Sigla.Equals("DM") ? "01" :
                                                        infoDetalhe.Especie.Codigo.ToString().Length <= 1? "0" + infoDetalhe.Especie.Codigo.ToString() : infoDetalhe.Especie.Codigo.ToString());

                detalhe = detalhe.PreencherValorNaLinha(150, 150, infoDetalhe.Aceite.Equals("A") ? "A" : "N");
                // Identificação de Título Aceitou ou Não Aceito
                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));
                // Data da Emissão do Título

                #region INSTRUÇÕES REMESSA

                var primeiraInstrucao = infoDetalhe.Instrucoes.FirstOrDefault();
                var segundaInstrucao  = infoDetalhe.Instrucoes.LastOrDefault();

                // No caso da instrução "39", se informar "00" na posição 392-393 será impresso no boleto a literal "NÃO RECEBER APÓS O VENCIMENTO".
                if (primeiraInstrucao != null && primeiraInstrucao.Codigo.BoletoBrToStringSafe().Length == 2)
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, primeiraInstrucao.Codigo.ToString());
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, "39");
                }

                // Código 94 (Mensagem customizada).
                if (segundaInstrucao != null && segundaInstrucao.Codigo.BoletoBrToStringSafe().Length == 2)
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, segundaInstrucao.Codigo.ToString());
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, "94");
                }

                #endregion

                #region VALOR JUROS

                // Valor de Mora Por Dia de Atraso
                /* ITAU não passa % para juros e sim o valor calculado a ser cobrado por dia */
                var jurosBoleto = string.Empty;

                if (infoDetalhe.ValorMoraDia > 0)
                {
                    var valorCobrarJuroDia = infoDetalhe.ValorBoleto * ((infoDetalhe.ValorMoraDia / 30) / 100);
                    infoDetalhe.ValorCobradoDiaAtraso = Math.Round(valorCobrarJuroDia, 2);
                }

                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains('.') &&
                    infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains(','))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(".", "").Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains('.'))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(".", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains(','))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));

                #endregion

                if (infoDetalhe.DataDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, infoDetalhe.DataDesconto.ToString("ddMMyy"));
                }
                // Data Limite para Concesão de Desconto

                detalhe = detalhe.PreencherValorNaLinha(180, 192,
                                                        infoDetalhe.ValorDesconto.ToString().Replace(",", "").PadLeft(13, '0'));
                // Valor do Desconto a ser Concedido
                detalhe = detalhe.PreencherValorNaLinha(193, 205,
                                                        infoDetalhe.ValorIof.ToString().Replace(",", "").PadLeft(13, '0'));
                // Valor do I.O.F. recolhido p/ notas seguro
                detalhe = detalhe.PreencherValorNaLinha(206, 218,
                                                        infoDetalhe.ValorAbatimento.ToString().Replace(",", "").PadLeft(13, '0'));
                // Valor do Abatimento a ser concedido
                detalhe = detalhe.PreencherValorNaLinha(219, 220,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11
                        ? "01"
                        : "02"); // Identificação do tipo de inscrição/sacado
                detalhe = detalhe.PreencherValorNaLinha(221, 234,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                // Nro de Inscrição do Sacado (CPF/CNPJ)
                detalhe = detalhe.PreencherValorNaLinha(235, 264, nomeSacado.PadRight(30, ' ')); // Nome do Sacado
                detalhe = detalhe.PreencherValorNaLinha(265, 274, string.Empty.PadRight(10, ' '));
                // Complemento de registro
                detalhe = detalhe.PreencherValorNaLinha(275, 314, enderecoSacado.PadRight(40, ' '));
                // Rua, Número, e Complemento do Sacado
                detalhe = detalhe.PreencherValorNaLinha(315, 326, bairroSacado.PadRight(12, ' ')); // Bairro do Sacado

                var Cep = infoDetalhe.CepPagador;

                if (Cep.Contains("."))
                {
                    Cep = Cep.Replace(".", "");
                }
                if (Cep.Contains("-"))
                {
                    Cep = Cep.Replace("-", "");
                }

                detalhe = detalhe.PreencherValorNaLinha(327, 334, Cep);
                detalhe = detalhe.PreencherValorNaLinha(335, 349, cidadeSacado.PadRight(15, ' '));
                detalhe = detalhe.PreencherValorNaLinha(350, 351, infoDetalhe.UfPagador.PadRight(2, ' '));

                // Caso não tenha sacador/avalista informar mensagem no campo
                if (infoDetalhe.NomeAvalistaOuMensagem2.BoletoBrToStringSafe().Trim().Length == 0)
                {
                    // Mensagem
                    if (primeiraInstrucao != null &&
                        primeiraInstrucao.Codigo.BoletoBrToStringSafe().BoletoBrToInt() == 0)
                    {
                        var instrucao1 = primeiraInstrucao.TextoInstrucao;
                        if (instrucao1.BoletoBrToStringSafe().Trim().Length > 40)
                        {
                            instrucao1 = instrucao1.ExtrairValorDaLinha(1, 40);
                        }

                        detalhe = detalhe.PreencherValorNaLinha(352, 391, instrucao1.PadRight(40, ' '));
                    }
                    else if (segundaInstrucao != null &&
                             segundaInstrucao.Codigo.BoletoBrToStringSafe().BoletoBrToInt() == 0)
                    {
                        var instrucao2 = segundaInstrucao.TextoInstrucao;
                        if (instrucao2.BoletoBrToStringSafe().Trim().Length > 40)
                        {
                            instrucao2 = instrucao2.ExtrairValorDaLinha(1, 40);
                        }

                        detalhe = detalhe.PreencherValorNaLinha(352, 391, instrucao2.PadRight(40, ' '));
                    }
                }
                else
                {
                    // Nome do Sacador ou Avalista
                    detalhe = detalhe.PreencherValorNaLinha(352, 381,
                                                            infoDetalhe.NomeAvalistaOuMensagem2.BoletoBrToStringSafe().PadRight(30, ' '));

                    // Complemento do Registro
                    detalhe = detalhe.PreencherValorNaLinha(382, 385, string.Empty.PadRight(4, ' '));

                    // Data de Mora
                    if (infoDetalhe.DataJurosMora == DateTime.MinValue)
                    {
                        detalhe = detalhe.PreencherValorNaLinha(386, 391, string.Empty.PadLeft(6, '0')); // Data de Mora
                    }
                    else
                    {
                        detalhe = detalhe.PreencherValorNaLinha(386, 391, infoDetalhe.DataJurosMora.ToString("ddMMyy"));
                    }
                }

                // Quantidade de Dias Posição 392 a 393
                detalhe = detalhe.PreencherValorNaLinha(392, 393, infoDetalhe.NroDiasParaProtesto.ToString().PadLeft(2, '0'));

                // Complemento do Registro
                detalhe = detalhe.PreencherValorNaLinha(394, 394, string.Empty.PadRight(1, ' '));

                // Nro Sequencial do Registro no Arquivo
                detalhe = detalhe.PreencherValorNaLinha(395, 400, sequenciaDetalhe.ToString().PadLeft(6, '0'));

                return(detalhe);
            }
            catch (ArgumentException e)
            {
                throw new ArgumentException(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                          Environment.NewLine), e);
            }
        }
示例#25
0
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe)
        {
            if (infoDetalhe == null)
            {
                throw new Exception("Não há boleto para geração do DETALHE");
            }

            if (infoDetalhe.NumeroSequencialRegistro == 0)
            {
                throw new Exception("Sequencial do registro não foi informado na geração do DETALHE.");
            }

            string enderecoSacado = string.Empty;

            string nomeSacado = string.Empty;

            if (String.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado.PadRight(40, ' ');
            }
            else
            if (infoDetalhe.EnderecoPagador.Length > 40)
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Substring(0, 40).ToUpper();
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.PadRight(40, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado.PadRight(40, ' ');
            }
            else
            if (infoDetalhe.NomePagador.Length > 40)
            {
                nomeSacado = infoDetalhe.NomePagador.Substring(0, 40).ToUpper();
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.PadRight(40, ' ').ToUpper();
            }

            var detalhe = new string(' ', 400);

            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1");
                // Débito Autómático em C/C
                detalhe = detalhe.PreencherValorNaLinha(2, 6, string.Empty.PadLeft(5, '0'));
                detalhe = detalhe.PreencherValorNaLinha(7, 7, "0");
                detalhe = detalhe.PreencherValorNaLinha(8, 12, string.Empty.PadLeft(5, '0'));
                detalhe = detalhe.PreencherValorNaLinha(13, 19, string.Empty.PadLeft(7, '0'));
                detalhe = detalhe.PreencherValorNaLinha(20, 20, "0");

                #region POSIÇÃO: 21-37 - IDENTIFICAÇÃO DA EMPRESA CEDENTE NO BANCO

                detalhe = detalhe.PreencherValorNaLinha(21, 37, infoDetalhe.CodigoCedente.PadLeft(17, '0'));

                #endregion

                const string doc       = "DOC";
                var          seuNumero = doc + infoDetalhe.NossoNumeroFormatado.PadRight(25 - doc.Length, ' ');

                detalhe = detalhe.PreencherValorNaLinha(38, 62, seuNumero);
                detalhe = detalhe.PreencherValorNaLinha(63, 65, "237");
                detalhe = detalhe.PreencherValorNaLinha(66, 66, "0");    // Sem cobrança de multa
                detalhe = detalhe.PreencherValorNaLinha(67, 70, "0000"); // Percentual de multa
                detalhe = detalhe.PreencherValorNaLinha(71, 81, infoDetalhe.NossoNumero.PadLeft(11, '0'));
                detalhe = detalhe.PreencherValorNaLinha(82, 82, infoDetalhe.DvNossoNumero);

                #region VALOR DESCONTO POR DIA

                var valorDescontoDia = string.Empty;

                if (infoDetalhe.ValorDescontoDia.ToString().Contains('.') && infoDetalhe.ValorDescontoDia.ToString().Contains(','))
                {
                    valorDescontoDia = infoDetalhe.ValorDescontoDia.ToString().Replace(".", "").Replace(",", "");
                    detalhe          = detalhe.PreencherValorNaLinha(83, 92, valorDescontoDia.PadLeft(10, '0'));
                }
                if (infoDetalhe.ValorDesconto.ToString().Contains('.'))
                {
                    valorDescontoDia = infoDetalhe.ValorDescontoDia.ToString().Replace(".", "");
                    detalhe          = detalhe.PreencherValorNaLinha(83, 92, valorDescontoDia.PadLeft(10, '0'));
                }
                if (infoDetalhe.ValorDesconto.ToString().Contains(','))
                {
                    valorDescontoDia = infoDetalhe.ValorDescontoDia.ToString().Replace(",", "");
                    detalhe          = detalhe.PreencherValorNaLinha(83, 92, valorDescontoDia.PadLeft(10, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(83, 92, valorDescontoDia.PadLeft(10, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(93, 93, "2");
                detalhe = detalhe.PreencherValorNaLinha(94, 94, "N");
                detalhe = detalhe.PreencherValorNaLinha(95, 104, string.Empty.PadLeft(10, ' '));
                detalhe = detalhe.PreencherValorNaLinha(105, 105, " ");
                detalhe = detalhe.PreencherValorNaLinha(106, 106, "2");
                detalhe = detalhe.PreencherValorNaLinha(107, 108, string.Empty.PadLeft(2, ' '));
                detalhe = detalhe.PreencherValorNaLinha(109, 110, "01");
                detalhe = detalhe.PreencherValorNaLinha(111, 120, infoDetalhe.NumeroDocumento.PadLeft(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));

                #region VALOR BOLETO

                detalhe = detalhe.PreencherValorNaLinha(127, 139,
                                                        infoDetalhe.ValorBoleto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(13, '0'));

                #endregion

                //if (infoDetalhe.CodigoOcorrencia.Codigo.Equals(01))
                //{
                //    detalhe = detalhe.PreencherValorNaLinha(140, 142, string.Empty.PadLeft(3, '0'));
                //    detalhe = detalhe.PreencherValorNaLinha(143, 147, string.Empty.PadLeft(5, '0'));
                //}
                //else
                //{
                //    detalhe = detalhe.PreencherValorNaLinha(140, 142, infoDetalhe.CodigoBanco.PadLeft(3, '0'));
                //    detalhe = detalhe.PreencherValorNaLinha(143, 147, infoDetalhe.Agencia.PadLeft(4, '0') + infoDetalhe.DvAgencia);
                //}

                detalhe = detalhe.PreencherValorNaLinha(140, 142, string.Empty.PadLeft(3, '0'));
                detalhe = detalhe.PreencherValorNaLinha(143, 147, string.Empty.PadLeft(5, '0'));

                detalhe = detalhe.PreencherValorNaLinha(148, 149,
                                                        infoDetalhe.Especie.Sigla.Equals("DM")
                        ? "01"
                        : infoDetalhe.Especie.Codigo.ToString());
                detalhe = detalhe.PreencherValorNaLinha(150, 150, infoDetalhe.Aceite.Equals("A") ? "A" : "N");
                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));

                #region INSTRUÇÕES REMESSA


                var primeiraInstrucao = infoDetalhe.Instrucao1;
                var segundaInstrucao  = infoDetalhe.Instrucao2;

                if (primeiraInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, primeiraInstrucao);
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, "00");
                }
                if (segundaInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, segundaInstrucao);
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, "00");
                }

                #endregion

                #region VALOR JUROS

                var jurosBoleto = string.Empty;

                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains('.') && infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains(','))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(".", "").Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains('.'))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(".", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains(','))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(",", "");
                    detalhe     = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));
                // Valor de Mora Por Dia de Atraso

                #endregion

                if (infoDetalhe.DataLimiteConcessaoDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy"));
                }
                // Data Limite para Concesão de Desconto

                #region VALOR DESCONTO

                detalhe = detalhe.PreencherValorNaLinha(180, 192, infoDetalhe.ValorDesconto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(13, '0'));

                #endregion

                #region VALOR IOF

                string iofBoleto;

                if (infoDetalhe.ValorIof.ToString().Contains('.') && infoDetalhe.ValorIof.ToString().Contains(','))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(".", "").Replace(",", "");
                    detalhe   = detalhe.PreencherValorNaLinha(193, 205, iofBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorIof.ToString().Contains('.'))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(".", "");
                    detalhe   = detalhe.PreencherValorNaLinha(193, 205, iofBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorIof.ToString().Contains(','))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(",", "");
                    detalhe   = detalhe.PreencherValorNaLinha(193, 205, iofBoleto.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(193, 205, infoDetalhe.ValorIof.ToString().PadLeft(13, '0'));
                // Valor do I.O.F. recolhido p/ notas seguro

                #endregion

                #region VALOR ABATIMENTO

                string abatimentoBoleto;

                if (infoDetalhe.ValorAbatimento.ToString().Contains('.') && infoDetalhe.ValorAbatimento.ToString().Contains(','))
                {
                    abatimentoBoleto = infoDetalhe.ValorAbatimento.ToString().Replace(".", "").Replace(",", "");
                    detalhe          = detalhe.PreencherValorNaLinha(206, 218, abatimentoBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorAbatimento.ToString().Contains('.'))
                {
                    abatimentoBoleto = infoDetalhe.ValorAbatimento.ToString().Replace(".", "");
                    detalhe          = detalhe.PreencherValorNaLinha(206, 218, abatimentoBoleto.PadLeft(13, '0'));
                }
                if (infoDetalhe.ValorAbatimento.ToString().Contains(','))
                {
                    abatimentoBoleto = infoDetalhe.ValorAbatimento.ToString().Replace(",", "");
                    detalhe          = detalhe.PreencherValorNaLinha(206, 218, abatimentoBoleto.PadLeft(13, '0'));
                }

                detalhe = detalhe.PreencherValorNaLinha(206, 218, infoDetalhe.ValorAbatimento.ToString().PadLeft(13, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(219, 220,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11 ? "01" : "02"); // Identificação do tipo de inscrição/sacado
                detalhe = detalhe.PreencherValorNaLinha(221, 234, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 274, nomeSacado);
                detalhe = detalhe.PreencherValorNaLinha(275, 314, enderecoSacado);

                #region 1ª Mensagem

                /* POSIÇÃO: 315 a 326 - 1ª Mensagem
                 * Campo livre para uso da empresa.
                 * A mensagem enviada nesse campo será impressa somente no boleto enão será confirmada no arquivo retorno.
                 */
                detalhe = detalhe.PreencherValorNaLinha(315, 326, string.Empty.PadLeft(12, ' ')); // 1ª Mensagem

                #endregion

                var cep = infoDetalhe.CepPagador;

                if (cep.Contains(".") && cep.Contains("-"))
                {
                    cep = cep.Replace(".", "").Replace("-", "");
                }
                if (cep.Contains("."))
                {
                    cep = cep.Replace(".", "");
                }
                if (cep.Contains("-"))
                {
                    cep = cep.Replace("-", "");
                }

                detalhe = detalhe.PreencherValorNaLinha(327, 334, cep.PadLeft(8, ' ')); // Cep do Sacado

                #region 2ª Mensagem / Sacador Avalista

                /* Sacador / Avalista ou 2ª Mensagem
                 * CNPJ/CPF do Sacador Avalista ( o critério para preenchimento, deve ser o mesmo tanto para o
                 * CNPJ como para o CPF ou seja, iniciando da direita para a esquerda:
                 * - 2 posições para o controle;
                 * - 4 posições para filial; e
                 * - 9 posições para o CNPJ/CPF.
                 * Obs.: No caso de CPF, o campo filial deverá ser preenchido com zeros.
                 * COMPOSIÇÃO DAS POSIÇÕES 335-394
                 * 15 Numéricos
                 * 02 Brancos
                 * 43 Alfanumérico
                 */

                string str = string.Empty;

                if (String.IsNullOrEmpty(infoDetalhe.NomeAvalistaOuMensagem2))
                {
                    detalhe = detalhe.PreencherValorNaLinha(335, 394, str.PadLeft(60, ' '));
                }
                //else
                //{
                //    if (boleto.SacadoBoleto.CpfCnpjAvalista.Replace(".", "").Replace("/", "").Replace("-", "").Length ==
                //        11)
                //    {
                //        str = (boleto.SacadoBoleto.NomeAvalista.ToUpper() +
                //               string.Empty.PadLeft(2, ' ') +
                //               boleto.SacadoBoleto.CpfCnpjAvalista.Replace(".", "")
                //                   .Replace("/", "")
                //                   .Replace("-", "")
                //                   .Substring(0, 9) +
                //               string.Empty.PadLeft(4, '0') +
                //               boleto.SacadoBoleto.CpfCnpjAvalista.Replace(".", "")
                //                   .Replace("/", "")
                //                   .Replace("-", "")
                //                   .Substring(9, 2));
                //    }
                //    else
                //    {
                //        str = (boleto.SacadoBoleto.NomeAvalista.ToUpper() +
                //               string.Empty.PadLeft(2, ' ') +
                //               boleto.SacadoBoleto.CpfCnpjAvalista.Replace(".", "")
                //                   .Replace("/", "")
                //                   .Replace("-", "")
                //                   .PadLeft(15, '0'));
                //    }

                //    detalhe = detalhe.PreencherValorNaLinha(335, 394, str.PadLeft(60, ' '));
                //}

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(395, 400, infoDetalhe.NumeroSequencialRegistro.ToString().PadLeft(6, '0'));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe, int sequenciaDetalhe)
        {
            if (String.IsNullOrEmpty(infoDetalhe.BairroPagador))
            {
                throw new Exception("Não foi informado o bairro do pagador " + infoDetalhe.NomePagador + "(" +
                                    infoDetalhe.InscricaoPagador + ")");
            }

            if (String.IsNullOrEmpty(infoDetalhe.CepPagador) || infoDetalhe.CepPagador.Length < 8)
            {
                throw new Exception("CEP inválido! Verifique o CEP do pagador " + infoDetalhe.NomePagador + "(" +
                                    infoDetalhe.InscricaoPagador + ")");
            }

            if (String.IsNullOrEmpty(infoDetalhe.NumeroDocumento))
            {
                throw new Exception("Informe um número de documento!");
            }


            #region Variáveis
            var detalhe = new string(' ', 400);
            try
            {
                var objBanco = BancoFactory.ObterBanco(infoDetalhe.CodigoBanco);

                string nossoNumeroSequencial =
                    infoDetalhe.NossoNumeroFormatado.Replace(".", "").Replace("/", "").Replace("-", "");

                #endregion

                infoDetalhe.Instrucao1 = infoDetalhe.Instrucao1 == null ? "01" : infoDetalhe.Instrucao1;
                #region Instrução1

                /* Este campo só permite usar os seguintes códigos:
                 *  01 - Cadastro de Títulos
                 *  02 - Pedido de Baixa
                 *  04 - Concessão de Abatimento
                 *  05 - Cancelamento de Abatimento
                 *  06 - Alteração de Vencimento
                 *  09 - Pedido de Protesto
                 *  18 - Sustar protesto e baixar título
                 *  19 - Sustar protesto e manter em carteira
                 *  31 - Alteração de outros dados
                 *  45 - Incluir negativação
                 *  75 - Excluir negativação e manter na carteira
                 *  76 - Excluir negativação e baixar títulos
                 */
                #endregion

                /*Código adotado pela FEBRABAN para identificação do tipo de pagamento de multa.
                 *  Domínio:
                 *  ‘1’ = Valor Fixo (R$)
                 *  ‘2’ = Taxa (%)
                 *  ‘3’ = Isento
                 */
                var codigoMulta = infoDetalhe.PercentualMulta > 0 ? "2" : "3";

                /*Código adotado pela FEBRABAN para identificação do tipo de pagamento de mora de juros.
                 *  Domínio:
                 *  ‘1’ = Valor Diário (R$)
                 *  ‘2’ = Taxa Mensal (%)
                 *  ‘3’= Valor Mensal (R$) *
                 *  ‘4’ = Taxa diária (%)
                 *  ‘5’ = Isento
                 * OBSERVAÇÃO:
                 *  ‘3’ - Valor Mensal (R$): a CIP não acata valor mensal, segundo manual. Cógido mantido
                 *  para Correspondentes que ainda utilizam.*/
                var codigoMora = infoDetalhe.ValorMoraDia > 0 ? "1" : "5";;

                /*Código adotado pela FEBRABAN para identificação do desconto.
                 *  Domínio:
                 *  0 = Isento
                 *  1 = Valor Fixo*/
                var codigoDesconto = infoDetalhe.ValorDesconto > 0 ? "1" : "0";

                /*Código para Protesto*
                 *  Código adotado pela FEBRABAN para identificar o tipo de prazo a ser considerado para o
                 *  protesto.
                 *  Domínio:
                 *  1 = Protestar Dias Corridos
                 *  2 = Protestar Dias Úteis
                 *  3 = Não Protestar
                 */
                var protesto = infoDetalhe.NroDiasParaProtesto > 0 ? "2" : "3";

                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1");                                            // Identificação do Registro Transação
                detalhe = detalhe.PreencherValorNaLinha(2, 6, infoDetalhe.Agencia.ToString().PadLeft(5, '0')); //Agência do BENEFICIÁRIO na UNICRED
                detalhe = detalhe.PreencherValorNaLinha(7, 7, infoDetalhe.DvAgencia.PadRight(1, ' '));
                detalhe = detalhe.PreencherValorNaLinha(8, 19, infoDetalhe.ContaCorrente.ToString().PadLeft(12, '0'));
                detalhe = detalhe.PreencherValorNaLinha(20, 20, infoDetalhe.DvContaCorrente.ToString().PadRight(1, ' '));
                detalhe = detalhe.PreencherValorNaLinha(21, 21, "0");
                detalhe = detalhe.PreencherValorNaLinha(22, 24, "021");                         //Código carteira
                detalhe = detalhe.PreencherValorNaLinha(25, 37, string.Empty.PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(38, 62, string.Empty.PadLeft(25, ' ')); //Uso Empresa
                detalhe = detalhe.PreencherValorNaLinha(63, 65, "136");                         //cod Banco
                detalhe = detalhe.PreencherValorNaLinha(66, 67, "00");
                detalhe = detalhe.PreencherValorNaLinha(68, 92, string.Empty.PadLeft(25, ' '));
                detalhe = detalhe.PreencherValorNaLinha(93, 93, "0");
                detalhe = detalhe.PreencherValorNaLinha(94, 94, codigoMulta);
                detalhe = detalhe.PreencherValorNaLinha(95, 104, infoDetalhe.PercentualMulta.ToStringParaValoresDecimais().PadLeft(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(105, 105, codigoMora);
                detalhe = detalhe.PreencherValorNaLinha(106, 106, "N");
                detalhe = detalhe.PreencherValorNaLinha(107, 108, string.Empty.PadLeft(2, ' '));
                detalhe = detalhe.PreencherValorNaLinha(109, 110, "01");                                                           /*01 = remessa*/
                detalhe = detalhe.PreencherValorNaLinha(111, 120, infoDetalhe.NumeroDocumento.PadRight(10, ' '));
                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy").Replace("/", "")); /*A data de vencimento deve ser sete dias MAIOR que a data de emissão (campos 151-156). Formato: DDMMAA*/
                detalhe = detalhe.PreencherValorNaLinha(127, 139, infoDetalhe.ValorBoleto.ToStringParaValoresDecimais().PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(140, 149, string.Empty.PadLeft(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(150, 150, codigoDesconto);
                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy").Replace("/", ""));
                detalhe = detalhe.PreencherValorNaLinha(157, 157, "0");
                detalhe = detalhe.PreencherValorNaLinha(158, 158, protesto);
                detalhe = detalhe.PreencherValorNaLinha(159, 160, infoDetalhe.NroDiasParaProtesto.ToString().PadLeft(2, '0'));

                var valorMora = Math.Round((infoDetalhe.ValorBoleto * (infoDetalhe.ValorMoraDia / 100)) / 30, 2);

                detalhe = detalhe.PreencherValorNaLinha(161, 173, valorMora.ToStringParaValoresDecimais().PadLeft(13, '0'));

                if (infoDetalhe.DataLimiteConcessaoDesconto > DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy").Replace("/", ""));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, "000000");
                }

                detalhe = detalhe.PreencherValorNaLinha(180, 192, infoDetalhe.ValorDesconto.ToStringParaValoresDecimais().PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(193, 203, infoDetalhe.NossoNumeroFormatado.Replace("/", "").Replace("-", "").PadLeft(11, '0'));
                detalhe = detalhe.PreencherValorNaLinha(204, 205, "00");
                detalhe = detalhe.PreencherValorNaLinha(206, 218, infoDetalhe.ValorAbatimento.ToStringParaValoresDecimais().PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(219, 220, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11 ? "01" : "02");
                detalhe = detalhe.PreencherValorNaLinha(221, 234, infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 274, infoDetalhe.NomePagador.PadLeft(40, ' '));

                string endereco = infoDetalhe.EnderecoPagador.Replace(".", "").Replace("/", "").Replace(",", "").Replace("-", "");
                if (endereco.Length > 40)
                {
                    endereco = endereco.Substring(0, 40);
                }

                string bairro = infoDetalhe.BairroPagador.Replace(".", "").Replace("/", "").Replace(",", "").Replace("-", "");
                if (bairro.Length > 12)
                {
                    bairro = bairro.Substring(0, 12);
                }

                string cidade = infoDetalhe.CidadePagador.Replace(".", "").Replace("/", "").Replace("-", "");
                if (cidade.Length > 20)
                {
                    cidade = cidade.Substring(0, 20);
                }

                detalhe = detalhe.PreencherValorNaLinha(275, 314, endereco.PadRight(40, ' '));
                detalhe = detalhe.PreencherValorNaLinha(315, 326, bairro.PadRight(12, ' '));
                detalhe = detalhe.PreencherValorNaLinha(327, 334, infoDetalhe.CepPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadRight(8, ' '));
                detalhe = detalhe.PreencherValorNaLinha(335, 354, cidade.PadRight(20, ' '));
                detalhe = detalhe.PreencherValorNaLinha(355, 356, infoDetalhe.UfPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadRight(2, ' '));
                detalhe = detalhe.PreencherValorNaLinha(357, 394, string.Empty.PadLeft(38, ' '));
                detalhe = detalhe.PreencherValorNaLinha(395, 400, sequenciaDetalhe.ToString().PadLeft(6, '0'));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe)
        {
            if (infoDetalhe == null)
            {
                throw new Exception("Não há boleto para geração do DETALHE");
            }

            if (infoDetalhe.NumeroSequencialRegistro == 0)
            {
                throw new Exception("Sequencial do registro não foi informado na geração do DETALHE.");
            }

            string enderecoSacado = string.Empty;
            string nomeSacado     = string.Empty;

            if (String.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado.PadRight(38, ' ');
            }
            else if (infoDetalhe.EnderecoPagador.Length > 38)
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Substring(0, 38).ToUpper();
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.PadRight(38, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado.PadRight(40, ' ');
            }
            else if (infoDetalhe.NomePagador.Length > 40)
            {
                nomeSacado = infoDetalhe.NomePagador.Substring(0, 40).ToUpper();
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.PadRight(40, ' ').ToUpper();
            }

            var detalhe = new string(' ', 400);

            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 1, "1");

                var tipoIncricaoCedente = "99"; //99 - Outros
                if (infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11)
                {
                    tipoIncricaoCedente = "01"; //01 - CPF
                }
                else if (infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11)
                {
                    tipoIncricaoCedente = "02"; //02 - CNPJ
                }
                else if (infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").Length == 0)
                {
                    tipoIncricaoCedente = "98"; //98 - Não tem
                }
                detalhe = detalhe.PreencherValorNaLinha(2, 3, tipoIncricaoCedente);

                detalhe = detalhe.PreencherValorNaLinha(4, 17,
                                                        infoDetalhe.InscricaoCedente.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));

                detalhe = detalhe.PreencherValorNaLinha(18, 18, "0"); //Numérico igual a “0” (zero)

                detalhe = detalhe.PreencherValorNaLinha(19, 22, infoDetalhe.Agencia.PadLeft(4, '0'));
                detalhe = detalhe.PreencherValorNaLinha(23, 24, "55"); //Numérico igual a “55”
                detalhe = detalhe.PreencherValorNaLinha(25, 35,
                                                        infoDetalhe.Agencia.PadLeft(4, '0') + infoDetalhe.ContaCorrente.PadLeft(5, '0') +
                                                        infoDetalhe.DvContaCorrente.PadLeft(2, '0'));
                detalhe = detalhe.PreencherValorNaLinha(36, 37, string.Empty.PadLeft(2, ' '));

                const string doc       = "DOC";
                var          seuNumero = doc + infoDetalhe.NossoNumeroFormatado.PadRight(25 - doc.Length, ' ');
                detalhe = detalhe.PreencherValorNaLinha(38, 62, seuNumero);
                detalhe = detalhe.PreencherValorNaLinha(63, 73, infoDetalhe.NossoNumeroFormatado.PadLeft(11, '0'));

                #region DESCONTO 2/3

                detalhe = detalhe.PreencherValorNaLinha(74, 79, string.Empty.PadLeft(6, '0'));
                detalhe = detalhe.PreencherValorNaLinha(80, 90, string.Empty.PadLeft(11, '0'));

                detalhe = detalhe.PreencherValorNaLinha(91, 96, string.Empty.PadLeft(6, '0'));
                detalhe = detalhe.PreencherValorNaLinha(97, 107, string.Empty.PadLeft(11, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(108, 108, "1"); //1 - Cobrança Simples
                detalhe = detalhe.PreencherValorNaLinha(109, 110, "01");
                detalhe = detalhe.PreencherValorNaLinha(111, 120,
                                                        infoDetalhe.NumeroDocumento.BoletoBrToInt().BoletoBrToStringSafe().PadLeft(10, '0'));
                detalhe = detalhe.PreencherValorNaLinha(121, 126, infoDetalhe.DataVencimento.ToString("ddMMyy"));

                #region VALOR BOLETO

                detalhe = detalhe.PreencherValorNaLinha(127, 139,
                                                        infoDetalhe.ValorBoleto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(13, '0'));

                #endregion

                detalhe = detalhe.PreencherValorNaLinha(140, 142, "399");
                detalhe = detalhe.PreencherValorNaLinha(143, 147, string.Empty.PadLeft(5, '0'));

                //COBRANÇA  ESCRITURAL 09-CE – Cobrança com emissão total do Boleto pelo Banco
                //COBRANÇA  DIRETIVA  98-PD – Cobrança com emissão total do Boleto pelo cliente
                if (infoDetalhe.BancoEmiteBoleto)
                {
                    detalhe = detalhe.PreencherValorNaLinha(148, 149, infoDetalhe.Especie.Sigla.Equals("DM")
                        ? "09"
                        : infoDetalhe.Especie.Codigo.ToString());
                }
                else
                {
                    if (infoDetalhe.Especie.Sigla.Equals("DM") || infoDetalhe.Especie.Sigla.Equals("PD"))
                    {
                        detalhe = detalhe.PreencherValorNaLinha(148, 149, "98");
                    }
                    else
                    {
                        detalhe = detalhe.PreencherValorNaLinha(148, 149,
                                                                infoDetalhe.Especie.Codigo.ToString().PadLeft(2, '0'));
                    }
                }

                detalhe = detalhe.PreencherValorNaLinha(150, 150, infoDetalhe.Aceite.Equals("A") ? "A" : "N");
                detalhe = detalhe.PreencherValorNaLinha(151, 156, infoDetalhe.DataEmissao.ToString("ddMMyy"));

                #region INSTRUÇÕES REMESSA

                var primeiraInstrucao = infoDetalhe.Instrucao1;
                var segundaInstrucao  = infoDetalhe.Instrucao2;

                if (primeiraInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, primeiraInstrucao);
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(157, 158, "00");
                }

                if (segundaInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, segundaInstrucao);
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(159, 160, "00");
                }

                #endregion

                #region VALOR JUROS

                var jurosBoleto = string.Empty;
                if (infoDetalhe.ValorMoraDia > 0)
                {
                    var valorCobrarJuroDia = infoDetalhe.ValorBoleto * ((infoDetalhe.ValorMoraDia / 30) / 100);
                    infoDetalhe.ValorCobradoDiaAtraso = Math.Round(valorCobrarJuroDia, 2);
                }

                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains('.') &&
                    infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains(','))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(".", "").Replace(",", "");
                }
                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains('.'))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(".", "");
                }
                if (infoDetalhe.ValorCobradoDiaAtraso.ToString().Contains(','))
                {
                    jurosBoleto = infoDetalhe.ValorCobradoDiaAtraso.ToString().Replace(",", "");
                }

                detalhe = detalhe.PreencherValorNaLinha(161, 173, jurosBoleto.PadLeft(13, '0'));

                #endregion

                #region DESCONTO 1

                if (infoDetalhe.DataLimiteConcessaoDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179, string.Empty.PadLeft(6, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(174, 179,
                                                            infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyy"));
                }

                var valorDescontoDia = string.Empty;

                if (infoDetalhe.ValorDescontoDia.ToString().Contains('.') &&
                    infoDetalhe.ValorDescontoDia.ToString().Contains(','))
                {
                    valorDescontoDia = infoDetalhe.ValorDescontoDia.ToString().Replace(".", "").Replace(",", "");
                }
                if (infoDetalhe.ValorDesconto.ToString().Contains('.'))
                {
                    valorDescontoDia = infoDetalhe.ValorDescontoDia.ToString().Replace(".", "");
                }
                if (infoDetalhe.ValorDesconto.ToString().Contains(','))
                {
                    valorDescontoDia = infoDetalhe.ValorDescontoDia.ToString().Replace(",", "");
                }

                detalhe = detalhe.PreencherValorNaLinha(180, 192, valorDescontoDia.PadLeft(13, '0'));

                #endregion

                #region VALOR IOF

                string iofBoleto;
                if (infoDetalhe.ValorIof.ToString().Contains('.') && infoDetalhe.ValorIof.ToString().Contains(','))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(".", "").Replace(",", "");
                }
                if (infoDetalhe.ValorIof.ToString().Contains('.'))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(".", "");
                }
                if (infoDetalhe.ValorIof.ToString().Contains(','))
                {
                    iofBoleto = infoDetalhe.ValorIof.ToString().Replace(",", "");
                }

                detalhe = detalhe.PreencherValorNaLinha(193, 205, infoDetalhe.ValorIof.ToString().PadLeft(13, '0'));

                #endregion

                #region PERCENTUAL MULTA

                if (infoDetalhe.PercentualMulta.BoletoBrToStringSafe().BoletoBrToDecimal() > 0)
                {
                    var multaCalculada = infoDetalhe.ValorBoleto * (infoDetalhe.PercentualMulta / 100);
                    var multaBoleto    = string.Empty;

                    if (multaCalculada.ToString().Contains('.') && multaCalculada.ToString().Contains(','))
                    {
                        multaBoleto = multaCalculada.ToString().Replace(".", "").Replace(",", "");
                    }
                    if (multaCalculada.ToString().Contains('.'))
                    {
                        multaBoleto = multaCalculada.ToString().Replace(".", "");
                    }
                    if (multaCalculada.ToString().Contains(','))
                    {
                        multaBoleto = multaCalculada.ToString().Replace(",", "");
                    }

                    detalhe = detalhe.PreencherValorNaLinha(206, 215, multaBoleto.ToString().PadLeft(10, '0'));
                    detalhe = detalhe.PreencherValorNaLinha(216, 218, "000");
                }
                else
                {
                    // Sem multa
                    detalhe = detalhe.PreencherValorNaLinha(206, 218, string.Empty.PadLeft(13, '0'));
                }

                #endregion

                var tipoIncricaoSacado = "99"; //99 - Outros
                if (infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11)
                {
                    tipoIncricaoSacado = "01"; //01 - CPF
                }
                else if (infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 11)
                {
                    tipoIncricaoSacado = "02"; //02 - CNPJ
                }
                else if (infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length == 0)
                {
                    tipoIncricaoSacado = "98"; //98 - Não tem
                }
                detalhe = detalhe.PreencherValorNaLinha(219, 220, tipoIncricaoSacado);
                detalhe = detalhe.PreencherValorNaLinha(221, 234,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(235, 274, nomeSacado);
                detalhe = detalhe.PreencherValorNaLinha(275, 312, enderecoSacado);

                detalhe = detalhe.PreencherValorNaLinha(313, 314, string.Empty.PadRight(2, ' '));

                string bairroSacado = string.Empty;
                if (infoDetalhe.BairroPagador.BoletoBrToStringSafe().Trim().Length > 12)
                {
                    bairroSacado = infoDetalhe.BairroPagador.BoletoBrToStringSafe().Trim().ExtrairValorDaLinha(1, 12);
                }
                else
                {
                    bairroSacado = infoDetalhe.BairroPagador;
                }
                detalhe = detalhe.PreencherValorNaLinha(315, 326, bairroSacado.PadRight(12, ' '));

                var cep = infoDetalhe.CepPagador;
                if (cep.Contains(".") && cep.Contains("-"))
                {
                    cep = cep.Replace(".", "").Replace("-", "");
                }
                if (cep.Contains("."))
                {
                    cep = cep.Replace(".", "");
                }
                if (cep.Contains("-"))
                {
                    cep = cep.Replace("-", "");
                }

                detalhe = detalhe.PreencherValorNaLinha(327, 334, cep.PadLeft(8, ' '));

                string cidadeSacado = string.Empty;
                if (infoDetalhe.CidadePagador.BoletoBrToStringSafe().Trim().Length > 15)
                {
                    cidadeSacado = infoDetalhe.CidadePagador.BoletoBrToStringSafe().Trim().ExtrairValorDaLinha(1, 15);
                }
                else
                {
                    cidadeSacado = infoDetalhe.CidadePagador;
                }
                detalhe = detalhe.PreencherValorNaLinha(335, 349, cidadeSacado.PadRight(15, ' '));

                string ufSacado = string.Empty;
                if (infoDetalhe.UfPagador.BoletoBrToStringSafe().Trim().Length > 2)
                {
                    ufSacado = infoDetalhe.UfPagador.BoletoBrToStringSafe().Trim().ExtrairValorDaLinha(1, 2);
                }
                else
                {
                    ufSacado = infoDetalhe.UfPagador;
                }
                detalhe = detalhe.PreencherValorNaLinha(350, 351, ufSacado.PadRight(2, ' '));

                string avalista = string.Empty;
                if (infoDetalhe.NomeAvalistaOuMensagem2.BoletoBrToStringSafe().Trim().Length > 0)
                {
                    if (infoDetalhe.NomeAvalistaOuMensagem2.BoletoBrToStringSafe().Trim().Length > 39)
                    {
                        avalista =
                            infoDetalhe.NomeAvalistaOuMensagem2.BoletoBrToStringSafe().Trim().ExtrairValorDaLinha(1, 39);
                    }
                    else
                    {
                        avalista = infoDetalhe.NomeAvalistaOuMensagem2.BoletoBrToStringSafe().Trim();
                    }
                }
                detalhe = detalhe.PreencherValorNaLinha(352, 390, avalista.PadRight(39, ' '));

                detalhe = detalhe.PreencherValorNaLinha(391, 391, "N");
                detalhe = detalhe.PreencherValorNaLinha(392, 393, string.Empty.PadLeft(2, ' '));
                detalhe = detalhe.PreencherValorNaLinha(394, 394, "9");

                detalhe = detalhe.PreencherValorNaLinha(395, 400,
                                                        infoDetalhe.NumeroSequencialRegistro.ToString().PadLeft(6, '0'));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
示例#28
0
        public string EscreverDetalhe(DetalheRemessaCnab400 infoDetalhe)
        {
            if (infoDetalhe.TipoCarteiraCobranca != "1" &&
                infoDetalhe.TipoCarteiraCobranca != "2" &&
                infoDetalhe.TipoCarteiraCobranca != "3")
            {
                throw new Exception(
                          "Informe o tipo carteira de cobrança. 1- Sem Registro; 2- Com Registro- Impressão Local ou 3- Com Registro- Impressão pelo BRB");
            }

            #region Variáveis

            var objBanco = BancoFactory.ObterBanco(infoDetalhe.CodigoBanco);

            var enderecoSacado = string.Empty;
            var cidadeSacado   = string.Empty;
            var nomeSacado     = string.Empty;
            var tipoSacado     = string.Empty;

            #endregion

            if (String.IsNullOrEmpty(infoDetalhe.EnderecoPagador))
            {
                enderecoSacado.PadRight(35, ' ');
            }
            else
            {
                enderecoSacado = infoDetalhe.EnderecoPagador.Length > 35
                    ? infoDetalhe.EnderecoPagador.ExtrairValorDaLinha(0, 35).ToUpper()
                    : infoDetalhe.EnderecoPagador.PadRight(35, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.CidadePagador))
            {
                cidadeSacado.PadRight(15, ' ');
            }
            else
            {
                cidadeSacado = infoDetalhe.CidadePagador.Length > 15
                    ? infoDetalhe.CidadePagador.ExtrairValorDaLinha(0, 15).ToUpper()
                    : infoDetalhe.CidadePagador.PadRight(15, ' ').ToUpper();
            }

            if (String.IsNullOrEmpty(infoDetalhe.NomePagador))
            {
                nomeSacado.PadRight(35, ' ');
            }
            else
            {
                nomeSacado = infoDetalhe.NomePagador.Length > 35
                    ? infoDetalhe.NomePagador.ExtrairValorDaLinha(0, 35).ToUpper()
                    : infoDetalhe.NomePagador.PadRight(35, ' ').ToUpper();
            }

            //1- Física; 2- Jurídica ou 9- Isenta
            switch (infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").Length)
            {
            case 11:
                tipoSacado = "1";
                break;

            case 14:
                tipoSacado = "2";
                break;

            default:
                tipoSacado = "9";
                break;
            }

            var detalhe = new string(' ', 400);
            try
            {
                detalhe = detalhe.PreencherValorNaLinha(1, 2, "01"); // Identificação do Registro Transação
                detalhe = detalhe.PreencherValorNaLinha(3, 5, infoDetalhe.Agencia);
                detalhe = detalhe.PreencherValorNaLinha(6, 12,
                                                        (infoDetalhe.ContaCorrente + infoDetalhe.DvContaCorrente).PadLeft(7, '0'));
                detalhe = detalhe.PreencherValorNaLinha(13, 26,
                                                        infoDetalhe.InscricaoPagador.Replace(".", "").Replace("/", "").Replace("-", "").PadRight(14, ' '));
                detalhe = detalhe.PreencherValorNaLinha(27, 61, nomeSacado);
                detalhe = detalhe.PreencherValorNaLinha(62, 96, enderecoSacado);
                detalhe = detalhe.PreencherValorNaLinha(97, 111, cidadeSacado);
                detalhe = detalhe.PreencherValorNaLinha(112, 113, infoDetalhe.UfPagador.PadRight(2, ' '));
                detalhe = detalhe.PreencherValorNaLinha(114, 121,
                                                        infoDetalhe.CepPagador.Replace(".", "").Replace("-", "").PadLeft(8, '0'));
                detalhe = detalhe.PreencherValorNaLinha(122, 122, tipoSacado);
                detalhe = detalhe.PreencherValorNaLinha(123, 135, infoDetalhe.NumeroDocumento.PadLeft(13, '0'));
                detalhe = detalhe.PreencherValorNaLinha(136, 136, infoDetalhe.TipoCarteiraCobranca);
                detalhe = detalhe.PreencherValorNaLinha(137, 144, infoDetalhe.DataEmissao.ToString("ddMMyyyy"));
                detalhe = detalhe.PreencherValorNaLinha(145, 146, infoDetalhe.Especie.Codigo.ToString());

                //0- Simples
                detalhe = detalhe.PreencherValorNaLinha(147, 147, "0");

                //0- No vencimento; 1- À Vista ou 2- Contra Apresentação
                detalhe = detalhe.PreencherValorNaLinha(148, 148, "0");

                //02- Real; 51- UFIR ou 91- UPDF
                detalhe = detalhe.PreencherValorNaLinha(149, 150, "02");

                detalhe = detalhe.PreencherValorNaLinha(151, 153, "070");
                detalhe = detalhe.PreencherValorNaLinha(154, 157, infoDetalhe.Agencia.PadLeft(4, '0'));
                //detalhe = detalhe.PreencherValorNaLinha(158, 187, " ");
                detalhe = detalhe.PreencherValorNaLinha(188, 195, infoDetalhe.DataVencimento.ToString("ddMMyyyy"));
                detalhe = detalhe.PreencherValorNaLinha(196, 209,
                                                        infoDetalhe.ValorBoleto.ToString("f").Replace(".", "").Replace(",", "").PadLeft(14, '0'));

                if (infoDetalhe.TipoCarteiraCobranca == "3")
                {
                    detalhe = detalhe.PreencherValorNaLinha(210, 221, string.Empty.PadLeft(12, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(210, 221, infoDetalhe.NossoNumeroFormatado);
                }

                //00- Sem Juros ('Não Cobrar Juros');
                //50-Diário ("Juro de mora ao dia de...") ou
                //51- Mensal ("Juro de mora ao mês de ...%")
                if (infoDetalhe.TipoCobrancaJuro == TipoCobrancaJuro.JurosDiario)
                {
                    detalhe = detalhe.PreencherValorNaLinha(222, 223, "50");
                }
                else if (infoDetalhe.TipoCobrancaJuro == TipoCobrancaJuro.JurosMensal)
                {
                    detalhe = detalhe.PreencherValorNaLinha(222, 223, "51");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(222, 223, "00");
                }

                detalhe = detalhe.PreencherValorNaLinha(224, 237,
                                                        infoDetalhe.ValorJuros.ToString("f").Replace(",", "").PadLeft(14, '0'));
                detalhe = detalhe.PreencherValorNaLinha(238, 251,
                                                        infoDetalhe.ValorAbatimento.ToString("f").Replace(",", "").PadLeft(14, '0'));

                if (infoDetalhe.ValorDescontoDia > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(252, 253, "52");
                }
                else if (infoDetalhe.ValorDesconto > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(252, 253, "53");
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(252, 253, "00");
                }

                if (infoDetalhe.DataLimiteConcessaoDesconto == DateTime.MinValue)
                {
                    detalhe = detalhe.PreencherValorNaLinha(254, 261, string.Empty.PadLeft(8, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(254, 261,
                                                            infoDetalhe.DataLimiteConcessaoDesconto.ToString("ddMMyyyy"));
                }

                if (infoDetalhe.ValorDescontoDia > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(262, 275,
                                                            infoDetalhe.ValorDescontoDia.ToString("f").Replace(",", "").PadLeft(14, '0'));
                }
                else if (infoDetalhe.ValorDesconto > 0)
                {
                    detalhe = detalhe.PreencherValorNaLinha(262, 275,
                                                            infoDetalhe.ValorDesconto.ToString("f").Replace(",", "").PadLeft(14, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(262, 275, string.Empty.PadLeft(14, '0'));
                }

                #region Instruções

                if (infoDetalhe.Instrucoes.Count > 2)
                {
                    throw new Exception(
                              string.Format(
                                  "<BoletoBr>{0}Não são aceitas mais que 2 instruções padronizadas para remessa de boletos no banco BRB.",
                                  Environment.NewLine));
                }

                var primeiraInstrucao = infoDetalhe.Instrucoes.FirstOrDefault();

                if (primeiraInstrucao != null)
                {
                    detalhe = detalhe.PreencherValorNaLinha(276, 277,
                                                            primeiraInstrucao.Codigo.BoletoBrToStringSafe());
                    detalhe = detalhe.PreencherValorNaLinha(278, 279,
                                                            primeiraInstrucao.QtdDias.BoletoBrToStringSafe());

                    detalhe = detalhe.PreencherValorNaLinha(284, 288,
                                                            primeiraInstrucao.Valor.ToString("f").Replace(",", "").PadLeft(5, '0'));
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(276, 277, "00");
                    detalhe = detalhe.PreencherValorNaLinha(278, 279, "00");

                    detalhe = detalhe.PreencherValorNaLinha(284, 288, string.Empty.PadLeft(5, '0'));
                }

                if (infoDetalhe.Instrucoes.Count > 1)
                {
                    var segundaIntrucao = infoDetalhe.Instrucoes.LastOrDefault();
                    detalhe = detalhe.PreencherValorNaLinha(280, 281, segundaIntrucao.Codigo.BoletoBrToStringSafe());
                    detalhe = detalhe.PreencherValorNaLinha(282, 283, segundaIntrucao.QtdDias.BoletoBrToStringSafe());
                }
                else
                {
                    detalhe = detalhe.PreencherValorNaLinha(280, 281, "00");
                    detalhe = detalhe.PreencherValorNaLinha(282, 283, "00");
                }

                #endregion

                var razao = "";
                if (infoDetalhe.RazaoContaCorrente.Length > 40)
                {
                    razao = infoDetalhe.RazaoContaCorrente.ExtrairValorDaLinha(1, 40);
                }
                else
                {
                    razao = infoDetalhe.RazaoContaCorrente;
                }
                detalhe = detalhe.PreencherValorNaLinha(289, 328, razao.PadRight(40, ' '));

                var obs = "";
                if (infoDetalhe.Mensagem1.BoletoBrToStringSafe().Length > 40)
                {
                    obs = infoDetalhe.Mensagem1.ExtrairValorDaLinha(1, 40);
                }
                else
                {
                    obs = infoDetalhe.Mensagem1.BoletoBrToStringSafe();
                }
                detalhe = detalhe.PreencherValorNaLinha(329, 368, obs.PadRight(40, ' '));

                return(detalhe);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do DETALHE do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }
示例#29
0
        public string EscreverMensagemTipo2(DetalheRemessaCnab400 infoDetalhe, int sequenciaRegistro)
        {
            if (infoDetalhe == null)
            {
                throw new Exception("Os dados não foram informados na geração do DETALHE.");
            }

            var tipo2 = new string(' ', 400);

            try
            {
                var mensagem1 = "";
                var mensagem2 = "";
                var mensagem3 = "";
                var mensagem4 = "";

                foreach (var item in infoDetalhe.Instrucoes)
                {
                    if (mensagem1 == "")
                    {
                        mensagem1 = item.TextoInstrucao;
                        if (mensagem1.Length > 80)
                        {
                            mensagem1 = mensagem1.ExtrairValorDaLinha(1, 80);
                        }
                    }
                    else if (mensagem2 == "")
                    {
                        mensagem2 = item.TextoInstrucao;
                        if (mensagem2.Length > 80)
                        {
                            mensagem2 = mensagem2.ExtrairValorDaLinha(1, 80);
                        }
                    }
                    else if (mensagem3 == "")
                    {
                        mensagem3 = item.TextoInstrucao;
                        if (mensagem3.Length > 80)
                        {
                            mensagem3 = mensagem3.ExtrairValorDaLinha(1, 80);
                        }
                    }
                    else if (mensagem4 == "")
                    {
                        mensagem4 = item.TextoInstrucao;
                        if (mensagem4.Length > 80)
                        {
                            mensagem4 = mensagem4.ExtrairValorDaLinha(1, 80);
                        }
                    }
                }

                tipo2 = tipo2.PreencherValorNaLinha(1, 1, "2");
                tipo2 = tipo2.PreencherValorNaLinha(2, 81, mensagem1.PadRight(80, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(82, 161, mensagem2.PadRight(80, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(162, 241, mensagem3.PadRight(80, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(242, 321, mensagem4.PadRight(80, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(322, 366, string.Empty.PadRight(45, ' '));
                tipo2 = tipo2.PreencherValorNaLinha(367, 369, infoDetalhe.CarteiraCobranca.PadLeft(3, '0'));
                tipo2 = tipo2.PreencherValorNaLinha(370, 374, infoDetalhe.Agencia.PadLeft(5, '0'));
                tipo2 = tipo2.PreencherValorNaLinha(375, 381, infoDetalhe.ContaCorrente.PadLeft(7, '0'));
                tipo2 = tipo2.PreencherValorNaLinha(382, 382, infoDetalhe.DvContaCorrente.PadLeft(1, '0'));
                tipo2 = tipo2.PreencherValorNaLinha(383, 393, infoDetalhe.NossoNumero.PadLeft(11, '0'));
                tipo2 = tipo2.PreencherValorNaLinha(394, 394, infoDetalhe.DvNossoNumero);
                tipo2 = tipo2.PreencherValorNaLinha(395, 400, sequenciaRegistro.ToString().PadLeft(6, '0'));

                return(tipo2);
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("<BoletoBr>{0}Falha na geração do Registro Tipo 2 do arquivo de REMESSA.",
                                                  Environment.NewLine), e);
            }
        }