Class: BrBoleto::Remessa::Cnab240::Base

Inherits:
Base show all
Includes:
Helper::HeaderArquivo, Helper::HeaderLote, Helper::SegmentoP, Helper::SegmentoQ, Helper::SegmentoR, Helper::SegmentoS, Helper::TrailerArquivo, Helper::TrailerLote
Defined in:
lib/br_boleto/remessa/cnab240/base.rb

Direct Known Subclasses

BancoBrasil, Bradesco, Caixa, Cecred, Itau, Santander, Sicoob, Sicredi

Instance Attribute Summary collapse

Attributes inherited from Base

#data_hora_arquivo, #sequencial_remessa

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Helper::TrailerArquivo

#monta_trailer_arquivo, #trailer_arquivo_posicao_001_a_003, #trailer_arquivo_posicao_004_a_007, #trailer_arquivo_posicao_008_a_008, #trailer_arquivo_posicao_009_a_017, #trailer_arquivo_posicao_018_a_023, #trailer_arquivo_posicao_024_a_029, #trailer_arquivo_posicao_030_a_035, #trailer_arquivo_posicao_036_a_240

Methods included from Helper::TrailerLote

#monta_trailer_lote, #trailer_lote_posicao_001_a_003, #trailer_lote_posicao_004_a_007, #trailer_lote_posicao_008_a_008, #trailer_lote_posicao_009_a_017, #trailer_lote_posicao_018_a_023, #trailer_lote_posicao_024_a_240

Methods included from Helper::SegmentoS

#monta_segmento_s, #segmento_s_posicao_001_a_003, #segmento_s_posicao_004_a_007, #segmento_s_posicao_008_a_008, #segmento_s_posicao_009_a_013, #segmento_s_posicao_014_a_014, #segmento_s_posicao_015_a_015, #segmento_s_posicao_016_a_017, #segmento_s_posicao_018_a_018, #segmento_s_posicao_019_a_020_tipo_impressao_1_ou_2, #segmento_s_posicao_019_a_058_tipo_impressao_3, #segmento_s_posicao_021_a_160_tipo_impressao_1_ou_2, #segmento_s_posicao_059_a_098_tipo_impressao_3, #segmento_s_posicao_099_a_138_tipo_impressao_3, #segmento_s_posicao_139_a_178_tipo_impressao_3, #segmento_s_posicao_161_a_162_tipo_impressao_1_ou_2, #segmento_s_posicao_163_a_240_tipo_impressao_1_ou_2, #segmento_s_posicao_179_a_218_tipo_impressao_3, #segmento_s_posicao_219_a_240_tipo_impressao_3, #segmento_s_tipo_impressao_1_ou_2, #segmento_s_tipo_impressao_3

Methods included from Helper::SegmentoR

#monta_segmento_r, #segmento_r_posicao_001_a_003, #segmento_r_posicao_004_a_007, #segmento_r_posicao_008_a_008, #segmento_r_posicao_009_a_013, #segmento_r_posicao_014_a_014, #segmento_r_posicao_015_a_015, #segmento_r_posicao_016_a_017, #segmento_r_posicao_018_a_018, #segmento_r_posicao_019_a_026, #segmento_r_posicao_027_a_041, #segmento_r_posicao_042_a_042, #segmento_r_posicao_043_a_050, #segmento_r_posicao_051_a_065, #segmento_r_posicao_066_a_066, #segmento_r_posicao_067_a_074, #segmento_r_posicao_075_a_089, #segmento_r_posicao_090_a_099, #segmento_r_posicao_100_a_139, #segmento_r_posicao_140_a_179, #segmento_r_posicao_180_a_199, #segmento_r_posicao_200_a_207, #segmento_r_posicao_208_a_210, #segmento_r_posicao_211_a_215, #segmento_r_posicao_216_a_216, #segmento_r_posicao_217_a_228, #segmento_r_posicao_229_a_229, #segmento_r_posicao_230_a_230, #segmento_r_posicao_231_a_231, #segmento_r_posicao_232_a_240

