diff --git a/readme.md b/readme.md index 6e75ce771b..f4d9fcb00a 100644 --- a/readme.md +++ b/readme.md @@ -1276,6 +1276,14 @@ echo $faker->vat; // "NL123456789B01" - Dutch Value Added Tax number echo $faker->btw; // "NL123456789B01" - Dutch Value Added Tax number (alias) ``` +### `Faker\Provider\nl_NL\Person` + +```php +idNumber; // "111222333" - Dutch Personal identification number (BSN) +``` + ### `Faker\Provider\no_NO\Payment` ```php diff --git a/src/Faker/Provider/nl_NL/Person.php b/src/Faker/Provider/nl_NL/Person.php index 075628d5fe..0bd09a44e4 100644 --- a/src/Faker/Provider/nl_NL/Person.php +++ b/src/Faker/Provider/nl_NL/Person.php @@ -314,4 +314,37 @@ public static function prefix() { return static::randomElement(static::$prefix); } + + /** + * @link https://nl.wikipedia.org/wiki/Burgerservicenummer#11-proef + * + * @return string + */ + public function idNumber() + { + $return = ''; + $nr = array(); + $nr[] = 0; + while (count($nr) < 8) { + $nr[] = static::randomDigit(); + } + $nr[] = mt_rand(0, 6); + if ($nr[7] == 0 && $nr[8] == 0) { + $nr[7] = 0; + } + + $bsn = (9 * $nr[8]) + (8 * $nr[7]) + (7 * $nr[6]) + (6 * $nr[5]) + (5 * $nr[4]) + (4 * $nr[3]) + (3 * $nr[2]) + (2 * $nr[1]); + $nr[0] = floor($bsn - floor($bsn / 11) * 11); + if ($nr[0] > 9) { + if ($nr[1] > 0) { + $nr[0] = 8; + $nr[1]--; + } else { + $nr[0] = 1; + $nr[1]++; + + } + } + return implode('', array_reverse($nr)); + } } diff --git a/test/Faker/Provider/nl_NL/PersonTest.php b/test/Faker/Provider/nl_NL/PersonTest.php new file mode 100644 index 0000000000..971fa78ad8 --- /dev/null +++ b/test/Faker/Provider/nl_NL/PersonTest.php @@ -0,0 +1,32 @@ +addProvider(new Person($faker)); + $this->faker = $faker; + } + + public function testGenerateValidIdNumber() + { + $idNumber = $this->faker->idNumber(); + $this->assertEquals(9, strlen($idNumber)); + + + $sum = -1 * $idNumber % 10; + for ($multiplier = 2; $idNumber > 0; $multiplier++) { + $val = ($idNumber /= 10) % 10; + $sum += $multiplier * $val; + } + $this->assertTrue($sum != 0 && $sum % 11 == 0); + } +}