brcobranca 7.2.2 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: be39b6c9af13f25fd769bf4921f6d6880eadcab0
4
- data.tar.gz: 2cfed9e162541fb050f7ee766e775ac0a80f7c49
3
+ metadata.gz: e60af310245b6b49e8a67c848f646fb639365ac7
4
+ data.tar.gz: d9d725c1e54701ff10aeb9488ffc18e3e1f80fed
5
5
  SHA512:
6
- metadata.gz: fde86b9312080dfa6ff9e6ebd14e44f4104f2c5e0e1b1a2646830e773b7c4f5a73d321202496ad27c3188931c96803301d5184ae003b23ad3bfbe73fe808cecb
7
- data.tar.gz: 0b0ef5ff3ba0a288c33daddf0eec11828abf8cb90caff7ab64ff5a6623fa57b01ac865a2a6eaa4c6dc6adfc6b94611b28007be7542aa0d52822d90a5c99720e1
6
+ metadata.gz: c51a8c61fc8044564172b0592e788c90710d8477009f91f0169013c139fb511be621b252c9684da814234d83e12c0ea76cb91ae3430b3c56c09fb2e4f0db8dcc
7
+ data.tar.gz: ce9984679c2a1647ca76aca89fc3a3ad817e30d1b504a1eaa16d48fafcec90199c060112d37f992f298e66b98f4cb55cffaf2f2aee21a2b4c6796ac251999916
data/.travis.yml CHANGED
@@ -1,6 +1,7 @@
1
1
  language: ruby
2
2
  sudo: false
3
3
  rvm:
4
+ - '2.4.1'
4
5
  - '2.3.3'
5
6
  - '2.2.3'
6
7
  - '1.9.3'
data/lib/brcobranca.rb CHANGED
@@ -146,8 +146,8 @@ module Brcobranca
146
146
 
147
147
  # Módulos para as classes que geram os arquivos remessa
148
148
  module Remessa
149
- autoload :Base, 'brcobranca/remessa/base'
150
- autoload :Pagamento, 'brcobranca/remessa/pagamento'
149
+ autoload :Base, 'brcobranca/remessa/base'
150
+ autoload :Pagamento, 'brcobranca/remessa/pagamento'
151
151
 
152
152
  module Cnab400
153
153
  autoload :Base, 'brcobranca/remessa/cnab400/base'
@@ -157,6 +157,7 @@ module Brcobranca
157
157
  autoload :Santander, 'brcobranca/remessa/cnab400/santander'
158
158
  autoload :Sicoob, 'brcobranca/remessa/cnab400/sicoob'
159
159
  autoload :BancoBrasil, 'brcobranca/remessa/cnab400/banco_brasil'
160
+ autoload :BancoNordeste, 'brcobranca/remessa/cnab400/banco_nordeste'
160
161
  end
161
162
 
162
163
  module Cnab240
@@ -3,11 +3,15 @@
3
3
  module Brcobranca
4
4
  module Boleto
5
5
  class Banrisul < Base # Banrisul
6
+ # <b>REQUERIDO</b>: digito verificador do convenio
7
+ attr_accessor :digito_convenio
8
+
6
9
  validates_length_of :agencia, maximum: 4, message: 'deve ser menor ou igual a 4 dígitos.'
7
10
  validates_length_of :conta_corrente, maximum: 8, message: 'deve ser menor ou igual a 8 dígitos.'
8
11
  validates_length_of :numero_documento, maximum: 8, message: 'deve ser menor ou igual a 8 dígitos.'
9
12
  validates_length_of :carteira, maximum: 1, message: 'deve ser menor ou igual a 1 dígitos.'
10
13
  validates_length_of :convenio, maximum: 7, message: 'deve ser menor ou igual a 7 dígitos.'
14
+ validates_length_of :digito_convenio, maximum: 2, message: 'deve ser menor ou igual a 2 dígitos.'
11
15
 
12
16
  def initialize(campos = {})
13
17
  campos = { carteira: '2' }.merge!(campos)
