brcobranca 8.0.0 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-gemset +1 -1
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +5 -3
  5. data/CHANGELOG.md +9 -0
  6. data/Gemfile +2 -2
  7. data/README.md +24 -12
  8. data/brcobranca.gemspec +0 -2
  9. data/lib/brcobranca.rb +43 -26
  10. data/lib/brcobranca/arquivos/logos/bancobrasilia.eps +0 -0
  11. data/lib/brcobranca/arquivos/logos/bancobrasilia_carne.eps +0 -0
  12. data/lib/brcobranca/arquivos/logos/cecred.eps +427 -0
  13. data/lib/brcobranca/arquivos/logos/cecred_carne.eps +427 -0
  14. data/lib/brcobranca/arquivos/logos/credisis.eps +5402 -0
  15. data/lib/brcobranca/arquivos/logos/credisis_carne.eps +5410 -0
  16. data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
  17. data/lib/brcobranca/boleto/banco_brasil.rb +21 -21
  18. data/lib/brcobranca/boleto/banco_brasilia.rb +96 -0
  19. data/lib/brcobranca/boleto/banco_nordeste.rb +4 -6
  20. data/lib/brcobranca/boleto/banestes.rb +7 -7
  21. data/lib/brcobranca/boleto/banrisul.rb +5 -5
  22. data/lib/brcobranca/boleto/base.rb +28 -22
  23. data/lib/brcobranca/boleto/bradesco.rb +6 -6
  24. data/lib/brcobranca/boleto/caixa.rb +11 -18
  25. data/lib/brcobranca/boleto/cecred.rb +86 -0
  26. data/lib/brcobranca/boleto/credisis.rb +124 -0
  27. data/lib/brcobranca/boleto/hsbc.rb +10 -27
  28. data/lib/brcobranca/boleto/itau.rb +9 -10
  29. data/lib/brcobranca/boleto/santander.rb +5 -6
  30. data/lib/brcobranca/boleto/sicoob.rb +5 -5
  31. data/lib/brcobranca/boleto/sicredi.rb +7 -7
  32. data/lib/brcobranca/boleto/template/rghost.rb +127 -80
  33. data/lib/brcobranca/boleto/template/rghost_carne.rb +9 -9
  34. data/lib/brcobranca/boleto/unicred.rb +126 -4
  35. data/lib/brcobranca/calculo_data.rb +3 -0
  36. data/lib/brcobranca/formatacao_string.rb +15 -5
  37. data/lib/brcobranca/remessa/base.rb +16 -9
  38. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +14 -13
  39. data/lib/brcobranca/remessa/cnab240/base.rb +252 -119
  40. data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +299 -0
  41. data/lib/brcobranca/remessa/cnab240/caixa.rb +61 -7
  42. data/lib/brcobranca/remessa/cnab240/cecred.rb +151 -0
  43. data/lib/brcobranca/remessa/cnab240/sicoob.rb +109 -123
  44. data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +94 -0
  45. data/lib/brcobranca/remessa/cnab240/sicredi.rb +177 -0
  46. data/lib/brcobranca/remessa/cnab240/unicred.rb +9 -0
  47. data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +14 -0
  48. data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +166 -0
  49. data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +4 -6
  50. data/lib/brcobranca/remessa/cnab400/banrisul.rb +155 -0
  51. data/lib/brcobranca/remessa/cnab400/base.rb +4 -4
  52. data/lib/brcobranca/remessa/cnab400/bradesco.rb +7 -8
  53. data/lib/brcobranca/remessa/cnab400/citibank.rb +3 -4
  54. data/lib/brcobranca/remessa/cnab400/credisis.rb +128 -0
  55. data/lib/brcobranca/remessa/cnab400/itau.rb +23 -6
  56. data/lib/brcobranca/remessa/cnab400/santander.rb +80 -65
  57. data/lib/brcobranca/remessa/cnab400/sicoob.rb +2 -2
  58. data/lib/brcobranca/remessa/cnab400/unicred.rb +143 -0
  59. data/lib/brcobranca/remessa/pagamento.rb +50 -14
  60. data/lib/brcobranca/retorno/base.rb +4 -4
  61. data/lib/brcobranca/retorno/cnab240/base.rb +11 -8
  62. data/lib/brcobranca/retorno/cnab240/caixa.rb +4 -0
  63. data/lib/brcobranca/retorno/cnab240/cecred.rb +102 -0
  64. data/lib/brcobranca/retorno/cnab240/santander.rb +35 -12
  65. data/lib/brcobranca/retorno/cnab240/sicoob.rb +8 -4
  66. data/lib/brcobranca/retorno/cnab240/sicredi.rb +79 -0
  67. data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +127 -0
  68. data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +89 -0
  69. data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +112 -0
  70. data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
  71. data/lib/brcobranca/retorno/cnab400/base.rb +18 -7
  72. data/lib/brcobranca/retorno/cnab400/bradesco.rb +9 -3
  73. data/lib/brcobranca/retorno/cnab400/credisis.rb +115 -0
  74. data/lib/brcobranca/retorno/cnab400/itau.rb +10 -4
  75. data/lib/brcobranca/retorno/cnab400/santander.rb +57 -0
  76. data/lib/brcobranca/retorno/cnab400/unicred.rb +118 -0
  77. data/lib/brcobranca/retorno/retorno_cnab240.rb +7 -3
  78. data/lib/brcobranca/retorno/retorno_cnab400.rb +6 -77
  79. data/lib/brcobranca/util/date.rb +20 -0
  80. data/lib/brcobranca/util/errors.rb +76 -0
  81. data/lib/brcobranca/validations.rb +232 -0
  82. data/lib/brcobranca/version.rb +1 -1
  83. data/spec/arquivos/CNAB240CECRED.RET +10 -0
  84. data/spec/arquivos/CNAB240SANTANDER.RET +8 -26
  85. data/spec/arquivos/CNAB240SICREDI.CRT +8 -0
  86. data/spec/arquivos/CNAB400BANCOBRASILIA.RET +3 -0
  87. data/spec/arquivos/CNAB400BANCONORDESTE.RET +3 -0
  88. data/spec/arquivos/CNAB400BANRISUL.RET +3 -0
  89. data/spec/arquivos/CNAB400CREDISIS.RET +3 -0
  90. data/spec/arquivos/CNAB400SANTANDER.RET +54 -0
  91. data/spec/arquivos/CNAB400UNICRED.RET +3 -0
  92. data/spec/brcobranca/base_spec.rb +6 -4
  93. data/spec/brcobranca/boleto/banco_brasil_spec.rb +22 -22
  94. data/spec/brcobranca/boleto/banco_brasilia_spec.rb +134 -0
  95. data/spec/brcobranca/boleto/banco_nordeste_spec.rb +19 -19
  96. data/spec/brcobranca/boleto/banestes_spec.rb +19 -19
  97. data/spec/brcobranca/boleto/banrisul_spec.rb +14 -14
  98. data/spec/brcobranca/boleto/bradesco_spec.rb +13 -13
  99. data/spec/brcobranca/boleto/caixa_spec.rb +7 -7
  100. data/spec/brcobranca/boleto/cecred_spec.rb +147 -0
  101. data/spec/brcobranca/boleto/credisis_spec.rb +155 -0
  102. data/spec/brcobranca/boleto/hsbc_spec.rb +17 -37
  103. data/spec/brcobranca/boleto/itau_spec.rb +16 -16
  104. data/spec/brcobranca/boleto/santander_spec.rb +11 -11
  105. data/spec/brcobranca/boleto/sicoob_spec.rb +17 -17
  106. data/spec/brcobranca/boleto/sicredi_spec.rb +13 -13
  107. data/spec/brcobranca/boleto/unicred_spec.rb +10 -10
  108. data/spec/brcobranca/boletos_em_lote_spec.rb +1 -1
  109. data/spec/brcobranca/formatacao_string_spec.rb +1 -1
  110. data/spec/brcobranca/remessa/cnab240/banco_brasil_spec.rb +10 -18
  111. data/spec/brcobranca/remessa/cnab240/caixa_spec.rb +39 -38
  112. data/spec/brcobranca/remessa/cnab240/cecred_spec.rb +164 -0
  113. data/spec/brcobranca/remessa/cnab240/sicoob_banco_brasil_spec.rb +268 -0
  114. data/spec/brcobranca/remessa/cnab240/sicoob_spec.rb +58 -39
  115. data/spec/brcobranca/remessa/cnab240/sicredi_spec.rb +201 -0
  116. data/spec/brcobranca/remessa/cnab240/unicred_spec.rb +193 -0
  117. data/spec/brcobranca/remessa/cnab400/banco_brasilia_spec.rb +183 -0
  118. data/spec/brcobranca/remessa/cnab400/banco_nordeste_spec.rb +4 -2
  119. data/spec/brcobranca/remessa/cnab400/banrisul_spec.rb +190 -0
  120. data/spec/brcobranca/remessa/cnab400/base_spec.rb +1 -1
  121. data/spec/brcobranca/remessa/cnab400/bradesco_spec.rb +16 -11
  122. data/spec/brcobranca/remessa/cnab400/citibank_spec.rb +11 -11
  123. data/spec/brcobranca/remessa/cnab400/credisis_spec.rb +188 -0
  124. data/spec/brcobranca/remessa/cnab400/itau_spec.rb +25 -12
  125. data/spec/brcobranca/remessa/cnab400/santander_spec.rb +35 -36
  126. data/spec/brcobranca/remessa/cnab400/sicoob_spec.rb +37 -0
  127. data/spec/brcobranca/remessa/cnab400/unicred_spec.rb +185 -0
  128. data/spec/brcobranca/remessa/pagamento_spec.rb +45 -27
  129. data/spec/brcobranca/retorno/cnab240/base_spec.rb +7 -8
  130. data/spec/brcobranca/retorno/cnab240/cecred_spec.rb +50 -0
  131. data/spec/brcobranca/retorno/cnab240/santander_spec.rb +35 -18
  132. data/spec/brcobranca/retorno/cnab240/sicoob_spec.rb +20 -19
  133. data/spec/brcobranca/retorno/cnab240/sicredi_spec.rb +31 -0
  134. data/spec/brcobranca/retorno/cnab400/banco_brasilia_spec.rb +36 -0
  135. data/spec/brcobranca/retorno/cnab400/banco_nordeste_spec.rb +39 -0
  136. data/spec/brcobranca/retorno/cnab400/banrisul_spec.rb +41 -0
  137. data/spec/brcobranca/retorno/cnab400/base_spec.rb +34 -13
  138. data/spec/brcobranca/retorno/cnab400/bradesco_spec.rb +4 -4
  139. data/spec/brcobranca/retorno/cnab400/credisis_spec.rb +25 -0
  140. data/spec/brcobranca/retorno/cnab400/itau_spec.rb +4 -4
  141. data/spec/brcobranca/retorno/cnab400/santander_spec.rb +39 -0
  142. data/spec/brcobranca/retorno/cnab400/unicred_spec.rb +42 -0
  143. data/spec/brcobranca/retorno/retorno_cnab400_spec.rb +1 -1
  144. data/spec/brcobranca/retorno/retorno_cnab_240_spec.rb +1 -1
  145. data/spec/brcobranca/rghost_spec.rb +1 -1
  146. data/spec/fixtures/remessa/remessa-banco-brasil-cnab400.rem +1 -1
  147. data/spec/fixtures/remessa/remessa-banco-brasilia-cnab400.rem +3 -0
  148. data/spec/fixtures/remessa/remessa-banco-nordeste-cnab400.rem +1 -1
  149. data/spec/fixtures/remessa/remessa-banco_brasil-cnab240.rem +5 -4
  150. data/spec/fixtures/remessa/remessa-bancoob-cnab240.rem +5 -4
  151. data/spec/fixtures/remessa/remessa-banrisul-cnab400.rem +3 -0
  152. data/spec/fixtures/remessa/remessa-bradesco-cnab400.rem +1 -1
  153. data/spec/fixtures/remessa/remessa-caixa-cnab240.rem +6 -5
  154. data/spec/fixtures/remessa/remessa-cecred-cnab240.rem +7 -0
  155. data/spec/fixtures/remessa/remessa-citibank-cnab400.rem +1 -1
  156. data/spec/fixtures/remessa/remessa-credisis-cnab400.rem +3 -0
  157. data/spec/fixtures/remessa/remessa-itau-cnab400.rem +3 -2
  158. data/spec/fixtures/remessa/remessa-santander-cnab400.rem +2 -2
  159. data/spec/fixtures/remessa/remessa-sicoob-correspondente-bb-cnab240.rem +4 -0
  160. data/spec/fixtures/remessa/remessa-sicredi-cnab240.rem +7 -0
  161. data/spec/fixtures/remessa/remessa-unicred-cnab240.rem +7 -0
  162. data/spec/fixtures/remessa/remessa-unicred-cnab400.rem +3 -0
  163. data/spec/support/shared_examples/busca_logotipo.rb +0 -2
  164. data/spec/support/shared_examples/cnab240.rb +92 -28
  165. data/spec/support/shared_examples/cnab400.rb +60 -14
  166. data/spec/support/shared_examples/formatos_validos.rb +6 -6
  167. metadata +103 -31
