Skip to content

Commit c11de0e

Browse files
authored
Adição de validador agência bancária (#301)
* Adicao de validador de agencia bancaria * Remocao do uso de Objects disponivel a partir do Java 7
1 parent c985e19 commit c11de0e

File tree

3 files changed

+187
-0
lines changed

3 files changed

+187
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package br.com.caelum.stella.validation;
2+
3+
import br.com.caelum.stella.DigitoGenerator;
4+
import br.com.caelum.stella.MessageProducer;
5+
import br.com.caelum.stella.SimpleMessageProducer;
6+
import br.com.caelum.stella.ValidationMessage;
7+
import br.com.caelum.stella.validation.error.AgenciaBancariaError;
8+
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
import java.util.regex.Matcher;
12+
import java.util.regex.Pattern;
13+
14+
/**
15+
* Representa um validador de agencia bancária.
16+
*
17+
* @author Thiago Nascimento
18+
*/
19+
public class AgenciaBancariaValidator implements Validator<String> {
20+
21+
public static final Pattern COM_DV = Pattern.compile("(\\d+)\\-([\\dX])");
22+
public static final Pattern SEM_DV = Pattern.compile("\\d+");
23+
24+
private boolean isComDigito = true;
25+
private MessageProducer messageProducer;
26+
27+
public AgenciaBancariaValidator() {
28+
this.messageProducer = new SimpleMessageProducer();
29+
}
30+
31+
public AgenciaBancariaValidator(boolean isComDigito) {
32+
this();
33+
this.isComDigito = isComDigito;
34+
}
35+
36+
@Override
37+
public void assertValid(String agencia) {
38+
39+
List<ValidationMessage> errors = this.invalidMessagesFor(agencia);
40+
41+
if (!errors.isEmpty()) {
42+
throw new InvalidStateException(errors);
43+
}
44+
}
45+
46+
@Override
47+
public List<ValidationMessage> invalidMessagesFor(String agencia) {
48+
49+
List<ValidationMessage> errors = new ArrayList<ValidationMessage>();
50+
51+
if (this.isEligible(agencia)) {
52+
53+
if (this.isComDigito) {
54+
55+
Matcher matcher = COM_DV.matcher(agencia);
56+
57+
if (!matcher.find()) {
58+
throw new InvalidStateException(this.messageProducer.getMessage(AgenciaBancariaError.INVALID_FORMAT));
59+
}
60+
61+
String dvInformado = matcher.group(2);
62+
String dvComputado = this.computarDigitoVerificador(matcher.group(1));
63+
64+
if (!dvInformado.equals(dvComputado)) {
65+
errors.add(this.messageProducer.getMessage(AgenciaBancariaError.INVALID_CHECK_DIGIT));
66+
}
67+
68+
} else {
69+
errors.add(this.messageProducer.getMessage(AgenciaBancariaError.CHECK_DIGIT_NOT_FOUND));
70+
}
71+
72+
} else {
73+
errors.add(this.messageProducer.getMessage(AgenciaBancariaError.INVALID_FORMAT));
74+
}
75+
76+
return errors;
77+
}
78+
79+
@Override
80+
public boolean isEligible(String value) {
81+
82+
if (value == null || value.trim().isEmpty()) {
83+
return false;
84+
}
85+
86+
return this.isComDigito ?
87+
COM_DV.matcher(value).matches() : SEM_DV.matcher(value).matches();
88+
}
89+
90+
@Override
91+
public String generateRandomValid() {
92+
final String agenciaSemDigitos = new DigitoGenerator().generate(4);
93+
return String.format("%s-%s", agenciaSemDigitos, this.computarDigitoVerificador(agenciaSemDigitos));
94+
}
95+
96+
public String computarDigitoVerificador(String agenciaSemDV) {
97+
98+
String[] algarisms = agenciaSemDV.split("");
99+
int multiplier = 9;
100+
int sum = 0;
101+
102+
for (int index = algarisms.length - 1; index >= 0; --index) {
103+
sum += Integer.valueOf(algarisms[index]) * multiplier--;
104+
}
105+
106+
int rest = sum % 11;
107+
return rest == 10 ? "X" : String.valueOf(rest);
108+
}
109+
110+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package br.com.caelum.stella.validation.error;
2+
3+
import br.com.caelum.stella.validation.InvalidValue;
4+
5+
public enum AgenciaBancariaError implements InvalidValue {
6+
INVALID_CHECK_DIGIT, CHECK_DIGIT_NOT_FOUND, INVALID_FORMAT
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package br.com.caelum.stella.validation;
2+
3+
import static org.junit.Assert.assertFalse;
4+
import static org.junit.Assert.assertTrue;
5+
import static org.junit.Assert.fail;
6+
7+
import org.junit.Test;
8+
9+
import br.com.caelum.stella.MessageProducer;
10+
import br.com.caelum.stella.SimpleMessageProducer;
11+
import br.com.caelum.stella.validation.error.AgenciaBancariaError;
12+
13+
/**
14+
* @author Thiago Nascimento
15+
*/
16+
public class AgenciaBancariaValidatorTest {
17+
18+
private MessageProducer messageProducer = new SimpleMessageProducer();
19+
20+
@Test
21+
public void shouldAcceptEligibleAgenciasComDV() {
22+
AgenciaBancariaValidator validator = new AgenciaBancariaValidator();
23+
assertTrue(validator.isEligible("3610-2"));
24+
assertFalse(validator.isEligible("3610"));
25+
}
26+
27+
@Test
28+
public void shouldAcceptEligibleAgenciasSemDV() {
29+
AgenciaBancariaValidator validator = new AgenciaBancariaValidator(false);
30+
assertFalse(validator.isEligible("3610-2"));
31+
assertTrue(validator.isEligible("3610"));
32+
}
33+
34+
@Test
35+
public void shouldReturnNoValidationMessagesForCorrectAgenciasComDV() {
36+
AgenciaBancariaValidator validator = new AgenciaBancariaValidator();
37+
assertTrue(validator.invalidMessagesFor("3610-2").isEmpty());
38+
assertTrue(validator.invalidMessagesFor("3793-1").isEmpty());
39+
assertTrue(validator.invalidMessagesFor("197-X").isEmpty());
40+
assertTrue(validator.invalidMessagesFor("4158-0").isEmpty());
41+
assertTrue(validator.invalidMessagesFor("2121-0").isEmpty());
42+
assertTrue(validator.invalidMessagesFor("1284-X").isEmpty());
43+
}
44+
45+
@Test
46+
public void shouldReturnInvalidCheckDigitForIncorrectDV() {
47+
48+
AgenciaBancariaValidator validator = new AgenciaBancariaValidator();
49+
50+
try {
51+
validator.assertValid("2121-9");
52+
fail();
53+
} catch (InvalidStateException e) {
54+
e.getInvalidMessages().contains(this.messageProducer.getMessage(AgenciaBancariaError.INVALID_CHECK_DIGIT));
55+
}
56+
}
57+
58+
@Test
59+
public void shouldReturnCheckDigitNotFoundForAgenciaSemDV() {
60+
61+
AgenciaBancariaValidator validator = new AgenciaBancariaValidator();
62+
63+
try {
64+
validator.assertValid("1103");
65+
fail();
66+
} catch (InvalidStateException e) {
67+
e.getInvalidMessages().contains(this.messageProducer.getMessage(AgenciaBancariaError.CHECK_DIGIT_NOT_FOUND));
68+
}
69+
}
70+
}

0 commit comments

Comments
 (0)