br_boleto 1.2.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -23,51 +23,34 @@ module BrBoleto
23
23
  #
24
24
  #
25
25
  class Caixa < Base
26
- #Modalidades de cobranças válidas conforme a documentação
27
- def self.modalidade_cobranca_validas
28
- %w(1 2)
29
- end
30
26
 
31
- def deve_validar_modalidade_cobranca?
32
- true
27
+ def conta_class
28
+ BrBoleto::Conta::Caixa
33
29
  end
34
30
 
35
- # Tamanho máximo de uma agência na Caixa Econômica Federal.
36
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
37
- #
38
- # @return [Fixnum] 4
39
- #
40
- def self.tamanho_maximo_agencia
41
- 4
42
- end
31
+ ################# VALIDAÇÕES DINÂMICAS #################
32
+ def valid_numero_documento_maximum
33
+ 15
34
+ end
43
35
 
44
- # Tamanho máximo do código do cedente emitido no Boleto.
45
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
46
- #
47
- # @return [Fixnum] 6
48
- #
49
- def self.tamanho_maximo_codigo_cedente
50
- 6
51
- end
36
+ # Tamanho máximo para o codigo_cedente/Convênio
37
+ def valid_convenio_maximum
38
+ 6
39
+ end
52
40
 
53
- # Tamanho máximo do numero do documento no Boleto.
54
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
55
- #
56
- # @return [Fixnum] 15
57
- #
58
- def self.tamanho_maximo_numero_documento
59
- 15
60
- end
41
+ # codigo_cedente/Convênio deve ser obrigatório
42
+ def valid_convenio_required
43
+ true
44
+ end
61
45
 
62
- # <b>Carteiras suportadas.</b>
63
- #
64
- # <b>Método criado para validar se a carteira informada é suportada.</b>
65
- #
66
- # @return [Array]
67
- #
68
- def self.carteiras_suportadas
69
- %w(14 24)
70
- end
46
+ # Carteira deve ter 2 digitos
47
+ def valid_carteira_length
48
+ 2
49
+ end
50
+ def valid_carteira_inclusion
51
+ %w{14 24}
52
+ end
53
+ ##########################################################
71
54
 
72
55
  # Conforme descrito na documentação, o valor que deve constar em local do pagamento é
73
56
  # "PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE"
@@ -78,70 +61,8 @@ module BrBoleto
78
61
  })
79
62
  end
80
63
 
81
- # Validações para os campos abaixo:
82
- #
83
- # * Agencia
84
- # * Codigo Cedente
85
- # * Número do documento
86
- #
87
- # Se você quiser sobrescrever os metodos, <b>ficará a sua responsabilidade.</b>
88
- # Basta você sobrescrever os métodos de validação:
89
- #
90
- # class Caixa < BrBoleto::Core::Caixa
91
- # def self.tamanho_maximo_agencia
92
- # 6
93
- # end
94
- #
95
- # def self.tamanho_maximo_codigo_cedente
96
- # 9
97
- # end
98
- #
99
- # def self.tamanho_maximo_numero_documento
100
- # 10
101
- # end
102
- # end
103
- #
104
- # Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
105
- # Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
106
- # sobreescritos também).
107
- #
108
- validates :agencia, :codigo_cedente, presence: true
109
-
110
- validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
111
- validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
112
- validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
113
-
114
- validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
115
-
116
- # @return [String] Código do Banco descrito na documentação.
117
- #
118
- def codigo_banco
119
- '104'
120
- end
121
-
122
- # @return [String] Dígito do código do banco descrito na documentação.
123
- #
124
- def digito_codigo_banco
125
- '0'
126
- end
127
-
128
- # Campo Agência / Código do Cedente
129
- #
130
- # @return [String]
131
- #
132
- def agencia_codigo_cedente
133
- "#{agencia} / #{codigo_cedente}-#{digito_verificador_codigo_cedente}"
134
- end
135
-
136
- def digito_verificador_codigo_cedente
137
- BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(codigo_cedente)
138
- end
139
- def digito_verificador_codigo_beneficiario
140
- digito_verificador_codigo_cedente
141
- end
142
-
143
64
  def digito_verificador_nosso_numero
144
- BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new("#{carteira}#{numero_documento}")
65
+ BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new("#{conta.carteira}#{numero_documento}")
145
66
  end
146
67
 
147
68
  # Mostra o campo nosso número calculando o dígito verificador do nosso número.
@@ -149,7 +70,7 @@ module BrBoleto
149
70
  # @return [String]
150
71
  #
151
72
  def nosso_numero
152
- "#{carteira}#{numero_documento}-#{digito_verificador_nosso_numero}"
73
+ "#{conta.carteira}#{numero_documento}-#{digito_verificador_nosso_numero}"
153
74
  end
154
75
 
155
76
 
@@ -170,17 +91,7 @@ module BrBoleto
170
91
  # @return [String]
171
92
  #
172
93
  def tipo_cobranca
