DEV Community

Cover image for How to validate BSN, PGN & OWN in the Netherlands with TypeScript/JavaScript
Dev By RayRay
Dev By RayRay

Posted on • Originally published at hasnode.byrayray.dev on

How to validate BSN, PGN & OWN in the Netherlands with TypeScript/JavaScript

The BSN, PGN and OWN in the Netherlands can be validated with a 11 proef (elf proef). In this post I show you the JavaScript and TypeScript code.

In the Netherlands, we have a few identification numbers from the government. In this example, you can create a function to validate both of them based on the specification.

  • BSN = Burgerservice nummer
  • PGN = Burgerservice nummer in schools where the student doesn't have a BSN. The PGN is also called OWN.

divider-byrayray.png

How to use the code?

Define the function in your code and call it like this:

TypeScript example

// PGN/OWN
elfProefValidation('114435231', ElfproefType.own); // returns true;
elfProefValidation('34564366349', ElfproefType.own); // returns false;
// BSN
elfProefValidation('232262536', ElfproefType.bsn); // returns true;
elfProefValidation('247594057', ElfproefType.bsn); // returns false;
Enter fullscreen mode Exit fullscreen mode

JavaScript example

// PGN/OWN
elfProefValidation('114435231', 'own'); // returns true;
elfProefValidation('34564366349', 'own')); // returns false;
// BSN
elfProefValidation('232262536', 'bsn')); // returns true;
elfProefValidation('247594057', 'bsn')); // returns false;

Enter fullscreen mode Exit fullscreen mode

Working version

I created a working version on RunKit . Make sure you select Node version 17.

function elfProefValidation(value, type) { let returnValue = false; if (!value || value.length === 0) { // This is to prevent behaviour that looks like the OWN is required return true; } if (value === '00000000000' || value.length !== 9) { return false; } const values = value.split(''); const lastCharacter = parseInt(values[values.length - 1], 10); const [a, b, c, d, e, f, g, h, i] = values.map((char) => parseInt(char, 10)); let result = 0; if (type === 'bsn') { result = 9 * a + 8 * b + 7 * c + 6 * d + 5 * e + 4 * f + 3 * g + 2 * h + -1 * i; returnValue = result > 0 && result % 11 === 0; } else if (type === 'own') { result = 9 * a + 8 * b + 7 * c + 6 * d + 5 * e + 4 * f + 3 * g + 2 * h; returnValue = result > 0 && result % 11 === lastCharacter + 5; } else { returnValue = false; } return returnValue; } const bsn = '010464554'; const own = '101211151'; console.log('BSN: ', elfProefValidation(bsn, 'bsn')); console.log('OWN: ', elfProefValidation(own, 'own'));

Code

divider-byrayray.png

Thanks!

hashnode-footer.pngI hope you learned something new or are inspired to create something new after reading this story! ๐Ÿค— If so, consider subscribing via email (scroll to the top of this page) or follow me here on Hashnode.

Did you know that you can create a Developer blog like this one, yourself? It's entirely for free. ๐Ÿ‘๐Ÿ’ฐ๐ŸŽ‰๐Ÿฅณ๐Ÿ”ฅ

If I left you with questions or something to say as a response, scroll down and type me a message. Please send me a DM on Twitter @DevByRayRay when you want to keep it private. My DM's are always open ๐Ÿ˜

Top comments (0)