@@ -80,7 +80,7 @@ module Brcobranca
80
80
  def digito_agencia
81
81
  # utilizando a agencia com 4 digitos
82
82
  # para calcular o digito
83
- agencia.modulo11(mapeamento: { 10 => 'X' }).to_s
83
+ agencia.modulo11(mapeamento: { 10 => '0' }).to_s
84
84
  end
85
85
 
86
86
  # Complemento do header
@@ -186,7 +186,7 @@ module Brcobranca
186
186
  # 34 = Baixa - Pagamento Direto ao Beneficiário
187
187
 
188
188
  detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
189
- detalhe << pagamento.numero_documento.to_s.rjust(10, '0') # numero do documento X[10]
189
+ detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento X[10]
190
190
  detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
191
191
  detalhe << pagamento.formata_valor # valor do documento 9[13]
192
192
  detalhe << cod_banco # codigo banco 9[03]
@@ -0,0 +1,143 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Brcobranca
3
+ module Remessa
4
+ module Cnab400
5
+ class Unicred < Brcobranca::Remessa::Cnab400::Base
6
+ attr_accessor :posto, :byte_idt
7
+
8
+ # Codigo de transmissao fornecido pelo banco
9
+ attr_accessor :codigo_transmissao
10
+
11
+ validates_presence_of :agencia, :conta_corrente, :documento_cedente,
12
+ :digito_conta, :codigo_transmissao, message: 'não pode estar em branco.'
13
+
14
+ validates_length_of :agencia, maximum: 4, message: 'deve ter 4 dígitos.'
15
+ validates_length_of :conta_corrente, maximum: 5, message: 'deve ter 5 dígitos.'
16
+ validates_length_of :documento_cedente, minimum: 11, maximum: 14, message: 'deve ter entre 11 e 14 dígitos.'
17
+ validates_length_of :carteira, maximum: 2, message: 'deve ter 2 dígitos.'
18
+ validates_length_of :digito_conta, maximum: 1, message: 'deve ter 1 dígito.'
19
+ validates_length_of :codigo_transmissao, maximum: 20, message: 'deve ter 20 dígitos.'
20
+
21
+ validates_inclusion_of :carteira, in: %w(01 03 04 05 06 07), message: 'não existente para este banco.'
22
+
23
+ # Nova instancia do Unicred
24
+ def initialize(campos = {})
25
+ campos = {
26
+ aceite: 'N'
27
+ }.merge!(campos)
28
+
29
+ super(campos)
30
+ end
31
+
32
+ def agencia=(valor)
33
+ @agencia = valor.to_s.rjust(4, '0') if valor
34
+ end
35
+
36
+ def conta_corrente=(valor)
37
+ @conta_corrente = valor.to_s.rjust(5, '0') if valor
38
+ end
39
+
40
+ def carteira=(valor)
41
+ @carteira = valor.to_s.rjust(2, '0') if valor
42
+ end
43
+
44
+ def cod_banco
45
+ '748'
46
+ end
47
+
48
+ def nome_banco
49
+ 'UNICRED'.ljust(15, ' ')
50
+ end
51
+
52
+ # Informacoes da conta corrente do cedente
53
+ #
54
+ # @return [String]
55
+ #
56
+ def info_conta
57
+ # CAMPO TAMANHO
58
+ # codigo da transmissao 20
59
+ "#{codigo_transmissao}"
60
+ end
61
+
62
+ # Complemento do header
63
+ # (no caso do Unicred, sao apenas espacos em branco)
64
+ #
65
+ # @return [String]
66
+ #
67
+ def complemento
68
+ ''.rjust(294, ' ')
69
+ end
70
+
71
+ # Codigo da carteira de acordo com a documentacao do Unicred
72
+ #
73
+ # @return [String]
74
+ #
75
+ def codigo_carteira
76
+ codigo_carteira = carteira[1]
77
+ end
78
+
79
+ def identificador_complemento
80
+ " "
81
+ end
82
+
83
+ # Retorna o nosso numero
84
+ #
85
+ # @return [String]
86
+ def formata_nosso_numero(nosso_numero)
87
+ nosso_numero.somente_numeros.rjust(20, ' ')
88
+ end
89
+
90
+ # Detalhe do arquivo
91
+ #
92
+ # @param pagamento [PagamentoCnab400]
93
+ # objeto contendo as informacoes referentes ao boleto (valor, vencimento, cliente)
94
+ # @param sequencial
95
+ # num. sequencial do registro no arquivo
96
+ #
97
+ # @return [String]
98
+ #
99
+ def monta_detalhe(pagamento, sequencial)
100
+ raise Brcobranca::RemessaInvalida, pagamento if pagamento.invalid?
101
+
102
+ detalhe = '1' # identificacao transacao 9[01]
103
+ detalhe << Brcobranca::Util::Empresa.new(documento_cedente).tipo # tipo de identificacao da empresa 9[02]
104
+ detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
105
+ detalhe << codigo_transmissao # código da transmissao 9[20]
106
+ detalhe << pagamento.documento_ou_numero.to_s.ljust(25) # numero de controle do participante X[25]
107
+ detalhe << formata_nosso_numero(pagamento.nosso_numero) # nosso numero X[20]
108
+ detalhe << ''.rjust(25, ' ') # brancos X[25]
109
+ detalhe << codigo_carteira # codigo da carteira X[01]
110
+ detalhe << pagamento.identificacao_ocorrencia # identificacao ocorrencia 9[02]
111
+ detalhe << pagamento.numero.to_s.rjust(10, '0') # numero do documento X[10]
112
+ detalhe << pagamento.data_vencimento.strftime('%d%m%y') # data do vencimento 9[06]
113
+ detalhe << pagamento.formata_valor # valor do documento 9[13]
114
+ detalhe << cod_banco # codigo banco 9[03]
115
+ detalhe << ''.rjust(5, '0') # agencia cobradora - deixar zero 9[05]
116
+ detalhe << '01' # especie do titulo X[02]
117
+ detalhe << aceite # aceite (A/N) X[01]
118
+ detalhe << pagamento.data_emissao.strftime('%d%m%y') # data de emissao 9[06]
119
+ detalhe << "".rjust(4, "0") # instrucao 9[04]
120
+ detalhe << "0" # zero 9[01]
121
+ detalhe << pagamento.formata_valor_mora(12) # valor mora ao dia 9[12]
122
+ detalhe << pagamento.formata_data_desconto # data limite para desconto 9[06]
123
+ detalhe << pagamento.formata_valor_desconto # valor do desconto 9[13]
124
+ detalhe << pagamento.formata_valor_iof # valor do iof 9[13]
125
+ detalhe << pagamento.formata_valor_abatimento # valor do abatimento 9[13]
126
+ detalhe << pagamento.identificacao_sacado # identificacao do pagador 9[02]
127
+ detalhe << pagamento.documento_sacado.to_s.rjust(14, '0') # documento do pagador 9[14]
128
+ detalhe << pagamento.nome_sacado.format_size(40) # nome do pagador X[40]
129
+ detalhe << pagamento.endereco_sacado.format_size(40) # endereco do pagador X[40]
130
+ detalhe << pagamento.bairro_sacado.format_size(12) # bairro do pagador X[12]
131
+ detalhe << pagamento.cep_sacado # cep do pagador 9[08]
132
+ detalhe << pagamento.cidade_sacado.format_size(15) # cidade do pagador X[15]
133
+ detalhe << pagamento.uf_sacado # uf do pagador X[02]
134
+ detalhe << pagamento.nome_avalista.format_size(40) # nome do sacador/avalista X[40]
135
+ detalhe << pagamento.dias_protesto.rjust(2, '0') # numero de dias para proteste 9[02]
136
+ detalhe << "9" # moeda 9[01]
137
+ detalhe << sequencial.to_s.rjust(6, '0') # numero do registro no arquivo 9[06]
138
+ detalhe
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -1,10 +1,9 @@
1
1
  # -*- encoding: utf-8 -*-
