diff --git a/Gemfile.lock b/Gemfile.lock index a75e13a171..f18a114ba5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -70,6 +70,7 @@ GEM PLATFORMS arm64-darwin-22 + arm64-darwin-24 x86_64-linux DEPENDENCIES diff --git a/doc/default/id_number.md b/doc/default/id_number.md index 89216c0279..560833af6f 100644 --- a/doc/default/id_number.md +++ b/doc/default/id_number.md @@ -47,6 +47,9 @@ Faker::IdNumber.danish_id_number(formatted: true) #=> "050390-9980" Faker::IdNumber.danish_id_number(birthday: Date.new(1990, 3, 5)) #=> "050390-9980" Faker::IdNumber.danish_id_number(gender: :female) #=> "050390-9980" +# Generate a Dutch ID number (BSN) +Faker::IdNumber.dutch_bsn # => "365371960" + # Generate a valid French Social Security number (INSEE number) Faker::IdNumber.french_insee_number #=> "22510589696868" ``` diff --git a/lib/faker/default/id_number.rb b/lib/faker/default/id_number.rb index 6fc2248f01..7437d03f21 100644 --- a/lib/faker/default/id_number.rb +++ b/lib/faker/default/id_number.rb @@ -269,6 +269,21 @@ def danish_id_number(formatted: false, birthday: Faker::Date.birthday, gender: n ].join end + ## + # Produces a random Dutch social security number (Burger Service Nummer). + # + # @return [String] + # + # @example + # Faker::IdNumber.dutch_bsn #=> "697116694" + # + # @faker.version next + def dutch_bsn + bsn = Faker::Number.numerify('#########') until valid_dutch_bsn?(bsn) + + bsn + end + ## # Produces a random French social security number (INSEE number). # @@ -416,6 +431,20 @@ def danish_control_digits(birthday) end end + def valid_dutch_bsn?(bsn) + # If it's not numeric, or not 8 or 9 digits long, it can never be a valid Dutch BSN. + return false unless /^\d{8,9}$/.match?(bsn) + + # It must match the BSN-variant of the "Elf Proef" (see https://nl.wikipedia.org/wiki/Elfproef#Burgerservicenummer ) + sum = 0 + length = bsn.length + bsn.chars.each_with_index do |c, i| + sum += c.to_i * (i == length - 1 ? -1 : length - i) + end + + (sum % 11).zero? + end + def _translate(key) parse("id_number.#{key}") end diff --git a/test/faker/default/test_faker_id_number.rb b/test/faker/default/test_faker_id_number.rb index 12ceff83c7..ae8d764711 100644 --- a/test/faker/default/test_faker_id_number.rb +++ b/test/faker/default/test_faker_id_number.rb @@ -274,6 +274,12 @@ def test_danish_id_number_invalid_gender end end + def test_dutch_bsn + sample = @tester.dutch_bsn + + assert_dutch_bsn sample + end + private def south_african_id_number_to_date_of_birth_string(sample) @@ -287,4 +293,10 @@ def assert_valid_south_african_id_number(sample) assert_equal Faker::IdNumber::ZA_RACE_DIGIT, sample[11] assert Date.parse(south_african_id_number_to_date_of_birth_string(sample)) end + + def assert_dutch_bsn(sample) + assert_equal 9, sample.length + assert_kind_of String, sample + refute_nil Integer(sample) + end end