Methods included from Helper::SegmentoQ

#monta_segmento_q, #segmento_q_posicao_001_a_003, #segmento_q_posicao_004_a_007, #segmento_q_posicao_008_a_008, #segmento_q_posicao_009_a_013, #segmento_q_posicao_014_a_014, #segmento_q_posicao_015_a_015, #segmento_q_posicao_016_a_017, #segmento_q_posicao_018_a_018, #segmento_q_posicao_019_a_033, #segmento_q_posicao_034_a_073, #segmento_q_posicao_074_a_113, #segmento_q_posicao_114_a_128, #segmento_q_posicao_129_a_133, #segmento_q_posicao_134_a_136, #segmento_q_posicao_137_a_151, #segmento_q_posicao_152_a_153, #segmento_q_posicao_154_a_154, #segmento_q_posicao_155_a_169, #segmento_q_posicao_170_a_209, #segmento_q_posicao_210_a_212, #segmento_q_posicao_213_a_232, #segmento_q_posicao_233_a_240

Methods included from Helper::SegmentoP

#monta_segmento_p, #segmento_p_posicao_001_a_003, #segmento_p_posicao_004_a_007, #segmento_p_posicao_008_a_008, #segmento_p_posicao_009_a_013, #segmento_p_posicao_014_a_014, #segmento_p_posicao_015_a_015, #segmento_p_posicao_016_a_017, #segmento_p_posicao_018_a_022, #segmento_p_posicao_023_a_023, #segmento_p_posicao_024_a_057, #segmento_p_posicao_058_a_058, #segmento_p_posicao_059_a_059, #segmento_p_posicao_060_a_060, #segmento_p_posicao_061_a_061, #segmento_p_posicao_062_a_062, #segmento_p_posicao_063_a_077, #segmento_p_posicao_078_a_085, #segmento_p_posicao_086_a_100, #segmento_p_posicao_101_a_105, #segmento_p_posicao_106_a_106, #segmento_p_posicao_107_a_108, #segmento_p_posicao_109_a_109, #segmento_p_posicao_110_a_117, #segmento_p_posicao_118_a_118, #segmento_p_posicao_119_a_126, #segmento_p_posicao_127_a_141, #segmento_p_posicao_142_a_142, #segmento_p_posicao_143_a_150, #segmento_p_posicao_151_a_165, #segmento_p_posicao_166_a_180, #segmento_p_posicao_181_a_195, #segmento_p_posicao_196_a_220, #segmento_p_posicao_221_a_221, #segmento_p_posicao_222_a_223, #segmento_p_posicao_224_a_224, #segmento_p_posicao_225_a_227, #segmento_p_posicao_228_a_229, #segmento_p_posicao_230_a_239, #segmento_p_posicao_240_a_240

Methods included from Helper::HeaderLote

#header_lote_posicao_001_a_003, #header_lote_posicao_004_a_007, #header_lote_posicao_008_a_008, #header_lote_posicao_009_a_009, #header_lote_posicao_010_a_011, #header_lote_posicao_012_a_013, #header_lote_posicao_014_a_016, #header_lote_posicao_017_a_017, #header_lote_posicao_018_a_018, #header_lote_posicao_019_a_033, #header_lote_posicao_034_a_053, #header_lote_posicao_054_a_073, #header_lote_posicao_074_a_103, #header_lote_posicao_104_a_143, #header_lote_posicao_144_a_183, #header_lote_posicao_184_a_191, #header_lote_posicao_192_a_199, #header_lote_posicao_200_a_207, #header_lote_posicao_208_a_240, #monta_header_lote

Methods included from Helper::HeaderArquivo

