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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.markdown +278 -98
- data/br_boleto.gemspec +5 -3
- data/lib/br_boleto/active_model_base.rb +1 -1
- data/lib/br_boleto/association/have_conta.rb +109 -0
- data/lib/br_boleto/association/have_pagador.rb +38 -0
- data/lib/br_boleto/association/have_pagamentos.rb +44 -0
- data/lib/br_boleto/boleto/base.rb +50 -379
- data/lib/br_boleto/boleto/caixa.rb +28 -143
- data/lib/br_boleto/boleto/sicoob.rb +24 -144
- data/lib/br_boleto/conta/base.rb +288 -0
- data/lib/br_boleto/conta/caixa.rb +109 -0
- data/lib/br_boleto/conta/sicoob.rb +64 -0
- data/lib/br_boleto/helper/default_codes.rb +33 -0
- data/lib/br_boleto/helper/format_value.rb +1 -0
- data/lib/br_boleto/helper/number.rb +30 -0
- data/lib/br_boleto/pagador.rb +82 -0
- data/lib/br_boleto/remessa/base.rb +28 -50
- data/lib/br_boleto/remessa/cnab240/base.rb +22 -131
- data/lib/br_boleto/remessa/cnab240/caixa.rb +16 -62
- data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +7 -7
- data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +6 -6
- data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +22 -22
- data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +16 -16
- data/lib/br_boleto/remessa/cnab240/helper/segmento_r.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/segmento_s.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/helper/trailer_lote.rb +3 -3
- data/lib/br_boleto/remessa/cnab240/sicoob.rb +36 -73
- data/lib/br_boleto/remessa/cnab400/base.rb +95 -0
- data/lib/br_boleto/remessa/cnab400/helper/detalhe.rb +136 -0
- data/lib/br_boleto/remessa/cnab400/helper/header.rb +114 -0
- data/lib/br_boleto/remessa/cnab400/helper/trailer.rb +50 -0
- data/lib/br_boleto/remessa/cnab400/sicoob.rb +249 -0
- data/lib/br_boleto/remessa/lote.rb +1 -23
- data/lib/br_boleto/remessa/pagamento.rb +188 -51
- data/lib/br_boleto/retorno/base.rb +9 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +2 -10
- data/lib/br_boleto/retorno/cnab400/base.rb +48 -0
- data/lib/br_boleto/retorno/cnab400/sicoob.rb +42 -0
- data/lib/br_boleto/retorno/pagamento.rb +12 -6
- data/lib/br_boleto/string_methods.rb +8 -2
- data/lib/br_boleto/validations.rb +19 -0
- data/lib/br_boleto/version.rb +3 -3
- data/lib/br_boleto.rb +38 -8
- data/lib/config/locales/br-boleto-en.yml +89 -0
- data/lib/config/locales/br-boleto-pt-BR.yml +89 -0
- data/test/br_boleto/association/have_conta_test.rb +319 -0
- data/test/br_boleto/association/have_pagador_test.rb +110 -0
- data/test/br_boleto/association/have_pagamentos_test.rb +113 -0
- data/test/br_boleto/boleto/base_test.rb +127 -201
- data/test/br_boleto/boleto/caixa_test.rb +58 -72
- data/test/br_boleto/boleto/sicoob_test.rb +88 -147
- data/test/br_boleto/conta/base_test.rb +490 -0
- data/test/br_boleto/conta/caixa_test.rb +154 -0
- data/test/br_boleto/conta/sicoob_test.rb +144 -0
- data/test/br_boleto/helper/number_test.rb +29 -0
- data/test/br_boleto/pagador_test.rb +158 -0
- data/test/br_boleto/remessa/base_test.rb +37 -62
- data/test/br_boleto/remessa/cnab240/base_test.rb +75 -95
- data/test/br_boleto/remessa/cnab240/caixa_test.rb +61 -96
- data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +11 -11
- data/test/br_boleto/remessa/cnab240/helper/header_lote_test.rb +8 -8
- data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +17 -15
- data/test/br_boleto/remessa/cnab240/helper/segmento_q_test.rb +13 -13
- data/test/br_boleto/remessa/cnab240/helper/segmento_r_test.rb +2 -2
- data/test/br_boleto/remessa/cnab240/helper/segmento_s_test.rb +3 -3
- data/test/br_boleto/remessa/cnab240/helper/trailer_arquivo_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/helper/trailer_lote_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/sicoob_test.rb +136 -131
- data/test/br_boleto/remessa/cnab400/base_test.rb +263 -0
- data/test/br_boleto/remessa/cnab400/sicoob_test.rb +179 -0
- data/test/br_boleto/remessa/lote_test.rb +2 -41
- data/test/br_boleto/remessa/pagamento_test.rb +186 -188
- data/test/br_boleto/retorno/base_test.rb +0 -1
- data/test/br_boleto/retorno/cnab240/base_test.rb +12 -11
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +11 -11
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +11 -11
- data/test/br_boleto/retorno/cnab400/sicoob_test.rb +227 -0
- data/test/br_boleto/retorno/pagamento_test.rb +6 -6
- data/test/factories/boleto/base.rb +9 -7
- data/test/factories/boleto/boleto_caixa.rb +2 -9
- data/test/factories/boleto/boleto_sicoob.rb +10 -8
- data/test/factories/conta/base.rb +10 -0
- data/test/factories/conta/caixa.rb +15 -0
- data/test/factories/conta/sicoob.rb +16 -0
- data/test/factories/pagador.rb +15 -0
- data/test/factories/remessa/base.rb +0 -6
- data/test/factories/remessa/cnab240/base.rb +0 -10
- data/test/factories/remessa/cnab240/caixa.rb +1 -6
- data/test/factories/remessa/cnab240/sicoob.rb +1 -10
- data/test/factories/remessa/cnab400/base.rb +8 -0
- data/test/factories/remessa/cnab400/sicoob.rb +8 -0
- data/test/factories/remessa/pagamento.rb +8 -7
- data/test/fixtures/remessa/cnab240/sicoob.rem +8 -0
- data/test/{files → fixtures}/retorno/cnab240/caixa.ret +0 -0
- data/test/{files → fixtures}/retorno/cnab240/padrao240.ret +0 -0
- data/test/fixtures/retorno/cnab400/sicoob.ret +7 -0
- data/test/inheritance/boleto_test.rb +4 -1
- data/test/inheritance/sicoob_test.rb +23 -7
- data/test/test_helper.rb +70 -0
- 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
|
@@ -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
|