public static IEscritorArquivoRemessaCnab240 ObterEscritorRemessa(RemessaCnab240 remessaEscrever)
        {
            try
            {
                switch (remessaEscrever.Header.CodigoBanco.PadLeft(3, '0'))
                {
                /* 001 - Banco do Brasil */
                case "001":
                    throw new NotImplementedException("Banco " + remessaEscrever.Header.CodigoBanco + " ainda não foi implementado.");
                    break;

                /* 003 - Banco da Amazônia */
                case "003":
                    throw new NotImplementedException("Banco " + remessaEscrever.Header.CodigoBanco + " ainda não foi implementado.");
                    break;

                case "033":
                    throw new NotImplementedException("Banco " + remessaEscrever.Header.CodigoBanco + " ainda não foi implementado.");

                /* 104 - Caixa */
                case "104":
                    return(new Bancos.Cef.EscritorRemessaCnab240CefSicgb(remessaEscrever));

                    break;

                /* 756 - SICOOB */
                case "756":
                    return(new Bancos.Sicoob.EscritorRemessaCnab240Sicoob(remessaEscrever));

                    break;

                /* 041 - BANRISUL */
                case "041":
                    throw new NotImplementedException("Banco " + remessaEscrever.Header.CodigoBanco + " ainda não foi implementado.");
                    break;

                /* 237 - Bradesco */
                case "237":
                    throw new NotImplementedException("Banco " + remessaEscrever.Header.CodigoBanco + " ainda não foi implementado.");
                    break;

                /* 341 - Itaú */
                case "341":
                    throw new NotImplementedException("Banco " + remessaEscrever.Header.CodigoBanco + " ainda não foi implementado.");
                    break;

                /* 399 - HSBC */
                case "399":
                    throw new NotImplementedException("Banco " + remessaEscrever.Header.CodigoBanco + " ainda não foi implementado.");
                    break;

                default:
                    throw new NotImplementedException("Banco " + remessaEscrever.Header.CodigoBanco + " ainda não foi implementado.");
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erro durante a execução da transação.", ex);
            }
        }
Example #2
0
        public RemessaCnab240 GerarRemessa(HeaderRemessaCnab240 header, HeaderLoteRemessaCnab240 headerLote,
                                           List <Boleto> boletos, TrailerLoteRemessaCnab240 trailerLote,
                                           TrailerRemessaCnab240 trailer)
        {
            var objReturn = new RemessaCnab240();

            objReturn.Header = header;
            objReturn.Lotes  = new List <LoteRemessaCnab240>();

            var ultimoLoteAdicionado = objReturn.AdicionarLote(headerLote, trailerLote);

            // Usado para identificar com número único e sequencial cada boleto (registro) dentro do lote.
            var contador = 1;
            var reg1     = 1;
            var reg2     = 2;

            foreach (var boletoAddRemessa in boletos)
            {
                objReturn.AdicionarBoletoAoLote(ultimoLoteAdicionado, boletoAddRemessa, contador, reg1, reg2);
                contador++;
                reg1 = reg1 + 2;
                reg2 = reg2 + 2;
            }

            objReturn.Trailer = trailer;

            return(objReturn);
        }
        public List <string> EscreverTexto(RemessaCnab240 remessaEscrever)
        {
            ValidarRemessa(remessaEscrever);

            var listaRet = new List <string>();

            /* Header */
            listaRet.Add(EscreverHeader(remessaEscrever.Header));

            /* Detalhes */
            /* Caso não venha a sequencia do lote informada no header criar a mesma */
            var sequenciaLote = 1;

            foreach (var loteEscrever in remessaEscrever.Lotes)
            {
                if (loteEscrever.HeaderLote.LoteServico.BoletoBrToStringSafe().BoletoBrToInt() == 0)
                {
                    loteEscrever.HeaderLote.LoteServico = sequenciaLote;
                }

                if (loteEscrever.TrailerLote.LoteServico.BoletoBrToStringSafe().BoletoBrToInt() == 0)
                {
                    loteEscrever.TrailerLote.LoteServico = sequenciaLote;
                }

                listaRet.AddRange(EscreverLote(loteEscrever));

                sequenciaLote++;
            }

            /* Trailer */
            listaRet.Add(EscreverTrailer(remessaEscrever.Trailer));

            return(listaRet);
        }
        public static IEscritorArquivoRemessaCnab240 ObterEscritorRemessaPagamento(RemessaCnab240 remessaEscrever)
        {
            try
            {
                switch (remessaEscrever.Header.CodigoBanco.PadLeft(3, '0'))
                {
                case "001":     /* 001 - Banco do Brasil */
                    return(new Bancos.Brasil.EscritorRemessaPagamentoCnab240BancoDoBrasil(remessaEscrever));

                case "237":     /* 237 - Bradesco */
                    return(new Bancos.Bradesco.EscritorRemessaPagamentoCnab240Bradesco(remessaEscrever));

                case "756":     /* 756 - Sicoob */
                    return(new Bancos.Sicoob.EscritorRemessaPagamentoCnab240Sicoob(remessaEscrever));

                default:
                    throw new NotImplementedException("Banco " + remessaEscrever.Header.CodigoBanco + " ainda não foi implementado.");
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erro durante a execução da transação.", ex);
            }
        }
Example #5
0
 public RemessaCnab240 GerarArquivoRemessaCnab240(RemessaCnab240 remessaCnab240, List <Boleto> boletos)
 {
     throw new NotImplementedException();
 }
Example #6
0
        /*
         * O controle entre um grupo de segmentos para um mesmo título será peos campos 'Código do Movimento' e 'Número do Registro'.
         * O segmento 'P' é obrigatório;
         * O segmento 'Q' é obrigatório somente para o Código de Movimento '01' (Entrada de Títulos)
         *
         * Código de Movimento Remessa = 31 (Alteração de Outros Dados)
         * Campos Alteráveis:
         * - Espécie do Título
         * - Aceite
         * - Data de Emissão do Título
         * - Juros
         * - Desconto
         * - Valor do IOF
         * - Abatimento
         * - Código/Prazo Protesto
         * - Código/Prazo Devolução
         * - Dados do Sacado
         * - Dados do Avalista
         * - Multa
         * - Mensagens
         * Obs.: Campos numéricos -> Quando estes campos não precisarem ser alterados devem ser preenchidos com brancos, excepcionalmente,
         * para caracterizar a falta de informação.
         *
         * Mensagens nos Bloquetos:
         * Desc.: zz.zzz.zzz.zz9,99 até dd/mm/aaaa
         * Abatimento: zz.zzz.zzz.zz9,99
         * Juros: zz.zzz.zzz.zz9,99 ao dia
         * Multa: zz.zzz.zzz.zz9,99 após dd/mm/aaaa
         * Protestar com z9 dias
         * Não receber após z9 dias do vencimento
         */

        #endregion

        //private readonly Remessa _remessa = new Remessa(Remessa.EnumTipoAmbiemte.Homologacao,
        //    EnumCodigoOcorrenciaRemessa.Registro, "02");

        public EscritorRemessaCnab240CefSicgb(RemessaCnab240 remessaEscrever)
        {
            _remessaEscrever = remessaEscrever;
        }
        public void ValidarRemessa(RemessaCnab240 remessaValidar)
        {
            if (remessaValidar == null)
            {
                throw new Exception("Não há informações para geração do arquivo de remessa.");
            }

            if (remessaValidar.Header == null)
            {
                throw new Exception("Não há informações para geração do HEADER no arquivo de remessa.");
            }

            if (remessaValidar.Lotes == null)
            {
                throw new Exception("Não há informações para geração dos LOTES no arquivo de remessa.");
            }

            if (remessaValidar.Trailer == null)
            {
                throw new Exception("Não há informações para geração do TRAILER no arquivo de remessa.");
            }

            #region #HEADER

            if (String.IsNullOrEmpty(remessaValidar.Header.NumeroInscricao))
            {
                throw new Exception("CPF/CNPJ do Cedente não foi informado.");
            }

            if (String.IsNullOrEmpty(remessaValidar.Header.AgenciaMantenedora))
            {
                throw new Exception("Agência do Cedente não foi informada.");
            }

            if (String.IsNullOrEmpty(remessaValidar.Header.DigitoAgenciaMantenedora))
            {
                throw new Exception("Dígito da agência do Cedente não foi informada.");
            }

            if (String.IsNullOrEmpty(remessaValidar.Header.CodigoCedente))
            {
                throw new Exception("Código do Cedente não foi informado.");
            }

            if (String.IsNullOrEmpty(remessaValidar.Header.NomeEmpresa))
            {
                throw new Exception("Nome do Cedente não foi informado.");
            }

            #endregion #HEADER

            #region #TRAILER

            if (remessaValidar.Trailer.QtdLotesArquivo <= 0)
            {
                throw new Exception("O número de lotes do arquivo não foi informado no registro TRAILER.");
            }

            if (remessaValidar.Trailer.QtdRegistrosArquivo <= 0)
            {
                throw new Exception("O número de registros do arquivo não foi informado no registro TRAILER");
            }

            #endregion #TRAILER
        }
Example #8
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                                                                                                                                                                                                             ");
        }
 public EscritorRemessaCnab240Sicoob(RemessaCnab240 remessaEscrever)
 {
     _remessaEscrever = remessaEscrever;
 }
Example #10
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);
            }
        }
Example #11
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());
        }
Example #12
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;
            }
        }
Example #13
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;
            }
        }
Example #14
0
 public EscritorRemessaCnab240Abc(RemessaCnab240 remessaEscrever)
 {
     _remessaEscrever = remessaEscrever;
 }