Skip to content

Commit c985e19

Browse files
authored
Atualização da regra validacão do titulo de eleitor (#300)
* Adicionando regra de substituição de DV 0 por 1 na validação do título eleitoral * Adequação do cômputo dos DVs do título de acordo com algoritmo do TSE
1 parent 7d4484b commit c985e19

File tree

3 files changed

+85
-37
lines changed

3 files changed

+85
-37
lines changed

stella-core/src/main/java/br/com/caelum/stella/type/Estado.java

+49-29
Original file line numberDiff line numberDiff line change
@@ -38,170 +38,172 @@
3838
*/
3939
public enum Estado {
4040

41-
AC(12) {
41+
AC(12, "24") {
4242
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
4343
return new IEAcreValidator(messageProducer, isFormatted);
4444
}
4545

4646
},
47-
AL(27) {
47+
AL(27, "17") {
4848
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
4949
return new IEAlagoasValidator(messageProducer, isFormatted);
5050
}
5151

5252
},
53-
AP(16) {
53+
AP(16, "25") {
5454
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
5555
return new IEAmapaValidator(messageProducer, isFormatted);
5656
}
5757

5858
},
59-
AM(13) {
59+
AM(13, "22") {
6060
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
6161
return new IEAmazonasValidator(messageProducer, isFormatted);
6262
}
6363

6464
},
65-
BA(29) {
65+
BA(29, "05") {
6666
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
6767
return new IEBahiaValidator(messageProducer, isFormatted);
6868
}
6969

7070
},
71-
CE(23) {
71+
CE(23, "07") {
7272
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
7373
return new IECearaValidator(messageProducer, isFormatted);
7474
}
7575

7676
},
77-
DF(53) {
77+
DF(53, "20") {
7878
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
7979
return new IEDistritoFederalValidator(messageProducer, isFormatted);
8080
}
8181

8282
},
83-
ES(32) {
83+
ES(32, "14") {
8484
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
8585
return new IEEspiritoSantoValidator(messageProducer, isFormatted);
8686
}
8787

8888
},
89-
GO(52) {
89+
GO(52, "10") {
9090
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
9191
return new IEGoiasValidator(messageProducer, isFormatted);
9292
}
9393

9494
},
95-
MA(21) {
95+
MA(21, "11") {
9696
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
9797
return new IEMaranhaoValidator(messageProducer, isFormatted);
9898
}
9999

100100
},
101-
MT(51) {
101+
MT(51, "18") {
102102
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
103103
return new IEMatoGrossoValidator(messageProducer, isFormatted);
104104
}
105105

106106
},
107-
MS(50) {
107+
MS(50, "19") {
108108
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
109109
return new IEMatoGrossoDoSulValidator(messageProducer, isFormatted);
110110
}
111111

112112
},
113-
MG(31) {
113+
MG(31, "02") {
114114
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
115115
return new IEMinasGeraisValidator(messageProducer, isFormatted);
116116
}
117117

118118
},
119-
PA(15) {
119+
PA(15, "13") {
120120
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
121121
return new IEParaValidator(messageProducer, isFormatted);
122122
}
123123

124124
},
125-
PB(25) {
125+
PB(25, "12") {
126126
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
127127
return new IEParaibaValidator(messageProducer, isFormatted);
128128
}
129129

130130
},
131-
PR(41) {
131+
PR(41, "06") {
132132
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
133133
return new IEParanaValidator(messageProducer, isFormatted);
134134
}
135135

136136
},
137-
PE(26) {
137+
PE(26, "08") {
138138
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
139139
return new IEPernambucoValidator(messageProducer, isFormatted);
140140
}
141141

142142
},
143-
PI(22) {
143+
PI(22, "15") {
144144
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
145145
return new IEPiauiValidator(messageProducer, isFormatted);
146146
}
147147

148148
},
149-
RJ(33) {
149+
RJ(33, "03") {
150150
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
151151
return new IERioDeJaneiroValidator(messageProducer, isFormatted);
152152
}
153153

154154
},
155-
RN(24) {
155+
RN(24, "16") {
156156
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
157157
return new IERioGrandeDoNorteValidator(messageProducer, isFormatted);
158158
}
159159

160160
},
161-
RS(43) {
161+
RS(43, "04") {
162162
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
163163
return new IERioGrandeDoSulValidator(messageProducer, isFormatted);
164164
}
165165

166166
},
167-
RO(11) {
167+
RO(11, "23") {
168168
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
169169
return new IERondoniaValidator(messageProducer, isFormatted);
170170
}
171171

172172
},
173-
RR(14) {
173+
RR(14, "26") {
174174
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
175175
return new IERoraimaValidator(messageProducer, isFormatted);
176176
}
177177

178178
},
179-
SC(42) {
179+
SC(42, "09") {
180180
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
181181
return new IESantaCatarinaValidator(messageProducer, isFormatted);
182182
}
183183

184184
},
185-
SP(35) {
185+
SP(35, "01") {
186186
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
187187
return new IESaoPauloValidator(messageProducer, isFormatted);
188188
}
189189

190190
},
191-
SE(28) {
191+
SE(28, "21") {
192192
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
193193
return new IESergipeValidator(messageProducer, isFormatted);
194194
}
195195

196196
},
197-
TO(17) {
197+
TO(17, "27") {
198198
public Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted) {
199199
return new IETocantinsValidator(messageProducer, isFormatted);
200200
}
201201

202202
};
203203

204204
private final int codigoIBGE;
205+
206+
private final String codigoEleitoral;
205207

206208
/**
207209
* Retorna um validador de Inscrição Estadual.
@@ -215,15 +217,20 @@ public Validator<String> getIEValidator(MessageProducer messageProducer, boolean
215217
*/
216218
public abstract Validator<String> getIEValidator(MessageProducer messageProducer, boolean isFormatted);
217219

218-
private Estado(int codigoIBGE) {
220+
private Estado(int codigoIBGE, String codigoEleitoral) {
219221
this.codigoIBGE = codigoIBGE;
222+
this.codigoEleitoral = codigoEleitoral;
220223
}
221224

222225
public int getCodigoIBGE() {
223226
return codigoIBGE;
224227
}
228+
229+
public String getCodigoEleitoral() {
230+
return codigoEleitoral;
231+
}
225232

226-
/**
233+
/**
227234
* A região do território brasileiro em que esse estado está localizado.
228235
*
229236
* @return Retorna a região em que esse estado está localizado.
@@ -249,4 +256,17 @@ public Regiao regiao() {
249256
public boolean localizadoEm(Regiao regiao) {
250257
return regiao() == regiao;
251258
}
259+
260+
public static Estado deCodigoEleitoral(String codigo) {
261+
262+
Estado[] estados = Estado.values();
263+
264+
for (Estado estado : estados) {
265+
if (estado.getCodigoEleitoral().equals(codigo)) {
266+
return estado;
267+
}
268+
}
269+
270+
throw new IllegalStateException("Não foi possível determinar o estado a partir do código eleitoral " + codigo);
271+
}
252272
}

stella-core/src/main/java/br/com/caelum/stella/validation/TituloEleitoralValidator.java

+32-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package br.com.caelum.stella.validation;
22

33
import java.util.ArrayList;
4+
import java.util.Arrays;
45
import java.util.List;
56
import java.util.Random;
67
import java.util.regex.Pattern;
@@ -11,6 +12,7 @@
1112
import br.com.caelum.stella.SimpleMessageProducer;
1213
import br.com.caelum.stella.ValidationMessage;
1314
import br.com.caelum.stella.format.TituloEleitoralFormatter;
15+
import br.com.caelum.stella.type.Estado;
1416
import br.com.caelum.stella.validation.error.TituloEleitoralError;
1517

1618
/**
@@ -80,6 +82,8 @@ public class TituloEleitoralValidator implements Validator<String> {
8082
public static final Pattern FORMATED = Pattern.compile("(\\d{10})/(\\d{2})");
8183
public static final Pattern UNFORMATED = Pattern.compile("(\\d{10})(\\d{2})");
8284

85+
private static final List<Estado> estadosSubstitoresDigito = Arrays.asList(Estado.SP, Estado.MG);
86+
8387
private boolean isFormatted = false;
8488
private MessageProducer messageProducer;
8589

@@ -160,24 +164,46 @@ private List<ValidationMessage> getInvalidValues(String tituloDeEleitor) {
160164
}
161165
return errors;
162166
}
163-
167+
164168
private String calculaDigitos(String tituloSemDigito) {
169+
165170
int length = tituloSemDigito.length();
166171

167172
String sequencial = tituloSemDigito.substring(0,length - 2);
168-
String digito1 = new DigitoPara(sequencial).complementarAoModulo().trocandoPorSeEncontrar("0",10,11).mod(11).calcula();
173+
String codigoEstado = tituloSemDigito.substring(length - 2, length);
174+
boolean ehEstadoSubstitutorDigito = estadosSubstitoresDigito.contains(Estado.deCodigoEleitoral(codigoEstado));
175+
176+
String digito1 = this.geraDigito(ehEstadoSubstitutorDigito, sequencial);
177+
String digito2 = this.geraDigito(ehEstadoSubstitutorDigito, codigoEstado + digito1);
169178

170-
String codigoEstado = tituloSemDigito.substring(length - 2, length);
171-
String digito2 = new DigitoPara(codigoEstado + digito1).complementarAoModulo().trocandoPorSeEncontrar("0",10,11).mod(11).calcula();
172-
173179
return digito1 + digito2;
174180
}
175181

182+
private String geraDigito(boolean ehEstadoSubstitutorDigito, String base) {
183+
184+
String digito = new DigitoPara(base).mod(11).calcula();
185+
186+
if (ehEstadoSubstitutorDigito) {
187+
if (digito.equals("1")) {
188+
digito = "0";
189+
} else if (digito.equals("0")) {
190+
digito = "1";
191+
} else {
192+
digito = new DigitoPara(base).complementarAoModulo().mod(11).calcula();
193+
}
194+
} else {
195+
digito = digito.equals("1") || digito.equals("0") ? "0" :
196+
new DigitoPara(base).complementarAoModulo().mod(11).calcula();
197+
}
198+
199+
return digito;
200+
}
201+
176202
private boolean hasCodigoDeEstadoInvalido(String tituloDeEleitor) {
177203
int codigo= Integer.parseInt(tituloDeEleitor.substring(tituloDeEleitor.length() - 4, tituloDeEleitor.length() - 2));
178204
return !(codigo >= 01 && codigo <= 28);
179205
}
180-
206+
181207
public boolean isEligible(String value) {
182208
boolean result;
183209
if (isFormatted) {

stella-core/src/test/java/br/com/caelum/stella/validation/TituloEleitoralValidatorTest.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ public class TituloEleitoralValidatorTest {
1212

1313
private final String[] validStrings = { "543275360116","142501480248", "557833330370", "013785610434",
1414
"253346440540", "033734180663", "585353130710", "884328631058", "553505611201", "028565701333",
15-
"245770031481", "713782341503", "403374181694", "452083221724" };
15+
"245770031481", "713782341503", "403374181694", "452083221724", "162749070141" };
16+
1617
private final String[] validStringsFormatted = { "5432753601/16","1425014802/48", "5578333303/70", "0137856104/34",
1718
"2533464405/40", "0337341806/63", "5853531307/10", "8843286310/58", "5535056112/01", "0285657013/33",
18-
"2457700314/81", "7137823415/03", "4033741816/94", "4520832217/24"};
19+
"2457700314/81", "7137823415/03", "4033741816/94", "4520832217/24", "2800440202/05"};
20+
1921
private final String[] invalidFirstDigitStrings = { "543275360106", "452083221714", "253346440520", "553505611231",
2022
"884328631048" };
2123

0 commit comments

Comments
 (0)