@@ -49,12 +53,18 @@ module Brcobranca
49
53
  @numero_documento = valor.to_s.rjust(8, '0') if valor
50
54
  end
51
55
 
52
- # Número do convênio/contrato do cliente junto ao banco.
56
+ # Número do convênio do cliente junto ao banco.
53
57
  # @return [String] 7 caracteres numéricos.
54
58
  def convenio=(valor)
55
59
  @convenio = valor.to_s.rjust(7, '0') if valor
56
60
  end
57
61
 
62
+ # Digito do convênio do cliente junto ao banco.
63
+ # @return [String] 2 caracteres numéricos.
64
+ def digito_convenio=(valor)
65
+ @digito_convenio = valor.to_s.rjust(2, '0') if valor
66
+ end
67
+
58
68
  # Nosso número para exibição no boleto.
59
69
  #
60
70
  # @return [String] caracteres numéricos.
@@ -63,7 +73,7 @@ module Brcobranca
63
73
  end
64
74
 
65
75
  def agencia_conta_boleto
66
- "#{agencia} / #{convenio}"
76
+ "#{agencia} / #{convenio[0..5]}.#{convenio[6]}.#{digito_convenio}"
67
77
  end
68
78
 
69
79
  # Posições 20 a 20 - Produto:
@@ -52,19 +52,13 @@ module Brcobranca
52
52
  # @return [Integer]
53
53
  # @example
54
54
  # 1 #=> 1
55
- # 11 (1+1) #=> 2
56
- # 13 (1+3) #=> 4
55
+ # 11 (-9 ) #=> 2
56
+ # 13 (-9 ) #=> 4
57
+ # 18 (-9 ) #=> 9
57
58
  def soma_digitos
58
- total = case to_i
59
- when (0..9)
60
- self
61
- else
62
- numero = to_s
63
- total = 0
64
- 0.upto(numero.size - 1) { |digito| total += numero[digito, 1].to_i }
65
- total
66
- end
67
- total.to_i
59
+ total = self.to_i
60
+ total = total - 9 if total > 9
61
+ total
68
62
  end
69
63
 
70
64
  # Faz a multiplicação de um número pelos fatores passados como parâmetro.
@@ -97,7 +91,7 @@ module Brcobranca
97
91
  raise ArgumentError, 'Número inválido' unless is_number?
98
92
 
99
93
  digito_1 = modulo10
100
- digito_2 = "#{self}#{digito_1}".modulo11(multiplicador: [2, 3, 4, 5, 6, 7]) { |total| (total % 11) }
94
+ digito_2 = "#{self}#{digito_1}".modulo11(multiplicador: [2, 3, 4, 5, 6, 7]) { |total| (total < 11 ? total : total % 11) }
101
95
 
102
96
  while digito_2 == 1
103
97
  digito_1 = if digito_1 == 9
@@ -106,7 +100,7 @@ module Brcobranca
106
100
  digito_1 + 1
107
101
  end
108
102
 
109
- digito_2 = "#{self}#{digito_1}".modulo11(multiplicador: [2, 3, 4, 5, 6, 7])
103
+ digito_2 = "#{self}#{digito_1}".modulo11(multiplicador: [2, 3, 4, 5, 6, 7]) { |total| (total < 11 ? total : total % 11) }
110
104
  end
111
105
 
112
106
  digito_2 = 11 - digito_2 if digito_2 != 0
