br_boleto 1.2.2 → 2.0.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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.markdown +278 -98
  5. data/br_boleto.gemspec +5 -3
  6. data/lib/br_boleto/active_model_base.rb +1 -1
  7. data/lib/br_boleto/association/have_conta.rb +109 -0
  8. data/lib/br_boleto/association/have_pagador.rb +38 -0
  9. data/lib/br_boleto/association/have_pagamentos.rb +44 -0
  10. data/lib/br_boleto/boleto/base.rb +50 -379
  11. data/lib/br_boleto/boleto/caixa.rb +28 -143
  12. data/lib/br_boleto/boleto/sicoob.rb +24 -144
  13. data/lib/br_boleto/conta/base.rb +288 -0
  14. data/lib/br_boleto/conta/caixa.rb +109 -0
  15. data/lib/br_boleto/conta/sicoob.rb +64 -0
  16. data/lib/br_boleto/helper/default_codes.rb +33 -0
  17. data/lib/br_boleto/helper/format_value.rb +1 -0
  18. data/lib/br_boleto/helper/number.rb +30 -0
  19. data/lib/br_boleto/pagador.rb +82 -0
  20. data/lib/br_boleto/remessa/base.rb +28 -50
  21. data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
  22. data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
  23. data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
  24. data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
  25. data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
  26. data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
  27. data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
  28. data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
  29. data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
  30. data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
  31. data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
  32. data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
  33. data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
  34. data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
  35. data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
  36. data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
  37. data/lib/br_boleto/remessa/lote.rb +1 -23
  38. data/lib/br_boleto/remessa/pagamento.rb +188 -51
  39. data/lib/br_boleto/retorno/base.rb +9 -0
  40. data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
  41. data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
  42. data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
  43. data/lib/br_boleto/retorno/pagamento.rb +12 -6
  44. data/lib/br_boleto/string_methods.rb +8 -2
  45. data/lib/br_boleto/validations.rb +19 -0
  46. data/lib/br_boleto/version.rb +3 -3
  47. data/lib/br_boleto.rb +38 -8
  48. data/lib/config/locales/br-boleto-en.yml +89 -0
  49. data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
  50. data/test/br_boleto/association/have_conta_test.rb +319 -0
  51. data/test/br_boleto/association/have_pagador_test.rb +110 -0
  52. data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
  53. data/test/br_boleto/boleto/base_test.rb +127 -201
  54. data/test/br_boleto/boleto/caixa_test.rb +58 -72
  55. data/test/br_boleto/boleto/sicoob_test.rb +88 -147
  56. data/test/br_boleto/conta/base_test.rb +490 -0
  57. data/test/br_boleto/conta/caixa_test.rb +154 -0
  58. data/test/br_boleto/conta/sicoob_test.rb +144 -0
  59. data/test/br_boleto/helper/number_test.rb +29 -0
  60. data/test/br_boleto/pagador_test.rb +158 -0
  61. data/test/br_boleto/remessa/base_test.rb +37 -62
  62. data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
  63. data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
  64. data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
  65. data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
  66. data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
  67. data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
  68. data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
  69. data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
  70. data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
  71. data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
  72. data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
  73. data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
  74. data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
  75. data/test/br_boleto/remessa/lote_test.rb +2 -41
  76. data/test/br_boleto/remessa/pagamento_test.rb +186 -188
  77. data/test/br_boleto/retorno/base_test.rb +0 -1
  78. data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
  79. data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
  80. data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
  81. data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
  82. data/test/br_boleto/retorno/pagamento_test.rb +6 -6
  83. data/test/factories/boleto/base.rb +9 -7
  84. data/test/factories/boleto/boleto_caixa.rb +2 -9
  85. data/test/factories/boleto/boleto_sicoob.rb +10 -8
  86. data/test/factories/conta/base.rb +10 -0
  87. data/test/factories/conta/caixa.rb +15 -0
  88. data/test/factories/conta/sicoob.rb +16 -0
  89. data/test/factories/pagador.rb +15 -0
  90. data/test/factories/remessa/base.rb +0 -6
  91. data/test/factories/remessa/cnab240/base.rb +0 -10
  92. data/test/factories/remessa/cnab240/caixa.rb +1 -6
  93. data/test/factories/remessa/cnab240/sicoob.rb +1 -10
  94. data/test/factories/remessa/cnab400/base.rb +8 -0
  95. data/test/factories/remessa/cnab400/sicoob.rb +8 -0
  96. data/test/factories/remessa/pagamento.rb +8 -7
  97. data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
  98. data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
  99. data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
  100. data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
  101. data/test/inheritance/boleto_test.rb +4 -1
  102. data/test/inheritance/sicoob_test.rb +23 -7
  103. data/test/test_helper.rb +70 -0
  104. metadata +63 -6
