brcobranca_sicredi_400 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/LICENSE +20 -0
  4. data/README.md +91 -0
  5. data/Rakefile +8 -0
  6. data/lib/brcobranca/arquivos/logos/ailos.eps +412 -0
  7. data/lib/brcobranca/arquivos/logos/ailos_carne.eps +412 -0
  8. data/lib/brcobranca/arquivos/logos/bancobrasil.eps +5402 -0
  9. data/lib/brcobranca/arquivos/logos/bancobrasil_carne.eps +5410 -0
  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/banconordeste.eps +0 -0
  13. data/lib/brcobranca/arquivos/logos/banconordeste_carne.eps +0 -0
  14. data/lib/brcobranca/arquivos/logos/banestes.eps +5198 -0
  15. data/lib/brcobranca/arquivos/logos/banestes_carne.eps +5206 -0
  16. data/lib/brcobranca/arquivos/logos/banrisul.eps +121 -0
  17. data/lib/brcobranca/arquivos/logos/banrisul_carne.eps +121 -0
  18. data/lib/brcobranca/arquivos/logos/bradesco.eps +5210 -0
  19. data/lib/brcobranca/arquivos/logos/bradesco_carne.eps +5214 -0
  20. data/lib/brcobranca/arquivos/logos/caixa.eps +5111 -0
  21. data/lib/brcobranca/arquivos/logos/caixa_carne.eps +5115 -0
  22. data/lib/brcobranca/arquivos/logos/cecred.eps +0 -0
  23. data/lib/brcobranca/arquivos/logos/cecred_carne.eps +0 -0
  24. data/lib/brcobranca/arquivos/logos/citibank.eps +745 -0
  25. data/lib/brcobranca/arquivos/logos/citibank_carne.eps +745 -0
  26. data/lib/brcobranca/arquivos/logos/credisis.eps +0 -0
  27. data/lib/brcobranca/arquivos/logos/credisis_carne.eps +0 -0
  28. data/lib/brcobranca/arquivos/logos/hsbc.eps +5124 -0
  29. data/lib/brcobranca/arquivos/logos/hsbc_carne.eps +5128 -0
  30. data/lib/brcobranca/arquivos/logos/itau.eps +5318 -0
  31. data/lib/brcobranca/arquivos/logos/itau_carne.eps +5322 -0
  32. data/lib/brcobranca/arquivos/logos/safra.eps +0 -0
  33. data/lib/brcobranca/arquivos/logos/safra_carne.eps +0 -0
  34. data/lib/brcobranca/arquivos/logos/santander.eps +5305 -0
  35. data/lib/brcobranca/arquivos/logos/santander_carne.eps +5313 -0
  36. data/lib/brcobranca/arquivos/logos/sicoob.eps +5375 -0
  37. data/lib/brcobranca/arquivos/logos/sicoob_carne.eps +5379 -0
  38. data/lib/brcobranca/arquivos/logos/sicredi.eps +5379 -0
  39. data/lib/brcobranca/arquivos/logos/sicredi_carne.eps +5383 -0
  40. data/lib/brcobranca/arquivos/logos/unicred.eps +0 -0
  41. data/lib/brcobranca/arquivos/logos/unicred_carne.eps +0 -0
  42. data/lib/brcobranca/arquivos/templates/modelo_carne.eps +1112 -0
  43. data/lib/brcobranca/arquivos/templates/modelo_generico.eps +0 -0
  44. data/lib/brcobranca/arquivos/templates/modelo_generico2.eps +9967 -0
  45. data/lib/brcobranca/boleto/ailos.rb +89 -0
  46. data/lib/brcobranca/boleto/banco_brasil.rb +165 -0
  47. data/lib/brcobranca/boleto/banco_brasilia.rb +102 -0
  48. data/lib/brcobranca/boleto/banco_nordeste.rb +80 -0
  49. data/lib/brcobranca/boleto/banestes.rb +86 -0
  50. data/lib/brcobranca/boleto/banrisul.rb +95 -0
  51. data/lib/brcobranca/boleto/base.rb +256 -0
  52. data/lib/brcobranca/boleto/bradesco.rb +100 -0
  53. data/lib/brcobranca/boleto/caixa.rb +123 -0
  54. data/lib/brcobranca/boleto/citibank.rb +97 -0
  55. data/lib/brcobranca/boleto/credisis.rb +118 -0
  56. data/lib/brcobranca/boleto/hsbc.rb +96 -0
  57. data/lib/brcobranca/boleto/itau.rb +138 -0
  58. data/lib/brcobranca/boleto/safra.rb +152 -0
  59. data/lib/brcobranca/boleto/santander.rb +86 -0
  60. data/lib/brcobranca/boleto/sicoob.rb +120 -0
  61. data/lib/brcobranca/boleto/sicredi.rb +145 -0
  62. data/lib/brcobranca/boleto/template/base.rb +28 -0
  63. data/lib/brcobranca/boleto/template/rghost.rb +308 -0
  64. data/lib/brcobranca/boleto/template/rghost2.rb +264 -0
  65. data/lib/brcobranca/boleto/template/rghost_bolepix.rb +286 -0
  66. data/lib/brcobranca/boleto/template/rghost_carne.rb +319 -0
  67. data/lib/brcobranca/boleto/unicred.rb +99 -0
  68. data/lib/brcobranca/calculo.rb +120 -0
  69. data/lib/brcobranca/calculo_data.rb +63 -0
  70. data/lib/brcobranca/currency.rb +69 -0
  71. data/lib/brcobranca/formatacao.rb +104 -0
  72. data/lib/brcobranca/formatacao_string.rb +37 -0
  73. data/lib/brcobranca/limpeza.rb +20 -0
  74. data/lib/brcobranca/remessa/base.rb +72 -0
  75. data/lib/brcobranca/remessa/cnab240/ailos.rb +156 -0
  76. data/lib/brcobranca/remessa/cnab240/banco_brasil.rb +249 -0
  77. data/lib/brcobranca/remessa/cnab240/base.rb +529 -0
  78. data/lib/brcobranca/remessa/cnab240/base_correspondente.rb +307 -0
  79. data/lib/brcobranca/remessa/cnab240/caixa.rb +171 -0
  80. data/lib/brcobranca/remessa/cnab240/santander.rb +225 -0
  81. data/lib/brcobranca/remessa/cnab240/sicoob.rb +229 -0
  82. data/lib/brcobranca/remessa/cnab240/sicoob_banco_brasil.rb +101 -0
  83. data/lib/brcobranca/remessa/cnab240/sicredi.rb +183 -0
  84. data/lib/brcobranca/remessa/cnab240/unicred.rb +10 -0
  85. data/lib/brcobranca/remessa/cnab400/banco_brasil.rb +169 -0
  86. data/lib/brcobranca/remessa/cnab400/banco_brasilia.rb +167 -0
  87. data/lib/brcobranca/remessa/cnab400/banco_nordeste.rb +161 -0
  88. data/lib/brcobranca/remessa/cnab400/banrisul.rb +158 -0
  89. data/lib/brcobranca/remessa/cnab400/base.rb +132 -0
  90. data/lib/brcobranca/remessa/cnab400/bradesco.rb +155 -0
  91. data/lib/brcobranca/remessa/cnab400/citibank.rb +139 -0
  92. data/lib/brcobranca/remessa/cnab400/credisis.rb +130 -0
  93. data/lib/brcobranca/remessa/cnab400/itau.rb +162 -0
  94. data/lib/brcobranca/remessa/cnab400/santander.rb +233 -0
  95. data/lib/brcobranca/remessa/cnab400/sicoob.rb +305 -0
  96. data/lib/brcobranca/remessa/cnab400/sicredi.rb +117 -0
  97. data/lib/brcobranca/remessa/cnab400/unicred.rb +259 -0
  98. data/lib/brcobranca/remessa/pagamento.rb +320 -0
  99. data/lib/brcobranca/retorno/base.rb +11 -0
  100. data/lib/brcobranca/retorno/cnab240/ailos.rb +104 -0
  101. data/lib/brcobranca/retorno/cnab240/base.rb +41 -0
  102. data/lib/brcobranca/retorno/cnab240/caixa.rb +47 -0
  103. data/lib/brcobranca/retorno/cnab240/santander.rb +99 -0
  104. data/lib/brcobranca/retorno/cnab240/sicoob.rb +101 -0
  105. data/lib/brcobranca/retorno/cnab240/sicredi.rb +82 -0
  106. data/lib/brcobranca/retorno/cnab400/banco_brasil.rb +130 -0
  107. data/lib/brcobranca/retorno/cnab400/banco_brasilia.rb +90 -0
  108. data/lib/brcobranca/retorno/cnab400/banco_nordeste.rb +113 -0
  109. data/lib/brcobranca/retorno/cnab400/banrisul.rb +42 -0
  110. data/lib/brcobranca/retorno/cnab400/base.rb +53 -0
  111. data/lib/brcobranca/retorno/cnab400/bradesco.rb +124 -0
  112. data/lib/brcobranca/retorno/cnab400/credisis.rb +116 -0
  113. data/lib/brcobranca/retorno/cnab400/itau.rb +144 -0
  114. data/lib/brcobranca/retorno/cnab400/santander.rb +58 -0
  115. data/lib/brcobranca/retorno/cnab400/sicredi.rb +78 -0
  116. data/lib/brcobranca/retorno/cnab400/unicred.rb +123 -0
  117. data/lib/brcobranca/retorno/retorno_cbr643.rb +48 -0
  118. data/lib/brcobranca/retorno/retorno_cnab240.rb +99 -0
  119. data/lib/brcobranca/retorno/retorno_cnab400.rb +71 -0
  120. data/lib/brcobranca/util/date.rb +21 -0
  121. data/lib/brcobranca/util/empresa.rb +29 -0
  122. data/lib/brcobranca/util/errors.rb +76 -0
  123. data/lib/brcobranca/validations.rb +208 -0
  124. data/lib/brcobranca/version.rb +5 -0
  125. data/lib/brcobranca.rb +200 -0
  126. metadata +225 -0
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # @author Kivanio Barbosa
5
+ module Brcobranca
6
+ # Métodos auxiliares de formatação
7
+ module Formatacao
8
+ # Formata como CPF
9
+ #
10
+ # @return [String]
11
+ # @example
12
+ # "12345678901".to_br_cpf #=> 123.456.789-01
13
+ def to_br_cpf
14
+ somente_numeros.gsub(/^(.{3})(.{3})(.{3})(.{2})$/, '\1.\2.\3-\4')
15
+ end
16
+
17
+ # Formata como CEP
18
+ #
19
+ # @return [String]
20
+ # @example
21
+ # "85253100".to_br_cep #=> "85253-100"
22
+ # 85253100.to_br_cep #=> "85253-100"
23
+ def to_br_cep
24
+ somente_numeros.gsub(/^(.{5})(.{3})$/, '\1-\2')
25
+ end
26
+
27
+ # Formata como CNPJ
28
+ #
29
+ # @return [String]
30
+ # @example
31
+ # "12345678000901".to_br_cnpj #=> 12.345.678/0009-01
32
+ def to_br_cnpj
33
+ somente_numeros.gsub(/^(.{2})(.{3})(.{3})(.{4})(.{2})$/, '\1.\2.\3/\4-\5')
34
+ end
35
+
36
+ # Gera formatação automática do documento baseado no tamanho do campo.
37
+ #
38
+ # @return [String] Retorna a mesma caso não encontre o formato adequado.
39
+ # @example
40
+ # "12345678000901".formata_documento #=> 12.345.678/0009-01
41
+ # "85253100".formata_documento #=> "85253-100"
42
+ # "12345678901".formata_documento #=> 123.456.789-01
43
+ # "12345".formata_documento #=> 12345
44
+ def formata_documento
45
+ case somente_numeros.size
46
+ when 8 then to_br_cep
47
+ when 11 then to_br_cpf
48
+ when 14 then to_br_cnpj
49
+ else
50
+ self
51
+ end
52
+ end
53
+
54
+ # Remove caracteres que não sejam numéricos.
55
+ #
56
+ # @return [String]
57
+ # @example
58
+ # 1a23e45+".somente_numeros #=> 12345
59
+ def somente_numeros
60
+ to_s.gsub(/\D/, '')
61
+ end
62
+
63
+ # Monta a linha digitável padrão para todos os bancos segundo a BACEN.
64
+ #
65
+ # A linha digitável será composta por cinco campos:<br/>
66
+ # <b>1º campo</b>: <br/>
67
+ # Composto pelo código de Banco, código da moeda, as cinco primeiras posições do campo livre
68
+ # e o dígito verificador deste campo.<br/>
69
+ # <b>2º campo</b>: <br/>
70
+ # Composto pelas posições 6ª a 15ª do campo livre e o dígito verificador deste campo.<br/>
71
+ # <b>3º campo</b>: <br/>
72
+ # Composto pelas posições 16ª a 25ª do campo livre e o dígito verificador deste campo.<br/>
73
+ # <b>4º campo</b>: <br/>
74
+ # Composto pelo dígito verificador do código de barras, ou seja, a 5ª posição do código de barras.<br/>
75
+ # <b>5º campo</b>: <br/>
76
+ # Composto pelo fator de vencimento com 4(quatro) caracteres e o valor do documento com
77
+ # 10(dez) caracteres, sem separadores e sem edição.<br/>
78
+ #
79
+ # @return [String]
80
+ # @raise [ArgumentError] Caso não seja um número de 44 dígitos.
81
+ # @example
82
+ # "00192376900000135000000001238798777770016818".linha_digitavel #=> "00190.00009 01238.798779 77700.168188 2 37690000013500"
83
+ def linha_digitavel
84
+ unless self =~ /^(\d{4})(\d{1})(\d{14})(\d{5})(\d{10})(\d{10})$/
85
+ raise ArgumentError, "#{self} Precisa conter 44 caracteres numéricos."
86
+ end
87
+
88
+ linha = Regexp.last_match[1]
89
+ linha << Regexp.last_match[4]
90
+ linha << linha.modulo10.to_s
91
+ linha << Regexp.last_match[5]
92
+ linha << Regexp.last_match[5].modulo10.to_s
93
+ linha << Regexp.last_match[6]
94
+ linha << Regexp.last_match[6].modulo10.to_s
95
+ linha << Regexp.last_match[2]
96
+ linha << Regexp.last_match[3]
97
+ linha.gsub(/^(.{5})(.{5})(.{5})(.{6})(.{5})(.{6})(.{1})(.{14})$/, '\1.\2 \3.\4 \5.\6 \7 \8')
98
+ end
99
+ end
100
+ end
101
+
102
+ [String, Numeric].each do |klass|
103
+ klass.class_eval { include Brcobranca::Formatacao }
104
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ # Métodos auxiliares de formatação de strings
5
+ module FormatacaoString
6
+ # Formata o tamanho da string
7
+ # para o tamanho passado
8
+ # se a string for menor, adiciona espacos a direita
9
+ # se a string for maior, trunca para o num. de caracteres
10
+ #
11
+ def format_size(size)
12
+ clean_str = remove_accents.strip.gsub(/\s+/, ' ').gsub(/[^A-Za-z0-9[[:space:]]]/, '')
13
+ if clean_str.size > size
14
+ clean_str.truncate(size)
15
+ else
16
+ clean_str.ljust(size, ' ')
17
+ end
18
+ end
19
+
20
+ def truncate(truncate_at)
21
+ return dup unless length > truncate_at
22
+
23
+ (self[0, truncate_at]).to_s
24
+ end
25
+
26
+ def remove_accents
27
+ tr(
28
+ 'ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž',
29
+ 'AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz'
30
+ )
31
+ end
32
+ end
33
+ end
34
+
35
+ [String].each do |klass|
36
+ klass.class_eval { include Brcobranca::FormatacaoString }
37
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Limpeza
5
+ # Transforma Float em String preservando o zero a direita.
6
+ #
7
+ # @return [String]
8
+ # @example
9
+ # 1.9 #=> 190
10
+ # 1.93 #=> 193
11
+ def limpa_valor_moeda
12
+ inicio, fim = to_s.split('.')
13
+ (inicio + fim.ljust(2, '0'))
14
+ end
15
+ end
16
+ end
17
+
18
+ [Float, String].each do |klass|
19
+ klass.class_eval { include Brcobranca::Limpeza }
20
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ class Base
6
+ # pagamentos da remessa (cada pagamento representa um registro detalhe no arquivo)
7
+ attr_accessor :pagamentos
8
+ # empresa mae (razao social)
9
+ attr_accessor :empresa_mae
10
+ # agencia (sem digito verificador)
11
+ attr_accessor :agencia
12
+ # numero da conta corrente
13
+ attr_accessor :conta_corrente
14
+ # digito verificador da conta corrente
15
+ attr_accessor :digito_conta
16
+ # carteira do cedente
17
+ attr_accessor :carteira
18
+ # sequencial remessa (num. sequencial que nao pode ser repetido nem zerado)
19
+ attr_accessor :sequencial_remessa
20
+ # aceite (A = ACEITO/N = NAO ACEITO)
21
+ attr_accessor :aceite
22
+ # documento do cedente (CPF/CNPJ)
23
+ attr_accessor :documento_cedente
24
+
25
+ # Validações
26
+ include Brcobranca::Validations
27
+
28
+ validates_presence_of :pagamentos, :empresa_mae, message: 'não pode estar em branco.'
29
+
30
+ validates_each :pagamentos do |record, attr, value|
31
+ if value.is_a? Array
32
+ record.errors.add(attr, 'não pode estar vazio.') if value.empty?
33
+ value.each do |pagamento|
34
+ if pagamento.is_a? Brcobranca::Remessa::Pagamento
35
+ pagamento.errors.full_messages.each { |msg| record.errors.add(attr, msg) } if pagamento.invalid?
36
+ else
37
+ record.errors.add(attr, 'cada item deve ser um objeto Pagamento.')
38
+ end
39
+ end
40
+ else
41
+ record.errors.add(attr, 'deve ser uma coleção (Array).')
42
+ end
43
+ end
44
+
45
+ # Nova instancia da classe
46
+ #
47
+ # @param campos [Hash]
48
+ #
49
+ def initialize(campos = {})
50
+ campos = { aceite: 'N' }.merge!(campos)
51
+ campos.each do |campo, valor|
52
+ send :"#{campo}=", valor
53
+ end
54
+
55
+ yield self if block_given?
56
+ end
57
+
58
+ def quantidade_titulos_cobranca
59
+ pagamentos.length.to_s.rjust(6, '0')
60
+ end
61
+
62
+ def totaliza_valor_titulos
63
+ pagamentos.inject(0.0) { |sum, pagamento| sum + pagamento.valor.to_f }
64
+ end
65
+
66
+ def valor_titulos_carteira(tamanho = 17)
67
+ total = format '%.2f', totaliza_valor_titulos
68
+ total.somente_numeros.rjust(tamanho, '0')
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab240
6
+ class Ailos < Brcobranca::Remessa::Cnab240::Base
7
+ # digito da agencia
8
+ attr_accessor :digito_agencia
9
+
10
+ validates_presence_of :digito_agencia, :convenio, :conta_corrente, message: 'não pode estar em branco.'
11
+ validates_length_of :convenio, maximum: 6, message: 'deve ter 6 dígitos.'
12
+ validates_length_of :conta_corrente, maximum: 7, message: 'deve ter 7 dígitos.'
13
+ validates_length_of :digito_agencia, is: 1, message: 'deve ter 1 dígito.'
14
+
15
+ def initialize(campos = {})
16
+ campos = { emissao_boleto: '2',
17
+ forma_cadastramento: '0',
18
+ distribuicao_boleto: '2',
19
+ especie_titulo: '02' }.merge!(campos)
20
+ super(campos)
21
+ end
22
+
23
+ def convenio=(valor)
24
+ @convenio = valor.to_s.rjust(6, '0') if valor
25
+ end
26
+
27
+ def conta_corrente=(valor)
28
+ @conta_corrente = valor.to_s.rjust(7, '0') if valor
29
+ end
30
+
31
+ def cod_banco
32
+ '085'
33
+ end
34
+
35
+ def nome_banco
36
+ 'AILOS'.ljust(30, ' ')
37
+ end
38
+
39
+ def versao_layout_arquivo
40
+ '087'
41
+ end
42
+
43
+ def versao_layout_lote
44
+ '045'
45
+ end
46
+
47
+ def codigo_convenio
48
+ convenio.ljust(20, ' ')
49
+ end
50
+
51
+ def uso_exclusivo_banco
52
+ ''.rjust(20, ' ')
53
+ end
54
+
55
+ def uso_exclusivo_empresa
56
+ ''.ljust(20, ' ')
57
+ end
58
+
59
+ def convenio_lote
60
+ codigo_convenio
61
+ end
62
+
63
+ def info_conta
64
+ # CAMPO # TAMANHO
65
+ # agencia 5
66
+ # digito agencia 1
67
+ # conta corrente 12
68
+ # dv da conta 1
69
+ # dv agencia/conta 1
70
+ "#{agencia_conta_corrente}#{agencia_conta_corrente_dv}"
71
+ end
72
+
73
+ def agencia_conta_corrente
74
+ "#{agencia.to_s.rjust(5, '0')}#{digito_agencia}#{conta_corrente.rjust(12, '0')}#{conta_corrente_dv}"
75
+ end
76
+
77
+ def conta_corrente_dv
78
+ conta_corrente.modulo11(mapeamento: { 10 => 0 })
79
+ end
80
+
81
+ def agencia_conta_corrente_dv
82
+ ' '
83
+ end
84
+
85
+ def complemento_header
86
+ ''.rjust(29, ' ').to_s
87
+ end
88
+
89
+ def complemento_trailer
90
+ "#{''.rjust(69, '0')}#{''.rjust(148, ' ')}"
91
+ end
92
+
93
+ def tipo_documento
94
+ '1'
95
+ end
96
+
97
+ def complemento_p(pagamento)
98
+ # CAMPO TAMANHO
99
+ # conta_corrente 12
100
+ # dv conta corrente 1
101
+ # dv agencia/conta 1
102
+ # ident. titulo 20
103
+ "#{conta_corrente.rjust(12,
104
+ '0')}#{conta_corrente_dv}#{agencia_conta_corrente_dv}#{ajusta_nosso_numero(pagamento)}"
105
+ end
106
+
107
+ def ajusta_nosso_numero(pagamento)
108
+ "#{conta_corrente}#{conta_corrente_dv}#{pagamento.nosso_numero.to_s.rjust(9, '0')}".ljust(20, ' ')
109
+ end
110
+
111
+ def identificacao_titulo_empresa(pagamento)
112
+ pagamento.documento_ou_numero.to_s.ljust(25, ' ')
113
+ end
114
+
115
+ def complemento_trailer
116
+ # CAMPO TAMANHO
117
+ # Qt. Títulos em Cobrança Simples 6
118
+ # Vl. Títulos em Carteira Simples 15 + 2 decimais
119
+ # Qt. Títulos em Cobrança Vinculada 6
120
+ # Vl. Títulos em Carteira Vinculada 15 + 2 decimais
121
+ # Qt. Títulos em Cobrança Caucionada 6
122
+ # Vl. Títulos em Carteira Caucionada 15 + 2 decimais
123
+ # Qt. Títulos em Cobrança Descontada 6
124
+ # Vl. Títulos em Carteira Descontada 15 + 2 decimais
125
+ total_cobranca_simples = "#{quantidade_titulos_cobranca}#{valor_titulos_carteira}"
126
+ total_cobranca_vinculada = ''.rjust(23, '0')
127
+ total_cobranca_caucionada = ''.rjust(23, '0')
128
+ total_cobranca_descontada = ''.rjust(23, '0')
129
+
130
+ "#{total_cobranca_simples}#{total_cobranca_vinculada}#{total_cobranca_caucionada}" \
131
+ "#{total_cobranca_descontada}".ljust(217, ' ')
132
+ end
133
+
134
+ def total_segmentos(pagamentos)
135
+ pagamentos.inject(0) do |total, pagamento|
136
+ total + (pagamento.codigo_multa == '0' ? 2 : 3)
137
+ end
138
+ end
139
+
140
+ def monta_segmento_r(pagamento, nro_lote, contador)
141
+ return nil if pagamento.codigo_multa == '0'
142
+
143
+ super(pagamento, nro_lote, contador)
144
+ end
145
+
146
+ def codigo_baixa(_pagamento)
147
+ '2'
148
+ end
149
+
150
+ def dias_baixa(_pagamento)
151
+ ''.rjust(3, ' ')
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,249 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brcobranca
4
+ module Remessa
5
+ module Cnab240
6
+ class BancoBrasil < Brcobranca::Remessa::Cnab240::Base
7
+ # variacao da carteira
8
+ attr_accessor :variacao
9
+
10
+ # identificacao da emissao do boleto (attr na classe base)
11
+ # campo nao tratado pelo sistema do Banco do Brasil
12
+ # identificacao da distribuicao do boleto (attr na classe base)
13
+ # campo nao tratado pelo sistema do Banco do Brasil
14
+
15
+ validates_presence_of :carteira, :variacao, message: 'não pode estar em branco.'
16
+ validates_presence_of :convenio, message: 'não pode estar em branco.'
17
+ validates_length_of :conta_corrente, maximum: 12, message: 'deve ter 12 dígitos.'
18
+ validates_length_of :agencia, maximum: 5, message: 'deve ter 5 dígitos.'
19
+ validates_length_of :carteira, is: 2, message: 'deve ter 2 dígitos.'
20
+ validates_length_of :variacao, is: 3, message: 'deve ter 3 dígitos.'
21
+ validates_length_of :convenio, in: 4..7, message: 'deve ter de 4 a 7 dígitos.'
22
+
23
+ def initialize(campos = {})
24
+ campos = { emissao_boleto: '0',
25
+ distribuicao_boleto: '0',
26
+ especie_titulo: '02',
27
+ codigo_baixa: '00',
28
+ codigo_carteira: '7' }.merge!(campos)
29
+ super(campos)
30
+ end
31
+
32
+ def cod_banco
33
+ '001'
34
+ end
35
+
36
+ def nome_banco
37
+ 'BANCO DO BRASIL S.A.'.ljust(30, ' ')
38
+ end
39
+
40
+ def versao_layout_arquivo
41
+ '083'
42
+ end
43
+
44
+ def versao_layout_lote
45
+ '042'
46
+ end
47
+
48
+ def digito_agencia
49
+ # utilizando a agencia com 4 digitos
50
+ # para calcular o digito
51
+ agencia.modulo11(mapeamento: { 10 => 'X' }).to_s
52
+ end
53
+
54
+ def digito_conta
55
+ # utilizando a conta corrente com 5 digitos
56
+ # para calcular o digito
57
+ conta_corrente.modulo11(mapeamento: { 10 => 'X' }).to_s
58
+ end
59
+
60
+ def codigo_convenio
61
+ # CAMPO TAMANHO
62
+ # num. convenio 9
63
+ # cobranca cedente 4
64
+ # carteira 2
65
+ # variacao carteira 3
66
+ # campo reservado 2
67
+ "#{convenio.rjust(9, '0')}0014#{carteira}#{variacao} "
68
+ end
69
+
70
+ alias convenio_lote codigo_convenio
71
+
72
+ def info_conta
73
+ # CAMPO TAMANHO
74
+ # agencia 5
75
+ # digito agencia 1
76
+ # conta corrente 12
77
+ # digito conta 1
78
+ # digito agencia/conta 1
79
+ "#{agencia.rjust(5, '0')}#{digito_agencia}#{conta_corrente.rjust(12, '0')}#{digito_conta} "
80
+ end
81
+
82
+ def complemento_header
83
+ ''.rjust(29, ' ')
84
+ end
85
+
86
+ def complemento_trailer
87
+ ''.rjust(217, '0')
88
+ end
89
+
90
+ def complemento_p(pagamento)
91
+ # CAMPO TAMANHO
92
+ # conta corrente 12
93
+ # digito conta 1
94
+ # digito agencia/conta 1
95
+ # ident. titulo no banco 20
96
+ "#{conta_corrente.rjust(12, '0')}#{digito_conta} #{identificador_titulo(pagamento.nosso_numero)}"
97
+ end
98
+
99
+ # Retorna o nosso numero mais o digito verificador
100
+ #
101
+ # @return [String]
102
+ #
103
+ def formata_nosso_numero(nosso_numero)
104
+ quantidade = case convenio.to_s.size
105
+ # convenio de 4 posicoes com nosso numero de 7
106
+ when 4
107
+ 7
108
+ # convenio de 6 posicoes com nosso numero de 5
109
+ when 6
110
+ 5
111
+ # convenio de 7 posicoes com nosso numero de 10
112
+ when 7
113
+ 10
114
+ else
115
+ raise Brcobranca::NaoImplementado, 'Tipo de convênio não implementado.'
116
+ end
117
+ nosso_numero = nosso_numero.to_s.rjust(quantidade, '0')
118
+
119
+ # calcula o digito do nosso numero (menos para quando nosso numero tiver 10 posicoes)
120
+ digito = "#{convenio}#{nosso_numero}".modulo11(mapeamento: { 10 => 'X' }) unless quantidade == 10
121
+ "#{nosso_numero}#{digito}"
122
+ end
123
+
124
+ def identificador_titulo(nosso_numero)
125
+ "#{convenio}#{formata_nosso_numero(nosso_numero)}".ljust(20, ' ')
126
+ end
127
+
128
+ # Monta o registro segmento P do arquivo
129
+ #
130
+ # @param pagamento [Brcobranca::Remessa::Pagamento]
131
+ # objeto contendo os detalhes do boleto (valor, vencimento, sacado, etc)
132
+ # @param nro_lote [Integer]
133
+ # numero do lote que o segmento esta inserido
134
+ # @param sequencial [Integer]
135
+ # numero sequencial do registro no lote
136
+ #
137
+ # @return [String]
138
+ #
139
+ def monta_segmento_p(pagamento, nro_lote, sequencial)
140
+ # campos com * na frente nao foram implementados
141
+ segmento_p = ''
142
+ # # DESCRICAO TAMANHO
143
+ segmento_p += cod_banco # codigo banco 3
144
+ segmento_p << nro_lote.to_s.rjust(4, '0') # lote de servico 4
145
+ segmento_p << '3' # tipo de registro 1
146
+ segmento_p << sequencial.to_s.rjust(5, '0') # num. sequencial do registro no lote 5
147
+ segmento_p << 'P' # cod. segmento 1
148
+ segmento_p << ' ' # uso exclusivo 1
149
+ # Códigos de Movimento para Remessa tratados pelo Banco do Brasil:
150
+ # 01 – Entrada de títulos,
151
+ # 02 – Pedido de baixa,
152
+ # 04 – Concessão de Abatimento,
153
+ # 05 – Cancelamento de Abatimento,
154
+ # 06 – Alteração de Vencimento,
155
+ # 07 – Concessão de Desconto,
156
+ # 08 – Cancelamento de Desconto,
157
+ # 09 – Protestar,
158
+ # 10 – Cancela/Sustação da Instrução de protesto,
159
+ # 30 – Recusa da Alegação do Sacado,
160
+ # 31 – Alteração de Outros Dados,
161
+ # 40 – Alteração de Modalidade.
162
+ segmento_p << pagamento.identificacao_ocorrencia # cod. movimento remessa 2
163
+ segmento_p << agencia.to_s.rjust(5, '0') # agencia 5
164
+ segmento_p << digito_agencia.to_s # dv agencia 1
165
+ segmento_p << complemento_p(pagamento) # informacoes da conta 34
166
+ # Informar:
167
+ # 1 – para carteira 11/12 na modalidade Simples;
168
+ # 2 ou 3 – para carteira 11/17 modalidade Vinculada/Caucionada e carteira 31;
169
+ # 4 – para carteira 11/17 modalidade Descontada e carteira 51;
170
+ # e 7 – para carteira 17 modalidade Simples.
171
+ segmento_p << codigo_carteira # codigo da carteira 1
172
+ segmento_p << forma_cadastramento # forma de cadastro do titulo 1
173
+ segmento_p << tipo_documento # tipo de documento 1
174
+ segmento_p << emissao_boleto # identificaco emissao 1
175
+ segmento_p << distribuicao_boleto # indentificacao entrega 1
176
+ segmento_p << numero(pagamento) # uso exclusivo 15
177
+ segmento_p << pagamento.data_vencimento.strftime('%d%m%Y') # data de venc. 8
178
+ segmento_p << pagamento.formata_valor(15) # valor documento 15
179
+ segmento_p << ''.rjust(5, '0') # agencia cobradora 5
180
+ segmento_p << ' ' # dv agencia cobradora 1
181
+ # Para carteira 11 e 17 modalidade Simples, pode ser usado:
182
+ # 01 – Cheque, 02 – Duplicata Mercantil,
183
+ # 04 – Duplicata de Serviço,
184
+ # 06 – Duplicata Rural,
185
+ # 07 – Letra de Câmbio,
186
+ # 12 – Nota Promissória,
187
+ # 17 - Recibo,
188
+ # 19 – Nota de Debito,
189
+ # 26 – Warrant,
190
+ # 27 – Dívida Ativa de Estado,
191
+ # 28 – Divida Ativa de Município e
192
+ # 29 – Dívida Ativa União.
193
+ # Para carteira 12 (moeda variável) pode ser usado:
194
+ # 02 – Duplicata Mercantil,
195
+ # 04 – Duplicata de Serviço,
196
+ # 07 – Letra de Câmbio,
197
+ # 12 – Nota Promissória,
198
+ # 17 – Recibo e
199
+ # 19 – Nota de Débito.
200
+ # Para carteira 15 (prêmio de seguro) pode ser usado:
201
+ # 16 – Nota de Seguro e
202
+ # 20 – Apólice de Seguro.
203
+ # Para carteira 11/17 modalidade Vinculada e carteira 31, pode ser usado:
204
+ # 02 – Duplicata Mercantil e
205
+ # 04 – Duplicata de Serviço.
206
+ # Para carteira 11/17 modalidade Descontada e carteira 51, pode ser usado:
207
+ # 02 – Duplicata Mercantil,
208
+ # 04 – Duplicata de Serviço, e
209
+ # 07 – Letra de Câmbio.
210
+ # Obs.: O Banco do Brasil encaminha para protesto os seguintes títulos:
211
+ # Duplicata Mercantil, Rural e de Serviço, Letra de Câmbio, e
212
+ # Certidão de Dívida Ativa da União, dos Estados e do Município.
213
+ segmento_p << especie_titulo # especie do titulo 2
214
+ segmento_p << aceite # aceite 1
215
+ segmento_p << pagamento.data_emissao.strftime('%d%m%Y') # data de emissao titulo 8
216
+ segmento_p << pagamento.tipo_mora # cod. do juros 1
217
+ segmento_p << data_mora(pagamento) # data juros 8
218
+ segmento_p << pagamento.formata_valor_mora(15) # valor juros 15
219
+ segmento_p << pagamento.cod_desconto # cod. do desconto 1
220
+ segmento_p << pagamento.formata_data_desconto('%d%m%Y') # data desconto 8
221
+ segmento_p << pagamento.formata_valor_desconto(15) # valor desconto 15
222
+ segmento_p << pagamento.formata_valor_iof(15) # valor IOF 15
223
+ segmento_p << pagamento.formata_valor_abatimento(15) # valor abatimento 15
224
+ segmento_p << identificacao_titulo_empresa(pagamento) # identificacao documento empresa 25
225
+
226
+ # O Banco do Brasil trata somente os códigos
227
+ # '1' – Protestar dias corridos,
228
+ # '2' – Protestar dias úteis, e
229
+ # '3' – Não protestar.
230
+ # No caso de carteira 31 ou carteira 11/17 modalidade Vinculada,
231
+ # se não informado nenhum código,
232
+ # o sistema assume automaticamente Protesto em 3 dias úteis.
233
+ segmento_p << pagamento.codigo_protesto # cod. para protesto 1
234
+ # Preencher de acordo com o código informado na posição 221.
235
+ # Para código '1' – é possível, de 6 a 29 dias, 35o, 40o, dia corrido.
236
+ # Para código '2' – é possível, 3o, 4o ou 5o dia útil.
237
+ # Para código '3' preencher com Zeros.
238
+ segmento_p << pagamento.dias_protesto.to_s.rjust(2, '0') # dias para protesto 2
239
+ segmento_p << '0' # cod. para baixa 1 *'1' = Protestar Dias Corridos, '2' = Protestar Dias Úteis, '3' = Não Protestar
240
+ segmento_p << '000' # dias para baixa 2 *
241
+ segmento_p << '09' # cod. da moeda 2
242
+ segmento_p << ''.rjust(10, '0') # uso exclusivo 10
243
+ segmento_p << ' ' # uso exclusivo 1
244
+ segmento_p
245
+ end
246
+ end
247
+ end
248
+ end
249
+ end