brcobranca 8.0.0 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-gemset +1 -1
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +5 -3
  5. data/CHANGELOG.md +9 -0
  6. data/Gemfile +2 -2
  7. data/README.md +24 -12
  8. data/brcobranca.gemspec +0 -2
  9. data/lib/brcobranca.rb +43 -26
  10. data/lib/brcobranca/arquivos/logos/bancobrasilia.eps +0 -0
  11. data/lib/brcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
  12. data/lib/brcobranca/arquivos/logos/cecred.eps +427 -0
  13. data/lib/brcobranca/arquivos/logos/cecred_carne.eps +427 -0
  14. data/lib/brcobranca/arquivos/logos/credisis.eps +5402 -0
  15. data/lib/brcobranca/arquivos/logos/credisis_carne.eps +5410 -0
  16. data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
  17. data/lib/brcobranca/boleto/banco_brasil.rb +21 -21
  18. data/lib/brcobranca/boleto/banco_brasilia.rb +96 -0
  19. data/lib/brcobranca/boleto/banco_nordeste.rb +4 -6
  20. data/lib/brcobranca/boleto/banestes.rb +7 -7
  21. data/lib/brcobranca/boleto/banrisul.rb +5 -5
  22. data/lib/brcobranca/boleto/base.rb +28 -22
  23. data/lib/brcobranca/boleto/bradesco.rb +6 -6
  24. data/lib/brcobranca/boleto/caixa.rb +11 -18
  25. data/lib/brcobranca/boleto/cecred.rb +86 -0
  26. data/lib/brcobranca/boleto/credisis.rb +124 -0
  27. data/lib/brcobranca/boleto/hsbc.rb +10 -27
  28. data/lib/brcobranca/boleto/itau.rb +9 -10
  29. data/lib/brcobranca/boleto/santander.rb +5 -6
  30. data/lib/brcobranca/boleto/sicoob.rb +5 -5
  31. data/lib/brcobranca/boleto/sicredi.rb +7 -7
  32. data/lib/brcobranca/boleto/template/rghost.rb +127 -80
  33. data/lib/brcobranca/boleto/template/rghost_carne.rb +9 -9
  34. data/lib/brcobranca/boleto/unicred.rb +126 -4
  35. data/lib/brcobranca/calculo_data.rb +3 -0
  36. data/lib/brcobranca/formatacao_string.rb +15 -5
  37. data/lib/brcobranca/remessa/base.rb +16 -9
  38. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +14 -13
  39. data/lib/brcobranca/remessa/cnab240/base.rb +252 -119
  40. data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +299 -0
  41. data/lib/brcobranca/remessa/cnab240/caixa.rb +61 -7
  42. data/lib/brcobranca/remessa/cnab240/cecred.rb +151 -0
  43. data/lib/brcobranca/remessa/cnab240/sicoob.rb +109 -123
  44. data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +94 -0
  45. data/lib/brcobranca/remessa/cnab240/sicredi.rb +177 -0
  46. data/lib/brcobranca/remessa/cnab240/unicred.rb +9 -0
  47. data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +14 -0
  48. data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +166 -0
  49. data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +4 -6
  50. data/lib/brcobranca/remessa/cnab400/banrisul.rb +155 -0
  51. data/lib/brcobranca/remessa/cnab400/base.rb +4 -4
  52. data/lib/brcobranca/remessa/cnab400/bradesco.rb +7 -8
  53. data/lib/brcobranca/remessa/cnab400/citibank.rb +3 -4
  54. data/lib/brcobranca/remessa/cnab400/credisis.rb +128 -0
  55. data/lib/brcobranca/remessa/cnab400/itau.rb +23 -6
  56. data/lib/brcobranca/remessa/cnab400/santander.rb +80 -65
  57. data/lib/brcobranca/remessa/cnab400/sicoob.rb +2 -2
  58. data/lib/brcobranca/remessa/cnab400/unicred.rb +143 -0
  59. data/lib/brcobranca/remessa/pagamento.rb +50 -14
  60. data/lib/brcobranca/retorno/base.rb +4 -4
  61. data/lib/brcobranca/retorno/cnab240/base.rb +11 -8
  62. data/lib/brcobranca/retorno/cnab240/caixa.rb +4 -0
  63. data/lib/brcobranca/retorno/cnab240/cecred.rb +102 -0
  64. data/lib/brcobranca/retorno/cnab240/santander.rb +35 -12
  65. data/lib/brcobranca/retorno/cnab240/sicoob.rb +8 -4
  66. data/lib/brcobranca/retorno/cnab240/sicredi.rb +79 -0
  67. data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +127 -0
  68. data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +89 -0
  69. data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +112 -0
  70. data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
  71. data/lib/brcobranca/retorno/cnab400/base.rb +18 -7
  72. data/lib/brcobranca/retorno/cnab400/bradesco.rb +9 -3
  73. data/lib/brcobranca/retorno/cnab400/credisis.rb +115 -0
  74. data/lib/brcobranca/retorno/cnab400/itau.rb +10 -4
  75. data/lib/brcobranca/retorno/cnab400/santander.rb +57 -0
  76. data/lib/brcobranca/retorno/cnab400/unicred.rb +118 -0
  77. data/lib/brcobranca/retorno/retorno_cnab240.rb +7 -3
  78. data/lib/brcobranca/retorno/retorno_cnab400.rb +6 -77
  79. data/lib/brcobranca/util/date.rb +20 -0
  80. data/lib/brcobranca/util/errors.rb +76 -0
  81. data/lib/brcobranca/validations.rb +232 -0
  82. data/lib/brcobranca/version.rb +1 -1
  83. data/spec/arquivos/CNAB240CECRED.RET +10 -0
  84. data/spec/arquivos/CNAB240SANTANDER.RET +8 -26
  85. data/spec/arquivos/CNAB240SICREDI.CRT +8 -0
  86. data/spec/arquivos/CNAB400BANCOBRASILIA.RET +3 -0
  87. data/spec/arquivos/CNAB400BANCONORDESTE.RET +3 -0
  88. data/spec/arquivos/CNAB400BANRISUL.RET +3 -0
  89. data/spec/arquivos/CNAB400CREDISIS.RET +3 -0
  90. data/spec/arquivos/CNAB400SANTANDER.RET +54 -0
  91. data/spec/arquivos/CNAB400UNICRED.RET +3 -0
  92. data/spec/brcobranca/base_spec.rb +6 -4
  93. data/spec/brcobranca/boleto/banco_brasil_spec.rb +22 -22
  94. data/spec/brcobranca/boleto/banco_brasilia_spec.rb +134 -0
  95. data/spec/brcobranca/boleto/banco_nordeste_spec.rb +19 -19
  96. data/spec/brcobranca/boleto/banestes_spec.rb +19 -19
  97. data/spec/brcobranca/boleto/banrisul_spec.rb +14 -14
  98. data/spec/brcobranca/boleto/bradesco_spec.rb +13 -13
  99. data/spec/brcobranca/boleto/caixa_spec.rb +7 -7
  100. data/spec/brcobranca/boleto/cecred_spec.rb +147 -0
  101. data/spec/brcobranca/boleto/credisis_spec.rb +155 -0
  102. data/spec/brcobranca/boleto/hsbc_spec.rb +17 -37
  103. data/spec/brcobranca/boleto/itau_spec.rb +16 -16
  104. data/spec/brcobranca/boleto/santander_spec.rb +11 -11
  105. data/spec/brcobranca/boleto/sicoob_spec.rb +17 -17
  106. data/spec/brcobranca/boleto/sicredi_spec.rb +13 -13
  107. data/spec/brcobranca/boleto/unicred_spec.rb +10 -10
  108. data/spec/brcobranca/boletos_em_lote_spec.rb +1 -1
  109. data/spec/brcobranca/formatacao_string_spec.rb +1 -1
  110. data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +10 -18
  111. data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +39 -38
  112. data/spec/brcobranca/remessa/cnab240/cecred_spec.rb +164 -0
  113. data/spec/brcobranca/remessa/cnab240/sicoob_banco_brasil_spec.rb +268 -0
  114. data/spec/brcobranca/remessa/cnab240/sicoob_spec.rb +58 -39
  115. data/spec/brcobranca/remessa/cnab240/sicredi_spec.rb +201 -0
  116. data/spec/brcobranca/remessa/cnab240/unicred_spec.rb +193 -0
  117. data/spec/brcobranca/remessa/cnab400/banco_brasilia_spec.rb +183 -0
  118. data/spec/brcobranca/remessa/cnab400/banco_nordeste_spec.rb +4 -2
  119. data/spec/brcobranca/remessa/cnab400/banrisul_spec.rb +190 -0
  120. data/spec/brcobranca/remessa/cnab400/base_spec.rb +1 -1
  121. data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +16 -11
  122. data/spec/brcobranca/remessa/cnab400/citibank_spec.rb +11 -11
  123. data/spec/brcobranca/remessa/cnab400/credisis_spec.rb +188 -0
  124. data/spec/brcobranca/remessa/cnab400/itau_spec.rb +25 -12
  125. data/spec/brcobranca/remessa/cnab400/santander_spec.rb +35 -36
  126. data/spec/brcobranca/remessa/cnab400/sicoob_spec.rb +37 -0
  127. data/spec/brcobranca/remessa/cnab400/unicred_spec.rb +185 -0
  128. data/spec/brcobranca/remessa/pagamento_spec.rb +45 -27
  129. data/spec/brcobranca/retorno/cnab240/base_spec.rb +7 -8
  130. data/spec/brcobranca/retorno/cnab240/cecred_spec.rb +50 -0
  131. data/spec/brcobranca/retorno/cnab240/santander_spec.rb +35 -18
  132. data/spec/brcobranca/retorno/cnab240/sicoob_spec.rb +20 -19
  133. data/spec/brcobranca/retorno/cnab240/sicredi_spec.rb +31 -0
  134. data/spec/brcobranca/retorno/cnab400/banco_brasilia_spec.rb +36 -0
  135. data/spec/brcobranca/retorno/cnab400/banco_nordeste_spec.rb +39 -0
  136. data/spec/brcobranca/retorno/cnab400/banrisul_spec.rb +41 -0
  137. data/spec/brcobranca/retorno/cnab400/base_spec.rb +34 -13
  138. data/spec/brcobranca/retorno/cnab400/bradesco_spec.rb +4 -4
  139. data/spec/brcobranca/retorno/cnab400/credisis_spec.rb +25 -0
  140. data/spec/brcobranca/retorno/cnab400/itau_spec.rb +4 -4
  141. data/spec/brcobranca/retorno/cnab400/santander_spec.rb +39 -0
  142. data/spec/brcobranca/retorno/cnab400/unicred_spec.rb +42 -0
  143. data/spec/brcobranca/retorno/retorno_cnab400_spec.rb +1 -1
  144. data/spec/brcobranca/retorno/retorno_cnab_240_spec.rb +1 -1
  145. data/spec/brcobranca/rghost_spec.rb +1 -1
  146. data/spec/fixtures/remessa/remessa-banco-brasil-cnab400.rem +1 -1
  147. data/spec/fixtures/remessa/remessa-banco-brasilia-cnab400.rem +3 -0
  148. data/spec/fixtures/remessa/remessa-banco-nordeste-cnab400.rem +1 -1
  149. data/spec/fixtures/remessa/remessa-banco_brasil-cnab240.rem +5 -4
  150. data/spec/fixtures/remessa/remessa-bancoob-cnab240.rem +5 -4
  151. data/spec/fixtures/remessa/remessa-banrisul-cnab400.rem +3 -0
  152. data/spec/fixtures/remessa/remessa-bradesco-cnab400.rem +1 -1
  153. data/spec/fixtures/remessa/remessa-caixa-cnab240.rem +6 -5
  154. data/spec/fixtures/remessa/remessa-cecred-cnab240.rem +7 -0
  155. data/spec/fixtures/remessa/remessa-citibank-cnab400.rem +1 -1
  156. data/spec/fixtures/remessa/remessa-credisis-cnab400.rem +3 -0
  157. data/spec/fixtures/remessa/remessa-itau-cnab400.rem +3 -2
  158. data/spec/fixtures/remessa/remessa-santander-cnab400.rem +2 -2
  159. data/spec/fixtures/remessa/remessa-sicoob-correspondente-bb-cnab240.rem +4 -0
  160. data/spec/fixtures/remessa/remessa-sicredi-cnab240.rem +7 -0
  161. data/spec/fixtures/remessa/remessa-unicred-cnab240.rem +7 -0
  162. data/spec/fixtures/remessa/remessa-unicred-cnab400.rem +3 -0
  163. data/spec/support/shared_examples/busca_logotipo.rb +0 -2
  164. data/spec/support/shared_examples/cnab240.rb +92 -28
  165. data/spec/support/shared_examples/cnab400.rb +60 -14
  166. data/spec/support/shared_examples/formatos_validos.rb +6 -6
  167. metadata +103 -31
