private List <string> EscreverLote(LoteRemessaCnab240 loteEscrever)
        {
            var listaRet = new List <string>();

            listaRet.Add(EscreverHeaderDeLote(loteEscrever.HeaderLote));

            foreach (var detalhe in loteEscrever.RegistrosDetalheSegmentos)
            {
                if (detalhe.SegmentoP.LoteServico.BoletoBrToStringSafe().BoletoBrToInt() == 0)
                {
                    detalhe.SegmentoP.LoteServico = loteEscrever.HeaderLote.LoteServico;
                }

                if (detalhe.SegmentoQ.LoteServico.BoletoBrToStringSafe().BoletoBrToInt() == 0)
                {
                    detalhe.SegmentoQ.LoteServico = loteEscrever.HeaderLote.LoteServico;
                }

                listaRet.Add(EscreverDetalheSegmentoP(detalhe.SegmentoP));
                listaRet.Add(EscreverDetalheSegmentoQ(detalhe.SegmentoQ));
            }

            listaRet.Add(EscreverTrailerDeLote(loteEscrever.TrailerLote));

            return(listaRet);
        }
Beispiel #2
0
        public void TestGeracaoArquivoRemessaSicoob()
        {
            var database  = 2010;
            var dataatual = 2012;
            var periodo   = 2;
            var resultado = (dataatual - dataatual) % periodo;



            var dadosRemessa = new Remessa(Remessa.EnumTipoAmbiemte.Homologacao, EnumCodigoOcorrenciaRemessa.Registro, "2");

            var banco = Fabricas.BancoFactory.ObterBanco("756", "0");

            var contaBancariaCedente = new ContaBancaria("3249", "2", "7341", "5");

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

            var sacado = new Sacado("Sacado Fulano de Tal", "99.999.999/9999-98", 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/01"
            };

            var boleto = new Boleto(carteira, cedente, sacado, dadosRemessa)
            {
                BancoBoleto                = banco,
                NumeroDocumento            = "19",
                ValorBoleto                = (decimal)1000.51,
                IdentificadorInternoBoleto = "19",
                DataVencimento             = new DateTime(2014, 06, 30),
                Especie = banco.ObtemEspecieDocumento(EnumEspecieDocumento.DuplicataMercantil),
            };

            var listaBoleto = new List <Boleto>();

            listaBoleto.Add(boleto);

            banco.FormatarBoleto(boleto);

            #region GERAÇÃO 1

            var remessa = new RemessaCnab240();

            //var listaDetalhes = new List<DetalheRemessaCnab240>();

            remessa.Header = new HeaderRemessaCnab240(listaBoleto.FirstOrDefault(), 1);

            //var detalheSegmentoP = new DetalheSegmentoPRemessaCnab240(boleto)
            //{
            //    CodigoCedente = "123456",
            //    NossoNumero = "123456",
            //    NumeroDocumento = "123456",
            //    CodigoOcorrencia = new CodigoOcorrencia(01),
            //    Especie = banco.ObtemEspecieDocumento(EnumEspecieDocumento.DuplicataMercantil),
            //    Aceite = "N",
            //    DataVencimento = new DateTime(2014, 10, 01),
            //    ValorBoleto = (decimal)100.51,
            //};

            remessa.Lotes = new List <LoteRemessaCnab240> {
            };

            var loteAdd = new LoteRemessaCnab240();
            loteAdd.HeaderLote = new HeaderLoteRemessaCnab240(listaBoleto.FirstOrDefault(), 1);

            loteAdd.TrailerLote = new TrailerLoteRemessaCnab240(1);

            //loteAdd.RegistrosDetalheSegmentos = new List<DetalheRemessaCnab240>();
            //var detalheRemessaAdd = new DetalheRemessaCnab240();
            //detalheRemessaAdd.SegmentoP = detalheSegmentoP;
            //loteAdd.RegistrosDetalheSegmentos.Add(detalheRemessaAdd);

            remessa.Lotes.Add(loteAdd);

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

            #endregion GERAÇÃO 1

            var fabricaRemessa = new RemessaFactory();

            var remessaPronta = fabricaRemessa.GerarRemessa(remessa.Header, loteAdd.HeaderLote, listaBoleto, loteAdd.TrailerLote, remessa.Trailer);

            var escritor = EscritorArquivoRemessaFactory.ObterEscritorRemessa(remessa);

            var linhasEscrever = escritor.EscreverTexto(remessaPronta);

            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.Equals(1, 1);
            File.WriteAllLines($@"{path}\\{nomeArquivo}", linhasEscrever.ToArray());
            var esperadoHeader = "75600000         299999999999999                    0324920000009999990 RAZÃO SOCIAL X                SICOOB                                  10902201808483100000108100000                                                                     ";
            Assert.IsTrue(linhasEscrever[0].Length == 240 && linhasEscrever[0].Substring(0, 143) == esperadoHeader.Substring(0, 143) && esperadoHeader.Substring(157, esperadoHeader.Length - 157) == linhasEscrever[0].Substring(157, esperadoHeader.Length - 157));
            Assert.IsTrue(linhasEscrever[1].Length == 240 && linhasEscrever[1] == "75600011R01  040 2099999999999999                    0324920000009999990 Razão Social X                                                                                                000000011202201800000000                                 ");
            Assert.IsTrue(linhasEscrever[2].Length == 240 && linhasEscrever[2] == "7560001300001P 010324920000009999990 00000019-401014     10 220000000000000193006201400000000010005100000 02N12022018030062014000000000000000000000000000000000000000000000000000000000000000000000DOC0000019-4             0000   090000000000 ");
            Assert.IsTrue(linhasEscrever[3].Length == 240 && linhasEscrever[3] == "7560001300002Q 012099999999999998SACADO FULANO DE TAL                    1,9,COMP X                              BAIRRO X       12345000CIDADE X       XX0000000000000000                                        000                            ");
            Assert.IsTrue(linhasEscrever[4].Length == 240 && linhasEscrever[4] == "75600015         00000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000                                                                                                                             ");
            Assert.IsTrue(linhasEscrever[5].Length == 240 && linhasEscrever[5] == "75699999         000001000001000000                                                                                                                                                                                                             ");
        }
