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
@@ -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