问题:如何验证秘鲁 RUC 的格式是否有效?
什么是中国人民大学?单一纳税人登记处( RUC ) 是秘鲁各地纳税人登记的计算机登记处。它是由SUNAT(国家海关和税务总局)发布的个人和公司税码,自 1993 年起记录,自 2004 年起开始监管[1]。
它是所有自然人或法人(本国或外国)[2]的唯一密钥,具有永久性质和强制使用。SUNAT维护纳税人登记,将RUC 与个人数据相关联[3]。
每个纳税人都有一个 11 位数的编号。前 2 位数字标识人的类型,接下来的 8 位是 DNI 或分配给公司的号码,最后一位是验证数字[4] [5]。
我尝试了什么:我使用了 SUNAT在其网站上使用的相同代码来验证 RUC。但是,它接受不正确的 RUC,并且似乎有多余的计算。
//Validación de SUNAT
function valruc(valor){
valor = trim(valor)
if ( esnumero( valor ) ) {
if ( valor.length == 8 ){
suma = 0
for (i=0; i<valor.length-1;i++){
digito = valor.charAt(i) - '0';
if ( i==0 ) suma += (digito*2)
else suma += (digito*(valor.length-i))
}
resto = suma % 11;
if ( resto == 1) resto = 11;
if ( resto + ( valor.charAt( valor.length-1 ) - '0' ) == 11 ){
return true
}
} else if ( valor.length == 11 ){
suma = 0
x = 6
for (i=0; i<valor.length-1;i++){
if ( i == 4 ) x = 8
digito = valor.charAt(i) - '0';
x--
if ( i==0 ) suma += (digito*x)
else suma += (digito*x)
}
resto = suma % 11;
resto = 11 - resto
if ( resto >= 10) resto = resto - 10;
if ( resto == valor.charAt( valor.length-1 ) - '0' ){
return true
}
}
}
return false
}
function trim(cadena){
cadena2 = "";
len = cadena.length;
for ( var i=0; i <= len ; i++ )
if (cadena.charAt(i) != " "){
cadena2+=cadena.charAt(i);
}
return cadena2;
}
function esnumero(campo){
return (!(isNaN( campo )));
}
//Prueba
var ruc = '12345678903',
valido = valruc(ruc);
console.log('El RUC', ruc,
'es', (valido?'válido':'inválido'),
'para SUNAT.');
目标:我对验证用户输入的 RUC 的格式感兴趣,它可以接受诸如连字符或数字之间的其他标点符号之类的字符。在提交表格之前,我会将其用作初步阶段。
此外,如果有办法检查 RUC 是否存在并处于活动状态,那就更好了。
我正在使用 JavaScript 进行测试,但它可以使用任何流行的语言。重要的是算法。
测试:我在Companies.regioncallao.gob.pe (? PDF)中找到了以下制造公司列表,可以用作测试数据。
F̲u̲e̲n̲t̲e̲s̲:
①第 943 号法令 - http://www.elperuano.com.pe/NormasElperuano/2015/06/16/1251160-1.html
② SUNAT - 单一纳税人登记处 - http://www.sunat.gob .pe/legislacion/ruc/
③ RUC 法律规定 (?PDF) - http://mariano.freevar.com/ruc/REGLAMENTO%20DE%20LA%20LEY%20DEL%20RUC.pdf
④什么是 SUNAT ?什么是中国人民大学?- http://conexiontributaria.blogspot.com.ar/2011/10/que-es-la-sunat-que-es-el-ruc-que_9779.html
⑤会计论坛 - 其他 RUC 数字 - http://www . perucontable.com/modules/newbb/viewtopic.php?post_id=57226
代码:
我们使用 3 个函数(如果结果有效,每个函数都调用下一个):
validarInput(input)
rucValido(ruc)
obtenerDatosSUNAT(ruc)
Demo para móviles
描述:
第一步是删除我们不感兴趣的字符(
-.,[]() \t\r\n\f
):然后,我们检查我们是否还有一个整数:
使用整数,我们调用主函数:
在函数内部,我们看到它们是 11 位数字,并且从 10、15、16、17 或 20 开始:
并且,如果以上都成立,我们可以验证最后一位数字(验证者)是否正确。
RUC的验证码是如何验证的?
SUNAT 对称为模块 11或ISBN 10的控制代码的方法进行了改编。在这些情况下,它是一种广泛使用的方法,用于检测单个数字或单个或两个交换中的错误(本质上是打字错误)。在由:
suma % 11
) 计算余数。11 - resto
)。if (ruc % 10 == complemento % 10)
)。换句话说,对于每个数字,我们将添加 RUC 的最后一个数字 (
ruc % 10
) 并乘以它的因子 (i % 7 + (i/7|0) + 1
) - 是的,这给了我们 1、2、3、4、5、6、7、2 , 3, 4 , 5, 对于 的每个值i
。在 的每次迭代中
i
,我们删除最后一个数字 (ruc = ruc/10|0
)。需要注意的是,为了进一步简化操作,我们将校验位包含在同一个帐户中(因子为 1
i=0
)。我们只需要在第4步得到大于9的值的情况下进行调整。如果是10或11,则表示最后一位是0或1,在那些情况下总和减去1(suma = -(ruc%10<2)
)。所以我们剩下:
并在以下情况下进行检查:
如果最后一个条件为真,则检查校验位,并且 RUC 有效。