Class: ActiveModel::Validations::CnpValidator
- Inherits:
-
EachValidator
- Object
- EachValidator
- ActiveModel::Validations::CnpValidator
- Includes:
- EmptyBlankEachValidator
- Defined in:
- lib/active_model/validations/cnp_validator.rb
Constant Summary collapse
- TEST_KEY =
'279146358279'.each_char.map(&:to_i)
Instance Method Summary collapse
-
#valid?(cnp) ⇒ Boolean
Algoritm de validare CNP Pas preliminar: Se testeaza daca codul respecta formatul unui cod CNP.
Methods included from EmptyBlankEachValidator
Instance Method Details
#valid?(cnp) ⇒ Boolean
Algoritm de validare CNP Pas preliminar: Se testeaza daca codul respecta formatul unui cod CNP. Adica prima cifra sa fie cuprinsa in intervalul 1 - 6 sau sa fie 9 pentru straini. Urmatoarele sase cifre trebuie sa constituie o data calendaristica valida in formatul AALLZZ.
Pas 1: Se foloseste cheia de testare “279146358279”. Primele douasprezece cifre se inmultesc pe rand de la stanga spre dreapta cu cifra corespunzatoare din cheia de testare.
Pas 2: Cele douasprezece produse obtinute se aduna si suma obtinuta se imparte la 11.
* Daca restul impartirii la 11 este mai mic ca 10, atunci acesta va reprezenta cifra de control.
* Daca restul impartirii este 10 atunci cifra de control este 1.
Restul impartirii reprezinta cifra de control. Pentru un CNP valid acest rest va trebui sa coincida cu cifra de pe pozitia treisprezece din CNP-ul initial.
22 23 24 25 26 27 |
# File 'lib/active_model/validations/cnp_validator.rb', line 22 def valid?(cnp) return false unless well_formed?(cnp) && valid_birthdate?(cnp) control = (0..11).reduce(0) { |a, e| a + TEST_KEY[e] * cnp[e].chr.to_i } % 11 control = 1 if control == 10 control == cnp[12].chr.to_i end |