173
- carteira[0] if carteira.present?
174
- end
175
-
176
- # Modalidade de cobrança
177
- # As vezes é chamado de modalidade de cobrança e as vezes é chamado de tipo de cobrança
178
- # Por isso foi criado o metodo modalidade_cobrança que é a mesma coisa que o tipo_cobranca
179
- #
180
- # @return [String]
181
- #
182
- def modalidade_cobranca
183
- tipo_cobranca
94
+ conta.carteira[0] if conta.carteira.present?
184
95
  end
185
96
 
186
97
  # O Identificado de Emissão é o 2° e ultimo caracter da carteira
@@ -189,35 +100,9 @@ module BrBoleto
189
100
  # @return [String]
190
101
  #
191
102
  def identificador_de_emissao
192
- carteira.last if carteira.present?
193
- end
194
-
195
- # Formata a carteira dependendo se ela é registrada ou não.
196
- #
197
- # Para cobrança COM registro usar: <b>RG</b>
198
- # Para Cobrança SEM registro usar: <b>SR</b>
199
- #
200
- # @return [String]
201
- #
202
- def carteira_formatada
203
- if carteira.in?(carteiras_com_registro)
204
- 'RG'
205
- else
206
- 'SR'
207
- end
103
+ conta.carteira.last if conta.carteira.present?
208
104
  end
209
105
 
210
- # Retorna as carteiras com registro da Caixa Econômica Federal.
211
- # <b>Você pode sobrescrever esse método na subclasse caso exista mais
212
- # carteiras com registro na Caixa Econômica Federal.</b>
213
- #
214
- # @return [Array]
215
- #
216
- def carteiras_com_registro
217
- %w(14)
218
- end
219
-
220
-
221
106
  # === Código de barras do banco
222
107
  #
223
108
  # ________________________________________________________________________________________
@@ -243,8 +128,8 @@ module BrBoleto
243
128
 
244
129
  def composicao_codigo_barras
245
130
  return @composicao_codigo_barras if @composicao_codigo_barras
246
- @composicao_codigo_barras = "#{codigo_beneficiario}"
247
- @composicao_codigo_barras << "#{digito_verificador_codigo_beneficiario}"
131
+ @composicao_codigo_barras = "#{conta.codigo_cedente}"
132
+ @composicao_codigo_barras << "#{conta.codigo_cedente_dv}"
248
133
  @composicao_codigo_barras << "#{nosso_numero_de_3_a_5}"
249
134
  @composicao_codigo_barras << "#{tipo_cobranca}"
250
135
  @composicao_codigo_barras << "#{nosso_numero_de_6_a_8}"
@@ -9,115 +9,32 @@ module BrBoleto
9
9
  # 'documentacoes_dos_boletos/sicoob' dentro dessa biblioteca.
10
10
  #
11
11
  class Sicoob < Base
12
- # === Carteira/Modalidade:
13
- #
14
- # '1/01' - Simples com registro
15
- # '1/02' - Simples sem registro
16
- # '3/03' - Garantida Caucionada
17
- #
18
- attr_accessor :modalidade_cobranca
19
-
20
- def modalidade_cobranca
21
- if @modalidade_cobranca.present?
22
- @modalidade_cobranca.to_s.rjust(2, '0')
23
- else
24
- '01'
25
- end
26
- end
27
-
28
- #Modalidades de cobranças válidas conforme a documentação
29
- def self.modalidade_cobranca_validas
30
- %{'01' '02' '03'}
31
- end
32
-
33
- def deve_validar_modalidade_cobranca?
34
- true
12
+ def conta_class
13
+ BrBoleto::Conta::Sicoob
35
14
  end
36
15
 
37
- # Quantidade de parcelas que o boleto possui
38
- # Liberando a possibilidade de edição
39
- attr_accessor :parcelas
40
- def parcelas
41
- if @parcelas.present?
42
- @parcelas.to_s.rjust(3, '0')
43
- else
44
- '001'
16
+ ################# VALIDAÇÕES DINÂMICAS #################
17
+ def valid_numero_documento_maximum
18
+ 7
19
+ end
20
+ def valid_modalidade_inclusion
21
+ %w{01 02 03}
45
22
  end