@@ -0,0 +1,179 @@
1
+ require 'test_helper'
2
+
3
+ describe BrBoleto::Remessa::Cnab400::Sicoob do
4
+ subject { FactoryGirl.build(:remessa_cnab400_sicoob, pagamentos: pagamento, conta: conta) }
5
+ let(:pagamento) { FactoryGirl.build(:remessa_pagamento, pagador: pagador) }
6
+ let(:conta) { FactoryGirl.build(:conta_sicoob) }
7
+ let(:pagador) { FactoryGirl.build(:pagador) }
8
+
9
+ it "deve ter a class para a conta do sicoob" do
10
+ BrBoleto::Remessa::Cnab400::Sicoob.new.conta_class.must_equal BrBoleto::Conta::Sicoob
11
+ end
12
+
13
+ it "deve herdar de Cnab400::Base" do
14
+ subject.class.superclass.must_equal BrBoleto::Remessa::Cnab400::Base
15
+ end
16
+
17
+ describe '#informacoes_da_conta' do
18
+ it "deve retornar com 20 caracteres" do
19
+ subject.informacoes_da_conta(:detalhe).size.must_equal 20
20
+ end
21
+ it "deve trazer as informações em suas posições quando o parametro for :detalhe" do
22
+ conta.agencia = 1234
23
+ conta.agencia_dv = 1
24
+ conta.codigo_cedente = 123456
25
+ conta.codigo_cedente_dv = 2
26
+ result = subject.informacoes_da_conta(:detalhe)
27
+
28
+ result[0..3].must_equal '1234' # Agencia
29
+ result[4].must_equal '1' # DV Agencia
30
+ result[5..12].must_equal '00123456'# DV Agencia
31
+ result[13].must_equal '2' # DV Agencia
32
+ result[14..19].must_equal '000000'
33
+ end
34
+ it "deve trazer as informações em suas posições quando o parametro for :header" do
35
+ conta.agencia = 3321
36
+ conta.agencia_dv = 3
37
+ conta.codigo_cedente = 1234567890123
38
+ conta.codigo_cedente_dv = 2
39
+ result = subject.informacoes_da_conta(:header)
40
+
41
+ result[0..3].must_equal '3321' # Agencia
42
+ result[4].must_equal '3' # DV Agencia
43
+ result[5..12].must_equal '12345678'# DV Agencia
44
+ result[13].must_equal '2' # DV Agencia
45
+ result[14..19].must_equal ' '
46
+ end
47
+ end
48
+
49
+ describe '#complemento_registro' do
50
+ it "deve retornar o sequencial da remessa com 7 posições e mais 287 brancos" do
51
+ subject.sequencial_remessa = 4758
52
+ subject.complemento_registro.size.must_equal 294
53
+ subject.complemento_registro.must_equal '0004758'.ljust(294, ' ')
54
+ end
55
+ end
56
+
57
+ describe '#dados_do_pagamento' do
58
+ it "deve ter o tamanho de 14 digitos" do
59
+ subject.dados_do_pagamento(pagamento).size.must_equal 14
60
+ end
61
+ it "deve retornar os nosso numero e a parcela" do
62
+ pagamento.assign_attributes(nosso_numero: 4578, parcela: 3)
63
+ result = subject.dados_do_pagamento(pagamento)
64
+ result[0..11].must_equal '000000004578'
65
+ result[12..13].must_equal '03'
66
+ end
67
+ end
68
+
69
+ describe '#detalhe_posicao_077_108' do
70
+ it "deve ter o tamanho de 32 digitos" do
71
+ subject.detalhe_posicao_077_108(pagamento, 4).size.must_equal 32
72
+ end
73
+ it "deve conter as informações nas posições corretas" do
74
+ pagamento.assign_attributes(tipo_emissao: 2)
75
+ subject.conta.modalidade = '0333333'
76
+ result = subject.detalhe_posicao_077_108(pagamento, 4)
77
+ result[0..1].must_equal '00' # 077 078 002 9(02) Grupo de V
78
+ result[2..4].must_equal ''.rjust(3, ' ') # 079 081 003 X(03) Complement
79
+ result[5].must_equal ' ' # 082 082 001 X(01) "Indicativ
80
+ result[6..8].must_equal ''.rjust(3, ' ') # 083 085 003 X(03) Prefixo do
81
+ result[9..11].must_equal '000' # 086 088 003 9(03) Variação d
82
+ result[12].must_equal '0' # 089 089 001 9(01) Conta Cauç
83
+ result[13..17].must_equal ''.rjust(5, '0') # 090 094 005 9(05) "Número do
84
+ result[18].must_equal '0' # 095 095 001 X(01) "DV do con
85
+ result[19..24].must_equal ''.rjust(6, '0') # 096 101 006 9(06) Numero do
86
+ result[25..28].must_equal ''.rjust(4, ' ') # 102 105 004 X(04) Complement
87
+ result[29].must_equal "2" # tipo_emissao
88
+ result[30..31].must_equal '03' #modalidade
89
+ result.size.must_equal 32
90
+ end
91
+ end
92
+
93
+ describe '#informacoes_do_pagamento' do
94
+ it "deve ter o tamanho de 40 digitos" do
95
+ subject.informacoes_do_pagamento(pagamento, 1).size.must_equal 40
96
+ end
97
+ it "deve conter as informações nas posições corretas" do
98
+ conta.agencia = 4587
99
+ conta.agencia_dv = 45 # Vai retornar apenas o 4
100
+ pagamento.data_vencimento = Date.parse('05/08/2029')
101
+ pagamento.valor_documento = 47.56
102
+ pagamento.especie_titulo = 12
103
+ pagamento.aceite = true
104
+ pagamento.data_emissao = Date.parse('15/09/2017')
105
+ result = subject.informacoes_do_pagamento(pagamento, 4)
106
+ result.size.must_equal 40
107
+
108
+ result[00..05].must_equal '050829' # "Data Vencimento: Formato DDMMAA Normal ""DDMMAA"" A vista = ""888888"" Contra Apresentação = ""999999"""
109
+ result[06..18].must_equal '0000000004756' # Valor do Titulo
110
+ result[19..21].must_equal '756' # Número Banco: "756"
111
+ result[22..25].must_equal "4587" # Prefixo da Cooperativa: vide e-mail enviado com os dados do processo de homologação
112
+ result[ 26 ].must_equal "4" # Dígito Verificador do Prefixo: vide e-mail enviado com os dados do processo de homologação
113
+ result[27..28].must_equal "12" # Espécie do Título
114
+ result[ 29 ].must_equal "1" # "Aceite do Título: "0" = Sem aceite "1" = Com aceite"
115
+ result[30..35].must_equal '150917' # Data de Emissão do Título: formato ddmmaa
116
+ result[36..37].must_equal '00' # Primeira instrução codificada:
117
+ result[38..39].must_equal '00' # Segunda instrução: vide SEQ 33
118
+ end
119
+ end
120
+
121
+ describe '#detalhe_multas_e_juros_do_pagamento' do
122
+ it "deve ter o tamanho de 58 digitos" do
123
+ subject.detalhe_multas_e_juros_do_pagamento(pagamento, 2).size.must_equal 58
124
+ end
125
+ it "deve conter as informações nas posições corretas" do
126
+ pagamento.expects(:percentual_juros_formatado).with(6).returns('025000')
127
+ pagamento.expects(:percentual_multa_formatado).with(6).returns('045000')
128
+ pagamento.tipo_emissao = '2'
129
+ pagamento.data_desconto = Date.parse('21/03/2018')
130
+ pagamento.valor_desconto = 4.3
131
+ pagamento.codigo_moeda = 9
132
+ pagamento.valor_abatimento = 56.47
133
+
134
+ result = subject.detalhe_multas_e_juros_do_pagamento(pagamento, 4)
135
+ result.size.must_equal 58
136
+
137
+ result[00..05].must_equal '025000'
138
+ result[06..11].must_equal '045000'
139
+ result[ 12 ].must_equal "2"
140
+ result[13..18].must_equal "210318"
141
+ result[19..31].must_equal '0000000000430'
142
+ result[ 32 ].must_equal "9"
143
+ result[33..44].must_equal ''.ljust(12 ,'0')
144
+ result[45..57].must_equal '0000000005647'
145
+ end
146
+ end
147
+
148
+ describe '#informacoes_do_sacado' do
149
+ it "deve ter o tamanho de 176 digitos" do
150
+ subject.informacoes_do_sacado(pagamento, 2).size.must_equal 176
151
+ end
152
+ it "deve conter as informações nas posições corretas" do
153
+ # pagador.tipo_cpf_cnpj = '1'
154
+ pagador.cpf_cnpj = '12345678901'
155
+ pagador.nome = 'nome pagador'
156
+ pagador.endereco = 'rua'
157
+ pagador.bairro = 'bairro'
158
+ pagador.cep = '89885-001'
159
+ pagador.cidade = 'São Carlos'
160
+ pagador.uf = 'SC'
161
+ pagador.nome_avalista = 'Avalista'
162
+
163
+ result = subject.informacoes_do_sacado(pagamento, 2)
164
+ result.size.must_equal 176
165
+
166
+ result[00..01].must_equal "01" # "Tipo de Inscrição do Pagador: "01" = CPF / "02" = CNPJ
167
+ result[02..15].must_equal '00012345678901' # Número do CNPJ ou CPF do Pagador
168
+ result[16..55].must_equal 'nome pagador'.ljust(40, ' ') # Nome do Pagador
169
+ result[56..92].must_equal 'rua'.ljust(37, ' ') # Endereço do Pagador
170
+ result[93..107].must_equal 'bairro'.ljust(15, ' ') # Bairro do Pagador
171
+ result[108..115].must_equal '89885001' # CEP do Pagador
172
+ result[116..130].must_equal 'São Carlos'.ljust(15, ' ') # Cidade do Pagador
173
+ result[131..132].must_equal 'SC' # UF do Pagador
174
+ result[133..172].must_equal 'Avalista'.ljust(40, ' ') # Observações/Mensagem ou Sacador/Avalista
175
+ result[173..174].must_equal "00" # "Número de Dias Para Protesto: Quantidade dias para envio protesto. Se = "0", utilizar dias protesto padrão do cliente cadastrado na cooperativa
176
+ result[ 175 ].must_equal " " # Complemento do Registro: Brancos
177
+ end
178
+ end
179
+ end
@@ -4,46 +4,7 @@ describe BrBoleto::Remessa::Lote do
4
4
  subject { FactoryGirl.build(:remessa_lote) }
