brcobranca 4.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +1 -1
  5. data/.travis.yml +2 -1
  6. data/Gemfile +4 -4
  7. data/Gemfile.lock +65 -53
  8. data/README.md +18 -5
  9. data/brcobranca.gemspec +8 -6
  10. data/lib/brcobranca/boleto/banco_brasil.rb +25 -27
  11. data/lib/brcobranca/boleto/base.rb +13 -6
  12. data/lib/brcobranca/boleto/bradesco.rb +4 -1
  13. data/lib/brcobranca/boleto/caixa.rb +14 -4
  14. data/lib/brcobranca/boleto/hsbc.rb +26 -26
  15. data/lib/brcobranca/boleto/santander.rb +6 -3
  16. data/lib/brcobranca/boleto/sicredi.rb +3 -5
  17. data/lib/brcobranca/boleto/template/rghost.rb +7 -5
  18. data/lib/brcobranca/boleto/template/rghost_carne.rb +1 -2
  19. data/lib/brcobranca/calculo.rb +19 -93
  20. data/lib/brcobranca/formatacao_string.rb +21 -0
  21. data/lib/brcobranca/remessa/base.rb +59 -0
  22. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +117 -0
  23. data/lib/brcobranca/remessa/cnab240/base.rb +379 -0
  24. data/lib/brcobranca/remessa/cnab240/caixa.rb +103 -0
  25. data/lib/brcobranca/remessa/cnab400/base.rb +112 -0
  26. data/lib/brcobranca/remessa/cnab400/bradesco.rb +128 -0
  27. data/lib/brcobranca/remessa/cnab400/itau.rb +149 -0
  28. data/lib/brcobranca/remessa/pagamento.rb +159 -0
  29. data/lib/brcobranca/retorno/base.rb +1 -0
  30. data/lib/brcobranca/retorno/retorno_cnab400.rb +0 -2
  31. data/lib/brcobranca/version.rb +1 -1
  32. data/lib/brcobranca.rb +33 -17
  33. data/spec/brcobranca/banco_bradesco_spec.rb +0 -2
  34. data/spec/brcobranca/banco_brasil_spec.rb +0 -2
  35. data/spec/brcobranca/banco_caixa_spec.rb +0 -2
  36. data/spec/brcobranca/banco_hsbc_spec.rb +0 -3
  37. data/spec/brcobranca/banco_itau_spec.rb +0 -1
  38. data/spec/brcobranca/banco_santander_spec.rb +14 -14
  39. data/spec/brcobranca/banco_sicredi_spec.rb +0 -2
  40. data/spec/brcobranca/base_spec.rb +11 -0
  41. data/spec/brcobranca/boletos_em_lote_spec.rb +0 -2
  42. data/spec/brcobranca/core_ext_spec.rb +104 -58
  43. data/spec/brcobranca/remessa/base_spec.rb +87 -0
  44. data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +200 -0
  45. data/spec/brcobranca/remessa/cnab240/base_spec.rb +88 -0
  46. data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +137 -0
  47. data/spec/brcobranca/remessa/cnab400/base_spec.rb +51 -0
  48. data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +174 -0
  49. data/spec/brcobranca/remessa/cnab400/itau_spec.rb +160 -0
  50. data/spec/brcobranca/remessa/pagamento_spec.rb +197 -0
  51. data/spec/brcobranca/retorno_cbr643_spec.rb +0 -2
  52. data/spec/brcobranca/rghost_spec.rb +0 -2
  53. data/spec/shared_examples/cnab240.rb +206 -0
  54. data/spec/shared_examples/cnab400.rb +85 -0
  55. 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
@@ -21,6 +21,7 @@ module Brcobranca
21
21
  attr_accessor :banco_recebedor
22
22
  attr_accessor :agencia_recebedora_com_dv
23
23
  attr_accessor :especie_documento
24
+ attr_accessor :data_ocorrencia
24
25
  attr_accessor :data_credito
25
26
  attr_accessor :valor_tarifa
26
27
  attr_accessor :outras_despesas
@@ -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
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  module Brcobranca
4
- VERSION = '4.1.0'
4
+ VERSION = '5.0.0'
5
5
  end
data/lib/brcobranca.rb CHANGED
@@ -1,27 +1,12 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $LOAD_PATH.push File.join(File.dirname(__FILE__))
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
@@ -243,5 +243,4 @@ describe Brcobranca::Boleto::Itau do
243
243
  expect(File.exist?(tmp_file.path)).to be_falsey
244
244
  end
245
245
  end
246
-
247
246
  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 "Gerar boleto" do
68
- @valid_attributes[:data_documento] = Date.parse("2011/10/08")
69
- boleto_novo = Brcobranca::Boleto::Santander.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")
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] = "90002720"
76
- @valid_attributes[:data_documento] = Date.parse("2012/09/07")
77
- boleto_novo = Brcobranca::Boleto::Santander.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")
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] = "1961005"
99
- boleto_novo = Brcobranca::Boleto::Santander.new(@valid_attributes)
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