diff --git a/lib/census_api.rb b/lib/census_api.rb index 19381c16a..559a6388e 100644 --- a/lib/census_api.rb +++ b/lib/census_api.rb @@ -15,36 +15,13 @@ class CensusApi variants = [] if is_dni?(document_type) - # If a letter exists at the end, delete it and put it on the letter var - letter = document_number.last - if letter[/[A-Za-z]/] == letter - document_number = document_number[0..-2] - else - letter = nil - end + document_number, letter = split_letter_from(document_number) + number_variants = get_number_variants_with_leading_zeroes_from(document_number) + letter_variants = get_letter_variants(number_variants, letter) - document_number = document_number.last(8) # Keep only the last x digits - document_number = document_number.gsub(/^0+/, '') # Removes leading zeros - - # if the number has less digits than it should, pad with zeros to the left and add each variant to the list - # For example, if the initial document_number is 1234, possible numbers should have - # [1234, 01234, 001234, 0001234] - possible_numbers = [] - possible_numbers << document_number unless document_number.blank? - while document_number.size < 8 - document_number = "0#{document_number}" - possible_numbers << document_number - end - - variants += possible_numbers - - # if a letter was given, try the numbers followed by the letter in upper and lowercase - if letter.present? then - possible_numbers.each do |number| - variants << number + letter.downcase << number + letter.upcase - end - end - else # not a DNI + variants += number_variants + variants += letter_variants + else # if not a DNI, just use the document_number, with no variants variants << document_number end @@ -111,4 +88,43 @@ class CensusApi def is_dni?(document_type) document_type.to_s == "1" end + + def split_letter_from(document_number) + letter = document_number.last + if letter[/[A-Za-z]/] == letter + document_number = document_number[0..-2] + else + letter = nil + end + return document_number, letter + end + + # if the number has less digits than it should, pad with zeros to the left and add each variant to the list + # For example, if the initial document_number is 1234, and digits=8, the result is + # ['1234', '01234', '001234', '0001234'] + def get_number_variants_with_leading_zeroes_from(document_number, digits=8) + document_number = document_number.to_s.last(digits) # Keep only the last x digits + document_number = document_number.gsub(/^0+/, '') # Removes leading zeros + + variants = [] + variants << document_number unless document_number.blank? + while document_number.size < digits + document_number = "0#{document_number}" + variants << document_number + end + variants + end + + # Generates uppercase and lowercase variants of a series of numbers, if the letter is present + # If number_variants == ['1234', '01234'] & letter == 'A', the result is + # ['1234a', '1234A', '01234a', '01234A'] + def get_letter_variants(number_variants, letter) + variants = [] + if letter.present? then + number_variants.each do |number| + variants << number + letter.downcase << number + letter.upcase + end + end + variants + end end