5
5
  let(:pagamento) { FactoryGirl.build(:remessa_pagamento) }
6
6
 
7
- describe "#pagamentos" do
8
- it "deve haver ao menos 1 pagamento" do
9
- wont allow_value([]).for(:pagamentos).with_message("não pode estar vazio.")
10
- end
11
- it "deve ser um objeto pagamento" do
12
- wont allow_value([subject.class.new()]).for(:pagamentos).with_message("cada item deve ser um objeto Pagamento.")
13
- end
14
- it "deve ser válido com um pagamento válido" do
15
- must allow_value([pagamento]).for(:pagamentos)
16
- end
17
- it "não deve ser válidose houver algum pagamento inválido" do
18
- wont allow_value([FactoryGirl.build(:remessa_pagamento, cep_sacado: nil)]).for(:pagamentos)
19
- end
20
- it "deve ser válido se passar apenas um pagamento sem Array" do
21
- must allow_value(pagamento).for(:pagamentos)
22
- end
23
- it "se setar apenas 1 pagamento sem array deve retornar um array de 1 posicao" do
24
- subject.pagamentos = pagamento
25
- subject.pagamentos.size.must_equal 1
26
- subject.pagamentos.is_a?(Array).must_equal true
27
- subject.pagamentos[0].must_equal pagamento
28
- end
29
- it "posso setar mais que 1 pagamento" do
30
- pagamento2 = FactoryGirl.build(:remessa_pagamento)
31
- subject.pagamentos = [pagamento, pagamento2]
32
- subject.pagamentos.size.must_equal 2
33
- subject.pagamentos.is_a?(Array).must_equal true
34
- subject.pagamentos[0].must_equal pagamento
35
- subject.pagamentos[1].must_equal pagamento2
36
- end
37
-
38
- it "posso incrementar os pagamentos com <<" do
39
- pagamento2 = FactoryGirl.build(:remessa_pagamento, valor_documento: 0.50)
40
- subject.pagamentos = pagamento
41
- subject.pagamentos.size.must_equal 1
42
- subject.pagamentos << pagamento2
43
- subject.pagamentos.size.must_equal 2
44
- subject.pagamentos.is_a?(Array).must_equal true
45
- subject.pagamentos[0].must_equal pagamento
46
- subject.pagamentos[1].must_equal pagamento2
47
- end
7
+ it "deve ter incluso o module HavePagamentos" do
8
+ subject.class.included_modules.must_include BrBoleto::HavePagamentos
48
9
  end
