Вопрос: Как проверить правильность формата мексиканского RFC?
Что такое РФЦ? Федеральный реестр налогоплательщиков (RFC) — это уникальный ключ, который требуется каждому физическому или юридическому лицу в Мексике для осуществления любой законной экономической деятельности. Это налоговый кодекс для физических лиц и компаний, выпущенный SAT .
RFC формируется из букв имени и фамилии (физические лица), либо из инициалов или первых букв имени и даты создания (компании). Правила генерации и проверки описаны в Алгоритме генерации RFC с помощью гомоклава для физических и юридических лиц.odt ? .
Контекст: я хочу подтвердить, что RFC может быть действительным. Меня не интересует, существует ли он на самом деле. Я реализовал очень общую проверку, которая позволяет сделать последние 3 цифры необязательными:
/^[A-ZÑ&]{3,4}\d{6}(?:[A-Z\d]{3})?$/
но теперь я заинтересован в более строгой проверке полного RFC, чтобы убедиться, что контрольная цифра верна (последний символ).
Обычная фраза
Следующие проверки регулярных выражений:
Полная проверка
Я публикую код на JavaScript, чтобы иметь возможность запускать его здесь, но его очень легко портировать на любой другой язык.
Описание
Взяв за основу способ построения RFC:
([A-ZÑ&]{3,4})
группы 1 .* В этом случае мы могли бы подтвердить, что это только гласная или «Х», но если в первой фамилии 1 или 2 буквы, берется первая буква материнской фамилии (она может быть согласной).
* Для компаний, если в них нет 3-х слов, берутся следующие буквы имени.
?(?:- ?)?
.Допустимы:
" "
,"-"
," -"
," - "
,"- "
, или без дефисов и пробелов.* Шаблон выглядит забавно, но это так: необязательный пробел, за которым следует необязательная (незахваченная) группа, это соответствует дефису, за которым необязательно следует пробел. Если вы не хотите использовать пробелы или дефисы, вы можете удалить этот шаблон.
(\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01]))
Группа 2 .\d{2}
год.(?:0[1-9]|1[0-2])
месяц.(?:0[1-9]|[12]\d|3[01])
день.* Я принимаю до 31 на любой месяц. Я считаю, что ошибка при вводе данных о дате будет подтверждена позже контрольной цифрой. Однако, если вы хотите быть более строгим, и хотя вы можете проверить в регулярном выражении , я бы рекомендовал делать это с функциями используемого языка программирования.
?(?:- ?)?
.([A-Z\d]{2})
Группа 3 .([A\d])
Группа 4 .После проверки с помощью регулярного выражения мы проверяем, соответствует ли ожидаемая контрольная цифра для первых 11 или 12 символов введенной контрольной цифре (последний символ). Используется адаптация метода для контрольных кодов, называемая Module 11 или ISBN 10 .
У нас уже есть отдельные захваты текста 4-х частей RFC, где
rfcSinDigito
это будут первые 11 или 12 символов иdigitoVerificador
это будет последний символ.Но если они 11 символов (RFC морального лица - компания), он настроен так, чтобы можно было использовать один и тот же алгоритм для обоих. Вы можете поставить перед ним пробел или напрямую ввести рассчитанное значение.
Чтобы вычислить ожидаемую цифру, сначала сложите индекс каждого символа от 13 до 2, умноженный на значение каждого из 12 символов, которые имеют значение от 0 до 38 в соответствии с этим порядком (словарь):
И вдобавок к сложению вы берете 11-е дополнение остатка от деления на 11 (или по модулю 11, отсюда и название метода).
Если он дает 11, он становится
0
. Если он дает 10, он становитсяA
.Теперь да, мы можем сравнить, совпадают ли они, чтобы вернуть результат.
Но мы добавляем 2 исключения, для особых случаев общих RFC ( Вопросы и ответы по налоговой проверке, пункты 5 и 6 ? ), которые не являются действительными RFC физических или юридических лиц, но используются для:
1.
XAXX010101000
::: Операции проводится с широкой публикой.2.
XEXX010101000
::: Операции, проводимые с резидентами за рубежом, не зарегистрированными в РФЦ.* Как видите, я использую необязательный второй параметр (
aceptarGenerico
), если он не разрешен.Наконец, если он соответствует всем вышеуказанным правилам, возвращается чистый RFC .
Алгоритм проверки RFC
RFC действителен тогда и только тогда, когда он соответствует следующим 7 условиям:
Обратите внимание, что под действительным мы подразумеваем RFC, который соответствует всем стандартам документа, то есть существует комбинация имени и даты рождения или создания, которая генерирует этот RFC. В то время как для недопустимого RFC нет имени и даты, которые в конечном итоге приводят к созданию этого RFC. Просто потому, что он действителен, не означает, что он существует.
Расчет контрольной цифры.
Если в RFC 12 символов, мы добавляем пробел в начале.
Мы используем все символы RFC, кроме последнего. То есть мы всегда используем 12 символов.
Каждый символ соответствует значению согласно следующей таблице:
Значение первого символа умножается на 13, второго на 12, третьего на 11 и так далее, пока двенадцатый символ не будет умножен на 2.
Все эти значения складываются вместе. Кроме того, в документе описаны некоторые излишне сложные операции, эквивалентные:
Пример для RFC
GODE561231GR8
Обычная фраза
Если бы я собирался использовать регулярное выражение в качестве шага предварительной проверки, я бы использовал:
Это выражение принимает неправильные даты, такие как 999999. Ни 99-й день, ни 99-й месяц не существуют.
Я не вижу смысла усложнять регулярное выражение, например, отбрасывать дни, начинающиеся с 9, поскольку регулярное выражение все равно не проверяет даты (если только вы не используете очень сложное регулярное выражение). Лучше оставить лексический анализ для регулярного выражения (проверить, допустимы ли символы) и семантику для других уровней (проверить, верна ли дата). Но это спорно.
Использование Python и библиотеки.
Часто лучший способ реализовать что-то — не делать этого и использовать готовую реализацию, если она доступна и надежна. За исключением образовательных целей или некоторых особых требований.
Есть несколько библиотек, которые проверяют RFC. Например stdnum от Артура де Йонга и других. Доступно по адресу https://github.com/arthurdejong/python-stdnum под лицензией GNU Lesser General Public License версии 2.1 или более поздней.
Комментировать мало, все уже сделано библиотекой.
Использование функционального программирования. в масштабе
Функция, выполняющая проверку, является единственной общедоступной и также называется
esValido
. Как и Python, он возвращаетсяtrue
, если переданный RFC действителен.Код включает комментарии, которые объясняют, как он работает.
Наблюдения
En el documento Algoritmo para generar el RFC con homoclave para personas fisicas y morales.odt ? en la regla 9ª de la sección 2.2 figuran 39 palabras inconvenientes que no se pueden usar en un RFC. Sin embargo en el Anexo 4 figuran 41 palabras. Las 2 palabras extra son CAKO y MEAS. Yo he supuesto que el anexo es el correcto.
He probado con un millón de RFCs aleatorios, correctos e incorrectos, y las dos implementaciones han dado el mismo resultado en todos los casos. Aunque esto tampoco es garantía de nada.
No doy como buenos XEXX010101000 ni XAXX010101000 porque en el documento no se mencionan. La biblioteca de python hace lo mismo. Caso de que fuese necesario darlos como buenos es trivial hacer la modificación.
Ingresando a la pagina del SAT https://portalsat.plataforma.sat.gob.mx/ConsultaRFC/ pude obtener la expresión regular y la función que ellos utilizán espero les sirva:
API gratuita
API open source siempre gratuita con un tiempo de respuesta de 600 ms y en 2 pasos para verificar el rfc, saber si esta en la lista negra del SAT y en LRFC: Documentacion.
Expresión regular
La siguiente expresión regular (en el codigo) verifica:
Следуя логике SAT SAT 2 по ответу Орландо Альфонсо. Используя пример кода Мариано.
Он работает на других языках. Вот пример в го.
Actualmente ocupo esta expresion regular, valida lo siguiente: