Source code for dk.identifiers.kid

# -*- coding: utf-8 -*-

u"""Strukturen på våre kid-nummer:
    sensornr = '0123' # fire siffer
    kandidatnr = '01234' # fem siffer

    kiddata = sensornr + kandidatnr
    kid = kiddata + kontroll_10(kiddata)
"""

# pylint:disable=W0141


# FIXME: this so does not belong here..!
[docs]def generate_kids(sensornr, count, start=0): """Generate ``count`` kid numbers for sensor with ``sensornr`` (prefix), starting at ``start`` (for the counting part of the kid). """ while count > 0: data = str(sensornr) + ('%05d' % start) start += 1 yield (data + kontroll_10(data)) count -= 1
# FIXME: this so does not belong here..!
[docs]def create_kids(tctr, sequencenum): "BFP-8" tctrtype, tctrnum = tctr.split('-', 1) res = '1' if tctrtype.lower() == 'nt' else '2' res += '%04d' % int(tctrnum) res += '%08d' % sequencenum c1 = kontroll_10(res) res = res[:7] + c1 + res[7:] res += kontroll_10(res) return res
# XXX: this may belong in dkmath/ctrlnum, but is probably higher level..
[docs]def is_valid_kid(s): """Test if s is a valid kid number. """ if s is None: return True if type(s) not in (str, unicode): return False if len(s) != 10: return False try: n = int(s) data, kontroll = divmod(n, 10) return kontroll_10(str(data)) == str(kontroll) except: return False
# FIXME: this should move to dkmath/ctrlnum.py
[docs]def vekt(n, base): """Funksjon som gir en repeterende serie med siffer fra ``base``, som har lengde ``n``. For kontroll_10 er vekttall-serien: 2,1,2,1,2,1... for kontroll_11 er vekttall-serien: 2,3,4,5,6,7,2,3,4,5,... """ for i in range(n): yield base[i % len(base)]
# FIXME: this should move to dkmath/ctrlnum.py
[docs]def kontroll_10(s): u"""MOD10 algoritmen. MOD10 er forkortelse for Modulus 10 algoritmen, også kalt Luhn-algoritmen etter oppfinneren Hans Peter Luhn. Modulus 10 algoritmen benyttes bl.a. som beregningsmetode for et kontrollsiffer i KID-numre på bankenes innbetalingsblanketter. (http://no.wikipedia.org/wiki/MOD10) """ siffer = map(int, list(s))[::-1] # reversed vekttall = vekt(len(siffer), [2, 1]) produkter = ''.join(str(s * v) for (s, v) in zip(siffer, vekttall)) siffersum = sum(int(c) for c in produkter) entallsiffer = siffersum % 10 if entallsiffer == 0: kontrollsiffer = entallsiffer else: kontrollsiffer = 10 - entallsiffer return str(kontrollsiffer)
# FIXME: this should move to dkmath/ctrlnum.py
[docs]def kontroll_11(s): u"""MOD11 algoritmen. MOD11 er forkortelse for Modulus11. Modulus11 benyttes blant annet som beregningsmetode for et kontrollsiffer i kontonumre i norske banker, organisasjonsnummer og for det siste sifferet i norske fødselsnummer. (Norske fødselsnummer har to kontrollsifre, det nest siste er også et modulo 11 kontrollsiffer, men ved beregningen av dette benyttes det multiplikatorer i en annen og uregelmessig rekkefølge). (http://no.wikipedia.org/wiki/MOD11) """ # vi bruker ikke denne algoritmen siffer = map(int, list(s))[::-1] # reversed vekttall = vekt(len(siffer), range(2, 8)) psum = sum(s * v for (s, v) in zip(siffer, vekttall)) rest = psum % 11 if rest == 0: kontrollsiffer = '0' elif rest == 1: kontrollsiffer = '-' else: kontrollsiffer = str(11 - rest) return kontrollsiffer