49
10
  end
@@ -2,141 +2,169 @@
2
2
  require 'test_helper'
3
3
 
4
4
  describe BrBoleto::Remessa::Pagamento do
5
-
6
- class Shoulda::Matchers::ActiveModel::ValidateLengthOfMatcher
7
- # Sobrescrevo o método que gera a string para validar o tamanho
8
- # Pois o CEP só aceita números
9
- def string_of_length(length)
10
- '8' * length
11
- end
12
- end
13
-
14
5
  subject { FactoryGirl.build(:remessa_pagamento) }
6
+
7
+ it "deve conter o mdule HavePagador" do
8
+ subject.class.included_modules.must_include BrBoleto::HavePagador
9
+ end
15
10
 
16
11
 
17
12
  describe "validations" do
18
13
  it { must validate_presence_of(:nosso_numero) }
19
14
  it { must validate_presence_of(:data_vencimento) }
20
15
  it { must validate_presence_of(:valor_documento) }
21
- it { must validate_presence_of(:documento_sacado) }
22
- it { must validate_presence_of(:nome_sacado) }
23
- it { must validate_presence_of(:endereco_sacado) }
24
- it { must validate_presence_of(:cep_sacado) }
25
- it { must validate_presence_of(:cidade_sacado) }
26
- it { must validate_presence_of(:uf_sacado) }
27
- it { must validate_presence_of(:bairro_sacado) }
28
- it { must validate_presence_of(:tipo_impressao) }
29
16
 
30
- it { must validate_length_of(:cep_sacado).is_equal_to(8).with_message("deve ter 8 dígitos.") }
31
- it { must validate_length_of(:cod_desconto).is_equal_to(1).with_message("deve ter 1 dígito.") }
32
- end
17
+ describe '#tipo_impressao' do
18
+ it { wont validate_presence_of(:tipo_impressao) }
33
19
 