#header_arquivo_posicao_001_a_003, #header_arquivo_posicao_004_a_007, #header_arquivo_posicao_008_a_008, #header_arquivo_posicao_009_a_017, #header_arquivo_posicao_018_a_018, #header_arquivo_posicao_019_a_032, #header_arquivo_posicao_033_a_052, #header_arquivo_posicao_053_a_072, #header_arquivo_posicao_073_a_102, #header_arquivo_posicao_103_a_132, #header_arquivo_posicao_133_a_142, #header_arquivo_posicao_143_a_143, #header_arquivo_posicao_144_a_151, #header_arquivo_posicao_152_a_157, #header_arquivo_posicao_158_a_163, #header_arquivo_posicao_164_a_166, #header_arquivo_posicao_167_a_171, #header_arquivo_posicao_172_a_191, #header_arquivo_posicao_192_a_211, #header_arquivo_posicao_212_a_240, #monta_header_arquivo

Methods inherited from Base

#data_geracao, #hora_geracao, #pagamento_valid_cod_desconto_length, #pagamento_valid_tipo_impressao_required, #persisted?

Methods included from HaveConta

#conta, #conta=, #conta_class

Methods inherited from ActiveModelBase

#assign_attributes, #default_values, #initialize

Constructor Details

This class inherits a constructor from BrBoleto::ActiveModelBase

Instance Attribute Details

#lotesObject

O atributo lotes sempre irá retornar umm Array



49
50
51
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 49

def lotes
  @lotes
end

#mensagem_1Object

mensagem 1



41
42
43
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 41

def mensagem_1
  @mensagem_1
end

#mensagem_2Object

mensagem 2



44
45
46
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 44

def mensagem_2
  @mensagem_2
end

Class Method Details

.class_for_loteObject



51
52
53
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 51

def self.class_for_lote
	BrBoleto::Remessa::Lote
end

Instance Method Details

#codigo_convenioObject

Codigo do convenio

Este metodo deve ser sobrescrevido na classe do banco

Raises:

  • (NotImplementedError)


213
214
215
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 213

def codigo_convenio
	raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
end

#complemento_header_arquivoObject

Complemento do registro

Este metodo deve ser sobrescrevido na classe do banco

Raises:

  • (NotImplementedError)


189
190
191
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 189

def complemento_header_arquivo
	raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
end

#complemento_p(pagamento) ⇒ Object

Complemento do segmento P Recebe um objeto da classe BrBoleto::Remessa::Pagamento Composto por 34 digitos Cada banco tem seu padrão Deve ser sobrescrito na classe do banco

Raises:

  • (NotImplementedError)


223
224
225
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 223

def complemento_p(pagamento)
	raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
end

#complemento_trailer_lote(lote, nr_lote) ⇒ Object

Complemento final do trailer do lote Por padrão coloco 217 caracateres em branco pois é na maioria dos bancos Mas para alguns bancos isso pode mudar



231
232
233
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 231

def complemento_trailer_lote(lote, nr_lote)
	''.rjust(217, ' ')	
end

#convenio_lote(lote) ⇒ Object

Informacoes do convenio para o lote

Este metodo deve ser sobrescrevido na classe do banco

Raises:

  • (NotImplementedError)


197
198
199
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 197

def convenio_lote(lote)
	raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
end

#dados_do_arquivoString

Gera os dados para o arquivo remessa

Returns:

  • (String)


148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 148

def dados_do_arquivo
	return if self.invalid?

	# contador dos registros do lote
	contador = 1

	# Metodo 'monta_header_arquivo' implementado no module -> BrBoleto::Remessa::Cnab240::Helper::HeaderArquivo
	arquivo = [monta_header_arquivo] 
	contador += 1

	lotes.each_with_index do |lote, index|
		novo_lote = monta_lote(lote, (index + 1))
		arquivo.push novo_lote
		novo_lote.each { |_lote| contador += 1 }
	end

	# Metodo 'monta_trailer_arquivo' implementado no module -> BrBoleto::Remessa::Cnab240::Helper::TrailerArquivo
	arquivo << monta_trailer_arquivo(lotes.count, contador)

	retorno = ActiveSupport::Inflector.transliterate(arquivo.join("\n")).to_ascii.upcase
	retorno << "\n"
	retorno.encode(retorno.encoding, :universal_newline => true).encode(retorno.encoding, :crlf_newline => true)
