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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 593cb081dff8f21bab6e58c2db042b7e02b0d782
4
- data.tar.gz: d5582cebb6449270fdd153960d3b852cb3aea3e5
3
+ metadata.gz: dce041d9cd2c0e7817699cd9c3d76de9eba2764b
4
+ data.tar.gz: 0f7bbdf07f90c35583133cb6e5f5cad64bd4245c
5
5
  SHA512:
6
- metadata.gz: d502108847e2af4465bfa60c077c6a13fd6220456b0fdc2cbc48232436bb7ddde26dfd686bc80eb57c2f72a56f2fddacfb816e5fa73dd466b8b420114bf8149b
7
- data.tar.gz: 3b5b39b0dcdd2605d03f4e69dbe8bd7d97945c50316386624f2b26190d2f00b509705fdd5e70f48fbaf7d306a57019e48586c3ed7c743eb56d6126654b816621
6
+ metadata.gz: 31df8bb87334c1b50c2059561c2359c5ab2d6797f2f038050d55d1c6538146a28c0e0801e247b1e7bccf07c3543f30a255d84b2ec7ae5c191550a2c3555f9bd5
7
+ data.tar.gz: 24f5e9b3b94162276c473af0ca92a4fe32514959635d9d83845405a2db9a1b536635950dfb9cd238c5c3d062295f31e91dd8ff4080e662bbae41407cf2751a2d
data/Gemfile CHANGED
@@ -5,7 +5,7 @@ gemspec
5
5
 
6
6
  group :development do
7
7
  gem 'pry', '~> 0.10.0'
8
- gem 'rubocop', '~> 0.34.2'
8
+ gem 'rubocop', '~> 0.35.1'
9
9
  gem 'rubocop-rspec', '~> 1.3.0'
10
10
  end
11
11
 
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.5'
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
- extend define_template(Brcobranca.configuration.gerador)
11
- include define_template(Brcobranca.configuration.gerador)
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}".modulo11
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: { 10 => 0 }).to_s
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 to(formato, options = {})
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 lote(boletos, options = {})
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.especie
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.moeda
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: '1' }.merge!(campos)
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
- '58'.rjust(294, ' ')
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[8]
69
- detalhe << pagamento.formata_data_segundo_desconto # data limite para o segundo desconto 9[06]
70
- detalhe << ''.rjust(1, ' ') # brancos X[1]
71
- detalhe << pagamento.codigo_multa # Com multa = 4, Sem multa = 0 9[1]
72
- detalhe << pagamento.percentual_multa.rjust(4, '0') # Percentual multa por atraso % 9[6]
73
- detalhe << '00' # Unidade de valor moeda corrente = 00 9[2]
74
- detalhe << '0'.rjust(13, '0') # Valor do título em outra unidade 9[15]
75
- detalhe << ''.rjust(4, ' ') # brancos X[4]
76
- detalhe << pagamento.formata_data_multa # Data para cobrança de multa 9[6]
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
- detalhe << ''.rjust(5, '0') # agencia cobradora - deixar zero 9[05]
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 << aceite # aceite (A/N) X[01]
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 # identificacao do pagador 9[02]
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) # nome do pagador X[40]
133
- detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40]
134
- detalhe << pagamento.bairro_sacado.format_size(12) # bairro do pagador X[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
- detalhe << pagamento.nome_avalista.format_size(30) # Sacador/Mensagens X[30]
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
- detalhe << ''.rjust(1, ' ') # Identificador do Complemento X[1]
141
- detalhe << ''.rjust(2, ' ') # Complemento 9[2]
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
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  module Brcobranca
4
- VERSION = '6.1.7'
4
+ VERSION = '6.1.8'
5
5
  end
@@ -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 294 caracteres' do
82
- expect(santander.complemento.size).to eq 294
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 140715 58000001
2
- 1010001234567891017777751042700080112 00000123000000 00000000000000000000 000000101000000000014071500000000199900330000001N140715000000000000000000000000000000000000000000000000000000000000000100012345678901PABLO DIEGO JOSE FRANCISCO DE PAULA JUANRUA RIO GRANDE DO SUL SAO PAULO MINAS CASAO JOSE DOS12345678SANTA RITA DE CSP 00 000002
3
- 9 000003
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.7
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-10-21 00:00:00.000000000 Z
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.5
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.5
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