brcobranca 4.1.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -1
- data/.rspec +1 -0
- data/.rubocop.yml +1 -1
- data/.travis.yml +2 -1
- data/Gemfile +4 -4
- data/Gemfile.lock +65 -53
- data/README.md +18 -5
- data/brcobranca.gemspec +8 -6
- data/lib/brcobranca/boleto/banco_brasil.rb +25 -27
- data/lib/brcobranca/boleto/base.rb +13 -6
- data/lib/brcobranca/boleto/bradesco.rb +4 -1
- data/lib/brcobranca/boleto/caixa.rb +14 -4
- data/lib/brcobranca/boleto/hsbc.rb +26 -26
- data/lib/brcobranca/boleto/santander.rb +6 -3
- data/lib/brcobranca/boleto/sicredi.rb +3 -5
- data/lib/brcobranca/boleto/template/rghost.rb +7 -5
- data/lib/brcobranca/boleto/template/rghost_carne.rb +1 -2
- data/lib/brcobranca/calculo.rb +19 -93
- data/lib/brcobranca/formatacao_string.rb +21 -0
- data/lib/brcobranca/remessa/base.rb +59 -0
- data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +117 -0
- data/lib/brcobranca/remessa/cnab240/base.rb +379 -0
- data/lib/brcobranca/remessa/cnab240/caixa.rb +103 -0
- data/lib/brcobranca/remessa/cnab400/base.rb +112 -0
- data/lib/brcobranca/remessa/cnab400/bradesco.rb +128 -0
- data/lib/brcobranca/remessa/cnab400/itau.rb +149 -0
- data/lib/brcobranca/remessa/pagamento.rb +159 -0
- data/lib/brcobranca/retorno/base.rb +1 -0
- data/lib/brcobranca/retorno/retorno_cnab400.rb +0 -2
- data/lib/brcobranca/version.rb +1 -1
- data/lib/brcobranca.rb +33 -17
- data/spec/brcobranca/banco_bradesco_spec.rb +0 -2
- data/spec/brcobranca/banco_brasil_spec.rb +0 -2
- data/spec/brcobranca/banco_caixa_spec.rb +0 -2
- data/spec/brcobranca/banco_hsbc_spec.rb +0 -3
- data/spec/brcobranca/banco_itau_spec.rb +0 -1
- data/spec/brcobranca/banco_santander_spec.rb +14 -14
- data/spec/brcobranca/banco_sicredi_spec.rb +0 -2
- data/spec/brcobranca/base_spec.rb +11 -0
- data/spec/brcobranca/boletos_em_lote_spec.rb +0 -2
- data/spec/brcobranca/core_ext_spec.rb +104 -58
- data/spec/brcobranca/remessa/base_spec.rb +87 -0
- data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +200 -0
- data/spec/brcobranca/remessa/cnab240/base_spec.rb +88 -0
- data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +137 -0
- data/spec/brcobranca/remessa/cnab400/base_spec.rb +51 -0
- data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +174 -0
- data/spec/brcobranca/remessa/cnab400/itau_spec.rb +160 -0
- data/spec/brcobranca/remessa/pagamento_spec.rb +197 -0
- data/spec/brcobranca/retorno_cbr643_spec.rb +0 -2
- data/spec/brcobranca/rghost_spec.rb +0 -2
- data/spec/shared_examples/cnab240.rb +206 -0
- data/spec/shared_examples/cnab400.rb +85 -0
- metadata +34 -4
@@ -0,0 +1,128 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Brcobranca
|
3
|
+
module Remessa
|
4
|
+
module Cnab400
|
5
|
+
class Bradesco < Brcobranca::Remessa::Cnab400::Base
|
6
|
+
# codigo da empresa (informado pelo Bradesco no cadastramento)
|
7
|
+
attr_accessor :codigo_empresa
|
8
|
+
|
9
|
+
validates_presence_of :codigo_empresa, :sequencial_remessa,
|
10
|
+
:digito_conta, message: 'não pode estar em branco.'
|
11
|
+
validates_length_of :codigo_empresa, maximum: 20, message: 'deve ser menor ou igual a 20 dígitos.'
|
12
|
+
validates_length_of :agencia, maximum: 5, message: 'deve ter 5 dígitos.'
|
13
|
+
validates_length_of :conta_corrente, maximum: 7, message: 'deve ter 7 dígitos.'
|
14
|
+
validates_length_of :sequencial_remessa, maximum: 7, message: 'deve ter 7 dígitos.'
|
15
|
+
validates_length_of :carteira, maximum: 2, message: 'deve ter no máximo 2 dígitos.'
|
16
|
+
|
17
|
+
def agencia=(valor)
|
18
|
+
@agencia = valor.to_s.rjust(5, '0') if valor
|
19
|
+
end
|
20
|
+
|
21
|
+
def conta_corrente=(valor)
|
22
|
+
@conta_corrente = valor.to_s.rjust(7, '0') if valor
|
23
|
+
end
|
24
|
+
|
25
|
+
def codigo_empresa=(valor)
|
26
|
+
@codigo_empresa = valor.to_s.rjust(20, '0') if valor
|
27
|
+
end
|
28
|
+
|
29
|
+
def sequencial_remessa=(valor)
|
30
|
+
@sequencial_remessa = valor.to_s.rjust(7, '0') if valor
|
31
|
+
end
|
32
|
+
|
33
|
+
def info_conta
|
34
|
+
codigo_empresa
|
35
|
+
end
|
36
|
+
|
37
|
+
def cod_banco
|
38
|
+
'237'
|
39
|
+
end
|
40
|
+
|
41
|
+
def nome_banco
|
42
|
+
'BRADESCO'.ljust(15, ' ')
|
43
|
+
end
|
44
|
+
|
45
|
+
def complemento
|
46
|
+
"#{''.rjust(8, ' ')}MX#{sequencial_remessa}#{''.rjust(277, ' ')}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def identificacao_empresa
|
50
|
+
# identificacao da empresa no banco
|
51
|
+
identificacao = '0' # vazio [1]
|
52
|
+
identificacao << carteira.to_s.rjust(3, '0') # carteira [3]
|
53
|
+
identificacao << agencia # codigo da agencia (sem dv) [5]
|
54
|
+
identificacao << conta_corrente # codigo da conta [7]
|
55
|
+
identificacao << digito_conta # digito da conta [1]
|
56
|
+
end
|
57
|
+
|
58
|
+
def digito_nosso_numero(nosso_numero)
|
59
|
+
"#{carteira}#{nosso_numero.to_s.rjust(11, '0')}".modulo11(
|
60
|
+
multiplicador: [2, 3, 4, 5, 6, 7],
|
61
|
+
mapeamento: { 10 => 'P', 11 => 0 }
|
62
|
+
) { |total| 11 - (total % 11) }
|
63
|
+
end
|
64
|
+
|
65
|
+
# Formata o endereco do sacado
|
66
|
+
# de acordo com os caracteres disponiveis (40)
|
67
|
+
# concatenando o endereco, cidade e uf
|
68
|
+
#
|
69
|
+
def formata_endereco_sacado(pgto)
|
70
|
+
ret = "#{pgto.endereco_sacado}, #{pgto.cidade_sacado}/#{pgto.uf_sacado}".ljust(40, ' ')
|
71
|
+
return ret if ret.size == 40
|
72
|
+
"#{pgto.endereco_sacado[0..19]} #{pgto.cidade_sacado[0..14]}/#{pgto.uf_sacado}".ljust(40, ' ')
|
73
|
+
end
|
74
|
+
|
75
|
+
def monta_detalhe(pagamento, sequencial)
|
76
|
+
fail Brcobranca::RemessaInvalida.new(pagamento) if pagamento.invalid?
|
77
|
+
|
78
|
+
detalhe = '1' # identificacao do registro 9[01] 001 a 001
|
79
|
+
detalhe << ''.rjust(5, '0') # agencia de debito (op) 9[05] 002 a 006
|
80
|
+
detalhe << ''.rjust(1, '0') # digito da agencia de debito (op) X[01] 007 a 007
|
81
|
+
detalhe << ''.rjust(5, '0') # razao da conta corrente de debito (op) 9[05] 008 a 012
|
82
|
+
detalhe << ''.rjust(7, '0') # conta corrente (op) 9[07] 013 a 019
|
83
|
+
detalhe << ''.rjust(1, '0') # digito da conta corrente (op) X[01] 020 a 020
|
84
|
+
detalhe << identificacao_empresa # identficacao da empresa X[17] 021 a 037
|
85
|
+
detalhe << ''.rjust(25, ' ') # num. controle X[25] 038 a 062
|
86
|
+
detalhe << cod_banco # codigo do banco 9[03] 063 a 065
|
87
|
+
detalhe << ''.rjust(1, '0') # campo da multa 9[01] 066 a 066 *
|
88
|
+
detalhe << ''.rjust(4, '0') # percentual multa 9[04] 067 a 070 *
|
89
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(11, '0') # identificacao do titulo (nosso numero) 9[11] 071 a 081
|
90
|
+
detalhe << digito_nosso_numero(pagamento.nosso_numero) # digito de conferencia do nosso numero (dv) X[01] 082 a 082
|
91
|
+
detalhe << ''.rjust(10, '0') # desconto por dia 9[10] 083 a 092
|
92
|
+
detalhe << '2' # condicao emissao boleto (2 = cliente) 9[01] 093 a 093
|
93
|
+
detalhe << 'N' # emite boleto para debito X[01] 094 a 094
|
94
|
+
detalhe << ''.rjust(10, ' ') # operacao no banco (brancos) X[10] 095 a 104
|
95
|
+
detalhe << ' ' # indicador rateio X[01] 105 a 105
|
96
|
+
detalhe << ' ' # endereco para aviso debito (op) 9[01] 106 a 106
|
97
|
+
detalhe << ''.rjust(2, ' ') # brancos X[02] 107 a 108
|
98
|
+
detalhe << '01' # identif. da ocorrencia 9[02] 109 a 110
|
99
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(10, ' ') # numero do documento alfanum. X[10] 111 a 120
|
100
|
+
detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data de vencimento 9[06] 121 a 126
|
101
|
+
detalhe << pagamento.formata_valor # valor do titulo 9[13] 127 a 139
|
102
|
+
detalhe << ''.rjust(3, '0') # banco encarregado (zeros) 9[03] 140 a 142
|
103
|
+
detalhe << ''.rjust(5, '0') # agencia depositaria (zeros) 9[05] 143 a 147
|
104
|
+
detalhe << '99' # especie do titulo 9[02] 148 a 149
|
105
|
+
detalhe << 'N' # identificacao (sempre N) X[01] 150 a 150
|
106
|
+
detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06] 151 a 156
|
107
|
+
detalhe << ''.rjust(2, '0') # 1a instrucao 9[02] 157 a 158
|
108
|
+
detalhe << ''.rjust(2, '0') # 2a instrucao 9[02] 159 a 160
|
109
|
+
detalhe << pagamento.formata_valor_mora # mora 9[13] 161 a 173
|
110
|
+
detalhe << pagamento.formata_data_desconto # data desconto 9[06] 174 a 179
|
111
|
+
detalhe << pagamento.formata_valor_desconto # valor desconto 9[13] 180 a 192
|
112
|
+
detalhe << pagamento.formata_valor_iof # valor iof 9[13] 193 a 205
|
113
|
+
detalhe << pagamento.formata_valor_abatimento # valor abatimento 9[13] 206 a 218
|
114
|
+
detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02] 219 a 220
|
115
|
+
detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # cpf/cnpj do pagador 9[14] 221 a 234
|
116
|
+
detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador 9[40] 235 a 274
|
117
|
+
detalhe << formata_endereco_sacado(pagamento) # endereco do pagador X[40] 275 a 314
|
118
|
+
detalhe << ''.rjust(12, ' ') # 1a mensagem X[12] 315 a 326
|
119
|
+
detalhe << pagamento.cep_sacado[0..4] # cep do pagador 9[05] 327 a 331
|
120
|
+
detalhe << pagamento.cep_sacado[5..7] # sufixo do cep do pagador 9[03] 332 a 334
|
121
|
+
detalhe << ''.rjust(60, ' ') # sacador/2a mensagem - verificar X[60] 335 a 394
|
122
|
+
detalhe << sequencial.to_s.rjust(6, '0') # numero do registro do arquivo 9[06] 395 a 400
|
123
|
+
detalhe.upcase
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Brcobranca
|
3
|
+
module Remessa
|
4
|
+
module Cnab400
|
5
|
+
class Itau < Brcobranca::Remessa::Cnab400::Base
|
6
|
+
# documento do cedente
|
7
|
+
attr_accessor :documento_cedente
|
8
|
+
|
9
|
+
validates_presence_of :agencia, :conta_corrente, :documento_cedente, message: 'não pode estar em branco.'
|
10
|
+
validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
|
11
|
+
validates_length_of :conta_corrente, maximum: 5, message: 'deve ter 5 dígitos.'
|
12
|
+
validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
|
13
|
+
validates_length_of :carteira, maximum: 3, message: 'deve ter no máximo 3 dígitos.'
|
14
|
+
|
15
|
+
# Nova instancia do Itau
|
16
|
+
def initialize(campos = {})
|
17
|
+
campos = { aceite: 'N' }.merge!(campos)
|
18
|
+
super(campos)
|
19
|
+
end
|
20
|
+
|
21
|
+
def agencia=(valor)
|
22
|
+
@agencia = valor.to_s.rjust(4, '0') if valor
|
23
|
+
end
|
24
|
+
|
25
|
+
def conta_corrente=(valor)
|
26
|
+
@conta_corrente = valor.to_s.rjust(5, '0') if valor
|
27
|
+
end
|
28
|
+
|
29
|
+
def carteira=(valor)
|
30
|
+
@carteira = valor.to_s.rjust(3, '0') if valor
|
31
|
+
end
|
32
|
+
|
33
|
+
def cod_banco
|
34
|
+
'341'
|
35
|
+
end
|
36
|
+
|
37
|
+
def nome_banco
|
38
|
+
'BANCO ITAU SA'.ljust(15, ' ')
|
39
|
+
end
|
40
|
+
|
41
|
+
# Informacoes da conta corrente do cedente
|
42
|
+
#
|
43
|
+
# @return [String]
|
44
|
+
#
|
45
|
+
def info_conta
|
46
|
+
# CAMPO TAMANHO
|
47
|
+
# agencia 4
|
48
|
+
# complemento 2
|
49
|
+
# conta corrente 5
|
50
|
+
# digito da conta 1
|
51
|
+
# complemento 8\
|
52
|
+
"#{agencia}00#{conta_corrente}#{digito_conta}#{''.rjust(8, ' ')}"
|
53
|
+
end
|
54
|
+
|
55
|
+
# Complemento do header
|
56
|
+
# (no caso do Itau, sao apenas espacos em branco)
|
57
|
+
#
|
58
|
+
# @return [String]
|
59
|
+
#
|
60
|
+
def complemento
|
61
|
+
''.rjust(294, ' ')
|
62
|
+
end
|
63
|
+
|
64
|
+
# Tipo de empresa (fisica ou juridica)
|
65
|
+
# de acordo com o documento (CPF/CNPJ)
|
66
|
+
#
|
67
|
+
# @author Isabella Santos
|
68
|
+
#
|
69
|
+
def tipo_empresa
|
70
|
+
documento_cedente.size < 14 ? '01' : '02'
|
71
|
+
end
|
72
|
+
|
73
|
+
# Codigo da carteira de acordo com a documentacao o Itau
|
74
|
+
# se a carteira nao forem as testadas (150, 191 e 147)
|
75
|
+
# retorna 'I' que é o codigo das carteiras restantes na documentacao
|
76
|
+
#
|
77
|
+
# @return [String]
|
78
|
+
#
|
79
|
+
def codigo_carteira
|
80
|
+
return 'U' if carteira.to_s == '150'
|
81
|
+
return '1' if carteira.to_s == '191'
|
82
|
+
return 'E' if carteira.to_s == '147'
|
83
|
+
'I'
|
84
|
+
end
|
85
|
+
|
86
|
+
# Detalhe do arquivo
|
87
|
+
#
|
88
|
+
# @param pagamento [PagamentoCnab400]
|
89
|
+
# objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
|
90
|
+
# @param sequencial
|
91
|
+
# num. sequencial do registro no arquivo
|
92
|
+
#
|
93
|
+
# @return [String]
|
94
|
+
#
|
95
|
+
def monta_detalhe(pagamento, sequencial)
|
96
|
+
fail Brcobranca::RemessaInvalida.new(pagamento) if pagamento.invalid?
|
97
|
+
|
98
|
+
detalhe = '1' # identificacao transacao 9[01]
|
99
|
+
detalhe << tipo_empresa # tipo de identificacao da empresa 9[02]
|
100
|
+
detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
|
101
|
+
detalhe << agencia # agencia 9[04]
|
102
|
+
detalhe << ''.rjust(2, '0') # complemento de registro (zeros) 9[02]
|
103
|
+
detalhe << conta_corrente # conta corrente 9[05]
|
104
|
+
detalhe << digito_conta # dac 9[01]
|
105
|
+
detalhe << ''.rjust(4, ' ') # complemento do registro (brancos) X[04]
|
106
|
+
detalhe << ''.rjust(4, '0') # codigo cancelamento (zeros) 9[04]
|
107
|
+
detalhe << ''.rjust(25, ' ') # identificacao do tit. na empresa X[25]
|
108
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(8, '0') # nosso numero 9[08]
|
109
|
+
detalhe << ''.rjust(13, '0') # quantidade de moeda variavel 9[13]
|
110
|
+
detalhe << carteira # carteira 9[03]
|
111
|
+
detalhe << ''.rjust(21, ' ') # identificacao da operacao no banco X[21]
|
112
|
+
detalhe << codigo_carteira # codigo da carteira X[01]
|
113
|
+
detalhe << '01' # identificacao ocorrencia (remessa) 9[02]
|
114
|
+
detalhe << pagamento.nosso_numero.to_s.rjust(10, '0') # numero do documento X[10]
|
115
|
+
detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
|
116
|
+
detalhe << pagamento.formata_valor # valor do documento 9[13]
|
117
|
+
detalhe << cod_banco # codigo banco 9[03]
|
118
|
+
detalhe << ''.rjust(5, ' ') # agencia cobradora - deixar zero 9[05]
|
119
|
+
detalhe << '99' # especie do titulo X[02]
|
120
|
+
detalhe << aceite # aceite (A/N) X[01]
|
121
|
+
detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
|
122
|
+
detalhe << ''.rjust(2, ' ') # 1a instrucao X[02]
|
123
|
+
detalhe << ''.rjust(2, ' ') # 2a instrucao X[02]
|
124
|
+
detalhe << pagamento.formata_valor_mora # valor mora ao dia 9[13]
|
125
|
+
detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
|
126
|
+
detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
|
127
|
+
detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
|
128
|
+
detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
|
129
|
+
detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02]
|
130
|
+
detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
|
131
|
+
detalhe << pagamento.nome_sacado.format_size(30) # nome do pagador X[30]
|
132
|
+
detalhe << ''.rjust(10, ' ') # complemento do registro (brancos) X[10]
|
133
|
+
detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40]
|
134
|
+
detalhe << pagamento.bairro_sacado.format_size(12) # bairro do pagador X[12]
|
135
|
+
detalhe << pagamento.cep_sacado # cep do pagador 9[08]
|
136
|
+
detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
|
137
|
+
detalhe << pagamento.uf_sacado # uf do pagador X[02]
|
138
|
+
detalhe << pagamento.nome_avalista.format_size(30) # nome do sacador/avalista X[30]
|
139
|
+
detalhe << ''.rjust(4, ' ') # complemento do registro X[04]
|
140
|
+
detalhe << ''.rjust(6, '0') # data da mora 9[06] *
|
141
|
+
detalhe << '03' # quantidade de dias do prazo 9[02] *
|
142
|
+
detalhe << ''.rjust(1, ' ') # complemento do registro (brancos) X[01]
|
143
|
+
detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
|
144
|
+
detalhe.upcase
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Brcobranca
|
3
|
+
module Remessa
|
4
|
+
class Pagamento
|
5
|
+
# Validações do Rails 3
|
6
|
+
include ActiveModel::Validations
|
7
|
+
|
8
|
+
# <b>REQUERIDO</b>: nosso numero
|
9
|
+
attr_accessor :nosso_numero
|
10
|
+
# <b>REQUERIDO</b>: data do vencimento do boleto
|
11
|
+
attr_accessor :data_vencimento
|
12
|
+
# <b>REQUERIDO</b>: data de emissao do boleto
|
13
|
+
attr_accessor :data_emissao
|
14
|
+
# <b>REQUERIDO</b>: valor do boleto
|
15
|
+
attr_accessor :valor
|
16
|
+
# <b>REQUERIDO</b>: documento do sacado (cliente)
|
17
|
+
attr_accessor :documento_sacado
|
18
|
+
# <b>REQUERIDO</b>: nome do sacado (cliente)
|
19
|
+
attr_accessor :nome_sacado
|
20
|
+
# <b>REQUERIDO</b>: endereco do sacado (cliente)
|
21
|
+
attr_accessor :endereco_sacado
|
22
|
+
# <b>REQUERIDO</b>: bairro do sacado (cliente)
|
23
|
+
attr_accessor :bairro_sacado
|
24
|
+
# <b>REQUERIDO</b>: CEP do sacado (cliente)
|
25
|
+
attr_accessor :cep_sacado
|
26
|
+
# <b>REQUERIDO</b>: cidade do sacado (cliente)
|
27
|
+
attr_accessor :cidade_sacado
|
28
|
+
# <b>REQUERIDO</b>: UF do sacado (cliente)
|
29
|
+
attr_accessor :uf_sacado
|
30
|
+
# <b>OPCIONAL</b>: nome do avalista
|
31
|
+
attr_accessor :nome_avalista
|
32
|
+
# <b>OPCIONAL</b>: documento do avalista
|
33
|
+
attr_accessor :documento_avalista
|
34
|
+
# <b>OPCIONAL</b>: codigo da 1a instrucao
|
35
|
+
attr_accessor :cod_primeira_instrucao
|
36
|
+
# <b>OPCIONAL</b>: codigo da 2a instrucao
|
37
|
+
attr_accessor :cod_segunda_instrucao
|
38
|
+
# <b>OPCIONAL</b>: valor da mora ao dia
|
39
|
+
attr_accessor :valor_mora
|
40
|
+
# <b>OPCIONAL</b>: data limite para o desconto
|
41
|
+
attr_accessor :data_desconto
|
42
|
+
# <b>OPCIONAL</b>: valor a ser concedido de desconto
|
43
|
+
attr_accessor :valor_desconto
|
44
|
+
# <b>OPCIONAL</b>: codigo do desconto (para CNAB240)
|
45
|
+
attr_accessor :cod_desconto
|
46
|
+
# <b>OPCIONAL</b>: valor do IOF
|
47
|
+
attr_accessor :valor_iof
|
48
|
+
# <b>OPCIONAL</b>: valor do abatimento
|
49
|
+
attr_accessor :valor_abatimento
|
50
|
+
|
51
|
+
validates_presence_of :nosso_numero, :data_vencimento, :valor,
|
52
|
+
:documento_sacado, :nome_sacado, :endereco_sacado,
|
53
|
+
:cep_sacado, :cidade_sacado, :uf_sacado, message: 'não pode estar em branco.'
|
54
|
+
validates_length_of :cep_sacado, is: 8, message: 'deve ter 8 dígitos.'
|
55
|
+
validates_length_of :cod_desconto, is: 1, message: 'deve ter 1 dígito.'
|
56
|
+
|
57
|
+
# Nova instancia da classe Pagamento
|
58
|
+
#
|
59
|
+
# @param campos [Hash]
|
60
|
+
#
|
61
|
+
def initialize(campos = {})
|
62
|
+
padrao = {
|
63
|
+
data_emissao: Date.today,
|
64
|
+
valor_mora: 0.0,
|
65
|
+
valor_desconto: 0.0,
|
66
|
+
valor_iof: 0.0,
|
67
|
+
valor_abatimento: 0.0,
|
68
|
+
nome_avalista: '',
|
69
|
+
cod_desconto: '0'
|
70
|
+
}
|
71
|
+
|
72
|
+
campos = padrao.merge!(campos)
|
73
|
+
campos.each do |campo, valor|
|
74
|
+
send "#{campo}=", valor
|
75
|
+
end
|
76
|
+
|
77
|
+
yield self if block_given?
|
78
|
+
end
|
79
|
+
|
80
|
+
# Formata a data de desconto de acordo com o formato passado
|
81
|
+
#
|
82
|
+
# @return [String]
|
83
|
+
#
|
84
|
+
def formata_data_desconto(formato = '%d%m%y')
|
85
|
+
data_desconto.strftime(formato)
|
86
|
+
rescue
|
87
|
+
if formato == '%d%m%y'
|
88
|
+
'000000'
|
89
|
+
else
|
90
|
+
'00000000'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Formata o campo valor
|
95
|
+
# referentes as casas decimais
|
96
|
+
# exe. R$199,90 => 0000000019990
|
97
|
+
#
|
98
|
+
# @param tamanho [Integer]
|
99
|
+
# quantidade de caracteres a ser retornado
|
100
|
+
#
|
101
|
+
def formata_valor(tamanho = 13)
|
102
|
+
sprintf('%.2f', valor).delete('.').rjust(tamanho, '0')
|
103
|
+
end
|
104
|
+
|
105
|
+
# Formata o campo valor da mora
|
106
|
+
#
|
107
|
+
# @param tamanho [Integer]
|
108
|
+
# quantidade de caracteres a ser retornado
|
109
|
+
#
|
110
|
+
def formata_valor_mora(tamanho = 13)
|
111
|
+
sprintf('%.2f', valor_mora).delete('.').rjust(tamanho, '0')
|
112
|
+
end
|
113
|
+
|
114
|
+
# Formata o campo valor do desconto
|
115
|
+
#
|
116
|
+
# @param tamanho [Integer]
|
117
|
+
# quantidade de caracteres a ser retornado
|
118
|
+
#
|
119
|
+
def formata_valor_desconto(tamanho = 13)
|
120
|
+
sprintf('%.2f', valor_desconto).delete('.').rjust(tamanho, '0')
|
121
|
+
end
|
122
|
+
|
123
|
+
# Formata o campo valor do IOF
|
124
|
+
#
|
125
|
+
# @param tamanho [Integer]
|
126
|
+
# quantidade de caracteres a ser retornado
|
127
|
+
#
|
128
|
+
def formata_valor_iof(tamanho = 13)
|
129
|
+
sprintf('%.2f', valor_iof).delete('.').rjust(tamanho, '0')
|
130
|
+
end
|
131
|
+
|
132
|
+
# Formata o campo valor do IOF
|
133
|
+
#
|
134
|
+
# @param tamanho [Integer]
|
135
|
+
# quantidade de caracteres a ser retornado
|
136
|
+
#
|
137
|
+
def formata_valor_abatimento(tamanho = 13)
|
138
|
+
sprintf('%.2f', valor_abatimento).delete('.').rjust(tamanho, '0')
|
139
|
+
end
|
140
|
+
|
141
|
+
# Retorna a identificacao do pagador
|
142
|
+
# Se for pessoa fisica (CPF com 11 digitos) é 1
|
143
|
+
# Se for juridica (CNPJ com 14 digitos) é 2
|
144
|
+
#
|
145
|
+
def identificacao_sacado(tamanho = 2)
|
146
|
+
documento_sacado.size < 14 ? '1'.rjust(tamanho, '0') : '2'.rjust(tamanho, '0')
|
147
|
+
end
|
148
|
+
|
149
|
+
# Retorna a identificacao do avalista
|
150
|
+
# Se for pessoa fisica (CPF com 11 digitos) é 1
|
151
|
+
# Se for juridica (CNPJ com 14 digitos) é 2
|
152
|
+
#
|
153
|
+
def identificacao_avalista(tamanho = 2)
|
154
|
+
return 0 if documento_avalista.nil?
|
155
|
+
documento_avalista.size < 14 ? '1'.rjust(tamanho, '0') : '2'.rjust(tamanho, '0')
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -17,7 +17,6 @@ module Brcobranca
|
|
17
17
|
end
|
18
18
|
|
19
19
|
fixed_width_layout do |parse|
|
20
|
-
|
21
20
|
# Todos os campos descritos no documento em ordem
|
22
21
|
# :tipo_de_registro, 0..0 # identificacao do registro transacao
|
23
22
|
# :codigo_de_inscricao, 1..2 # identificacao do tipo de inscrica/empresa
|
@@ -130,7 +129,6 @@ module Brcobranca
|
|
130
129
|
# parse.field :indicativo_lancamento,318..318
|
131
130
|
# parse.field :indicador_valor,319..319
|
132
131
|
# parse.field :valor_ajuste,320..331
|
133
|
-
|
134
132
|
end
|
135
133
|
end
|
136
134
|
end
|
data/lib/brcobranca/version.rb
CHANGED
data/lib/brcobranca.rb
CHANGED
@@ -1,27 +1,12 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
2
|
+
require 'active_model'
|
3
3
|
require 'brcobranca/calculo'
|
4
4
|
require 'brcobranca/limpeza'
|
5
5
|
require 'brcobranca/formatacao'
|
6
|
+
require 'brcobranca/formatacao_string'
|
6
7
|
require 'brcobranca/calculo_data'
|
7
8
|
require 'brcobranca/currency'
|
8
9
|
|
9
|
-
begin
|
10
|
-
require 'date'
|
11
|
-
rescue LoadError
|
12
|
-
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
13
|
-
gem 'date'
|
14
|
-
require 'date'
|
15
|
-
end
|
16
|
-
|
17
|
-
begin
|
18
|
-
require 'active_model'
|
19
|
-
rescue LoadError
|
20
|
-
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
21
|
-
gem 'active_model', '>= 3.0.0'
|
22
|
-
require 'active_model'
|
23
|
-
end
|
24
|
-
|
25
10
|
module Brcobranca
|
26
11
|
# Exception lançada quando algum tipo de boleto soicitado ainda não tiver sido implementado.
|
27
12
|
class NaoImplementado < NotImplementedError
|
@@ -40,6 +25,19 @@ module Brcobranca
|
|
40
25
|
end
|
41
26
|
end
|
42
27
|
|
28
|
+
# Exception lançada quando os dados informados para o arquivo remessa estão inválidos.
|
29
|
+
#
|
30
|
+
# Você pode usar assim na sua aplicação:
|
31
|
+
# rescue Brcobranca::RemessaInvalida => invalido
|
32
|
+
# puts invalido.errors
|
33
|
+
class RemessaInvalida < StandardError
|
34
|
+
# Atribui o objeto boleto e pega seus erros de validação
|
35
|
+
def initialize(remessa)
|
36
|
+
errors = remessa.errors.full_messages.join(', ')
|
37
|
+
super(errors)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
43
41
|
# Configurações do Brcobranca.
|
44
42
|
#
|
45
43
|
# Para mudar as configurações padrão, você pode fazer assim:
|
@@ -117,4 +115,22 @@ module Brcobranca
|
|
117
115
|
autoload :RetornoCnab240, 'brcobranca/retorno/retorno_cnab240'
|
118
116
|
autoload :RetornoCnab400, 'brcobranca/retorno/retorno_cnab400'
|
119
117
|
end
|
118
|
+
|
119
|
+
# Módulos para as classes que geram os arquivos remessa
|
120
|
+
module Remessa
|
121
|
+
autoload :Base, 'brcobranca/remessa/base'
|
122
|
+
autoload :Pagamento, 'brcobranca/remessa/pagamento'
|
123
|
+
|
124
|
+
module Cnab400
|
125
|
+
autoload :Base, 'brcobranca/remessa/cnab400/base'
|
126
|
+
autoload :Bradesco, 'brcobranca/remessa/cnab400/bradesco'
|
127
|
+
autoload :Itau, 'brcobranca/remessa/cnab400/itau'
|
128
|
+
end
|
129
|
+
|
130
|
+
module Cnab240
|
131
|
+
autoload :Base, 'brcobranca/remessa/cnab240/base'
|
132
|
+
autoload :Caixa, 'brcobranca/remessa/cnab240/caixa'
|
133
|
+
autoload :BancoBrasil, 'brcobranca/remessa/cnab240/banco_brasil'
|
134
|
+
end
|
135
|
+
end
|
120
136
|
end
|
@@ -38,7 +38,6 @@ describe Brcobranca::Boleto::Bradesco do
|
|
38
38
|
expect(boleto_novo.valor_documento).to eql(0.0)
|
39
39
|
expect(boleto_novo.local_pagamento).to eql('Pagável preferencialmente na Rede Bradesco ou Bradesco Expresso')
|
40
40
|
expect(boleto_novo.carteira).to eql('06')
|
41
|
-
|
42
41
|
end
|
43
42
|
|
44
43
|
it 'Criar nova instancia com atributos válidos' do
|
@@ -188,5 +187,4 @@ describe Brcobranca::Boleto::Bradesco do
|
|
188
187
|
expect(File.exist?(tmp_file.path)).to be_falsey
|
189
188
|
end
|
190
189
|
end
|
191
|
-
|
192
190
|
end
|
@@ -2,7 +2,6 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Brcobranca::Boleto::BancoBrasil do #:nodoc:[all]
|
5
|
-
|
6
5
|
before(:each) do
|
7
6
|
@valid_attributes = {
|
8
7
|
especie_documento: 'DM',
|
@@ -315,5 +314,4 @@ describe Brcobranca::Boleto::BancoBrasil do #:nodoc:[all]
|
|
315
314
|
expect(File.exist?(tmp_file.path)).to be_falsey
|
316
315
|
end
|
317
316
|
end
|
318
|
-
|
319
317
|
end
|
@@ -2,7 +2,6 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Brcobranca::Boleto::Caixa do #:nodoc:[all]
|
5
|
-
|
6
5
|
before do
|
7
6
|
@valid_attributes = {
|
8
7
|
especie_documento: 'DM',
|
@@ -161,5 +160,4 @@ describe Brcobranca::Boleto::Caixa do #:nodoc:[all]
|
|
161
160
|
expect(File.exist?(tmp_file.path)).to be_falsey
|
162
161
|
end
|
163
162
|
end
|
164
|
-
|
165
163
|
end
|
@@ -2,7 +2,6 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Brcobranca::Boleto::Hsbc do
|
5
|
-
|
6
5
|
before(:each) do
|
7
6
|
@valid_attributes = {
|
8
7
|
especie_documento: 'DM',
|
@@ -39,7 +38,6 @@ describe Brcobranca::Boleto::Hsbc do
|
|
39
38
|
expect(boleto_novo.valor_documento).to eql(0.0)
|
40
39
|
expect(boleto_novo.local_pagamento).to eql('QUALQUER BANCO ATÉ O VENCIMENTO')
|
41
40
|
expect(boleto_novo.carteira).to eql('CNR')
|
42
|
-
|
43
41
|
end
|
44
42
|
|
45
43
|
it 'Criar nova instancia com atributos válidos' do
|
@@ -208,5 +206,4 @@ describe Brcobranca::Boleto::Hsbc do
|
|
208
206
|
expect(File.exist?(tmp_file.path)).to be_falsey
|
209
207
|
end
|
210
208
|
end
|
211
|
-
|
212
209
|
end
|
@@ -64,20 +64,20 @@ describe Brcobranca::Boleto::Santander do
|
|
64
64
|
expect(boleto_novo.carteira).to eql('102')
|
65
65
|
end
|
66
66
|
|
67
|
-
it
|
68
|
-
@valid_attributes[:data_documento] = Date.parse(
|
69
|
-
boleto_novo =
|
70
|
-
expect(boleto_novo.codigo_barras_segunda_parte).to eql(
|
71
|
-
expect(boleto_novo.codigo_barras).to eql(
|
72
|
-
expect(boleto_novo.codigo_barras.linha_digitavel).to eql(
|
67
|
+
it 'Gerar boleto' do
|
68
|
+
@valid_attributes[:data_documento] = Date.parse('2011/10/08')
|
69
|
+
boleto_novo = described_class.new(@valid_attributes)
|
70
|
+
expect(boleto_novo.codigo_barras_segunda_parte).to eql('9189977500009000026700102')
|
71
|
+
expect(boleto_novo.codigo_barras).to eql('03398511500000025009189977500009000026700102')
|
72
|
+
expect(boleto_novo.codigo_barras.linha_digitavel).to eql('03399.18997 77500.009004 00267.001022 8 51150000002500')
|
73
73
|
|
74
74
|
@valid_attributes[:valor] = 54.00
|
75
|
-
@valid_attributes[:numero_documento] =
|
76
|
-
@valid_attributes[:data_documento] = Date.parse(
|
77
|
-
boleto_novo =
|
78
|
-
expect(boleto_novo.codigo_barras_segunda_parte).to eql(
|
79
|
-
expect(boleto_novo.codigo_barras).to eql(
|
80
|
-
expect(boleto_novo.codigo_barras.linha_digitavel).to eql(
|
75
|
+
@valid_attributes[:numero_documento] = '90002720'
|
76
|
+
@valid_attributes[:data_documento] = Date.parse('2012/09/07')
|
77
|
+
boleto_novo = described_class.new(@valid_attributes)
|
78
|
+
expect(boleto_novo.codigo_barras_segunda_parte).to eql('9189977500009000272070102')
|
79
|
+
expect(boleto_novo.codigo_barras).to eql('03399545000000054009189977500009000272070102')
|
80
|
+
expect(boleto_novo.codigo_barras.linha_digitavel).to eql('03399.18997 77500.009004 02720.701024 9 54500000005400')
|
81
81
|
end
|
82
82
|
|
83
83
|
it 'Não permitir gerar boleto com atributos inválido' do
|
@@ -95,8 +95,8 @@ describe Brcobranca::Boleto::Santander do
|
|
95
95
|
boleto_novo = described_class.new(@valid_attributes)
|
96
96
|
expect(boleto_novo.nosso_numero_dv).to eql(7)
|
97
97
|
|
98
|
-
@valid_attributes[:numero_documento] =
|
99
|
-
boleto_novo =
|
98
|
+
@valid_attributes[:numero_documento] = '1961005'
|
99
|
+
boleto_novo = described_class.new(@valid_attributes)
|
100
100
|
expect(boleto_novo.nosso_numero_dv).to eql(0)
|
101
101
|
end
|
102
102
|
|