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.

This code block is no longer available. The original code is shown below.


    
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)