46
- end
47
-
48
-
49
- # Tamanho máximo de uma agência no Banco Sicoob.
50
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
51
- #
52
- # @return [Fixnum] 4
53
- #
54
- def self.tamanho_maximo_agencia
55
- 4
56
- end
57
-
58
- # Tamanho máximo do codigo cedente no Banco Sicoob.
59
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
60
- #
61
- # @return [Fixnum] 7
62
- #
63
- def self.tamanho_maximo_codigo_cedente
64
- 7
65
- end
66
-
67
- # Tamanho máximo do numero do documento no Boleto.
68
- # <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
69
- #
70
- # @return [Fixnum] 6
71
- #
72
- def self.tamanho_maximo_numero_documento
73
- 7
74
- end
75
-
76
- # <b>Carteiras suportadas.</b>
77
- #
78
- # <b>Método criado para validar se a carteira informada é suportada.</b>
79
- #
80
- # @return [Array]
81
- #
82
- def self.carteiras_suportadas
83
- %w[1 3]
84
- end
85
-
86
- # Validações para os campos abaixo:
87
- #
88
- # * Agencia
89
- # * Codigo Cedente
90
- # * Número do documento
91
- #
92
- # Se você quiser sobrescrever os metodos, <b>ficará a sua responsabilidade.</b>
93
- # Basta você sobrescrever os métodos de validação:
94
- #
95
- # class Sicoob < BrBoleto::Core::Sicoob
96
- # def self.tamanho_maximo_agencia
97
- # 6
98
- # end
99
- #
100
- # def self.tamanho_maximo_codigo_cedente
101
- # 9
102
- # end
103
- #
104
- # def self.tamanho_maximo_numero_documento
105
- # 10
106
- # end
107
- # end
108
- #
109
- # Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
110
- # Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
111
- # sobreescritos também).
112
- #
113
- validates :agencia, :codigo_cedente, presence: true
114
23
 
115
- validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
116
- validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
117
- validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
24
+ def valid_carteira_inclusion
25
+ %w[1 3]
26
+ end
27
+
28
+ # Tamanho máximo para o codigo_cedente/Convênio
29
+ def valid_convenio_maximum
30
+ 6
31
+ end
118
32
 
119
- validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
120
- validates :modalidade_cobranca, inclusion: { in: ->(object) { object.class.modalidade_cobranca_validas } }, if: :deve_validar_modalidade_cobranca?
33
+ # codigo_cedente/Convênio deve ser obrigatório
34
+ def valid_convenio_required
35
+ true
36
+ end
37
+ ##########################################################
121
38
 
122
39
  def default_values
123
40
  super.merge({
@@ -125,26 +42,6 @@ module BrBoleto
125
42
  })
126
43
  end
127
44
 
128
- # @return [String] Código do Banco descrito na documentação.
129
- #
130
- def codigo_banco
131
- '756'
132
- end
133
-
134
- # @return [String] Dígito do código do banco descrito na documentação.
135
- #
136
- def digito_codigo_banco
137
- '0'
138
- end
139
-
140
- # Campo Agência / Código do Cedente
141
- #
142
- # @return [String]
143
- #
144
- def agencia_codigo_cedente
145
- "#{agencia} / #{codigo_cedente}"
146
- end
147
-
148
45
  # O nosso número descrino na documentação é formado pelo numero do documento mais o digito
149
46
  # verificador no nosso_numero, que é um cálculo descrito na documentação.
150
47
  #
@@ -154,24 +51,6 @@ module BrBoleto
154
51
  "#{numero_documento}-#{digito_verificador_nosso_numero}"
155
52
  end
156
53
 
157
- # Tipo de cobrança
158
- # Ex: :com_registro, :sem_registro, :garantia_caucionada
159
- #
160
- # Obs: O VALOR DESSE METODO NÃO INFLUÊNCIA NA GERAÇÃO DO BOLETO
161
- # É APENAS PARA QUESTÃO DE INFORMAÇÃO CASO PRECISE PARA OUTRAS COISAS.
162
- #
163
- def tipo_cobranca_formatada
164
- case "#{modalidade_cobranca}".rjust(2, "0")
165
- when '01'
166
- :com_registro
167
- when '02'
168
- :sem_registro
169
- when '03'
170
- :caucionada
171
- end
172
- end
173
-
174
-
175
54
  # === Código de barras do banco
176
55
  #
177
56
  # ___________________________________________________________
@@ -184,15 +63,16 @@ module BrBoleto
184
63
  # | 34 - 41 | 08 | Nosso Número do título |
185
64
  # | 42 - 44 | 03 | Número da Parcela do Título (001) |
186
65
  # |___________________________________________________________|
66
+ # Tamanho total: 25
187
67
  #
188
68
  # @return [String]
189
69
  #
190
70
  def codigo_de_barras_do_banco
191
- "#{carteira}#{agencia}#{modalidade_cobranca}#{codigo_cedente}#{nosso_numero.gsub('-','')}#{parcelas}"
71
+ "#{conta.carteira}#{conta.agencia}#{conta.modalidade}#{conta.codigo_cedente}#{conta.codigo_cedente_dv}#{nosso_numero.gsub('-','')}#{parcelas}"
192
72
  end
193
73
 
194
74
  def digito_verificador_nosso_numero
195
- BrBoleto::Calculos::Modulo11Fator3197.new("#{agencia}#{codigo_cedente.rjust(10, '0')}#{numero_documento}")
75
+ BrBoleto::Calculos::Modulo11Fator3197.new("#{conta.agencia}#{conta.codigo_cedente.rjust(9, '0')}#{conta.codigo_cedente_dv}#{numero_documento}")
196
76
  end
197
77
  end
198
78
  end