/// <summary> /// Gera o aquivo baseado nas coleção de todas informações passada até o momento /// </summary> /// <returns></returns> public override string Remessa() { // Existe algum BUG na executação de template e reflection com ActiveX que dentro do doreach de conteudo da classe e layout acaba por não gerar o arquivo final. // Então, cada linha já será gerada imediatamente em uma String Builder, liberando assim a necessidade de memorizar os itens que iriam conter no arquivo. string[] cBanco = Cedente.Banco.Split('-'); string[] cAgDig = Cedente.Agencia.Split('-'); string cContaDigitos = CobUtil.SoNumeros(Cedente.Conta); Bancos banco = (Bancos)CobUtil.GetInt(cBanco[0]); if (!(banco == Bancos.SANTANDER || banco == Bancos.BANESPA_SANTANDER)) { throw new Exception("Esta classe é valida apenas para o Santander"); } else if (cContaDigitos.Length != 10) { throw new Exception("Erro na Conta não tem 10 dígitos"); } else if (Cedente.CodCedente.Length != 7) { throw new Exception("Erro no CodCedente não tem 7 dígitos"); } else if (Cedente.CedenteCOD.Length != 20) { throw new Exception("Erro no CedenteCOD não tem 20 dígitos"); } else if (Cedente.Convenio.Length != 25) { throw new Exception("Erro no Convenio não tem 25 dígitos"); } regArqHeader[CNAB400SantanderHeader.Empresa_Codigo] = Cedente.CedenteCOD; regArqHeader[CNAB400SantanderHeader.Empresa_Nome] = Cedente.Cedente; regArqHeader[CNAB400SantanderHeader.Banco_Codigo] = (int)banco; regArqHeader[CNAB400SantanderHeader.Data] = DataHoje; // Limpa os objetos de saida/entrada Data.Clear(); Clear(); // Inicia o contador Sequencial regArqHeader[CNAB400SantanderHeader.Sequencia] = SequencialRegistro = 1; // o sequencial do header é sempre 1 (FIXO) Add(regArqHeader); // Proximo item SequencialRegistro = 2; BoletoInfo boleto; SacadoInfo sacado; Reg <CNAB400SantanderRemessa1> regBoleto; double nValor = 0; #if TEST_LOG Log += "Remessa " + Boletos.Count + "!\r\n"; #endif foreach (string n in Boletos.NossoNumeros) { boleto = Boletos[n]; sacado = boleto.Sacado; nValor += boleto.ValorDocumento; #if TEST_LOG Log += string.Format("{0} {1} {2:C}", n, boleto.NossoNumero, boleto.ValorDocumento); #endif regBoleto = new Reg <CNAB400SantanderRemessa1>(); regBoleto[CNAB400SantanderRemessa1.CedenteTipo] = Cedente.Tipo; regBoleto[CNAB400SantanderRemessa1.CedenteCNPJ] = Cedente.DocumentoNumeros; regBoleto[CNAB400SantanderRemessa1.CedenteCOD] = Cedente.CedenteCOD; regBoleto[CNAB400SantanderRemessa1.CedenteControle] = Cedente.Convenio; regBoleto[CNAB400SantanderRemessa1.Banco] = 33; regBoleto[CNAB400SantanderRemessa1.CarteiraTipo] = Cedente.CarteiraTipo; regBoleto[CNAB400SantanderRemessa1.Agencia] = Cedente.CarteiraTipo == "5" ? cAgDig[0] : "0"; regBoleto[CNAB400SantanderRemessa1.NossoNumero] = boleto.NossoNumero; #if TEST_LOG Log += string.Format(" ? {0} ? {1}\r\n", regBoleto[CNAB400SantanderRemessa1.NossoNumero], boleto.NossoNumero); #endif regBoleto[CNAB400SantanderRemessa1.NossoNumeroDig] = CobUtil.Modulo11Especial(boleto.NossoNumero, 9); regBoleto[CNAB400SantanderRemessa1.MultaTipo] = boleto.PercentualMulta == 0 ? 0 : 4; regBoleto[CNAB400SantanderRemessa1.MultaPercentual] = boleto.PercentualMulta; regBoleto[CNAB400SantanderRemessa1.Ocorrencia] = (int)boleto.Ocorrencia; regBoleto[CNAB400SantanderRemessa1.SeuNumero] = boleto.BoletoID; regBoleto[CNAB400SantanderRemessa1.DataVencimento] = boleto.DataVencimento; regBoleto[CNAB400SantanderRemessa1.Valor] = boleto.ValorDocumento; regBoleto[CNAB400SantanderRemessa1.Especie] = (int)boleto.Especie; regBoleto[CNAB400SantanderRemessa1.Aceite] = boleto.Aceite; regBoleto[CNAB400SantanderRemessa1.DataDocumento] = boleto.DataDocumento; int nInstrucao1 = boleto.Instrucao1; int nInstrucao2 = boleto.Instrucao2; if (nInstrucao1 == 0 && nInstrucao2 > 0) { nInstrucao1 = nInstrucao2; nInstrucao2 = 0; } // Prioriza protesto na instrução 1 if (nInstrucao1 > 0) { regBoleto[CNAB400SantanderRemessa1.Instrucao1] = nInstrucao1; if (nInstrucao1 == 6) { if (boleto.DiasProtesto == 0) { throw new Exception("Não é possivel dar instrução de protesto sem 'DiasProtesto'"); } regBoleto[CNAB400SantanderRemessa1.DiasProtesto] = boleto.DiasProtesto; } } // Trata a mora na segunda instrução (Se tem Mora maior de 1 centavo adiciona a mora) if (boleto.ValorMora > 0.01) { regBoleto[CNAB400SantanderRemessa1.Mora] = boleto.ValorMora; } else // Caso contrario não cobra { if (nInstrucao1 == 0) { regBoleto[CNAB400SantanderRemessa1.Instrucao1] = 8; } else { regBoleto[CNAB400SantanderRemessa1.Instrucao2] = 8; } } // Mas se a instrução 2 algo diferente adicona também, talvez sobrescrevendo... if (nInstrucao2 != 0) { regBoleto[CNAB400SantanderRemessa1.Instrucao2] = nInstrucao2; } regBoleto[CNAB400SantanderRemessa1.DataDesconto] = boleto.DataDesconto; regBoleto[CNAB400SantanderRemessa1.ValorIOF] = boleto.ValorIOF; regBoleto[CNAB400SantanderRemessa1.ValorDesconto] = boleto.ValorDesconto; regBoleto[CNAB400SantanderRemessa1.ValorAbatimento] = boleto.ValorOutras < 0 ? -boleto.ValorOutras : 0; regBoleto[CNAB400SantanderRemessa1.Sacado_Tipo] = sacado.Tipo; regBoleto[CNAB400SantanderRemessa1.Sacado_Inscricao] = sacado.DocumentoNumeros; regBoleto[CNAB400SantanderRemessa1.Nome] = sacado.Sacado; regBoleto[CNAB400SantanderRemessa1.Endereco] = sacado.Endereco; regBoleto[CNAB400SantanderRemessa1.Bairro] = sacado.Bairro; regBoleto[CNAB400SantanderRemessa1.Cidade] = sacado.Cidade; regBoleto[CNAB400SantanderRemessa1.UF] = sacado.UF; regBoleto[CNAB400SantanderRemessa1.CEP] = sacado.CepNumeros; regBoleto[CNAB400SantanderRemessa1.Avalista] = sacado.Avalista; regBoleto[CNAB400SantanderRemessa1.Complemento] = cContaDigitos.Substring(8, 2); regBoleto[CNAB400SantanderRemessa1.Sequencia] = SequencialRegistro++; // adiciona o boleto convertido em registro AddBoleto(regBoleto, boleto); AddOpcionais(boleto); } regArqTrailer[CNAB400SantanderTrailer.Quantidade] = Boletos.NossoNumeros.Count; //regArqTrailer[CNAB400SantanderTrailer.Quantidade] = Boletos.NossoNumeros.Count + 2; // adicionando o proprio header e trailer regArqTrailer[CNAB400SantanderTrailer.Valor] = nValor; regArqTrailer[CNAB400SantanderTrailer.Sequencia] = SequencialRegistro; Add(regArqTrailer); //ShowDumpLine = true; // Gera o Texto de saida da forma padrão return(this.Conteudo); }