Funciones útiles para DNI

Solapas principales

Hola a todos:

En este artículo quiero compartir unas funciones con vosotros, que espero os sean útiles en algún momento.

Definiciones

DNI: Documento Nacional de Identidad. Se compone de diferentes series de números y letras, que acreditan la identidad y los datos personales del titular, así como la nacionalidad española. Ejemplo: 94494452X

NIE: Número de Identificación Extranjero: Es un código para extranjeros en España.

Si necesitas generar ejemplos, puedes generar ejemplos de DNI o NIE en el siguiente enlace:

https://generadordni.es/

Cálculo de letra de un número DNI

La primera función calcula la letra de un número DNI.

/// Calculate letter of DNI
/// <br><b>pDni</b> format: con 8 numbers
ClassMethod GetLetterDni(pDni As %String) As %String
{
    set correspondence = $LISTBUILD("T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E")
    set letter = ""
    if (pDni '= "") & ($GET(pDni)?8N){
        set num = (pDni # 23)+1
        set letter = $LISTGET(correspondence,num)
    }
    quit letter
}

Cálculo de letra de un número NIE

La segunda función calcula una letra de NIE usando la primera función.

/// Calculate letter of NIE
/// <br><b>pNie</b> format: 1 letter, 7 numbers
ClassMethod GetLetterNie(pNie As %String) As %String
{
    set letter = ""
    //Get the first value
    set letter1 = $ZCONVERT($EXTRACT(pNie,1,1),"U")
    //Cogemos el resto del Nie para su posterior uso
    set num = $EXTRACT(pNie,2,8)
    if (pNie '= "") & ($GET(pNie)?1U7N){
        //If NIE starts with X, the X is replaced by the 0
        if (letter1 = "X") { set dni = 0_num }
        //If NIE starts with Y, the Y is replaced by the 1
        elseif(letter1 = "Y") { set dni = 1_num }
        //If NIE starts with Z, the Z is replaced by the 2
        elseif (letter1 = "Z"){ set dni = 2_num }
        //Calculates the letter
        set letter = ..GetLetterDni(dni)
    }
    quit letter
}

Validación de un DNI

La tercera función valida un DNI usando la primera función.

/// <br><b>pDni</b> format: 8 numbers, 1 letter
/// <br><b>0</b> Dni OK
/// <br><b>-1</b> Dni error
ClassMethod ValidateDni(pDni As %String) As %Integer
{
    set response = -1
    if (pDni '= "") & ($GET(pDni)?8N1U){
        //Get the numbers
        set auxNum = $EXTRACT(pDni,1,8)
        //Get the letter
        set auxLetter = $EXTRACT(pDni,9,9)
        //Calculates letter of dni
        set calculatedLetter = ..GetLetterDni(auxNum)
        //If both letters are the same the DNI is valid
        if (auxLetter = calculatedLetter) { set response = 0 }
    }
    quit response
}

Validación de un NIE

La última función valida un NIE utilizando la segunda función.

/// <br><b>pNie</b> NIE format: 1 letter, 7 numbers, 1 letter
/// <br><b>0</b> NIE OK
/// <br><b>-1</b> NIE error
ClassMethod ValidateNie(pNie As %String) As %Integer
{
    set response = -1
    if (pNie '= "") & ($GET(pNie)?1U7N1U){
        //Get the "numbers"
        set auxNum = $EXTRACT(pNie,1,8)
        //Get the first letter
        set auxLetter = $EXTRACT(pNie,9,9)
        set calculatedLetter = ..GetLetterNie(auxNum)
        //Si ambas letras son iguales el DNI es valido
        if (auxLetter = calculatedLetter) { set response = 0 }
    }
    quit response
}

Cualquier comentario para mejorar será bienvenido!!!

Saludos  ;)