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,444 @@
1
+ require_relative '../lib/brazilian-utils/legal-process-utils'
2
+
3
+ puts "=" * 80
4
+ puts "Brazilian Legal Process Utils - Usage Examples"
5
+ puts "=" * 80
6
+ puts
7
+
8
+ # ============================================================================
9
+ # Format Information
10
+ # ============================================================================
11
+ puts "LEGAL PROCESS ID FORMAT"
12
+ puts "-" * 80
13
+ puts "Format: NNNNNNN-DD.AAAA.J.TR.OOOO"
14
+ puts
15
+ puts "Where:"
16
+ puts " NNNNNNN = Sequential number (7 digits)"
17
+ puts " DD = Verification digits (2 digits) - checksum"
18
+ puts " AAAA = Year the process was filed (4 digits)"
19
+ puts " J = Judicial segment (1 digit) - Órgão (1-9)"
20
+ puts " TR = Court (2 digits) - Tribunal"
21
+ puts " OOOO = Court of origin (4 digits) - Foro"
22
+ puts
23
+ puts "Órgãos (Judicial Segments):"
24
+ puts " 1 = Supremo Tribunal Federal (STF)"
25
+ puts " 2 = Conselho Nacional de Justiça (CNJ)"
26
+ puts " 3 = Justiça Militar"
27
+ puts " 4 = Justiça Eleitoral"
28
+ puts " 5 = Justiça do Trabalho"
29
+ puts " 6 = Justiça Federal"
30
+ puts " 7 = Justiça Estadual"
31
+ puts " 8 = Justiça dos Estados e do Distrito Federal"
32
+ puts " 9 = Justiça Militar Estadual"
33
+ puts
34
+
35
+ # ============================================================================
36
+ # Removing Symbols
37
+ # ============================================================================
38
+ puts "1. REMOVING SYMBOLS"
39
+ puts "-" * 80
40
+
41
+ formatted_ids = [
42
+ '1234567-89.0123.4.56.7890',
43
+ '9876543-21.0987.6.54.3210',
44
+ '6847650-60.2023.3.03.0000',
45
+ '5180823-36.2023.3.03.0000'
46
+ ]
47
+
48
+ puts "Removing dots and hyphens from formatted IDs:"
49
+ formatted_ids.each do |formatted|
50
+ clean = BrazilianUtils::LegalProcessUtils.remove_symbols(formatted)
51
+ puts " #{formatted} => #{clean}"
52
+ end
53
+ puts
54
+
55
+ # ============================================================================
56
+ # Formatting Legal Process IDs
57
+ # ============================================================================
58
+ puts "2. FORMATTING LEGAL PROCESS IDs"
59
+ puts "-" * 80
60
+
61
+ unformatted_ids = [
62
+ '12345678901234567890',
63
+ '98765432109876543210',
64
+ '68476506020233030000',
65
+ '51808233620233030000'
66
+ ]
67
+
68
+ puts "Formatting 20-digit IDs:"
69
+ unformatted_ids.each do |id|
70
+ formatted = BrazilianUtils::LegalProcessUtils.format_legal_process(id)
71
+ status = formatted ? "✓" : "✗"
72
+ puts " #{status} #{id} => #{formatted}"
73
+ end
74
+ puts
75
+
76
+ # Invalid formatting examples
77
+ puts "Invalid formatting attempts:"
78
+ invalid_ids = ['123', '12345678901234567890123', 'abcd567890123456789', '']
79
+
80
+ invalid_ids.each do |id|
81
+ formatted = BrazilianUtils::LegalProcessUtils.format_legal_process(id)
82
+ display = id.empty? ? '(empty)' : id
83
+ puts " ✗ #{display} => #{formatted.inspect}"
84
+ end
85
+ puts
86
+
87
+ # ============================================================================
88
+ # Validating Legal Process IDs
89
+ # ============================================================================
90
+ puts "3. VALIDATING LEGAL PROCESS IDs"
91
+ puts "-" * 80
92
+
93
+ # Valid IDs (known from Python implementation)
94
+ valid_ids = [
95
+ '68476506020233030000',
96
+ '51808233620233030000',
97
+ '6847650-60.2023.3.03.0000',
98
+ '5180823-36.2023.3.03.0000'
99
+ ]
100
+
101
+ puts "Validating known valid IDs:"
102
+ valid_ids.each do |id|
103
+ result = BrazilianUtils::LegalProcessUtils.valid?(id)
104
+ status = result ? "✓ VALID" : "✗ INVALID"
105
+ puts " #{status}: #{id}"
106
+ end
107
+ puts
108
+
109
+ # Invalid IDs
110
+ puts "Validating invalid IDs:"
111
+ invalid_ids = [
112
+ ['123', 'wrong length'],
113
+ ['12345678901234567890', 'invalid checksum'],
114
+ ['1234567-89.2023.0.01.0000', 'invalid órgão (0)'],
115
+ ['', 'empty string']
116
+ ]
117
+
118
+ invalid_ids.each do |id, reason|
119
+ result = BrazilianUtils::LegalProcessUtils.valid?(id)
120
+ status = result ? "✓ VALID" : "✗ INVALID"
121
+ display = id.empty? ? '(empty)' : id
122
+ puts " #{status}: #{display.ljust(30)} (#{reason})"
123
+ end
124
+ puts
125
+
126
+ # ============================================================================
127
+ # Generating Legal Process IDs
128
+ # ============================================================================
129
+ puts "4. GENERATING LEGAL PROCESS IDs"
130
+ puts "-" * 80
131
+
132
+ # Generate with current year and random órgão
133
+ puts "Generate with defaults (current year, random órgão):"
134
+ 3.times do |i|
135
+ id = BrazilianUtils::LegalProcessUtils.generate
136
+ formatted = BrazilianUtils::LegalProcessUtils.format_legal_process(id)
137
+ puts " #{i + 1}. #{formatted}"
138
+ end
139
+ puts
140
+
141
+ # Generate with specific year
142
+ puts "Generate with year 2026:"
143
+ 3.times do |i|
144
+ id = BrazilianUtils::LegalProcessUtils.generate(2026)
145
+ formatted = BrazilianUtils::LegalProcessUtils.format_legal_process(id)
146
+ puts " #{i + 1}. #{formatted}"
147
+ end
148
+ puts
149
+
150
+ # Generate for specific órgãos
151
+ puts "Generate for specific órgãos:"
152
+ orgaos = {
153
+ 1 => 'STF',
154
+ 3 => 'Justiça Militar',
155
+ 5 => 'Justiça do Trabalho',
156
+ 6 => 'Justiça Federal',
157
+ 8 => 'Justiça Estadual'
158
+ }
159
+
160
+ orgaos.each do |orgao, name|
161
+ id = BrazilianUtils::LegalProcessUtils.generate(2026, orgao)
162
+ formatted = BrazilianUtils::LegalProcessUtils.format_legal_process(id)
163
+ puts " Órgão #{orgao} (#{name}): #{formatted}"
164
+ end
165
+ puts
166
+
167
+ # Invalid generation attempts
168
+ puts "Invalid generation attempts:"
169
+ invalid_generations = [
170
+ [2022, 5, 'year in the past'],
171
+ [2026, 0, 'órgão 0 (invalid)'],
172
+ [2026, 10, 'órgão 10 (out of range)']
173
+ ]
174
+
175
+ invalid_generations.each do |year, orgao, reason|
176
+ result = BrazilianUtils::LegalProcessUtils.generate(year, orgao)
177
+ puts " ✗ generate(#{year}, #{orgao}) => #{result.inspect} (#{reason})"
178
+ end
179
+ puts
180
+
181
+ # ============================================================================
182
+ # Validation After Generation
183
+ # ============================================================================
184
+ puts "5. VALIDATING GENERATED IDs"
185
+ puts "-" * 80
186
+
187
+ puts "Generating and validating 10 random IDs:"
188
+ 10.times do |i|
189
+ id = BrazilianUtils::LegalProcessUtils.generate(2026, rand(1..9))
190
+ is_valid = BrazilianUtils::LegalProcessUtils.valid?(id)
191
+ status = is_valid ? "✓" : "✗"
192
+ formatted = BrazilianUtils::LegalProcessUtils.format_legal_process(id)
193
+ puts " #{status} #{i + 1}. #{formatted}"
194
+ end
195
+ puts
196
+
197
+ # ============================================================================
198
+ # Complete Workflow Example
199
+ # ============================================================================
200
+ puts "6. COMPLETE WORKFLOW: GENERATE → FORMAT → VALIDATE"
201
+ puts "-" * 80
202
+
203
+ process_id = BrazilianUtils::LegalProcessUtils.generate(2026, 5)
204
+ puts "Step 1 - Generate ID: #{process_id}"
205
+
206
+ formatted = BrazilianUtils::LegalProcessUtils.format_legal_process(process_id)
207
+ puts "Step 2 - Format ID: #{formatted}"
208
+
209
+ is_valid = BrazilianUtils::LegalProcessUtils.valid?(process_id)
210
+ puts "Step 3 - Validate: #{is_valid ? '✓ Valid' : '✗ Invalid'}"
211
+
212
+ # Extract information
213
+ parts = formatted.split(/[-.]/)
214
+ puts
215
+ puts "Extracted Information:"
216
+ puts " Sequential Number: #{parts[0]}"
217
+ puts " Checksum: #{parts[1]}"
218
+ puts " Year: #{parts[2]}"
219
+ puts " Órgão: #{parts[3]}"
220
+ puts " Tribunal: #{parts[4]}"
221
+ puts " Foro: #{parts[5]}"
222
+ puts
223
+
224
+ # ============================================================================
225
+ # Real-World Use Case: Form Validation
226
+ # ============================================================================
227
+ puts "7. REAL-WORLD USE CASE: FORM VALIDATION"
228
+ puts "-" * 80
229
+
230
+ def validate_legal_process_form(process_id, description)
231
+ errors = []
232
+
233
+ errors << "Process ID is required" if process_id.nil? || process_id.empty?
234
+ errors << "Description is required" if description.nil? || description.empty?
235
+
236
+ if process_id && !process_id.empty?
237
+ unless BrazilianUtils::LegalProcessUtils.valid?(process_id)
238
+ errors << "Invalid legal process ID format"
239
+ end
240
+ end
241
+
242
+ if errors.empty?
243
+ clean_id = BrazilianUtils::LegalProcessUtils.remove_symbols(process_id)
244
+ formatted_id = BrazilianUtils::LegalProcessUtils.format_legal_process(clean_id)
245
+ {
246
+ valid: true,
247
+ message: "Form is valid",
248
+ clean_id: clean_id,
249
+ formatted_id: formatted_id
250
+ }
251
+ else
252
+ { valid: false, errors: errors }
253
+ end
254
+ end
255
+
256
+ test_forms = [
257
+ { id: '6847650-60.2023.3.03.0000', desc: 'Military Court Case' },
258
+ { id: '51808233620233030000', desc: 'Another Case' },
259
+ { id: '12345678901234567890', desc: 'Invalid ID' },
260
+ { id: '', desc: 'Empty ID Case' }
261
+ ]
262
+
263
+ test_forms.each_with_index do |form, index|
264
+ puts "\nTest Form #{index + 1}:"
265
+ puts " Process ID: #{form[:id].inspect}"
266
+ puts " Description: #{form[:desc]}"
267
+
268
+ result = validate_legal_process_form(form[:id], form[:desc])
269
+
270
+ if result[:valid]
271
+ puts " Status: ✓ #{result[:message]}"
272
+ puts " Clean ID: #{result[:clean_id]}"
273
+ puts " Formatted: #{result[:formatted_id]}"
274
+ else
275
+ puts " Status: ✗ Validation failed"
276
+ result[:errors].each do |error|
277
+ puts " - #{error}"
278
+ end
279
+ end
280
+ end
281
+ puts
282
+
283
+ # ============================================================================
284
+ # Batch Processing
285
+ # ============================================================================
286
+ puts "8. BATCH PROCESSING"
287
+ puts "-" * 80
288
+
289
+ legal_processes = [
290
+ '68476506020233030000',
291
+ '51808233620233030000',
292
+ '12345678901234567890',
293
+ '6847650-60.2023.3.03.0000',
294
+ '123',
295
+ 'invalid'
296
+ ]
297
+
298
+ valid_count = 0
299
+ invalid_count = 0
300
+
301
+ puts "Processing #{legal_processes.length} legal process IDs:"
302
+ legal_processes.each do |id|
303
+ is_valid = BrazilianUtils::LegalProcessUtils.valid?(id)
304
+
305
+ if is_valid
306
+ valid_count += 1
307
+ formatted = BrazilianUtils::LegalProcessUtils.format_legal_process(
308
+ BrazilianUtils::LegalProcessUtils.remove_symbols(id)
309
+ )
310
+ puts " ✓ #{formatted}"
311
+ else
312
+ invalid_count += 1
313
+ puts " ✗ #{id.inspect} (invalid)"
314
+ end
315
+ end
316
+
317
+ puts
318
+ puts "Summary:"
319
+ puts " Total: #{legal_processes.length}"
320
+ puts " Valid: #{valid_count} (#{(valid_count * 100.0 / legal_processes.length).round(1)}%)"
321
+ puts " Invalid: #{invalid_count} (#{(invalid_count * 100.0 / legal_processes.length).round(1)}%)"
322
+ puts
323
+
324
+ # ============================================================================
325
+ # Format Conversion
326
+ # ============================================================================
327
+ puts "9. FORMAT CONVERSION: FORMATTED ↔ CLEAN"
328
+ puts "-" * 80
329
+
330
+ conversion_examples = [
331
+ '6847650-60.2023.3.03.0000',
332
+ '5180823-36.2023.3.03.0000'
333
+ ]
334
+
335
+ puts "Converting between formatted and clean formats:"
336
+ conversion_examples.each do |formatted|
337
+ puts "\nOriginal (formatted): #{formatted}"
338
+
339
+ # Convert to clean
340
+ clean = BrazilianUtils::LegalProcessUtils.remove_symbols(formatted)
341
+ puts " → Clean: #{clean}"
342
+
343
+ # Convert back to formatted
344
+ reformatted = BrazilianUtils::LegalProcessUtils.format_legal_process(clean)
345
+ puts " → Format: #{reformatted}"
346
+
347
+ # Verify both formats are valid
348
+ valid_formatted = BrazilianUtils::LegalProcessUtils.valid?(formatted)
349
+ valid_clean = BrazilianUtils::LegalProcessUtils.valid?(clean)
350
+ puts " → Both formats valid: #{valid_formatted && valid_clean}"
351
+ end
352
+ puts
353
+
354
+ # ============================================================================
355
+ # Generate IDs for All Órgãos
356
+ # ============================================================================
357
+ puts "10. GENERATE IDs FOR ALL ÓRGÃOS"
358
+ puts "-" * 80
359
+
360
+ all_orgaos = {
361
+ 1 => 'Supremo Tribunal Federal (STF)',
362
+ 2 => 'Conselho Nacional de Justiça (CNJ)',
363
+ 3 => 'Justiça Militar',
364
+ 4 => 'Justiça Eleitoral',
365
+ 5 => 'Justiça do Trabalho',
366
+ 6 => 'Justiça Federal',
367
+ 7 => 'Justiça Estadual',
368
+ 8 => 'Justiça dos Estados e DF',
369
+ 9 => 'Justiça Militar Estadual'
370
+ }
371
+
372
+ puts "Generating one ID for each órgão:"
373
+ all_orgaos.each do |orgao, name|
374
+ id = BrazilianUtils::LegalProcessUtils.generate(2026, orgao)
375
+ formatted = BrazilianUtils::LegalProcessUtils.format_legal_process(id)
376
+ is_valid = BrazilianUtils::LegalProcessUtils.valid?(id)
377
+ status = is_valid ? "✓" : "✗"
378
+ puts " #{status} Órgão #{orgao}: #{formatted}"
379
+ puts " #{name}"
380
+ end
381
+ puts
382
+
383
+ # ============================================================================
384
+ # Database Storage Example
385
+ # ============================================================================
386
+ puts "11. DATABASE STORAGE EXAMPLE"
387
+ puts "-" * 80
388
+
389
+ puts "Simulating database operations:"
390
+ puts
391
+
392
+ # User submits a formatted ID
393
+ user_input = '6847650-60.2023.3.03.0000'
394
+ puts "User input: #{user_input}"
395
+
396
+ # Validate
397
+ if BrazilianUtils::LegalProcessUtils.valid?(user_input)
398
+ # Clean for storage (remove formatting)
399
+ db_format = BrazilianUtils::LegalProcessUtils.remove_symbols(user_input)
400
+ puts "✓ Valid! Storing in database: #{db_format}"
401
+
402
+ # Later, retrieve and format for display
403
+ puts "Retrieved from database: #{db_format}"
404
+ display_format = BrazilianUtils::LegalProcessUtils.format_legal_process(db_format)
405
+ puts "Formatted for display: #{display_format}"
406
+ else
407
+ puts "✗ Invalid legal process ID - rejecting input"
408
+ end
409
+ puts
410
+
411
+ # ============================================================================
412
+ # Statistics
413
+ # ============================================================================
414
+ puts "12. GENERATION STATISTICS"
415
+ puts "-" * 80
416
+
417
+ puts "Generating 100 random legal process IDs and analyzing..."
418
+
419
+ generated_ids = 100.times.map do
420
+ BrazilianUtils::LegalProcessUtils.generate(2026, rand(1..9))
421
+ end
422
+
423
+ # Count by órgão
424
+ orgao_counts = Hash.new(0)
425
+ generated_ids.each do |id|
426
+ orgao = id[13, 1].to_i
427
+ orgao_counts[orgao] += 1
428
+ end
429
+
430
+ puts "Distribution by Órgão:"
431
+ orgao_counts.sort.each do |orgao, count|
432
+ percentage = (count * 100.0 / generated_ids.length).round(1)
433
+ bar = '█' * (count / 2)
434
+ puts " Órgão #{orgao}: #{count.to_s.rjust(3)} (#{percentage.to_s.rjust(5)}%) #{bar}"
435
+ end
436
+
437
+ # Verify all are valid
438
+ all_valid = generated_ids.all? { |id| BrazilianUtils::LegalProcessUtils.valid?(id) }
439
+ puts "\nAll generated IDs are valid: #{all_valid ? '✓ Yes' : '✗ No'}"
440
+ puts
441
+
442
+ puts "=" * 80
443
+ puts "Examples completed!"
444
+ puts "=" * 80