Module: Siret
Overview
French SIRET numbers validation and generation as described here: fr.wikipedia.org/wiki/Système_d’identification_du_répertoire_des_établissements#Calcul_et_validit.C3.A9_d.27un_num.C3.A9ro_SIRET
Constant Summary collapse
- REGEXP =
/^\d{14}$/
- SIREN_PATTERN =
"%012d".freeze
- SIREN_MAX =
10 ** 11
Instance Method Summary collapse
- #checksum(siret) ⇒ Object
- #generate ⇒ Object
- #generate_nic(siren) ⇒ Object
- #generate_siren ⇒ Object
- #valid?(siret) ⇒ Boolean
Instance Method Details
#checksum(siret) ⇒ Object
10 11 12 13 14 15 16 |
# File 'lib/siret.rb', line 10 def checksum(siret) result = 0 digits(siret).each_slice(2) do |a, b| result += sum(digits(a * 2)) + b end result end |
#generate ⇒ Object
26 27 28 29 30 |
# File 'lib/siret.rb', line 26 def generate siren = generate_siren nic = generate_nic(siren) "#{siren}#{nic}" end |
#generate_nic(siren) ⇒ Object
36 37 38 39 40 41 |
# File 'lib/siret.rb', line 36 def generate_nic(siren) rest = 10 - checksum(siren) % 10 a = rest / 3 b = rest > 2 ? rest - 2 * a : rest "#{a}#{b}" end |
#generate_siren ⇒ Object
32 33 34 |
# File 'lib/siret.rb', line 32 def generate_siren SIREN_PATTERN % rand(SIREN_MAX) end |
#valid?(siret) ⇒ Boolean
18 19 20 21 22 23 24 |
# File 'lib/siret.rb', line 18 def valid?(siret) if siret.to_s =~ REGEXP (checksum(siret) % 10).zero? else false end end |