34
- context "default_values" do
35
- it "for data_emissao" do
36
- object = subject.class.new()
37
- object.data_emissao.must_equal Date.current
38
- end
39
- it "for valor_mora" do
40
- object = subject.class.new()
41
- object.valor_mora.must_equal 0.0
42
- end
43
- it "for valor_desconto" do
44
- object = subject.class.new()
45
- object.valor_desconto.must_equal 0.0
46
- end
47
- it "for valor_iof" do
48
- object = subject.class.new()
49
- object.valor_iof.must_equal 0.0
50
- end
51
- it "for valor_abatimento" do
52
- object = subject.class.new()
53
- object.valor_abatimento.must_equal 0.0
54
- end
55
- it "for nome_avalista" do
56
- object = subject.class.new()
57
- object.nome_avalista.must_equal ''
58
- end
59
- it "for cod_desconto" do
60
- object = subject.class.new()
61
- object.cod_desconto.must_equal '0'
62
- end
63
- it "for tipo_impressao" do
64
- object = subject.class.new()
65
- object.tipo_impressao.must_equal '1'
66
- end
67
- it "for desconto_2_codigo" do
68
- object = subject.class.new()
69
- object.desconto_2_codigo.must_equal '0'
20
+ it "se valid_tipo_impressao_required for true deve validar a obrigatoriedade do tipo de tipo_impressao" do
21
+ subject.valid_tipo_impressao_required = true
22
+ must validate_presence_of(:tipo_impressao)
23
+ end
24
+
70
25
  end
71
- it "for desconto_2_valor" do
72
- object = subject.class.new()
73
- object.desconto_2_valor.must_equal 0.0
26
+
27
+ describe '#cod_desconto' do
28
+ before { subject.cod_desconto = '555' }
29
+
30
+ it { wont_be_message_error(:cod_desconto) }
31
+ it "se valid_cod_desconto_length tiver valor validar a partir do valor setado" do
32
+ subject.valid_cod_desconto_length = 2
33
+ must_be_message_error(:cod_desconto, :custom_length_is, {count: 2})
34
+ end
74
35
  end
75
- it "for desconto_3_codigo" do
76
- object = subject.class.new()
77
- object.desconto_3_codigo.must_equal '0'
36
+
37
+ describe '#emissao_boleto' do
38
+ before { subject.emissao_boleto = '555' }
39
+
40
+ it { wont_be_message_error(:emissao_boleto) }
41
+ it "se valid_emissao_boleto_length tiver valor validar a partir do valor setado" do
42
+ subject.valid_emissao_boleto_length = 2
43
+ must_be_message_error(:emissao_boleto, :custom_length_is, {count: 2})
44
+ end
78
45
  end
79
- it "for desconto_3_valor" do
80
- object = subject.class.new()
81
- object.desconto_3_valor.must_equal 0.0
46
+
47
+ describe '#distribuicao_boleto' do
48
+ before { subject.distribuicao_boleto = '555' }
49
+
50
+ it { wont_be_message_error(:distribuicao_boleto) }
51
+ it "se valid_distribuicao_boleto_length tiver valor validar a partir do valor setado" do
52
+ subject.valid_distribuicao_boleto_length = 2
53
+ must_be_message_error(:distribuicao_boleto, :custom_length_is, {count: 2})
54
+ end
82
55
  end
83
- it "for codigo_multa" do
84
- object = subject.class.new()
85
- object.codigo_multa.must_equal '3'
56
+ end
57
+
58
+ describe "#percentual_multa" do
59
+ it "deve retornar o percentual representativo do valor_multa para o valor_documento utilizando" do
60
+ subject.assign_attributes(valor_multa: 7.47, valor_documento: 78.98)
61
+ subject.percentual_multa.must_equal 9.458091
62
+ end
63
+ it "deve utilizar o metodo get_percent_by_total de Helper::Number para gerar o percentual" do
64
+ subject.assign_attributes(valor_multa: 8.47, valor_documento: 100.00)
65
+ numero = BrBoleto::Helper::Number.new(50.0)
66
+ BrBoleto::Helper::Number.expects(:new).returns(numero)
67
+ numero.expects(:get_percent_by_total).with(100.00).returns(10.47)
68
+
69
+ subject.percentual_multa.must_equal 10.47
86
70
  end
87
- it "for valor_multa" do
88
- object = subject.class.new()
89
- object.valor_multa.must_equal 0.0
71
+ end
72
+
73
+ describe "#percentual_juros" do
74
+ it "deve retornar o percentual representativo do valor_juros para o valor_documento utilizando" do
75
+ subject.assign_attributes(valor_juros: 7.47, valor_documento: 78.98)
76
+ subject.percentual_juros.must_equal 9.458091
77
+ end
78
+ it "deve utilizar o metodo get_percent_by_total de Helper::Number para gerar o percentual" do
79
+ subject.assign_attributes(valor_juros: 8.47, valor_documento: 100.00)
80
+ numero = BrBoleto::Helper::Number.new(50.0)
81
+ BrBoleto::Helper::Number.expects(:new).returns(numero)
82
+ numero.expects(:get_percent_by_total).with(100.00).returns(10.47)
83
+
84
+ subject.percentual_juros.must_equal 10.47
90
85
  end
