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,237 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Exemplo de uso do BrazilianUtils::CPFUtils
|
|
5
|
+
# Este arquivo demonstra todas as funcionalidades implementadas
|
|
6
|
+
|
|
7
|
+
require_relative '../lib/brazilian-utils/cpf-utils'
|
|
8
|
+
|
|
9
|
+
puts '=' * 80
|
|
10
|
+
puts 'BrazilianUtils::CPFUtils - Exemplos de Uso'
|
|
11
|
+
puts '=' * 80
|
|
12
|
+
puts
|
|
13
|
+
|
|
14
|
+
# 1. Remover símbolos
|
|
15
|
+
puts '1. REMOVER SÍMBOLOS DE CPF'
|
|
16
|
+
puts '-' * 80
|
|
17
|
+
|
|
18
|
+
dirty_cpfs = [
|
|
19
|
+
'123.456.789-01',
|
|
20
|
+
'987-654-321.01',
|
|
21
|
+
'821.785.374-64'
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
dirty_cpfs.each do |cpf|
|
|
25
|
+
clean = BrazilianUtils::CPFUtils.remove_symbols(cpf)
|
|
26
|
+
puts "Original: #{cpf.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
|
+
cpfs_to_display = [
|
|
35
|
+
'12345678901',
|
|
36
|
+
'98765432101',
|
|
37
|
+
'00000000000'
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
cpfs_to_display.each do |cpf|
|
|
41
|
+
formatted = BrazilianUtils::CPFUtils.display(cpf)
|
|
42
|
+
status = formatted ? "✓ #{formatted}" : '✗ nil (inválido)'
|
|
43
|
+
puts "CPF: #{cpf} → #{status}"
|
|
44
|
+
end
|
|
45
|
+
puts
|
|
46
|
+
|
|
47
|
+
# 3. Formatação com format_cpf
|
|
48
|
+
puts '3. FORMATAÇÃO COM FORMAT_CPF'
|
|
49
|
+
puts '-' * 80
|
|
50
|
+
|
|
51
|
+
cpfs_to_format = [
|
|
52
|
+
{ cpf: '82178537464', description: 'CPF válido' },
|
|
53
|
+
{ cpf: '55550207753', description: 'CPF válido' },
|
|
54
|
+
{ cpf: '12345678901', description: 'CPF inválido' }
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
cpfs_to_format.each do |item|
|
|
58
|
+
formatted = BrazilianUtils::CPFUtils.format_cpf(item[:cpf])
|
|
59
|
+
status = formatted ? "✓ #{formatted}" : '✗ nil (inválido)'
|
|
60
|
+
puts "#{item[:description]}: #{item[:cpf]}"
|
|
61
|
+
puts " Formatado: #{status}"
|
|
62
|
+
end
|
|
63
|
+
puts
|
|
64
|
+
|
|
65
|
+
# 4. Validação de CPF
|
|
66
|
+
puts '4. VALIDAÇÃO DE CPF'
|
|
67
|
+
puts '-' * 80
|
|
68
|
+
|
|
69
|
+
valid_cpfs = [
|
|
70
|
+
'82178537464',
|
|
71
|
+
'55550207753',
|
|
72
|
+
'41840660546',
|
|
73
|
+
'00000000191',
|
|
74
|
+
'00000000272'
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
puts 'CPFs Válidos:'
|
|
78
|
+
valid_cpfs.each do |cpf|
|
|
79
|
+
is_valid = BrazilianUtils::CPFUtils.valid?(cpf)
|
|
80
|
+
formatted = BrazilianUtils::CPFUtils.format_cpf(cpf)
|
|
81
|
+
status = is_valid ? '✓ Válido' : '✗ Inválido'
|
|
82
|
+
puts " #{formatted} - #{status}"
|
|
83
|
+
end
|
|
84
|
+
puts
|
|
85
|
+
|
|
86
|
+
invalid_cpfs = [
|
|
87
|
+
{ cpf: '12345678901', reason: 'Dígitos verificadores incorretos' },
|
|
88
|
+
{ cpf: '00000000000', reason: 'Todos os dígitos iguais' },
|
|
89
|
+
{ cpf: '11111111111', reason: 'Todos os dígitos iguais' },
|
|
90
|
+
{ cpf: '82178537465', reason: 'Último dígito incorreto' },
|
|
91
|
+
{ cpf: '82178537454', reason: 'Penúltimo dígito incorreto' }
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
puts 'CPFs Inválidos:'
|
|
95
|
+
invalid_cpfs.each do |item|
|
|
96
|
+
is_valid = BrazilianUtils::CPFUtils.valid?(item[:cpf])
|
|
97
|
+
status = is_valid ? '✗ ERRO: Foi aceito!' : '✓ Corretamente rejeitado'
|
|
98
|
+
puts " #{item[:cpf]} - #{item[:reason]}"
|
|
99
|
+
puts " #{status}"
|
|
100
|
+
end
|
|
101
|
+
puts
|
|
102
|
+
|
|
103
|
+
# 5. Geração de CPF
|
|
104
|
+
puts '5. GERAÇÃO DE CPF ALEATÓRIO'
|
|
105
|
+
puts '-' * 80
|
|
106
|
+
|
|
107
|
+
puts 'Gerando 10 CPFs aleatórios:'
|
|
108
|
+
10.times do |i|
|
|
109
|
+
cpf = BrazilianUtils::CPFUtils.generate
|
|
110
|
+
formatted = BrazilianUtils::CPFUtils.format_cpf(cpf)
|
|
111
|
+
is_valid = BrazilianUtils::CPFUtils.valid?(cpf)
|
|
112
|
+
status = is_valid ? '✓' : '✗'
|
|
113
|
+
puts " #{(i + 1).to_s.rjust(2)}. #{formatted} #{status}"
|
|
114
|
+
end
|
|
115
|
+
puts
|
|
116
|
+
|
|
117
|
+
# 6. Workflow completo
|
|
118
|
+
puts '6. WORKFLOW COMPLETO: GERAR → FORMATAR → LIMPAR → VALIDAR'
|
|
119
|
+
puts '-' * 80
|
|
120
|
+
|
|
121
|
+
# Gerar
|
|
122
|
+
cpf = BrazilianUtils::CPFUtils.generate
|
|
123
|
+
puts "1. Gerado: #{cpf}"
|
|
124
|
+
|
|
125
|
+
# Formatar
|
|
126
|
+
formatted = BrazilianUtils::CPFUtils.format_cpf(cpf)
|
|
127
|
+
puts "2. Formatado: #{formatted}"
|
|
128
|
+
|
|
129
|
+
# Simular recebimento de um CPF formatado
|
|
130
|
+
puts "3. Simulando recebimento de CPF formatado: #{formatted}"
|
|
131
|
+
|
|
132
|
+
# Limpar símbolos
|
|
133
|
+
cleaned = BrazilianUtils::CPFUtils.remove_symbols(formatted)
|
|
134
|
+
puts "4. Limpo: #{cleaned}"
|
|
135
|
+
|
|
136
|
+
# Validar
|
|
137
|
+
is_valid = BrazilianUtils::CPFUtils.valid?(cleaned)
|
|
138
|
+
puts "5. Válido? #{is_valid ? '✓ Sim' : '✗ Não'}"
|
|
139
|
+
|
|
140
|
+
# Verificar se é o mesmo CPF original
|
|
141
|
+
puts "6. É o mesmo CPF? #{cleaned == cpf ? '✓ Sim' : '✗ Não'}"
|
|
142
|
+
puts
|
|
143
|
+
|
|
144
|
+
# 7. Testando CPFs com todos os dígitos iguais
|
|
145
|
+
puts '7. TESTANDO CPFs COM TODOS OS DÍGITOS IGUAIS (DEVEM SER INVÁLIDOS)'
|
|
146
|
+
puts '-' * 80
|
|
147
|
+
|
|
148
|
+
(0..9).each do |digit|
|
|
149
|
+
cpf = digit.to_s * 11
|
|
150
|
+
is_valid = BrazilianUtils::CPFUtils.valid?(cpf)
|
|
151
|
+
status = is_valid ? '✗ ERRO: Foi aceito!' : '✓ Corretamente rejeitado'
|
|
152
|
+
puts "CPF #{cpf} - #{status}"
|
|
153
|
+
end
|
|
154
|
+
puts
|
|
155
|
+
|
|
156
|
+
# 8. Casos especiais
|
|
157
|
+
puts '8. CASOS ESPECIAIS'
|
|
158
|
+
puts '-' * 80
|
|
159
|
+
|
|
160
|
+
special_cases = [
|
|
161
|
+
{ input: '00000000191', description: 'CPF com zeros à esquerda' },
|
|
162
|
+
{ input: '82178537465', description: 'CPF com último dígito errado' },
|
|
163
|
+
{ input: '82178537454', description: 'CPF com penúltimo dígito errado' },
|
|
164
|
+
{ input: '123456789', description: 'CPF com 9 dígitos (muito curto)' },
|
|
165
|
+
{ input: '123456789012', description: 'CPF com 12 dígitos (muito longo)' },
|
|
166
|
+
{ input: '821.785.374-64', description: 'CPF com símbolos (deve rejeitar)' }
|
|
167
|
+
]
|
|
168
|
+
|
|
169
|
+
special_cases.each do |item|
|
|
170
|
+
is_valid = BrazilianUtils::CPFUtils.valid?(item[:input])
|
|
171
|
+
status = is_valid ? '✓ Válido' : '✗ Inválido'
|
|
172
|
+
puts "#{item[:description]}:"
|
|
173
|
+
puts " CPF: #{item[:input]}"
|
|
174
|
+
puts " Status: #{status}"
|
|
175
|
+
end
|
|
176
|
+
puts
|
|
177
|
+
|
|
178
|
+
# 9. Comparação entre métodos (valid? vs validate, format_cpf vs display)
|
|
179
|
+
puts '9. COMPARAÇÃO ENTRE MÉTODOS'
|
|
180
|
+
puts '-' * 80
|
|
181
|
+
|
|
182
|
+
test_cpf = '82178537464'
|
|
183
|
+
puts "CPF de teste: #{test_cpf}"
|
|
184
|
+
puts
|
|
185
|
+
puts 'valid? vs validate:'
|
|
186
|
+
puts " valid?(cpf): #{BrazilianUtils::CPFUtils.valid?(test_cpf)}"
|
|
187
|
+
puts " validate(cpf): #{BrazilianUtils::CPFUtils.validate(test_cpf)}"
|
|
188
|
+
puts
|
|
189
|
+
puts 'format_cpf vs display:'
|
|
190
|
+
puts " format_cpf(cpf): #{BrazilianUtils::CPFUtils.format_cpf(test_cpf)}"
|
|
191
|
+
puts " display(cpf): #{BrazilianUtils::CPFUtils.display(test_cpf)}"
|
|
192
|
+
puts
|
|
193
|
+
puts 'remove_symbols vs sieve:'
|
|
194
|
+
formatted = BrazilianUtils::CPFUtils.format_cpf(test_cpf)
|
|
195
|
+
puts " remove_symbols(formatted): #{BrazilianUtils::CPFUtils.remove_symbols(formatted)}"
|
|
196
|
+
puts " sieve(formatted): #{BrazilianUtils::CPFUtils.sieve(formatted)}"
|
|
197
|
+
puts
|
|
198
|
+
|
|
199
|
+
# 10. Estatísticas de geração
|
|
200
|
+
puts '10. ESTATÍSTICAS DE GERAÇÃO'
|
|
201
|
+
puts '-' * 80
|
|
202
|
+
|
|
203
|
+
puts 'Gerando 100 CPFs e verificando validade...'
|
|
204
|
+
cpfs = 100.times.map { BrazilianUtils::CPFUtils.generate }
|
|
205
|
+
valid_count = cpfs.count { |cpf| BrazilianUtils::CPFUtils.valid?(cpf) }
|
|
206
|
+
unique_count = cpfs.uniq.length
|
|
207
|
+
|
|
208
|
+
puts " Total gerado: 100"
|
|
209
|
+
puts " Válidos: #{valid_count} (#{valid_count}%)"
|
|
210
|
+
puts " Únicos: #{unique_count} (#{unique_count}%)"
|
|
211
|
+
puts " Todos válidos? #{valid_count == 100 ? '✓ Sim' : '✗ Não'}"
|
|
212
|
+
puts " Nenhum começa com 0? #{cpfs.none? { |cpf| cpf[0] == '0' } ? '✓ Sim' : '✗ Não'}"
|
|
213
|
+
puts
|
|
214
|
+
|
|
215
|
+
# 11. Resumo
|
|
216
|
+
puts '11. RESUMO'
|
|
217
|
+
puts '-' * 80
|
|
218
|
+
puts 'A biblioteca CPFUtils oferece:'
|
|
219
|
+
puts ' 1. Remoção de símbolos: remove_symbols() / sieve()'
|
|
220
|
+
puts ' 2. Formatação: format_cpf() / display()'
|
|
221
|
+
puts ' 3. Validação: valid?() / validate()'
|
|
222
|
+
puts ' 4. Geração: generate()'
|
|
223
|
+
puts
|
|
224
|
+
puts 'Regras de validação:'
|
|
225
|
+
puts ' • Deve ter exatamente 11 dígitos'
|
|
226
|
+
puts ' • Não pode ser uma sequência de dígitos iguais'
|
|
227
|
+
puts ' • Os dois últimos dígitos são verificadores calculados'
|
|
228
|
+
puts ' • Deve ser apenas números (sem símbolos)'
|
|
229
|
+
puts
|
|
230
|
+
puts 'Estrutura do CPF: XXX.XXX.XXX-VV'
|
|
231
|
+
puts ' XXX.XXX.XXX = Base (9 dígitos)'
|
|
232
|
+
puts ' VV = Verificadores (2 dígitos)'
|
|
233
|
+
puts
|
|
234
|
+
|
|
235
|
+
puts '=' * 80
|
|
236
|
+
puts 'Exemplos concluídos!'
|
|
237
|
+
puts '=' * 80
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Exemplo de uso do BrazilianUtils::CurrencyUtils
|
|
5
|
+
# Este arquivo demonstra todas as funcionalidades implementadas
|
|
6
|
+
|
|
7
|
+
require_relative '../lib/brazilian-utils/currency-utils'
|
|
8
|
+
|
|
9
|
+
puts '=' * 80
|
|
10
|
+
puts 'BrazilianUtils::CurrencyUtils - Exemplos de Uso'
|
|
11
|
+
puts '=' * 80
|
|
12
|
+
puts
|
|
13
|
+
|
|
14
|
+
# 1. Formatação de moeda
|
|
15
|
+
puts '1. FORMATAÇÃO DE MOEDA (format_currency)'
|
|
16
|
+
puts '-' * 80
|
|
17
|
+
|
|
18
|
+
values_to_format = [
|
|
19
|
+
1234.56,
|
|
20
|
+
0,
|
|
21
|
+
-9876.54,
|
|
22
|
+
1000,
|
|
23
|
+
0.50,
|
|
24
|
+
1234567.89,
|
|
25
|
+
1234567890.12,
|
|
26
|
+
'2500.75',
|
|
27
|
+
10.5
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
values_to_format.each do |value|
|
|
31
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
|
|
32
|
+
puts "#{value.to_s.rjust(15)} → #{formatted}"
|
|
33
|
+
end
|
|
34
|
+
puts
|
|
35
|
+
|
|
36
|
+
# 2. Valores inválidos na formatação
|
|
37
|
+
puts '2. VALORES INVÁLIDOS NA FORMATAÇÃO'
|
|
38
|
+
puts '-' * 80
|
|
39
|
+
|
|
40
|
+
invalid_values = ['invalid', nil, 'abc']
|
|
41
|
+
|
|
42
|
+
invalid_values.each do |value|
|
|
43
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
|
|
44
|
+
puts "#{value.inspect.rjust(15)} → #{formatted.inspect}"
|
|
45
|
+
end
|
|
46
|
+
puts
|
|
47
|
+
|
|
48
|
+
# 3. Conversão para texto - Valores simples
|
|
49
|
+
puts '3. CONVERSÃO PARA TEXTO - VALORES SIMPLES'
|
|
50
|
+
puts '-' * 80
|
|
51
|
+
|
|
52
|
+
simple_values = [
|
|
53
|
+
{ value: 0.00, description: 'Zero' },
|
|
54
|
+
{ value: 1.00, description: 'Um real' },
|
|
55
|
+
{ value: 2.00, description: 'Dois reais' },
|
|
56
|
+
{ value: 10.00, description: 'Dez reais' },
|
|
57
|
+
{ value: 100.00, description: 'Cem reais' },
|
|
58
|
+
{ value: 1000.00, description: 'Mil reais' }
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
simple_values.each do |item|
|
|
62
|
+
text = BrazilianUtils::CurrencyUtils.convert_real_to_text(item[:value])
|
|
63
|
+
puts "R$ #{format('%10.2f', item[:value])} → #{text}"
|
|
64
|
+
end
|
|
65
|
+
puts
|
|
66
|
+
|
|
67
|
+
# 4. Conversão para texto - Apenas centavos
|
|
68
|
+
puts '4. CONVERSÃO PARA TEXTO - APENAS CENTAVOS'
|
|
69
|
+
puts '-' * 80
|
|
70
|
+
|
|
71
|
+
centavos_values = [0.01, 0.50, 0.99, 0.25, 0.75]
|
|
72
|
+
|
|
73
|
+
centavos_values.each do |value|
|
|
74
|
+
text = BrazilianUtils::CurrencyUtils.convert_real_to_text(value)
|
|
75
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
|
|
76
|
+
puts "#{formatted.rjust(12)} → #{text}"
|
|
77
|
+
end
|
|
78
|
+
puts
|
|
79
|
+
|
|
80
|
+
# 5. Conversão para texto - Reais e centavos
|
|
81
|
+
puts '5. CONVERSÃO PARA TEXTO - REAIS E CENTAVOS'
|
|
82
|
+
puts '-' * 80
|
|
83
|
+
|
|
84
|
+
mixed_values = [1.50, 2.01, 10.99, 1523.45, 100.50]
|
|
85
|
+
|
|
86
|
+
mixed_values.each do |value|
|
|
87
|
+
text = BrazilianUtils::CurrencyUtils.convert_real_to_text(value)
|
|
88
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
|
|
89
|
+
puts "#{formatted}"
|
|
90
|
+
puts " → #{text}"
|
|
91
|
+
puts
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# 6. Conversão para texto - Valores grandes
|
|
95
|
+
puts '6. CONVERSÃO PARA TEXTO - VALORES GRANDES'
|
|
96
|
+
puts '-' * 80
|
|
97
|
+
|
|
98
|
+
large_values = [
|
|
99
|
+
{ value: 1_000_000.00, description: '1 Milhão' },
|
|
100
|
+
{ value: 2_000_000.00, description: '2 Milhões' },
|
|
101
|
+
{ value: 1_000_000_000.00, description: '1 Bilhão' },
|
|
102
|
+
{ value: 1_234_567.89, description: '1.2 Milhões com centavos' }
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
large_values.each do |item|
|
|
106
|
+
text = BrazilianUtils::CurrencyUtils.convert_real_to_text(item[:value])
|
|
107
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(item[:value])
|
|
108
|
+
puts "#{item[:description]}:"
|
|
109
|
+
puts " Numérico: #{formatted}"
|
|
110
|
+
puts " Extenso: #{text}"
|
|
111
|
+
puts
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# 7. Valores negativos
|
|
115
|
+
puts '7. VALORES NEGATIVOS'
|
|
116
|
+
puts '-' * 80
|
|
117
|
+
|
|
118
|
+
negative_values = [-10.50, -0.50, -1000.00, -1523.45]
|
|
119
|
+
|
|
120
|
+
negative_values.each do |value|
|
|
121
|
+
text = BrazilianUtils::CurrencyUtils.convert_real_to_text(value)
|
|
122
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
|
|
123
|
+
puts "#{formatted}"
|
|
124
|
+
puts " → #{text}"
|
|
125
|
+
puts
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# 8. Arredondamento (round down)
|
|
129
|
+
puts '8. ARREDONDAMENTO (VALORES TRUNCADOS PARA 2 CASAS)'
|
|
130
|
+
puts '-' * 80
|
|
131
|
+
|
|
132
|
+
rounding_values = [
|
|
133
|
+
{ value: 1.999, expected_text: '1.99' },
|
|
134
|
+
{ value: 0.555, expected_text: '0.55' },
|
|
135
|
+
{ value: 10.12345, expected_text: '10.12' }
|
|
136
|
+
]
|
|
137
|
+
|
|
138
|
+
rounding_values.each do |item|
|
|
139
|
+
text = BrazilianUtils::CurrencyUtils.convert_real_to_text(item[:value])
|
|
140
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(item[:value])
|
|
141
|
+
puts "Valor original: #{item[:value]}"
|
|
142
|
+
puts " Formatado: #{formatted}"
|
|
143
|
+
puts " Extenso: #{text}"
|
|
144
|
+
puts
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# 9. Casos especiais de números
|
|
148
|
+
puts '9. CASOS ESPECIAIS DE NÚMEROS'
|
|
149
|
+
puts '-' * 80
|
|
150
|
+
|
|
151
|
+
special_numbers = [11.00, 15.00, 20.00, 21.00, 101.00, 200.00, 1000.00]
|
|
152
|
+
|
|
153
|
+
special_numbers.each do |value|
|
|
154
|
+
text = BrazilianUtils::CurrencyUtils.convert_real_to_text(value)
|
|
155
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(value)
|
|
156
|
+
puts "#{formatted.rjust(15)} → #{text}"
|
|
157
|
+
end
|
|
158
|
+
puts
|
|
159
|
+
|
|
160
|
+
# 10. Workflow completo: Emissão de cheque
|
|
161
|
+
puts '10. WORKFLOW COMPLETO: EMISSÃO DE CHEQUE'
|
|
162
|
+
puts '-' * 80
|
|
163
|
+
|
|
164
|
+
cheque_value = 1523.45
|
|
165
|
+
|
|
166
|
+
puts 'Dados do Cheque:'
|
|
167
|
+
puts '-' * 40
|
|
168
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(cheque_value)
|
|
169
|
+
text = BrazilianUtils::CurrencyUtils.convert_real_to_text(cheque_value)
|
|
170
|
+
|
|
171
|
+
puts "Valor numérico: #{formatted}"
|
|
172
|
+
puts "Valor por extenso:"
|
|
173
|
+
puts " #{text}"
|
|
174
|
+
puts
|
|
175
|
+
|
|
176
|
+
# 11. Workflow completo: Nota fiscal
|
|
177
|
+
puts '11. WORKFLOW COMPLETO: NOTA FISCAL'
|
|
178
|
+
puts '-' * 80
|
|
179
|
+
|
|
180
|
+
items = [
|
|
181
|
+
{ name: 'Produto A', price: 150.00 },
|
|
182
|
+
{ name: 'Produto B', price: 75.50 },
|
|
183
|
+
{ name: 'Produto C', price: 1200.00 }
|
|
184
|
+
]
|
|
185
|
+
|
|
186
|
+
puts 'NOTA FISCAL'
|
|
187
|
+
puts '-' * 40
|
|
188
|
+
total = 0
|
|
189
|
+
|
|
190
|
+
items.each do |item|
|
|
191
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(item[:price])
|
|
192
|
+
puts "#{item[:name].ljust(12)} #{formatted.rjust(15)}"
|
|
193
|
+
total += item[:price]
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
puts '-' * 40
|
|
197
|
+
total_formatted = BrazilianUtils::CurrencyUtils.format_currency(total)
|
|
198
|
+
total_text = BrazilianUtils::CurrencyUtils.convert_real_to_text(total)
|
|
199
|
+
puts "#{'TOTAL'.ljust(12)} #{total_formatted.rjust(15)}"
|
|
200
|
+
puts
|
|
201
|
+
puts 'Valor por extenso:'
|
|
202
|
+
puts " #{total_text}"
|
|
203
|
+
puts
|
|
204
|
+
|
|
205
|
+
# 12. Testes com diferentes tipos de entrada
|
|
206
|
+
puts '12. DIFERENTES TIPOS DE ENTRADA'
|
|
207
|
+
puts '-' * 80
|
|
208
|
+
|
|
209
|
+
different_inputs = [
|
|
210
|
+
{ input: 100, type: 'Integer' },
|
|
211
|
+
{ input: 100.50, type: 'Float' },
|
|
212
|
+
{ input: '100.50', type: 'String' },
|
|
213
|
+
{ input: BigDecimal('100.50'), type: 'BigDecimal' }
|
|
214
|
+
]
|
|
215
|
+
|
|
216
|
+
different_inputs.each do |item|
|
|
217
|
+
formatted = BrazilianUtils::CurrencyUtils.format_currency(item[:input])
|
|
218
|
+
text = BrazilianUtils::CurrencyUtils.convert_real_to_text(item[:input])
|
|
219
|
+
puts "Tipo: #{item[:type].ljust(12)} Input: #{item[:input].inspect}"
|
|
220
|
+
puts " Formatado: #{formatted}"
|
|
221
|
+
puts " Extenso: #{text}"
|
|
222
|
+
puts
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# 13. Valores inválidos na conversão
|
|
226
|
+
puts '13. VALORES INVÁLIDOS NA CONVERSÃO PARA TEXTO'
|
|
227
|
+
puts '-' * 80
|
|
228
|
+
|
|
229
|
+
invalid_for_text = [
|
|
230
|
+
{ value: 'invalid', description: 'String inválida' },
|
|
231
|
+
{ value: nil, description: 'Nil' },
|
|
232
|
+
{ value: 1_000_000_000_000_001.00, description: 'Acima do limite (1 quadrilhão)' }
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
invalid_for_text.each do |item|
|
|
236
|
+
text = BrazilianUtils::CurrencyUtils.convert_real_to_text(item[:value])
|
|
237
|
+
puts "#{item[:description]}: #{item[:value].inspect}"
|
|
238
|
+
puts " Resultado: #{text.inspect}"
|
|
239
|
+
end
|
|
240
|
+
puts
|
|
241
|
+
|
|
242
|
+
# 14. Resumo
|
|
243
|
+
puts '14. RESUMO'
|
|
244
|
+
puts '-' * 80
|
|
245
|
+
puts 'A biblioteca CurrencyUtils oferece:'
|
|
246
|
+
puts ' 1. format_currency(value): Formata valores em moeda brasileira (R$)'
|
|
247
|
+
puts ' 2. convert_real_to_text(amount): Converte valores para extenso em português'
|
|
248
|
+
puts
|
|
249
|
+
puts 'Características da formatação:'
|
|
250
|
+
puts ' • Separador de milhares: . (ponto)'
|
|
251
|
+
puts ' • Separador decimal: , (vírgula)'
|
|
252
|
+
puts ' • Sempre 2 casas decimais'
|
|
253
|
+
puts ' • Suporta valores negativos'
|
|
254
|
+
puts ' • Suporta números muito grandes'
|
|
255
|
+
puts
|
|
256
|
+
puts 'Características da conversão para texto:'
|
|
257
|
+
puts ' • Valores arredondados para baixo (truncados) em 2 casas decimais'
|
|
258
|
+
puts ' • Máximo: 1 quadrilhão de reais'
|
|
259
|
+
puts ' • Português gramaticalmente correto (singular/plural)'
|
|
260
|
+
puts ' • Conectores adequados para milhões/bilhões'
|
|
261
|
+
puts ' • Valores negativos com prefixo "Menos"'
|
|
262
|
+
puts
|
|
263
|
+
|
|
264
|
+
puts '=' * 80
|
|
265
|
+
puts 'Exemplos concluídos!'
|
|
266
|
+
puts '=' * 80
|