/// <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); }
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); }
/// <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); } }
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(); }
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"); }
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); } }
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; } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }
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); } }