91
- it "for codigo_juros" do
92
- object = subject.class.new()
93
- object.codigo_juros.must_equal '3'
86
+ end
87
+
88
+ describe '#moeda_real?' do
89
+ it "se a moeda for 9 então deve retornar true" do
90
+ subject.codigo_moeda = 9
91
+ subject.moeda_real?.must_equal true
94
92
  end
95
- it "for valor_juros" do
96
- object = subject.class.new()
97
- object.valor_juros.must_equal 0.0
93
+ it "se a moeda for diferente de 9 então deve retornar false" do
94
+ subject.codigo_moeda = 8
95
+ subject.moeda_real?.must_equal false
98
96
  end
97
+ end
99
98
 
99
+ it "se o codigo_moeda não tiver valor setado deve assumir '9'" do
100
+ subject.codigo_moeda = 10
101
+ subject.codigo_moeda.must_equal 10
102
+ subject.codigo_moeda = nil
103
+ subject.codigo_moeda.must_equal '9'
100
104
  end
101
105
 
102
- describe "#assign_attributes" do
103
- it "posso setar varios atributos" do
104
- subject.assign_attributes({cep_sacado: "89809-360", cidade_sacado: "Valor", uf_sacado: "OK"})
105
- subject.cep_sacado.must_equal '89809360'
106
- subject.cidade_sacado.must_equal 'Valor'
107
- subject.uf_sacado.must_equal 'OK'
108
- end
109
- it "nao deve sobrescrever os valores já setados com os valores padrões" do
110
- subject.cod_desconto = '9'
111
- subject.assign_attributes(valor_desconto: 500.88)
112
- subject.cod_desconto.must_equal '9'
113
- subject.valor_desconto.must_equal 500.88
114
- end
106
+ it "se não for setado uma parcela deve assumir 1" do
107
+ subject.parcela = 10
108
+ subject.parcela.must_equal 10
109
+ subject.parcela = nil
110
+ subject.parcela.must_equal '1'
115
111
  end
116
112
 
117
- describe "initialize com bloco" do
118
- subject do
119
- BrBoleto::Remessa::Pagamento.new do |bl|
120
- bl.nosso_numero = "999777"
121
- bl.valor_documento = 789.44
122
- end
123
- end
124
- it { subject.nosso_numero.must_equal '999777' }
125
- it { subject.valor_documento.must_equal 789.44 }
113
+ it "nosso_numero deve retornar apenas numeros" do
114
+ subject.nosso_numero = 'A1!@#$%*()-234vc.,;-56789o0'
115
+ subject.nosso_numero.must_equal '1234567890'
126
116
  end
127
117
 
128
- describe "#formata_data" do
129
- it "quando passar um valor nil" do
130
- subject.send(:formata_data, nil).must_equal '00000000'
118
+ describe "default_values" do
119
+ let(:object) { subject.class.new() }
120
+ it "for data_emissao" do object.data_emissao.must_equal Date.today end
121
+ it "for valor_mora" do object.valor_mora.must_equal 0.0 end
122
+ it "for valor_desconto" do object.valor_desconto.must_equal 0.0 end
123
+ it "for valor_iof" do object.valor_iof.must_equal 0.0 end
124
+ it "for valor_abatimento" do object.valor_abatimento.must_equal 0.0 end
125
+ it "for cod_desconto" do object.cod_desconto.must_equal '0' end
126
+ it "for desconto_2_codigo" do object.desconto_2_codigo.must_equal '0' end
127
+ it "for desconto_2_valor" do object.desconto_2_valor.must_equal 0.0 end
128
+ it "for desconto_3_codigo" do object.desconto_3_codigo.must_equal '0' end
129
+ it "for desconto_3_valor" do object.desconto_3_valor.must_equal 0.0 end
130
+ it "for codigo_multa" do object.codigo_multa.must_equal '3' end
131
+ it "for codigo_juros" do object.codigo_juros.must_equal '3' end
132
+ it "for valor_multa" do object.valor_multa.must_equal 0.0 end
133
+ it "for valor_juros" do object.valor_juros.must_equal 0.0 end
134
+ it "for parcela" do object.parcela.must_equal '1' end
135
+ it "for tipo_impressao" do object.tipo_impressao.must_equal '1' end
136
+ it "for tipo_emissao" do object.tipo_emissao.must_equal '2' end
137
+ it "for identificacao_ocorrencia" do object.identificacao_ocorrencia.must_equal '01' end
138
+ it "for especie_titulo" do object.especie_titulo.must_equal '01' end
139
+ it "for codigo_moeda" do object.codigo_moeda.must_equal '9' end
140
+ it "for forma_cadastramento" do object.forma_cadastramento.must_equal '0' end
141
+ it "for emissao_boleto" do object.emissao_boleto.must_equal '2' end
142
+ it "for distribuicao_boleto" do object.distribuicao_boleto.must_equal '2' end
143
+ end
144
+
145
+ describe "#data_vencimento_formatado" do
146
+ it "deve chamar o metodo formata_data com padrão de formato %d%m%Y" do
147
+ subject.data_vencimento = Date.current
148
+ subject.expects(:formata_data).with(Date.current, "%d%m%Y").returns("123456")
149
+ subject.data_vencimento_formatado.must_equal '123456'
131
150
  end
