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,288 @@
1
+ # encoding: utf-8
2
+ module BrBoleto
3
+ module Conta
4
+ class Base < BrBoleto::ActiveModelBase
5
+ include BrBoleto::Calculos
6
+ include BrBoleto::Helper::DefaultCodes
7
+
8
+ # ATRIBUTOS
9
+ # razao_social
10
+ # cpf_cnpj
11
+ # convenio OU codigo_cedente OU codigo_beneficiario
12
+ # convenio OU codigo_cedente_dv OU codigo_beneficiario_dv
13
+ # endereco
14
+ # carteira
15
+ # agencia
16
+ # agencia_dv
17
+ # conta_corrente
18
+ # conta_corrente_dv
19
+ # nome_banco
20
+ # modalidade
21
+
22
+ # Nome/Razão social que aparece no campo 'Cedente' no boleto.
23
+ attr_accessor :razao_social
24
+
25
+ # Documento do Cedente (CPF ou CNPJ).
26
+ attr_accessor :cpf_cnpj
27
+
28
+ # Uma carteira de cobrança define o modo como o boleto é tratado pelo banco.
29
+ # Existem duas grandes divisões: carteiras não registradas e carteiras registradas.
30
+ #
31
+ # === Carteiras Não Registradas
32
+ #
33
+ # Significa que não há registro no banco sobre os boletos gerados, ou seja, você não precisa
34
+ # notificar o banco a cada boleto gerado.
35
+ # Neste caso a cobrança de taxa bancária é feita por boleto pago.
36
+ #
37
+ # === Carteiras Registradas
38
+ #
39
+ # Você precisa notificar o banco sobre todos os boletos gerados, em geral enviando um
40
+ # arquivo chamado "arquivo de remessa".
41
+ # Neste caso, normalmente existe uma taxa bancária por boleto gerado, independentemente de ele ser pago.
42
+ # Nestas carteiras também se encaixam serviços bancários adicionais, como protesto em caso de não pagamento.
43
+ #
44
+ # <b>Campo Obrigatório</b>
45
+ #
46
+ attr_accessor :carteira
47
+
48
+ # Modalidade da carteira
49
+ # Alguns bancos utilizam campos separados para definir a modalidade e a carteira
50
+ # porém normalmente é utilizado a nomenclatura "MODALIDADE DA CARTEIRA". Quando utilizado essa
51
+ # nomenclatura apenas, e não separa a carteira da modalidade, então deve se usar apenas a carteira
52
+ #
53
+ attr_accessor :modalidade
54
+
55
+
56
+ # <b>Código do Convênio é o código do cliente, fornecido pelo banco.</b>
57
+ #
58
+ # Alguns bancos, dependendo do banco e da carteira, precisam desse campo preenchido.
59
+ # A nomenclatura para essa informação varia em cada banco, pode ser também:
60
+ # codigo_beneficiario OU codigo_cedente OU contrato
61
+ # Por isso foi criado um alias para que cada um utilize a nomenclatura que preferir.
62
+ attr_accessor :convenio
63
+ attr_accessor :convenio_dv
64
+ alias_attribute :codigo_cedente, :convenio
65
+ alias_attribute :codigo_cedente_dv, :convenio_dv
66
+ alias_attribute :codigo_beneficiario, :convenio
67
+ alias_attribute :codigo_beneficiario_dv, :convenio_dv
68
+
69
+
70
+ # Deve ser informado o endereço completo do Cedente.
71
+ #
72
+ # <b>Campo Obrigatório</b>
73
+ attr_accessor :endereco
74
+
75
+ # Número da agência. Campo auto explicativo.
76
+ #
77
+ attr_accessor :agencia
78
+ # Digito verificador da agência
79
+ attr_accessor :agencia_dv
80
+
81
+ # Número da Conta corrente. Campo auto explicativo.
82
+ attr_accessor :conta_corrente
83
+ attr_accessor :conta_corrente_dv
84
+
85
+
86
+ # Pode ser customizado o nome da conta.
87
+ # Se não passar nenhum valor irá pegar um nome padrão
88
+ # definido em cada banco
89
+ attr_accessor :nome_banco
90
+
91
+ ############################### VALIDAÇÕES DINÂMICAS ###############################
92
+ attr_accessor :valid_agencia_length
93
+ def valid_agencia_length; @valid_agencia_length ||= 4 end
94
+ validates :agencia, custom_length: {is: :valid_agencia_length}, if: :valid_agencia_length
95
+
96
+ # => Modalidade
97
+ attr_accessor :valid_modalidade_length
98
+ attr_accessor :valid_modalidade_minimum
99
+ attr_accessor :valid_modalidade_maximum
100
+ attr_accessor :valid_modalidade_required
101
+ attr_accessor :valid_modalidade_inclusion
102
+ validates :modalidade, custom_length: {is: :valid_modalidade_length}, if: :valid_modalidade_length
103
+ validates :modalidade, custom_length: {minimum: :valid_modalidade_minimum}, if: :valid_modalidade_minimum
104
+ validates :modalidade, custom_length: {maximum: :valid_modalidade_maximum}, if: :valid_modalidade_maximum
105
+ validates :modalidade, presence: true, if: :valid_modalidade_required
106
+ validates :modalidade, custom_inclusion: {in: :valid_modalidade_inclusion}, if: :valid_modalidade_inclusion
107
+
108
+ # => CARTEIRA
109
+ attr_accessor :valid_carteira_length
110
+ attr_accessor :valid_carteira_minimum
111
+ attr_accessor :valid_carteira_maximum
112
+ attr_accessor :valid_carteira_required
113
+ attr_accessor :valid_carteira_inclusion
114
+ validates :carteira, custom_length: {is: :valid_carteira_length}, if: :valid_carteira_length
115
+ validates :carteira, custom_length: {minimum: :valid_carteira_minimum}, if: :valid_carteira_minimum
116
+ validates :carteira, custom_length: {maximum: :valid_carteira_maximum}, if: :valid_carteira_maximum
117
+ validates :carteira, presence: true, if: :valid_carteira_required
118
+ validates :carteira, custom_inclusion: {in: :valid_carteira_inclusion}, if: :valid_carteira_inclusion
119
+
120
+ # => CONTA CORRENTE
121
+ attr_accessor :valid_conta_corrente_length
122
+ attr_accessor :valid_conta_corrente_minimum
123
+ attr_accessor :valid_conta_corrente_maximum
124
+ attr_accessor :valid_conta_corrente_required
125
+ validates :conta_corrente, custom_length: {is: :valid_conta_corrente_length}, if: :valid_conta_corrente_length
126
+ validates :conta_corrente, custom_length: {minimum: :valid_conta_corrente_minimum}, if: :valid_conta_corrente_minimum
127
+ validates :conta_corrente, custom_length: {maximum: :valid_conta_corrente_maximum}, if: :valid_conta_corrente_maximum
128
+ validates :conta_corrente, presence: true, if: :valid_conta_corrente_required
129
+
130
+
131
+ # => CONVÊNIO / CODIGO CEDENTE / CONTRATO / CODIGO BENEFICIÁRIO
132
+ attr_accessor :valid_convenio_length
133
+ attr_accessor :valid_convenio_minimum
134
+ attr_accessor :valid_convenio_maximum
135
+ attr_accessor :valid_convenio_required
136
+ attr_accessor :valid_convenio_inclusion
137
+ alias_attribute :valid_codigo_beneficiario_length, :valid_convenio_length
138
+ alias_attribute :valid_codigo_beneficiario_minimum, :valid_convenio_minimum
139
+ alias_attribute :valid_codigo_beneficiario_maximum, :valid_convenio_maximum
140
+ alias_attribute :valid_codigo_beneficiario_required, :valid_convenio_required
141
+ alias_attribute :valid_codigo_beneficiario_inclusion, :valid_convenio_inclusion
142
+ alias_attribute :valid_codigo_cedente_length, :valid_convenio_length
143
+ alias_attribute :valid_codigo_cedente_minimum, :valid_convenio_minimum
144
+ alias_attribute :valid_codigo_cedente_maximum, :valid_convenio_maximum
145
+ alias_attribute :valid_codigo_cedente_required, :valid_convenio_required
146
+ alias_attribute :valid_codigo_cedente_inclusion, :valid_convenio_inclusion
147
+
148
+ validates :convenio, custom_length: {is: :valid_convenio_length}, if: :valid_convenio_length
149
+ validates :convenio, custom_length: {minimum: :valid_convenio_minimum}, if: :valid_convenio_minimum
150
+ validates :convenio, custom_length: {maximum: :valid_convenio_maximum}, if: :valid_convenio_maximum
151
+ validates :convenio, presence: true, if: :valid_convenio_required
152
+ validates :convenio, custom_inclusion: {in: :valid_convenio_inclusion}, if: :valid_convenio_inclusion
153
+
154
+ # => ENDEREÇO
155
+ attr_accessor :valid_endereco_required
156
+ validates :endereco, presence: true, if: :valid_endereco_required
157
+ #####################################################################################
158
+
159
+ validates :agencia, :razao_social, :cpf_cnpj, presence: true
160
+ validates :agencia_dv, custom_length: {is: 1}
161
+
162
+ ###################### FORMATAÇÂO DE VALORES CONFORME TAMANHO ########################
163
+ def modalidade
164
+ if valid_modalidade_maximum && @modalidade.present?
165
+ @modalidade.to_s.rjust(valid_modalidade_maximum, '0')
166
+ else
167
+ @modalidade.try(:to_s)
168
+ end
169
+ end
170
+ def carteira
171
+ if valid_carteira_maximum && @carteira.present?
172
+ @carteira.to_s.rjust(valid_carteira_maximum, '0')
173
+ else
174
+ @carteira.try(:to_s)
175
+ end
176
+ end
177
+ def conta_corrente
178
+ if valid_conta_corrente_maximum && @conta_corrente.present?
179
+ @conta_corrente.to_s.rjust(valid_conta_corrente_maximum, '0')
180
+ else
181
+ @conta_corrente.try(:to_s)
182
+ end
183
+ end
184
+ def convenio
185
+ if valid_convenio_maximum && @convenio.present?
186
+ @convenio.to_s.rjust(valid_convenio_maximum, '0')
187
+ else
188
+ @convenio.try(:to_s)
189
+ end
190
+ end
191
+ def agencia
192
+ if valid_agencia_length && @agencia.present?
193
+ @agencia.to_s.rjust(valid_agencia_length, '0')
194
+ else
195
+ @agencia.try(:to_s)
196
+ end
197
+ end
198
+ #################################################################################
199
+
200
+ # Código do Banco.
201
+ # <b>Esse campo é específico para cada banco</b>.
202
+ #
203
+ # @return [String] Corresponde ao código do banco.
204
+ def codigo_banco
205
+ raise NotImplementedError.new("Not implemented #codigo_banco in #{self}.")
206
+ end
207
+
208
+ # Nome do banco.
209
+ def nome_banco
210
+ @nome_banco || raise(NotImplementedError.new("Not implemented #nome_banco in #{self}."))
211
+ end
212
+
213
+ # Dígito do código do banco.
214
+ # <b>Esse campo é específico para cada banco</b>.
215
+ #
216
+ # @return [String] Corresponde ao dígito do código do banco.
217
+ # @raise [NotImplementedError] Precisa implementar nas subclasses.
218
+ #
219
+ def codigo_banco_dv
220
+ raise NotImplementedError.new("Not implemented #codigo_banco_dv in #{self}.")
221
+ end
222
+
223
+ # Formata o código do banco com o dígito do código do banco.
224
+ # Método usado para o campo de código do banco localizado no cabeçalho do boleto.
225
+ #
226
+ # @return [String]
227
+ def codigo_banco_formatado
228
+ "#{codigo_banco}-#{codigo_banco_dv}"
229
+ end
230
+
231
+ # Agência, código do cedente ou nosso número.
232
+ # <b>Esse campo é específico para cada banco</b>.
233
+ #
234
+ # @return [String] - Corresponde aos campos "Agencia / Codigo do Cedente".
235
+ def agencia_codigo_cedente
236
+ "#{agencia} / #{codigo_cedente}"
237
+ end
238
+
239
+ # Embora o padrão seja mostrar o número da carteira no boleto,
240
+ # <b>alguns bancos</b> requerem que seja mostrado um valor diferente na carteira.
241
+ # <b>Para essas exceções, sobrescreva esse método na subclasse.</b>
242
+ #
243
+ # @return [String] retorna o número da carteira
244
+ def carteira_formatada
245
+ carteira
246
+ end
247
+
248
+ # Utiliado para sempre retornar apenas os numero dos CPF/CNPJ
249
+ # EX:
250
+ # self.cpf_cnpj = 074.756.887-98
251
+ # puts self. cpf_cnpj
252
+ # ~> '07475688798'
253
+ def cpf_cnpj
254
+ return "" unless @cpf_cnpj.present?
255
+ BrBoleto::Helper::CpfCnpj.new(@cpf_cnpj).sem_formatacao
256
+ end
257
+
258
+ # Utiliado para sempre retornar numero do CPF/CNPJ com a formatação correta
259
+ # EX:
260
+ # self.cpf_cnpj = 07475688798
261
+ # puts self.cpf_cnpj_formatado
262
+ # ~> '074.756.887-98'
263
+ def cpf_cnpj_formatado
264
+ BrBoleto::Helper::CpfCnpj.new(cpf_cnpj).com_formatacao
265
+ end
266
+
267
+ # Retorna o cpf ou cnpj com a formatação de pontos com label
268
+ # EX:
269
+ # 'CNPJ: 12.345.678/0001-88'
270
+ # 'CPF: 074.345.456-83'
271
+ def cpf_cnpj_formatado_com_label
272
+ BrBoleto::Helper::CpfCnpj.new(cpf_cnpj).formatado_com_label
273
+ end
274
+
275
+ def tipo_cpf_cnpj(tamanho = 2)
276
+ BrBoleto::Helper::CpfCnpj.new(cpf_cnpj).tipo_documento(tamanho)
277
+ end
278
+
279
+ # Versões de layout para CNAB 240
280
+ def versao_layout_arquivo_cnab_240
281
+ raise NotImplementedError.new("Not implemented #versao_layout_arquivo_cnab_240 in #{self}.")
282
+ end
283
+ def versao_layout_lote_cnab_240
284
+ raise NotImplementedError.new("Not implemented #versao_layout_lote_cnab_240 in #{self}.")
285
+ end
286
+ end
287
+ end
288
+ end
@@ -0,0 +1,109 @@
1
+ # encoding: utf-8
2
+ module BrBoleto
3
+ module Conta
4
+ class Caixa < BrBoleto::Conta::Base
5
+
6
+ # MODALIDADE CARTEIRA
7
+ # opcoes:
8
+ # 11: título Registrado emissão CAIXA
9
+ # 14: título Registrado emissão Cedente
10
+ # 21: título Sem Registro emissão CAIXA
11
+
12
+ # versão do aplicativo da caixa
13
+ attr_accessor :versao_aplicativo
14
+
15
+ ############################### VALIDAÇÕES DINÂMICAS ###############################
16
+ # Versão do aplicativo
17
+ attr_accessor :valid_versao_aplicativo_required
18
+ #####################################################################################
19
+
20
+ validates :versao_aplicativo, custom_length: { maximum: 4 }
21
+ validates :versao_aplicativo, presence: true, if: :valid_versao_aplicativo_required
22
+
23
+ def default_values
24
+ super.merge({
25
+ carteira: '14', # Com registro
26
+ valid_carteira_required: true, # <- Validação dinâmica que a modalidade é obrigatória
27
+ valid_carteira_length: 2, # <- Validação dinâmica que a modalidade deve ter 2 digitos
28
+ valid_carteira_inclusion: %w[11 14 21], # <- Validação dinâmica de valores aceitos para a modalidade
29
+ valid_convenio_required: true, # <- Validação que a convenio deve ter obrigatório
30
+ valid_convenio_maximum: 6, # <- Validação que a convenio deve ter no máximo 6 digitos
31
+ versao_aplicativo: '0',
32
+ })
33
+ end
34
+
35
+ def codigo_banco
36
+ '104'
37
+ end
38
+
39
+ # Dígito do código do banco descrito na documentação
40
+ def codigo_banco_dv
41
+ '0'
42
+ end
43
+
44
+ def nome_banco
45
+ @nome_banco ||= 'CAIXA ECONOMICA FEDERAL'
46
+ end
47
+
48
+ def versao_layout_arquivo_cnab_240
49
+ '050'
50
+ end
51
+
52
+ def versao_layout_lote_cnab_240
53
+ '030'
54
+ end
55
+
56
+ def agencia_dv
57
+ # utilizando a agencia com 4 digitos
58
+ # para calcular o digito
59
+ @agencia_dv ||= BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(agencia).to_s
60
+ end
61
+
62
+ def conta_corrente_dv
63
+ @conta_corrente_dv ||= BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(conta_corrente).to_s
64
+ end
65
+
66
+ def convenio_dv
67
+ @convenio_dv ||= BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(convenio).to_s
68
+ end
69
+
70
+ def versao_aplicativo
71
+ "#{@versao_aplicativo}".rjust(4, '0') if @versao_aplicativo.present?
72
+ end
73
+
74
+ # Formata a carteira dependendo se ela é registrada ou não.
75
+ #
76
+ # Para cobrança COM registro usar: <b>RG</b>
77
+ # Para Cobrança SEM registro usar: <b>SR</b>
78
+ #
79
+ # @return [String]
80
+ #
81
+ def carteira_formatada
82
+ if carteira.in?(carteiras_com_registro)
83
+ 'RG'
84
+ else
85
+ 'SR'
86
+ end
87
+ end
88
+
89
+ # Retorna as carteiras com registro da Caixa Econômica Federal.
90
+ # <b>Você pode sobrescrever esse método na subclasse caso exista mais
91
+ # carteiras com registro na Caixa Econômica Federal.</b>
92
+ #
93
+ # @return [Array]
94
+ #
95
+ def carteiras_com_registro
96
+ %w(14)
97
+ end
98
+
99
+ # Campo Agência / Código do Cedente
100
+ #
101
+ # @return [String]
102
+ #
103
+ def agencia_codigo_cedente
104
+ "#{agencia} / #{codigo_cedente}-#{codigo_cedente_dv}"
105
+ end
106
+
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+ module BrBoleto
3
+ module Conta
4
+ class Sicoob < BrBoleto::Conta::Base
5
+
6
+ # MODALIDADE
7
+ # O banco siccob utiliza a combinação da carteira e modalidade para
8
+ # saber se é um pagamento com registro, sem registrou ou caucionada.
9
+ # Carteira / Modalidade = Tipo de pagamento
10
+ # 1 / 01 = Simples com Registro
11
+ # 1 / 02 = Simples sem Registro
12
+ # 3 / 03 = Garantia caicionada
13
+
14
+ def default_values
15
+ super.merge({
16
+ carteira: '1', # Simples
17
+ modalidade: '01', # Com registro
18
+ valid_modalidade_required: true, # <- Validação dinâmica que a modalidade é obrigatória
19
+ valid_modalidade_length: 2, # <- Validação dinâmica que a modalidade deve ter 2 digitos
20
+ valid_modalidade_inclusion: %w[01 02 03], # <- Validação dinâmica de valores aceitos para a modalidade
21
+ valid_carteira_required: true, # <- Validação dinâmica que a carteira é obrigatória
22
+ valid_carteira_length: 1, # <- Validação dinâmica que a carteira deve ter 1 digito
23
+ valid_carteira_inclusion: %w[1 3], # <- Validação dinâmica de valores aceitos para a carteira
24
+ valid_conta_corrente_required: true, # <- Validação dinâmica que a conta_corrente é obrigatória
25
+ valid_conta_corrente_maximum: 8, # <- Validação que a conta_corrente deve ter no máximo 8 digitos
26
+ valid_codigo_cedente_maximum: 6, # <- Validação que a codigo_cedente/convênio deve ter no máximo 7 digitos
27
+ })
28
+ end
29
+
30
+ def codigo_banco
31
+ '756'
32
+ end
33
+
34
+ # Dígito do código do banco descrito na documentação
35
+ def codigo_banco_dv
36
+ '0'
37
+ end
38
+
39
+ def nome_banco
40
+ @nome_banco ||= 'SICOOB'
41
+ end
42
+
43
+ def versao_layout_arquivo_cnab_240
44
+ '081'
45
+ end
46
+
47
+ def versao_layout_lote_cnab_240
48
+ '040'
49
+ end
50
+
51
+ def agencia_dv
52
+ # utilizando a agencia com 4 digitos
53
+ # para calcular o digito
54
+ @agencia_dv ||= BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(agencia).to_s
55
+ end
56
+
57
+ def conta_corrente_dv
58
+ # utilizando a conta corrente com 5 digitos
59
+ # para calcular o digito
60
+ @conta_corrente_dv ||= BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(conta_corrente).to_s
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,33 @@
1
+ module BrBoleto
2
+ module Helper
3
+ module DefaultCodes
4
+
5
+ # "Espécie do Título :
6
+ def get_especie_titulo(code)
7
+ "#{code}".adjust_size_to(2, '0', :right)
8
+ equivalent_especie_titulo[code] || '99'
9
+ end
10
+ def equivalent_especie_titulo
11
+ {
12
+ '01' => '01', # Duplicata Mercantil
13
+ '02' => '02', # Nota Promissória
14
+ '03' => '03', # Nota de Seguro
15
+ '05' => '05', # Recibo
16
+ '06' => '06', # Duplicata Rural
17
+ '08' => '08', # Letra de Câmbio
18
+ '09' => '09', # Warrant
19
+ '10' => '10', # Cheque
20
+ '12' => '12', # Duplicata de Serviço
21
+ '13' => '13', # Nota de Débito
22
+ '14' => '14', # Triplicata Mercantil
23
+ '15' => '15', # Triplicata de Serviço
24
+ '18' => '18', # Fatura
25
+ '20' => '20', # Apólice de Seguro
26
+ '21' => '21', # Mensalidade Escolar
27
+ '22' => '22', # Parcela de Consórcio
28
+ '99' => '99', # Outros"
29
+ }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -11,6 +11,7 @@ module BrBoleto
11
11
 