@@ -1,20 +1,21 @@
1
1
  # -*- encoding: utf-8 -*-
2
- #
3
-
4
2
  require 'spec_helper'
5
3
 
6
4
  RSpec.describe Brcobranca::Remessa::Cnab400::Itau do
7
5
  let(:pagamento) do
8
6
  Brcobranca::Remessa::Pagamento.new(valor: 199.9,
9
- data_vencimento: Date.current,
10
- nosso_numero: 123,
11
- documento_sacado: '12345678901',
12
- nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
13
- endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
14
- bairro_sacado: 'São josé dos quatro apostolos magros',
15
- cep_sacado: '12345678',
16
- cidade_sacado: 'Santa rita de cássia maria da silva',
17
- uf_sacado: 'SP')
7
+ data_vencimento: Date.current,
8
+ nosso_numero: 123,
9
+ documento: 6969,
10
+ documento_sacado: '12345678901',
11
+ nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
12
+ endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
13
+ bairro_sacado: 'São josé dos quatro apostolos magros',
14
+ cep_sacado: '12345678',
15
+ cidade_sacado: 'Santa rita de cássia maria da silva',
16
+ codigo_multa: '1',
17
+ percentual_multa: 2.00,
18
+ uf_sacado: 'SP')
18
19
  end
19
20
  let(:params) do