132
- it "quando passar um valor nil mas passar outro formato para a data" do
133
- subject.send(:formata_data, nil, "%d%m%y").must_equal '000000'
151
+ it "deve chamar o metodo formata_data com o parametro passado" do
152
+ subject.data_vencimento = Date.current
153
+ subject.expects(:formata_data).with(Date.current, "%d%m%y").returns("123456")
154
+ subject.data_vencimento_formatado("%d%m%y").must_equal '123456'
134
155
  end
135
- it "deve formatar a data com padrão ddmmyyyy" do
136
- subject.send(:formata_data, Date.parse('30/12/2017')).must_equal '30122017'
156
+ end
157
+
158
+ describe "#data_emissao_formatado" do
159
+ it "deve chamar o metodo formata_data com padrão de formato %d%m%Y" do
160
+ subject.data_emissao = Date.current
161
+ subject.expects(:formata_data).with(Date.current, "%d%m%Y").returns("123456")
162
+ subject.data_emissao_formatado.must_equal '123456'
137
163
  end
138
- it "deve formatar a data com formato passado por parametro" do
139
- subject.send(:formata_data, Date.parse('30/12/2017'), "%d%m%y").must_equal '301217'
164
+ it "deve chamar o metodo formata_data com o parametro passado" do
165
+ subject.data_emissao = Date.current
166
+ subject.expects(:formata_data).with(Date.current, "%d%m%y").returns("123456")
167
+ subject.data_emissao_formatado("%d%m%y").must_equal '123456'
140
168
  end
141
169
  end
142
170
 
@@ -233,8 +261,6 @@ describe BrBoleto::Remessa::Pagamento do
233
261
  end
234
262
  end
235
263
 
236
-
237
-
238
264
  describe "#valor_documento_formatado" do
239
265
  context "com padrao de tamanho = 13 digitos" do
240
266
  it "deve formatar o valor removendo separador de casas decimais e aredondando para 2 casas decimais" do
@@ -310,89 +336,61 @@ describe BrBoleto::Remessa::Pagamento do
310
336
  end
311
337
  end
312
338
 
313
- describe "#tipo_documento_sacado" do
314
- it "quand documento_sacado for nil" do
315
- subject.documento_sacado = nil
316
- subject.tipo_documento_sacado.must_equal '0'
317
- end
318
- context "com padrao de tamanho = 2" do
319
- it "deve ser 02 (CPF) se for menor que 14 digitos e maior que 11" do
320
- subject.documento_sacado = '123456789012'
321
- subject.tipo_documento_sacado.must_equal '02'
322
- end
323
- it "deve ser 01 (CPF) se for igual a 11" do
324
- subject.documento_sacado = '12345678901'
325
- subject.tipo_documento_sacado.must_equal '01'
326
- end
327
- it "deve ser 01 (CPF) se for menor que 11" do
328
- subject.documento_sacado = '1234567890'
329
- subject.tipo_documento_sacado.must_equal '01'
330
- end
331
- it "deve ser 02 (CNPJ/CGC) se for igual a 14 digitos" do
332
- subject.documento_sacado = '12345678901234'
333
- subject.tipo_documento_sacado.must_equal '02'
334
- end
335
- it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos" do
336
- subject.documento_sacado = '123456789012345'
337
- subject.tipo_documento_sacado.must_equal '02'
338
- end
339
+ describe '#percentual_multa_formatado' do
340
+ let(:number) { BrBoleto::Helper::Number.new(5.47) }
341
+ it "deve formatar o valor no formato de valores em percentual" do
342
+ subject.stubs(:percentual_multa).returns(72.50)
343
+ number
344
+ BrBoleto::Helper::Number.expects(:new).with(72.50).returns(number)
345
+ number.expects(:formata_valor_percentual).with(6).returns('123')
346
+ subject.percentual_multa_formatado.must_equal '123000'
347
+ end
348
+ it "deve considerar o tamanho pelo parametro para formatar o valor" do
349
+ subject.stubs(:percentual_multa).returns(4.0)
350
+ number
351
+ BrBoleto::Helper::Number.expects(:new).with(4.0).returns(number)
352
+ number.expects(:formata_valor_percentual).with(3).returns('1234')
353
+ subject.percentual_multa_formatado(3).must_equal '123'
354
+ end
355
+ it "deve gerar o valor corretamente - Teste sem MOCK" do
356
+ subject.stubs(:percentual_multa).returns(2.87)
357
+ subject.percentual_multa_formatado(5).must_equal '02870'
339
358
  end
