-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1 from bayasdev/add-is-ruc
Add isRUC validator
- Loading branch information
Showing
8 changed files
with
200 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
// Helper para validar que una cadena contenga únicamente dígitos. | ||
export default function isDigits(value: string): boolean { | ||
return /^\d+$/.test(value); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
import isCedula from "./lib/isCedula"; | ||
import isRUC from "./lib/isRUC"; | ||
|
||
export { isCedula }; | ||
export { isCedula, isRUC }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,55 +1,62 @@ | ||
export default function isCedula(cedula: string): boolean { | ||
// Validamos que la cédula solo contenga 10 dígitos | ||
if (cedula.length === 10) { | ||
// Definimos el último dígito o tambien llamado dígito verificador | ||
const lastDigit = parseInt(cedula[cedula.length - 1], 10); | ||
|
||
// Definimos las variables a utilizar | ||
let evens = 0; | ||
let odds = 0; | ||
let sum = 0; | ||
|
||
// Iteramos cada item excluyendo el último digito, aplicando el Algoritmo de Luhn | ||
for (let i = 1; i <= cedula.length - 1; i++) { | ||
if (i % 2 === 0) { | ||
evens += parseInt(cedula[i - 1]); | ||
} else { | ||
let x = parseInt(cedula[i - 1]) * 2; | ||
x > 9 ? (odds += x - 9) : (odds += x); | ||
} | ||
} | ||
import isDigits from "../helpers/isDigits"; | ||
|
||
sum += evens + odds; | ||
export default function isCedula(cedula: string): boolean { | ||
// Validamos que la cédula tenga 10 dígitos | ||
if (cedula.length !== 10) { | ||
return false; | ||
} | ||
|
||
// Extraemos el primer digito de la suma | ||
const firstDigit = parseInt(sum.toString()[0], 10); | ||
// Verificamos que todos los caracteres sean dígitos | ||
if (!isDigits(cedula)) { | ||
return false; | ||
} | ||
|
||
// Obtenemos la decena | ||
const dozen = (firstDigit + 1) * 10; | ||
// Definimos el último dígito o tambien llamado dígito verificador | ||
const lastDigit = parseInt(cedula[cedula.length - 1], 10); | ||
|
||
// Obtenemos el dígito validador | ||
let validatorDigit = dozen - sum; | ||
// Definimos las variables a utilizar | ||
let evens = 0; | ||
let odds = 0; | ||
let sum = 0; | ||
|
||
// Si el dígito verificador es mayor a 10 lo igualamos a 0 | ||
if (validatorDigit >= 10) { | ||
validatorDigit = 0; | ||
// Iteramos cada item excluyendo el último digito, aplicando el Algoritmo de Luhn | ||
for (let i = 1; i <= cedula.length - 1; i++) { | ||
if (i % 2 === 0) { | ||
evens += parseInt(cedula[i - 1]); | ||
} else { | ||
let x = parseInt(cedula[i - 1]) * 2; | ||
x > 9 ? (odds += x - 9) : (odds += x); | ||
} | ||
} | ||
|
||
// Codigo de provincia | ||
// Validamos si la cedula pertenece a alguna provincia | ||
const provinceCode = parseInt(cedula[0] + cedula[1]); | ||
sum += evens + odds; | ||
|
||
// Valida cédulas locales y de Ecuatorianos en el exterior | ||
if (provinceCode > 24 && provinceCode != 30) { | ||
return false; | ||
} | ||
// Extraemos el primer digito de la suma | ||
const firstDigit = parseInt(sum.toString()[0], 10); | ||
|
||
if (validatorDigit == lastDigit) { | ||
return true; | ||
} else { | ||
return false; | ||
} | ||
} else { | ||
// Obtenemos la decena | ||
const dozen = (firstDigit + 1) * 10; | ||
|
||
// Obtenemos el dígito validador | ||
let validatorDigit = dozen - sum; | ||
|
||
// Si el dígito verificador es mayor a 10 lo igualamos a 0 | ||
if (validatorDigit >= 10) { | ||
validatorDigit = 0; | ||
} | ||
|
||
// Codigo de provincia | ||
// Validamos si la cedula pertenece a alguna provincia | ||
const provinceCode = parseInt(cedula[0] + cedula[1]); | ||
|
||
// Valida cédulas locales y de Ecuatorianos en el exterior | ||
if (provinceCode > 24 && provinceCode != 30) { | ||
return false; | ||
} | ||
|
||
if (validatorDigit == lastDigit) { | ||
return true; | ||
} | ||
|
||
return false; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
import isDigits from "../helpers/isDigits"; | ||
import isCedula from "./isCedula"; | ||
|
||
export default function isRUC(ruc: string): boolean { | ||
// Verificamos que el RUC tenga 13 dígitos | ||
if (ruc.length !== 13) { | ||
return false; | ||
} | ||
|
||
// Verificamos que todos los caracteres sean dígitos | ||
if (!isDigits(ruc)) { | ||
return false; | ||
} | ||
|
||
// Extraemos los primeros 10 dígitos (cédula o código base) | ||
const baseCode = ruc.substring(0, 10); | ||
|
||
// Extraemos los últimos 3 dígitos (código de establecimiento) | ||
const establishmentCode = ruc.substring(10, 13); | ||
|
||
// Verificamos que el código de establecimiento sea 001 | ||
if (establishmentCode !== "001") { | ||
return false; | ||
} | ||
|
||
// Obtenemos el tercer dígito para determinar el tipo de entidad | ||
// Fuente: https://www.sri.gob.ec/ruc-personas-naturales | ||
const thirdDigit = parseInt(ruc[2], 10); | ||
|
||
// Validación para personas naturales (tercer dígito entre 0 y 5) | ||
if (thirdDigit >= 0 && thirdDigit <= 5) { | ||
// Validamos que los primeros 10 dígitos sean una cédula válida | ||
return isCedula(baseCode); | ||
} | ||
|
||
// Validación para personas jurídicas (tercer dígito es 9) | ||
if (thirdDigit === 9) { | ||
return validateLegalEntityRUC(ruc); | ||
} | ||
|
||
// Validación para entidades públicas (tercer dígito es 6) | ||
if (thirdDigit === 6) { | ||
return validatePublicEntityRUC(ruc); | ||
} | ||
|
||
// Si el tercer dígito no es válido, el RUC es inválido | ||
return false; | ||
} | ||
|
||
// Función para validar RUC de personas jurídicas | ||
function validateLegalEntityRUC(ruc: string): boolean { | ||
// Coeficientes para personas jurídicas | ||
const coefficients = [4, 3, 2, 7, 6, 5, 4, 3, 2]; | ||
const baseCode = ruc.substring(0, 9); | ||
const validatorDigit = parseInt(ruc[9], 10); | ||
|
||
let sum = 0; | ||
for (let i = 0; i < coefficients.length; i++) { | ||
const value = parseInt(baseCode[i], 10) * coefficients[i]; | ||
sum += value; | ||
} | ||
|
||
const remainder = sum % 11; | ||
const result = remainder === 0 ? 0 : 11 - remainder; | ||
|
||
return result === validatorDigit; | ||
} | ||
|
||
// Función para validar RUC de entidades públicas | ||
function validatePublicEntityRUC(ruc: string): boolean { | ||
// Coeficientes para entidades públicas | ||
const coefficients = [3, 2, 7, 6, 5, 4, 3, 2]; | ||
const baseCode = ruc.substring(0, 8); | ||
const validatorDigit = parseInt(ruc[8], 10); | ||
|
||
let sum = 0; | ||
for (let i = 0; i < coefficients.length; i++) { | ||
const value = parseInt(baseCode[i], 10) * coefficients[i]; | ||
sum += value; | ||
} | ||
|
||
const remainder = sum % 11; | ||
const result = remainder === 0 ? 0 : 11 - remainder; | ||
|
||
return result === validatorDigit; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters