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.
- checksums.yaml +7 -0
- data/.gitignore +120 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +21 -0
- data/README.md +348 -0
- data/Rakefile +6 -0
- data/examples/boleto_usage_example.rb +79 -0
- data/examples/cep_usage_example.rb +148 -0
- data/examples/cnh_usage_example.rb +120 -0
- data/examples/cnpj_usage_example.rb +227 -0
- data/examples/cpf_usage_example.rb +237 -0
- data/examples/currency_usage_example.rb +266 -0
- data/examples/date_usage_example.rb +259 -0
- data/examples/email_usage_example.rb +321 -0
- data/examples/legal_nature_usage_example.rb +437 -0
- data/examples/legal_process_usage_example.rb +444 -0
- data/examples/license_plate_usage_example.rb +440 -0
- data/examples/phone_usage_example.rb +595 -0
- data/examples/pis_usage_example.rb +588 -0
- data/examples/renavam_usage_example.rb +499 -0
- data/examples/voter_id_usage_example.rb +573 -0
- data/lib/brazilian-utils/boleto-utils.rb +176 -0
- data/lib/brazilian-utils/cep-utils.rb +330 -0
- data/lib/brazilian-utils/cnh-utils.rb +88 -0
- data/lib/brazilian-utils/cnpj-utils.rb +202 -0
- data/lib/brazilian-utils/cpf-utils.rb +192 -0
- data/lib/brazilian-utils/currency-utils.rb +226 -0
- data/lib/brazilian-utils/data/legal_process_ids.json +38 -0
- data/lib/brazilian-utils/date-utils.rb +244 -0
- data/lib/brazilian-utils/email-utils.rb +54 -0
- data/lib/brazilian-utils/legal-nature-utils.rb +235 -0
- data/lib/brazilian-utils/legal-process-utils.rb +240 -0
- data/lib/brazilian-utils/license-plate-utils.rb +279 -0
- data/lib/brazilian-utils/phone-utils.rb +272 -0
- data/lib/brazilian-utils/pis-utils.rb +151 -0
- data/lib/brazilian-utils/renavam-utils.rb +113 -0
- data/lib/brazilian-utils/voter-id-utils.rb +165 -0
- 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
|