340
- context "passando um tamanho por parâmetro" do
341
- it "deve ser 2 (CNPJ) se for menor que 14 digitos e maior que 11 com tamanho=1" do
342
- subject.documento_sacado = '1234567890123'
343
- subject.tipo_documento_sacado(1).must_equal '2'
344
- end
345
- it "deve ser 002 (CNPJ/CGC) se for igual a 14 digitos e tamanho = 3" do
346
- subject.documento_sacado = '12345678901234'
347
- subject.tipo_documento_sacado(3).must_equal '002'
348
- end
349
- it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos e tamanho = 2" do
350
- subject.documento_sacado = '123456789012345'
351
- subject.tipo_documento_sacado(2).must_equal '02'
352
- end
359
+ end
360
+ describe '#percentual_juros_formatado' do
361
+ let(:number) { BrBoleto::Helper::Number.new(5.47) }
362
+ it "deve formatar o valor no formato de valores em percentual" do
363
+ subject.stubs(:percentual_juros).returns(7.50)
364
+ number
365
+ BrBoleto::Helper::Number.expects(:new).with(7.50).returns(number)
366
+ number.expects(:formata_valor_percentual).with(6).returns('123')
367
+ subject.percentual_juros_formatado.must_equal '123000'
368
+ end
369
+ it "deve considerar o tamanho pelo parametro para formatar o valor" do
370
+ subject.stubs(:percentual_juros).returns(9.87)
371
+ number
372
+ BrBoleto::Helper::Number.expects(:new).with(9.87).returns(number)
373
+ number.expects(:formata_valor_percentual).with(3).returns('1234')
374
+ subject.percentual_juros_formatado(3).must_equal '123'
375
+ end
376
+ it "deve gerar o valor corretamente - Teste sem MOCK" do
377
+ subject.stubs(:percentual_juros).returns(12.438)
378
+ subject.percentual_juros_formatado(7).must_equal '1243800'
353
379
  end
354
380
  end
355
381
 
356
- describe "#tipo_documento_avalista" do
357
- it "quand documento_avalista for nil" do
358
- subject.documento_avalista = nil
359
- subject.tipo_documento_avalista.must_equal '0'
360
- end
361
- context "com padrao de tamanho = 2" do
362
- it "deve ser 02 (CNPJ) se for menor que 14 digitos e maior que 11" do
363
- subject.documento_avalista = '1234567890123'
364
- subject.tipo_documento_avalista.must_equal '02'
365
- end
366
- it "deve ser 01 (CPF) se for igual a 11" do
367
- subject.documento_avalista = '12345678901'
368
- subject.tipo_documento_avalista.must_equal '01'
369
- end
370
- it "deve ser 01 (CPF) se for menor que 11" do
371
- subject.documento_avalista = '1234567890'
372
- subject.tipo_documento_avalista.must_equal '01'
373
- end
374
- it "deve ser 02 (CNPJ/CGC) se for igual a 14 digitos" do
375
- subject.documento_avalista = '12345678901234'
376
- subject.tipo_documento_avalista.must_equal '02'
377
- end
378
- it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos" do
379
- subject.documento_avalista = '123456789012345'
380
- subject.tipo_documento_avalista.must_equal '02'
381
- end
382
+ describe "#formata_data" do
383
+ it "quando passar um valor nil" do
384
+ subject.send(:formata_data, nil).must_equal '00000000'
382
385
  end
383
- context "passando um tamanho por parâmetro" do
384
- it "deve ser 2 (CNPJ) se for menor que 14 digitos e maior que 11 com tamanho=1" do
385
- subject.documento_avalista = '1234567890123'
386
- subject.tipo_documento_avalista(1).must_equal '2'
387
- end
388
- it "deve ser 002 (CNPJ/CGC) se for igual a 14 digitos e tamanho = 3" do
389
- subject.documento_avalista = '12345678901234'
390
- subject.tipo_documento_avalista(3).must_equal '002'
391
- end
392
- it "deve ser 02 (CNPJ/CGC) se for maior a 14 digitos e tamanho = 2" do
393
- subject.documento_avalista = '123456789012345'
394
- subject.tipo_documento_avalista(2).must_equal '02'
395
- end
386
+ it "quando passar um valor nil mas passar outro formato para a data" do
387
+ subject.send(:formata_data, nil, "%d%m%y").must_equal '000000'
388
+ end
389
+ it "deve formatar a data com padrão ddmmyyyy" do
390
+ subject.send(:formata_data, Date.parse('30/12/2017')).must_equal '30122017'
391
+ end
392
+ it "deve formatar a data com formato passado por parametro" do
393
+ subject.send(:formata_data, Date.parse('30/12/2017'), "%d%m%y").must_equal '301217'
396
394
  end
397
395
  end
398
396
  end
@@ -1,6 +1,5 @@
1
1
  require 'test_helper'
2
2
 
3
- require 'pry'
4
3
  describe BrBoleto::Retorno::Base do
5
4
 
6
5
  subject { BrBoleto::Retorno::Base.new('') }