brcobranca 6.1.7 → 6.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/brcobranca.gemspec +1 -1
- data/lib/brcobranca.rb +11 -1
- data/lib/brcobranca/boleto/base.rb +4 -2
- data/lib/brcobranca/boleto/sicredi.rb +12 -2
- data/lib/brcobranca/boleto/template/base.rb +5 -3
- data/lib/brcobranca/boleto/template/rghost_carne.rb +4 -4
- data/lib/brcobranca/remessa/cnab400/base.rb +8 -0
- data/lib/brcobranca/remessa/cnab400/santander.rb +75 -21
- data/lib/brcobranca/retorno/cnab240/base.rb +38 -0
- data/lib/brcobranca/retorno/cnab240/caixa.rb +43 -0
- data/lib/brcobranca/retorno/cnab240/sicoob.rb +94 -0
- data/lib/brcobranca/version.rb +1 -1
- data/spec/arquivos/CNAB240SICOOB.RET +10 -0
- data/spec/brcobranca/boleto/sicredi_spec.rb +20 -1
- data/spec/brcobranca/remessa/cnab400/base_spec.rb +17 -1
- data/spec/brcobranca/remessa/cnab400/santander_spec.rb +22 -2
- data/spec/brcobranca/retorno/cnab240/base_spec.rb +23 -0
- data/spec/brcobranca/retorno/cnab240/sicoob_spec.rb +48 -0
- data/spec/fixtures/remessa/remessa-santander-cnab400.rem +3 -3
- data/spec/support/shared_examples/cnab400.rb +1 -1
- metadata +15 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dce041d9cd2c0e7817699cd9c3d76de9eba2764b
|
4
|
+
data.tar.gz: 0f7bbdf07f90c35583133cb6e5f5cad64bd4245c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31df8bb87334c1b50c2059561c2359c5ab2d6797f2f038050d55d1c6538146a28c0e0801e247b1e7bccf07c3543f30a255d84b2ec7ae5c191550a2c3555f9bd5
|
7
|
+
data.tar.gz: 24f5e9b3b94162276c473af0ca92a4fe32514959635d9d83845405a2db9a1b536635950dfb9cd238c5c3d062295f31e91dd8ff4080e662bbae41407cf2751a2d
|
data/Gemfile
CHANGED
data/brcobranca.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.required_ruby_version = '>= 1.9'
|
22
22
|
|
23
23
|
# Gems that must be intalled for sift to work
|
24
|
-
gem.add_dependency 'rghost', '0.9
|
24
|
+
gem.add_dependency 'rghost', '~> 0.9'
|
25
25
|
gem.add_dependency 'rghost_barcode', '~> 0.9'
|
26
26
|
gem.add_dependency 'parseline', '~> 1.0.3'
|
27
27
|
gem.add_dependency 'activemodel', '>= 3'
|
data/lib/brcobranca.rb
CHANGED
@@ -117,14 +117,24 @@ module Brcobranca
|
|
117
117
|
module Retorno
|
118
118
|
autoload :Base, 'brcobranca/retorno/base'
|
119
119
|
autoload :RetornoCbr643, 'brcobranca/retorno/retorno_cbr643'
|
120
|
-
autoload :RetornoCnab240, 'brcobranca/retorno/retorno_cnab240'
|
120
|
+
autoload :RetornoCnab240, 'brcobranca/retorno/retorno_cnab240' # DEPRECATED
|
121
121
|
autoload :RetornoCnab400, 'brcobranca/retorno/retorno_cnab400' # DEPRECATED
|
122
122
|
|
123
|
+
module Cnab240
|
124
|
+
autoload :Base, 'brcobranca/retorno/cnab240/base'
|
125
|
+
autoload :Caixa, 'brcobranca/retorno/cnab240/caixa'
|
126
|
+
end
|
127
|
+
|
123
128
|
module Cnab400
|
124
129
|
autoload :Base, 'brcobranca/retorno/cnab400/base'
|
125
130
|
autoload :Bradesco, 'brcobranca/retorno/cnab400/bradesco'
|
126
131
|
autoload :Itau, 'brcobranca/retorno/cnab400/itau'
|
127
132
|
end
|
133
|
+
|
134
|
+
module Cnab240
|
135
|
+
autoload :Base, 'brcobranca/retorno/cnab240/base'
|
136
|
+
autoload :Sicoob, 'brcobranca/retorno/cnab240/sicoob'
|
137
|
+
end
|
128
138
|
end
|
129
139
|
|
130
140
|
# Módulos para as classes que geram os arquivos remessa
|
@@ -7,8 +7,10 @@ module Brcobranca
|
|
7
7
|
extend Template::Base
|
8
8
|
|
9
9
|
# Configura gerador de arquivo de boleto e código de barras.
|
10
|
-
|
11
|
-
|
10
|
+
define_template(Brcobranca.configuration.gerador).each do |klass|
|
11
|
+
extend klass
|
12
|
+
include klass
|
13
|
+
end
|
12
14
|
|
13
15
|
# Validações do Rails 3
|
14
16
|
include ActiveModel::Validations
|
@@ -91,7 +91,8 @@ module Brcobranca
|
|
91
91
|
# Dígito verificador do nosso número
|
92
92
|
# @return [Integer] 1 caracteres numéricos.
|
93
93
|
def nosso_numero_dv
|
94
|
-
"#{agencia_posto_conta}#{numero_documento_with_byte_idt}"
|
94
|
+
"#{agencia_posto_conta}#{numero_documento_with_byte_idt}"
|
95
|
+
.modulo11(mapeamento: mapeamento_para_modulo_11)
|
95
96
|
end
|
96
97
|
|
97
98
|
def agencia_conta_boleto
|
@@ -105,7 +106,16 @@ module Brcobranca
|
|
105
106
|
# Segunda parte do código de barras.
|
106
107
|
def codigo_barras_segunda_parte
|
107
108
|
campo_livre = "#{tipo_cobranca}#{tipo_carteira}#{nosso_numero_boleto.gsub(/\D/, '')}#{agencia_posto_conta}10"
|
108
|
-
campo_livre + campo_livre.modulo11(mapeamento:
|
109
|
+
campo_livre + campo_livre.modulo11(mapeamento: mapeamento_para_modulo_11).to_s
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def mapeamento_para_modulo_11
|
115
|
+
{
|
116
|
+
10 => 0,
|
117
|
+
11 => 0
|
118
|
+
}
|
109
119
|
end
|
110
120
|
end
|
111
121
|
end
|
@@ -9,11 +9,13 @@ module Brcobranca
|
|
9
9
|
def define_template(template)
|
10
10
|
case template
|
11
11
|
when :rghost
|
12
|
-
return Brcobranca::Boleto::Template::Rghost
|
12
|
+
return [Brcobranca::Boleto::Template::Rghost]
|
13
13
|
when :rghost_carne
|
14
|
-
return Brcobranca::Boleto::Template::RghostCarne
|
14
|
+
return [Brcobranca::Boleto::Template::RghostCarne]
|
15
|
+
when :both
|
16
|
+
return [Brcobranca::Boleto::Template::Rghost, Brcobranca::Boleto::Template::RghostCarne]
|
15
17
|
else
|
16
|
-
return Brcobranca::Boleto::Template::Rghost
|
18
|
+
return [Brcobranca::Boleto::Template::Rghost]
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
@@ -30,7 +30,7 @@ module Brcobranca
|
|
30
30
|
# @return [Stream]
|
31
31
|
# @see http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats Veja mais formatos na documentação do rghost.
|
32
32
|
# @see Rghost#modelo_carne Recebe os mesmos parâmetros do Rghost#modelo_carne.
|
33
|
-
def
|
33
|
+
def to_carne(formato, options = {})
|
34
34
|
modelo_carne(self, options.merge!(formato: formato))
|
35
35
|
end
|
36
36
|
|
@@ -39,7 +39,7 @@ module Brcobranca
|
|
39
39
|
# @return [Stream]
|
40
40
|
# @see http://wiki.github.com/shairontoledo/rghost/supported-devices-drivers-and-formats Veja mais formatos na documentação do rghost.
|
41
41
|
# @see Rghost#modelo_carne Recebe os mesmos parâmetros do Rghost#modelo_carne.
|
42
|
-
def
|
42
|
+
def lote_carne(boletos, options = {})
|
43
43
|
modelo_carne_multipage(boletos, options)
|
44
44
|
end
|
45
45
|
|
@@ -244,7 +244,7 @@ module Brcobranca
|
|
244
244
|
|
245
245
|
# especie doc.
|
246
246
|
doc.moveto x: colunas[8], y: linhas[3]
|
247
|
-
doc.show boleto.
|
247
|
+
doc.show boleto.especie_documento
|
248
248
|
|
249
249
|
# aceite
|
250
250
|
doc.moveto x: colunas[9], y: linhas[3]
|
@@ -267,7 +267,7 @@ module Brcobranca
|
|
267
267
|
|
268
268
|
# especie
|
269
269
|
doc.moveto x: colunas[5], y: linhas[4]
|
270
|
-
doc.show boleto.
|
270
|
+
doc.show boleto.especie
|
271
271
|
|
272
272
|
# quantidade
|
273
273
|
doc.moveto x: colunas[7], y: linhas[4]
|
@@ -105,6 +105,14 @@ module Brcobranca
|
|
105
105
|
def complemento
|
106
106
|
fail Brcobranca::NaoImplementado.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
107
107
|
end
|
108
|
+
|
109
|
+
# Soma de todos os boletos
|
110
|
+
#
|
111
|
+
# @return [String]
|
112
|
+
def valor_total_titulos(tamanho=13)
|
113
|
+
value = pagamentos.inject(0.0) { |sum, pagamento| sum += pagamento.valor }
|
114
|
+
sprintf('%.2f', value).delete('.').rjust(tamanho, '0')
|
115
|
+
end
|
108
116
|
end
|
109
117
|
end
|
110
118
|
end
|
@@ -12,13 +12,13 @@ module Brcobranca
|
|
12
12
|
|
13
13
|
attr_accessor :codigo_carteira
|
14
14
|
|
15
|
-
validates_presence_of :documento_cedente, :codigo_transmissao, message: 'não pode estar em branco.'
|
15
|
+
validates_presence_of :documento_cedente, :codigo_transmissao, :agencia, message: 'não pode estar em branco.'
|
16
16
|
validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
|
17
17
|
validates_length_of :carteira, maximum: 3, message: 'deve ter no máximo 3 dígitos.'
|
18
18
|
validates_length_of :codigo_transmissao, maximum: 20, message: 'deve ter no máximo 20 dígitos.'
|
19
19
|
|
20
20
|
def initialize(campos = {})
|
21
|
-
campos = { aceite: 'N', carteira: '101', codigo_carteira: '
|
21
|
+
campos = { aceite: 'N', carteira: '101', codigo_carteira: '5'}.merge!(campos)
|
22
22
|
super(campos)
|
23
23
|
end
|
24
24
|
|
@@ -45,7 +45,38 @@ module Brcobranca
|
|
45
45
|
# @return [String]
|
46
46
|
#
|
47
47
|
def complemento
|
48
|
-
'
|
48
|
+
''.rjust(275, ' ')
|
49
|
+
end
|
50
|
+
|
51
|
+
# Complemento zeros do header
|
52
|
+
#
|
53
|
+
# @return [Integer]
|
54
|
+
#
|
55
|
+
def complemento_zeros
|
56
|
+
'0'.rjust(16, '0')
|
57
|
+
end
|
58
|
+
|
59
|
+
# Header do arquivo remessa
|
60
|
+
#
|
61
|
+
# @return [String]
|
62
|
+
#
|
63
|
+
def monta_header
|
64
|
+
# CAMPO TAMANHO VALOR
|
65
|
+
# tipo do registro [1] 0
|
66
|
+
# operacao [1] 1
|
67
|
+
# literal remessa [7] REMESSA
|
68
|
+
# Código do serviço [2] 01
|
69
|
+
# cod. servico [15] COBRANCA
|
70
|
+
# info. conta [20]
|
71
|
+
# empresa mae [30]
|
72
|
+
# cod. banco [3]
|
73
|
+
# nome banco [15]
|
74
|
+
# data geracao [6] formato DDMMAA
|
75
|
+
# Zeros.................[16]
|
76
|
+
# complemento registro [274] Brancos
|
77
|
+
# Versao da remessa.....[3] Numero da versao da remessa opcional, se informada, sera controlada pelo sistema (opcional = 000)
|
78
|
+
# num. sequencial [6] 000001
|
79
|
+
"01REMESSA01COBRANCA #{info_conta}#{empresa_mae.format_size(30)}#{cod_banco}#{nome_banco}#{data_geracao}#{complemento_zeros}#{complemento}000000001"
|
49
80
|
end
|
50
81
|
|
51
82
|
# Detalhe do arquivo
|
@@ -65,15 +96,16 @@ module Brcobranca
|
|
65
96
|
detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
|
66
97
|
detalhe << codigo_transmissao # Código de Transmissão 9[20]
|
67
98
|
detalhe << ''.rjust(25, ' ') # identificacao do tit. na empresa X[25]
|
68
|
-
detalhe << pagamento.nosso_numero.to_s.rjust(8, '0') # nosso numero 9[
|
69
|
-
detalhe <<
|
70
|
-
detalhe <<
|
71
|
-
detalhe <<
|
72
|
-
detalhe << pagamento.
|
73
|
-
detalhe << '
|
74
|
-
detalhe << '
|
75
|
-
detalhe << ''.rjust(
|
76
|
-
detalhe <<
|
99
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(8, '0') # nosso numero 9[08]
|
100
|
+
detalhe << ''.rjust(6, ' ') # data limite para o segundo desconto 9[06]
|
101
|
+
# detalhe << pagamento.formata_data_segundo_desconto # data limite para o segundo desconto 9[06]
|
102
|
+
detalhe << ' ' # brancos X[01]
|
103
|
+
detalhe << pagamento.codigo_multa # Com multa = 4, Sem multa = 0 9[01]
|
104
|
+
detalhe << pagamento.percentual_multa.rjust(4, '0') # Percentual multa por atraso % 9[04]
|
105
|
+
detalhe << '00' # Unidade de valor moeda corrente = 00 9[02]
|
106
|
+
detalhe << '0'.rjust(13, '0') # Valor do título em outra unidade 9[13]
|
107
|
+
detalhe << ''.rjust(4, ' ') # brancos X[04]
|
108
|
+
detalhe << pagamento.formata_data_multa # Data para cobrança de multa 9[06]
|
77
109
|
|
78
110
|
# codigo da carteira
|
79
111
|
# 1 = ELETRÔNICA COM REGISTRO
|
@@ -99,7 +131,10 @@ module Brcobranca
|
|
99
131
|
detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
|
100
132
|
detalhe << pagamento.formata_valor # valor do documento 9[13]
|
101
133
|
detalhe << cod_banco # codigo banco 9[03]
|
102
|
-
|
134
|
+
# Código da agência cobradora do Banco Santander,
|
135
|
+
# opcional informar somente se carteira for igual a 5,
|
136
|
+
# caso contrário, informar zeros.
|
137
|
+
detalhe << agencia.rjust(5, '0') # agencia cobradora.............. 9[05]
|
103
138
|
|
104
139
|
# Espécie de documento:
|
105
140
|
# 01 = DUPLICATA
|
@@ -109,7 +144,7 @@ module Brcobranca
|
|
109
144
|
# 06 = DUPLICATA DE SERVIÇO
|
110
145
|
# 07 = LETRA DE CAMBIO
|
111
146
|
detalhe << pagamento.especie_titulo # Espécie de documento 9[02]
|
112
|
-
detalhe <<
|
147
|
+
detalhe << 'N' # aceite (A/N) X[01]
|
113
148
|
detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
|
114
149
|
|
115
150
|
# Instrução cobrança
|
@@ -127,18 +162,20 @@ module Brcobranca
|
|
127
162
|
detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
|
128
163
|
detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
|
129
164
|
detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
|
130
|
-
detalhe << pagamento.identificacao_sacado
|
165
|
+
detalhe << pagamento.identificacao_sacado.rjust(2, '0') # identificacao do pagador 9[02]
|
131
166
|
detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
|
132
|
-
detalhe << pagamento.nome_sacado.format_size(40)
|
133
|
-
detalhe << pagamento.endereco_sacado.format_size(40)
|
134
|
-
detalhe << pagamento.bairro_sacado.format_size(12)
|
167
|
+
detalhe << pagamento.nome_sacado.format_size(40).ljust(40, ' ') # nome do pagador X[40]
|
168
|
+
detalhe << pagamento.endereco_sacado.format_size(40).ljust(40, ' ')# endereco do pagador X[40]
|
169
|
+
detalhe << pagamento.bairro_sacado.format_size(12).ljust(12, ' ') # bairro do pagador X[12]
|
135
170
|
detalhe << pagamento.cep_sacado # cep do pagador 9[08]
|
136
171
|
detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
|
137
172
|
detalhe << pagamento.uf_sacado # uf do pagador X[02]
|
138
|
-
|
173
|
+
# SE O CEDENTE FOR PESSOA JURÍDICA, O MESMO NÃO PODE TER SACADOR AVALISTA. DEIXAR CAMPO EM BRANCO
|
174
|
+
detalhe << ''.rjust(30, ' ') # Sacador X[30]
|
139
175
|
detalhe << ''.rjust(1, ' ') # Brancos X[1]
|
140
|
-
|
141
|
-
detalhe << ''
|
176
|
+
# INFORMAR NESTE CAMPO CARACTERE 'I' (i maiúsculo)
|
177
|
+
detalhe << 'I' # Identificador do Complemento X[1]
|
178
|
+
detalhe << '77' # Complemento 9[2]
|
142
179
|
detalhe << ''.rjust(6, ' ') # Brancos X[06]
|
143
180
|
# Se identificacao_ocorrencia = 06
|
144
181
|
detalhe << '00'.rjust(2, ' ') # Número de dias para protesto 9[02]
|
@@ -146,6 +183,23 @@ module Brcobranca
|
|
146
183
|
detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
|
147
184
|
detalhe
|
148
185
|
end
|
186
|
+
|
187
|
+
# Trailer do arquivo remessa
|
188
|
+
#
|
189
|
+
# @param sequencial
|
190
|
+
# num. sequencial do registro no arquivo
|
191
|
+
#
|
192
|
+
# @return [String]
|
193
|
+
#
|
194
|
+
def monta_trailer(sequencial)
|
195
|
+
# CAMPO TAMANHO VALOR
|
196
|
+
# identificacao registro [1] 9
|
197
|
+
# Quantidade total de linhas no arquivo [6]
|
198
|
+
# Valor total dos títulos [13]
|
199
|
+
# zeros [374]
|
200
|
+
# num. sequencial [6]
|
201
|
+
"9#{sequencial.to_s.rjust(6, '0')}#{valor_total_titulos(13)}#{''.rjust(374, '0')}#{sequencial.to_s.rjust(6, '0')}"
|
202
|
+
end
|
149
203
|
end
|
150
204
|
end
|
151
205
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'parseline'
|
3
|
+
|
4
|
+
module Brcobranca
|
5
|
+
module Retorno
|
6
|
+
module Cnab240
|
7
|
+
class Base < Brcobranca::Retorno::Base
|
8
|
+
|
9
|
+
# Load lines
|
10
|
+
def self.load_lines(file, options={})
|
11
|
+
return nil if file.blank?
|
12
|
+
|
13
|
+
codigo_banco = codigo_banco_do_arquivo(file)
|
14
|
+
|
15
|
+
case codigo_banco
|
16
|
+
when "756"
|
17
|
+
Brcobranca::Retorno::Cnab240::Sicoob.load_lines(file, options)
|
18
|
+
when "104"
|
19
|
+
Brcobranca::Retorno::Cnab240::Caixa.load_lines(file, options)
|
20
|
+
else
|
21
|
+
Brcobranca::Retorno::RetornoCnab240.load_lines(file, options)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Codigo do banco lido do arquivo.
|
26
|
+
# Registro Header [0..2]
|
27
|
+
def self.codigo_banco_do_arquivo(file)
|
28
|
+
arquivo = File.open(file, "r")
|
29
|
+
header = arquivo.gets
|
30
|
+
codigo_banco = header.blank? ? nil : header[0..2]
|
31
|
+
arquivo.close
|
32
|
+
codigo_banco
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Brcobranca
|
4
|
+
module Retorno
|
5
|
+
module Cnab240
|
6
|
+
# Formato de Retorno CNAB 240
|
7
|
+
# Baseado em: http://www.caixa.gov.br/downloads/cobranca-caixa-manuais/LEIAUTE_CNAB_240_SIGCB_COBRANCA_CAIXA.pdf
|
8
|
+
class Caixa < Brcobranca::Retorno::RetornoCnab240
|
9
|
+
class Line < Brcobranca::Retorno::RetornoCnab240::Line
|
10
|
+
# Fixed width layout for Caixa
|
11
|
+
fixed_width_layout do |parse|
|
12
|
+
# REGISTRO_T_FIELDS
|
13
|
+
# Not applicable
|
14
|
+
# :cedente_com_dv
|
15
|
+
|
16
|
+
# Same inherited from parent
|
17
|
+
# parse.field :data_vencimento, 73..80
|
18
|
+
# parse.field :valor_titulo, 81..95
|
19
|
+
# parse.field :banco_recebedor, 96..98
|
20
|
+
# parse.field :sequencial, 8..12
|
21
|
+
# parse.field :valor_tarifa, 198..212
|
22
|
+
# parse.field :agencia_com_dv, 17..22
|
23
|
+
|
24
|
+
parse.field :nosso_numero, 39..55
|
25
|
+
parse.field :agencia_recebedora_com_dv, 99..103
|
26
|
+
|
27
|
+
# REGISTRO_U_FIELDS
|
28
|
+
|
29
|
+
# Same inherited from parent
|
30
|
+
# parse.field :desconto_concedito, 32..46
|
31
|
+
# parse.field :valor_abatimento, 47..61
|
32
|
+
# parse.field :iof_desconto, 62..76
|
33
|
+
# parse.field :juros_mora, 17..31
|
34
|
+
# parse.field :valor_recebido, 77..91
|
35
|
+
# parse.field :outras_despesas, 107..121
|
36
|
+
# parse.field :outros_recebimento, 122..136
|
37
|
+
# parse.field :data_credito, 145..152
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require "parseline"
|
4
|
+
|
5
|
+
module Brcobranca
|
6
|
+
module Retorno
|
7
|
+
module Cnab240
|
8
|
+
class Sicoob < Brcobranca::Retorno::Cnab240::Base
|
9
|
+
# Regex para remoção de headers e trailers além de registros diferentes de T ou U
|
10
|
+
REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U = /^((?!^.{7}3.{5}[T|U].*$).)*$/
|
11
|
+
|
12
|
+
def self.load_lines(file, options = {})
|
13
|
+
default_options = { except: REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U }
|
14
|
+
options = default_options.merge!(options)
|
15
|
+
|
16
|
+
Line.load_lines(file, options).each_slice(2).reduce([]) do |retornos, cnab_lines|
|
17
|
+
retornos << generate_retorno_based_on_cnab_lines(cnab_lines)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.generate_retorno_based_on_cnab_lines(cnab_lines)
|
22
|
+
retorno = new
|
23
|
+
cnab_lines.each do |line|
|
24
|
+
if line.tipo_registro == "T"
|
25
|
+
Line::REGISTRO_T_FIELDS.each do |attr|
|
26
|
+
retorno.send(attr + "=", line.send(attr))
|
27
|
+
end
|
28
|
+
else
|
29
|
+
Line::REGISTRO_U_FIELDS.each do |attr|
|
30
|
+
retorno.send(attr + "=", line.send(attr))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
retorno
|
35
|
+
end
|
36
|
+
|
37
|
+
# Linha de mapeamento do retorno do arquivo CNAB 240
|
38
|
+
# O registro CNAB 240 possui 2 tipos de registros que juntos geram um registro de retorno bancário
|
39
|
+
# O primeiro é do tipo T que retorna dados gerais sobre a transação
|
40
|
+
# O segundo é do tipo U que retorna os valores da transação
|
41
|
+
class Line < Base
|
42
|
+
extend ParseLine::FixedWidth # Extendendo parseline
|
43
|
+
|
44
|
+
REGISTRO_T_FIELDS = %w(agencia_com_dv cedente_com_dv nosso_numero carteira data_vencimento valor_titulo banco_recebedor agencia_recebedora_com_dv sequencial valor_tarifa)
|
45
|
+
REGISTRO_U_FIELDS = %w(desconto_concedito valor_abatimento iof_desconto juros_mora valor_recebido outras_despesas outros_recebimento data_credito)
|
46
|
+
|
47
|
+
attr_accessor :tipo_registro
|
48
|
+
|
49
|
+
fixed_width_layout do |parse|
|
50
|
+
parse.field :tipo_registro, 13..13
|
51
|
+
parse.field :sequencial, 8..12
|
52
|
+
parse.field :agencia_com_dv, 17..22
|
53
|
+
parse.field :cedente_com_dv, 23..35
|
54
|
+
parse.field :nosso_numero, 37..46
|
55
|
+
parse.field :carteira, 57..57
|
56
|
+
parse.field :data_vencimento, 73..80
|
57
|
+
parse.field :valor_titulo, 81..95
|
58
|
+
parse.field :banco_recebedor, 96..98
|
59
|
+
parse.field :agencia_recebedora_com_dv, 99..104
|
60
|
+
# parse.field :data_ocorrencia, 137..144
|
61
|
+
parse.field :data_credito, 145..152
|
62
|
+
parse.field :outras_despesas, 107..121
|
63
|
+
parse.field :iof_desconto, 62..76
|
64
|
+
parse.field :valor_abatimento, 47..61
|
65
|
+
parse.field :desconto_concedito, 32..46
|
66
|
+
parse.field :valor_recebido, 77..91
|
67
|
+
parse.field :juros_mora, 17..31
|
68
|
+
parse.field :outros_recebimento, 122..136
|
69
|
+
parse.field :valor_tarifa, 198..212
|
70
|
+
|
71
|
+
# Dados que não consegui extrair dos registros T e U
|
72
|
+
# parse.field :convenio,31..37
|
73
|
+
# parse.field :tipo_cobranca,80..80
|
74
|
+
# parse.field :tipo_cobranca_anterior,81..81
|
75
|
+
# parse.field :natureza_recebimento,86..87
|
76
|
+
# parse.field :carteira_variacao,91..93
|
77
|
+
# parse.field :desconto,95..99
|
78
|
+
# parse.field :iof,100..104
|
79
|
+
# parse.field :comando,108..109
|
80
|
+
# parse.field :data_liquidacao,110..115
|
81
|
+
# parse.field :especie_documento,173..174
|
82
|
+
# parse.field :valor_tarifa,181..187
|
83
|
+
# parse.field :juros_desconto,201..213
|
84
|
+
# parse.field :abatimento_nao_aproveitado,292..304
|
85
|
+
# parse.field :valor_lancamento,305..317
|
86
|
+
# parse.field :indicativo_lancamento,318..318
|
87
|
+
# parse.field :indicador_valor,319..319
|
88
|
+
# parse.field :valor_ajuste,320..331
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/lib/brcobranca/version.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
75600000 282991308000100 03039000000004898160RAZAO SOCIAL SICOOB 21108201509361900000108500000
|
2
|
+
75600011T01 043 2082991308000100 303900000403039000000004898160RAZAO SOCIAL 000000001108201500000000
|
3
|
+
7560001300001T 0603039000000004898160000000008301011 10000000000000011308201500000000000020075603039000000000000000000000000000920039977830001182A MATERIAIS ELETRICOS 00000000000000000000001700000000003
|
4
|
+
7560001300002U 060000000000000000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000001008201510082015 00000000000000000000000 75600000000000000000000
|
5
|
+
7560001300003T 0603039000000004898160000000011601011 10000000000000121308201500000000000020075603039000000000000000000000000000920039977830001182A MATERIAIS ELETRICOS 00000000000000000000001700000000003
|
6
|
+
7560001300004U 060000000000000000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000001008201510082015 00000000000000000000000 75600000000000000000000
|
7
|
+
7560001300005T 0603039000000004898160000000012301011 10000000000000131308201500000000000020075603039000000000000000000000000000920039977830001182A MATERIAIS ELETRICOS 00000000000000000000001700000000003
|
8
|
+
7560001300006U 060000000000000000000000000000000000000000000000000000000000000000000000002000000000000002000000000000000000000000000000001008201510082015 00000000000000000000000 75600000000000000000000
|
9
|
+
75600015 00000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
10
|
+
75699999 000001000010000000
|
@@ -75,7 +75,6 @@ RSpec.describe Brcobranca::Boleto::Sicredi do
|
|
75
75
|
|
76
76
|
expect(boleto_novo.codigo_barras.linha_digitavel).to eql('74893.11220 13871.512342 18123.451009 1 52220000295295')
|
77
77
|
expect(boleto_novo.codigo_barras_segunda_parte).to eql('3112213871512341812345100')
|
78
|
-
# boleto_novo.codigo_barras.should eql("23791377000000135004042030077770016800619000")
|
79
78
|
end
|
80
79
|
|
81
80
|
it 'Não permitir gerar boleto com atributos inválido' do
|
@@ -145,4 +144,24 @@ RSpec.describe Brcobranca::Boleto::Sicredi do
|
|
145
144
|
expect(File.exist?(tmp_file.path)).to be_falsey
|
146
145
|
end
|
147
146
|
end
|
147
|
+
|
148
|
+
it "quando dígito verificador for 10 deve ser mapeado para 0" do
|
149
|
+
attributes = {
|
150
|
+
convenio: "2442725",
|
151
|
+
agencia: "0217",
|
152
|
+
conta_corrente: "42725",
|
153
|
+
byte_idt: 1,
|
154
|
+
posto: "24",
|
155
|
+
numero_documento: 25,
|
156
|
+
valor: 20.00,
|
157
|
+
data_documento: Date.parse("2015-01-18")
|
158
|
+
}
|
159
|
+
attributes = @valid_attributes.merge(attributes)
|
160
|
+
boleto_novo = described_class.new(attributes)
|
161
|
+
|
162
|
+
result = boleto_novo.nosso_numero_dv
|
163
|
+
|
164
|
+
expect("#{boleto_novo.agencia_posto_conta}#{boleto_novo.numero_documento_with_byte_idt}".modulo11).to eq(10)
|
165
|
+
expect(result).to eq(0)
|
166
|
+
end
|
148
167
|
end
|
@@ -14,12 +14,24 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Base do
|
|
14
14
|
cidade_sacado: 'Santa rita de cássia maria da silva',
|
15
15
|
uf_sacado: 'SP')
|
16
16
|
end
|
17
|
+
let(:pagamento_2) do
|
18
|
+
Brcobranca::Remessa::Pagamento.new(valor: 199.9,
|
19
|
+
data_vencimento: Date.today,
|
20
|
+
nosso_numero: 123,
|
21
|
+
documento_sacado: '12345678901',
|
22
|
+
nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
|
23
|
+
endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
|
24
|
+
bairro_sacado: 'São josé dos quatro apostolos magros',
|
25
|
+
cep_sacado: '12345678',
|
26
|
+
cidade_sacado: 'Santa rita de cássia maria da silva',
|
27
|
+
uf_sacado: 'SP')
|
28
|
+
end
|
17
29
|
let(:params) do
|
18
30
|
{ empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
|
19
31
|
agencia: '123',
|
20
32
|
conta_corrente: '1234',
|
21
33
|
digito_conta: '1',
|
22
|
-
pagamentos: [pagamento] }
|
34
|
+
pagamentos: [pagamento, pagamento_2] }
|
23
35
|
end
|
24
36
|
let(:cnab400) { subject.class.new(params) }
|
25
37
|
|
@@ -32,4 +44,8 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Base do
|
|
32
44
|
expect { cnab400.complemento }.to raise_error(Brcobranca::NaoImplementado, 'Sobreescreva este método na classe referente ao banco que você esta criando')
|
33
45
|
end
|
34
46
|
end
|
47
|
+
|
48
|
+
context '#valor_total_titulos' do
|
49
|
+
it { expect(cnab400.valor_total_titulos(13)).to eq('0000000039980') }
|
50
|
+
end
|
35
51
|
end
|
@@ -19,6 +19,7 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Santander do
|
|
19
19
|
codigo_transmissao: '17777751042700080112',
|
20
20
|
empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
|
21
21
|
documento_cedente: '12345678910',
|
22
|
+
agencia: '8888',
|
22
23
|
pagamentos: [pagamento]
|
23
24
|
}
|
24
25
|
end
|
@@ -78,8 +79,12 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Santander do
|
|
78
79
|
expect(nome_banco.strip).to eq 'SANTANDER'
|
79
80
|
end
|
80
81
|
|
81
|
-
it 'complemento deve retornar
|
82
|
-
expect(santander.complemento.size).to eq
|
82
|
+
it 'complemento deve retornar 275 caracteres' do
|
83
|
+
expect(santander.complemento.size).to eq 275
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'complemento zeros deve retornar 16 caracteres' do
|
87
|
+
expect(santander.complemento_zeros.size).to eq 16
|
83
88
|
end
|
84
89
|
|
85
90
|
it 'info_conta deve retornar com 20 posicoes as informacoes da conta' do
|
@@ -113,6 +118,21 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Santander do
|
|
113
118
|
end
|
114
119
|
end
|
115
120
|
|
121
|
+
context 'trailer' do
|
122
|
+
it 'trailer deve ter 400 posicoes' do
|
123
|
+
expect(santander.monta_trailer(1).size).to eq 400
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'informacoes devem estar posicionadas corretamente no trailer' do
|
127
|
+
trailer = santander.monta_trailer 3
|
128
|
+
expect(trailer[0]).to eq '9' # identificacao registro
|
129
|
+
expect(trailer[1..6]).to eq '000003' # numero de linhas
|
130
|
+
expect(trailer[7..19]).to eq '0000000019990' # valor total
|
131
|
+
expect(trailer[20..393]).to eq ''.rjust(374, '0') # zeros
|
132
|
+
expect(trailer[394..399]).to eq '000003' # numero sequencial do registro
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
116
136
|
context 'arquivo' do
|
117
137
|
before { Timecop.freeze(Time.local(2015, 7, 14, 16, 15, 15)) }
|
118
138
|
after { Timecop.return }
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*_ encoding: utf-8 -*-
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
RSpec.describe Brcobranca::Retorno::Cnab240::Base do
|
5
|
+
let(:arquivo) { File.join(File.dirname(__FILE__), "..", "..", "..", "arquivos", nome_arquivo) }
|
6
|
+
|
7
|
+
describe "#load_lines" do
|
8
|
+
it "retorna nil se o arquivo é nil" do
|
9
|
+
expect(Brcobranca::Retorno::Cnab240::Base.load_lines(nil)).to be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
context "Sicoob" do
|
13
|
+
let(:nome_arquivo) { "CNAB240SICOOB.RET" }
|
14
|
+
|
15
|
+
subject { Brcobranca::Retorno::Cnab240::Sicoob }
|
16
|
+
|
17
|
+
it "lê o arquivo pela classe do Sicoob" do
|
18
|
+
expect(subject).to receive(:load_lines).with(arquivo, {})
|
19
|
+
Brcobranca::Retorno::Cnab240::Base.load_lines(arquivo)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*_ encoding: utf-8 -*-
|
2
|
+
RSpec.describe Brcobranca::Retorno::Cnab240::Sicoob do
|
3
|
+
before do
|
4
|
+
@arquivo = File.join(File.dirname(__FILE__), "..", "..", "..", "arquivos", "CNAB240SICOOB.RET")
|
5
|
+
end
|
6
|
+
|
7
|
+
it "Transforma arquivo de retorno em objetos de retorno retornando somente as linhas de pagamentos de titulos sem registro" do
|
8
|
+
pagamentos = described_class.load_lines(@arquivo)
|
9
|
+
expect(pagamentos.size).to eq(3)
|
10
|
+
pagamento = pagamentos.first
|
11
|
+
expect(pagamento.agencia_com_dv).to eql("030390")
|
12
|
+
expect(pagamento.cedente_com_dv).to eql("0000000489816")
|
13
|
+
expect(pagamento.nosso_numero).to eql("0000000083")
|
14
|
+
expect(pagamento.carteira).to eql("1")
|
15
|
+
expect(pagamento.data_vencimento).to eql("13082015")
|
16
|
+
expect(pagamento.valor_titulo).to eql("000000000000200")
|
17
|
+
expect(pagamento.banco_recebedor).to eql("756")
|
18
|
+
expect(pagamento.agencia_recebedora_com_dv).to eql("030390")
|
19
|
+
expect(pagamento.data_credito).to eql("10082015")
|
20
|
+
expect(pagamento.outras_despesas).to eql("000000000000000")
|
21
|
+
expect(pagamento.iof_desconto).to eql("000000000000000")
|
22
|
+
expect(pagamento.valor_abatimento).to eql("000000000000000")
|
23
|
+
expect(pagamento.desconto_concedito).to eql("000000000000000")
|
24
|
+
expect(pagamento.valor_recebido).to eql("000000000000200")
|
25
|
+
expect(pagamento.juros_mora).to eql("000000000000000")
|
26
|
+
expect(pagamento.outros_recebimento).to eql("000000000000000")
|
27
|
+
expect(pagamento.sequencial).to eql("00001")
|
28
|
+
expect(pagamento.valor_tarifa).to eql("000000000000170")
|
29
|
+
|
30
|
+
# Dados que não consegui extrair dos registros T e U
|
31
|
+
# pagamento.convenio.should eql("")
|
32
|
+
# pagamento.tipo_cobranca.should eql("")
|
33
|
+
# pagamento.tipo_cobranca_anterior.should eql("")
|
34
|
+
# pagamento.natureza_recebimento.should eql("")
|
35
|
+
# pagamento.carteira_variacao.should eql("7")
|
36
|
+
# pagamento.iof.should eql("")
|
37
|
+
# pagamento.comando.should eql("")
|
38
|
+
# pagamento.data_liquidacao.should eql("")
|
39
|
+
# pagamento.especie_documento.should eql("")
|
40
|
+
# pagamento.valor_tarifa.should eql("")
|
41
|
+
# pagamento.juros_desconto.should eql("")
|
42
|
+
# pagamento.abatimento_nao_aproveitado.should eql("")
|
43
|
+
# pagamento.valor_lancamento.should eql("")
|
44
|
+
# pagamento.indicativo_lancamento.should eql("")
|
45
|
+
# pagamento.indicador_valor.should eql("")
|
46
|
+
# pagamento.valor_ajuste.should eql("")
|
47
|
+
end
|
48
|
+
end
|
@@ -1,3 +1,3 @@
|
|
1
|
-
01REMESSA01COBRANCA 17777751042700080112SOCIEDADE BRASILEIRA DE ZOOLOG033SANTANDER
|
2
|
-
1010001234567891017777751042700080112
|
3
|
-
|
1
|
+
01REMESSA01COBRANCA 17777751042700080112SOCIEDADE BRASILEIRA DE ZOOLOG033SANTANDER 1407150000000000000000 000000001
|
2
|
+
1010001234567891017777751042700080112 00000123 00000000000000000000 000000501000000000014071500000000199900330888801N140715000000000000000000000000000000000000000000000000000000000000000100012345678901PABLO DIEGO JOSE FRANCISCO DE PAULA JUANRUA RIO GRANDE DO SUL SAO PAULO MINAS CASAO JOSE DOS12345678SANTA RITA DE CSP I77 00 000002
|
3
|
+
9000003000000001999000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003
|
@@ -36,6 +36,7 @@ shared_examples_for 'cnab400' do
|
|
36
36
|
codigo_transmissao: '17777751042700080112',
|
37
37
|
empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
|
38
38
|
documento_cedente: '12345678910',
|
39
|
+
agencia: '8888',
|
39
40
|
pagamentos: [pagamento]
|
40
41
|
}
|
41
42
|
else
|
@@ -70,7 +71,6 @@ shared_examples_for 'cnab400' do
|
|
70
71
|
it 'informacoes devem estar posicionadas corretamente no trailer' do
|
71
72
|
trailer = objeto.monta_trailer 3
|
72
73
|
expect(trailer[0]).to eq '9' # identificacao registro
|
73
|
-
expect(trailer[1..393]).to eq ''.rjust(393, ' ') # brancos
|
74
74
|
expect(trailer[394..399]).to eq '000003' # numero sequencial do registro
|
75
75
|
end
|
76
76
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brcobranca
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.1.
|
4
|
+
version: 6.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kivanio Barbosa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rghost
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.9
|
19
|
+
version: '0.9'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.9
|
26
|
+
version: '0.9'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rghost_barcode
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,6 +154,9 @@ files:
|
|
154
154
|
- lib/brcobranca/remessa/cnab400/santander.rb
|
155
155
|
- lib/brcobranca/remessa/pagamento.rb
|
156
156
|
- lib/brcobranca/retorno/base.rb
|
157
|
+
- lib/brcobranca/retorno/cnab240/base.rb
|
158
|
+
- lib/brcobranca/retorno/cnab240/caixa.rb
|
159
|
+
- lib/brcobranca/retorno/cnab240/sicoob.rb
|
157
160
|
- lib/brcobranca/retorno/cnab400/base.rb
|
158
161
|
- lib/brcobranca/retorno/cnab400/bradesco.rb
|
159
162
|
- lib/brcobranca/retorno/cnab400/itau.rb
|
@@ -164,6 +167,7 @@ files:
|
|
164
167
|
- lib/brcobranca/version.rb
|
165
168
|
- spec/arquivos/CBR64310.RET
|
166
169
|
- spec/arquivos/CNAB240.RET
|
170
|
+
- spec/arquivos/CNAB240SICOOB.RET
|
167
171
|
- spec/arquivos/CNAB400.RET
|
168
172
|
- spec/arquivos/CNAB400BRADESCO.RET
|
169
173
|
- spec/arquivos/CNAB400ITAU.RET
|
@@ -195,6 +199,8 @@ files:
|
|
195
199
|
- spec/brcobranca/remessa/cnab400/itau_spec.rb
|
196
200
|
- spec/brcobranca/remessa/cnab400/santander_spec.rb
|
197
201
|
- spec/brcobranca/remessa/pagamento_spec.rb
|
202
|
+
- spec/brcobranca/retorno/cnab240/base_spec.rb
|
203
|
+
- spec/brcobranca/retorno/cnab240/sicoob_spec.rb
|
198
204
|
- spec/brcobranca/retorno/cnab400/base_spec.rb
|
199
205
|
- spec/brcobranca/retorno/cnab400/bradesco_spec.rb
|
200
206
|
- spec/brcobranca/retorno/cnab400/itau_spec.rb
|
@@ -245,6 +251,7 @@ summary: Gem que permite trabalhar com bloquetos de cobranca para bancos brasile
|
|
245
251
|
test_files:
|
246
252
|
- spec/arquivos/CBR64310.RET
|
247
253
|
- spec/arquivos/CNAB240.RET
|
254
|
+
- spec/arquivos/CNAB240SICOOB.RET
|
248
255
|
- spec/arquivos/CNAB400.RET
|
249
256
|
- spec/arquivos/CNAB400BRADESCO.RET
|
250
257
|
- spec/arquivos/CNAB400ITAU.RET
|
@@ -276,6 +283,8 @@ test_files:
|
|
276
283
|
- spec/brcobranca/remessa/cnab400/itau_spec.rb
|
277
284
|
- spec/brcobranca/remessa/cnab400/santander_spec.rb
|
278
285
|
- spec/brcobranca/remessa/pagamento_spec.rb
|
286
|
+
- spec/brcobranca/retorno/cnab240/base_spec.rb
|
287
|
+
- spec/brcobranca/retorno/cnab240/sicoob_spec.rb
|
279
288
|
- spec/brcobranca/retorno/cnab400/base_spec.rb
|
280
289
|
- spec/brcobranca/retorno/cnab400/bradesco_spec.rb
|
281
290
|
- spec/brcobranca/retorno/cnab400/itau_spec.rb
|