package br.com.caelum.stella.validation.ie;
import java.text.ParseException;
import java.util.regex.Pattern;
import javax.swing.text.MaskFormatter;
import br.com.caelum.stella.DigitoGenerator;
import br.com.caelum.stella.DigitoPara;
import br.com.caelum.stella.MessageProducer;
import br.com.caelum.stella.SimpleMessageProducer;
class IESaoPauloComercioIndustriaValidator extends AbstractIEValidator {
public static final Pattern FORMATED = Pattern.compile("(\\d{3}\\.){3}\\d{3}");
public static final Pattern UNFORMATED = Pattern.compile("\\d{12}");
/**
* Este considera, por padrão, que as cadeias estão formatadas e utiliza um
* {@linkplain SimpleMessageProducer} para geração de mensagens.
*/
public IESaoPauloComercioIndustriaValidator() {
super(true);
}
/**
* O validador utiliza um {@linkplain SimpleMessageProducer} para geração de
* mensagens.
*
* @param isFormatted
* considerar cadeia formatada quando <code>true</code>
*/
public IESaoPauloComercioIndustriaValidator(boolean isFormatted) {
super(isFormatted);
}
public IESaoPauloComercioIndustriaValidator(MessageProducer messageProducer, boolean isFormatted) {
super(messageProducer, isFormatted);
}
@Override
protected Pattern getUnformattedPattern() {
return UNFORMATED;
}
@Override
protected Pattern getFormattedPattern() {
return FORMATED;
}
protected boolean hasValidCheckDigits(String unformattedIE) {
int length = unformattedIE.length();
String iESemDigitoParte1 = unformattedIE.substring(0, length - 4);
String iESemDigitoParte2 = unformattedIE.substring(length -3, length - 1);
String digitos = unformattedIE.substring(length - 4, length -3) + unformattedIE.substring(length -1);
String digitosCalculados = calculaDigitos(iESemDigitoParte1, iESemDigitoParte2);
return digitos.equals(digitosCalculados);
}
private String calculaDigitos(String iEParte1, String iEParte2) {
String digito1 = new DigitoPara(iEParte1).comMultiplicadores(10,8,7,6,5,4,3,1)
.trocandoPorSeEncontrar("0", 10).trocandoPorSeEncontrar("1", 11).calcula();
String digito2 = new DigitoPara(iEParte1 + digito1 + iEParte2).comMultiplicadoresDeAte(2, 10)
.trocandoPorSeEncontrar("0", 10).trocandoPorSeEncontrar("1", 11).calcula();
return digito1 + digito2;
}
private String formata(String valor) {
try {
final MaskFormatter formatador = new MaskFormatter("###.###.###.###");
formatador.setValidCharacters("1234567890");
formatador.setValueContainsLiteralCharacters(false);
return formatador.valueToString(valor);
} catch (ParseException e) {
throw new RuntimeException("Valor gerado não bate com o padrão: " + valor, e);
}
}
@Override
public String generateRandomValid() {
final DigitoGenerator digitoGenerator = new DigitoGenerator();
final String ieSemDigitosParte1 = digitoGenerator.generate(8);
final String ieSemDigitosParte2 = digitoGenerator.generate(2);
final String digitosCalculados = calculaDigitos(ieSemDigitosParte1, ieSemDigitosParte2);
final String ieComDigitos = ieSemDigitosParte1 + digitosCalculados.charAt(0)
+ ieSemDigitosParte2 + digitosCalculados.charAt(1);
if (isFormatted) {
return formata(ieComDigitos);
}
return ieComDigitos;
}
}