@@ -0,0 +1,162 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Brcobranca
3
+ module Remessa
4
+ module Cnab400
5
+ class BancoNordeste < Brcobranca::Remessa::Cnab400::Base
6
+ # documento do cedente
7
+ attr_accessor :documento_cedente
8
+ # 1 - Emitido pelo banco
9
+ # 2 - Emitido pelo cliente
10
+ attr_accessor :emissao_boleto
11
+
12
+ validates_presence_of :agencia, :conta_corrente, message: 'não pode estar em branco.'
13
+ validates_presence_of :documento_cedente, :digito_conta, message: 'não pode estar em branco.'
14
+ validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
15
+ validates_length_of :conta_corrente, maximum: 7, message: 'deve ter 7 dígitos.'
16
+ validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
17
+ validates_length_of :carteira, maximum: 2, message: 'deve ter 2 dígitos.'
18
+ validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
19
+ validates_inclusion_of :carteira, in: %w(21 41 51), message: 'não é válida.'
20
+
21
+ # Nova instancia do Banco do Nordeste
22
+ def initialize(campos = {})
23
+ campos = {
24
+ aceite: 'N',
25
+ emissao_boleto: '2'
26
+ }.merge!(campos)
27
+
28
+ super(campos)
29
+ end
30
+
31
+ def agencia=(valor)
32
+ @agencia = valor.to_s.rjust(4, '0') if valor
33
+ end
34
+
35
+ def conta_corrente=(valor)
36
+ @conta_corrente = valor.to_s.rjust(7, '0') if valor
37
+ end
38
+
39
+ def carteira=(valor)
40
+ @carteira = valor.to_s.rjust(2, '0') if valor
41
+ end
42
+
43
+ def cod_banco
44
+ '004'
45
+ end
46
+
47
+ def nome_banco
48
+ 'B.DO NORDESTE'.ljust(15, ' ')
49
+ end
50
+
51
+ # Informacoes da conta corrente do cedente
52
+ #
53
+ # @return [String]
54
+ #
55
+ def info_conta
56
+ # CAMPO TAMANHO
57
+ # agencia 4
58
+ # zeros 2
59
+ # conta corrente 7
60
+ # digito da conta 1
61
+ # complemento 6
62
+ "#{agencia}00#{conta_corrente}#{digito_conta}#{''.rjust(6, ' ')}"
63
+ end
64
+
65
+ # Complemento do header
66
+ # (no caso do Banco do Nordeste, sao apenas espacos em branco)
67
+ #
68
+ # @return [String]
69
+ #
70
+ def complemento
71
+ ''.rjust(294, ' ')
72
+ end
73
+
74
+ # Codigo da carteira de acordo com a documentacao do Banco do Nordeste
75
+ #
76
+ # @return [String]
77
+ #
78
+ def codigo_carteira
79
+ return "I" if carteira.to_s == "51"
80
+
81
+ carteiras = {
82
+ "1" => { "21" => "1", "41" => "2" }, # 1 - Emitido pelo banco
83
+ "2" => { "21" => "4", "41" => "5" } # 2 - Emitido pelo cliente
84
+ }
85
+
86
+ carteiras[emissao_boleto.to_s][carteira.to_s]
87
+ end
88
+
89
+ # Dígito verificador do nosso número.
90
+ #
91
+ # @param nosso_numero
92
+ #
93
+ # @return [String] 1 caracteres numéricos.
94
+ def digito_nosso_numero(nosso_numero)
95
+ nosso_numero.to_s.rjust(7, '0').modulo11(
96
+ multiplicador: (2..8).to_a,
97
+ mapeamento: { 1 => 0, 10 => 0, 11 => 0 }
98
+ ) { |total| 11 - (total % 11) }
99
+ end
100
+
101
+ # Detalhe do arquivo
102
+ #
103
+ # @param pagamento [PagamentoCnab400]
104
+ # objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
105
+ # @param sequencial
106
+ # num. sequencial do registro no arquivo
107
+ #
108
+ # @return [String]
109
+ #
110
+ def monta_detalhe(pagamento, sequencial)
111
+ fail Brcobranca::RemessaInvalida.new(pagamento) if pagamento.invalid?
112
+
113
+ detalhe = '1' # identificacao transacao 9[01]
114
+ detalhe << ''.rjust(16, ' ') # filler [16]
115
+ detalhe << agencia # agencia 9[04]
116
+ detalhe << ''.rjust(2, '0') # complemento de registro (zeros) 9[02]
117
+ detalhe << conta_corrente # conta corrente 9[07]
118
+ detalhe << digito_conta # dac 9[01]
119
+ detalhe << pagamento.percentual_multa.to_s.delete('.').rjust(2, '0') # taxa - multa [02]
120
+ detalhe << ''.rjust(4, ' ') # filler [04]
121
+ detalhe << ''.rjust(25, ' ') # identificacao do tit. na empresa X[25]
122
+ detalhe << pagamento.nosso_numero.to_s.rjust(7, '0') # nosso numero 9[07]
123
+ detalhe << digito_nosso_numero(pagamento.nosso_numero).to_s # dv nosso numero 9[01]
124
+ detalhe << ''.rjust(10, '0') # numero do contrato [10]
125
+ detalhe << ''.rjust(6, '0') # data do segundo pagamento [06]
126
+ detalhe << ''.rjust(13, '0') # valor do segundo pagamento [13]
127
+ detalhe << ''.rjust(8, ' ') # filler [08]
128
+ detalhe << codigo_carteira # codigo da carteira X[01]
129
+ detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
130
+ detalhe << pagamento.numero_documento.to_s.rjust(10, '0') # numero do documento X[10]
131
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
132
+ detalhe << pagamento.formata_valor # valor do documento 9[13]
133
+ detalhe << cod_banco # codigo banco 9[03]
134
+ detalhe << ''.rjust(4, '0') # agencia cobradora - deixar zero 9[05]
135
+ detalhe << ' ' # filler [01]
136
+ detalhe << '01' # especie do titulo X[02]
137
+ detalhe << aceite # aceite (A/N) X[01]
138
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
139
+ detalhe << ''.rjust(4, '0') # instrucao - deixar zero [04]
140
+ detalhe << pagamento.formata_valor_mora # valor mora ao dia 9[13]
141
+ detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
142
+ detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
143
+ detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
144
+ detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
145
+ detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02]
146
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
147
+ detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador X[40]
148
+ detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40]
149
+ detalhe << pagamento.bairro_sacado.format_size(12) # bairro do pagador X[12]
150
+ detalhe << pagamento.cep_sacado # cep do pagador 9[08]
151
+ detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
152
+ detalhe << pagamento.uf_sacado # uf do pagador X[02]
153
+ detalhe << pagamento.nome_avalista.format_size(40) # nome do sacador/avalista X[30]
154
+ detalhe << "99" # prazo para protesto [02]
155
+ detalhe << "0" # código da moeda X[01]
156
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
157
+ detalhe
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
@@ -2,5 +2,5 @@
2
2
  #
