Module: Siret

Extended by:
Siret
Included in:
Siret
Defined in:
lib/siret.rb

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

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

#generateObject



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_sirenObject



32
33
34
# File 'lib/siret.rb', line 32

def generate_siren
  SIREN_PATTERN % rand(SIREN_MAX)
end

#valid?(siret) ⇒ Boolean

Returns:

  • (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