2
- #
3
2
  module Brcobranca
4
3
  module Remessa
5
4
  class Pagamento
6
- # Validações do Rails 3
7
- include ActiveModel::Validations
5
+
6
+ include Brcobranca::Validations
8
7
 
9
8
  # <b>REQUERIDO</b>: nosso numero
10
9
  attr_accessor :nosso_numero
@@ -55,7 +54,9 @@ module Brcobranca
55
54
  # Informação utilizada para referenciar a identificação do documento objeto de cobrança.
56
55
  # Poderá conter número de duplicata, no caso de cobrança de duplicatas; número da apólice,
57
56
  # no caso de cobrança de seguros, etc
58
- attr_accessor :numero_documento
57
+ attr_accessor :numero
58
+ # <b>OPCIONAL</b>: Número utilizado para controle do beneficiário/cedente
59
+ attr_accessor :documento
59
60
  # <b>OPCIONAL</b>: data limite para o desconto
60
61
  attr_accessor :data_segundo_desconto
61
62
  # <b>OPCIONAL</b>: valor a ser concedido de desconto
@@ -68,24 +69,31 @@ module Brcobranca
68
69
  attr_accessor :percentual_multa
69
70
  # <b>OPCIONAL</b>: Data para cobrança de multa
70
71
  attr_accessor :data_multa
