br-utils 0.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 (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +120 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +348 -0
  8. data/Rakefile +6 -0
  9. data/examples/boleto_usage_example.rb +79 -0
  10. data/examples/cep_usage_example.rb +148 -0
  11. data/examples/cnh_usage_example.rb +120 -0
  12. data/examples/cnpj_usage_example.rb +227 -0
  13. data/examples/cpf_usage_example.rb +237 -0
  14. data/examples/currency_usage_example.rb +266 -0
  15. data/examples/date_usage_example.rb +259 -0
  16. data/examples/email_usage_example.rb +321 -0
  17. data/examples/legal_nature_usage_example.rb +437 -0
  18. data/examples/legal_process_usage_example.rb +444 -0
  19. data/examples/license_plate_usage_example.rb +440 -0
  20. data/examples/phone_usage_example.rb +595 -0
  21. data/examples/pis_usage_example.rb +588 -0
  22. data/examples/renavam_usage_example.rb +499 -0
  23. data/examples/voter_id_usage_example.rb +573 -0
  24. data/lib/brazilian-utils/boleto-utils.rb +176 -0
  25. data/lib/brazilian-utils/cep-utils.rb +330 -0
  26. data/lib/brazilian-utils/cnh-utils.rb +88 -0
  27. data/lib/brazilian-utils/cnpj-utils.rb +202 -0
  28. data/lib/brazilian-utils/cpf-utils.rb +192 -0
  29. data/lib/brazilian-utils/currency-utils.rb +226 -0
  30. data/lib/brazilian-utils/data/legal_process_ids.json +38 -0
  31. data/lib/brazilian-utils/date-utils.rb +244 -0
  32. data/lib/brazilian-utils/email-utils.rb +54 -0
  33. data/lib/brazilian-utils/legal-nature-utils.rb +235 -0
  34. data/lib/brazilian-utils/legal-process-utils.rb +240 -0
  35. data/lib/brazilian-utils/license-plate-utils.rb +279 -0
  36. data/lib/brazilian-utils/phone-utils.rb +272 -0
  37. data/lib/brazilian-utils/pis-utils.rb +151 -0
  38. data/lib/brazilian-utils/renavam-utils.rb +113 -0
  39. data/lib/brazilian-utils/voter-id-utils.rb +165 -0
  40. metadata +123 -0
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Exemplo de uso do BrazilianUtils::CEPUtils
5
+ # Este arquivo demonstra todas as funcionalidades implementadas
6
+
7
+ require_relative 'lib/brazilian-utils/cep-utils'
8
+
9
+ puts '=' * 80
10
+ puts 'BrazilianUtils::CEPUtils - Exemplos de Uso'
11
+ puts '=' * 80
12
+ puts
13
+
14
+ # 1. Formatação de CEP
15
+ puts '1. FORMATAÇÃO DE CEP'
16
+ puts '-' * 80
17
+
18
+ cep_raw = '01310100'
19
+ cep_formatted = BrazilianUtils::CEPUtils.format_cep(cep_raw)
20
+ puts "CEP bruto: #{cep_raw}"
21
+ puts "CEP formatado: #{cep_formatted}"
22
+ puts
23
+
24
+ # 2. Validação de CEP
25
+ puts '2. VALIDAÇÃO DE CEP'
26
+ puts '-' * 80
27
+
28
+ test_ceps = ['01310100', '12345', 'abcdefgh', '12345-678']
29
+ test_ceps.each do |cep|
30
+ is_valid = BrazilianUtils::CEPUtils.valid?(cep)
31
+ puts "CEP '#{cep}' é válido? #{is_valid}"
32
+ end
33
+ puts
34
+
35
+ # 3. Remover símbolos
36
+ puts '3. REMOVER SÍMBOLOS'
37
+ puts '-' * 80
38
+
39
+ dirty_cep = '01310-100'
40
+ clean_cep = BrazilianUtils::CEPUtils.remove_symbols(dirty_cep)
41
+ puts "CEP com símbolos: #{dirty_cep}"
42
+ puts "CEP limpo: #{clean_cep}"
43
+ puts
44
+
45
+ # 4. Gerar CEP aleatório
46
+ puts '4. GERAR CEP ALEATÓRIO'
47
+ puts '-' * 80
48
+
49
+ 5.times do |i|
50
+ random_cep = BrazilianUtils::CEPUtils.generate
51
+ formatted_random = BrazilianUtils::CEPUtils.format_cep(random_cep)
52
+ puts "#{i + 1}. CEP aleatório: #{formatted_random}"
53
+ end
54
+ puts
55
+
56
+ # 5. Validação de UF
57
+ puts '5. VALIDAÇÃO E INFORMAÇÕES DE UF (ESTADO)'
58
+ puts '-' * 80
59
+
60
+ puts "UF 'SP' é válida? #{BrazilianUtils::UF.valid?('SP')}"
61
+ puts "UF 'XX' é válida? #{BrazilianUtils::UF.valid?('XX')}"
62
+ puts "Nome do estado 'SP': #{BrazilianUtils::UF.name_from_code('SP')}"
63
+ puts "Código do estado 'Rio de Janeiro': #{BrazilianUtils::UF.code_from_name('Rio de Janeiro')}"
64
+ puts
65
+
66
+ # 6. Buscar endereço por CEP (requer conexão com internet)
67
+ puts '6. BUSCAR ENDEREÇO POR CEP (Requer Internet)'
68
+ puts '-' * 80
69
+
70
+ test_cep = '01310100' # Avenida Paulista, São Paulo
71
+ puts "Buscando endereço para CEP: #{test_cep}..."
72
+
73
+ begin
74
+ address = BrazilianUtils::CEPUtils.get_address_from_cep(test_cep)
75
+
76
+ if address
77
+ puts "✓ Endereço encontrado!"
78
+ puts " CEP: #{address.cep}"
79
+ puts " Logradouro: #{address.logradouro}"
80
+ puts " Bairro: #{address.bairro}"
81
+ puts " Cidade: #{address.localidade}"
82
+ puts " UF: #{address.uf}"
83
+ puts " IBGE: #{address.ibge}"
84
+ puts " DDD: #{address.ddd}"
85
+ else
86
+ puts "✗ Endereço não encontrado ou API indisponível"
87
+ end
88
+ rescue StandardError => e
89
+ puts "✗ Erro ao buscar endereço: #{e.message}"
90
+ puts " (Isso é normal se não houver conexão com a internet)"
91
+ end
92
+ puts
93
+
94
+ # 7. Buscar CEPs por endereço (requer conexão com internet)
95
+ puts '7. BUSCAR CEPs POR ENDEREÇO (Requer Internet)'
96
+ puts '-' * 80
97
+
98
+ puts "Buscando CEPs para: SP / São Paulo / Paulista..."
99
+
100
+ begin
101
+ addresses = BrazilianUtils::CEPUtils.get_cep_information_from_address('SP', 'São Paulo', 'Paulista')
102
+
103
+ if addresses && addresses.any?
104
+ puts "✓ Encontrados #{addresses.length} resultados:"
105
+ addresses.first(5).each_with_index do |addr, idx|
106
+ puts " #{idx + 1}. #{addr.cep} - #{addr.logradouro}, #{addr.bairro}"
107
+ end
108
+ puts " ... (mostrando apenas os primeiros 5 resultados)" if addresses.length > 5
109
+ else
110
+ puts "✗ Nenhum resultado encontrado ou API indisponível"
111
+ end
112
+ rescue StandardError => e
113
+ puts "✗ Erro ao buscar CEPs: #{e.message}"
114
+ puts " (Isso é normal se não houver conexão com a internet)"
115
+ end
116
+ puts
117
+
118
+ # 8. Tratamento de exceções
119
+ puts '8. TRATAMENTO DE EXCEÇÕES'
120
+ puts '-' * 80
121
+
122
+ puts "Testando CEP inválido com raise_exceptions: true"
123
+ begin
124
+ BrazilianUtils::CEPUtils.get_address_from_cep('invalid', raise_exceptions: true)
125
+ rescue BrazilianUtils::InvalidCEP => e
126
+ puts "✓ Exceção capturada: #{e.class} - #{e.message}"
127
+ end
128
+
129
+ puts "\nTestando UF inválida com raise_exceptions: true"
130
+ begin
131
+ BrazilianUtils::CEPUtils.get_cep_information_from_address('XX', 'City', 'Street', raise_exceptions: true)
132
+ rescue ArgumentError => e
133
+ puts "✓ Exceção capturada: #{e.class} - #{e.message}"
134
+ end
135
+ puts
136
+
137
+ # 9. Listando todos os estados brasileiros
138
+ puts '9. TODOS OS ESTADOS BRASILEIROS'
139
+ puts '-' * 80
140
+
141
+ BrazilianUtils::UF::STATES.each do |code, name|
142
+ puts "#{code} - #{name}"
143
+ end
144
+ puts
145
+
146
+ puts '=' * 80
147
+ puts 'Exemplos concluídos!'
148
+ puts '=' * 80
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Exemplo de uso do BrazilianUtils::CNHUtils
5
+ # Este arquivo demonstra todas as funcionalidades implementadas
6
+
7
+ require_relative '../lib/brazilian-utils/cnh-utils'
8
+
9
+ puts '=' * 80
10
+ puts 'BrazilianUtils::CNHUtils - Exemplos de Uso'
11
+ puts '=' * 80
12
+ puts
13
+
14
+ # 1. Validação de CNH válida
15
+ puts '1. VALIDAÇÃO DE CNH VÁLIDA'
16
+ puts '-' * 80
17
+
18
+ valid_cnhs = [
19
+ '98765432100',
20
+ '987654321-00',
21
+ '987.654.321-00',
22
+ '987 654 321 00'
23
+ ]
24
+
25
+ valid_cnhs.each do |cnh|
26
+ is_valid = BrazilianUtils::CNHUtils.valid?(cnh)
27
+ puts "CNH '#{cnh}' é válida? #{is_valid ? '✓ Sim' : '✗ Não'}"
28
+ end
29
+ puts
30
+
31
+ # 2. Validação de CNH inválida
32
+ puts '2. VALIDAÇÃO DE CNH INVÁLIDA'
33
+ puts '-' * 80
34
+
35
+ invalid_cnhs = [
36
+ { cnh: '12345678901', reason: 'Dígitos verificadores incorretos' },
37
+ { cnh: 'A2C45678901', reason: 'Contém letras' },
38
+ { cnh: '00000000000', reason: 'Todos os dígitos iguais' },
39
+ { cnh: '11111111111', reason: 'Todos os dígitos iguais' },
40
+ { cnh: '123456789', reason: 'Menos de 11 dígitos' },
41
+ { cnh: '123456789012', reason: 'Mais de 11 dígitos' },
42
+ { cnh: '', reason: 'String vazia' },
43
+ { cnh: '98765432199', reason: 'Segundo dígito verificador incorreto' },
44
+ { cnh: '98765432190', reason: 'Primeiro dígito verificador incorreto' }
45
+ ]
46
+
47
+ invalid_cnhs.each do |item|
48
+ is_valid = BrazilianUtils::CNHUtils.valid?(item[:cnh])
49
+ status = is_valid ? '✗ Inesperadamente válida' : '✓ Corretamente inválida'
50
+ puts "CNH '#{item[:cnh]}' - #{item[:reason]}"
51
+ puts " Resultado: #{status}"
52
+ end
53
+ puts
54
+
55
+ # 3. Testando com diferentes formatos
56
+ puts '3. TESTANDO DIFERENTES FORMATOS DE ENTRADA'
57
+ puts '-' * 80
58
+
59
+ test_formats = [
60
+ { input: '98765432100', description: 'Apenas números' },
61
+ { input: '987-654-321-00', description: 'Com hífens' },
62
+ { input: '987.654.321-00', description: 'Com pontos e hífen' },
63
+ { input: '987 654 321 00', description: 'Com espaços' },
64
+ { input: '987/654/321-00', description: 'Com barras e hífen' },
65
+ { input: 98765432100, description: 'Como número inteiro' }
66
+ ]
67
+
68
+ test_formats.each do |format|
69
+ is_valid = BrazilianUtils::CNHUtils.valid?(format[:input])
70
+ puts "Formato: #{format[:description]}"
71
+ puts " Entrada: #{format[:input]}"
72
+ puts " Válido? #{is_valid ? '✓ Sim' : '✗ Não'}"
73
+ end
74
+ puts
75
+
76
+ # 4. Testando sequências de dígitos iguais
77
+ puts '4. TESTANDO SEQUÊNCIAS DE DÍGITOS IGUAIS (DEVEM SER INVÁLIDAS)'
78
+ puts '-' * 80
79
+
80
+ (0..9).each do |digit|
81
+ cnh = digit.to_s * 11
82
+ is_valid = BrazilianUtils::CNHUtils.valid?(cnh)
83
+ status = is_valid ? '✗ ERRO: Foi aceita!' : '✓ Corretamente rejeitada'
84
+ puts "CNH '#{cnh}' - #{status}"
85
+ end
86
+ puts
87
+
88
+ # 5. Casos especiais
89
+ puts '5. CASOS ESPECIAIS'
90
+ puts '-' * 80
91
+
92
+ special_cases = [
93
+ { input: nil, description: 'nil' },
94
+ { input: '', description: 'String vazia' },
95
+ { input: '---...', description: 'Apenas símbolos' },
96
+ { input: 'ABCDEFGHIJK', description: 'Apenas letras' },
97
+ { input: 'ABC12345678', description: 'Letras e números misturados' }
98
+ ]
99
+
100
+ special_cases.each do |special|
101
+ is_valid = BrazilianUtils::CNHUtils.valid?(special[:input])
102
+ puts "#{special[:description]}: #{special[:input].inspect}"
103
+ puts " Válido? #{is_valid ? '✗ Inesperadamente válido' : '✓ Corretamente inválido'}"
104
+ end
105
+ puts
106
+
107
+ # 6. Resumo
108
+ puts '6. RESUMO'
109
+ puts '-' * 80
110
+ puts 'A biblioteca CNHUtils valida CNHs brasileiras seguindo as regras:'
111
+ puts ' 1. Deve ter exatamente 11 dígitos (após remover símbolos)'
112
+ puts ' 2. Não pode ser uma sequência de dígitos iguais'
113
+ puts ' 3. Os dois últimos dígitos são verificadores calculados'
114
+ puts ' 4. Símbolos e espaços são automaticamente ignorados'
115
+ puts ' 5. Suporta apenas CNHs criadas a partir de 2022'
116
+ puts
117
+
118
+ puts '=' * 80
119
+ puts 'Exemplos concluídos!'
120
+ puts '=' * 80
@@ -0,0 +1,227 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Exemplo de uso do BrazilianUtils::CNPJUtils
5
+ # Este arquivo demonstra todas as funcionalidades implementadas
6
+
7
+ require_relative '../lib/brazilian-utils/cnpj-utils'
8
+
9
+ puts '=' * 80
10
+ puts 'BrazilianUtils::CNPJUtils - Exemplos de Uso'
11
+ puts '=' * 80
12
+ puts
13
+
14
+ # 1. Remover símbolos
15
+ puts '1. REMOVER SÍMBOLOS DE CNPJ'
16
+ puts '-' * 80
17
+
18
+ dirty_cnpjs = [
19
+ '12.345/6789-01',
20
+ '98/76.543-2101',
21
+ '03.560.714/0001-42'
22
+ ]
23
+
24
+ dirty_cnpjs.each do |cnpj|
25
+ clean = BrazilianUtils::CNPJUtils.remove_symbols(cnpj)
26
+ puts "Original: #{cnpj.ljust(20)} → Limpo: #{clean}"
27
+ end
28
+ puts
29
+
30
+ # 2. Formatação com display (legacy)
31
+ puts '2. FORMATAÇÃO COM DISPLAY (LEGACY)'
32
+ puts '-' * 80
33
+
34
+ cnpjs_to_display = [
35
+ '12345678901234',
36
+ '98765432100100',
37
+ '00000000000000'
38
+ ]
39
+
40
+ cnpjs_to_display.each do |cnpj|
41
+ formatted = BrazilianUtils::CNPJUtils.display(cnpj)
42
+ status = formatted ? "✓ #{formatted}" : '✗ nil (inválido)'
43
+ puts "CNPJ: #{cnpj} → #{status}"
44
+ end
45
+ puts
46
+
47
+ # 3. Formatação com format_cnpj
48
+ puts '3. FORMATAÇÃO COM FORMAT_CNPJ'
49
+ puts '-' * 80
50
+
51
+ cnpjs_to_format = [
52
+ { cnpj: '03560714000142', description: 'CNPJ válido' },
53
+ { cnpj: '98765432100100', description: 'CNPJ inválido' },
54
+ { cnpj: '11222333000181', description: 'CNPJ válido' }
55
+ ]
56
+
57
+ cnpjs_to_format.each do |item|
58
+ formatted = BrazilianUtils::CNPJUtils.format_cnpj(item[:cnpj])
59
+ status = formatted ? "✓ #{formatted}" : '✗ nil (inválido)'
60
+ puts "#{item[:description]}: #{item[:cnpj]}"
61
+ puts " Formatado: #{status}"
62
+ end
63
+ puts
64
+
65
+ # 4. Validação de CNPJ
66
+ puts '4. VALIDAÇÃO DE CNPJ'
67
+ puts '-' * 80
68
+
69
+ valid_cnpjs = [
70
+ '03560714000142',
71
+ '11222333000181',
72
+ '11444777000161'
73
+ ]
74
+
75
+ puts 'CNPJs Válidos:'
76
+ valid_cnpjs.each do |cnpj|
77
+ is_valid = BrazilianUtils::CNPJUtils.valid?(cnpj)
78
+ formatted = BrazilianUtils::CNPJUtils.format_cnpj(cnpj)
79
+ status = is_valid ? '✓ Válido' : '✗ Inválido'
80
+ puts " #{formatted} - #{status}"
81
+ end
82
+ puts
83
+
84
+ invalid_cnpjs = [
85
+ { cnpj: '00111222000133', reason: 'Dígitos verificadores incorretos' },
86
+ { cnpj: '11222333000180', reason: 'Último dígito incorreto' },
87
+ { cnpj: '00000000000000', reason: 'Todos os dígitos iguais' },
88
+ { cnpj: '12345678901234', reason: 'Dígitos aleatórios' }
89
+ ]
90
+
91
+ puts 'CNPJs Inválidos:'
92
+ invalid_cnpjs.each do |item|
93
+ is_valid = BrazilianUtils::CNPJUtils.valid?(item[:cnpj])
94
+ status = is_valid ? '✗ ERRO: Foi aceito!' : '✓ Corretamente rejeitado'
95
+ puts " #{item[:cnpj]} - #{item[:reason]}"
96
+ puts " #{status}"
97
+ end
98
+ puts
99
+
100
+ # 5. Geração de CNPJ
101
+ puts '5. GERAÇÃO DE CNPJ ALEATÓRIO'
102
+ puts '-' * 80
103
+
104
+ puts 'Gerando CNPJs com diferentes filiais:'
105
+ branches = [1, 42, 100, 1234, 9999]
106
+
107
+ branches.each do |branch|
108
+ cnpj = BrazilianUtils::CNPJUtils.generate(branch: branch)
109
+ formatted = BrazilianUtils::CNPJUtils.format_cnpj(cnpj)
110
+ puts " Filial #{branch.to_s.rjust(4, '0')}: #{formatted}"
111
+ end
112
+ puts
113
+
114
+ puts 'Gerando 5 CNPJs aleatórios com filial padrão (0001):'
115
+ 5.times do |i|
116
+ cnpj = BrazilianUtils::CNPJUtils.generate
117
+ formatted = BrazilianUtils::CNPJUtils.format_cnpj(cnpj)
118
+ is_valid = BrazilianUtils::CNPJUtils.valid?(cnpj)
119
+ status = is_valid ? '✓' : '✗'
120
+ puts " #{i + 1}. #{formatted} #{status}"
121
+ end
122
+ puts
123
+
124
+ # 6. Workflow completo
125
+ puts '6. WORKFLOW COMPLETO: GERAR → FORMATAR → LIMPAR → VALIDAR'
126
+ puts '-' * 80
127
+
128
+ # Gerar
129
+ cnpj = BrazilianUtils::CNPJUtils.generate(branch: 42)
130
+ puts "1. Gerado: #{cnpj}"
131
+
132
+ # Formatar
133
+ formatted = BrazilianUtils::CNPJUtils.format_cnpj(cnpj)
134
+ puts "2. Formatado: #{formatted}"
135
+
136
+ # Simular recebimento de um CNPJ formatado
137
+ puts "3. Simulando recebimento de CNPJ formatado: #{formatted}"
138
+
139
+ # Limpar símbolos
140
+ cleaned = BrazilianUtils::CNPJUtils.remove_symbols(formatted)
141
+ puts "4. Limpo: #{cleaned}"
142
+
143
+ # Validar
144
+ is_valid = BrazilianUtils::CNPJUtils.valid?(cleaned)
145
+ puts "5. Válido? #{is_valid ? '✓ Sim' : '✗ Não'}"
146
+
147
+ # Verificar se é o mesmo CNPJ original
148
+ puts "6. É o mesmo CNPJ? #{cleaned == cnpj ? '✓ Sim' : '✗ Não'}"
149
+ puts
150
+
151
+ # 7. Testando CNPJs com todos os dígitos iguais
152
+ puts '7. TESTANDO CNPJs COM TODOS OS DÍGITOS IGUAIS (DEVEM SER INVÁLIDOS)'
153
+ puts '-' * 80
154
+
155
+ (0..9).each do |digit|
156
+ cnpj = digit.to_s * 14
157
+ is_valid = BrazilianUtils::CNPJUtils.valid?(cnpj)
158
+ status = is_valid ? '✗ ERRO: Foi aceito!' : '✓ Corretamente rejeitado'
159
+ puts "CNPJ #{cnpj} - #{status}"
160
+ end
161
+ puts
162
+
163
+ # 8. Casos especiais
164
+ puts '8. CASOS ESPECIAIS'
165
+ puts '-' * 80
166
+
167
+ special_cases = [
168
+ { input: '00000000000191', description: 'CNPJ com zeros à esquerda' },
169
+ { input: '03560714000143', description: 'CNPJ com último dígito errado' },
170
+ { input: '03560714000141', description: 'CNPJ com penúltimo dígito errado' },
171
+ { input: '123456789012', description: 'CNPJ com 12 dígitos (muito curto)' },
172
+ { input: '123456789012345', description: 'CNPJ com 15 dígitos (muito longo)' }
173
+ ]
174
+
175
+ special_cases.each do |item|
176
+ is_valid = BrazilianUtils::CNPJUtils.valid?(item[:input])
177
+ status = is_valid ? '✓ Válido' : '✗ Inválido'
178
+ puts "#{item[:description]}:"
179
+ puts " CNPJ: #{item[:input]}"
180
+ puts " Status: #{status}"
181
+ end
182
+ puts
183
+
184
+ # 9. Comparação entre métodos (valid? vs validate, format_cnpj vs display)
185
+ puts '9. COMPARAÇÃO ENTRE MÉTODOS'
186
+ puts '-' * 80
187
+
188
+ test_cnpj = '03560714000142'
189
+ puts "CNPJ de teste: #{test_cnpj}"
190
+ puts
191
+ puts 'valid? vs validate:'
192
+ puts " valid?(cnpj): #{BrazilianUtils::CNPJUtils.valid?(test_cnpj)}"
193
+ puts " validate(cnpj): #{BrazilianUtils::CNPJUtils.validate(test_cnpj)}"
194
+ puts
195
+ puts 'format_cnpj vs display:'
196
+ puts " format_cnpj(cnpj): #{BrazilianUtils::CNPJUtils.format_cnpj(test_cnpj)}"
197
+ puts " display(cnpj): #{BrazilianUtils::CNPJUtils.display(test_cnpj)}"
198
+ puts
199
+ puts 'remove_symbols vs sieve:'
200
+ formatted = BrazilianUtils::CNPJUtils.format_cnpj(test_cnpj)
201
+ puts " remove_symbols(formatted): #{BrazilianUtils::CNPJUtils.remove_symbols(formatted)}"
202
+ puts " sieve(formatted): #{BrazilianUtils::CNPJUtils.sieve(formatted)}"
203
+ puts
204
+
205
+ # 10. Resumo
206
+ puts '10. RESUMO'
207
+ puts '-' * 80
208
+ puts 'A biblioteca CNPJUtils oferece:'
209
+ puts ' 1. Remoção de símbolos: remove_symbols() / sieve()'
210
+ puts ' 2. Formatação: format_cnpj() / display()'
211
+ puts ' 3. Validação: valid?() / validate()'
212
+ puts ' 4. Geração: generate(branch:)'
213
+ puts
214
+ puts 'Regras de validação:'
215
+ puts ' • Deve ter exatamente 14 dígitos'
216
+ puts ' • Não pode ser uma sequência de dígitos iguais'
217
+ puts ' • Os dois últimos dígitos são verificadores calculados'
218
+ puts
219
+ puts 'Estrutura do CNPJ: XX.XXX.XXX/FFFF-VV'
220
+ puts ' XX.XXX.XXX = Base (8 dígitos)'
221
+ puts ' FFFF = Filial (4 dígitos)'
222
+ puts ' VV = Verificadores (2 dígitos)'
223
+ puts
224
+
225
+ puts '=' * 80
226
+ puts 'Exemplos concluídos!'
227
+ puts '=' * 80