1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package com.rapiddweller.domain.br;
28
29 import com.rapiddweller.benerator.NonNullGenerator;
30 import com.rapiddweller.benerator.sample.WeightedCSVSampleGenerator;
31 import com.rapiddweller.benerator.wrapper.ProductWrapper;
32 import com.rapiddweller.common.Encodings;
33
34 import java.util.ArrayList;
35 import java.util.Random;
36
37
38
39
40
41
42
43
44
45
46 public class CNPJGenerator extends WeightedCSVSampleGenerator<String>
47 implements NonNullGenerator<String> {
48
49 private static final String LOCAL =
50 "/com/rapiddweller/domain/br/cnpj_sufix.csv";
51
52
53
54
55 private final boolean formatted;
56
57 private final Random random;
58
59
60
61
62 public CNPJGenerator() {
63 this(false);
64 }
65
66
67
68
69
70
71 public CNPJGenerator(boolean formatted) {
72 super(LOCAL, Encodings.UTF_8);
73 this.random = new Random();
74 this.formatted = formatted;
75 }
76
77
78
79 private static void addDigits(ArrayList<Integer> digits) {
80 int sum = 0;
81 sum = (5 * digits.get(0)) + (4 * digits.get(1)) + (3 * digits.get(2)) +
82 (2 * digits.get(3))
83 + (9 * digits.get(4)) + (8 * digits.get(5)) +
84 (7 * digits.get(6)) + (6 * digits.get(7))
85 + (5 * digits.get(8)) + (4 * digits.get(9)) +
86 (3 * digits.get(10)) + (2 * digits.get(11));
87 digits.add((sum % 11 < 2) ? 0 : 11 - (sum % 11));
88
89 sum = (6 * digits.get(0)) + (5 * digits.get(1)) + (4 * digits.get(2)) +
90 (3 * digits.get(3))
91 + (2 * digits.get(4)) + (9 * digits.get(5)) +
92 (8 * digits.get(6)) + (7 * digits.get(7))
93 + (6 * digits.get(8)) + (5 * digits.get(9)) +
94 (4 * digits.get(10)) + (3 * digits.get(11))
95 + (2 * digits.get(12));
96 digits.add((sum % 11 < 2) ? 0 : 11 - (sum % 11));
97 }
98
99 @Override
100 public String generate() {
101 return generate(getResultWrapper()).unwrap();
102 }
103
104
105
106 @Override
107 public ProductWrapper<String> generate(ProductWrapper<String> wrapper) {
108 String suffix = super.generate(wrapper).unwrap();
109 if (suffix == null) {
110 suffix = "0000";
111 }
112 return wrapper.wrap(generateCNPJ(suffix));
113 }
114
115 private String generateCNPJ(String sufix) {
116
117 StringBuilder buf = new StringBuilder();
118 ArrayList<Integer> digits = new ArrayList<>();
119 for (int i = 0; i < 8; i++) {
120 digits.add(random.nextInt(9));
121 }
122 for (int i = 0; i < 4; i++) {
123 digits.add(Integer.parseInt(sufix.substring(i, i + 1)));
124 }
125 addDigits(digits);
126
127 for (Integer digit : digits) {
128 buf.append(digit);
129 }
130 if (this.formatted) {
131 buf.insert(2, '.');
132 buf.insert(6, '.');
133 buf.insert(10, '/');
134 buf.insert(15, '-');
135 }
136 return buf.toString();
137 }
138
139 }