20
21
  { carteira: '123',
@@ -155,7 +156,8 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Itau do
155
156
 
156
157
  context 'detalhe' do
157
158
  it 'informacoes devem estar posicionadas corretamente no detalhe' do
158
- detalhe = itau.monta_detalhe pagamento, 1
159
+ detalhe = itau.monta_detalhe pagamento, 2
160
+ expect(detalhe[37..61]).to eq "6969".ljust(25)
159
161
  expect(detalhe[62..69]).to eq '00000123' # nosso numero
160
162
  expect(detalhe[120..125]).to eq Date.current.strftime('%d%m%y') # data de vencimento
161
163
  expect(detalhe[126..138]).to eq '0000000019990' # valor do titulo
@@ -165,6 +167,17 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Itau do
165
167
  expect(detalhe[220..233]).to eq '00012345678901' # documento do pagador
166
168
  expect(detalhe[234..263]).to eq 'PABLO DIEGO JOSE FRANCISCO DE ' # nome do pagador
167
169
  end
170
+
171
+ it 'informacoes devem estar posicionadas corretamente no detalhe opcional de multa' do
172
+ detalhe_multa = itau.monta_detalhe_multa pagamento, 3
173
+ # Significado Posição Picture
174
+ expect(detalhe_multa[0]).to eq '2' # Identificação do reg. transação [001..001] 9(001)
175
+ expect(detalhe_multa[1]).to eq '1' # Código da multa [002..002] X(001)
176
+ expect(detalhe_multa[2..9]).to eq Date.current.strftime('%d%m%Y') # Data da multa [003..010] 9(008)
177
+ expect(detalhe_multa[10..22]).to eq '0000000000200' # Valor da multa [011..023] 9(013)
178
+ expect(detalhe_multa[23..393]).to eq ''.rjust(371, ' ') # Complemento [024..394] X(370)
179
+ expect(detalhe_multa[394..399]).to eq '000003' # Número sequencial [395..400] 9(006)
180
+ end
168
181
  end
169
182
 
170
183
  context 'arquivo' do
@@ -1,20 +1,24 @@
1
1
  # -*- encoding: utf-8 -*-
2
- #
3
-
4
2
  require 'spec_helper'
5
3
 
6
4
  RSpec.describe Brcobranca::Remessa::Cnab400::Santander do
7
5
  let(:pagamento) do
8
6
  Brcobranca::Remessa::Pagamento.new(valor: 199.9,
9
- data_vencimento: Date.current,
10
- nosso_numero: 123,
11
- documento_sacado: '12345678901',
12
- nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
13
- endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
14
- bairro_sacado: 'São josé dos quatro apostolos magros',
15
- cep_sacado: '12345678',
16
- cidade_sacado: 'Santa rita de cássia maria da silva',
17
- uf_sacado: 'SP')
7
+ data_vencimento: Date.current,
8
+ codigo_multa: '4',
9
+ percentual_multa: '2.00',
10
+ valor_mora: '8.00',
11
+ cod_primeira_instrucao: '06',
12
+ dias_protesto: '6',
13
+ nosso_numero: 123,
14
+ documento: 6969,
15
+ documento_sacado: '12345678901',
16
+ nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
17
+ endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
18
+ bairro_sacado: 'São josé dos quatro apostolos magros',
19
+ cep_sacado: '12345678',
20
+ cidade_sacado: 'Santa rita de cássia maria da silva',
21
+ uf_sacado: 'SP')
18
22
  end