72
+ # <b>OPCIONAL</b>: tipo de mora (diário, mensal)
73
+ attr_accessor :tipo_mora
74
+ # <b>OPCIONAL</b>: Data para cobrança de mora
75
+ attr_accessor :data_mora
76
+ # <b>OPCIONAL</b>: codigo dos juros
77
+ attr_accessor :codigo_juros
78
+ # <b>OPCIONAL</b>: codigo do protesto
79
+ attr_accessor :codigo_protesto
80
+ # <b>OPCIONAL</b>: dias para protesto
81
+ attr_accessor :dias_protesto
82
+ # <b>OPCIONAL</b>: codigo baixa
83
+ attr_accessor :codigo_baixa
84
+ # <b>OPCIONAL</b>: dias para baixa
85
+ attr_accessor :dias_baixa
71
86
  # <b>OPCIONAL</b>: Número da Parcela
72
87
  attr_accessor :parcela
73
- # <b>OPCIONAL</b>: Dias para o protesto
74
- attr_accessor :dias_protesto
75
- # <b>OPCIONAL</b>: de livre utilização pela empresa, cuja informação não é consistida pelo Itaú, e não
76
- # sai no aviso de cobrança, retornando ao beneficiário no arquivo retorno em qualquer movimento do título
77
- # (baixa, liquidação, confirmação de protesto, etc.) com o mesmo conteúdo da entrada.
78
- attr_accessor :uso_da_empresa
79
88
 
