Como realizar la validación de un Cif en Python

written by uve 5 January 2011

Ayer escribí una rutina para validar números NIF, hoy toca para CIF. en España se utiliza el Código de Identificación Fiscal (CIF) para la identificación tributaria de personas jurídicas.

def validate_cif(value):
    value = unicode(value).upper()
    match = re.match('(?P<letra>[A-H]|[J-N]|[P-S]|[UVW])(?P<numeracion>\d{7})(?P<control>[0-9A-J])', value)
    if match is None:
        match = re.match('(?P<letra>[A-H]|[J-N]|[P-S]|[UVW])-(?P<numeracion>\d{7})(?P<control>[0-9A-J])', value)
    if match is None:
        raise Expection
    LETRAS_CIF = 'ABCDEFGHJKLMNPQRSUVW' # Letras de CIF válidas
    DC_NUMERICO_CIF = 'ABEH' # CIFs con número como dígito de control
    DC_LETRA_CIF = 'KPQS' # CIFs con letra como dígito de control
    ALPHA_CIF = 'JABCDEFGHI' # Correspondencia entre letra y dígito de control
    # Obtenemos la información
    letra = match.group('letra')
    numeracion = match.group('numeracion')
    control = match.group('control')
    # No todas las letras son válidas
    if letra not in LETRAS_CIF:
        raise Expection
    # Suma de los pares
    a = reduce(lambda x, y: int(x)+int(y), numeracion[1::2])
    # Suma de la suma de los dígitos de los impares * 2
    b = sum(
        [
            int(reduce(lambda x,y: int(x)+int(y), impar))
            for impar in map(lambda x: unicode(int(x)*2), numeracion[::2])
        ]
    )
    c = a + b
    e = c % 10
    d = (10-e) % 10
    # Obtenemos el dígito de control
    if letra in DC_NUMERICO_CIF:
        d = unicode(d) # Es numérico
    elif letra in DC_LETRA_CIF:
        d = ALPHA_CIF[d] # Es una letra
    else:
        # Puede ser tanto letra como número
        if control.isalpha():
            d = ALPHA_CIF[d]
        else:
            d = unicode(d)
    if d != control:
        raise Expection
    return unicode('%s%s%s' % (letra, numeracion, control))

Tags

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.