12
12
  def string_to_date(value, format = "%d%m%Y")
13
13
  return value if value.is_a?(Date)
14
+ format = '%d%m%y' if value.strip.size == 6
14
15
  begin Date.strptime(value, format) rescue nil end
15
16
  end
16
17
  end
@@ -10,6 +10,36 @@ module BrBoleto
10
10
  sprintf('%.2f', @numero).delete('.').rjust(size, '0')
11
11
  end
12
12
 
13
+ # Formata o valor percentual.
14
+ # Exemplos:
15
+ # 1 -
16
+ # @numero = 2.5 (%)
17
+ # formata_valor_percentual(6)
18
+ # Resultado: 025000
19
+ # 2 -
20
+ # @numero = 12.34 (%)
21
+ # formata_valor_percentual(4)
22
+ # Resultado: 1234
23
+ #
24
+ def formata_valor_percentual(size=6)
25
+ return ''.rjust(size, '0') if @numero.blank?
26
+ if @numero >= 10
27
+ sprintf("%.#{size-2}f", @numero).delete('.').adjust_size_to(size, '0')
28
+ else
29
+ sprintf("0%.#{size-2}f", @numero).delete('.').adjust_size_to(size, '0')
30
+ end
31
+ end
32
+
33
+ # Retorna o percentual que o @numero representa do total
34
+ # Exemplo:
35
+ # @numero = 407.5
36
+ # get_percent_by_total(4750.68, precision=2)
37
+ # Resultado => 8.58 %
38
+ # Ou seja, R$ 407.5 Representa uma fatia de 8.58% de R$ 4750.68
39
+ def get_percent_by_total(total, precision=6)
40
+ (@numero.to_f*100.0/total.to_f).round(precision.to_i)
41
+ end
42
+
13
43
  end