80
89
  validates_presence_of :nosso_numero, :data_vencimento, :valor,
81
- :documento_sacado, :nome_sacado, :endereco_sacado,
82
- :cep_sacado, :cidade_sacado, :uf_sacado, message: 'não pode estar em branco.'
90
+ :documento_sacado, :nome_sacado, :endereco_sacado,
91
+ :cep_sacado, :cidade_sacado, :uf_sacado, message: 'não pode estar em branco.'
83
92
  validates_length_of :uf_sacado, is: 2, message: 'deve ter 2 dígitos.'
84
93
  validates_length_of :cep_sacado, is: 8, message: 'deve ter 8 dígitos.'
85
94
  validates_length_of :cod_desconto, is: 1, message: 'deve ter 1 dígito.'
86
95
  validates_length_of :especie_titulo, is: 2, message: 'deve ter 2 dígitos.', allow_blank: true
87
96
  validates_length_of :identificacao_ocorrencia, is: 2, message: 'deve ter 2 dígitos.'
88
- validates_length_of :uso_da_empresa, maximum: 25, message: 'deve ter no máximo 25 dígitos.', allow_blank: true, default: ''
89
97
 
90
98
  # Nova instancia da classe Pagamento
91
99
  #
@@ -94,6 +102,8 @@ module Brcobranca
94
102
  def initialize(campos = {})
