br_boleto 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|