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