br_boleto 1.0.1 → 1.1.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 +5 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +13 -0
- data/LICENSE +1 -1
- data/README.markdown +22 -7
- data/br_boleto.gemspec +9 -7
- data/lib/br_boleto/active_model_base.rb +28 -0
- data/lib/br_boleto/boleto/base.rb +666 -633
- data/lib/br_boleto/boleto/caixa.rb +257 -0
- data/lib/br_boleto/boleto/sicoob.rb +6 -18
- data/lib/br_boleto/helper/format_value.rb +18 -0
- data/lib/br_boleto/remessa/base.rb +1 -22
- data/lib/br_boleto/remessa/cnab240/base.rb +12 -9
- data/lib/br_boleto/remessa/cnab240/caixa.rb +201 -0
- data/lib/br_boleto/remessa/cnab240/helper/header_arquivo.rb +2 -2
- data/lib/br_boleto/remessa/cnab240/helper/header_lote.rb +10 -1
- data/lib/br_boleto/remessa/cnab240/helper/segmento_p.rb +2 -2
- data/lib/br_boleto/remessa/cnab240/helper/segmento_q.rb +2 -2
- data/lib/br_boleto/remessa/cnab240/helper/trailer_arquivo.rb +7 -0
- data/lib/br_boleto/remessa/cnab240/sicoob.rb +6 -6
- data/lib/br_boleto/remessa/lote.rb +1 -21
- data/lib/br_boleto/remessa/pagamento.rb +22 -36
- data/lib/br_boleto/retorno/base.rb +31 -0
- data/lib/br_boleto/retorno/cnab240/base.rb +101 -0
- data/lib/br_boleto/retorno/cnab240/caixa.rb +30 -0
- data/lib/br_boleto/retorno/cnab240/sicoob.rb +35 -0
- data/lib/br_boleto/retorno/pagamento.rb +242 -0
- data/lib/br_boleto/version.rb +2 -2
- data/lib/br_boleto.rb +23 -11
- data/test/br_boleto/boleto/base_test.rb +6 -6
- data/test/br_boleto/boleto/caixa_test.rb +191 -0
- data/test/br_boleto/boleto/sicoob_test.rb +18 -11
- data/test/br_boleto/remessa/cnab240/base_test.rb +5 -5
- data/test/br_boleto/remessa/cnab240/caixa_test.rb +271 -0
- data/test/br_boleto/remessa/cnab240/helper/header_arquivo_test.rb +2 -2
- data/test/br_boleto/remessa/cnab240/helper/segmento_p_test.rb +1 -1
- data/test/br_boleto/remessa/cnab240/sicoob_test.rb +27 -27
- data/test/br_boleto/remessa/pagamento_test.rb +12 -2
- data/test/br_boleto/retorno/cnab240/base_test.rb +217 -0
- data/test/br_boleto/retorno/cnab240/caixa_test.rb +217 -0
- data/test/br_boleto/retorno/cnab240/sicoob_test.rb +217 -0
- data/test/br_boleto/retorno/pagamento_test.rb +179 -0
- data/test/factories/boleto/boleto_caixa.rb +25 -0
- data/test/factories/remessa/cnab240/caixa.rb +14 -0
- data/test/factories/remessa/pagamento.rb +1 -0
- data/test/factories/retorno/pagamento.rb +6 -0
- data/test/files/retorno/cnab240/caixa.ret +14 -0
- data/test/files/retorno/cnab240/padrao240.ret +14 -0
- metadata +51 -6
@@ -0,0 +1,257 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module BrBoleto
|
3
|
+
module Boleto
|
4
|
+
# Implementação de emissão de boleto bancário pela Caixa Econômica Federal.
|
5
|
+
#
|
6
|
+
# === Documentação Implementada
|
7
|
+
#
|
8
|
+
# A documentação na qual essa implementação foi baseada está localizada na pasta
|
9
|
+
# 'documentacoes_dos_boletos/caixa' dentro dessa biblioteca.
|
10
|
+
# === Carteiras suportadas
|
11
|
+
#
|
12
|
+
# Segue abaixo as carteiras suportadas da Caixa Econômica Federal <b>seguindo a documentação</b>:
|
13
|
+
#
|
14
|
+
# ___________________________________________
|
15
|
+
# | Carteira | Descrição |
|
16
|
+
# | 14 | Cobrança Simples com registro |
|
17
|
+
# | 24 | Cobrança Simples sem registro |
|
18
|
+
# |__________________________________________|
|
19
|
+
# === Carteira/Modalidade:
|
20
|
+
#
|
21
|
+
# 1/4 = Registrada / Emissão do boleto(4-Beneficiário)
|
22
|
+
# 2/4 = Sem Registro / Emissão do boleto(4-Beneficiário)
|
23
|
+
#
|
24
|
+
#
|
25
|
+
class Caixa < Base
|
26
|
+
#Modalidades de cobranças válidas conforme a documentação
|
27
|
+
def self.modalidade_cobranca_validas
|
28
|
+
%w(1 2)
|
29
|
+
end
|
30
|
+
|
31
|
+
def deve_validar_modalidade_cobranca?
|
32
|
+
true
|
33
|
+
end
|
34
|
+
|
35
|
+
# Tamanho máximo de uma agência na Caixa Econômica Federal.
|
36
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
37
|
+
#
|
38
|
+
# @return [Fixnum] 4
|
39
|
+
#
|
40
|
+
def self.tamanho_maximo_agencia
|
41
|
+
4
|
42
|
+
end
|
43
|
+
|
44
|
+
# Tamanho máximo do código do cedente emitido no Boleto.
|
45
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
46
|
+
#
|
47
|
+
# @return [Fixnum] 6
|
48
|
+
#
|
49
|
+
def self.tamanho_maximo_codigo_cedente
|
50
|
+
6
|
51
|
+
end
|
52
|
+
|
53
|
+
# Tamanho máximo do numero do documento no Boleto.
|
54
|
+
# <b>Método criado justamente para ficar documentado o tamanho máximo aceito até a data corrente.</b>
|
55
|
+
#
|
56
|
+
# @return [Fixnum] 15
|
57
|
+
#
|
58
|
+
def self.tamanho_maximo_numero_documento
|
59
|
+
15
|
60
|
+
end
|
61
|
+
|
62
|
+
# <b>Carteiras suportadas.</b>
|
63
|
+
#
|
64
|
+
# <b>Método criado para validar se a carteira informada é suportada.</b>
|
65
|
+
#
|
66
|
+
# @return [Array]
|
67
|
+
#
|
68
|
+
def self.carteiras_suportadas
|
69
|
+
%w(14 24)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Conforme descrito na documentação, o valor que deve constar em local do pagamento é
|
73
|
+
# "PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE"
|
74
|
+
#
|
75
|
+
def default_values
|
76
|
+
super.merge({
|
77
|
+
:local_pagamento => 'PREFERENCIALMENTE NAS CASAS LOTÉRICAS ATÉ O VALOR LIMITE'
|
78
|
+
})
|
79
|
+
end
|
80
|
+
|
81
|
+
# Validações para os campos abaixo:
|
82
|
+
#
|
83
|
+
# * Agencia
|
84
|
+
# * Codigo Cedente
|
85
|
+
# * Número do documento
|
86
|
+
#
|
87
|
+
# Se você quiser sobrescrever os metodos, <b>ficará a sua responsabilidade.</b>
|
88
|
+
# Basta você sobrescrever os métodos de validação:
|
89
|
+
#
|
90
|
+
# class Caixa < BrBoleto::Core::Caixa
|
91
|
+
# def self.tamanho_maximo_agencia
|
92
|
+
# 6
|
93
|
+
# end
|
94
|
+
#
|
95
|
+
# def self.tamanho_maximo_codigo_cedente
|
96
|
+
# 9
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# def self.tamanho_maximo_numero_documento
|
100
|
+
# 10
|
101
|
+
# end
|
102
|
+
# end
|
103
|
+
#
|
104
|
+
# Obs.: Mudar as regras de validação podem influenciar na emissão do boleto em si.
|
105
|
+
# Talvez você precise analisar o efeito no #codigo_de_barras e na #linha_digitável (ambos podem ser
|
106
|
+
# sobreescritos também).
|
107
|
+
#
|
108
|
+
validates :agencia, :codigo_cedente, presence: true
|
109
|
+
|
110
|
+
validates :agencia, length: { maximum: tamanho_maximo_agencia }, if: :deve_validar_agencia?
|
111
|
+
validates :codigo_cedente, length: { maximum: tamanho_maximo_codigo_cedente }, if: :deve_validar_codigo_cedente?
|
112
|
+
validates :numero_documento, length: { maximum: tamanho_maximo_numero_documento }, if: :deve_validar_numero_documento?
|
113
|
+
|
114
|
+
validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
|
115
|
+
|
116
|
+
# @return [String] Código do Banco descrito na documentação.
|
117
|
+
#
|
118
|
+
def codigo_banco
|
119
|
+
'104'
|
120
|
+
end
|
121
|
+
|
122
|
+
# @return [String] Dígito do código do banco descrito na documentação.
|
123
|
+
#
|
124
|
+
def digito_codigo_banco
|
125
|
+
'0'
|
126
|
+
end
|
127
|
+
|
128
|
+
# Campo Agência / Código do Cedente
|
129
|
+
#
|
130
|
+
# @return [String]
|
131
|
+
#
|
132
|
+
def agencia_codigo_cedente
|
133
|
+
"#{agencia} / #{codigo_cedente}-#{digito_verificador_codigo_cedente}"
|
134
|
+
end
|
135
|
+
|
136
|
+
def digito_verificador_codigo_cedente
|
137
|
+
BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(codigo_cedente)
|
138
|
+
end
|
139
|
+
def digito_verificador_codigo_beneficiario
|
140
|
+
digito_verificador_codigo_cedente
|
141
|
+
end
|
142
|
+
|
143
|
+
def digito_verificador_nosso_numero
|
144
|
+
BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new("#{carteira}#{numero_documento}")
|
145
|
+
end
|
146
|
+
|
147
|
+
# Mostra o campo nosso número calculando o dígito verificador do nosso número.
|
148
|
+
#
|
149
|
+
# @return [String]
|
150
|
+
#
|
151
|
+
def nosso_numero
|
152
|
+
"#{carteira}#{numero_documento}-#{digito_verificador_nosso_numero}"
|
153
|
+
end
|
154
|
+
|
155
|
+
|
156
|
+
def nosso_numero_de_3_a_5
|
157
|
+
nosso_numero[2..4]
|
158
|
+
end
|
159
|
+
|
160
|
+
def nosso_numero_de_6_a_8
|
161
|
+
nosso_numero[5..7]
|
162
|
+
end
|
163
|
+
|
164
|
+
def nosso_numero_de_9_a_17
|
165
|
+
nosso_numero[8..16]
|
166
|
+
end
|
167
|
+
|
168
|
+
# O Tipo de cobrança é o 1° caracter da carteira
|
169
|
+
#
|
170
|
+
# @return [String]
|
171
|
+
#
|
172
|
+
def tipo_cobranca
|
173
|
+
carteira[0] if carteira.present?
|
174
|
+
end
|
175
|
+
|
176
|
+
# Modalidade de cobrança
|
177
|
+
# As vezes é chamado de modalidade de cobrança e as vezes é chamado de tipo de cobrança
|
178
|
+
# Por isso foi criado o metodo modalidade_cobrança que é a mesma coisa que o tipo_cobranca
|
179
|
+
#
|
180
|
+
# @return [String]
|
181
|
+
#
|
182
|
+
def modalidade_cobranca
|
183
|
+
tipo_cobranca
|
184
|
+
end
|
185
|
+
|
186
|
+
# O Identificado de Emissão é o 2° e ultimo caracter da carteira
|
187
|
+
# Normalmente é 4 onde significa que o Beneficiário emitiu o boleto.
|
188
|
+
#
|
189
|
+
# @return [String]
|
190
|
+
#
|
191
|
+
def identificador_de_emissao
|
192
|
+
carteira.last if carteira.present?
|
193
|
+
end
|
194
|
+
|
195
|
+
# Formata a carteira dependendo se ela é registrada ou não.
|
196
|
+
#
|
197
|
+
# Para cobrança COM registro usar: <b>RG</b>
|
198
|
+
# Para Cobrança SEM registro usar: <b>SR</b>
|
199
|
+
#
|
200
|
+
# @return [String]
|
201
|
+
#
|
202
|
+
def carteira_formatada
|
203
|
+
if carteira.in?(carteiras_com_registro)
|
204
|
+
'RG'
|
205
|
+
else
|
206
|
+
'SR'
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
# Retorna as carteiras com registro da Caixa Econômica Federal.
|
211
|
+
# <b>Você pode sobrescrever esse método na subclasse caso exista mais
|
212
|
+
# carteiras com registro na Caixa Econômica Federal.</b>
|
213
|
+
#
|
214
|
+
# @return [Array]
|
215
|
+
#
|
216
|
+
def carteiras_com_registro
|
217
|
+
%w(14)
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
# === Código de barras do banco
|
222
|
+
#
|
223
|
+
# ________________________________________________________________________________________
|
224
|
+
# | Posição | Tamanho | Descrição |
|
225
|
+
# |----------|---------|------------------------------------------------------------------|
|
226
|
+
# | 20 - 25 | 06 | Código do Beneficiário |
|
227
|
+
# | 26 - 26 | 01 | DV do Código do Beneficiário |
|
228
|
+
# | 27 – 29 | 03 | Nosso Número - 3ª a 5ª posição do Nosso Número |
|
229
|
+
# | 30 – 30 | 01 | Constante 1, tipo de cobrança (1-Registrada / 2-Sem Registro) |
|
230
|
+
# | 31 – 33 | 03 | Nosso Número - 6ª a 8ª posição do Nosso Número |
|
231
|
+
# | 34 – 34 | 01 | Constante 2, identificador de emissão do boleto (4-Beneficiário) |
|
232
|
+
# | 35 – 43 | 09 | Nosso Número - 9ª a 17ª posição do Nosso Número |
|
233
|
+
# | 44 – 44 | 01 | DV do Campo Livre |
|
234
|
+
# -----------------------------------------------------------------------------------------
|
235
|
+
#
|
236
|
+
# @return [String]
|
237
|
+
#
|
238
|
+
def codigo_de_barras_do_banco
|
239
|
+
@composicao_codigo_barras = nil
|
240
|
+
codigo_dv = Modulo11FatorDe2a9RestoZero.new(composicao_codigo_barras)
|
241
|
+
"#{composicao_codigo_barras}#{codigo_dv}"
|
242
|
+
end
|
243
|
+
|
244
|
+
def composicao_codigo_barras
|
245
|
+
return @composicao_codigo_barras if @composicao_codigo_barras
|
246
|
+
@composicao_codigo_barras = "#{codigo_beneficiario}"
|
247
|
+
@composicao_codigo_barras << "#{digito_verificador_codigo_beneficiario}"
|
248
|
+
@composicao_codigo_barras << "#{nosso_numero_de_3_a_5}"
|
249
|
+
@composicao_codigo_barras << "#{tipo_cobranca}"
|
250
|
+
@composicao_codigo_barras << "#{nosso_numero_de_6_a_8}"
|
251
|
+
@composicao_codigo_barras << "#{identificador_de_emissao}"
|
252
|
+
@composicao_codigo_barras << "#{nosso_numero_de_9_a_17}"
|
253
|
+
@composicao_codigo_barras
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
@@ -119,22 +119,10 @@ module BrBoleto
|
|
119
119
|
validates :carteira, inclusion: { in: ->(object) { object.class.carteiras_suportadas } }, if: :deve_validar_carteira?
|
120
120
|
validates :modalidade_cobranca, inclusion: { in: ->(object) { object.class.modalidade_cobranca_validas } }, if: :deve_validar_modalidade_cobranca?
|
121
121
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
# @return [String] 7 caracteres
|
129
|
-
# O Código do cedente é o mesmo que o codigo do beneficiário
|
130
|
-
def codigo_cedente
|
131
|
-
@codigo_cedente.to_s.rjust(7, '0') if @codigo_cedente.present?
|
132
|
-
end
|
133
|
-
|
134
|
-
# @return [String] 6 caracteres
|
135
|
-
#
|
136
|
-
def numero_documento
|
137
|
-
@numero_documento.to_s.rjust(7, '0') if @numero_documento.present?
|
122
|
+
def default_values
|
123
|
+
super.merge({
|
124
|
+
local_pagamento: "PREFERENCIALMENTE COOPERATIVAS DA REDE SICOOB"
|
125
|
+
})
|
138
126
|
end
|
139
127
|
|
140
128
|
# @return [String] Código do Banco descrito na documentação.
|
@@ -172,14 +160,14 @@ module BrBoleto
|
|
172
160
|
# Obs: O VALOR DESSE METODO NÃO INFLUÊNCIA NA GERAÇÃO DO BOLETO
|
173
161
|
# É APENAS PARA QUESTÃO DE INFORMAÇÃO CASO PRECISE PARA OUTRAS COISAS.
|
174
162
|
#
|
175
|
-
def
|
163
|
+
def tipo_cobranca_formatada
|
176
164
|
case "#{modalidade_cobranca}".rjust(2, "0")
|
177
165
|
when '01'
|
178
166
|
:com_registro
|
179
167
|
when '02'
|
180
168
|
:sem_registro
|
181
169
|
when '03'
|
182
|
-
:
|
170
|
+
:caucionada
|
183
171
|
end
|
184
172
|
end
|
185
173
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module BrBoleto
|
2
|
+
module Helper
|
3
|
+
module FormatValue
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def string_to_float(value)
|
7
|
+
return 0 if value.blank?
|
8
|
+
return value if value.is_a?(Numeric)
|
9
|
+
value.insert(value.size-2, '.').to_f
|
10
|
+
end
|
11
|
+
|
12
|
+
def string_to_date(value, format = "%d%m%Y")
|
13
|
+
return value if value.is_a?(Date)
|
14
|
+
begin Date.strptime(value, format) rescue nil end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -1,13 +1,6 @@
|
|
1
1
|
module BrBoleto
|
2
2
|
module Remessa
|
3
|
-
class Base
|
4
|
-
# Seguindo a interface do Active Model para:
|
5
|
-
# * Validações;
|
6
|
-
# * Internacionalização;
|
7
|
-
# * Nomes das classes para serem manipuladas;
|
8
|
-
#
|
9
|
-
include ActiveModel::Model
|
10
|
-
|
3
|
+
class Base < BrBoleto::ActiveModelBase
|
11
4
|
# variavel que terá os lotes no qual será gerado o arquivo de remessa
|
12
5
|
# um lote deve conter no minimo 1 pagamento
|
13
6
|
# Pode haver 1 ou vários lotes para o mesmo arquivo
|
@@ -38,20 +31,6 @@ module BrBoleto
|
|
38
31
|
# aceite (A = ACEITO/N = NAO ACEITO)
|
39
32
|
attr_accessor :aceite
|
40
33
|
|
41
|
-
def initialize(attributes = {})
|
42
|
-
self.lotes = [] # Para poder utilizar o << para adicionar lote
|
43
|
-
attributes = default_values.merge!(attributes)
|
44
|
-
assign_attributes(attributes)
|
45
|
-
yield self if block_given?
|
46
|
-
end
|
47
|
-
|
48
|
-
def assign_attributes(attributes)
|
49
|
-
attributes ||= {}
|
50
|
-
attributes.each do |name, value|
|
51
|
-
send("#{name}=", value)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
34
|
validates :nome_empresa, presence: true
|
56
35
|
validates :aceite, inclusion: { in: %w(A a n N), message: "valor deve ser A(aceito) ou N(não ceito)" }
|
57
36
|
|
@@ -52,12 +52,11 @@ module BrBoleto
|
|
52
52
|
# Data e hora da geração do arquivo
|
53
53
|
attr_accessor :data_hora_arquivo
|
54
54
|
|
55
|
-
#
|
55
|
+
# modalidade da carteira
|
56
56
|
# opcoes:
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
# 7 – modalidade Simples quando carteira 17 (apenas Banco do Brasil)
|
57
|
+
# 11: título Registrado emissão CAIXA
|
58
|
+
# 14: título Registrado emissão Cedente
|
59
|
+
# 21: título Sem Registro emissão CAIXA
|
61
60
|
attr_accessor :codigo_carteira
|
62
61
|
|
63
62
|
# forma de cadastramento dos titulos (campo nao tratado pelo Banco do Brasil)
|
@@ -145,7 +144,7 @@ module BrBoleto
|
|
145
144
|
def data_hora_arquivo
|
146
145
|
@data_hora_arquivo.to_time
|
147
146
|
rescue
|
148
|
-
return Time.
|
147
|
+
return Time.current
|
149
148
|
end
|
150
149
|
|
151
150
|
# Monta um lote para o arquivo
|
@@ -226,18 +225,22 @@ module BrBoleto
|
|
226
225
|
|
227
226
|
# Número do Documento de Cobrança
|
228
227
|
# Cada banco tem sua maneira de identificar esse número, mas o padrão é o
|
229
|
-
# Valor que se encontra no nosso numero
|
228
|
+
# Valor que se encontra no numero_documento ou então em nosso numero
|
230
229
|
# 15 posições
|
231
230
|
#
|
232
231
|
def segmento_p_numero_do_documento(pagamento)
|
233
|
-
pagamento.
|
232
|
+
if pagamento.numero_documento.present?
|
233
|
+
pagamento.numero_documento.to_s.rjust(15, '0')
|
234
|
+
else
|
235
|
+
pagamento.nosso_numero.to_s.rjust(15, '0')
|
236
|
+
end
|
234
237
|
end
|
235
238
|
|
236
239
|
# Complemento do registro
|
237
240
|
#
|
238
241
|
# Este metodo deve ser sobrescrevido na classe do banco
|
239
242
|
#
|
240
|
-
def
|
243
|
+
def complemento_header_arquivo
|
241
244
|
raise NotImplementedError.new('Sobreescreva este método na classe referente ao banco que você esta criando')
|
242
245
|
end
|
243
246
|
|
@@ -0,0 +1,201 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module BrBoleto
|
3
|
+
module Remessa
|
4
|
+
module Cnab240
|
5
|
+
class Caixa < BrBoleto::Remessa::Cnab240::Base
|
6
|
+
|
7
|
+
# modalidade da carteira
|
8
|
+
# opcoes:
|
9
|
+
# 11: título Registrado emissão CAIXA
|
10
|
+
# 14: título Registrado emissão Cedente
|
11
|
+
# 21: título Sem Registro emissão CAIXA
|
12
|
+
attr_accessor :modalidade_carteira
|
13
|
+
|
14
|
+
# versão do aplicativo da caixa
|
15
|
+
attr_accessor :versao_aplicativo
|
16
|
+
|
17
|
+
validates :modalidade_carteira, :agencia, :versao_aplicativo, presence: true
|
18
|
+
validates :convenio, length: {maximum: 6, message: 'deve ter no máximo 6 dígitos.'}
|
19
|
+
validates :versao_aplicativo, length: {maximum: 4, message: 'deve ter no máximo 4 dígitos.'}
|
20
|
+
validates :agencia, length: {maximum: 5, message: 'deve ter no máximo 5 dígitos.'}
|
21
|
+
validates :modalidade_carteira, length: {is: 2, message: 'deve ter 2 dígitos.'}
|
22
|
+
|
23
|
+
def default_values
|
24
|
+
super.merge({
|
25
|
+
emissao_boleto: '2',
|
26
|
+
distribuicao_boleto: '2',
|
27
|
+
especie_titulo: '02', # 02 = DM Duplicata mercantil
|
28
|
+
modalidade_carteira: '14',
|
29
|
+
forma_cadastramento: '0',
|
30
|
+
versao_aplicativo: '0'
|
31
|
+
})
|
32
|
+
end
|
33
|
+
|
34
|
+
def codigo_banco
|
35
|
+
'104'
|
36
|
+
end
|
37
|
+
|
38
|
+
def nome_banco
|
39
|
+
'CAIXA ECONOMICA FEDERAL'.ljust(30, ' ')
|
40
|
+
end
|
41
|
+
|
42
|
+
def versao_layout_arquivo
|
43
|
+
'050'
|
44
|
+
end
|
45
|
+
|
46
|
+
def versao_layout_lote
|
47
|
+
'030'
|
48
|
+
end
|
49
|
+
|
50
|
+
def versao_aplicativo
|
51
|
+
"#{@versao_aplicativo}".rjust(4, '0') if @versao_aplicativo.present?
|
52
|
+
end
|
53
|
+
|
54
|
+
def digito_agencia
|
55
|
+
# utilizando a agencia com 5 digitos
|
56
|
+
# para calcular o digito
|
57
|
+
BrBoleto::Calculos::Modulo11FatorDe2a9RestoZero.new(agencia).to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
# Uso exclusivo caixa
|
62
|
+
# CAMPO TAMANHO
|
63
|
+
# ---------------------------------------------------------
|
64
|
+
# num. convenio 20 Zeros
|
65
|
+
#
|
66
|
+
# TOTAL = 20 posições
|
67
|
+
#
|
68
|
+
def codigo_convenio
|
69
|
+
''.rjust(20, '0')
|
70
|
+
end
|
71
|
+
|
72
|
+
# Convênio do Lote
|
73
|
+
# DESCRIÇÃO TAMANHO POSIÇÃO
|
74
|
+
# ---------------------------------------------------------
|
75
|
+
# Cód. Cedente (convênio) 06 34-39
|
76
|
+
# Uso CAIXA 14 40-53
|
77
|
+
#
|
78
|
+
# TOTAL = 20 posições
|
79
|
+
#
|
80
|
+
def convenio_lote(lote)
|
81
|
+
conv_lote = convenio.to_s.rjust(6, '0')
|
82
|
+
conv_lote << ''.to_s.rjust(14, '0') #Padrão '0'
|
83
|
+
conv_lote
|
84
|
+
end
|
85
|
+
|
86
|
+
# Informação da conta
|
87
|
+
# DESCRIÇÃO TAMANHO POSIÇÃO
|
88
|
+
# ---------------------------------------------------------
|
89
|
+
# agencia 05 54 - 58
|
90
|
+
# digito Verif. agencia 01 59 - 59
|
91
|
+
# código convenio 06 60 - 65
|
92
|
+
# código modelo pers. 07 66 - 72
|
93
|
+
# uso exclusivo CAIXA 01 73 - 73
|
94
|
+
#
|
95
|
+
# TOTAL = 20 posições
|
96
|
+
#
|
97
|
+
def informacoes_da_conta
|
98
|
+
informacoes = agencia.rjust(5, '0')
|
99
|
+
informacoes << digito_agencia
|
100
|
+
informacoes << "#{convenio}".rjust(6, '0')
|
101
|
+
informacoes << ''.rjust(7, '0')
|
102
|
+
informacoes << '0'
|
103
|
+
informacoes
|
104
|
+
end
|
105
|
+
|
106
|
+
# Complemento do header do arquivo - Chamado em header_arquivo_posicao_212_a_240
|
107
|
+
# DESCRIÇÃO TAMANHO POSIÇÃO
|
108
|
+
# ---------------------------------------------------------
|
109
|
+
# Versão aplicativo CAIXA 04 212 - 215
|
110
|
+
# USO FEBRABAN 25 216 - 240
|
111
|
+
#
|
112
|
+
# TOTAL = 29 posições
|
113
|
+
#
|
114
|
+
def complemento_header_arquivo
|
115
|
+
complemento = "#{versao_aplicativo}".rjust(4, '0') # 04 digitos já ajustado no método
|
116
|
+
complemento << ''.rjust(25, ' ')
|
117
|
+
complemento
|
118
|
+
end
|
119
|
+
|
120
|
+
# segmento_p_posicao_024_a_057
|
121
|
+
# DESCRIÇÃO TAMANHO POSIÇÃO
|
122
|
+
# ---------------------------------------------------------
|
123
|
+
# codigo cedente 06 24 - 29
|
124
|
+
# Uso Caixa 11 30 - 40
|
125
|
+
# Modalidade carteira 02 41 - 42
|
126
|
+
# nosso_numero 15 43 - 57
|
127
|
+
#
|
128
|
+
# TOTAL = 34 posições
|
129
|
+
#
|
130
|
+
def complemento_p(pagamento)
|
131
|
+
complemento = "#{convenio}".rjust(6, '0')
|
132
|
+
complemento << ''.rjust(11, '0')
|
133
|
+
complemento << modalidade_carteira
|
134
|
+
complemento << pagamento.nosso_numero.rjust(15, '0')
|
135
|
+
complemento
|
136
|
+
end
|
137
|
+
|
138
|
+
# Segmento P para numero do documento
|
139
|
+
# DESCRIÇÃO TAMANHO POSIÇÃO
|
140
|
+
# ---------------------------------------------------------
|
141
|
+
# Nr Doc. cobrança 11 63 - 73
|
142
|
+
# Uso da CAIXA 04 74 - 77
|
143
|
+
#
|
144
|
+
# TOTAL = 15 posições
|
145
|
+
#
|
146
|
+
def segmento_p_numero_do_documento(pagamento)
|
147
|
+
complemento = pagamento.numero_documento.to_s.rjust(11, '0')
|
148
|
+
complemento << ''.rjust(4, ' ')
|
149
|
+
complemento
|
150
|
+
end
|
151
|
+
|
152
|
+
# Digito verificador da agência
|
153
|
+
# Segundo a documentação nessa posição vai o valor '0'
|
154
|
+
#
|
155
|
+
# TOTAL = 01 posição
|
156
|
+
#
|
157
|
+
def segmento_p_posicao_106_a_106
|
158
|
+
'0'
|
159
|
+
end
|
160
|
+
|
161
|
+
# Identificação do Título na Empresa
|
162
|
+
# Campo destinado para uso da Empresa Cedente para identificação do Título.
|
163
|
+
# Informar o Número do Documento - Seu Número (mesmo das posições 63-73 do Segmento P)
|
164
|
+
#
|
165
|
+
# TOTAL = 25 posições
|
166
|
+
#
|
167
|
+
def segmento_p_posicao_196_a_220(pagamento)
|
168
|
+
pagamento.numero_documento.to_s.rjust(25, '0')
|
169
|
+
end
|
170
|
+
|
171
|
+
def segmento_s_posicao_019_a_020_tipo_impressao_1_ou_2(pagamento)
|
172
|
+
'00'
|
173
|
+
end
|
174
|
+
def segmento_s_posicao_161_a_162_tipo_impressao_1_ou_2(pagamento)
|
175
|
+
'00'
|
176
|
+
end
|
177
|
+
|
178
|
+
# trailer_lote_posicao_024_a_240(lote, nr_lote)
|
179
|
+
# DESCRIÇÃO TAMANHO POSIÇÃO
|
180
|
+
# ---------------------------------------------------------
|
181
|
+
# Qtd. cobr. Simples 06 24 - 29 _
|
182
|
+
# Val. Tot Cobr. Simples 17 30 - 46 \
|
183
|
+
# Qtd. cobr. Caucionada 06 47 - 52 \
|
184
|
+
# Val. Tot Cobr. Caucionada 17 53 - 69 > VALORES UTILIZADOS APENAS PARA ARQUIVO DE RETORNO
|
185
|
+
# Qtd. cobr. Descontada 06 70 - 75 /
|
186
|
+
# Val. Tot Cobr. Descontada 17 76 - 92 _/
|
187
|
+
# Uso FEBRABAN 148 93 - 240
|
188
|
+
#
|
189
|
+
# TOTAL = 217 posições
|
190
|
+
#
|
191
|
+
def complemento_trailer_lote(lote, nr_lote)
|
192
|
+
complemento = ''
|
193
|
+
complemento << ''.rjust(69, '0') # VALORES UTILIZADOS APENAS PARA ARQUIVO DE RETORNO
|
194
|
+
complemento << ''.rjust(148, ' ') # USO EXCLUSIVO FEBRABAN
|
195
|
+
complemento
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
@@ -71,7 +71,7 @@ module BrBoleto
|
|
71
71
|
# 14 Posições
|
72
72
|
#
|
73
73
|
def header_arquivo_posicao_019_a_032
|
74
|
-
documento_cedente.
|
74
|
+
BrBoleto::Helper::CpfCnpj.new(documento_cedente).sem_formatacao.rjust(14, '0')
|
75
75
|
end
|
76
76
|
|
77
77
|
# Código do Convênio no Banco
|
@@ -177,7 +177,7 @@ module BrBoleto
|
|
177
177
|
# 29 posições
|
178
178
|
#
|
179
179
|
def header_arquivo_posicao_212_a_240
|
180
|
-
|
180
|
+
complemento_header_arquivo
|
181
181
|
end
|
182
182
|
end
|
183
183
|
end
|
@@ -56,6 +56,10 @@ module BrBoleto
|
|
56
56
|
|
57
57
|
# Tipo da Operação
|
58
58
|
# 1 posição
|
59
|
+
#
|
60
|
+
# 'R' = Arquivo Remessa
|
61
|
+
# 'T' = Arquivo Retorno
|
62
|
+
#
|
59
63
|
#
|
60
64
|
def header_lote_posicao_009_a_009
|
61
65
|
'R'
|
@@ -64,6 +68,11 @@ module BrBoleto
|
|
64
68
|
# Tipo do Serviço
|
65
69
|
# 2 posições
|
66
70
|
#
|
71
|
+
# '01' = Cobrança Registrada
|
72
|
+
# '02' = Cobrança Sem Registro / Serviços
|
73
|
+
# '03' = Desconto de Títulos
|
74
|
+
# '04' = Caução de Títulos
|
75
|
+
#
|
67
76
|
def header_lote_posicao_010_a_011
|
68
77
|
'01'
|
69
78
|
end
|
@@ -100,7 +109,7 @@ module BrBoleto
|
|
100
109
|
# 15 posições
|
101
110
|
#
|
102
111
|
def header_lote_posicao_019_a_033
|
103
|
-
documento_cedente.
|
112
|
+
BrBoleto::Helper::CpfCnpj.new(documento_cedente).sem_formatacao.rjust(15, '0')
|
104
113
|
end
|
105
114
|
|
106
115
|
# Convenio -> Código do Cedente no Banco
|
@@ -49,7 +49,7 @@ module BrBoleto
|
|
49
49
|
segmento_p << segmento_p_posicao_151_a_165(pagamento) # valor desconto 15
|
50
50
|
segmento_p << segmento_p_posicao_166_a_180(pagamento) # valor IOF 15
|
51
51
|
segmento_p << segmento_p_posicao_181_a_195(pagamento) # valor abatimento 15
|
52
|
-
segmento_p << segmento_p_posicao_196_a_220
|
52
|
+
segmento_p << segmento_p_posicao_196_a_220(pagamento) # identificacao titulo empresa 25 *
|
53
53
|
segmento_p << segmento_p_posicao_221_a_221 # cod. para protesto 1 *
|
54
54
|
segmento_p << segmento_p_posicao_222_a_223 # dias para protesto 2 *
|
55
55
|
segmento_p << segmento_p_posicao_224_a_224 # cod. para baixa 1 *
|
@@ -289,7 +289,7 @@ module BrBoleto
|
|
289
289
|
# Identificação do Título na Empresa
|
290
290
|
# 25 posições
|
291
291
|
#
|
292
|
-
def segmento_p_posicao_196_a_220
|
292
|
+
def segmento_p_posicao_196_a_220(pagamento)
|
293
293
|
''.rjust(25, ' ')
|
294
294
|
end
|
295
295
|
|
@@ -105,7 +105,7 @@ module BrBoleto
|
|
105
105
|
# 15 posições
|
106
106
|
#
|
107
107
|
def segmento_q_posicao_019_a_033(pagamento)
|
108
|
-
pagamento.documento_sacado.
|
108
|
+
BrBoleto::Helper::CpfCnpj.new(pagamento.documento_sacado).sem_formatacao.rjust(15, '0')
|
109
109
|
end
|
110
110
|
|
111
111
|
# Nome do sacado
|
@@ -168,7 +168,7 @@ module BrBoleto
|
|
168
168
|
# 15 posições
|
169
169
|
#
|
170
170
|
def segmento_q_posicao_155_a_169(pagamento)
|
171
|
-
"#{pagamento.documento_avalista}".rjust(15, '0')
|
171
|
+
BrBoleto::Helper::CpfCnpj.new("#{pagamento.documento_avalista}").sem_formatacao.rjust(15, '0')
|
172
172
|
end
|
173
173
|
|
174
174
|
# Nome do avalista
|