diff --git a/doc/default/id_number.md b/doc/default/id_number.md index 7280a3bb76..a5ba5298bf 100644 --- a/doc/default/id_number.md +++ b/doc/default/id_number.md @@ -34,4 +34,9 @@ Faker::IDNumber.brazilian_id(formatted: true) #=> "49.305.402-9" # Generate a Chilean ID (Rut with 8 digits) # For more advanced cases, please refer to Faker::ChileRut Faker::IDNumber.chilean_id #=> "15620613-K" + +# Generate a Croatian ID number (OIB) +# Keyword arguments: international +Faker::IDNumber.croatian_id #=> "88467617508" +Faker::IDNumber.croatian_id(international: true) #=> "HR88467617508" ``` diff --git a/lib/faker/default/id_number.rb b/lib/faker/default/id_number.rb index 3522177a1e..cd8e2847a7 100644 --- a/lib/faker/default/id_number.rb +++ b/lib/faker/default/id_number.rb @@ -200,8 +200,42 @@ def chilean_id "#{digits}-#{verification_code}" end + ## + # Produces a random Croatian ID number (OIB). + # + # @param international [Boolean] Specifies whether to add international prefix. + # @return [String] + # + # @example + # Faker::IDNumber.croatian_id #=> "88467617508" + # Faker::IDNumber.croatian_id(international: true) #=> "HR88467617508" + # + # @faker.version next + def croatian_id(international: false) + prefix = international ? 'HR' : '' + digits = Faker::Number.number(digits: 10).to_s + checksum_digit = croatian_id_checksum_digit(digits) + + "#{prefix}#{digits}#{checksum_digit}" + end + private + def croatian_id_checksum_digit(digits) + control_sum = 10 + + digits.chars.map(&:to_i).each do |digit| + control_sum += digit + control_sum %= 10 + control_sum = 10 if control_sum.zero? + control_sum *= 2 + control_sum %= 11 + end + + control_sum = 11 - control_sum + control_sum % 10 + end + def chilean_verification_code(digits) # First digit is multiplied by 3, second by 2, and so on multiplication_rule = [3, 2, 7, 6, 5, 4, 3, 2] diff --git a/test/faker/default/test_faker_id_number.rb b/test/faker/default/test_faker_id_number.rb index 7c27f1ea4c..2df7fbb3f4 100644 --- a/test/faker/default/test_faker_id_number.rb +++ b/test/faker/default/test_faker_id_number.rb @@ -160,6 +160,22 @@ def test_chilean_verification_code_0 assert_equal verification_code, 0 end + def test_croatian_id + sample = @tester.croatian_id + assert_match(/^\d{11}$/, sample) + end + + def test_croatian_id_international + sample = @tester.croatian_id(international: true) + assert_match(/^HR\d{11}$/, sample) + end + + def test_croatian_id_checksum_digit + digits = '8764670153' + checksum_digit = Faker::IDNumber.send(:croatian_id_checksum_digit, digits) + assert_equal checksum_digit, 5 + end + private def south_african_id_number_to_date_of_birth_string(sample)