Generowanie numeru NIP

Wątek zablokowany 2016-02-26 02:30 przez flowCRANE .

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
0

Mam w Ruby generator NIP, który wygląda tak (sekwencja dla FactoryGirl):

Kopiuj
  sequence :nip do |n|
    srand(n)
    sum = 10
    nip = []
    while sum == 10
      nip = Array.new(9) { rand(10) }
      sum = nip.zip([6, 5, 7, 2, 3, 4, 5, 6, 7]).map{|a| a.inject(&:*)}.inject(&:+) % 11
    end
    (nip << sum).join
  end

Jednak nie zawsze zwraca mi to poprawny numer, dlaczego? Co jest tutaj źle?

Funkcja sprawdzająca wygląda tak:

Kopiuj
    def nip_valid?(nip)
      if nip =~ /^\d{10}$/
        nums = nip.split(//).map(&:to_i)
        check = nums.pop
        sum = nums.zip([6, 5, 7, 2, 3, 4, 5, 6, 7]).map{|a| a.inject(&:*)}.inject(&:+)
        return sum % 11 == check
      else
        false
      end
    end

// EDIT: trochę poprawiłem

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6822
0

Z tego co mnie pamięć nie myli trzy pierwsze cyfry w NIP są z zakresu 111-998 z pominięciem liczb zawierających 0 na którejkolwiek pozycji. W takim wypadku algorytm dla niektórych NIPów może się sypać np. zwracana jest liczba mająca mniej cyfr niż trzeba (i dlatego kochamy dynamiczne typowanie). Do tego może dojść jeszcze przypadek gdzie mod 11 zwróci 10. Wtedy numer też będzie nieprawidłowy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.