From 2214795474892d23384918d6bde4a3e09b107b82 Mon Sep 17 00:00:00 2001 From: Jorge Vargas Date: Wed, 1 Oct 2025 09:34:05 -0500 Subject: [PATCH 1/2] feat: add validation vat for Colombian nit --- src/lib/isVAT.js | 20 ++++++++++++++++++-- test/validators.test.js | 5 +++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/lib/isVAT.js b/src/lib/isVAT.js index 1ec2c5991..124f2a53f 100644 --- a/src/lib/isVAT.js +++ b/src/lib/isVAT.js @@ -1,5 +1,5 @@ -import assertString from './util/assertString'; import * as algorithms from './util/algorithms'; +import assertString from './util/assertString'; const AU = (str) => { const match = str.match(/^(AU)?(\d{11})$/); @@ -17,6 +17,22 @@ const AU = (str) => { return (total !== 0 && total % 89 === 0); }; +const CO = (str) => { + // @see {@link https://es.wikipedia.org/wiki/N%C3%BAmero_de_Identificaci%C3%B3n_Tributaria_(Colombia)} + const hasValidCheckNumber = (digits) => { + const weights = [41, 37, 29, 23, 19, 17, 13, 7, 3]; + const lastDigit = digits.pop(); // used as check number + + const mod = digits.reduce((acc, el, idx) => acc + (el * weights[idx]), 0) % 11; + + const calculatedCheckNumber = mod < 2 ? mod : 11 - mod; + + return calculatedCheckNumber === lastDigit; + }; + + return /^(CO)?\d{10}$/.test(str) && hasValidCheckNumber((str.match(/\d/g).map(el => +el))); +}; + const CH = (str) => { // @see {@link https://www.ech.ch/de/ech/ech-0097/5.2.0} const hasValidCheckNumber = (digits) => { @@ -113,7 +129,7 @@ export const vatMatchers = { BO: str => /^(BO)?\d{7}$/.test(str), BR: str => /^(BR)?((\d{2}.\d{3}.\d{3}\/\d{4}-\d{2})|(\d{3}.\d{3}.\d{3}-\d{2}))$/.test(str), CL: str => /^(CL)?\d{8}-\d{1}$/.test(str), - CO: str => /^(CO)?\d{10}$/.test(str), + CO, CR: str => /^(CR)?\d{9,12}$/.test(str), EC: str => /^(EC)?\d{13}$/.test(str), SV: str => /^(SV)?\d{4}-\d{6}-\d{3}-\d{1}$/.test(str), diff --git a/test/validators.test.js b/test/validators.test.js index 12c5fc2ab..462e877dd 100644 --- a/test/validators.test.js +++ b/test/validators.test.js @@ -15678,8 +15678,9 @@ describe('Validators', () => { validator: 'isVAT', args: ['CO'], valid: [ - 'CO1234567890', - '1234567890', + 'CO1234567896', + '1234567896', + '8001972684', // e.g. DIAN NIT 800.197.268-4 ], invalid: [ 'CO 1234567890', From ae9b1313182bc3015a8fef199a51cbb4c9bf4427 Mon Sep 17 00:00:00 2001 From: Jorge Vargas Date: Wed, 1 Oct 2025 09:37:01 -0500 Subject: [PATCH 2/2] revert: sorted imports --- src/lib/isVAT.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/isVAT.js b/src/lib/isVAT.js index 124f2a53f..3426589a5 100644 --- a/src/lib/isVAT.js +++ b/src/lib/isVAT.js @@ -1,5 +1,5 @@ -import * as algorithms from './util/algorithms'; import assertString from './util/assertString'; +import * as algorithms from './util/algorithms'; const AU = (str) => { const match = str.match(/^(AU)?(\d{11})$/);