Validar RIF en django-localflavor-ve

98 views
Skip to first unread message

Milton Mazzarri

unread,
Feb 9, 2011, 6:09:19 PM2/9/11
to djan...@googlegroups.com
Saludos cordiales,

Hasta donde he podido ver el código[1] el día de hoy del método que
verifica el RIF en forms.py no se cubren ciertos casos, al menos
basado en este artículo [2].

Ya que me encuentro de viaje, con algo de tiempo pero con muy mala
conexión para trabajar directamente en github quería al menos plantear
una idea de concepto de la propuesta de cambio.

El RIF normalmente está compuesto de tres partes, por ejemplo:

J-00020200-1

J = Indica RIF jurídico. En esta categoría entra: Persona, Jurídico,
Gobierno (no lo ví en el artículo antes mencionado), Zonas.
00020200 = 8 dígitos, si es inferior a 8 digitos se agregan ceros al inicio.
1 = Este número permite verificar si el RIF es válido o no de acuerdo
a ciertas reglas. Las reglas descritas según el artículo que se
encuentra en [2]

La propuesta es la siguiente: ¿Si el último digito permite verificar
si un RIF es válido o no por qué no incluirlo en el localflavor?. Acá
les coloco la "traducción" del artículo que se encuentra en [2] a un
script en Python.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" RIF validation
:author: Milton Mazzarri
:version: 0.1"""

import re

def validate_rif(string):
"""
Return True if RIF is validate according to some rules

Interesting bits:

>>> validate_rif("J-00020200-1")
True
>>> validate_rif("V-01849149-0")
True
>>> validate_rif("VAL-30000493-0")
True

:var string: String to validate
:type string: str

More info:
http://finanzasdejesus.blogspot.com/2009/09/rif-seniat-venezuela-digito-verificador.html
"""

pattern = r"^(?P<type>(V|J|CCS|VAL|MBO|PL(C|M)))-?(?P<number>\d{8})-?(?P<validator>\d)$"
letter_factor = 4
number_factor = '32765432'
divisor = 11

rif = re.match(re.compile(pattern), string)

if rif:
_type = rif.group('type')

if _type == 'V':
_type = 1
elif _type in ['CSS', 'VAL', 'MBO', 'PLC', 'PLM']:
_type = 2
elif _type == 'J':
_type = 3

subtotal = sum([int(number) * int(factor) for number,factor in
zip(rif.group('number'), number_factor)])

total = subtotal + _type * letter_factor

result = divisor - total % divisor

if result < 0 or result > 9:
result = 0

if result == int(rif.group('validator')):
return True
else:
return False
else:
return False


if __name__ == "__main__":
import doctest
doctest.testmod()

El script incluye via doctest los casos de prueba mostrados en el
artículo antes mencionado.

Debo advertir que desconozco si el artículo describe el reglamento
actual del SENIAT, también me extraña no ver incluido el caso del RIF
tipo G (Gobierno). ¿Alguien posee información sobre el reglamento
actual del SENIAT para la validación del RIF?.

¿Qué les parece?, ¿incluimos esta validación en el localflavor?.

Un saludo, feliz día. Cualquier inquietud estoy a la orden.

[1] https://github.com/macagua/django-local-flavor-ve/blob/master/ve/forms.py
[2] http://finanzasdejesus.blogspot.com/2009/09/rif-seniat-venezuela-digito-verificador.html
--
Milton Mazzarri, a.k.a. [milmazz]
Usuario de GNU/Linux: #369158
http://blog.milmazz.com.ve

Reply all
Reply to author
Forward
0 new messages