Utilizando el siguiente código realizo la validación del dígito validador del RFC de México:
private boolean isCheckDigitValid(String taxIdNumber) {
taxIdNumber = taxIdNumber.toUpperCase().trim();
if (taxIdNumber.length() == 12) {
taxIdNumber = " " + taxIdNumber;
}
int sumOfCharacterValues = 0;
for (int i = 0; i < taxIdNumber.length() - 1; i++) {
char character = taxIdNumber.charAt(i);
sumOfCharacterValues = sumOfCharacterValues + lookupTable.get(character) * (13 - i);
}
int remainder = sumOfCharacterValues % 11;
if (remainder == 0) {
return getLastCharacter(taxIdNumber).equals("0");
} else if (remainder == 1) {
return getLastCharacter(taxIdNumber).equals("A");
} else {
return getLastCharacter(taxIdNumber).equals(String.valueOf(11 - remainder));
}
}
private String getLastCharacter(String taxIdNumber) {
return taxIdNumber.substring(taxIdNumber.length() - 1);
}
private static Map<Character, Integer> lookupTable = new HashMap<>();
static {
lookupTable.put('0', 0);
lookupTable.put('1', 1);
lookupTable.put('2', 2);
lookupTable.put('3', 3);
lookupTable.put('4', 4);
lookupTable.put('5', 5);
lookupTable.put('6', 6);
lookupTable.put('7', 7);
lookupTable.put('8', 8);
lookupTable.put('9', 9);
lookupTable.put('A', 10);
lookupTable.put('B', 11);
lookupTable.put('C', 12);
lookupTable.put('D', 13);
lookupTable.put('E', 14);
lookupTable.put('F', 15);
lookupTable.put('G', 16);
lookupTable.put('H', 17);
lookupTable.put('I', 18);
lookupTable.put('J', 19);
lookupTable.put('K', 20);
lookupTable.put('L', 21);
lookupTable.put('M', 22);
lookupTable.put('N', 23);
lookupTable.put('&', 24);
lookupTable.put('O', 25);
lookupTable.put('P', 26);
lookupTable.put('Q', 27);
lookupTable.put('R', 28);
lookupTable.put('S', 29);
lookupTable.put('T', 30);
lookupTable.put('U', 31);
lookupTable.put('V', 32);
lookupTable.put('W', 33);
lookupTable.put('X', 34);
lookupTable.put('Y', 35);
lookupTable.put('Z', 36);
lookupTable.put(' ', 37);
lookupTable.put('Ñ', 38);
}
Tratando de validar el RFC: GACM611029DH3 no me da un resultado válido y según https://portalsat.plataforma.sat.gob.mx/ConsultaRFC/ se considera un código válido.
He revisado la lógica que utilizo frente a Cómo validar un RFC de México y su digito verificador tratando de obtener más información pero no veo diferencia.
Como resto me da 10 y por tanto, el último dígito debería ser 1. ¿Qué es lo incorrecto?
Gracias por la ayuda.