validator-ec
Version:
Colección de validadores de datos comunes en Ecuador desarrollada en TypeScript.
1 lines • 8.87 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/helpers/isDigits.ts","../src/lib/isCedula.ts","../src/lib/isRUC.ts","../src/lib/isZipCode.ts"],"sourcesContent":["import isCedula from \"./lib/isCedula\";\nimport { isRUC, isLegalEntityRUC } from \"./lib/isRUC\";\nimport isZipCode from \"./lib/isZipCode\";\n\nexport { isCedula, isRUC, isLegalEntityRUC, isZipCode };\n","/**\n * @param {string} value La cadena de texto a validar.\n * @returns {boolean} Devuelve `true si la cadena de texto contiene únicamente dígitos, de lo contrario devuelve `false`.\n */\nexport default function isDigits(value: string): boolean {\n return /^\\d+$/.test(value);\n}\n","import isDigits from \"../helpers/isDigits\";\n\n/**\n *\n * @param {string} cedula La cédula a validar.\n * @returns {boolean} Devuelve `true` si la cédula es válida, de lo contrario devuelve `false`.\n */\nexport default function isCedula(cedula: string): boolean {\n // Validamos que la cédula tenga 10 dígitos\n if (cedula.length !== 10) {\n return false;\n }\n\n // Verificamos que todos los caracteres sean dígitos\n if (!isDigits(cedula)) {\n return false;\n }\n\n // Definimos el último dígito o tambien llamado dígito verificador\n const lastDigit = parseInt(cedula[cedula.length - 1], 10);\n\n // Definimos las variables a utilizar\n let evens = 0;\n let odds = 0;\n let sum = 0;\n\n // Iteramos cada item excluyendo el último digito, aplicando el Algoritmo de Luhn\n for (let i = 1; i <= cedula.length - 1; i++) {\n if (i % 2 === 0) {\n evens += parseInt(cedula[i - 1]);\n } else {\n let x = parseInt(cedula[i - 1]) * 2;\n x > 9 ? (odds += x - 9) : (odds += x);\n }\n }\n\n sum += evens + odds;\n\n // Extraemos el primer digito de la suma\n const firstDigit = parseInt(sum.toString()[0], 10);\n\n // Obtenemos la decena\n const dozen = (firstDigit + 1) * 10;\n\n // Obtenemos el dígito validador\n let validatorDigit = dozen - sum;\n\n // Si el dígito verificador es mayor a 10 lo igualamos a 0\n if (validatorDigit >= 10) {\n validatorDigit = 0;\n }\n\n // Codigo de provincia\n // Validamos si la cedula pertenece a alguna provincia\n const provinceCode = parseInt(cedula[0] + cedula[1]);\n\n // Valida cédulas locales y de Ecuatorianos en el exterior\n if (provinceCode > 24 && provinceCode != 30) {\n return false;\n }\n\n // Si el dígito verificador es igual al último dígito de la cédula, la cédula es válida\n return validatorDigit === lastDigit;\n}\n","import isDigits from \"../helpers/isDigits\";\nimport isCedula from \"./isCedula\";\n\n/**\n * Valida un RUC ecuatoriano.\n *\n * @param {string} ruc El RUC a validar.\n * @returns {boolean} Devuelve `true` si el RUC es válido,\n * de lo contrario devuelve `false`.\n *\n * @remarks\n * De acuerdo a lo dispuesto por el Servicio de Rentas Internas (SRI) [1],\n * esta función **no aplica** el algoritmo de validación del módulo 11 para\n * RUCs de personas jurídicas (tercer dígito igual a 9).\n *\n * En caso de ser necesario, el SRI recomienda verificar la validez del RUC\n * a través de sus canales oficiales de consulta pública.\n *\n * [1] https://minka.gob.ec/mintel/ge/rutr/gobec_forms/uploads/1ef593d96275a7c07987c5bc043ce654/comunicado_cambio_generacion_RUC.pdf\n */\nexport function isRUC(ruc: string): boolean {\n // Verificamos que el RUC tenga 13 dígitos\n if (ruc.length !== 13) {\n return false;\n }\n\n // Verificamos que todos los caracteres sean dígitos\n if (!isDigits(ruc)) {\n return false;\n }\n\n // Extraemos los primeros 10 dígitos (cédula o código base)\n const baseCode = ruc.substring(0, 10);\n\n // Extraemos los últimos 3 dígitos (código de establecimiento)\n const establishmentCode = ruc.substring(10, 13);\n\n // Verificamos que el código de establecimiento sea 001\n if (establishmentCode !== \"001\") {\n return false;\n }\n\n // Obtenemos el tercer dígito para determinar el tipo de entidad\n // Fuente: https://www.sri.gob.ec/ruc-personas-naturales\n const thirdDigit = parseInt(ruc[2], 10);\n\n // Validación para personas naturales (tercer dígito entre 0 y 5)\n if (thirdDigit >= 0 && thirdDigit <= 5) {\n // Validamos que los primeros 10 dígitos sean una cédula válida\n return isCedula(baseCode);\n }\n\n // Validación para personas jurídicas (tercer dígito es 9)\n if (thirdDigit === 9) {\n return validateLegalEntityRUC(ruc);\n }\n\n // Validación para entidades públicas (tercer dígito es 6)\n if (thirdDigit === 6) {\n return validatePublicEntityRUC(ruc);\n }\n\n // Si el tercer dígito no es válido, el RUC es inválido\n return false;\n}\n\n// Función para validar RUC de personas jurídicas\nfunction validateLegalEntityRUC(ruc: string): boolean {\n // Se omite la validación del módulo 11 de acuerdo a lo dispuesto por el SRI\n return true;\n}\n\n// Función para validar RUC de entidades públicas\nfunction validatePublicEntityRUC(ruc: string): boolean {\n // Coeficientes para entidades públicas\n const coefficients = [3, 2, 7, 6, 5, 4, 3, 2];\n const baseCode = ruc.substring(0, 8);\n const validatorDigit = parseInt(ruc[8], 10);\n\n let sum = 0;\n for (let i = 0; i < coefficients.length; i++) {\n const value = parseInt(baseCode[i], 10) * coefficients[i];\n sum += value;\n }\n\n const remainder = sum % 11;\n const result = remainder === 0 ? 0 : 11 - remainder;\n\n return result === validatorDigit;\n}\n\n/**\n * Determina si un RUC pertenece a una persona jurídica (tercer dígito igual a 9).\n *\n * @param {string} ruc El RUC a comprobar.\n * @returns {boolean} Devuelve `true` si el RUC pertenece a una persona jurídica,\n * de lo contrario devuelve `false`.\n */\nexport function isLegalEntityRUC(ruc: string): boolean {\n return ruc.length === 13 && ruc[2] === \"9\";\n}\n","import isDigits from \"../helpers/isDigits\";\n\n/**\n * Valida un código postal ecuatoriano.\n *\n * @param {string} zipCode El código postal a validar.\n * @returns {boolean} Devuelve `true` si el código postal es válido, de lo contrario devuelve `false`.\n */\nexport default function isZipCode(zipCode: string): boolean {\n // Verificamos que el código postal tenga 6 dígitos\n if (zipCode.length !== 6) {\n return false;\n }\n\n // Verificamos que todos los caracteres sean dígitos\n if (!isDigits(zipCode)) {\n return false;\n }\n\n // Extraemos el código de provincia\n const provinceCode = parseInt(zipCode[0] + zipCode[1], 10);\n\n // Verificamos que el código de provincia sea válido\n if (provinceCode < 1 || provinceCode > 24) {\n return false;\n }\n\n return true;\n}\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,EAAA,qBAAAC,EAAA,UAAAC,EAAA,cAAAC,IAAA,eAAAC,EAAAN,GCIe,SAARO,EAA0BC,EAAwB,CACvD,MAAO,QAAQ,KAAKA,CAAK,CAC3B,CCCe,SAARC,EAA0BC,EAAyB,CAOxD,GALIA,EAAO,SAAW,IAKlB,CAACC,EAASD,CAAM,EAClB,MAAO,GAIT,IAAME,EAAY,SAASF,EAAOA,EAAO,OAAS,CAAC,EAAG,EAAE,EAGpDG,EAAQ,EACRC,EAAO,EACPC,EAAM,EAGV,QAASC,EAAI,EAAGA,GAAKN,EAAO,OAAS,EAAGM,IACtC,GAAIA,EAAI,IAAM,EACZH,GAAS,SAASH,EAAOM,EAAI,CAAC,CAAC,MAC1B,CACL,IAAIC,EAAI,SAASP,EAAOM,EAAI,CAAC,CAAC,EAAI,EAClCC,EAAI,EAAKH,GAAQG,EAAI,EAAMH,GAAQG,CACrC,CAGFF,GAAOF,EAAQC,EASf,IAAII,GANe,SAASH,EAAI,SAAS,EAAE,CAAC,EAAG,EAAE,EAGrB,GAAK,GAGJA,EAGzBG,GAAkB,KACpBA,EAAiB,GAKnB,IAAMC,EAAe,SAAST,EAAO,CAAC,EAAIA,EAAO,CAAC,CAAC,EAGnD,OAAIS,EAAe,IAAMA,GAAgB,GAChC,GAIFD,IAAmBN,CAC5B,CC3CO,SAASQ,EAAMC,EAAsB,CAO1C,GALIA,EAAI,SAAW,IAKf,CAACC,EAASD,CAAG,EACf,MAAO,GAIT,IAAME,EAAWF,EAAI,UAAU,EAAG,EAAE,EAMpC,GAH0BA,EAAI,UAAU,GAAI,EAAE,IAGpB,MACxB,MAAO,GAKT,IAAMG,EAAa,SAASH,EAAI,CAAC,EAAG,EAAE,EAGtC,OAAIG,GAAc,GAAKA,GAAc,EAE5BC,EAASF,CAAQ,EAItBC,IAAe,EACVE,EAAuBL,CAAG,EAI/BG,IAAe,EACVG,EAAwBN,CAAG,EAI7B,EACT,CAGA,SAASK,EAAuBL,EAAsB,CAEpD,MAAO,EACT,CAGA,SAASM,EAAwBN,EAAsB,CAErD,IAAMO,EAAe,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EACtCL,EAAWF,EAAI,UAAU,EAAG,CAAC,EAC7BQ,EAAiB,SAASR,EAAI,CAAC,EAAG,EAAE,EAEtCS,EAAM,EACV,QAASC,EAAI,EAAGA,EAAIH,EAAa,OAAQG,IAAK,CAC5C,IAAMC,EAAQ,SAAST,EAASQ,CAAC,EAAG,EAAE,EAAIH,EAAaG,CAAC,EACxDD,GAAOE,CACT,CAEA,IAAMC,EAAYH,EAAM,GAGxB,OAFeG,IAAc,EAAI,EAAI,GAAKA,KAExBJ,CACpB,CASO,SAASK,EAAiBb,EAAsB,CACrD,OAAOA,EAAI,SAAW,IAAMA,EAAI,CAAC,IAAM,GACzC,CC5Fe,SAARc,EAA2BC,EAA0B,CAO1D,GALIA,EAAQ,SAAW,GAKnB,CAACC,EAASD,CAAO,EACnB,MAAO,GAIT,IAAME,EAAe,SAASF,EAAQ,CAAC,EAAIA,EAAQ,CAAC,EAAG,EAAE,EAGzD,MAAI,EAAAE,EAAe,GAAKA,EAAe,GAKzC","names":["src_exports","__export","isCedula","isLegalEntityRUC","isRUC","isZipCode","__toCommonJS","isDigits","value","isCedula","cedula","isDigits","lastDigit","evens","odds","sum","i","x","validatorDigit","provinceCode","isRUC","ruc","isDigits","baseCode","thirdDigit","isCedula","validateLegalEntityRUC","validatePublicEntityRUC","coefficients","validatorDigit","sum","i","value","remainder","isLegalEntityRUC","isZipCode","zipCode","isDigits","provinceCode"]}