diff --git a/lib/faker/default/company.rb b/lib/faker/default/company.rb index e694f9802f..57d649c624 100644 --- a/lib/faker/default/company.rb +++ b/lib/faker/default/company.rb @@ -504,8 +504,9 @@ def indian_gst_number(state_code: nil) gen.letter(name: :z_char, length: 1, ranges: [['Z']]) - gen.computed(deps: %i[state_code_param taxpayer_number registration_number]) do |state_code_param, taxpayer_number, registration_number| - gst_base = "#{state_code_param}#{taxpayer_number}#{registration_number}" + # The check character covers all 14 preceding characters, including the "Z" + gen.computed(deps: %i[state_code_param taxpayer_number registration_number z_char]) do |state_code_param, taxpayer_number, registration_number, z_char| + gst_base = "#{state_code_param}#{taxpayer_number}#{registration_number}#{z_char}" chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars values = gst_base.chars sum = values.map.with_index do |char, index| diff --git a/test/faker/default/test_faker_company.rb b/test/faker/default/test_faker_company.rb index a6e1a6846e..75ee22de0d 100644 --- a/test/faker/default/test_faker_company.rb +++ b/test/faker/default/test_faker_company.rb @@ -254,6 +254,20 @@ def text_indian_gst_number assert_match(/^([0-2][0-9]|3[0-7])[A-Z]{3}[ABCFGHLJPTK][A-Z]\d{4}[A-Z][A-Z0-9]Z[A-Z0-9]$/i, @tester.indian_gst_number) end + def test_indian_gst_number_check_character + chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars + + 10.times do + gst = @tester.indian_gst_number + sum = gst[0, 14].chars.each_with_index.sum do |char, index| + product = chars.index(char) * (index.odd? ? 2 : 1) + (product / 36) + (product % 36) + end + + assert_equal chars[(36 - (sum % 36)) % 36], gst[14], gst + end + end + def test_state_code_in_indian_gst_number assert_raise ArgumentError do @tester.indian_gst_number(state_code: '01')