95
103
  padrao = {
96
104
  data_emissao: Date.current,
105
+ data_segundo_desconto:'00-00-00',
106
+ tipo_mora: "3",
97
107
  valor_mora: 0.0,
98
108
  valor_desconto: 0.0,
99
109
  valor_segundo_desconto: 0.0,
@@ -105,7 +115,13 @@ module Brcobranca
105
115
  identificacao_ocorrencia: '01',
106
116
  codigo_multa: '0',
107
117
  percentual_multa: 0.0,
108
- parcela: '01'
118
+ parcela: '01',
119
+ codigo_protesto: '3',
120
+ dias_protesto: '00',
121
+ codigo_baixa: '0',
122
+ dias_baixa: '000',
123
+ cod_primeira_instrucao: '00',
124
+ cod_segunda_instrucao: '00'
109
125
  }
110
126
 
111
127
  campos = padrao.merge!(campos)
@@ -144,6 +160,17 @@ module Brcobranca
144
160
  end
145
161
  end
146
162
 
163
+ # Formata a valor do percentual da multa
164
+ #
165
+ # @param tamanho [Integer]
166
+ # quantidade de caracteres a ser retornado
167
+ #
168
+ # @return [String]
169
+ #
170
+ def formata_percentual_multa(tamanho = 4)
171
+ format_value(percentual_multa, tamanho)
172
+ end
173
+
147
174
  # Formata a data de cobrança da multa
148
175
  #
149
176
  # @return [String]
@@ -169,6 +196,15 @@ module Brcobranca
169
196
  format_value(valor, tamanho)
170
197
  end
171
198
 
199
+ def documento_ou_numero
200
+ documento.present? ? documento : numero
201
+ end
202
+
203
+ def formata_documento_ou_numero(tamanho = 25, caracter = ' ')
204
+ doc = documento_ou_numero.to_s.gsub(/[^0-9A-Za-z ]/, '')
205
+ doc.rjust(tamanho, caracter)[0...tamanho]
206
+ end
207
+
172
208
  # Formata o campo valor da mora