end

#informacoes_da_contaObject

Informacoes da conta do cedente

Este metodo deve ser sobrescrevido na classe do banco

Raises:

  • (NotImplementedError)


205
206
207
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 205

def informacoes_da_conta
	raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
end

#monta_lote(lote, nro_lote) ⇒ Array

Monta um lote para o arquivo

numero do lote no arquivo

Parameters:

Returns:

  • (Array)


99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 99

def monta_lote(lote, nro_lote)
	return if lote.invalid?


	# Metodo 'monta_header_lote' implementado no module -> BrBoleto::Remessa::Cnab240::Helper::HeaderLote
	itens_lote = [monta_header_lote(lote, nro_lote)]
	
	#Nº Sequencial de Registros no Lote:
	sequencial_do_lote = 0

	lote.pagamentos.each do |pagamento|					
		# Metodo 'monta_segmento_p' implementado no module -> BrBoleto::Remessa::Cnab240::Helper::SegmentoP
		sequencial_do_lote += 1
		itens_lote << monta_segmento_p(pagamento, nro_lote, sequencial_do_lote)
		
		# Metodo 'monta_segmento_q' implementado no module -> BrBoleto::Remessa::Cnab240::Helper::SegmentoQ
		sequencial_do_lote += 1
		itens_lote << monta_segmento_q(pagamento, nro_lote, sequencial_do_lote)

		# Metodo 'monta_segmento_r' implementado no module -> BrBoleto::Remessa::Cnab240::Helper::SegmentoR
		# Segmento R é opcional e não é utilizados por alguns bancos
		if usa_segmento_R?
			sequencial_do_lote += 1
			itens_lote << monta_segmento_r(pagamento, nro_lote, sequencial_do_lote)
		end

		# Metodo 'monta_segmento_s' implementado no module -> BrBoleto::Remessa::Cnab240::Helper::SegmentoS
		# Segmento S é opcional e não é utilizados por alguns bancos
		if usa_segmento_S?
			sequencial_do_lote += 1
			itens_lote << monta_segmento_s(pagamento, nro_lote, sequencial_do_lote)
		end
	end
	
	# total_de_registros_do_lote é a quantidade de registros(linhas) que constam em um lote
	# Total de complementos do lote + o HEADER_LOTE + TRAILER_LOTE
	#        sequencial_do_lote     +       1       +      1  
	total_de_registros_do_lote = sequencial_do_lote + 2

	# Metodo 'monta_trailer_lote' implementado no module -> BrBoleto::Remessa::Cnab240::Helper::TrailerLote
	itens_lote << monta_trailer_lote(lote, nro_lote, total_de_registros_do_lote)

	itens_lote
end

#pagamento_valid_distribuicao_boleto_lengthObject



59
60
61
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 59

def pagamento_valid_distribuicao_boleto_length
	1
end

#pagamento_valid_emissao_boleto_lengthObject



55
56
57
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 55

def pagamento_valid_emissao_boleto_length
	1
end

#segmento_p_numero_do_documento(pagamento) ⇒ Object

Número do Documento de Cobrança Cada banco tem sua maneira de identificar esse número, mas o padrão é o Valor que se encontra no numero_documento ou então em nosso numero 15 posições



177
178
179
180
181
182
183
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 177

def segmento_p_numero_do_documento(pagamento)
	if pagamento.numero_documento.present?
		pagamento.numero_documento.to_s.rjust(15, '0')
	else
		pagamento.nosso_numero.to_s.rjust(15, '0')
	end
end

#usa_segmento_R?Boolean

Returns:

  • (Boolean)


63
64
65
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 63

def usa_segmento_R?
	true
end

#usa_segmento_S?Boolean

Returns:

  • (Boolean)


67
68
69
# File 'lib/br_boleto/remessa/cnab240/base.rb', line 67

def usa_segmento_S?
	true
end