19
23
  let(:params) do
20
24
  {
@@ -37,12 +41,6 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Santander do
37
41
  expect(object.errors.full_messages).to include('Carteira não pode estar em branco.')
38
42
  end
39
43
 
40
- it 'deve ser invalido' do
41
- object = subject.class.new
42
- expect(object.invalid?).to be true
43
- expect(object.errors.full_messages).to eq(['Pagamentos não pode estar em branco.', 'Pagamentos deve ser uma coleção (Array).', 'Empresa mae não pode estar em branco.', 'Documento cedente não pode estar em branco.', 'Documento cedente deve ter entre 11 e 14 dígitos.', 'Codigo transmissao não pode estar em branco.', 'Agencia não pode estar em branco.', 'Conta corrente não pode estar em branco.', 'Digito conta não pode estar em branco.'])
44
- end
45
-
46
44
  it 'deve ser invalido se a carteira tiver mais de 3 digitos' do
47
45
  santander.carteira = '12345'
48
46
  expect(santander.invalid?).to be true
@@ -80,7 +78,7 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Santander do
80
78
  end
81
79
 
82
80
  context 'formatacoes dos valores' do
83
- it 'cod_banco deve ser 341' do
81
+ it 'cod_banco deve ser 033' do
84
82
  expect(santander.cod_banco).to eq '033'
85
83
  end
86
84
 
@@ -93,14 +91,15 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Santander do
93
91
  expect(santander.complemento.size).to eq 275
94
92
  end
95
93
 
96
- it 'complemento zeros deve retornar 16 caracteres' do
97
- expect(santander.complemento_zeros.size).to eq 16
98
- end
99
-
100
94
  it 'info_conta deve retornar com 20 posicoes as informacoes da conta' do
101
95
  info_conta = santander.info_conta
102
96
  expect(info_conta.size).to eq 20
103
97
  expect(info_conta[0..19]).to eq '17777751042700080112' # codigo_transmissao
98
+
99
+ object = subject.class.new(params.merge!(codigo_transmissao: '7777751042700080112'))
100
+ info_conta = object.info_conta
101
+ expect(info_conta.size).to eq 20
102
+ expect(info_conta[0..19]).to eq '07777751042700080112' # codigo_transmissao
104
103
  end
105
104
  end
106
105
 
@@ -110,16 +109,20 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Santander do
110
109
  context 'header' do
111
110
  it 'informacoes devem estar posicionadas corretamente no header' do
112
111
  header = santander.monta_header
113
- expect(header[1]).to eq '1' # tipo operacao (1 = remessa)
114
- expect(header[2..8]).to eq 'REMESSA' # literal da operacao
115
- expect(header[26..45]).to eq santander.info_conta # informacoes da conta
116
- expect(header[76..78]).to eq '033' # codigo do banco
112
+ expect(header[1]).to eq '1' # tipo operacao (1 = remessa)
113
+ expect(header[2..8]).to eq 'REMESSA' # literal da operacao
114
+ expect(header[26..45]).to eq santander.info_conta # informacoes da conta
115
+ expect(header[76..78]).to eq '033' # codigo do banco
116
+ expect(header[100..115]).to eq ''.rjust(16, "0") # zeros
117
+ expect(header[116..390]).to eq ''.rjust(275,' ') # campos mensagens vazios
118
+ expect(header[391..393]).to eq '058' # numero da versão da remessa
117
119
  end
118
120
  end
119
121
 
120
122
  context 'detalhe' do
121
123
  it 'informacoes devem estar posicionadas corretamente no detalhe' do
122
124
  detalhe = santander.monta_detalhe pagamento, 1
125
+ expect(detalhe[37..61]).to eq "6969".ljust(25) # nosso numero
123
126
  expect(detalhe[62..69]).to eq '00000123' # nosso numero
124
127
  expect(detalhe[120..125]).to eq Date.current.strftime('%d%m%y') # data de vencimento
125
128
  expect(detalhe[126..138]).to eq '0000000019990' # valor do titulo
@@ -129,17 +132,13 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Santander do
129
132
  end
130
133
 
131
134
  context 'trailer' do
132
- it 'trailer deve ter 400 posicoes' do
133
- expect(santander.monta_trailer(1).size).to eq 400
134
- end
135
-
136
135
  it 'informacoes devem estar posicionadas corretamente no trailer' do
137
- trailer = santander.monta_trailer 3
138
- expect(trailer[0]).to eq '9' # identificacao registro
139
- expect(trailer[1..6]).to eq '000003' # numero de linhas
140
- expect(trailer[7..19]).to eq '0000000019990' # valor total
141
- expect(trailer[20..393]).to eq ''.rjust(374, '0') # zeros
142
- expect(trailer[394..399]).to eq '000003' # numero sequencial do registro
136
+ trailer = santander.monta_trailer "3"
137
+ expect(trailer[0]).to eq '9' # código registro
138
+ expect(trailer[1..6]).to eq '000003' # quant. total de linhas
139
+ expect(trailer[7..19]).to eq '0000000019990' # valor total dos titulos
140
+ expect(trailer[20..393]).to eq ''.rjust(374, '0') # zeros
141
+ expect(trailer[394..399]).to eq '000003' # num. sequencial
143
142
  end
144
143
  end
145
144
 
@@ -141,6 +141,43 @@ RSpec.describe Brcobranca::Remessa::Cnab400::Sicoob do
141
141
  expect(id_empresa[5..13]).to eq '123456789' # convenio
142
142
  expect(id_empresa[14..19]).to eq ' ' # brancos
143
143
  end
144
+
145
+ it 'deve calcular o digito da agencia' do
146
+ # digito calculado a partir do modulo 11 com base 9
147
+ #
148
+ # agencia = 1 2 3 4
149
+ #
150
+ # 4 3 2 1
151
+ # x 9 8 7 6
152
+ # = 36 24 14 6 = 80
153
+ # 80 / 11 = 7 com resto 3
154
+ expected_digito_agencia_list = [
155
+ { agencia: "3214", dv: "0" },
156
+ { agencia: "2006", dv: "0" },
157
+ { agencia: "5651", dv: "0" },
158
+ { agencia: "5691", dv: "0" },
159
+ { agencia: "5741", dv: "0" },
160
+ { agencia: "1008", dv: "1" },
161
+ { agencia: "5681", dv: "2" },
162
+ { agencia: "5731", dv: "2" },
163
+ { agencia: "4327", dv: "3" },
164
+ { agencia: "1001", dv: "4" },
165
+ { agencia: "5761", dv: "4" },
166
+ { agencia: "3032", dv: "5" },
167
+ { agencia: "5671", dv: "5" },
168
+ { agencia: "5631", dv: "6" },
169
+ { agencia: "1005", dv: "7" },
170
+ { agencia: "5661", dv: "8" },
171
+ { agencia: "0001", dv: "9" },
172
+ { agencia: "5621", dv: "9" },
173
+ ]
174
+
175
+ expected_digito_agencia_list.each do |expected_dv_agencia|
176
+ remessa_params = params.merge!(agencia: expected_dv_agencia[:agencia])
177
+ remessa = subject.class.new(remessa_params)
178
+ expect(remessa.digito_agencia).to eq expected_dv_agencia[:dv]
179
+ end
180
+ end
144
181
  end
145
182
 
146
183
  context 'monta remessa' do
@@ -0,0 +1,185 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Brcobranca::Remessa::Cnab400::Unicred do
5
+ let(:pagamento) do
6
+ Brcobranca::Remessa::Pagamento.new(valor: 199.9,
7
+ data_vencimento: Date.current,
8
+ nosso_numero: '072000031',
9
+ documento: 6969,
10
+ documento_sacado: '12345678901',
11
+ nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
12
+ endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
13
+ bairro_sacado: 'São josé dos quatro apostolos magros',
14
+ cep_sacado: '12345678',
15
+ cidade_sacado: 'Santa rita de cássia maria da silva',
16
+ uf_sacado: 'SP')
17
+ end
18
+ let(:params) do
19
+ {
20
+ carteira: '03',
21
+ agencia: '1234',
22
+ conta_corrente: '12345',
23
+ digito_conta: '1',
24
+ empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
25
+ documento_cedente: '12345678910',
26
+ codigo_transmissao: '12345678901234567890',
27
+ byte_idt: '2',
28
+ pagamentos: [pagamento]
29
+ }
30
+ end
31
+ let(:unicred) { subject.class.new(params) }
32
+
33
+ context 'validacoes dos campos' do
34
+ context '@agencia' do
35
+ it 'deve ser invalido se nao possuir uma agencia' do
36
+ object = subject.class.new(params.merge!(agencia: nil))
37
+ expect(object.invalid?).to be true
38
+ expect(object.errors.full_messages).to include('Agencia não pode estar em branco.')
39
+ end
40
+
41
+ it 'deve ser invalido se a agencia tiver mais de 4 digitos' do
42
+ unicred.agencia = '12345'
43
+ expect(unicred.invalid?).to be true
44
+ expect(unicred.errors.full_messages).to include('Agencia deve ter 4 dígitos.')
45
+ end
46
+ end
47
+
48
+ context '@digito_conta' do
49
+ it 'deve ser invalido se nao possuir um digito da conta corrente' do
50
+ objeto = subject.class.new(params.merge!(digito_conta: nil))
51
+ expect(objeto.invalid?).to be true
52
+ expect(objeto.errors.full_messages).to include('Digito conta não pode estar em branco.')
53
+ end
54
+
55
+ it 'deve ser inválido se o dígito da conta tiver mais de 1 dígito' do
56
+ unicred.digito_conta = '12'
57
+ expect(unicred.invalid?).to be true
58
+ expect(unicred.errors.full_messages).to include('Digito conta deve ter 1 dígito.')
59
+ end
60
+ end
61
+
62
+ context '@conta_corrente' do
63
+ it 'deve ser invalido se nao possuir uma conta corrente' do
64
+ object = subject.class.new(params.merge!(conta_corrente: nil))
65
+ expect(object.invalid?).to be true
66
+ expect(object.errors.full_messages).to include('Conta corrente não pode estar em branco.')
67
+ end
68
+
69
+ it 'deve ser invalido se a conta corrente tiver mais de 5 digitos' do
70
+ unicred.conta_corrente = '123456'
71
+
72
+ expect(unicred.invalid?).to be true
73
+ expect(unicred.errors.full_messages).to include('Conta corrente deve ter 5 dígitos.')
74
+ end
75
+ end
76
+
77
+ context '@carteira' do
78
+ it 'deve ser inválido se não possuir uma carteira' do
79
+ object = subject.class.new(params.merge!(carteira: nil))
80
+ expect(object.invalid?).to be true
81
+ expect(object.errors.full_messages).to include('Carteira não pode estar em branco.')
82
+ end
83
+
84
+ it 'deve ser inválido se a carteira tiver mais de 2 dígitos' do
85
+ unicred.carteira = '123'
86
+ expect(unicred.invalid?).to be true
87
+ expect(unicred.errors.full_messages).to include('Carteira deve ter 2 dígitos.')
88
+ end
89
+ end
90
+
91
+ context '@documento_cedente' do
92
+ it 'deve ser inválido se não possuir o documento cedente' do
93
+ object = subject.class.new(params.merge!(documento_cedente: nil))
94
+ expect(object.invalid?).to be true
95
+ expect(object.errors.full_messages).to include('Documento cedente não pode estar em branco.')
96
+ end
97
+
98
+ it 'deve ser invalido se o documento do cedente nao tiver entre 11 e 14 digitos' do
99
+ unicred.documento_cedente = '123'
100
+ expect(unicred.invalid?).to be true
101
+ expect(unicred.errors.full_messages).to include('Documento cedente deve ter entre 11 e 14 dígitos.')
102
+ end
103
+ end
104
+
105
+ context '@codigo_transmissao' do
106
+ it 'deve ser inválido se não existir' do
107
+ object = subject.class.new(params.merge!(codigo_transmissao: nil))
108
+ expect(object.invalid?).to be true
109
+ expect(object.errors.full_messages).to include('Codigo transmissao não pode estar em branco.')
110
+ end
111
+
112
+ it 'deve ser inválido quando não possuir até 20 dígitos' do
113
+ object = subject.class.new(params.merge!(codigo_transmissao: '123456789012345678901'))
114
+ expect(object.invalid?).to be true
115
+ expect(object.errors.full_messages).to include('Codigo transmissao deve ter 20 dígitos.')
116
+ end
117
+ end
118
+ end
119
+
120
+ context 'formatacoes dos valores' do
121
+ it 'cod_banco deve ser 748' do
122
+ expect(unicred.cod_banco).to eq '748'
123
+ end
124
+
125
+ it 'nome_banco deve ser UNICRED com 15 posicoes' do
126
+ nome_banco = unicred.nome_banco
127
+ expect(nome_banco.size).to eq 15
128
+ expect(nome_banco.strip).to eq 'UNICRED'
129
+ end
130
+
131
+ it 'complemento deve retornar 294 caracteres' do
132
+ expect(unicred.complemento.size).to eq 294
133
+ end
134
+
135
+ it 'info_conta deve retornar com 20 posicoes as informacoes da conta' do
136
+ info_conta = unicred.info_conta
137
+ expect(info_conta.size).to eq 20
138
+ expect(info_conta[0..19]).to eq '12345678901234567890'
139
+ end
140
+
141
+ it 'deve retornar o codigo da carteira de acordo com o tipo de emissão' do
142
+ unicred.carteira = '03'
143
+ expect(unicred.codigo_carteira).to eq '3'
144
+
145
+ unicred.carteira = '09'
146
+ expect(unicred.invalid?).to be true
147
+ expect(unicred.errors.full_messages).to include('Carteira não existente para este banco.')
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 = unicred.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 unicred.info_conta # informacoes da conta
160
+ expect(header[76..78]).to eq '748' # codigo do banco
161
+ end
162
+ end
163
+
164
+ context 'detalhe' do
165
+ it 'informacoes devem estar posicionadas corretamente no detalhe' do
166
+ detalhe = unicred.monta_detalhe pagamento, 1
167
+ expect(detalhe[37..61]).to eq "6969".ljust(25) # documento
168
+ expect(detalhe[62..81]).to eq '072000031'.rjust(20, ' ') # nosso numero
169
+ expect(detalhe[120..125]).to eq Date.current.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(unicred.gera_arquivo).to eq(read_remessa('remessa-unicred-cnab400.rem', unicred.gera_arquivo)) }
183
+ end
184
+ end
185
+ end
@@ -1,20 +1,18 @@
1
1
  # -*- encoding: utf-8 -*-