Beispiel #3
0
        public void TestGerarRemessaPagamento()
        {
            var contaBancariaCedente = new ContaBancaria("3249", "2", "7341", "5");
            var empresaPagadora      = new Cedente("999999", "123456", 0, "99.999.999/9999-99", "Razão Social X", contaBancariaCedente, null);

            empresaPagadora.EnderecoCedente = new Endereco()
            {
                Bairro      = "Jardins",
                Cep         = "75690000",
                Cidade      = "Goiabalândia",
                Complemento = "EDF EXECUTIVO",
                Logradouro  = "Rua x",
                Numero      = "25",
                SiglaUf     = "GO",
            };

            var objEndereco = new Endereco()
            {
                Bairro      = "Trenzim",
                Cep         = "75690000",
                Cidade      = "Mangalandia",
                Complemento = "Galho esquerdo",
                Logradouro  = "Rua 3",
                Numero      = "5",
                SiglaUf     = "GO",
            };
            var contaBancariaFavorecido = new BoletoBr.ContaBancaria("4343", "0", "35432", "2");
            var favorecido = new BoletoBr.Sacado("012.365.489-01", "1", objEndereco, contaBancariaFavorecido);

            favorecido.Nome = "RAFAEL TAVEIRA";

            var bancoEmpresa    = BancoFactory.ObterBanco("756", "0");
            var bancoFavorecido = BancoFactory.ObterBanco("237", "");

            var pagamento = new BoletoBr.Pagamento()
            {
                BancoEmpresa               = bancoEmpresa,
                BancoFavorecido            = bancoFavorecido,
                CodigoBanco                = bancoEmpresa.CodigoBanco,
                CodigoBancoFavorecido      = bancoFavorecido.CodigoBanco,
                CodigoCamaraCentralizadora = "018",
                CodigoFinalidadeDoc        = "",
                CodigoFinalidadeTed        = "5",
                FinalidadePagamento        = "CC",
                DataVencimento             = new DateTime(2021, 4, 21),
                Empresa           = empresaPagadora,
                Favorecido        = favorecido,
                ValorPagamento    = 5M,
                ValorDesconto     = 0,
                ValorJurosMora    = 0,
                ValorMulta        = 0,
                CodigoConvenio    = "7980171",
                SeuNumero         = "1015",
                TipoServico       = "0",
                FormaDePagamento  = "01",
                FormaDeLancamento = "03",

                ValorTitulo = 5M,
                CodBarras   = "24691859100000299845004110028796200000000150"
            };

            var remessa = new RemessaCnab240
            {
                Header = new HeaderRemessaCnab240(pagamento, 1)
            };

            var loteRemessa = new LoteRemessaCnab240
            {
                HeaderLote  = new HeaderLoteRemessaCnab240(pagamento, 1),
                TrailerLote = new TrailerLoteRemessaCnab240(4)
            };

            remessa.Trailer = new TrailerRemessaCnab240(1, 6);

            var escritor             = EscritorArquivoRemessaFactory.ObterEscritorRemessaPagamento(remessa);
            var listaBoletoBrRemessa = new List <Pagamento>()
            {
                pagamento
            };
            var fabricaRemessa = new RemessaFactory();
            var remessaPronta  = fabricaRemessa.GerarRemessa(remessa.Header, loteRemessa.HeaderLote, listaBoletoBrRemessa, loteRemessa.TrailerLote, remessa.Trailer);
            var linhasEscrever = escritor.EscreverTexto(remessaPronta);


            StringBuilder sb = new StringBuilder();

            foreach (var linha in linhasEscrever)
            {
                sb.AppendLine(linha);
            }
        }
