UNPKG

ec-dni-validator

Version:

A simple validator of Ecuadorian identity card numbers, also called "cédulas" or "RUC".

101 lines (100 loc) 2.51 kB
// lib/index.ts function isValidDNI(dni) { if (dni == null || dni === "") { return false; } if (typeof dni !== "string") { return false; } if (dni.length !== 10 && dni.length !== 13) { return false; } let sum = 0; let remainder = 0; let pri = false; let pub = false; let nat = false; const provinceDigits = 24; let mod = 11; const ok = dni.split("").every((char) => !isNaN(parseInt(char, 10))); if (!ok) { return false; } if (dni.length < 10) { return false; } const province = parseInt(dni.substr(0, 2), 10); if (province < 1 || province > provinceDigits) { return false; } const [d1, d2, d3, d4, d5, d6, d7, d8, d9, d10] = Array.from(dni).map((char) => parseInt(char, 10)); if (d3 == 7 || d3 == 8) { return false; } if (d3 < 6) { nat = true; const p1 = d1 * 2 >= 10 ? d1 * 2 - 9 : d1 * 2; const p2 = d2 * 1 >= 10 ? d2 * 1 - 9 : d2 * 1; const p3 = d3 * 2 >= 10 ? d3 * 2 - 9 : d3 * 2; const p4 = d4 * 1 >= 10 ? d4 * 1 - 9 : d4 * 1; const p5 = d5 * 2 >= 10 ? d5 * 2 - 9 : d5 * 2; const p6 = d6 * 1 >= 10 ? d6 * 1 - 9 : d6 * 1; const p7 = d7 * 2 >= 10 ? d7 * 2 - 9 : d7 * 2; const p8 = d8 * 1 >= 10 ? d8 * 1 - 9 : d8 * 1; const p9 = d9 * 2 >= 10 ? d9 * 2 - 9 : d9 * 2; mod = 10; sum = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9; } else if (d3 == 6) { pub = true; const p1 = d1 * 3; const p2 = d2 * 2; const p3 = d3 * 7; const p4 = d4 * 6; const p5 = d5 * 5; const p6 = d6 * 4; const p7 = d7 * 3; const p8 = d8 * 2; const p9 = 0; sum = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9; } else if (d3 == 9) { pri = true; const p1 = d1 * 4; const p2 = d2 * 3; const p3 = d3 * 2; const p4 = d4 * 7; const p5 = d5 * 6; const p6 = d6 * 5; const p7 = d7 * 4; const p8 = d8 * 3; const p9 = d9 * 2; sum = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9; } remainder = sum % mod; const vd = remainder === 0 ? 0 : mod - remainder; if (pub === true) { if (vd != d9) { return false; } if (dni.substr(9, 4) !== "0001") { return false; } } else if (pri === true) { if (vd != d10) { return false; } if (dni.substr(10, 3) !== "001") { return false; } } else if (nat === true) { if (vd != d10) { return false; } if (dni.length > 10 && dni.substr(10, 3) !== "001") { return false; } } return true; } export { isValidDNI };