22 lines
542 B
Ruby
22 lines
542 B
Ruby
|
class SiretFormatValidator < ActiveModel::EachValidator
|
||
|
def validate_each(record,attribute,value)
|
||
|
unless value =~ /^\d{14}$/
|
||
|
record.errors.add(attribute, :format)
|
||
|
end
|
||
|
unless value!= nil && (luhn_checksum(value) % 10 == 0)
|
||
|
record.errors.add(attribute, :checksum)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def luhn_checksum(value)
|
||
|
accum = 0
|
||
|
value.reverse.each_char.map(&:to_i).each_with_index do |digit, index|
|
||
|
t = index.even? ? digit : digit * 2
|
||
|
t = t - 9 if t >= 10
|
||
|
accum += t
|
||
|
end
|
||
|
accum
|
||
|
end
|
||
|
end
|