2
- #
3
-
4
2
  require 'spec_helper'
5
3
 
6
4
  RSpec.describe Brcobranca::Remessa::Pagamento do
7
5
  let(:pagamento) do
8
6
  subject.class.new(valor: 199.9,
9
- data_vencimento: Date.parse('2015-06-25'),
10
- nosso_numero: 123,
11
- documento_sacado: '12345678901',
12
- nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
13
- endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
14
- bairro_sacado: 'São josé dos quatro apostolos magros',
15
- cep_sacado: '12345678',
16
- cidade_sacado: 'Santa rita de cássia maria da silva',
17
- uf_sacado: 'SP')
7
+ data_vencimento: Date.parse('2015-06-25'),
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')
18
16
  end
19
17
 
20
18
  context 'validacoes' do
@@ -60,18 +58,10 @@ RSpec.describe Brcobranca::Remessa::Pagamento do
60
58
  expect(pagamento.errors.full_messages).to include('Cidade sacado não pode estar em branco.')
61
59
  end
62
60
 
63
- context '@uf_sacado' do
64
- it 'deve ser invalido se nao possuir UF do sacado' do
65
- pagamento.uf_sacado = nil
66
- expect(pagamento.invalid?).to be true
67
- expect(pagamento.errors.full_messages).to include('Uf sacado não pode estar em branco.')
68
- end
69
-
70
- it 'deve ser invalido se UF do sacado for maior que 2 caracteres' do
71
- pagamento.uf_sacado = 'Santa Catarina'
72
- expect(pagamento.invalid?).to be true
73
- expect(pagamento.errors.full_messages).to include('Uf sacado deve ter 2 dígitos.')
74
- end
61
+ it 'deve ser invalido se nao possuir UF do sacado' do
62
+ pagamento.uf_sacado = nil
63
+ expect(pagamento.invalid?).to be true
64
+ expect(pagamento.errors.full_messages).to include('Uf sacado não pode estar em branco.')
75
65
  end