3
3
 
4
4
  module Brcobranca
5
- VERSION = '7.2.2'
5
+ VERSION = '7.3.0'
6
6
  end
@@ -15,7 +15,8 @@ RSpec.describe Brcobranca::Boleto::Banrisul do #:nodoc:[all]
15
15
  agencia: '1102',
16
16
  conta_corrente: '1454204',
17
17
  numero_documento: '22832563',
18
- convenio: '9000150'
18
+ convenio: '9000150',
19
+ digito_convenio: '46'
19
20
  }
20
21
  end
21
22
 
@@ -125,9 +126,14 @@ RSpec.describe Brcobranca::Boleto::Banrisul do #:nodoc:[all]
125
126
  end
126
127
 
127
128
  it 'Montar agencia_conta_boleto' do
129
+ valid_attributes[:convenio] = '9000150'
128
130
  boleto_novo = described_class.new(valid_attributes)
131
+ expect(boleto_novo.agencia_conta_boleto).to eql('1102 / 900015.0.46')
129
132
 
130
- expect(boleto_novo.agencia_conta_boleto).to eql('1102 / 9000150')
133
+ valid_attributes[:convenio] = '8505610'
134
+ valid_attributes[:digito_convenio] = '99'
135
+ boleto_novo = described_class.new(valid_attributes)
136
+ expect(boleto_novo.agencia_conta_boleto).to eql('1102 / 850561.0.99')
131
137
  end
132
138
 
133
139
  describe 'Busca logotipo do banco' do
@@ -127,8 +127,20 @@ RSpec.describe Brcobranca::Boleto::Sicredi do
127
127
 
128
128
  it 'Montar nosso_numero_boleto' do
