def validate(number): """Check if the number provided is a valid RUC number. This checks the length, formatting, check digit and check sum.""" number = compact(number) if len(number) != 13: raise InvalidLength() if not isdigits(number): raise InvalidFormat() if (number[:2] < '01' or number[:2] > '24') and (number[:2] not in ('30', '50')): raise InvalidComponent() # invalid province code if number[2] < '6': # 0..5 = natural RUC: CI plus establishment number if number[-3:] == '000': raise InvalidComponent() # establishment number wrong ci.validate(number[:10]) elif number[2] == '6': # 6 = public RUC if number[-4:] == '0000': raise InvalidComponent() # establishment number wrong if _checksum(number[:9], (3, 2, 7, 6, 5, 4, 3, 2, 1)) != 0: raise InvalidChecksum() elif number[2] == '9': # 9 = juridical RUC if number[-3:] == '000': raise InvalidComponent() # establishment number wrong if _checksum(number[:10], (4, 3, 2, 7, 6, 5, 4, 3, 2, 1)) != 0: raise InvalidChecksum() else: raise InvalidComponent() # third digit wrong return number
def do_check_vat(self): fiscal = self.property_account_position_id persona = fiscal.persona_id.code identificacion = fiscal.identificacion_id.code if identificacion == 'F': if not self.vat == '9999999999999': raise UserError( _( "El consumidor final debe tener trece números " \ "nueve como indentificación: 999999999999" ) ) if identificacion == 'R': try: ruc.validate(self.vat) except: raise UserError(_("Número de RUC incorrecto.")) elif identificacion == 'C': try: ci.validate(self.vat) except: raise UserError(_("Número de cédula incorrecta"))
def _validate_natural(number): """Check if the number is a valid natural RUC (CI plus establishment).""" if number[-3:] == '000': raise InvalidComponent() # establishment number wrong ci.validate(number[:10]) return number
def sri_check_vat_from_ui_pos(self, cr, uid, partner, context=None): log_error = False if partner.get('property_account_position_id', False): property_account_id = partner.get('property_account_position_id', False) fiscal = self.pool.get('account.fiscal.position').browse( cr, uid, [int(property_account_id)], context=context) partner['do_check_vat'] = True if partner['do_check_vat']: persona = fiscal.persona_id.code identificacion = fiscal.identificacion_id.code if partner['vat'] and fiscal: try: if identificacion == 'R': # Verificación de tipo de contribuyente if persona == '6' and partner['vat'][2:3] < '6': pass elif persona == '9' and partner['vat'][ 2:3] == '6' and fiscal.es_publica: pass elif persona == '9' and partner['vat'][ 2:3] == '9' and not fiscal.es_publica: pass else: return (_( "El numero de R.U.C. o C.I. no concuerda con el tipo de " "contribuyente, por favor verifique que el numero sea correcto " "en la página www.sri.gob.ec")) # Verificación del documento ruc.validate(partner['vat']) elif identificacion == 'C': ci.validate(partner['vat']) except InvalidChecksum: return (_( "El numero de R.U.C. o C.I. no concuerda con el proceso de validacion " "del S.R.I., por favor verifique que el numero sea correcto en la " "página www.sri.gob.ec")) except InvalidComponent: if identificacion == 'R': return (_( "El numero de R.U.C. contiene errores, por favor verifique que " "los dos primeros dígitos se encuentren entre 01 y 24, que el tercer" "tercero digito no sea mayor que 5 y que el número de establecimiento sea" "válido.")) elif identificacion == 'C': return (_( "El numero de C.I. contiene errores, por favor verifique que " "los dos primeros dígitos se encuentren entre 01 y 24, que el tercer" "tercero digito no sea mayor que 5.")) except InvalidLength: if identificacion == 'R': return (_( "El numero de R.U.C. debe tener 13 digitos, por favor verifique la " "información ingresada.")) elif identificacion == 'C': return (_( "El numero de C.I. debe tener 10 digitos, por favor verifique la " "información ingresada.")) except InvalidFormat: return (_( "El numero de R.U.C. o C.I. tiene caracteres no válidos, por favor " "verfique que la información ingresada sea correcta.")) else: return log_error