76
66
 
77
67
  context '@cep' do
@@ -119,10 +109,6 @@ RSpec.describe Brcobranca::Remessa::Pagamento do
119
109
  it 'valor do abatimento padrao deve ser zero' do
120
110
  expect(pagamento.valor_abatimento).to eq 0.0
121
111
  end
122
-
123
- it 'numero da parcela deve ser 01' do
124
- expect(pagamento.parcela).to eq '01'
125
- end
126
112
  end
127
113
 
128
114
  context 'formatacoes dos valores' do
@@ -178,6 +164,38 @@ RSpec.describe Brcobranca::Remessa::Pagamento do
178
164
  expect(pagamento.formata_valor_abatimento(10)).to eq '0000003490'
179
165
  end
180
166
 
167
+ it 'formata valor dos juros com o numero de posicoes passadas' do
168
+ # padrao com 13 posicoes
169
+ pagamento.valor_mora = 49.2
170
+ expect(pagamento.formata_valor_mora).to eq '0000000004920'
171
+ # formata com o tamanho passado
172
+ expect(pagamento.formata_valor_mora(15)).to eq '000000000004920'
173
+ end
174
+
175
+ context 'formata valor do campo documento' do
176
+ before { pagamento.documento = '2345' }
177
+
178
+ it "deve formatar assumindo os valores padrao para os parametros tamanho e caracter" do
179
+ expect(pagamento.formata_documento_ou_numero).to eql '2345'.rjust(25, ' ')
180
+ end
181
+
182
+ it "deve formatar com os parametros tamanho e caracter" do
183
+ expect(pagamento.formata_documento_ou_numero(15, '0')).to eql '2345'.rjust(15, '0')
184
+ end
185
+
186
+ it "deve extrair somente o valor do campo no tamanho informado" do
187
+ pagamento.documento = '12345678901234567890'
188
+ expect(pagamento.formata_documento_ou_numero(15, '0')).to eql '123456789012345'
189
+ expect(pagamento.formata_documento_ou_numero(15, '0').length).to eql 15
190
+ end
191
+
192
+ it 'deve remover caracteres especiais ou acentuação' do
193
+ pagamento.documento = 'JOÃO DEve R$ 900.00'
194
+ expect(pagamento.formata_documento_ou_numero).to eql ' JOO DEve R 90000'
195
+ expect(pagamento.formata_documento_ou_numero.length).to eql 25
196
+ end
197
+ end
198
+
181
199
  context 'identificacao sacado' do
182
200
  it 'verifica a identificacao do sacado (pessoa fisica ou juridica)' do
183
201
  # pessoa fisica