Skip to content

Commit 638edf5

Browse files
authored
Omitir validación del módulo 11 para personas jurídicas (#5)
## Descripción Este PR ajusta la lógica de validación del RUC para personas jurídicas para alinearla con la disposición oficial del Servicio de Rentas Internas (SRI) [1]. El cambio principal consiste en **omitir la validación del algoritmo módulo 11** para los RUCs pertenecientes a personas jurídicas (aquellos cuyo tercer dígito es '9'). Esto sigue la recomendación explícita del SRI, ya que sus procesos internos de generación pueden resultar en RUCs válidos que no pasarían la comprobación tradicional del módulo 11. Fixes #4 ## Cambios Realizados * Se modificó la función `isRUC` para **omitir la validación del módulo 11** específicamente para los RUCs identificados como pertenecientes a personas jurídicas. Estos RUCs ahora se consideran válidos por `isRUC` si cumplen los criterios básicos (longitud 13, numérico, código de provincia correcto, sufijo '001'). * Se introdujo una nueva función auxiliar `isLegalEntityRUC(ruc: string): boolean`. * Se añadieron nuevos casos de prueba para verificar la nueva lógica y la función auxiliar. * Se actualizó el README y se incrementó la versión del paquete a `1.3.0`. ## Uso Recomendado de `isLegalEntityRUC` La nueva función `isLegalEntityRUC` está diseñada para ayudar a implementar la estrategia de validación recomendada por el SRI: 1. Puedes usar `isLegalEntityRUC(ruc)` para determinar si un RUC pertenece a una persona jurídica. 2. **Si `isLegalEntityRUC` devuelve `true`**, y necesitas una confirmación de validez más allá de los chequeos básicos (longitud, formato), **la recomendación del SRI es validar ese RUC directamente contra sus servicios web oficiales**. 3. La función `isRUC` de esta librería ya **no** intentará validar el dígito verificador para estos casos, simplemente confirmará el formato general. ## Motivo del Cambio Asegurar que la librería `validator-ec` refleje con precisión las reglas de validación oficiales y actuales definidas por el SRI, evitando que RUCs válidos de personas jurídicas sean marcados incorrectamente como inválidos. Se facilita la implementación de la estrategia de validación sugerida por el SRI mediante la función `isLegalEntityRUC`. ## Enlaces Relacionados [1] Comunicación SRI (Comunicado Registro Único de Contribuyentes - RUC): https://minka.gob.ec/mintel/ge/rutr/gobec_forms/uploads/1ef593d96275a7c07987c5bc043ce654/comunicado_cambio_generacion_RUC.pdf ## Pruebas * Las pruebas existentes pasan. * Se han añadido y pasan nuevas pruebas que cubren específicamente la lógica actualizada para los RUCs de personas jurídicas y la función `isLegalEntityRUC`.
1 parent 0391b29 commit 638edf5

File tree

5 files changed

+48
-25
lines changed

5 files changed

+48
-25
lines changed

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,12 @@ npm install validator-ec
3434

3535
## Validadores
3636

37-
| Validador | Descripción | Ejemplo |
38-
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
39-
| `isCedula(cedula: string): boolean` | Valida una cédula de identidad ecuatoriana. Devuelve `true` si la cédula es válida, de lo contrario `false`. | `isCedula('1710034065')` |
40-
| `isRUC(ruc: string): boolean` | Valida un número de RUC (Registro Único de Contribuyentes). Devuelve `true` si el RUC es válido, de lo contrario `false`. | `isRUC('1790016919001')` |
41-
| `isZipCode(zipCode: string): boolean` | Valida un código postal ecuatoriano. Devuelve `true` si el código postal es válido, de lo contrario `false`. | `isZipCode('131401')` |
37+
| Validador | Descripción | Ejemplo |
38+
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- |
39+
| `isCedula(cedula: string): boolean` | Valida una cédula de identidad ecuatoriana. Devuelve `true` si la cédula es válida, de lo contrario `false`. | `isCedula('1710034065')` |
40+
| `isRUC(ruc: string): boolean` | Valida un número de RUC (Registro Único de Contribuyentes). Devuelve `true` si el RUC es válido, de lo contrario `false`. | `isRUC('1790016919001')` |
41+
| `isLegalEntityRUC(ruc: string): boolean` | Devuelve `true` si un RUC pertenece a una persona jurídica (tercer dígito igual a 9), de lo contrario `false`. | `isLegalEntityRuc('0992345678001')` |
42+
| `isZipCode(zipCode: string): boolean` | Valida un código postal ecuatoriano. Devuelve `true` si el código postal es válido, de lo contrario `false`. | `isZipCode('131401')` |
4243

4344
## Uso
4445

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "validator-ec",
3-
"version": "1.2.0",
3+
"version": "1.3.0",
44
"type": "module",
55
"author": "Victor Bayas",
66
"license": "Apache-2.0",

src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import isCedula from "./lib/isCedula";
2-
import isRUC from "./lib/isRUC";
2+
import { isRUC, isLegalEntityRUC } from "./lib/isRUC";
33
import isZipCode from "./lib/isZipCode";
44

5-
export { isCedula, isRUC, isZipCode };
5+
export { isCedula, isRUC, isLegalEntityRUC, isZipCode };

src/lib/isRUC.ts

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,20 @@ import isCedula from "./isCedula";
55
* Valida un RUC ecuatoriano.
66
*
77
* @param {string} ruc El RUC a validar.
8-
* @returns {boolean} Devuelve `true` si el RUC es válido, de lo contrario devuelve `false`.
8+
* @returns {boolean} Devuelve `true` si el RUC es válido,
9+
* de lo contrario devuelve `false`.
10+
*
11+
* @remarks
12+
* De acuerdo a lo dispuesto por el Servicio de Rentas Internas (SRI) [1],
13+
* esta función **no aplica** el algoritmo de validación del módulo 11 para
14+
* RUCs de personas jurídicas (tercer dígito igual a 9).
15+
*
16+
* En caso de ser necesario, el SRI recomienda verificar la validez del RUC
17+
* a través de sus canales oficiales de consulta pública.
18+
*
19+
* [1] https://minka.gob.ec/mintel/ge/rutr/gobec_forms/uploads/1ef593d96275a7c07987c5bc043ce654/comunicado_cambio_generacion_RUC.pdf
920
*/
10-
export default function isRUC(ruc: string): boolean {
21+
export function isRUC(ruc: string): boolean {
1122
// Verificamos que el RUC tenga 13 dígitos
1223
if (ruc.length !== 13) {
1324
return false;
@@ -55,21 +66,8 @@ export default function isRUC(ruc: string): boolean {
5566

5667
// Función para validar RUC de personas jurídicas
5768
function validateLegalEntityRUC(ruc: string): boolean {
58-
// Coeficientes para personas jurídicas
59-
const coefficients = [4, 3, 2, 7, 6, 5, 4, 3, 2];
60-
const baseCode = ruc.substring(0, 9);
61-
const validatorDigit = parseInt(ruc[9], 10);
62-
63-
let sum = 0;
64-
for (let i = 0; i < coefficients.length; i++) {
65-
const value = parseInt(baseCode[i], 10) * coefficients[i];
66-
sum += value;
67-
}
68-
69-
const remainder = sum % 11;
70-
const result = remainder === 0 ? 0 : 11 - remainder;
71-
72-
return result === validatorDigit;
69+
// Se omite la validación del módulo 11 de acuerdo a lo dispuesto por el SRI
70+
return true;
7371
}
7472

7573
// Función para validar RUC de entidades públicas
@@ -90,3 +88,14 @@ function validatePublicEntityRUC(ruc: string): boolean {
9088

9189
return result === validatorDigit;
9290
}
91+
92+
/**
93+
* Determina si un RUC pertenece a una persona jurídica (tercer dígito igual a 9).
94+
*
95+
* @param {string} ruc El RUC a comprobar.
96+
* @returns {boolean} Devuelve `true` si el RUC pertenece a una persona jurídica,
97+
* de lo contrario devuelve `false`.
98+
*/
99+
export function isLegalEntityRUC(ruc: string): boolean {
100+
return ruc.length === 13 && ruc[2] === "9";
101+
}

tests/index.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { describe, it, expect } from "vitest";
22
import { isCedula, isRUC, isZipCode } from "../src";
3+
import { isLegalEntityRUC } from "../src/lib/isRUC";
34

45
describe("Validador isCedula", () => {
56
it("debería retornar true para una cédula válida", () => {
@@ -75,6 +76,18 @@ describe("Validador isRUC", () => {
7576
expect(isRUC("1390012949001")).toBe(true);
7677
});
7778

79+
// Prueba para RUCs de personas jurídicas que no pasarían la validación del módulo 11
80+
// pero que son válidos según lo dispuesto por el SRI (ya no se valida con módulo 11)
81+
it("debería retornar true para RUCs de personas jurídicas sin validación de módulo 11", () => {
82+
expect(isRUC("1791234567001")).toBe(true);
83+
expect(isRUC("0992345678001")).toBe(true);
84+
expect(isRUC("1793456789001")).toBe(true);
85+
});
86+
87+
it("debería retornar true si el RUC pertenece a una persona jurídica", () => {
88+
expect(isLegalEntityRUC("1790016919001")).toBe(true);
89+
});
90+
7891
it("debería retornar true para un RUC válido de entidad pública", () => {
7992
expect(isRUC("1760001550001")).toBe(true);
8093
});

0 commit comments

Comments
 (0)