173
209
  #
174
210
  # @param tamanho [Integer]
@@ -1,17 +1,15 @@
1
1
  # encoding: utf-8
2
- #
3
2
 
4
3
  module Brcobranca
5
4
  module Retorno
6
5
  class Base # Classe base para retornos bancários
6
+ attr_accessor :codigo_registro
7
7
  attr_accessor :agencia_com_dv
8
8
  attr_accessor :agencia_sem_dv
9
9
  attr_accessor :cedente_com_dv
10
10
  attr_accessor :convenio
11
11
  attr_accessor :nosso_numero
12
- attr_accessor :nosso_numero_com_dv
13
- attr_accessor :cod_de_ocorrencia
14
- attr_accessor :data_de_ocorrencia
12
+ attr_accessor :documento_numero
15
13
  attr_accessor :tipo_cobranca
16
14
  attr_accessor :tipo_cobranca_anterior
17
15
  attr_accessor :natureza_recebimento
@@ -26,6 +24,8 @@ module Brcobranca
26
24
  attr_accessor :banco_recebedor
27
25
  attr_accessor :agencia_recebedora_com_dv
28
26
  attr_accessor :especie_documento
27
+ attr_accessor :codigo_ocorrencia
28
+ attr_accessor :motivo_ocorrencia
29
29
  attr_accessor :data_ocorrencia
30
30
  attr_accessor :data_credito
31
31
  attr_accessor :valor_tarifa
@@ -1,24 +1,26 @@
1
1
  # -*- encoding: utf-8 -*-
2
- #
3
2
  require 'parseline'
4
3
 
5
4
  module Brcobranca
6
5
  module Retorno
7
6
  module Cnab240
8
7
  class Base < Brcobranca::Retorno::Base
8
+
9
9
  # Load lines
10
- def self.load_lines(file, options = {})
10
+ def self.load_lines(file, options={})
11
11
  return nil if file.blank?
12
12
 
13
13
  codigo_banco = codigo_banco_do_arquivo(file)
14
14
 
15
15
  case codigo_banco
16
- when '756'
17
- Brcobranca::Retorno::Cnab240::Sicoob.load_lines(file, options)
18
- when '104'
19
- Brcobranca::Retorno::Cnab240::Caixa.load_lines(file, options)
20
- when '033'
16
+ when "033"
21
17
  Brcobranca::Retorno::Cnab240::Santander.load_lines(file, options)
18
+ when "085"
19
+ Brcobranca::Retorno::Cnab240::Cecred.load_lines(file, options)
20
+ when "748"
21
+ Brcobranca::Retorno::Cnab240::Sicredi.load_lines(file, options)
22
+ when "756"
23
+ Brcobranca::Retorno::Cnab240::Sicoob.load_lines(file, options)
22
24
  else
23
25
  Brcobranca::Retorno::RetornoCnab240.load_lines(file, options)
24
26
  end
@@ -27,12 +29,13 @@ module Brcobranca
27
29
  # Codigo do banco lido do arquivo.
28
30
  # Registro Header [0..2]
29
31
  def self.codigo_banco_do_arquivo(file)
30
- arquivo = File.open(file, 'r')
32
+ arquivo = File.open(file)
31
33
  header = arquivo.gets
32
34
  codigo_banco = header.blank? ? nil : header[0..2]
33
35
  arquivo.close
34
36
  codigo_banco
35
37
  end
38
+
36
39
  end
37
40
  end
38
41
  end
@@ -22,8 +22,12 @@ module Brcobranca
22
22
  # parse.field :valor_tarifa, 198..212
23
23
  # parse.field :agencia_com_dv, 17..22
24
24
 
25
+ parse.field :codigo_ocorrencia, 15..16
25
26
  parse.field :nosso_numero, 39..55
26
27
  parse.field :agencia_recebedora_com_dv, 99..103
28
+ parse.field :motivo_ocorrencia, 213..222, ->(motivos) do
29
+ motivos.scan(/.{2}/).reject(&:blank?).reject{|motivo| motivo == '00'}
30
+ end
27
31
 
28
32
  # REGISTRO_U_FIELDS
29
33
 