129
129
  boleto_novo = described_class.new(valid_attributes)
130
- expect(boleto_novo.nosso_numero_boleto).to eql('16/208879-3')
131
130
  expect(boleto_novo.nosso_numero_dv).to be(3)
131
+ expect(boleto_novo.nosso_numero_boleto).to eql('16/208879-3')
132
+
133
+ valid_attributes[:posto] = '02'
134
+ valid_attributes[:byte_idt] = '2'
135
+ valid_attributes[:numero_documento] = '00003'
136
+ valid_attributes[:agencia] = '0165'
137
+ valid_attributes[:convenio] = '00623'
138
+ valid_attributes[:data_vencimento] = Date.parse('2007-08-26')
139
+ valid_attributes[:data_documento] = Date.parse('2007-08-26')
140
+
141
+ boleto_novo = described_class.new(valid_attributes)
142
+ expect(boleto_novo.nosso_numero_dv).to be(1)
143
+ expect(boleto_novo.nosso_numero_boleto).to eql('07/200003-1')
132
144
  end
133
145
 
134
146
  it 'Montar agencia_conta_boleto' do
@@ -162,13 +162,13 @@ RSpec.describe Brcobranca::Calculo do
162
162
  end
163
163
 
164
164
  it 'Calcula a soma dos digitos de um número com mais de 1 algarismo' do
165
- expect(111.soma_digitos).to be(3)
165
+ expect(11.soma_digitos).to be(2)
166
166
  expect(8.soma_digitos).to be(8)
167
- expect('111'.soma_digitos).to be(3)
167
+ expect('11'.soma_digitos).to be(2)
168
168
  expect('8'.soma_digitos).to be(8)
169
169
  expect(0.soma_digitos).to be(0)
170
- expect(111.soma_digitos).to be_a_kind_of(Integer)
171
- expect('111'.soma_digitos).to be_a_kind_of(Integer)
170
+ expect(11.soma_digitos).to be_a_kind_of(Integer)
171
+ expect('11'.soma_digitos).to be_a_kind_of(Integer)
172
172
  end
173
173
 
174
174
  describe '#duplo_digito' do
@@ -180,5 +180,6 @@ RSpec.describe Brcobranca::Calculo do
180
180
  it { expect(19_669.duplo_digito).to eql('28') }
181
181
  it { expect('00000032000272012924021'.duplo_digito).to eql('79') }
182
182
  it { expect('00000033000272012924021'.duplo_digito).to eql('65') }
183
+ it { expect('9194'.duplo_digito).to eql('38') }
183
184
  end
184
185
  end
