diff --git a/src/ar/cbu.spec.ts b/src/ar/cbu.spec.ts index 37458070..1e94f09f 100644 --- a/src/ar/cbu.spec.ts +++ b/src/ar/cbu.spec.ts @@ -25,4 +25,25 @@ describe('ar/cbu', () => { expect(result.error).toBeInstanceOf(InvalidChecksum); }); + + // Regression: a check digit of 0 must be accepted. `10 - weightedSum(...)` yields + // 10 (not 0) when the weighted sum is 0, so without the `% 10` wrap these valid + // numbers were wrongly rejected as InvalidChecksum. + it('validate:0720429088000002339140', () => { + const result = validate('0720429088000002339140'); + + expect(result.isValid && result.compact).toEqual('0720429088000002339140'); + }); + + it('validate:0000000000000000000000', () => { + const result = validate('0000000000000000000000'); + + expect(result.isValid && result.compact).toEqual('0000000000000000000000'); + }); + + it('validate:0720429088000002339141', () => { + const result = validate('0720429088000002339141'); + + expect(result.error).toBeInstanceOf(InvalidChecksum); + }); }); diff --git a/src/ar/cbu.ts b/src/ar/cbu.ts index 6e3a7c22..6deb225d 100644 --- a/src/ar/cbu.ts +++ b/src/ar/cbu.ts @@ -63,20 +63,22 @@ const impl: Validator = { const [front, c1, back, c2] = strings.splitAt(value, 7, 8, 21); const s1 = String( - 10 - + (10 - weightedSum(front, { reverse: true, weights: [3, 1, 7, 9, 3, 1, 7], modulus: 10, - }), + })) % + 10, ); const s2 = String( - 10 - + (10 - weightedSum(back, { reverse: true, weights: [3, 1, 7, 9, 3, 1, 7, 9, 3, 1, 7, 9, 3, 1], modulus: 10, - }), + })) % + 10, ); if (s1 !== c1 || s2 !== c2) {