@@ -0,0 +1,102 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'parseline'
4
+
5
+ module Brcobranca
6
+ module Retorno
7
+ module Cnab240
8
+ class Cecred < Brcobranca::Retorno::Cnab240::Base
9
+ # Regex para remoção de headers e trailers além de registros diferentes de T ou U
10
+ REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U = /^((?!^.{7}3.{5}[T|U].*$).)*$/
11
+
12
+ def self.load_lines(file, options = {})
13
+ default_options = { except: REGEX_DE_EXCLUSAO_DE_REGISTROS_NAO_T_OU_U }
14
+ options = default_options.merge!(options)
15
+
16
+ Line.load_lines(file, options).each_slice(2).reduce([]) do |retornos, cnab_lines|
17
+ retornos << generate_retorno_based_on_cnab_lines(cnab_lines)
18
+ end
19
+ end
20
+
21
+ def self.generate_retorno_based_on_cnab_lines(cnab_lines)
22
+ retorno = new
23
+ cnab_lines.each do |line|
24
+ if line.tipo_registro == 'T'
25
+ Line::REGISTRO_T_FIELDS.each do |attr|
26
+ retorno.send(attr + '=', line.send(attr))
27
+ end
28
+ else
29
+ Line::REGISTRO_U_FIELDS.each do |attr|
30
+ retorno.send(attr + '=', line.send(attr))
31
+ end
32
+ end
33
+ end
34
+ retorno
35
+ end
36
+
37
+ # Linha de mapeamento do retorno do arquivo CNAB 240
38
+ # O registro CNAB 240 possui 2 tipos de registros que juntos geram um registro de retorno bancário
39
+ # O primeiro é do tipo T que retorna dados gerais sobre a transação
40
+ # O segundo é do tipo U que retorna os valores da transação
41
+ class Line < Base
42
+ extend ParseLine::FixedWidth # Extendendo parseline
43
+
44
+ REGISTRO_T_FIELDS = %w(codigo_registro codigo_ocorrencia agencia_com_dv cedente_com_dv nosso_numero carteira data_vencimento valor_titulo banco_recebedor agencia_recebedora_com_dv sequencial valor_tarifa motivo_ocorrencia)
45
+ REGISTRO_U_FIELDS = %w(desconto_concedito valor_abatimento iof_desconto juros_mora valor_recebido outras_despesas outros_recebimento data_credito data_ocorrencia)
46
+
47
+ attr_accessor :tipo_registro
48
+
49
+ fixed_width_layout do |parse|
50
+ # Segmento T
51
+ parse.field :codigo_registro, 7..7
52
+ parse.field :sequencial, 8..12
53
+ parse.field :tipo_registro, 13..13
54
+ parse.field :codigo_ocorrencia, 15..16
55
+ parse.field :agencia_com_dv, 17..22
56
+ parse.field :cedente_com_dv, 23..35
57
+ parse.field :nosso_numero, 37..56
58
+ parse.field :carteira, 57..57
59
+ parse.field :data_vencimento, 73..80
60
+ parse.field :valor_titulo, 81..95
61
+ parse.field :banco_recebedor, 96..98
62
+ parse.field :agencia_recebedora_com_dv, 99..104
63
+ parse.field :valor_tarifa, 198..212
64
+ parse.field :motivo_ocorrencia, 213..222, ->(motivos) do
65
+ motivos.scan(/.{2}/).reject(&:blank?).reject{|motivo| motivo == '00'}
66
+ end
67
+
68
+ # Segmento U
69
+ parse.field :data_ocorrencia, 137..144
70
+ parse.field :data_credito, 145..152
71
+ parse.field :outras_despesas, 107..121
72
+ parse.field :iof_desconto, 62..76
73
+ parse.field :valor_abatimento, 47..61
74
+ parse.field :desconto_concedito, 32..46
75
+ parse.field :valor_recebido, 77..91
76
+ parse.field :juros_mora, 17..31
77
+ parse.field :outros_recebimento, 122..136
78
+
79
+ # Dados que não consegui extrair dos registros T e U
80
+ # parse.field :convenio,31..37
81
+ # parse.field :tipo_cobranca,80..80
82
+ # parse.field :tipo_cobranca_anterior,81..81
83
+ # parse.field :natureza_recebimento,86..87
84
+ # parse.field :carteira_variacao,91..93
85
+ # parse.field :desconto,95..99
86
+ # parse.field :iof,100..104
87
+ # parse.field :comando,108..109
88
+ # parse.field :data_liquidacao,110..115
89
+ # parse.field :especie_documento,173..174
90
+ # parse.field :valor_tarifa,181..187
91
+ # parse.field :juros_desconto,201..213
92
+ # parse.field :abatimento_nao_aproveitado,292..304
93
+ # parse.field :valor_lancamento,305..317
94
+ # parse.field :indicativo_lancamento,318..318
95
+ # parse.field :indicador_valor,319..319
96
+ # parse.field :valor_ajuste,320..331
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end