@@ -0,0 +1,185 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Brcobranca::Remessa::Cnab400::BancoNordeste do
5
+ let(:pagamento) do
6
+ Brcobranca::Remessa::Pagamento.new(valor: 199.9,
7
+ data_vencimento: Date.today,
8
+ nosso_numero: 123,
9
+ documento_sacado: '12345678901',
10
+ nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
11
+ endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
12
+ bairro_sacado: 'São josé dos quatro apostolos magros',
13
+ cep_sacado: '12345678',
14
+ cidade_sacado: 'Santa rita de cássia maria da silva',
15
+ uf_sacado: 'SP')
16
+ end
17
+ let(:params) do
18
+ {
19
+ carteira: '21',
20
+ agencia: '1234',
21
+ conta_corrente: '1234567',
22
+ digito_conta: '1',
23
+ empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
24
+ documento_cedente: '12345678910',
25
+ pagamentos: [pagamento]
26
+ }
27
+ end
28
+ let(:banco_nordeste) { subject.class.new(params) }
29
+
30
+ context 'validacoes dos campos' do
31
+ context '@agencia' do
32
+ it 'deve ser invalido se nao possuir uma agencia' do
33
+ object = subject.class.new(params.merge!(agencia: nil))
34
+ expect(object.invalid?).to be true
35
+ expect(object.errors.full_messages).to include('Agencia não pode estar em branco.')
36
+ end
37
+
38
+ it 'deve ser invalido se a agencia tiver mais de 4 digitos' do
39
+ banco_nordeste.agencia = '12345'
40
+ expect(banco_nordeste.invalid?).to be true
41
+ expect(banco_nordeste.errors.full_messages).to include('Agencia deve ter 4 dígitos.')
42
+ end
43
+ end
44
+
45
+ context '@digito_conta' do
46
+ it 'deve ser invalido se nao possuir um digito da conta corrente' do
47
+ objeto = subject.class.new(params.merge!(digito_conta: nil))
48
+ expect(objeto.invalid?).to be true
49
+ expect(objeto.errors.full_messages).to include('Digito conta não pode estar em branco.')
50
+ end
51
+
52
+ it 'deve ser inválido se o dígito da conta tiver mais de 1 dígito' do
53
+ banco_nordeste.digito_conta = '12'
54
+ expect(banco_nordeste.invalid?).to be true
55
+ expect(banco_nordeste.errors.full_messages).to include('Digito conta deve ter 1 dígito.')
56
+ end
57
+ end
58
+
59
+ context '@conta_corrente' do
60
+ it 'deve ser invalido se nao possuir uma conta corrente' do
61
+ object = subject.class.new(params.merge!(conta_corrente: nil))
62
+ expect(object.invalid?).to be true
63
+ expect(object.errors.full_messages).to include('Conta corrente não pode estar em branco.')
64
+ end
65
+
66
+ it 'deve ser invalido se a conta corrente tiver mais de 7 digitos' do
67
+ banco_nordeste.conta_corrente = '12345678'
68
+ expect(banco_nordeste.invalid?).to be true
69
+ expect(banco_nordeste.errors.full_messages).to include('Conta corrente deve ter 7 dígitos.')
70
+ end
71
+ end
72
+
73
+ context '@carteira' do
74
+ it 'deve ser inválido se não possuir uma carteira' do
75
+ object = subject.class.new(params.merge!(carteira: nil))
76
+ expect(object.invalid?).to be true
77
+ expect(object.errors.full_messages).to include('Carteira não pode estar em branco.')
78
+ end
79
+
80
+ it 'deve ser inválido se a carteira tiver 2 dígitos' do
81
+ banco_nordeste.carteira = '123'
82
+ expect(banco_nordeste.invalid?).to be true
83
+ expect(banco_nordeste.errors.full_messages).to include('Carteira deve ter 2 dígitos.')
84
+ end
85
+ end
86
+
87
+ context '@documento_cedente' do
88
+ it 'deve ser inválido se não possuir o documento cedente' do
89
+ object = subject.class.new(params.merge!(documento_cedente: nil))
90
+ expect(object.invalid?).to be true
91
+ expect(object.errors.full_messages).to include('Documento cedente não pode estar em branco.')
92
+ end
93
+
94
+ it 'deve ser invalido se o documento do cedente nao tiver entre 11 e 14 digitos' do
95
+ banco_nordeste.documento_cedente = '123'
96
+ expect(banco_nordeste.invalid?).to be true
97
+ expect(banco_nordeste.errors.full_messages).to include('Documento cedente deve ter entre 11 e 14 dígitos.')
98
+ end
99
+ end
100
+ end
101
+
102
+ context 'formatacoes dos valores' do
103
+ it 'cod_banco deve ser 004' do
104
+ expect(banco_nordeste.cod_banco).to eq '004'
105
+ end
106
+
107
+ it 'nome_banco deve ser B.DO NORDESTE com 15 posicoes' do
108
+ nome_banco = banco_nordeste.nome_banco
109
+ expect(nome_banco.size).to eq 15
110
+ expect(nome_banco.strip).to eq 'B.DO NORDESTE'
111
+ end
112
+
113
+ it 'complemento deve retornar 294 caracteres' do
114
+ expect(banco_nordeste.complemento.size).to eq 294
115
+ end
116
+
117
+ it 'info_conta deve retornar com 20 posicoes as informacoes da conta' do
118
+ info_conta = banco_nordeste.info_conta
119
+ expect(info_conta.size).to eq 20
120
+ expect(info_conta[0..3]).to eq '1234' # num. da agencia
121
+ expect(info_conta[6..12]).to eq '1234567' # num. da conta
122
+ expect(info_conta[13]).to eq '1' # num. do digito
123
+ end
124
+
125
+ it 'deve retornar o codigo da carteira de acordo com o tipo de emissão' do
126
+ banco_nordeste.carteira = 21
127
+ banco_nordeste.emissao_boleto = 1
128
+ expect(banco_nordeste.codigo_carteira).to eq '1'
129
+
130
+ banco_nordeste.carteira = 41
131
+ banco_nordeste.emissao_boleto = 1
132
+ expect(banco_nordeste.codigo_carteira).to eq '2'
133
+
134
+ banco_nordeste.carteira = 21
135
+ banco_nordeste.emissao_boleto = 2
136
+ expect(banco_nordeste.codigo_carteira).to eq '4'
137
+
138
+ banco_nordeste.carteira = 41
139
+ banco_nordeste.emissao_boleto = 2
140
+ expect(banco_nordeste.codigo_carteira).to eq '5'
141
+
142
+ banco_nordeste.carteira = 51
143
+ expect(banco_nordeste.codigo_carteira).to eq 'I'
144
+
145
+ banco_nordeste.carteira = 99
146
+ expect(banco_nordeste.invalid?).to be true
147
+ expect(banco_nordeste.errors.full_messages).to include('Carteira não é válida.')
148
+ end
149
+ end
150
+
151
+ context 'monta remessa' do
152
+ it_behaves_like 'cnab400'
153
+
154
+ context 'header' do
155
+ it 'informacoes devem estar posicionadas corretamente no header' do
156
+ header = banco_nordeste.monta_header
157
+ expect(header[1]).to eq '1' # tipo operacao (1 = remessa)
158
+ expect(header[2..8]).to eq 'REMESSA' # literal da operacao
159
+ expect(header[26..45]).to eq banco_nordeste.info_conta # informacoes da conta
160
+ expect(header[76..78]).to eq '004' # codigo do banco
161
+ end
162
+ end
163
+
164
+ context 'detalhe' do
165
+ it 'informacoes devem estar posicionadas corretamente no detalhe' do
166
+ detalhe = banco_nordeste.monta_detalhe pagamento, 1
167
+ expect(detalhe[62..68]).to eq '0000123' # nosso numero
168
+ expect(detalhe[69]).to eq '6' # digito verificador
169
+ expect(detalhe[120..125]).to eq Date.today.strftime('%d%m%y') # data de vencimento
170
+ expect(detalhe[126..138]).to eq '0000000019990' # valor do titulo
171
+ expect(detalhe[142..145]).to eq '0000' # agência cobradora
172
+ expect(detalhe[156..159]).to eq '0000' # instrução
173
+ expect(detalhe[220..233]).to eq '00012345678901' # documento do pagador
174
+ expect(detalhe[234..263]).to eq 'PABLO DIEGO JOSE FRANCISCO DE ' # nome do pagador
175
+ end
176
+ end
177
+
178
+ context 'arquivo' do
179
+ before { Timecop.freeze(Time.local(2015, 7, 14, 16, 15, 15)) }
180
+ after { Timecop.return }
181
+
182
+ it { expect(banco_nordeste.gera_arquivo).to eq(read_remessa('remessa-banco-nordeste-cnab400.rem', banco_nordeste.gera_arquivo)) }
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,3 @@
1
+ 01REMESSA01COBRANCA 12340012345671 SOCIEDADE BRASILEIRA DE ZOOLOG004B.DO NORDESTE 140715 000001
2
+ 1 1234001234567100 0000123600000000000000000000000000000 401000000000014071500000000199900040000 01N140715000000000000000000000000000000000000000000000000000000000000000100012345678901PABLO DIEGO JOSE FRANCISCO DE PAULA JUANRUA RIO GRANDE DO SUL SAO PAULO MINAS CASAO JOSE DOS12345678SANTA RITA DE CSP 990000002
3
+ 9 000003
@@ -62,6 +62,16 @@ shared_examples_for 'cnab400' do
62
62
  documento_cedente: '12345678910',
