module DniNie

@title dni_nie module 
Los DNI's (Documento Nacional de Identidad) se componen de 8 dígitos y una letra de control
| DNI's (Document National Identity) are compound of 8 numbers and a control digit
Los NIE's de extranjeros residentes en España tienen una letra (X, Y, Z), 7 números y dígito de control.
| NIE's (foreigner number id.) are compound of a letter (X, Y, Z) first , then 7 digits and a control letter at the end.

Gem name Require statement Main class or module ruby_parser require 'ruby_parser' RubyParser

dni_nie        require 'dni_nie'        DniNie
RESTO | MOD       0    1         2      3   4        5     6  7       8    9         10     11
LETRA | LETTER        T      R   W        A     G  M       Y    F         P      D   X        B
RESTO | MOD           12     13         14     15         16     17         18     19         20     21         22
LETRA | LETTER        N      J   Z        S     Q  V       H    L         C      K   E
X → 0 ,Y → 1, Z → 2
más información | more info DNI-NIE http://www.interior.gob.es/web/servicios-al-ciudadano/dni/calculo-del-digito-de-control-del-nif-nie (Spanish)
@version 0.3.9
@author Luis Jacob Mariscal Fernández

Constants

CODIGO

CODIGO contiene la letra asociado al resto del numero | stores the mod code (control letter) of the number.

LETRA

LETRA contiene los valores de la 1era letra del NIE | contains the NIE value of 1st letter.

Public Class Methods

control_digit(num)
Alias for: get_control_letter
control_letter(num)
Alias for: get_control_letter
dni()
Alias for: get_random_dni
generar_dni()
Alias for: get_random_dni
generar_nie()
Alias for: get_random_nie
get_control_letter(num)
Also aliased as: control_letter, control_digit
Alias for: letra
get_random_dni() click to toggle source

Genera el documento nacional de identidad aleatorio | Creates a random valid Spanish national id document.

@param ninguno | none @return [String] DNI aleatorio | random DNI document.

# File lib/dni_nie.rb, line 94
def self.get_random_dni # genera dni aleatorio
    dni = rand(0..89999999).to_s # límite en 89 millones, no se sabe de mayor a la fecha
    dni += letra(dni)
    dni
end
Also aliased as: random_dni, generar_dni, new_dni, dni
get_random_nie() click to toggle source

Genera un número de identificación del extranjero NIE aleaotorio | Creates a random valid Spanish foreigner id document.

@param ninguno | none @return [String] NIE aleatorio | random NIE document.

# File lib/dni_nie.rb, line 103
def self.get_random_nie # genera nie aleatorio
    #nie = LETRA[(rand(0..2))] ++ rand(0..9_999_999).to_s #parece que siempre asigna millones
    nie = LETRA[(rand(0..2))] + rand(0..9999999).to_s # why ++ ?
    #p nie
    letra = letra(nie.dup)
    nie += letra
    nie
end
letra(num) click to toggle source

Calcula la letra de control para el número de identificación dado | Generate the entry id control letter.

@param calcula para entrada [Número|Cadena] la letra de control asociada | yield for [Number|String] the control letter associated. @return [String] letra de control de la entrada | the requested control letter of the entry.

# File lib/dni_nie.rb, line 68
def self.letra(num) # letra o digito  de control del DNI/NIE
    num = transform(num)
    #doc = '0' + doc if doc.size == 6
    #a = 0
    CODIGO[(num.to_i % 23)].to_s
end
Also aliased as: get_control_letter
new_dni()
Alias for: get_random_dni
new_nie()
Alias for: get_random_nie
nie()
Alias for: get_random_nie
num_id_extranjero()
Alias for: get_random_nie
random_dni()
Alias for: get_random_dni
random_nie()
Alias for: get_random_nie
validar(ci)
Alias for: validate
validar_doc(ci)
Alias for: validate_doc
validate(ci)
Also aliased as: validar
Alias for: validate_doc
validate_doc(ci) click to toggle source

Valida el documento de identificación dado | Validate the entry id document.

@param verifica si la entrada [Número|Cadena] es número de documento válido | check if entry [Number|String] is a valid document id. @return [Boolean] indica si válida la entrada | the entry validation return (true/flase).

# File lib/dni_nie.rb, line 79
def self.validate_doc(ci) # validar documento
  raise ArgumentError, "Entrada errónea, número de identificación debe ser una cadena | Wrong entry, must be a String" unless ci.is_a? String
  dig = ci[-1]
  ci = ci[0..-2]
  ci = transform(ci)
  #p dig
  #p letra(ci)
  #p ci
  letra(ci) == dig.upcase # pone en Mayúsculas
end
Also aliased as: validate, validar_doc

Protected Class Methods

transform(doc) click to toggle source

Transforma la entrada a número de identificación formateado | Converts the entry into id specific format.

@param transforma [Número|Cadena] a formato útil (sin 0s superflúos ni caracteres innecesarios) | transform [Number|String] to the valid format type (erase extra 0s, not allowed chars) @return [String] the object converted into the expected format. @raise Entrada errónea | Wrong entry si la entrada es mayor de 8 caracteres | if the entry is longer than 8 chars

# File lib/dni_nie.rb, line 45
def self.transform(doc) # da formato conveniente a la entrada
 doc = doc.to_s if doc.is_a? Integer
 doc[0] = '1' if (doc[0] == 'y') or ( doc[0] == 'Y')
 doc[0] = '2' if doc[0] == 'Z' or  (doc[0] == 'z')
 doc[0] = ''  if doc[0] == 'X' or  doc[0] == 'x'
#p doc
 if doc.length > 8 
      raise ArgumentError, "Entrada errónea, número de identificación demasiado grande | Wrong identification number, too long"
 end
 doc.gsub!(/\D/, '') # expresión regular, elimina lo que no sea dígitos
 #DONE check if sth included not a digit
 while doc[0] == '0' and (doc.length > 1) # elimina 0s superfluos
  doc[0] = ''
 end
 doc
end