.. meta::
:description: Mexa Generador, Validador de campos para tramitologia Mexicana
:keywords: Mexa, curp, nss, clabe, rfc, checksum, validador, faker
.. |github_link| raw:: html
Ver en GitHub
Pruebas
-----------------------
.. epigraph::
No matter where you go, there you are.
-- Buckaroo Banzai
.. compound::
The 'rm' command is very dangerous. If you are logged
in as root and enter ::
cd /
rm -rf *
you will erase the entire contents of your file system.
Teoría sobre el CURP
==================================
El **CURP** (*Clave Única de Registro de Población*) es un documento de identificación personal en México que se utiliza para una amplia gama de propósitos oficiales, incluyendo la educación, la salud, el empleo y el registro de votantes.
Usos tipicos del **CURP** son:
----------------------------------------------------
El **CURP** es una herramienta importante para la identificación y registro de las personas en México, y es necesario para acceder a una amplia variedad de servicios y trámites oficiales, algunos de sus usos tipicos son:
- **Identificación personal**: identificar a las personas de manera única y evitar la duplicación de registros.
- **Trámites oficiales**: realizar diversos trámites oficiales, como la obtención de una licencia de conducir, la inscripción en la escuela, el registro de una empresa, entre otros.
- **Registro de votantes**: Es un requisito para registrarse como votante en México.
- **Servicios de salud**: para acceder a servicios de salud del gobierno, como el Seguro Popular y el IMSS.
- **Control migratorio**: Es utilizado para controlar la migración en el territorio mexicano.
Estructura del CURP
----------------------------------------------------
.. _imagen-ejemplo:
.. figure:: /_static/chabelo_curp.png
:alt: Curp de ejemplo caso Chabelo
:figclass: figure
:align: center
Descripción detallada de una CURP de ejemplo. Caso Chabelo.
.. note::
La imagen muestra el curp de **Xavier Lopéz Rodríguez** quien nació en el extrangero, por lo tanto el valor en Entidad Federativa es ``NE`` *No especificado*.
- **id_nombre**: formada de los siguientes 4 caracteres
- Primera letra del primer apellido.
- Primera vocal del primer apellido.
- Primera letra del segundo apellido (en caso de tenerlo).
- Primera letra del nombre de pila.
- **fecha_nacimiento**: 6 digitos conformados de la siguiente manera AAMMDD:
- Dos dígitos correspondientes al año de nacimiento.
- Dos dígitos correspondientes al mes de nacimiento.
- Dos dígitos correspondientes al día de nacimiento.
- **Sexo**: Una letra para indicar el sexo (H para hombre y M para mujer).
- **entidad_federativa** Código de dos letras que identifican la entidad federativa de nacimiento.
- **consonantes_internas** Segundo identificador del nombre, conformado por
- Primer consonante interna del 1er apellido
- Primer consonante interna del 2do apellido
- Primer consonante interna del Nombre de pila
- **homoclave**: Garantiza la unicidad de la clave, siendo un "`número`" serial, este tiene la caracteristica que para los que nacieron antes del año 2000 inicia con 0, mientras que los que nacieron del 2000 en adelante una A.
- **checksum:** Digito verificador de los 17 caracteres previos, el calculo de este hace una variante del `algoritmo Luhn `_.
:ref: imagen_ejemplo
.. code-block:: shell
# ⌐------------------------------ id_nombre: 1ras letras 1er ap, 2do ap y nombre
# | ⌐----------------------- fecha_nacimiento: 6 digitos en orden AAMMDD
# | | ⌐------------------ sexo: un carácter el cual puede ser H ó M
# | | | ⌐-------------- entidad_federativa: codigo de 2 caracteres
# | | | | ⌐---------- consonantes_internas: 1er ap, 2d ap y nombre
# | | | | | ⌐----- homoclave: Evita duplicidades
# | | | | | | ⌐-- checksum: Digito verificador de integridad
# | | | | | | |
# NNNN AAMMDD S EN CCC H C
# 0123 012345 0 01 012 0 0
Código de Entidad Federativa:
---------------------------------------------
Los caracteres en la posición ``11`` y ``12`` en la `imagen de ejemplo <#imagen-ejemplo>`_ se encuentrán dados por un código de dos caracteres que corresponden a la entidad federativa de nacimiento, estos códigos se enecuentran dados por la siguiente tabla:
.. csv-table:: Cátalogo de Entidades Federativas
:file: ./csv/catalogo_entidades_federativas.csv
:widths: 30, 70
:header-rows: 1
.. note::
`Diario Oficial de la Federación, Fecha: 23/10/1996 - Edición Matutina `_. Ejemplar Completo(*PDF*) P8 **CLAVES DE ENTIDADES FEDERATIVAS**
.. note::
Puede consultar en linea el Catalo de Entidades Oficial: http://www.dgis.salud.gob.mx/contenidos/intercambio/entidades_gobmx.html
Checksum
-------------------------------------------
.. admonition:: Como se calcula el checksum?
Usa una variante del `algoritmo Luhn `_
.. csv-table:: Tabla de Equivalencias de Carácteres
:file: ./csv/tabla_caracteres_curp.csv
:widths: 25, 25, 25, 25
:header-rows: 1
**Ejemplo**: para el curp **LORX350217HNEPDV08** en el cual claramente el checksum deberá ser **8**:
- **Asignar indice descendiente** (*decreciente*): tal que para **L** es ``18``, **O** 17, **R** 16 y asi sucesivamente asta llegar al **0** con ``2``.
- **Asignar el valor equivalente a cada caracter**: A cada carácter se le asigna el valor correspondiente en la tabla, para **L** le corresponde ``21``, **O** ``25``, asi sucesivamente asta llegar al **0** con ``0``.
- **Multiplicar el indice por el valor equivalente**: A cada caracter se le multiplica el indice por su valor equivalente en la tabla, **L** con indice ``18`` y valor equivalente ``21`` que tendrá como producto ``18*21 = 378``.
.. csv-table:: Tabla de ejemplo Caso LORX350217HNEPDV08
:file: ./csv/ejemplo_tabla_checksum.csv
:widths: 10, 25, 25, 40
:header-rows: 1
Posteriormente se suman los productos de cada indice con su valor correspondiente, somo se muestra a continuación:
.. math::
\sum_{indice=18}^2 suma = {indice} • {valor} = 378 + 425 + ... + 96 + 0 = {2,622}
Lo cual seria ``suma = 378 + 425 + ... + 0`` el cual para este ejemplo nos da el valor de **2,622**.
La formula del **checksum** en función de la variable **suma** esta representada por la siguiente expresión:
.. math::
checksum = 10 - (suma \% 10)
.. note::
Donde la operación **%** (*módulo*) representa el residuo de la división, en este caso de **suma** entre ``10`` lo cual lo convierte en un caso particular donde tiene la *función* de extraer el **último digito** de **suma**.
**Por ejemplo**: Para ``suma = 2,622`` la operación es ``2,622 % 10 = residuo(2,622 / 10) = 2``, para ``suma = 2,623`` la operación es ``2,623 % 10 = residuo(2,623 / 10) = 3`` y asi sucesivamente va a extraer el útimo numero por ejemplo para ``suma = 1,999`` la operación es ``1,999 % 10 = residuo(1,999 / 10) = 9``.
De la formula anterior al remplazar **suma** por su valor obtenido previamente tras realizar la sumatoria el cual es **2,622** quedando como:
.. math::
checksum = 10 - (suma \% 10) = 10 - (2,622 \% 10) = 10 - (2) = 8
El cual nos devuelve el valor esperado de **8**, queda al lector realizar alguna otra prueba.
.. note::
Usted puede validar dicho CURP `En el sitio Oficial del Gobierno de México `_.
Enlaces relacionados
-------------------------------------------
- `Clase CurpField `_.