Beispiel #4
0
        public void TestGeracaoArquivoRemessaSicoob()
        {
            var database  = 2010;
            var dataatual = 2012;
            var periodo   = 2;
            var resultado = (dataatual - dataatual) % periodo;


            var tiporemessa          = new Remessa(Remessa.EnumTipoAmbiemte.Homologacao, EnumCodigoOcorrenciaRemessa.Registro, "2");
            var banco                = Fabricas.BancoFactory.ObterBanco("246", "0");
            var contaBancariaCedente = new ContaBancaria("0001", "9", "107228", "5");
            var cedente              = new Cedente("28796", "1234", 2, "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 = "110"
            };

            var boleto = new Boleto(carteira, cedente, sacado, tiporemessa)
            {
                NumeroDocumento            = "106",
                ValorBoleto                = Convert.ToDecimal(465.82),
                IdentificadorInternoBoleto = "0004309540",
                DataVencimento             = new DateTime(2016, 11, 30),
                BancoBoleto                = banco,
                Especie       = banco.ObtemEspecieDocumento(EnumEspecieDocumento.DuplicataMercantil),
                JurosMora     = 2.5M,
                DataJurosMora = DateTime.Now
            };

            boleto.PercentualJurosMora = decimal.Round(boleto.PercentualJurosMora.GetValueOrDefault(), 4);
            var listaBoleto = new List <Boleto>();

            listaBoleto.Add(boleto);

            banco.FormatarBoleto(boleto);

            #region GERAÇÃO 1

            var remessa = new RemessaCnab240();

            //var listaDetalhes = new List<DetalheRemessaCnab240>();

            remessa.Header = new HeaderRemessaCnab240(listaBoleto.FirstOrDefault(), 1);

            //var detalheSegmentoP = new DetalheSegmentoPRemessaCnab240(boleto)
            //{
            //    CodigoCedente = "123456",
            //    NossoNumero = "123456",
            //    NumeroDocumento = "123456",
            //    CodigoOcorrencia = new CodigoOcorrencia(01),
            //    Especie = banco.ObtemEspecieDocumento(EnumEspecieDocumento.DuplicataMercantil),
            //    Aceite = "N",
            //    DataVencimento = new DateTime(2014, 10, 01),
            //    ValorBoleto = (decimal)100.51,
            //};

            remessa.Lotes = new List <LoteRemessaCnab240> {
            };

            var loteAdd = new LoteRemessaCnab240();
            loteAdd.HeaderLote = new HeaderLoteRemessaCnab240(listaBoleto.FirstOrDefault(), 1);

            loteAdd.TrailerLote = new TrailerLoteRemessaCnab240(1);

            //loteAdd.RegistrosDetalheSegmentos = new List<DetalheRemessaCnab240>();
            //var detalheRemessaAdd = new DetalheRemessaCnab240();
            //detalheRemessaAdd.SegmentoP = detalheSegmentoP;
            //loteAdd.RegistrosDetalheSegmentos.Add(detalheRemessaAdd);

            remessa.Lotes.Add(loteAdd);

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

            #endregion GERAÇÃO 1

            var fabricaRemessa = new RemessaFactory();

            var remessaPronta = fabricaRemessa.GerarRemessa(remessa.Header, loteAdd.HeaderLote, listaBoleto, loteAdd.TrailerLote, remessa.Trailer);

            var escritor = EscritorArquivoRemessaFactory.ObterEscritorRemessa(remessa);

            var linhasEscrever = escritor.EscreverTexto(remessaPronta);

            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);
            }

            File.WriteAllLines($@"{path}\\{nomeArquivo}", linhasEscrever.ToArray());
        }
Beispiel #5
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;
            }
        }
Beispiel #6
0
        public static string GerarArquivoRemessaPagamento(CarteiraBoleto carteiraBoleto, SacadoBoleto sacado, decimal valor,
                                                          DateTime dataVencimento, string numeroDocumento)
        {
            try
            {
                var listaBoletoBrRemessa           = new List <Pagamento>();
                var sequenciaRemessaCarteiraBoleto = 1;

                try
                {
                    // Transforma boletos e adiciona lançamentos na lista
                    listaBoletoBrRemessa.Add(TransformaDeFormatoPagamentoParaFormatoBoletoBr(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.BancoEmpresa.CodigoBanco);
                if (bancosEncontrados.Count() > 1)
                {
                    throw new Exception(
                              "Há mais de 1 banco associado aos boletos que foram informados para geração de remessa.");
                }


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

                #endregion

                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.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.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 qtdSegmantos       = carteiraBoleto.ValorMulta > 0 && carteiraBoleto.BancoGeraBoleto ? 3 : 2;
                var qtdRegistrosNoLote = (listaBoletoBrRemessa.Count * qtdSegmantos) + 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;

                Pagamento primeiroPagamentoDaLista = listaBoletoBrRemessa.First();

                #endregion

                #region CNAB240

                // Gera Remessa Cnab240

                var remessa = new RemessaCnab240
                {
                    Header = new HeaderRemessaCnab240(primeiroPagamentoDaLista, sequencialRemessa)
                };

                var loteRemessa = new LoteRemessaCnab240
                {
                    HeaderLote  = new HeaderLoteRemessaCnab240(primeiroPagamentoDaLista, 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

                return(caminho);
            }
            catch (Exception)
            {
                throw;
            }
        }