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
|
@@ -2,7 +2,13 @@
|
|
|
2
2
|
module BrBoleto
|
|
3
3
|
module Remessa
|
|
4
4
|
class Pagamento < BrBoleto::ActiveModelBase
|
|
5
|
+
|
|
6
|
+
# conté o metodo 'pagador'
|
|
7
|
+
# CNAB: 240 e 400
|
|
8
|
+
include BrBoleto::HavePagador
|
|
9
|
+
|
|
5
10
|
# <b>REQUERIDO</b>: nosso numero
|
|
11
|
+
# CNAB: 240 e 400
|
|
6
12
|
attr_accessor :nosso_numero
|
|
7
13
|
|
|
8
14
|
# <b>OPCIONAL</b>: Número do Documento de Cobrança - Número adotado e controlado pelo Cliente,
|
|
@@ -10,38 +16,21 @@ module BrBoleto
|
|
|
10
16
|
# Informação utilizada para referenciar a identificação do documento objeto de cobrança.
|
|
11
17
|
# Poderá conter número de duplicata, no caso de cobrança de duplicatas; número da apólice,
|
|
12
18
|
# no caso de cobrança de seguros, etc
|
|
19
|
+
# CNAB: 240 e 400
|
|
13
20
|
attr_accessor :numero_documento
|
|
14
21
|
|
|
15
22
|
# <b>REQUERIDO</b>: data do vencimento do boleto
|
|
23
|
+
# CNAB: 240 e 400
|
|
16
24
|
attr_accessor :data_vencimento
|
|
17
25
|
|
|
18
26
|
# <b>REQUERIDO</b>: data de emissao do boleto
|
|
27
|
+
# CNAB: 240 e 400
|
|
19
28
|
attr_accessor :data_emissao
|
|
20
29
|
|
|
21
30
|
# <b>REQUERIDO</b>: valor_documento do boleto
|
|
31
|
+
# CNAB: 240 e 400
|
|
22
32
|
attr_accessor :valor_documento
|
|
23
33
|
|
|
24
|
-
# <b>REQUERIDO</b>: documento do sacado (cliente)
|
|
25
|
-
attr_accessor :documento_sacado
|
|
26
|
-
|
|
27
|
-
# <b>REQUERIDO</b>: nome do sacado (cliente)
|
|
28
|
-
attr_accessor :nome_sacado
|
|
29
|
-
|
|
30
|
-
# <b>REQUERIDO</b>: endereco do sacado (cliente)
|
|
31
|
-
attr_accessor :endereco_sacado
|
|
32
|
-
|
|
33
|
-
# <b>REQUERIDO</b>: bairro do sacado (cliente)
|
|
34
|
-
attr_accessor :bairro_sacado
|
|
35
|
-
|
|
36
|
-
# <b>REQUERIDO</b>: CEP do sacado (cliente)
|
|
37
|
-
attr_accessor :cep_sacado
|
|
38
|
-
|
|
39
|
-
# <b>REQUERIDO</b>: cidade do sacado (cliente)
|
|
40
|
-
attr_accessor :cidade_sacado
|
|
41
|
-
|
|
42
|
-
# <b>REQUERIDO</b>: UF do sacado (cliente)
|
|
43
|
-
attr_accessor :uf_sacado
|
|
44
|
-
|
|
45
34
|
# <b>REQUERIDO</b>: Tipor de impressão
|
|
46
35
|
# 1 - Frente do Bloqueto
|
|
47
36
|
# 2 - Verso do Bloauqto
|
|
@@ -49,12 +38,6 @@ module BrBoleto
|
|
|
49
38
|
#
|
|
50
39
|
attr_accessor :tipo_impressao # Default '1'
|
|
51
40
|
|
|
52
|
-
# <b>OPCIONAL</b>: nome do avalista
|
|
53
|
-
attr_accessor :nome_avalista
|
|
54
|
-
|
|
55
|
-
# <b>OPCIONAL</b>: documento do avalista
|
|
56
|
-
attr_accessor :documento_avalista
|
|
57
|
-
|
|
58
41
|
# <b>OPCIONAL</b>: codigo da 1a instrucao
|
|
59
42
|
attr_accessor :cod_primeira_instrucao
|
|
60
43
|
|
|
@@ -62,12 +45,16 @@ module BrBoleto
|
|
|
62
45
|
attr_accessor :cod_segunda_instrucao
|
|
63
46
|
|
|
64
47
|
# <b>OPCIONAL</b>: valor da mora ao dia
|
|
48
|
+
# Dependendo do banco será o valor percentual ou valor em reais
|
|
49
|
+
# CNAB: 240 e 400
|
|
65
50
|
attr_accessor :valor_mora
|
|
66
51
|
|
|
67
52
|
# <b>OPCIONAL</b>: data limite para o desconto
|
|
53
|
+
# CNAB: 240 e 400
|
|
68
54
|
attr_accessor :data_desconto
|
|
69
55
|
|
|
70
56
|
# <b>OPCIONAL</b>: valor a ser concedido de desconto
|
|
57
|
+
# CNAB: 240 e 400
|
|
71
58
|
attr_accessor :valor_desconto
|
|
72
59
|
|
|
73
60
|
# <b>OPCIONAL</b>: codigo do desconto (para CNAB240)
|
|
@@ -91,7 +78,12 @@ module BrBoleto
|
|
|
91
78
|
# - '2' Taxa Mensal
|
|
92
79
|
# - '3' Isento
|
|
93
80
|
# - E Ainda alguns bancos como o SICOOB não conseguem seguir o padrão e usam o cód '0' para Isento
|
|
94
|
-
attr_accessor :codigo_multa, :data_multa
|
|
81
|
+
attr_accessor :codigo_multa, :data_multa
|
|
82
|
+
#CNAB 240 e 400
|
|
83
|
+
attr_accessor :valor_multa # Valor R$
|
|
84
|
+
def percentual_multa # Valor % Ex: 2.5% = 2.5
|
|
85
|
+
BrBoleto::Helper::Number.new(valor_multa).get_percent_by_total(valor_documento)
|
|
86
|
+
end
|
|
95
87
|
|
|
96
88
|
# <b>OPCIONAL</b>: Informações para Juros
|
|
97
89
|
# Código do juros pode ser:
|
|
@@ -99,22 +91,149 @@ module BrBoleto
|
|
|
99
91
|
# - '2' Taxa Mensal
|
|
100
92
|
# - '3' Isento
|
|
101
93
|
# - E Ainda alguns bancos como o SICOOB não conseguem seguir o padrão e usam o cód '0' para Isento
|
|
102
|
-
attr_accessor :codigo_juros, :data_juros
|
|
94
|
+
attr_accessor :codigo_juros, :data_juros
|
|
95
|
+
attr_accessor :valor_juros # Valor R$
|
|
96
|
+
# É calculado em base no valor do juros
|
|
97
|
+
def percentual_juros # Valor % Ex: 2.5% = 2.5
|
|
98
|
+
BrBoleto::Helper::Number.new(valor_juros).get_percent_by_total(valor_documento)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# <b>OPCIONAL</b>: Número da parquela que o pagamento representa
|
|
102
|
+
# Padrão: 1
|
|
103
|
+
# CNAB: 240 e 400
|
|
104
|
+
attr_accessor :parcela
|
|
105
|
+
|
|
106
|
+
# Tipo de Emissão: 1-Banco/Cooperativa 2-Cliente
|
|
107
|
+
# Banco Sicoob utiliza
|
|
108
|
+
# CNAB: 240 e 400
|
|
109
|
+
attr_accessor :tipo_emissao
|
|
110
|
+
|
|
111
|
+
# Comando/Identificação da cobrança/Movimento
|
|
112
|
+
# Default: '01'
|
|
113
|
+
# Exemplos de valores
|
|
114
|
+
# 01 - Registro de títulos
|
|
115
|
+
# 02 - Solicitação de baixa
|
|
116
|
+
# 03 - Pedido de débito em conta
|
|
117
|
+
# 04 - Concessão de abatimento
|
|
118
|
+
# 05 - Cancelamento de abatimento
|
|
119
|
+
# 06 - Alteração de vencimento de título
|
|
120
|
+
# 07 - Alteração do número de controle do participante
|
|
121
|
+
# 08 - Alteração do número do titulo dado pelo cedente
|
|
122
|
+
# 09 - Instrução para protestar (Nota 09)
|
|
123
|
+
# 10 - Instrução para sustar protesto
|
|
124
|
+
# 11 - Instrução para dispensar juros
|
|
125
|
+
# 12 - Alteração de nome e endereço do Sacado
|
|
126
|
+
# 16 – Alterar Juros de Mora (Vide Observações)
|
|
127
|
+
# 31 - Conceder desconto
|
|
128
|
+
# 32 - Não conceder desconto
|
|
129
|
+
# 33 - Retificar dados da concessão de desconto
|
|
130
|
+
# 34 - Alterar data para concessão de desconto
|
|
131
|
+
# 35 - Cobrar multa (Nota 11)
|
|
132
|
+
# 36 - Dispensar multa (Nota 11)
|
|
133
|
+
# 37 - Dispensar indexador
|
|
134
|
+
# 38 - Dispensar prazo limite de recebimento (Nota 11)
|
|
135
|
+
# 39 - Alterar prazo limite de recebimento (Nota 11)
|
|
136
|
+
# 40 – Alterar modalidade (Vide Observações)
|
|
137
|
+
# CNAB: 400
|
|
138
|
+
attr_accessor :identificacao_ocorrencia
|
|
139
|
+
|
|
140
|
+
# Espécie do Título:
|
|
141
|
+
# Default: 01
|
|
142
|
+
# 01 = Duplicata Mercantil
|
|
143
|
+
# 02 = Nota Promissória
|
|
144
|
+
# 03 = Nota de Seguro
|
|
145
|
+
# 05 = Recibo
|
|
146
|
+
# 06 = Duplicata Rural
|
|
147
|
+
# 08 = Letra de Câmbio
|
|
148
|
+
# 09 = Warrant
|
|
149
|
+
# 10 = Cheque
|
|
150
|
+
# 12 = Duplicata de Serviço
|
|
151
|
+
# 13 = Nota de Débito
|
|
152
|
+
# 14 = Triplicata Mercantil
|
|
153
|
+
# 15 = Triplicata de Serviço
|
|
154
|
+
# 18 = Fatura
|
|
155
|
+
# 20 = Apólice de Seguro
|
|
156
|
+
# 21 = Mensalidade Escolar
|
|
157
|
+
# 22 = Parcela de Consórcio
|
|
158
|
+
# 99 = Outros
|
|
159
|
+
# CNAB: 240 e 400
|
|
160
|
+
attr_accessor :especie_titulo
|
|
161
|
+
|
|
162
|
+
# Aceite título
|
|
163
|
+
# "0" = Sem aceite / "1" = Com aceite" / Depende de
|
|
164
|
+
# "N" = Sem aceite / "S" = Com aceite" \ cada banco
|
|
165
|
+
# "N" = Sem aceite / "A" = Com aceite" \
|
|
166
|
+
# CNAB: 240 e 400
|
|
167
|
+
# Setar true para Aceite e false para Não aceite
|
|
168
|
+
attr_accessor :aceite
|
|
169
|
+
|
|
170
|
+
# Moeda
|
|
171
|
+
# '9' = Real
|
|
172
|
+
# CNAB: 400
|
|
173
|
+
attr_accessor :codigo_moeda
|
|
174
|
+
|
|
175
|
+
# forma de cadastramento dos titulos (campo nao tratado pelo Banco do Brasil)
|
|
176
|
+
# opcoes:
|
|
177
|
+
# 1 - com cadastramento (cobrança registrada)
|
|
178
|
+
# 2 - sem cadastramento (cobrança sem registro)
|
|
179
|
+
attr_accessor :forma_cadastramento
|
|
180
|
+
|
|
181
|
+
# Identificação da Emissão do Boleto de Pagamento
|
|
182
|
+
# Código adotado pela FEBRABAN para identificar o responsável e a forma de emissão do
|
|
183
|
+
# Boleto de Pagamento.
|
|
184
|
+
# Domínio:
|
|
185
|
+
# '1' = Banco Emite
|
|
186
|
+
# '2' = Cliente Emite
|
|
187
|
+
# '3' = Banco Pré-emite e Cliente Complementa
|
|
188
|
+
# '4' = Banco Reemite
|
|
189
|
+
# '5' = Banco Não Reemite
|
|
190
|
+
# '7' = Banco Emitente - Aberta
|
|
191
|
+
# '8' = Banco Emitente - Auto-envelopável
|
|
192
|
+
# Os códigos '4' e '5' só serão aceitos para código de movimento para remessa '31'
|
|
193
|
+
attr_accessor :emissao_boleto
|
|
194
|
+
|
|
195
|
+
# Identificação da Distribuição
|
|
196
|
+
# Código adotado pela FEBRABAN para identificar o responsável pela distribuição do
|
|
197
|
+
# Boleto de Pagamento.
|
|
198
|
+
# Domínio:
|
|
199
|
+
# '1' = Banco Distribui
|
|
200
|
+
# '2' = Cliente Distribui
|
|
201
|
+
# ‘3’ = Banco envia e-mail
|
|
202
|
+
# ‘4’ = Banco envia SMS
|
|
203
|
+
attr_accessor :distribuicao_boleto
|
|
204
|
+
|
|
205
|
+
######################## VALIDAÇÕES PERSONALIZADAS ########################
|
|
206
|
+
attr_accessor :valid_tipo_impressao_required
|
|
207
|
+
validates :tipo_impressao, presence: true, if: :valid_tipo_impressao_required
|
|
208
|
+
|
|
209
|
+
attr_accessor :valid_cod_desconto_length
|
|
210
|
+
validates :cod_desconto, custom_length: {is: :valid_cod_desconto_length}, if: :valid_cod_desconto_length
|
|
211
|
+
|
|
212
|
+
attr_accessor :valid_emissao_boleto_length
|
|
213
|
+
validates :emissao_boleto, custom_length: {is: :valid_emissao_boleto_length}, if: :valid_emissao_boleto_length
|
|
214
|
+
|
|
215
|
+
attr_accessor :valid_distribuicao_boleto_length
|
|
216
|
+
validates :distribuicao_boleto, custom_length: {is: :valid_distribuicao_boleto_length}, if: :valid_distribuicao_boleto_length
|
|
217
|
+
#############################################################################
|
|
218
|
+
|
|
219
|
+
def moeda_real?
|
|
220
|
+
"#{codigo_moeda}" == '9'
|
|
221
|
+
end
|
|
222
|
+
def codigo_moeda
|
|
223
|
+
@codigo_moeda = '9' if @codigo_moeda.blank?
|
|
224
|
+
@codigo_moeda
|
|
225
|
+
end
|
|
103
226
|
|
|
104
|
-
def
|
|
105
|
-
|
|
227
|
+
def parcela
|
|
228
|
+
@parcela = '1' if @parcela.blank?
|
|
229
|
+
@parcela
|
|
106
230
|
end
|
|
107
231
|
|
|
108
232
|
def nosso_numero
|
|
109
233
|
"#{@nosso_numero}".gsub(/[^0-9]/, "")
|
|
110
234
|
end
|
|
111
235
|
|
|
112
|
-
validates :nosso_numero, :data_vencimento, :valor_documento, :
|
|
113
|
-
:endereco_sacado, :cep_sacado, :cidade_sacado, :uf_sacado, :bairro_sacado, :tipo_impressao,
|
|
114
|
-
presence: true
|
|
115
|
-
|
|
116
|
-
validates :cep_sacado, length: {is: 8, message: 'deve ter 8 dígitos.'}
|
|
117
|
-
validates :cod_desconto, length: {is: 1, message: 'deve ter 1 dígito.'}
|
|
236
|
+
validates :nosso_numero, :data_vencimento, :valor_documento, presence: true
|
|
118
237
|
|
|
119
238
|
def default_values
|
|
120
239
|
{
|
|
@@ -123,7 +242,6 @@ module BrBoleto
|
|
|
123
242
|
valor_desconto: 0.0,
|
|
124
243
|
valor_iof: 0.0,
|
|
125
244
|
valor_abatimento: 0.0,
|
|
126
|
-
nome_avalista: '',
|
|
127
245
|
cod_desconto: '0',
|
|
128
246
|
desconto_2_codigo: '0',
|
|
129
247
|
desconto_2_valor: 0.0,
|
|
@@ -133,10 +251,25 @@ module BrBoleto
|
|
|
133
251
|
codigo_juros: '3', # Isento
|
|
134
252
|
valor_multa: 0.0,
|
|
135
253
|
valor_juros: 0.0,
|
|
136
|
-
|
|
254
|
+
parcela: '1',
|
|
255
|
+
tipo_impressao: '1',
|
|
256
|
+
tipo_emissao: '2',
|
|
257
|
+
identificacao_ocorrencia: '01',
|
|
258
|
+
especie_titulo: '01',
|
|
259
|
+
codigo_moeda: '9',
|
|
260
|
+
forma_cadastramento: '0',
|
|
261
|
+
emissao_boleto: '2',
|
|
262
|
+
distribuicao_boleto: '2',
|
|
137
263
|
}
|
|
138
264
|
end
|
|
139
265
|
|
|
266
|
+
def data_vencimento_formatado(formato='%d%m%Y')
|
|
267
|
+
formata_data(data_vencimento, formato)
|
|
268
|
+
end
|
|
269
|
+
def data_emissao_formatado(formato='%d%m%Y')
|
|
270
|
+
formata_data(data_emissao, formato)
|
|
271
|
+
end
|
|
272
|
+
|
|
140
273
|
# Formata a data de descontos de acordo com o formato passado
|
|
141
274
|
#
|
|
142
275
|
# @return [String]
|
|
@@ -215,26 +348,30 @@ module BrBoleto
|
|
|
215
348
|
#
|
|
216
349
|
# @param tamanho [Integer]
|
|
217
350
|
# quantidade de caracteres a ser retornado
|
|
218
|
-
#
|
|
351
|
+
# CNAB: 240 e 400
|
|
219
352
|
def valor_abatimento_formatado(tamanho = 13)
|
|
220
353
|
BrBoleto::Helper::Number.new(valor_abatimento).formata_valor_monetario(tamanho)
|
|
221
354
|
end
|
|
222
355
|
|
|
223
|
-
#
|
|
224
|
-
#
|
|
225
|
-
#
|
|
356
|
+
# Formata o valor percentual da multa
|
|
357
|
+
# Ex:
|
|
358
|
+
# 2.5% = 2.5 = 025000
|
|
359
|
+
# 21.567% = 21.5 = 215670
|
|
226
360
|
#
|
|
227
|
-
def
|
|
228
|
-
BrBoleto::Helper::
|
|
361
|
+
def percentual_multa_formatado(tamanho = 6)
|
|
362
|
+
BrBoleto::Helper::Number.new(percentual_multa).formata_valor_percentual(tamanho).adjust_size_to(tamanho, '0')
|
|
229
363
|
end
|
|
230
|
-
|
|
231
|
-
#
|
|
232
|
-
#
|
|
233
|
-
#
|
|
364
|
+
|
|
365
|
+
# Formata o valor percentual do juros
|
|
366
|
+
# Ex:
|
|
367
|
+
# 2.5% = 2.5 = 025000
|
|
368
|
+
# 21.567% = 21.5 = 215670
|
|
234
369
|
#
|
|
235
|
-
def
|
|
236
|
-
BrBoleto::Helper::
|
|
370
|
+
def percentual_juros_formatado(tamanho = 6)
|
|
371
|
+
BrBoleto::Helper::Number.new(percentual_juros).formata_valor_percentual(tamanho).adjust_size_to(tamanho, '0')
|
|
237
372
|
end
|
|
373
|
+
|
|
374
|
+
|
|
238
375
|
private
|
|
239
376
|
|
|
240
377
|
def formata_data(value, formato="%d%m%Y")
|
|
@@ -29,6 +29,15 @@ module BrBoleto
|
|
|
29
29
|
def read_file!
|
|
30
30
|
raise NotImplementedError.new('Sobreescreva este método na classe referente ao CNAB 240 ou 400')
|
|
31
31
|
end
|
|
32
|
+
|
|
33
|
+
# Resolve problema quando existe algum caractere com acentuação e encode UTF-16
|
|
34
|
+
# converte esse caractere para ? e converte para o encode UTF-8.
|
|
35
|
+
# Fix issue #5
|
|
36
|
+
#
|
|
37
|
+
def adjust_encode(line)
|
|
38
|
+
line.encode!("UTF-16be", invalid: :replace, replace: "?").encode!('UTF-8')
|
|
39
|
+
end
|
|
40
|
+
|
|
32
41
|
end
|
|
33
42
|
end
|
|
34
43
|
end
|
|
@@ -82,8 +82,8 @@ module BrBoleto
|
|
|
82
82
|
valor_iof: 63..77,
|
|
83
83
|
valor_pago: 78..92,
|
|
84
84
|
valor_liquido: 93..107,
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
valor_outras_despesas: 108..122,
|
|
86
|
+
valor_outros_creditos: 123..137,
|
|
87
87
|
data_ocorrencia: 138..145,
|
|
88
88
|
data_credito: 146..153,
|
|
89
89
|
codigo_ocorrencia_sacado: 154..157,
|
|
@@ -95,14 +95,6 @@ module BrBoleto
|
|
|
95
95
|
}
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
-
# Resolve problema quando existe algum caractere com acentuação e encode UTF-16
|
|
99
|
-
# converte esse caractere para ? e converte para o encode UTF-8.
|
|
100
|
-
# Fix issue #5
|
|
101
|
-
#
|
|
102
|
-
def adjust_encode(line)
|
|
103
|
-
line.encode!("UTF-16be", invalid: :replace, replace: "?").encode!('UTF-8')
|
|
104
|
-
end
|
|
105
|
-
|
|
106
98
|
end
|
|
107
99
|
end
|
|
108
100
|
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
module BrBoleto
|
|
3
|
+
module Retorno
|
|
4
|
+
module Cnab400
|
|
5
|
+
class Base < BrBoleto::Retorno::Base
|
|
6
|
+
# É necessário sobrescrever o método `detalhe_fields` para cada banco, pois o CNAB 400
|
|
7
|
+
# Não apresenta um padrão definido.
|
|
8
|
+
#
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
# É feito um loop em todas as linhas do arquivo considerando apenas as linhas de detalhe
|
|
12
|
+
# Cada linha representa um pagamento.
|
|
13
|
+
#
|
|
14
|
+
def read_file! #:doc:
|
|
15
|
+
lines = File.readlines(file).map{|l| adjust_encode(l)}
|
|
16
|
+
set_codigo_banco(lines)
|
|
17
|
+
# Ignora a 1ª Linha (Header) e a Última linha (Trailer)
|
|
18
|
+
lines[1..lines.size-2].each do |line|
|
|
19
|
+
instnce_payment(line)
|
|
20
|
+
end
|
|
21
|
+
pagamentos
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Intsnacia um pagamento através do texto da linha recebida or parâmetro
|
|
25
|
+
# e adiciona o mesmo no Array de pagamentos
|
|
26
|
+
#
|
|
27
|
+
def instnce_payment(detalhe) #:doc:
|
|
28
|
+
payment = BrBoleto::Retorno::Pagamento.new
|
|
29
|
+
detalhe_fields.each do |column, position |
|
|
30
|
+
payment.send("#{column}=", "_#{detalhe}"[position].try(:strip))
|
|
31
|
+
end
|
|
32
|
+
self.pagamentos << payment
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def detalhe_fields #:doc:
|
|
36
|
+
raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Pega o código do banco que está presente no Header do arquivo, onde que por
|
|
40
|
+
# padrão é encontrado nas posições 77,78 e 79.
|
|
41
|
+
def set_codigo_banco(lines)
|
|
42
|
+
return if lines.blank?
|
|
43
|
+
self.codigo_banco = "_#{lines[0]}"[77..79]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
module BrBoleto
|
|
3
|
+
module Retorno
|
|
4
|
+
module Cnab400
|
|
5
|
+
class Sicoob < BrBoleto::Retorno::Cnab400::Base
|
|
6
|
+
private
|
|
7
|
+
def detalhe_fields #:doc:
|
|
8
|
+
{ # ATRIBUTO POSIÇÃO DA LINHA
|
|
9
|
+
agencia_sem_dv: 18..21,
|
|
10
|
+
agencia_com_dv: 18..22,
|
|
11
|
+
numero_conta_com_dv: 23..31,
|
|
12
|
+
numero_conta_sem_dv: 23..30,
|
|
13
|
+
nosso_numero: 63..74,
|
|
14
|
+
parcela: 75..76,
|
|
15
|
+
modalidade: 107..108,
|
|
16
|
+
carteira: 108,
|
|
17
|
+
data_ocorrencia: 111..116,
|
|
18
|
+
data_ocorrencia_sacado: 111..116,
|
|
19
|
+
numero_documento: 117..131,
|
|
20
|
+
data_vencimento: 147..152,
|
|
21
|
+
valor_titulo: 153..165,
|
|
22
|
+
banco_recebedor: 166..168,
|
|
23
|
+
agencia_recebedora_com_dv: 169..173,
|
|
24
|
+
especie_titulo: 174..175,
|
|
25
|
+
data_credito: 176..181,
|
|
26
|
+
valor_tarifa: 182..188,
|
|
27
|
+
valor_outras_despesas: 189..201,
|
|
28
|
+
valor_juros_multa: 267..279,
|
|
29
|
+
valor_iof: 215..227,
|
|
30
|
+
valor_abatimento: 228..240,
|
|
31
|
+
valor_desconto: 241..253,
|
|
32
|
+
valor_pago: 254..266,
|
|
33
|
+
valor_ocorrencia_sacado: 254..266,
|
|
34
|
+
valor_liquido: 254..266,
|
|
35
|
+
valor_outros_creditos: 280..292,
|
|
36
|
+
sacado_documento: 343..356,
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -134,15 +134,15 @@ module BrBoleto
|
|
|
134
134
|
# 15 93-107
|
|
135
135
|
attr_accessor :valor_liquido
|
|
136
136
|
|
|
137
|
-
# VALRO COM
|
|
137
|
+
# VALRO COM outras DESPESAS
|
|
138
138
|
# Tamanho Posição
|
|
139
139
|
# 15 108-122
|
|
140
|
-
attr_accessor :
|
|
140
|
+
attr_accessor :valor_outras_despesas
|
|
141
141
|
|
|
142
|
-
# VALRO COM
|
|
142
|
+
# VALRO COM outros CRÉDITOS
|
|
143
143
|
# Tamanho Posição
|
|
144
144
|
# 15 123-137
|
|
145
|
-
attr_accessor :
|
|
145
|
+
attr_accessor :valor_outros_creditos
|
|
146
146
|
|
|
147
147
|
# DATA OCORRÊNCIA
|
|
148
148
|
# Tamanho Posição
|
|
@@ -190,6 +190,12 @@ module BrBoleto
|
|
|
190
190
|
# É implementado apenas para os bancos que não conseguem seguir um padrão estabelecido
|
|
191
191
|
attr_accessor :modalidade
|
|
192
192
|
|
|
193
|
+
|
|
194
|
+
attr_accessor :parcela
|
|
195
|
+
|
|
196
|
+
# Prefixo do Título: Informa Espécie do Título
|
|
197
|
+
attr_accessor :especie_titulo
|
|
198
|
+
|
|
193
199
|
def initialize(attributes = {})
|
|
194
200
|
define_formatted_methods!
|
|
195
201
|
super
|
|
@@ -209,8 +215,8 @@ module BrBoleto
|
|
|
209
215
|
valor_iof: {type: :float},
|
|
210
216
|
valor_pago: {type: :float},
|
|
211
217
|
valor_liquido: {type: :float},
|
|
212
|
-
|
|
213
|
-
|
|
218
|
+
valor_outras_despesas: {type: :float},
|
|
219
|
+
valor_outros_creditos: {type: :float},
|
|
214
220
|
valor_ocorrencia_sacado: {type: :float},
|
|
215
221
|
}
|
|
216
222
|
end
|
|
@@ -6,13 +6,19 @@ module BrBoleto
|
|
|
6
6
|
# se a string for menor, adiciona espacos a direita
|
|
7
7
|
# se a string for maior, trunca para o num. de caracteres
|
|
8
8
|
#
|
|
9
|
-
def adjust_size_to(size, adjust=" ")
|
|
9
|
+
def adjust_size_to(size, adjust=" ", orientation=:left)
|
|
10
10
|
if self.size > size
|
|
11
11
|
truncate(size, omission: '')
|
|
12
|
-
|
|
12
|
+
elsif orientation == :left
|
|
13
13
|
ljust(size, adjust)
|
|
14
|
+
else
|
|
15
|
+
rjust(size, adjust)
|
|
14
16
|
end
|
|
15
17
|
end
|
|
18
|
+
|
|
19
|
+
def only_numbers
|
|
20
|
+
self.gsub(/[^\d]/, '')
|
|
21
|
+
end
|
|
16
22
|
end
|
|
17
23
|
end
|
|
18
24
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class CustomLengthValidator < ActiveModel::EachValidator
|
|
2
|
+
def validate_each(record, attribute, value)
|
|
3
|
+
is_value = max_value = min_value = nil
|
|
4
|
+
max_value = options[:maximum].is_a?(Symbol) ? record.send(options[:maximum]).to_i : options[:maximum]
|
|
5
|
+
min_value = options[:minimum].is_a?(Symbol) ? record.send(options[:minimum]).to_i : options[:minimum]
|
|
6
|
+
is_value = options[:is].is_a?(Symbol) ? record.send(options[:is]).to_i : options[:is]
|
|
7
|
+
record.errors.add(attribute, :custom_length_maximum, count: max_value) if max_value && "#{record.try(attribute)}".strip.size > max_value
|
|
8
|
+
record.errors.add(attribute, :custom_length_minimum, count: min_value) if min_value && "#{record.try(attribute)}".strip.size < min_value
|
|
9
|
+
record.errors.add(attribute, :custom_length_is, count: is_value ) if is_value && "#{record.try(attribute)}".strip.size != is_value
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class CustomInclusionValidator < ActiveModel::EachValidator
|
|
14
|
+
def validate_each(record, attribute, value)
|
|
15
|
+
in_values = [options[:in].is_a?(Symbol) ? record.send(options[:in]) : options[:in]].flatten.compact.map(&:to_s)
|
|
16
|
+
record.errors.add(attribute, :custom_inclusion, list: in_values.join(', ') ) if in_values.any? && !"#{record.try(attribute)}".strip.in?(in_values)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
data/lib/br_boleto/version.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module BrBoleto
|
|
2
2
|
module Version
|
|
3
|
-
MAJOR =
|
|
4
|
-
MINOR =
|
|
5
|
-
PATCH =
|
|
3
|
+
MAJOR = 2 #inclui alterações de API e pode quebrar compatibilidade com versões anteriores
|
|
4
|
+
MINOR = 0 #inclui novas funcionalidades, sem quebrar APIs existentes
|
|
5
|
+
PATCH = 0 #corrige bugs ou traz melhorias em implementações já existentes
|
|
6
6
|
CURRENT = "#{MAJOR}.#{MINOR}.#{PATCH}"
|
|
7
7
|
end
|
|
8
8
|
end
|
data/lib/br_boleto.rb
CHANGED
|
@@ -7,6 +7,11 @@ require 'active_support/core_ext/object'
|
|
|
7
7
|
require 'active_support/core_ext/string'
|
|
8
8
|
|
|
9
9
|
require 'br_boleto/string_methods'
|
|
10
|
+
require 'br_boleto/validations'
|
|
11
|
+
|
|
12
|
+
require 'br_boleto/association/have_conta'
|
|
13
|
+
require 'br_boleto/association/have_pagador'
|
|
14
|
+
require 'br_boleto/association/have_pagamentos'
|
|
10
15
|
|
|
11
16
|
# Copyright (C) 2015 Bruno M. Mergen <http://duobr.com.br>
|
|
12
17
|
#
|
|
@@ -40,14 +45,35 @@ require 'br_boleto/string_methods'
|
|
|
40
45
|
# bundle install
|
|
41
46
|
#
|
|
42
47
|
module BrBoleto
|
|
43
|
-
|
|
44
48
|
def self.root
|
|
45
49
|
File.expand_path '../..', __FILE__
|
|
46
50
|
end
|
|
47
51
|
|
|
52
|
+
I18n.load_path += Dir[BrBoleto.root+'/lib/config'+ '/locales'+'/**'+'/*.{rb,yml}']
|
|
53
|
+
|
|
48
54
|
extend ActiveSupport::Autoload
|
|
49
55
|
autoload :ActiveModelBase
|
|
50
56
|
|
|
57
|
+
module Helper
|
|
58
|
+
extend ActiveSupport::Autoload
|
|
59
|
+
|
|
60
|
+
autoload :DefaultCodes
|
|
61
|
+
autoload :CpfCnpj
|
|
62
|
+
autoload :Number
|
|
63
|
+
autoload :FormatValue
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
autoload :Pagador
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
module Conta
|
|
71
|
+
extend ActiveSupport::Autoload
|
|
72
|
+
autoload :Base
|
|
73
|
+
autoload :Sicoob
|
|
74
|
+
autoload :Caixa
|
|
75
|
+
end
|
|
76
|
+
|
|
51
77
|
module Boleto
|
|
52
78
|
extend ActiveSupport::Autoload
|
|
53
79
|
|
|
@@ -69,6 +95,11 @@ module BrBoleto
|
|
|
69
95
|
autoload :Sicoob
|
|
70
96
|
autoload :Caixa
|
|
71
97
|
end
|
|
98
|
+
module Cnab400
|
|
99
|
+
extend ActiveSupport::Autoload
|
|
100
|
+
autoload :Base
|
|
101
|
+
autoload :Sicoob
|
|
102
|
+
end
|
|
72
103
|
end
|
|
73
104
|
|
|
74
105
|
module Retorno
|
|
@@ -81,15 +112,14 @@ module BrBoleto
|
|
|
81
112
|
autoload :Sicoob
|
|
82
113
|
autoload :Caixa
|
|
83
114
|
end
|
|
115
|
+
module Cnab400
|
|
116
|
+
extend ActiveSupport::Autoload
|
|
117
|
+
autoload :Base
|
|
118
|
+
autoload :Sicoob
|
|
119
|
+
end
|
|
84
120
|
end
|
|
85
121
|
|
|
86
|
-
|
|
87
|
-
extend ActiveSupport::Autoload
|
|
88
|
-
|
|
89
|
-
autoload :CpfCnpj
|
|
90
|
-
autoload :Number
|
|
91
|
-
autoload :FormatValue
|
|
92
|
-
end
|
|
122
|
+
|
|
93
123
|
|
|
94
124
|
# Módulo que possui classes que realizam os cálculos dos campos que serão mostrados nos boletos.
|
|
95
125
|
#
|