module Vss

French VAT / SIRET / SIREN numbers validation and generation as described here: fr.wikipedia.org/wiki/Syst%C3%A8me_d%27identification_du_r%C3%A9pertoire_des_%C3%A9tablissements#Calcul_et_validit.C3.A9_d.27un_num.C3.A9ro_SIRET

Constants

REGEXPS
VERSION

Public Class Methods

format_siren(siren) click to toggle source
# File lib/vss.rb, line 62
def self.format_siren(siren)
  return unless siren?(siren)

  siren.gsub(REGEXPS[:formatSIREN], '\1 ')
end
format_siret(siret) click to toggle source
# File lib/vss.rb, line 68
def self.format_siret(siret)
  return unless siret?(siret)

  siret.gsub(REGEXPS[:formatSIRET], '\1 \2 \3 \4')
end
format_vat(vat) click to toggle source
# File lib/vss.rb, line 74
def self.format_vat(vat)
  return unless vat?(vat)

  vat.gsub(REGEXPS[:formatVAT], '\1 \2 \3 \4 \5')
end
generate_siren() click to toggle source
# File lib/vss.rb, line 50
def self.generate_siren
  complete_for_luhn_checksum(generate_digits(7))
end
generate_siret() click to toggle source
# File lib/vss.rb, line 54
def self.generate_siret
  complete_for_luhn_checksum(generate_digits(12))
end
generate_vat() click to toggle source
# File lib/vss.rb, line 58
def self.generate_vat
  to_vat(generate_siren)
end
siren?(siren) click to toggle source

Return TRUE if the SIREN is valid

# File lib/vss.rb, line 16
def self.siren?(siren)
  siren.is_a?(String) && match?(REGEXPS[:SIREN], siren) && luhn_valid?(siren)
end
siret?(siret) click to toggle source

Return TRUE if the SIRET is valid

# File lib/vss.rb, line 21
def self.siret?(siret)
  siret.is_a?(String) && match?(REGEXPS[:SIRET], siret) && luhn_valid?(siret)
end
to_siren(string) click to toggle source

Convert a SIREN / SIRET / VAT to a SIREN

# File lib/vss.rb, line 31
def self.to_siren(string)
  return string if siren?(string)
  return string[0..8] if siret?(string)
  return string[4..-1] if vat?(string)

  nil
end
to_vat(string) click to toggle source

Convert a SIREN / SIRET / VAT to a VAT

# File lib/vss.rb, line 40
def self.to_vat(string)
  return string if vat?(string)

  siren = siret?(string) ? to_siren(string) : string
  return unless siren?(siren)

  key = vat_key(siren)
  "FR#{format('%02d', key)}#{siren}"
end
vat?(vat) click to toggle source

Return TRUE if the VAT is valid

# File lib/vss.rb, line 26
def self.vat?(vat)
  vat.is_a?(String) && match?(REGEXPS[:VAT], vat) && valid_vat?(vat)
end

Private Class Methods

complete_for_luhn_checksum(string) click to toggle source
# File lib/vss.rb, line 119
def self.complete_for_luhn_checksum(string)
  rest = 10 - luhn_checksum(string) % 10
  a = rest / 3
  b = rest > 2 ? rest - 2 * a : rest
  "#{string}#{a}#{b}"
end
generate_digits(length) click to toggle source
# File lib/vss.rb, line 115
def self.generate_digits(length)
  format("%0#{length}d", rand(10**(length - 1)))
end