63
63
  sequencial_remessa: '1',
64
64
  pagamentos: [pagamento] }
65
+ elsif subject.class == Brcobranca::Remessa::Cnab400::BancoNordeste
66
+ {
67
+ carteira: '21',
68
+ agencia: '1234',
69
+ conta_corrente: '1234567',
70
+ digito_conta: '1',
71
+ empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
72
+ documento_cedente: '12345678910',
73
+ pagamentos: [pagamento]
74
+ }
65
75
  else
66
76
  { carteira: '123',
67
77
  agencia: '4327',
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brcobranca
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.2.2
4
+ version: 7.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kivanio Barbosa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-06 00:00:00.000000000 Z
11
+ date: 2017-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rghost
@@ -170,6 +170,7 @@ files:
170
170
  - lib/brcobranca/remessa/cnab240/caixa.rb
171
171
  - lib/brcobranca/remessa/cnab240/sicoob.rb
172
172
  - lib/brcobranca/remessa/cnab400/banco_brasil.rb
173
+ - lib/brcobranca/remessa/cnab400/banco_nordeste.rb
173
174
  - lib/brcobranca/remessa/cnab400/base.rb
174
175
  - lib/brcobranca/remessa/cnab400/bradesco.rb
175
176
  - lib/brcobranca/remessa/cnab400/citibank.rb
@@ -223,6 +224,7 @@ files:
223
224
  - spec/brcobranca/remessa/cnab240/caixa_spec.rb
224
225
  - spec/brcobranca/remessa/cnab240/sicoob_spec.rb
225
226
  - spec/brcobranca/remessa/cnab400/banco_brasil_spec.rb
227
+ - spec/brcobranca/remessa/cnab400/banco_nordeste_spec.rb
226
228
  - spec/brcobranca/remessa/cnab400/base_spec.rb
227
229
  - spec/brcobranca/remessa/cnab400/bradesco_spec.rb
228
230
  - spec/brcobranca/remessa/cnab400/citibank_spec.rb
@@ -244,6 +246,7 @@ files:
244
246
  - spec/brcobranca_spec.rb
245
247
  - spec/fixtures/remessa/.keep
246
248
  - spec/fixtures/remessa/remessa-banco-brasil-cnab400.rem
249
+ - spec/fixtures/remessa/remessa-banco-nordeste-cnab400.rem
247
250
  - spec/fixtures/remessa/remessa-banco_brasil-cnab240.rem
248
251
  - spec/fixtures/remessa/remessa-bancoob-cnab240.rem
249
252
  - spec/fixtures/remessa/remessa-bradesco-cnab400.rem
@@ -317,6 +320,7 @@ test_files:
317
320
  - spec/brcobranca/remessa/cnab240/caixa_spec.rb
318
321
  - spec/brcobranca/remessa/cnab240/sicoob_spec.rb
319
322
  - spec/brcobranca/remessa/cnab400/banco_brasil_spec.rb
323
+ - spec/brcobranca/remessa/cnab400/banco_nordeste_spec.rb
320
324
  - spec/brcobranca/remessa/cnab400/base_spec.rb
321
325
  - spec/brcobranca/remessa/cnab400/bradesco_spec.rb
322
326
  - spec/brcobranca/remessa/cnab400/citibank_spec.rb
@@ -338,6 +342,7 @@ test_files:
338
342
  - spec/brcobranca_spec.rb
339
343
  - spec/fixtures/remessa/.keep
340
344
  - spec/fixtures/remessa/remessa-banco-brasil-cnab400.rem
345
+ - spec/fixtures/remessa/remessa-banco-nordeste-cnab400.rem
341
346
  - spec/fixtures/remessa/remessa-banco_brasil-cnab240.rem
342
347
  - spec/fixtures/remessa/remessa-bancoob-cnab240.rem
343
348
  - spec/fixtures/remessa/remessa-bradesco-cnab400.rem