14
44
  end
15
45
  end
@@ -0,0 +1,82 @@
1
+ # encoding: utf-8
2
+ module BrBoleto
3
+ class Pagador < BrBoleto::ActiveModelBase
4
+ attr_accessor :nome
5
+ attr_accessor :cpf_cnpj
6
+ attr_accessor :endereco
7
+ attr_accessor :bairro
8
+ attr_accessor :cep
9
+ attr_accessor :cidade
10
+ attr_accessor :uf
11
+
12
+ attr_accessor :nome_avalista
13
+ attr_accessor :documento_avalista
14
+
15
+ ###################### CUSTOM VALIDATIONS #################
16
+ attr_accessor :valid_endereco_required
17
+ validates :endereco, :bairro, :cep, :cidade, :uf, presence: true, if: :valid_endereco_required
18
+ ###########################################################
19
+
20
+ validates :nome, :cpf_cnpj, presence: true
21
+
22
+ def endereco_formatado
23
+ addr = []
24
+ addr << endereco unless endereco.blank?
25
+ addr << bairro unless bairro.blank?
26
+ addr << @cep unless cep.blank?
27
+ addr << "#{cidade}-#{uf}" unless cidade.blank?
28
+ addr.join(' - ')
29
+ end
30
+
31
+ def cep
32
+ "#{@cep}".only_numbers
33
+ end
34
+
35
+ def cpf_cnpj
36
+ BrBoleto::Helper::CpfCnpj.new(@cpf_cnpj).sem_formatacao
37
+ end
38
+
39
+ def tipo_cpf_cnpj(tamanho = 2)
40
+ BrBoleto::Helper::CpfCnpj.new(cpf_cnpj).tipo_documento(tamanho)
41
+ end
42
+ # Utiliado para sempre retornar numero do CPF/CNPJ com a formatação correta
43
+ # EX:
44
+ # self.cpf_cnpj = 07475688798
45
+ # puts self.cpf_cnpj_formatado
46
+ # ~> '074.756.887-98'
47
+ def cpf_cnpj_formatado
48
+ BrBoleto::Helper::CpfCnpj.new(cpf_cnpj).com_formatacao
49
+ end
50
+
51
+ # Retorna o cpf ou cnpj com a formatação de pontos com label
52
+ # EX:
53
+ # 'CNPJ: 12.345.678/0001-88'
54
+ # 'CPF: 074.345.456-83'
55
+ def cpf_cnpj_formatado_com_label
56
+ BrBoleto::Helper::CpfCnpj.new(cpf_cnpj).formatado_com_label
57
+ end
58
+
59
+ def tipo_documento_avalista(tamanho = 2)
60
+ BrBoleto::Helper::CpfCnpj.new(documento_avalista).tipo_documento(tamanho)
61
+ end
62
+ def documento_avalista
63
+ BrBoleto::Helper::CpfCnpj.new(@documento_avalista).sem_formatacao
64
+ end
65
+ # Utiliado para sempre retornar numero do CPF/CNPJ com a formatação correta
66
+ # EX:
67
+ # self.documento_avalista = 07475688798
68
+ # puts self.documento_avalista_formatado
69
+ # ~> '074.756.887-98'
70
+ def documento_avalista_formatado
71
+ BrBoleto::Helper::CpfCnpj.new(documento_avalista).com_formatacao
72
+ end
73
+
74
+ # Retorna o cpf ou cnpj com a formatação de pontos com label
75
+ # EX:
76
+ # 'CNPJ: 12.345.678/0001-88'
77
+ # 'CPF: 074.345.456-83'
78
+ def documento_avalista_formatado_com_label
79
+ BrBoleto::Helper::CpfCnpj.new(documento_avalista).formatado_com_label
80
+ end
81
+ end
82
+ end