lib/cfita/codice_fiscale.rb in cfita-0.3.1 vs lib/cfita/codice_fiscale.rb in cfita-0.4.0
- old
+ new
@@ -44,16 +44,18 @@
end
def cf_sex
return @cf_sex if @cf_sex
case @fiscal_code[9]
+ when nil
when /[0-3LMNP]/
@cf_sex = 'M'
when /[4-7QRST]/
@cf_sex = 'F'
else
@errors << 'Cifra decina giorno di nascita errata'
+ nil
end
end
def cf_birth_places
return @cf_birth_places if @cf_birth_places
@@ -61,34 +63,34 @@
@cf_birth_places = CODICI_CATASTALI[codice_catastale]
end
def cf_birth_date
return @cf_birth_date if @cf_birth_date
+
yy = cifre(6..7)
day = cifre(9..10)
+ return unless yy && day
@errors << 'Cifra decina giorno di nascita errata' if day && day > 71
-
+
month = MESI.index(@fiscal_code[8])
@errors << 'Mese errato' unless month
return unless yy && month && day
@cf_birth_date = Date.new(yy2yyyy(yy), month + 1, day % 40) rescue nil
end
private
- def codice_catastale
+ def codice_catastale
return @codice_catastale if @codice_catastale
- letter = @fiscal_code[11]
- numbers =
- @fiscal_code[12..14]
- .split(//)
- .map do |c|
- i = OMOCODICI.index(c)
- i ? i.to_s : c
- end
- .join
+ return unless letter = @fiscal_code[11]
+ return unless numbers = @fiscal_code[12..14]
+
+ numbers = numbers.chars.map do |c|
+ i = OMOCODICI.index(c)
+ i ? i.to_s : c
+ end.join
letter + numbers
end
def parse
check_size
@@ -192,9 +194,11 @@
def cifre(range)
result = 0
range.each do |position|
char = @fiscal_code[position]
+ return nil unless char
+
value = CIFRE.index(char)
@errors << "Carattere '#{char}' errato in posizione #{position}" unless value
return nil unless value
result *= 10