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
@@ -0,0 +1,201 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Brcobranca::Remessa::Cnab240::Sicredi do
5
+ let(:pagamento) do
6
+ Brcobranca::Remessa::Pagamento.new(
7
+ valor: 50.0,
8
+ data_vencimento: Date.current,
9
+ tipo_mora: '1',
10
+ nosso_numero: '072000031',
11
+ numero: '00003',
12
+ documento: 6969,
13
+ documento_sacado: '82136760505',
14
+ nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
15
+ endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
16
+ bairro_sacado: 'São josé dos quatro apostolos magros',
17
+ cep_sacado: '12345678',
18
+ cidade_sacado: 'Santa rita de cássia maria da silva',
19
+ uf_sacado: 'RJ'
20
+ )
21
+ end
22
+
23
+ let(:params) do
24
+ {
25
+ empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
26
+ agencia: '0165',
27
+ conta_corrente: '00623',
28
+ digito_conta: '8',
29
+ documento_cedente: '74576177000177',
30
+ modalidade_carteira: '01',
31
+ posto: '02',
32
+ byte_idt: '2',
33
+ pagamentos: [pagamento]
34
+ }
35
+ end
36
+
37
+ let(:sicredi) { subject.class.new(params) }
38
+
39
+ before { Timecop.freeze(Time.local(2007, 7, 14, 16, 15, 15)) }
40
+ after { Timecop.return }
41
+
42
+ context 'validacoes' do
43
+ context '@posto' do
44
+ it 'deve ser invalido se nao possuir o valor do posto' do
45
+ objeto = subject.class.new(params.merge(posto: nil))
46
+ expect(objeto.invalid?).to be true
47
+ expect(objeto.errors.full_messages).to include('Posto não pode estar em branco.')
48
+ end
49
+
50
+ it 'deve ser invalido se o posto tiver mais de 2 dígitos' do
51
+ sicredi.posto = '123'
52
+ expect(sicredi.invalid?).to be true
53
+ expect(sicredi.errors.full_messages).to include('Posto deve ter 2 dígitos.')
54
+ end
55
+ end
56
+
57
+ context '@byte_idt' do
58
+ it 'deve ser invalido se nao possuir o valor da byte de geracao' do
59
+ objeto = subject.class.new(params.merge(byte_idt: nil))
60
+ expect(objeto.invalid?).to be true
61
+ expect(objeto.errors.full_messages).to include('Byte idt não pode estar em branco.')
62
+ end
63
+
64
+ it 'deve ser invalido se o byte idt tiver mais de 1 dígito' do
65
+ sicredi.byte_idt = '12'
66
+ expect(sicredi.invalid?).to be true
67
+ expect(sicredi.errors.full_messages)
68
+ .to include('Byte idt deve ser 1 se o numero foi gerado pela agencia ou 2-9 se foi gerado pelo beneficiário')
69
+ end
70
+ end
71
+
72
+ context '@modalidade_carteira' do
73
+ it 'deve ser invalido se nao possuir a modalidade da carteira' do
74
+ objeto = subject.class.new(params.merge(modalidade_carteira: nil))
75
+ expect(objeto.invalid?).to be true
76
+ expect(objeto.errors.full_messages).to include('Modalidade carteira não pode estar em branco.')
77
+ end
78
+ end
79
+
80
+ context '@parcela' do
81
+ it 'deve ser invalido se nao possuir a parcela' do
82
+ objeto = subject.class.new(params.merge(parcela: nil))
83
+ expect(objeto.invalid?).to be true
84
+ expect(objeto.errors.full_messages).to include('Parcela não pode estar em branco.')
85
+ end
86
+ end
87
+
88
+ context '@agencia' do
89
+ it 'deve ser invalido se a agencia tiver mais de 4 digitos' do
90
+ sicredi.agencia = '12345'
91
+ expect(sicredi.invalid?).to be true
92
+ expect(sicredi.errors.full_messages).to include('Agencia deve ter 4 dígitos.')
93
+ end
94
+ end
95
+
96
+ context '@conta_corrente' do
97
+ it 'deve ser invalido se a conta corrente tiver mais de 5 digitos' do
98
+ sicredi.conta_corrente = '123456'
99
+ expect(sicredi.invalid?).to be true
100
+ expect(sicredi.errors.full_messages).to include('Conta corrente deve ter 5 dígitos.')
101
+ end
102
+ end
103
+
104
+ context '@digito_conta' do
105
+ it 'deve ser inválido se o dígito conta não for informado' do
106
+ sicredi.digito_conta = nil
107
+ expect(sicredi.invalid?).to be true
108
+ expect(sicredi.errors.full_messages).to include('Digito conta não pode estar em branco.')
109
+ end
110
+
111
+ it 'deve ser inválido se o dígito conta tiver mais de 1 dígito' do
112
+ sicredi.digito_conta = '12'
113
+ expect(sicredi.invalid?).to be true
114
+ expect(sicredi.errors.full_messages).to include('Digito conta deve ter 1 dígito.')
115
+ end
116
+ end
117
+ end
118
+
119
+ context 'formatacoes' do
120
+ it 'codigo do banco deve ser 001' do
121
+ expect(sicredi.cod_banco).to eq '748'
122
+ end
123
+
124
+ it 'nome do banco deve ser sicredi com 30 posicoes' do
125
+ nome_banco = sicredi.nome_banco
126
+ expect(nome_banco.size).to eq 30
127
+ expect(nome_banco[0..19]).to eq 'SICREDI '
128
+ end
129
+
130
+ it 'versao do layout do arquivo deve ser 081' do
131
+ expect(sicredi.versao_layout_arquivo).to eq '081'
132
+ end
133
+
134
+ it 'versao do layout do lote deve ser 040' do
135
+ expect(sicredi.versao_layout_lote).to eq '040'
136
+ end
137
+
138
+ it 'deve calcular o digito da agencia' do
139
+ expect(sicredi.digito_agencia).to eq ' '
140
+ end
141
+
142
+ it 'deve calcular digito da conta' do
143
+ # digito calculado a partir do modulo 11 com base 9
144
+ #
145
+ # conta = 1 2 3 4 5
146
+ #
147
+ # 5 4 3 2 1
148
+ # x 9 8 7 6 5
149
+ # = 45 32 21 12 5 = 116
150
+ # 116 / 11 = 10 com resto 5
151
+ expect(sicredi.digito_conta).to eq '8'
152
+ end
153
+
154
+ it 'cod. convenio deve retornar as informacoes nas posicoes corretas' do
155
+ cod_convenio = sicredi.codigo_convenio
156
+ expect(cod_convenio[0..19]).to eq ''.rjust(20, ' ')
157
+ end
158
+
159
+ it 'info conta deve retornar as informacoes nas posicoes corretas' do
160
+ info_conta = sicredi.info_conta
161
+ expect(info_conta[0..4]).to eq '00165'
162
+ expect(info_conta[5]).to eq ' '
163
+ expect(info_conta[6..17]).to eq '000000000623'
164
+ expect(info_conta[18]).to eq '8'
165
+ end
166
+
167
+ it 'complemento header deve retornar espacos em branco' do
168
+ expect(sicredi.complemento_header).to eq ''.rjust(29, ' ')
169
+ end
170
+
171
+ it 'complemento trailer deve retornar espacos em branco com a totalização das cobranças' do
172
+ total_cobranca_simples = "".rjust(23, "0")
173
+ total_cobranca_vinculada = "".rjust(23, "0")
174
+ total_cobranca_caucionada = "".rjust(23, "0")
175
+ total_cobranca_descontada = "".rjust(23, "0")
176
+
177
+ expect(sicredi.complemento_trailer).to eq "#{total_cobranca_simples}#{total_cobranca_vinculada}"\
178
+ "#{total_cobranca_caucionada}#{total_cobranca_descontada}".ljust(217, ' ')
179
+ end
180
+
181
+ it 'formata o nosso numero' do
182
+ nosso_numero = sicredi.formata_nosso_numero "072000031"
183
+ expect(nosso_numero.strip).to eq "072000031"
184
+ end
185
+
186
+ it "data de mora deve ser após o vencimento quando informada" do
187
+ segmento_p = sicredi.monta_segmento_p(pagamento, 1, 2)
188
+
189
+ expect(segmento_p[77..84]).to eql '14072007' # data de vencimento
190
+ expect(segmento_p[118..125]).to eql '15072007' # data do juro de mora
191
+ end
192
+ end
193
+
194
+ context 'geracao remessa' do
195
+ it_behaves_like 'cnab240'
196
+
197
+ context 'arquivo' do
198
+ it { expect(sicredi.gera_arquivo).to eq(read_remessa('remessa-sicredi-cnab240.rem', sicredi.gera_arquivo)) }
199
+ end
200
+ end
201
+ end
@@ -0,0 +1,193 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Brcobranca::Remessa::Cnab240::Unicred do
5
+ let(:pagamento) do
6
+ Brcobranca::Remessa::Pagamento.new(
7
+ valor: 50.0,
8
+ data_vencimento: Date.current,
9
+ nosso_numero: '072000031',
10
+ numero: '00003',
11
+ documento: 6969,
12
+ documento_sacado: '82136760505',
13
+ nome_sacado: 'PABLO DIEGO JOSÉ FRANCISCO DE PAULA JUAN NEPOMUCENO MARÍA DE LOS REMEDIOS CIPRIANO DE LA SANTÍSSIMA TRINIDAD RUIZ Y PICASSO',
14
+ endereco_sacado: 'RUA RIO GRANDE DO SUL São paulo Minas caçapa da silva junior',
15
+ bairro_sacado: 'São josé dos quatro apostolos magros',
16
+ cep_sacado: '12345678',
17
+ cidade_sacado: 'Santa rita de cássia maria da silva',
18
+ uf_sacado: 'RJ'
19
+ )
20
+ end
21
+
22
+ let(:params) do
23
+ {
24
+ empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
25
+ agencia: '0165',
26
+ conta_corrente: '00623',
27
+ digito_conta: '8',
28
+ documento_cedente: '74576177000177',
29
+ modalidade_carteira: '01',
30
+ posto: '02',
31
+ byte_idt: '2',
32
+ pagamentos: [pagamento]
33
+ }
34
+ end
35
+
36
+ let(:unicred) { subject.class.new(params) }
37
+
38
+ before { Timecop.freeze(Time.local(2007, 7, 14, 16, 15, 15)) }
39
+ after { Timecop.return }
40
+
41
+ context 'validacoes' do
42
+ context '@posto' do
43
+ it 'deve ser invalido se nao possuir o valor do posto' do
44
+ objeto = subject.class.new(params.merge(posto: nil))
45
+ expect(objeto.invalid?).to be true
46
+ expect(objeto.errors.full_messages).to include('Posto não pode estar em branco.')
47
+ end
48
+
49
+ it 'deve ser invalido se o posto tiver mais de 2 dígitos' do
50
+ unicred.posto = '123'
51
+ expect(unicred.invalid?).to be true
52
+ expect(unicred.errors.full_messages).to include('Posto deve ter 2 dígitos.')
53
+ end
54
+ end
55
+
56
+ context '@byte_idt' do
57
+ it 'deve ser invalido se nao possuir o valor da byte de geracao' do
58
+ objeto = subject.class.new(params.merge(byte_idt: nil))
59
+ expect(objeto.invalid?).to be true
60
+ expect(objeto.errors.full_messages).to include('Byte idt não pode estar em branco.')
61
+ end
62
+
63
+ it 'deve ser invalido se o byte idt tiver mais de 1 dígito' do
64
+ unicred.byte_idt = '12'
65
+ expect(unicred.invalid?).to be true
66
+ expect(unicred.errors.full_messages)
67
+ .to include('Byte idt deve ser 1 se o numero foi gerado pela agencia ou 2-9 se foi gerado pelo beneficiário')
68
+ end
69
+ end
70
+
71
+ context '@modalidade_carteira' do
72
+ it 'deve ser invalido se nao possuir a modalidade da carteira' do
73
+ objeto = subject.class.new(params.merge(modalidade_carteira: nil))
74
+ expect(objeto.invalid?).to be true
75
+ expect(objeto.errors.full_messages).to include('Modalidade carteira não pode estar em branco.')
76
+ end
77
+ end
78
+
79
+ context '@parcela' do
80
+ it 'deve ser invalido se nao possuir a parcela' do
81
+ objeto = subject.class.new(params.merge(parcela: nil))
82
+ expect(objeto.invalid?).to be true
83
+ expect(objeto.errors.full_messages).to include('Parcela não pode estar em branco.')
84
+ end
85
+ end
86
+
87
+ context '@agencia' do
88
+ it 'deve ser invalido se a agencia tiver mais de 4 digitos' do
89
+ unicred.agencia = '12345'
90
+ expect(unicred.invalid?).to be true
91
+ expect(unicred.errors.full_messages).to include('Agencia deve ter 4 dígitos.')
92
+ end
93
+ end
94
+
95
+ context '@conta_corrente' do
96
+ it 'deve ser invalido se a conta corrente tiver mais de 5 digitos' do
97
+ unicred.conta_corrente = '123456'
98
+ expect(unicred.invalid?).to be true
99
+ expect(unicred.errors.full_messages).to include('Conta corrente deve ter 5 dígitos.')
100
+ end
101
+ end
102
+
103
+ context '@digito_conta' do
104
+ it 'deve ser inválido se o dígito conta não for informado' do
105
+ unicred.digito_conta = nil
106
+ expect(unicred.invalid?).to be true
107
+ expect(unicred.errors.full_messages).to include('Digito conta não pode estar em branco.')
108
+ end
109
+
110
+ it 'deve ser inválido se o dígito conta tiver mais de 1 dígito' do
111
+ unicred.digito_conta = '12'
112
+ expect(unicred.invalid?).to be true
113
+ expect(unicred.errors.full_messages).to include('Digito conta deve ter 1 dígito.')
114
+ end
115
+ end
116
+ end
117
+
118
+ context 'formatacoes' do
119
+ it 'codigo do banco deve ser 001' do
120
+ expect(unicred.cod_banco).to eq '748'
121
+ end
122
+
123
+ it 'nome do banco deve ser unicred com 30 posicoes' do
124
+ nome_banco = unicred.nome_banco
125
+ expect(nome_banco.size).to eq 30
126
+ expect(nome_banco[0..19]).to eq 'SICREDI '
127
+ end
128
+
129
+ it 'versao do layout do arquivo deve ser 081' do
130
+ expect(unicred.versao_layout_arquivo).to eq '081'
131
+ end
132
+
133
+ it 'versao do layout do lote deve ser 040' do
134
+ expect(unicred.versao_layout_lote).to eq '040'
135
+ end
136
+
137
+ it 'deve calcular o digito da agencia' do
138
+ expect(unicred.digito_agencia).to eq ' '
139
+ end
140
+
141
+ it 'deve calcular digito da conta' do
142
+ # digito calculado a partir do modulo 11 com base 9
143
+ #
144
+ # conta = 1 2 3 4 5
145
+ #
146
+ # 5 4 3 2 1
147
+ # x 9 8 7 6 5
148
+ # = 45 32 21 12 5 = 116
149
+ # 116 / 11 = 10 com resto 5
150
+ expect(unicred.digito_conta).to eq '8'
151
+ end
152
+
153
+ it 'cod. convenio deve retornar as informacoes nas posicoes corretas' do
154
+ cod_convenio = unicred.codigo_convenio
155
+ expect(cod_convenio[0..19]).to eq ''.rjust(20, ' ')
156
+ end
157
+
158
+ it 'info conta deve retornar as informacoes nas posicoes corretas' do
159
+ info_conta = unicred.info_conta
160
+ expect(info_conta[0..4]).to eq '00165'
161
+ expect(info_conta[5]).to eq ' '
162
+ expect(info_conta[6..17]).to eq '000000000623'
163
+ expect(info_conta[18]).to eq '8'
164
+ end
165
+
166
+ it 'complemento header deve retornar espacos em branco' do
167
+ expect(unicred.complemento_header).to eq ''.rjust(29, ' ')
168
+ end
169
+
170
+ it 'complemento trailer deve retornar espacos em branco com a totalização das cobranças' do
171
+ total_cobranca_simples = "".rjust(23, "0")
172
+ total_cobranca_vinculada = "".rjust(23, "0")
173
+ total_cobranca_caucionada = "".rjust(23, "0")
174
+ total_cobranca_descontada = "".rjust(23, "0")
175
+
176
+ expect(unicred.complemento_trailer).to eq "#{total_cobranca_simples}#{total_cobranca_vinculada}"\
177
+ "#{total_cobranca_caucionada}#{total_cobranca_descontada}".ljust(217, ' ')
178
+ end
179
+
180
+ it 'formata o nosso numero' do
181
+ nosso_numero = unicred.formata_nosso_numero "072000031"
182
+ expect(nosso_numero.strip).to eq "072000031"
183
+ end
184
+ end
185
+
186
+ context 'geracao remessa' do
187
+ it_behaves_like 'cnab240'
188
+
189
+ context 'arquivo' do
190
+ it { expect(unicred.gera_arquivo).to eq(read_remessa('remessa-unicred-cnab240.rem', unicred.gera_arquivo)) }
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,183 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe Brcobranca::Remessa::Cnab400::BancoBrasilia do
5
+ let(:pagamento) do
6
+ Brcobranca::Remessa::Pagamento.new(valor: 199.9,
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
+ uf_sacado: 'SP')
17
+ end
18
+ let(:params) do
19
+ {
20
+ carteira: '2',
21
+ agencia: '083',
22
+ conta_corrente: '0000490',
23
+ digito_conta: '1',
24
+ empresa_mae: 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA',
25
+ pagamentos: [pagamento]
26
+ }
27
+ end
28
+ let(:banco_brasilia) { 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 3 digitos' do
39
+ banco_brasilia.agencia = '1234'
40
+ expect(banco_brasilia.invalid?).to be true
41
+ expect(banco_brasilia.errors.full_messages).to include('Agencia deve ter 3 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_brasilia.digito_conta = '12'
54
+ expect(banco_brasilia.invalid?).to be true
55
+ expect(banco_brasilia.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_brasilia.conta_corrente = '12345678'
68
+ expect(banco_brasilia.invalid?).to be true
69
+ expect(banco_brasilia.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 1 dígito' do
81
+ banco_brasilia.carteira = '12'
82
+ expect(banco_brasilia.invalid?).to be true
83
+ expect(banco_brasilia.errors.full_messages).to include('Carteira deve ter 1 dígito.')
84
+ end
85
+ end
86
+ end
87
+
88
+ context 'formatacoes dos valores' do
89
+ it 'cod_banco deve ser 070' do
90
+ expect(banco_brasilia.cod_banco).to eq '070'
91
+ end
92
+
93
+ it 'info_conta deve retornar com 10 posicoes as informacoes da conta' do
94
+ info_conta = banco_brasilia.info_conta
95
+ expect(info_conta.size).to eq 10
96
+ expect(info_conta[0..2]).to eq '083' # num. da agencia
97
+ expect(info_conta[3..9]).to eq '0000490' # num. da conta
98
+ end
99
+ end
100
+
101
+ context 'monta remessa' do
102
+ # it_behaves_like 'cnab400'
103
+
104
+ context 'header' do
105
+ it 'deve ter 39 posicoes' do
106
+ expect(banco_brasilia.monta_header.size).to eq 39
107
+ end
108
+
109
+ it 'informacoes devem estar posicionadas corretamente no header' do
110
+ header = banco_brasilia.monta_header
111
+ expect(header[0..2]).to eq 'DCB' # literal DCB
112
+ expect(header[3..5]).to eq '001' # versão
113
+ expect(header[6..8]).to eq '075' # arquivo
114
+ expect(header[9..18]).to eq banco_brasilia.info_conta # informacoes da conta
115
+ expect(header[19..32]).to eq Time.now.strftime('%Y%m%d%H%M%S') # data/hora de formação
116
+ expect(header[33..38]).to eq '000002' # num. de registros
117
+ end
118
+ end
119
+
120
+ context 'detalhe' do
121
+ it 'deve ter 400 posições' do
122
+ expect(banco_brasilia.monta_detalhe(pagamento, 1).size).to eq 400
123
+ end
124
+
125
+ it 'informacoes devem estar posicionadas corretamente no detalhe' do
126
+ detalhe = banco_brasilia.monta_detalhe pagamento, 1
127
+ expect(detalhe[0..1]).to eq '01' # identificador
128
+ expect(detalhe[2..11]).to eq banco_brasilia.info_conta # info da conta
129
+ expect(detalhe[12..25]).to eq '00012345678901' # identificador
130
+ expect(detalhe[26..60]).to eq 'PABLO DIEGO JOSE FRANCISCO DE PAULA' # nome do pagador
131
+ expect(detalhe[61..95]).to eq 'RUA RIO GRANDE DO SUL Sao paulo Min' # endereço do pagador
132
+ expect(detalhe[96..110]).to eq 'Santa rita de c' # cidade do pagador
133
+ expect(detalhe[111..112]).to eq 'SP' # uf do pagador
134
+ expect(detalhe[113..120]).to eq '12345678' # cep do pagador
135
+ expect(detalhe[121..121]).to eq '1' # tipo de pessoa
136
+ expect(detalhe[122..134]).to eq "6969".rjust(13, "0") # seu numero
137
+ expect(detalhe[135..135]).to eq '2' # categoria de cobranca
138
+ expect(detalhe[136..143]).to eq Date.current.strftime('%d%m%Y') # data de emissao
139
+ expect(detalhe[144..145]).to eq '21' # tipo do documento
140
+ expect(detalhe[146..146]).to eq '0' # código da natureza
141
+ expect(detalhe[147..147]).to eq '0' # código da cond. pagamento
142
+ expect(detalhe[148..149]).to eq '02' # código da moeda
143
+ expect(detalhe[150..152]).to eq '070' # código do banco
144
+ expect(detalhe[153..156]).to eq '0083' # código da agência
145
+ expect(detalhe[157..186]).to eq ''.rjust(30, ' ') # praça de cobranca
146
+ expect(detalhe[187..194]).to eq Date.current.strftime('%d%m%Y') # data de vencimento
147
+ expect(detalhe[195..208]).to eq '00000000019990' # valor do titulo
148
+ expect(detalhe[209..220]).to eq '200012307038' # nosso numero
149
+ expect(detalhe[221..222]).to eq '00' # tipo de juros
150
+ expect(detalhe[223..236]).to eq ''.rjust(14, "0") # valor dos juros
151
+ expect(detalhe[237..250]).to eq ''.rjust(14, "0") # valor dos abatimento
152
+ expect(detalhe[251..252]).to eq '00' # tipo de desconto
153
+ expect(detalhe[253..260]).to eq ''.rjust(8, "0") # data limite de desconto
154
+ expect(detalhe[261..274]).to eq ''.rjust(14, "0") # valor dos descontos
155
+ expect(detalhe[288..327]).to eq 'SOCIEDADE BRASILEIRA DE ZOOLOGIA LTDA ' # emitente do titulo
156
+ end
157
+ end
158
+
159
+ it 'montagem da remessa deve falhar se o objeto nao for valido' do
160
+ expect { subject.class.new.gera_arquivo }.to raise_error(Brcobranca::RemessaInvalida)
161
+ end
162
+
163
+ it 'remessa deve conter os registros mais as quebras de linha' do
164
+ remessa = banco_brasilia.gera_arquivo
165
+ expect(remessa.size).to eq 845
166
+
167
+ # registros
168
+ expect(remessa[0..38]).to eq banco_brasilia.monta_header
169
+ expect(remessa[41..440]).to eq banco_brasilia.monta_detalhe(pagamento, 2).upcase
170
+
171
+ # quebras de linha
172
+ expect(remessa[39..40]).to eq "\r\n"
173
+ expect(remessa[441..442]).to eq "\r\n"
174
+ end
175
+
176
+ context 'arquivo' do
177
+ before { Timecop.freeze(Time.local(2015, 7, 14, 16, 15, 15)) }
178
+ after { Timecop.return }
179
+
180
+ it { expect(banco_brasilia.gera_arquivo).to eq(read_remessa('remessa-banco-brasilia-cnab400.rem', banco_brasilia.gera_arquivo)) }
181
+ end
182
+ end
183
+ end